Traduction d'une application python

Procédure simple pour localiser une application python.

Attention: les informations contenues dans ce document ont almost 13 years et peuvent être obsolètes.

Application de base ================================================================================

Pour illustrer la traduction d'une application écrire en python, nous partirons d'un projet organisé comme suit :

  • myapp
    • data
      • locale
        • en
        • fr
      • ui
        • myapp.glade
    • myapp.py
Organisation de l'application de test.

Toutes les lignes de commande qui suivent présupposent que l'on se trouve dans le répertoire de l'application.

Modification du code ================================================================================

D'abord, toutes les chaînes de caractères à traduire doivent être définies avec la méthode _() :

# ne plus écrire :
print "Hello World"
# Ecrire plutôt :
print _("Bonjour Monde")
Toutes les chaînes traduisibles

On ajoute ensuite une méthode qui charge la localisation de ces chaînes grâce à gettext :

import gettext
#import locale
#from locale import gettext as _

def localize(app_name, loc_path):
    '''
    Méthode de localisation
    @param app_name: Nom de l'application.
    @param loc_path: chemin du répertoire des fichiers de localisation.
    '''
    # Obligatoire de passer par locale pour traduire les interfaces graphiques
    #locale.bindtextdomain(app_name, loc_path)
    #locale.textdomain(app_name)
    # gettext pur python
    gettext.find(app_name, loc_path)
    gettext.bindtextdomain(app_name, loc_path)
    gettext.install(app_name, loc_path, True)
Méthode pour la gestion de la localisation.

TODO: Note sur la location des interfaces graphiques avec locale.

Enfin, il faut appeler la méthode de localisation au lancement de l'application :

localize('myapp', os.path.join(os.path.dirname(__file__), 'data', 'locale'))
Lancement de la traduction dans myapp.py

Fichiers de traduction ================================================================================

Chaînes de l'interface graphique

Si l'interface graphique de l'application se base pout tout ou partie sur des fichiers xml glade, il faut d'abord extraire les chaînes traduisibles de ces fichiers avec la commande intltool-extract qui prend les paramètres suivants :

intltool-extract --type=gettext/glade data/ui/myapp.glade
Extraction des chaînes traduisibles d'un fichier glade.

Paramètres : * type : Le type du fichier à traiter * Le chemin du fichier à traiter

La commande va générer un fichier data/ui/myapp.glade.h.

Création du catalogue de traduction

La création d'un catalogue de traduction se fait grâce à la commande xgettext :

xgettext --language=Python --keyword=_ --keyword=N_ --output=data/i18n/myapp.pot  data/ui/myapp.glade.h myapp.py
Générer le catalogue de traduction.

Paramètres : * language : le langage de programmation * keyword : Nom des méthodes portant les chaînes à traduire * _ pour les fichiers python * N_ pour les fichiers Glade * output : le chemin du catalogue à créer * La liste des fichiers contenant les chaînes à traduire.

Construction des fichiers de langue

L'utlime étape consiste à générer les fichiers de traduction pour le français (fr) et l'anglais (en) à partir du catalogue grâce à la commande msginit :

msginit -i data/i18n/myapp.pot -o data/i18n/fr.po -l fr_FR
msginit -i data/i18n/myapp.pot -o data/i18n/en.po -l en_US
Génération des catalogues de localisation

Paramètres : * i : Le chemin du catalogue à traiter * o : Le chemin du catalogue localisé à générer * l : Le code de la langue du catalogue généré

Les fichiers data/i18n/en.po et data/i18n/fr.po sont créés. A noter un problème rencontré lors de la génération du fichier de traduction français : il est encodé en ISO-8859-15. Pour éviter tout problème, il faut forcer l'encodage en UTF-8 :

msginit -i data/i18n/myapp.pot -o data/i18n/fr.po -l fr_FR.UTF-8
Forcer l'encodage en UTF-8 d'un catalogue localisé français.

Au terme de toutes ces manipulations, le dossier de notre application est constitué de la manière suivante :

  • monApp
    • i18n
      • en.po
      • fr.po
      • myapp.pot
    • locale
      • en
      • fr
    • ui
      • myapp.glade
      • myapp.glade.h
    • myapp.py
Organisation des fichiers dans notre application.

Version compilée des catalogues

Une fois la traduction des catalogues localisés effectué à l'aide d'un logiciel dédié comme gTranslator, il reste à créer leur version compilée (utilisée par l'application) grâce à la commande msgfmt :

msgfmt -o data/locale/fr/LC_MESSAGES/myapp.mo data/i18n/fr.po
msgfmt -o data/locale/en/LC_MESSAGES/myapp.mo data/i18n/en.po
Création des versions compilées des fichiers de traduction.

Paramètres : * o : Le chemin du fichier compilé à générer * Le chemin du catalogue source

  • monApp
    • i18n
      • en.po
      • fr.po
      • myapp.pot
    • locale
      • en
        • LC_MESSAGES
          • myapp.mo
      • fr
        • LC_MESSAGES
          • myapp.mo
    • ui
      • myapp.glade
      • myapp.glade.h
    • myapp.py
Organisation finale de l'application.