TUTORIELS 
Gérer plusieurs langues dans une application PHP

 

Page 1 | 2

Présentation de trois méthodes permettant d'internationaliser ses programmes, et d'en permettre l'intégration facile de nouvelles traductions.
 (20 janvier 2003)
 

MySQL
Plutôt que de stocker vos traductions dans un fichier externe, il est possible de tout mettre dans votre base de données (si tant est que vous en utilisiez une). L'interêt principal de cette méthode est de pouvoir ajouter un champ contenant la dernière date d'entrée, ce qui vous permet d'être toujours à même de retrouver les dernières modifications dans la traduction en classant les champs par date et par langue. Un autre interêt est de travailler directement avec le numéros d'id de vos chaînes, au besoin... En revanche, la mise à jour est rendue plus compliquée, et l'accés direct à la base pour les "simples traducteurs" n'en est que plus ardue.

Prenons par exemple une table créée avec le code SQL suivant:
CREATE TABLE string_lang(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, page VARCHAR(10), lang CHAR(5) NOT NULL, string CHAR(254) NOT NULL, date DATETIME());

Une fois la connexion à la base effectuée, on pourrait accéder aux traductions de la manière suivante:

<?
$sql = "SELECT id,string FROM string_lang WHERE page=$page AND lang=$lang;";
$rsql = mysql_query($sql);

while ($row = mysql_fetch_object($rsql))
  {
  $id = $row->id;
  $string = $row->string;
  $strings[$id] = $string;
  }

...et dans le code HTML:

<?=$strings['prenom'];?>

Le plus gros du travail consistera donc, comme pour toute internationalisation, à remplacer les chaînes "brutes" du code par ces appels de tableaux...

L'API gettext
gettext est un projet GNU d'API permettant d'implémenter un support natif des langues (Native Language Support) dans une application. Tous les fournisseurs ne la proposent pas, donc il ne faut s'y fier que si l'on est certain de maîtriser cet aspect du serveur. Un phpinfo() bien placé permettra de savoir si l'on peut se permettre cette API... Pour les utilisateurs de EasyPHP et consorts WAMP, il suffit de se glisser dans le fichier php.ini pour retirer le ";" devant la ligne "extension=php_gettext.dll".

L'extension gettext permet de traduire dynamiquement des chaînes dans le code PHP. Par rapport aux deux autres méthodes est que, si la traduction n'existe pas, PHP écrira la version originale à la place... Un autre point important à noter est que gettext est déjà largement utilisé dans des projet libres, et qu'il existe donc une foule d'outils facilitant le travail du traducteur et donc l'intégration finale. Ces outils sont cependant plus courant sous systèmes Linux et autres, bien qu'il existe des équivalent Windows, comme GNUGettext for Win32 ou poEdit.

gettext fait appel à une série de fichiers externes où une phrase définie est traduite selon les langages. Pour simplifier (nous aurons l'occasion de revenir sur le sujet, gettext et l'internationalisation étant une étude à part entière), le fichier contenant les phrases traduites se présente sous la forme suivante:

(fichier lang_string.po)
(divers entête)
...
msgid "Mon tailleur est riche"
msgstr "My taylor is rich"
msgid "Tire-bouchtroumpf et schtroumpf-bouchon"
msgstr "(translation missing)"

ensuite, une fois compilé, la chaîne s'affiche à l'aide des fonctions idoines:

(fichier index.php)
// définition de la langue
$lang = 'en'; // à définir selon ce document, par exemple
putenv("LANG=$lang");
setlocale(LC_ALL, $lang);

// emplacement des fichiers gettext sur le serveur
$domain = 'lang_string';
bindtextdomain($domain, "/www/htdocs/site.com/locale");
textdomain($domain);

<?=gettext("Mon tailleur est riche");?>

Ce qui, pour peu que les deux id correspondent, affichera "My taylor is rich" en lieu et place de l'original français.
Chaque langue ayant son propre repertoire dans la hierarchie gettext, inclure une nouvelle langue ne met pas en danger les autres traductions, mais ne nécessite que la création de ce nouveau repertoire avec un fichier .po vierge de toute traduction.
Nous aurons l'occasion de revenir sur le sujet dans un prochain article plus ciblé...


Page 1 | 2

 
[ Xavier Borderie, JDNet
 
Accueil | Haut de page