[Tkinter-discuss] Internationalising Tkinter

Martin Franklin mfranklin1 at gatwick.westerngeco.slb.com
Fri May 6 15:41:45 CEST 2005


Fredrik Lundh wrote:
> Martin Franklin wrote:
> 
> 
>>As the subject says my boss in his infinite wisdom has asked me to
>>investigate "Internationalizing Tkinter"  By this I mean I have a Python
>>& Tkinter application that among other things produces reports (using
>>the Canvas postscript method)  What I would very much like to do is have
>>this application display widgets in different languages (just Spanish
>>for now but I would like to build / use a frame work where any language
>>python / Tk supports may be used)
>>
>>I have googled for "Internationalizing python" and came up with this
>>excellent article (still reading through it as I write this) but it is
>>quite old and I wonder if it's a little out of date.
>>
>>http://python.fyxm.net/workshops/1997-10/proceedings/loewis.html
>>
>>Any hints, docs, links etc would be much appreciated.
> 
> 
> minimalistic solution:
> 
>     from translate import T
> 
>     Label(w, text=T("my label")).pack()
>     b = Button(w, text=T("ok"))
>     etc
> 
> where translate.py is
> 
>     class Translator:
>         def __init__(self, language):
>             self.texts = {}
>             self.language = language
>             ... read translation file for given language and add relevant
>                 entries to texts ...
>         def __getitem__(self, text):
>             return self.texts.get(text, text)
> 
>     ... get country/language code (e.g. via the locale module)
>     T = Translator(language)
> 
> where the translation file can be a tab-separated text file (or CSV or any
> other format that is easy to maintain in e.g. Excel), a prefix-encoded text
> file:
> 
>     ** Weight
>     DE Gewicht
>     DK Vægt
>     FI Paino
>     GB Weight
>     NO Vekt
>     SE Vikt
>     PL Ciezar
>     US Weight
>     ES Peso
>     MX Peso
>     FR Poids
>     CZ Vyska
> 
>     ** Height
>     ...
> 
> or some other easy-to-edit-easy-to-parse format.
> 
> for maintenance, you can add a hook to the __getitem__ method that
> outputs all untranslated items to a file:
> 
>     class DebugTranslator(Translator):
>         def __getitem__(self, text):
>             t = self.texts.get(text)
>             if t is None:
>                 print self.language, text
>             return t or text
> 
> if you want a more complex way to do the same thing, look for "gettext"
> in the library reference.
> 
> </F> 

Thanks Fredrik,

It's an obvious solution now I've seen it :-)

Although I think you mean __call__ since you are calling the instance
T() not slicing or indexing it T[]

I've started playing with the gettext module and I must say I quite like
the automatic features of the system - the generation of the pot files
from the source code, and the compiling of the mo files.

Whichever method I choose, I'm glad to say with python it's _almost_ too 
easy!

Martin.



More information about the Tkinter-discuss mailing list