Internationalize a Python application

(Generate template for the translators)
(Generate template for the translators)
Line 48: Line 48:
== Generate template for the translators ==
== Generate template for the translators ==
-
Create a 'po' directory in your project, and run the following command from the top directory:
+
Create a po folder in your project (usually at the same level as src/) and run the following command from the top directory of your project. You can do this inside or outside scratchbox, there is no difference.
-
+
-
# You can run this command inside or outside scratchbox
+
  xgettext --language=Python --keyword=_ --output=po/PROJECTNAME.pot `find . -name "*.py"`
  xgettext --language=Python --keyword=_ --output=po/PROJECTNAME.pot `find . -name "*.py"`

Revision as of 13:01, 23 April 2010


Contents

Internationalization of a python application (in Maemo)

This page explains step by step add support for translations in a python application for maemo.

There are already some tutorials online about how to internationalize (i18n) python applications, but i find them confusing and they lack some needed code and final tricks to make everything work fine. This is the steps i followed to add i18n in my project Mussorgsky.

To support i18n we need to accomplish 5 tasks:

  1. Define correctly a function '_()' that translates strings
  2. Mark the strings in the code with that function
  3. Generate a template for the translators
  4. Add translations
  5. Include the translations in your installation

The overall process

From the source code, using a command line tool, we will generate a ".pot" file. It is plain text file containing all strings that need translation in the project. This .pot file only needs to be generated/recreated when the strings change in the code (and _not_ in every build!). There is only one .pot file per project.

Then, from the .pot files and using another command line tool, we will generate the .po files for each language. There is one .po file per language, and it is the file that the translators need to complete. Both .pot and all .po files should be committed in the repository.

But once your program is running, it doesn't use directly .po files, but a binary (compiled) version of them: the .mo files. These .mo files must be re-created on build time (when creating the package) and installed in the right location in the system. These are generated files, so don't commit them in the repository.

From the code point of view, you just need to call few functions to tell gettext where are the translation files, what language do you want to use (usually the locale of the environment), and then it will use its implementation to find the right string.

Ok, this is what we need to do. Let's code.

Configure gettext Define the '_()' function

TODO

Mark strings for i18n

This is one of the easiest parts. Browse the source code files that show something on the string, and wrap the visible strings (window titles, dialog titles, notifications, labels, button labels and so on) with the '_()' function.

For example:

# import the _() function!
import i18n
_ = i18n.language.gettext

class Example (hildon.StackableWindow):

   def __init__ (self):
       hildon.StackableWindow.__init__ (self)
       self.set_title (_("All music"))

Generate template for the translators

Create a po folder in your project (usually at the same level as src/) and run the following command from the top directory of your project. You can do this inside or outside scratchbox, there is no difference.

xgettext --language=Python --keyword=_ --output=po/PROJECTNAME.pot `find . -name "*.py"`

It will parse files, written in Python, looking for strings marked with the keyword (function name) '_' and saving the output in a file called 'po/PROJECTNAME.pot'. The list of files is the last argument. I like to use "find", but you can manually put a list of files there.

That command will generate the .pot file. Easy, isn't it?

Include translations in your installation

TODO

How to add translations

TODO