(gettext.info.gz) gettext grok
Info Catalog
(gettext.info.gz) Using libintl
(gettext.info.gz) Programmers
(gettext.info.gz) Temp Programmers
11.5 Being a `gettext' grok
===========================
* NOTE: * This documentation section is outdated and needs to be
revised.
To fully exploit the functionality of the GNU `gettext' library it
is surely helpful to read the source code. But for those who don't want
to spend that much time in reading the (sometimes complicated) code here
is a list comments:
* Changing the language at runtime
For interactive programs it might be useful to offer a selection
of the used language at runtime. To understand how to do this one
need to know how the used language is determined while executing
the `gettext' function. The method which is presented here only
works correctly with the GNU implementation of the `gettext'
functions.
In the function `dcgettext' at every call the current setting of
the highest priority environment variable is determined and used.
Highest priority means here the following list with decreasing
priority:
1. `LANGUAGE'
2. `LC_ALL'
3. `LC_xxx', according to selected locale
4. `LANG'
Afterwards the path is constructed using the found value and the
translation file is loaded if available.
What happens now when the value for, say, `LANGUAGE' changes?
According to the process explained above the new value of this
variable is found as soon as the `dcgettext' function is called.
But this also means the (perhaps) different message catalog file
is loaded. In other words: the used language is changed.
But there is one little hook. The code for gcc-2.7.0 and up
provides some optimization. This optimization normally prevents
the calling of the `dcgettext' function as long as no new catalog
is loaded. But if `dcgettext' is not called the program also
cannot find the `LANGUAGE' variable be changed ( Optimized
gettext). A solution for this is very easy. Include the
following code in the language switching function.
/* Change language. */
setenv ("LANGUAGE", "fr", 1);
/* Make change known. */
{
extern int _nl_msg_cat_cntr;
++_nl_msg_cat_cntr;
}
The variable `_nl_msg_cat_cntr' is defined in `loadmsgcat.c'. You
don't need to know what this is for. But it can be used to detect
whether a `gettext' implementation is GNU gettext and not non-GNU
system's native gettext implementation.
Info Catalog
(gettext.info.gz) Using libintl
(gettext.info.gz) Programmers
(gettext.info.gz) Temp Programmers
automatically generated byinfo2html