Utiliser msgcat avec gettext

 

dc 28/08/06


Article écrit grâce à un mail avec Sylvain Beucler. Merci pour ses précisions sur l'utilisation de gettext


gettext est l'outil basique de traduction sous gnu/linux.

Voici un petit exemple d'utilisation sur le fichier source suivant essai.tcl:

 package require msgcat
 namespace import msgcat::*
 mcload ./locales
 proc _ {s} {::msgcat::mc $s}
 pack [label .l -text [_ Yes]]

la procédure _ est utilisé pour permettre une identification facile des messages à extraire par l'extracteur xgettext. On tape alors dans un shell :

 $ xgettext -k_ essai.tcl

En sortie, on récupère un fichier appelé messages.po dont voici le contenu :

 # translation of messages.po to
 # translation of messages.po to
 # This file is distributed under the same license as the PACKAGE package.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER, 2006.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: messages\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2006-08-28 07:56+0200\n"
 "PO-Revision-Date: 2006-08-28 08:17+0200\n"
 "Last-Translator: \n"
 "Language-Team:  <fr@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.9\n"

 #: essai.tcl:6
 msgid "Yes"
 msgstr ""

C'est ce fichier qu'il va falloir traiter pour traduire les différents messages. En utilisant par exemple kbabel, on pourra générer à partir de ce fichier les fichiers fr.po, en.po, de.po etc.

Une fois réalisé la traduction, il faut générer les fichiers .msg compatibles avec msgcat par exemple :

 $ msgfmt --tcl fr.po -l fr -d locales/

créera le fichier fr.msg dans le répertoire ./locales

Voilà ce que contient ce fichier après traduction :

 set ::msgcat::header "Project-Id-Version: fr\nReport-Msgid-Bugs-To: \nPOT-Creation-Date: 2006-08-28 07:56+0200\nPO-Revision-Date: 2006-08-28 08:17+0200\nLast-Translator: \nLanguage-Team:  <fr@li.org>\nMIME-Version: 1.0\nContent-Type: text/plain;  charset=UTF-8\nContent-Transfer-Encoding: 8bit\nX-Generator: KBabel 1.9\n"
 ::msgcat::mcset fr "Yes" "Oui"

Quelques remarques

 msgmerge fr_old.po messages.po -o fr.po

À consulter