PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Nicolargo : Internationaliser ses programmes Python

jeudi 15 novembre 2012 à 10:28

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
 Ce qui va donner:

.
├── 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 "
__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()

On notera donc:
  • 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 :)

Cet article Internationaliser ses programmes Python est apparu en premier sur Le blog de NicoLargo.

Gravatar de Nicolargo
Original post of Nicolargo.Votez pour ce billet sur Planet Libre.