Node:Explaining gettext, Next:Programmer i18n, Previous:I18N and L10N, Up:Internationalization
The facilities in GNU
gettext focus on messages; strings printed
by a program, either directly or via formatting with
When using GNU
gettext, each application has its own
text domain. This is a unique name, such as
that identifies the application.
A complete application may have multiple components--programs written
in C or C++, as well as scripts written in
All of the components use the same text domain.
To make the discussion concrete, assume we're writing an application
guide. Internationalization consists of the
following steps, in this order:
guide's components and marks each string that is a candidate for translation. For example,
"`-F': option required"is a good candidate for translation. A table with strings of option names is not (e.g.,
--profileoption should remain the same, no matter what the local language).
"guide") to the
gettextlibrary, by calling the
guide.po), which lists the strings and their translations. The translations are initially empty. The original (usually English) messages serve as the key for lookup of the translations.
guide.pois copied and translations are created and shipped with the application.
.pofile is converted into a binary message object (
.mo) file. A message object file contains the original messages and their translations in a binary format that allows fast lookup of translations at runtime.
guideis built and installed, the binary translation files are installed in a standard place.
.mofiles in a different directory than the standard one by using the
guidelooks up each string via a call to
gettext. The returned string is the translated string if available, or the original string if not.
In C (or C++), the string marking and dynamic translation lookup
are accomplished by wrapping each string in a call to
The tools that extract messages from source code pull out all
strings enclosed in calls to
gettext developers, recognizing that typing
gettext over and over again is both painful and ugly to look
at, use the macro
_ (an underscore) to make things easier:
/* In the standard header file: */ #define _(str) gettext(str) /* In the program text: */ printf(_("Don't Panic!\n"));
This reduces the typing overhead to just three extra characters per string
and is considerably easier to read as well.
There are locale categories
for different types of locale-related information.
The defined locale categories that
gettext knows about are:
gettextoperations, but it is possible to supply a different one explicitly, if necessary. (It is almost never necessary to supply a different category.)
/[[:alnum:]]/(see Regular Expression Operators).
For some operating systems, the
port doesn't support GNU
gettext. This applies most notably to
the PC operating systems. As such, these features are not available
if you are using one of those operating systems. Sorry.
use a comma every three decimal places and a period for the decimal
point, while many Europeans do exactly the opposite: