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
|