(gettext.info)gettext grok


Next: Temp Programmers Prev: Using libintl.a Up: Programmers
Enter node , (file) or (file)node

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 category
       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 (Note: 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.


automatically generated by info2www version 1.2.2.9