( gettext grok

Info Catalog ( Using libintl ( Programmers ( Temp Programmers
 11.5 Being a `gettext' grok
 * NOTE: * This documentation section is outdated and needs to be
    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'
      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
        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;
      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 ( Using libintl ( Programmers ( Temp Programmers
automatically generated byinfo2html