Localisation on maemo
Localisation
Localisation means translating the application into different languages. In maemo, localisation is based on standard gettext, and all the necessary tools are included in scratchbox. For applications, localisation needs one or two files to work on, which are found in the po/ directory. The following files are used for localisation:
Makefile.am en_GB.po POTFILES.in
POTFILES.in contains the list of source code files that are localised. The en_GB.po file includes translated text.
Adding localisation to your application
To add localisation to your application, you need to set up l10n before gtk.init by including the following headers:
main.c #include#include
To initialise the locale functions you also need to add the following lines:
setlocale(LC_ALL, ""); bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE);
The most important of these are the GETTEXT_PACKAGE and LOCALEDIR that come from configure.ac:
localedir=/usr/share/locale AC_PROG_INTLTOOL([0.23]) GETTEXT_PACKAGE=maemopad AC_SUBST( GETTEXT_PACKAGE ) ALL_LINGUAS="en_GB" AM_GLIB_GNU_GETTEXT
From these, only GETTEXT_PACKAGE requires attention, as it is the l10n domain you want to use. ALL_LINGUAS lists the translations you have available.
If you are building applications for IT OS 2005 edition, set localedir to /var/lib/install/share/locale.
Easing string extraction
In your source code there are strings littered everywhere. These are eventually displayed in the user interface. For example:
hildon_app_set_title ( app, "maemoPad" );
To make your strings localisable, you need to wrap the strings that you want translated in gettext("String") calls. In practice, writing gettext() for every string is time consuming. The common practice is to set the following #define setting:
#define _(String) gettext (String)
Therefore, the i18n version of the example is:
hildon_app_set_title ( app, _("maemoPad") );
Creating en_GB.po
Creating po files is straightforward. maemopad is a good example. maemopad only has one localisation file en_GB.po, others like fi_FI.po can be easily made based on this. Localisation .po files are filled with simple structure, which defines the localisation ID and the actual text string. The following is a sample of this structure:
#: src/document.c:727 src/document.c:733 msgid "note_ib_autosave_recover_failed" msgstr "Recovering autosaved file failed"
The "msgid" indicates the original string (key) used in code and "msgstr" defines the translated string for localisation.
First create a template file with all strings from sources for translation. Use the GNU xgettext command [9] to extract the strings from sources:
"xgettext -f POTFILES.in -C -a -o template.po"
The "-f POTFILES.in" option uses POTFILES.in to get the files localised. "-C" is for the C-code type of strings, "-a" is to ensure that you get all strings from sources, and "-o template.po" defines the output filename.
This may output some warnings, which are usually not serious, but it is recommended that you check them anyway.
If you want to translate to Finnish, copy the edited po/template.pot to po/fi_FI.po and add fi_FI.po to ALL_LINGUAS in configure.ac.
po/fi_FI.po now includes lines like the following:
#: ../src/ui/interface.c:123 msgid "maemopad_save_changes_made" msgstr "Save changes?"
Translate all msgstrings into the language into which you are translating:
#: ../src/ui/interface.c:123 msgid "maemopad_save_changes_made" msgstr "Tallenna muutokset?"
The autotools should now automatically convert the .po file to .mo file during the build process, and install it to the correct location.
If you want to do it yourself:
msgfmt po/fi_FI.po -o debian/maemopad/share/locale/fi_FI/LC_MESSAGES/domain.mo
Where "debian/maemopad/share/locale/fi_FI/LC_MESSAGES/" is the directory to which you want to install software.
You can find all the necessary files as an example at: stage.maemo.org under maemo testing/maemopad
Testing
Inside the scratchbox, test your translated application by setting LC_ALL enviroinment variable:
LC_ALL="fi_FI" run-standalone.sh ./maemopad
On the target device, you need a wrapper script to get the same effect.
Improve this page