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
- i18n
- locale
- en
- LC_MESSAGES
- fr
- LC_MESSAGES
- en
- ui
- myapp.glade
- myapp.py
- data
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")
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)
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'))
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
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
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
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
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
- LC_MESSAGES
- fr
- LC_MESSAGES
- en
- ui
- myapp.glade
- myapp.glade.h
- myapp.py
- i18n
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
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
- LC_MESSAGES
- fr
- LC_MESSAGES
- myapp.mo
- LC_MESSAGES
- en
- ui
- myapp.glade
- myapp.glade.h
- myapp.py
- i18n