13.4.12 gettext.h in lib/

Internationalization of packages, as provided by GNU gettext, is optional. It can be turned off in two situations:

  • When the installer has specified ‘./configure --disable-nls’. This can be useful when small binaries are more important than features, for example when building utilities for boot diskettes. It can also be useful in order to get some specific C compiler warnings about code quality with some older versions of GCC (older than 3.0).
  • When the libintl.h header (with its associated libintl library, if any) is not already installed on the system, it is preferable that the package builds without internationalization support, rather than to give a compilation error.

A C preprocessor macro can be used to detect these two cases. Usually, when libintl.h was found and not explicitly disabled, the ENABLE_NLS macro will be defined to 1 in the autoconf generated configuration file (usually called config.h). In the two negative situations, however, this macro will not be defined, thus it will evaluate to 0 in C preprocessor expressions.

gettext.h is a convenience header file for conditional use of <libintl.h>, depending on the ENABLE_NLS macro. If ENABLE_NLS is set, it includes <libintl.h>; otherwise it defines no-op substitutes for the libintl.h functions. We recommend the use of "gettext.h" over direct use of <libintl.h>, so that portability to older systems is guaranteed and installers can turn off internationalization if they want to. In the C code, you will then write

#include "gettext.h"

instead of

#include <libintl.h>

The location of gettext.h is usually in a directory containing auxiliary include files. In many GNU packages, there is a directory lib/ containing helper functions; gettext.h fits there. In other packages, it can go into the src directory.

Do not install the gettext.h file in public locations. Every package that needs it should contain a copy of it on its own.