From: "andrew cooke" <andrew@...>
Date: Sat, 26 Apr 2008 18:08:47 -0400 (CLT)
Busy day - now have i18n working for Python too. It's quite cool - uses Gnu gettext which has made some interesting design decisions. In particular, it fails very nicely - at worst, you get the (english) text in your source file. Here are my notes: ==Internationalisation (Python)== * [http://www.gnu.org/software/gettext/manual/gettext.html Gettext manual] * [http://docs.python.org/lib/module-gettext.html Python docs] ===Create Source=== The simplest approach is to use the library routines in acooke.i18n: * Within an application, set <code>_</code> globally in the "main" file: from acooke.i18n import init_app_i18n from acooke.log import init_log init_log('appname.ini') init_app_i18n('appname') * Within a library, set <code>_</code> locally within each module: from acooke.i18n import init_lib_i18n _ = init_lib_i18n('libname') Then call this function around english text. Note that <code>%</code> formatting should be outside the string and use dictionaries (so that the order can be changed). For example: print _('hello %(name)s') % {'name': 'andrew'} ===Create Templates=== Run the pygettext program to create a ".pot" template based on all the files in the application: rm -f appname.pot python /usr/share/doc/packages/python/Tools/i18n/pygettext.py -nvd appname `find appname -name "*.py"` ===Initialise Translation=== Run the msginit program. By default this searches for the ".pot" file and uses the default locale (which means you get an english version for testing, probably). msginit ... At this point you may want to merge in previous work. This requires msgmerge (more here....). ===Edit the Translation=== emacs en_GB.po '?' for help; enter to edit ===Create the Binary "mo"=== Use /usr/share/doc/packages/python/Tools/i18n/msgfmt.py to generate the machine readable file. For example: #!/bin/bash if [ -z "$1" -o $# -ne 1 ] then echo 'the first (and only) argument should be the input file' echo 'this should look something like en_GB.po' exit fi locale=`echo "$1" | sed -e "s/^\([A-Za-z]*\).*/\\1/"` dir="locale/$locale/LC_MESSAGES" mkdir -p "$dir" python /usr/share/doc/packages/python/Tools/i18n/msgfmt.py -o "$dir/appname.mo" $1 Andrew