Internationaliser ses programmes Python
Date: 15/11/2012 | Catégories: Developpement,Open-source,Planet-libre | Tags: i18n,python
Bien que je pense qu'il vaille mieux utiliser un logiciel en Anglais plutôt qu'un logiciel (mal traduit) en Français, la problématique de l'internationalisation des développements viendra tôt ou tard sur le tapis si vous avez des utilisateurs de plusieurs pays.
Nous allons donc dans ce billet aborder le sujet spécifique de la traduction d'un logiciel écrit dans le langage Python. Pour cela nous allons nous baser sur un programme simple et connu de tous: un bon vieux Hello World !
J'ai créé un projet GitHub avec l'ensemble des fichiers don je parle dans ce billet.
On commence par créer, dans un répertoire de travail, la structure suivante:
mkdir -p i18n/fr/LC_MESSAGES touch hello.py
. ├── hello.py └── i18n ├── fr └── LC_MESSAGES
On édite une première version du script Python hello.py:
#!/usr/bin/env python __appname__ = 'hello' __version__ = "1.0" __author__ = "Nicolas Hennion <nicolas@nicolargo.com>" __licence__ = "LGPL" def main(): print("Hello world !") if __name__ == "__main__": main()
Sans surprise, l’exécution de ce programme donne:
$ python hello.py Hello World !
1. Rendre son code compatible
La première étape est de rendre notre code compatible avec l'internationalisation: Pour cela, on édite notre programme en effectuant les modifications suivantes:
#!/usr/bin/env python __appname__ = 'hello' __version__ = "1.0" __author__ = "Nicolas Hennion <nicolas@nicolargo.com>" __licence__ = "LGPL" import gettext gettext.install(__appname__) def main(): print(_("Hello world !")) if __name__ == "__main__": main()
- l'inclusion de la librairie gettext
- l'appel à la fonction gettext.install permettant de charger, s'il existe, le fichier de langue correspondant à la langue du système
- le repérage de la chaîne de caractère à traduire en la faisant précéder par le caractère _: print(_("Hello world !"))
2. Génération du modèle de traduction
On passe ensuite à la création du modèle de traduction général (.pot) qui va servir de support de base pour toutes les langues. On utilise l'outil système suivant:
xgettext --language=Python --keyword=_ --output=./i18n/hello.pot ./hello.py
Attention, ce n'est pas dans ce fichier qu'il faut effectuer la traduction. Ce n'est qu'un modèle.
3. Génération du fichier de traduction
On va donc se retrouver avec un fichier ./i18n/hello.pot. C'est à partir de ce modèle que nous allons créer le fichier de traduction pour un langage donnée.
Par exemple, la création du fichier de traduction Francais (fr_FR) se fait:
msginit --input=./i18n/hello.pot --output=./i18n/fr/LC_MESSAGES/hello.po
4. Traduire votre programme
Il reste ensuite le travail le plus manuel à faire: la traduction en elle même...
Pour cela, on édite le fichier i18n/fr/LC_MESSAGES/hello.po:
... #: hello.py:12 msgid "Hello world !" msgstr "Bonjour le monde !" ...
5. Compiler le fichier de traduction
Une fois ce fichier renseigné il faut le compiler. C'est le résultat de cette compilation, qui se présente sous la forme d'un fichier .mo qui sera exploité par votre logiciel.
Pour compiler le fichier i18n/fr/LC_MESSAGES/hello.po vers le fichier i18n/fr/LC_MESSAGES/hello.mo:
msgfmt ./i18n/fr/LC_MESSAGES/hello.po --output-file ./i18n/fr/LC_MESSAGES/hello.mo
Il ne reste plus qu'à installer le fichier de traduction compilé (donc le fichier .mo) dans le répertoire standard de votre système d'exploitation:
Installation du fichier de traduction compilé sur le système:
sudo cp i18n/fr/LC_MESSAGES/hello.mo /usr/share/locale/fr/LC_MESSAGES/hello.mo
Note: cette installation devra normalement être faite par votre script d'installation (Makefile ou setup.py).
Il ne reste plus qu'a tester votre programme et oh miracle:
$ python hello.py Bonjour le monde !
6. Mettre à jour votre fichier de traduction
En cas de mise à jour de votre programme (ajout ou suppression de chaînes de caractères à traduire, il n'est pas la peine de out recommencer. Il faut dans ce cas, utiliser les commandes suivantes:
xgettext --language=Python --keyword=_ --output=./i18n/hello.pot ./hello.py msgmerge --update --no-fuzzy-matching --backup=off ./i18n/fr/LC_MESSAGES/hello.po ./i18n/hello.pot
Compléter la traduction puis re-compiler pour obtenir la nouvelle version du fichier .mo:
msgfmt ./i18n/fr/LC_MESSAGES/hello.po --output-file ./i18n/fr/LC_MESSAGES/hello.mo
7. Automatisation
Il est bien sûr conseillé d'automatiser les taches que l'on vient de voir, idéalement par un script. Vous pouvez par exemple vous baser sur le script que j'utilise pour l'internationalisation de Glances (voir ici).
Reste maintenant le travail le plus long: trouver des contributeurs/traducteurs pour traduire vos applications 🙂