Traduire un programme en Python

 

 

En savoir plus

 

 

 

La seconde étape consiste à modifier le programme pour définir la fonction _() en utilisant le module gettext de python. Cela se fait simplement sous un système de type GNU/Linux, mais demande bien plus de code sous Microsoft Windows, aussi vous trouverez un exemple uniquement pour GNU/Linux, et un exemple multi-plateforme.

Dans tous les exemples qui suivent, l'application appelée coincoin, est lancée par coincoin.py, et son éventuelle interface glade est contenue dans le fichier coincoin.glade.

Le seul fichier à modifier est le fichier qui sera exécuté (coincoin.py). S'il importe des modules avec des chaînes marquées par _(), celles-ci seront aussi traduite (si vous ne voulez pas que cela ait lieu, consultez la documentation python).

Les localisations seront stockées dans un dossier locale. Celui-ci est en général placé dans /usr/share/locale dans les systèmes GNU, et détecté automatiquement par le module gettext, mais devra être précisé sous Microsoft Windows (ici le dossier locale du dossier parent où est exécuté le programme est utilisé, mais vous pouvez en choisir un autre).

Exemple uniquement pour les systèmes GNU/Linux (et probablement autres systèmes non Microsoft Windows) :
application = 'coincoin'
import gettext
gettext.install(application)
[...]
# Si votre programme utilise glade, précisez bien le domaine gettext application: gui = gtk.glade.XML(fname="coincoin.glade", domain=application)

Exemple multi-plateforme :

application = 'coincoin'
import gettext
if os.name == 'nt':
    # Code pour Microsoft Windows

    # Chemin du dossier locale sous windows
    win_local_path = os.path.abspath
    (os.path.join(os.path.pardir, 'locale'))
    
    # Code pour une éventuelle interface glade
    gtk.glade.bindtextdomain(application, win_local_path)
    gtk.glade.textdomain(application)
    
    # Code pour le programme python (le module 
    #local permet de déterminer la langue actuelle)
    import locale
    lang = locale.getdefaultlocale()[0][:2]
    try:
        cur_lang = gettext.translation(application, 
         localedir=win_local_path, \languages=[lang])
        cur_lang.install()
    except IOError:
        # Si la langue locale n'est pas supportée, 
        #on définit tout de même _()
        _ = lambda text:text
        # S'il existe des chaînes traduisibles dans 
        #d'autres modules, normalement gérés par
        # cur_lang.install() ou gettext.install(), 
        #vous devez aussi y définir _(). Exemple :
        sous_module._ = _
else :
    # Code pour les autres systèmes d'exploitation
    gettext.install(application)

[...]

# Si votre programme utilise glade, précisez bien le 
#domaine gettext application:
gui = gtk.glade.XML(fname="coincoin.glade", domain=application)

Il reste une dernière étape : la création d'un modèle de traduction. Celui-ci servira pour créer de nouvelles traductions ou les mettre à jour. Nous allons utiliser l'outil xgettext. Dans un terminal, se rendre dans le dossier où sont stockés les modules python et les éventuels fichiers glade, et lancez la commande :
xgettext -k_ -kN_ -o coincoin.pot *.py *.glade

Le fichier coincoin.pot est obtenu, celui-ci est le modèle des futures traductions. À chaque changement du programme il faudra le mettre à jour en relançant cette commande.


JDN Développeur Envoyer Imprimer Haut de page