i18n and GUI under Windows

Fred Pacquier xnews2 at fredp.lautre.net
Tue Sep 7 22:19:37 CEST 2004


andre.roberge at ns.sympatico.ca (Andr? Roberge) said :

> In short: I'm looking for a *simple* example of how to write a program
> that can have its GUI in at least two languages under Windows ...
> using only Python, of course!
 
Well, André, if you really want *simple* (as in *simplistic*, *simple-
minded* or *can't-get-no-simpler* :) I have something that does just that 
(english/french under wxPython)... Note that most of the other 
suggestions that were given in the rest of this thread are probably 
better for "serious" work ; but going all the way to GNU gettext is a bit 
involved, and quick-n-dirty hacks such as this can be enough for simple 
apps and a handful of languages...

It goes something like this (purists please avert your eyes :-),


* at the beginning of the main module I have these statements :

#---------------------------------------------------------------------
# determine locale and set global french/english flag
# import localized strings and define gettext-like '_' function

import locale
lang, cp = locale.getdefaultlocale()
lang = lang[:2]
if not lang == 'fr' : lang = 'en'

import l10n

def _(msg) :
    if lang == 'fr' :
        return msg
    else :
        return l10n.trans[lang].get(msg, msg)
        # if no translation found return the original (fr) string


* afterwards in your code, everywhere a string appears that needs to be 
localized, wrap it in a _() function call (this is the convention set by 
GNU gettext that everyone generally uses even if they don't use gettext 
itself :)
i.e.: "André" becomes _("André")


* module l10n.py is just one big dictionary with language locales as 
strings and dictionaries of original/translated strings as values, as in:

# MyApp localized strings
# -*- coding: iso-8859-1 -*-

trans = {}

trans['en'] = {
"André" : "Andrew",
"Bonjour" : "Hello",
"Dictateur Bienveillant A Vie" : "BDFL" }


* and that's it. You'll notice that in my example the original version is 
in French and English is a translation. That's because it was grafted as 
an afterthought/experiment onto already finished code. Forward-thinking 
authors may want to do it the other way around, especially if they expect 
to get help with other languages :-)

Then it's not too hard to add, say, a trans['de'] dict to l10n.py and 
change the locale test above to use it. If automatic detection is not 
adequate, then the GUI needs to provide a widget or dialog for the user 
to set the desired language...

HTH,
fp

-- 
YAFAP : http://www.multimania.com/fredp/



More information about the Python-list mailing list