Carsten Haitzler (The Rasterman) <raster@rasterman.com> writes: > there's no documented call though to tell gettext to "flush your > mush" :( I found this in the Gettext info pages, so for GNU Gettext there is a way to make it change language at runtime: 10.5 Being a `gettext' grok =========================== 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 (*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. -- Martin Geisler GnuPG Key: 0x7E45DD38 PHP Exif Library | PHP Weather | PHP Shell http://pel.sf.net/ | http://phpweather.net/ | http://mgeisler.net/ Read/write Exif data | Show current weather | A shell in a browser
Attachment:
pgpTAWEdxs3OK.pgp
Description: PGP signature