4.6. Internationalisation et localisation

L’internationalisation et la localisation (ou régionalisation), désignées respectivement par les sigles i18n et l10n [1], consistent à :

  • le premier désigne toutes les techniques permettant au logiciel de s’adapter à la culture et à la langue de l’utilisateur ;
  • le second concerne plus précisément la traduction des messages affichés.

Pour ce faire, le module gettext fournit de nombreux outils utiles.

Ce dernier utilise des fichiers textes portant l’extension .po et leur version compilée .mo qui contiennent les traductions [2]. Usuellement, ces fichiers sont placés dans le dossier /locale/lang/LC_MESSAGES/, où lang est remplacé par le sigle de la langue voulue (fr pour français, en pour anglais…).

gettext.bindtextdomain(domain[, localedir])

Associe domain au dossier localedir contenant les fichiers de localisation. Cela signifie que gettext va rechercher les fichiers .mo correspondant au domaine indiqué.

gettext.textdomain([domain])

Si domain vaut None, alors le domaine courant est retourné, sinon, le domaine est changé à domain.

gettext.gettext(message)

Retourne la traduction de message, basée sur le domaine actuel, le langage et le dossier de translations [3].

gettext.gettext(message_sing, message_plur, n)

Cette fonction est utilisée pour les formes plurielles. Si une traduction trouvée, elle applique la formule à n, sinon elle retourne message_sing si n vaut 1 et message_plur sinon.

Voici un exemple :

>>> import gettext
>>> gettext.bindtextdomain('app', '/path/to/my/language/directory')
'/path/to/my/language/directory'
>>> gettext.textdomain('app')
'app'
>>> _ = gettext.gettext
>>> _('Cette chaine est traductible.')
'Cette chaine est traductible.'

La fonction install() permet d’automatiser plusieurs méchanismes. Elle prend en argument le domaine et le dossier de traduction, et se charge d’ajouter l’alias _().

Si certaines sont construites à partir de variables, il est conseillé d’utiliser des arguments nommés afin de permettre au traducteur de savoir qu’est-ce qui sera inséré et, surtout, pour qu’il puisse intervertir l’ordre sans souci :

>>> name = 'Anais'
>>> age = 23
>>> _('Hello %(name)s, you are %(age)d old') % {'name': name, 'age': age}
'Hello Anais, you are 23 old'

Toutefois, l’écriture à la main des fichiers .po est fastidieuse [4]. Pour cette raison, un logiciel permettant de simplifier grandement le travail a été conçu : poEdit. Ce dernier peut étudier le code Python afin de sélectionner les chaines gettext. Son interface permet ensuite de les traduire aisément.

Voir aussi

http://filyb.info/post/2006/11/02/413-tutoriel-traduire-un-programme-en-python-et-glade
Cet article détaille aussi la manière d’utiliser les outils gettext sans passer par poEdit.

Footnotes

[1]Le chiffre indique le nombre de lettres entre les lettre initiale et finale.
[2]On parle de “locale” en anglais.
[3]Généralement, on définit l’alias _() pour la fonction gettext() : `` _ = gettext.gettext``
[4]Il serait possible de récupérer les chaines et compiler les fichiers en ligne de commande, mais cette méthode ne sera pas présentée ici.

Sujet précédent

4.5. Persistance

Sujet suivant

5. Annexes

Cette page