Un espace si dense
PHP

PHP et gettext

vendredi 6 avril 2007 par guillaume

L’internationalisation est mot barbare pour désigner un ensemble traduction-choix de la langue par l’utilisateur- et utilisation de l’encodage UTF8 (enfin, on peut résumer l’internationalisation d’une application à ça). Quand on a une ou deux langues à utiliser, l’internationalisation est faite à la main, avec des tableaux. Mais ce n’est pas pratique lorsque l’on veut faire des applications vraiment internationales...

La solution : gettext

Gettext est en fait un ensemble d’applications permettant d’internationaliser un programme en C. En pratique, on écrit notre code de cette manière :


cout<<gettext("Ok, on va internationaliser")<<endl;
//ou
cout<<_("Ok, on va internationaliser plus simplement")<<endl;

Bon, ce n’est pas tout, il faut aussi installer les locales, (notamment inclure le fichier "locale.h"), puis mettre les textes traduits dans une arborescence précise, avec un formattage précis.

Application : en PHP

On va commencer par installer php-gettext, en root : apt-get install php-gettext gettext (sous debian). Normalement, on devrait avoir installé un fichier nommé ’ /usr/share/php/php-gettext/gettext.inc’. On va alors creer un petit fichier PHP :


<?PHP
require_once('/usr/share/php/php-gettext/gettext.inc');
define(PROJECT_DIR, realpath('./'));
define(LOCALE_DIR, PROJECT_DIR .'/locale');
$supported_locales = array('en', 'fr');
$encoding = 'UTF-8';
$locale="fr";

// gettext setup
T_setlocale(LC_MESSAGES, $locale);
// Set the text domain as 'messages'
$domain = 'messages';
T_bindtextdomain($domain, LOCALE_DIR);
T_bind_textdomain_codeset($domain, $encoding);
T_textdomain($domain);

echo T_gettext("salut les copains")."<br/>";
echo T_("Mais on fait plus simple aussi");
?>

que l’on va mettre avec un environnement de type


locale
     /fr
          /LC_MESSAGES
              messages.po
              messages.mo
     /en
          /LC_MESSAGES
              messages.po
              messages.mo

Et ensuite, on lance la commande (pour le php) :


xgettext -kT_gettext -kT_  *.php
qui nous créé le fichier "message.po" [1]. En l’éditant, on remarque que nos deux messages sont inclus, dans un environnement un peu complexe. Maintenant, nous copions message.po dans les ’/locale/lang/LC_MESSAGES/’, nous les éditons, et changeons les chaines de caractère en leur traduction.

Lorsque la traduction [2] est effectuée, nous transformons ces messages.po en messages.mo grâce à la commande msgfmt messages.po.

Lorsque nous travaillons avec un texte déjà traduit, il faut faire une fusion entre les différent messages.po. En renommant le vieux messages.po en old.po et en voulant créer un nouveau.po, le code est : msgmerge old.po messages.po --output-file=nouveau.po

C’est bizarre, je ne voyais pas gettext comme ça !!!

Pour les habitués de gettext, il n’y a pas de T_ devant les fonctions, on a soit gettext("blabla"), soit _("blabla). Mais voilà, pour que l’internationalisation soit possible, il faut que toutes( !) les locales soient installées sur le serveur. C’est fortement improbable lorsque l’on travaille sur un serveur qui ne nous appartient pas. C’est pour celà que j’ai utilisé les fonctions gettext spécifiques au PHP, d’où l’installation de php_gettext.

Utilisation de smarty-gettext

Si on utilise le moteur de template smarty, il peut être intéressant de faire les traductions directement sur les templates. C’est le travail de smarty-gettext.

Pour faire celà avec php-gettext, il faut commencer par modifier le fichier "/usr/share/php/smarty/libs/plugins/block.t.php"


97:                $text = T_ngettext($text, $plural, $count); //Modification


99:                $text = T_gettext($text); //Modification

Lorsque l’on a modifié ce fichier, il faut mettre en en-tête du programme php :

<?PHP
require_once('/usr/share/php/php-gettext/gettext.inc');
require_once('/usr/share/php/smarty/libs/Smarty.class.php');

Pour les templates, il faut les faire du type "truc.tpl" :


<br/>
{t name="Guillaume"}Example: my name is %1{/t}.

L’utilisation de tsmarty2c.php truc.tpl > truc.c" que l’on peut analyser avec la commande xgettext -n *.c permet d’avoir un fichier .po que l’on peut traduire de manière usuelle.

Utilisation des programmes de traduction

Les programmes de traduction comme gtranslator (gnome), kbabel (kde) et PoEdit (multiplateforme) permettent de voir plus facilement quelles chaines ne sont pas traduites. Et sont plus agréables aux traducteurs, qui ne sont pas obligatoirement programmeurs !

[1] Nous pouvons aussi ajouter l’option -j pour joindre différents types de fichiers lors de la traduction, on peut ainsi joindre des fichiers php et c pour l’analyse, ce qui est pratique dans l’utilisation de smarty-gettext

[2] Il y a aussi 2-3 petites choses à coder, dont l’utilisation du charset UTF-8, mais c’est assez simple, et on pourra utiliser des logiciels appropriés pour la traduction


Accueil du site | Contact | Plan du site | Espace privé | visites : 50505

RSS RSSfr

Site réalisé avec SPIP 1.8.3 + ALTERNATIVES