i18n internationalisation
Comment internationaliser un programme pour le web ? Comment le rendre multilingue ?
C'est en fait très simple. Nous allons prendre l'exemple du php mais on trouve le même mécanisme dans d'autres langages, et d'ailleurs pas seulement pour le web.
Le principe
La langue de base est souvent la langue anglaise, c'est surtout la langue que l'on va trouver dans le code. Si l'on veut simplifier la tâche des traducteurs il vaut mieux mettre des chaines en anglais dans le code. Simplement, au lieu d'écrire echo 'Hi', on écrira echo _('Hi').
Les outils autour de gettext permettent pour chaque langue de transformer des fichiers .po (human readable) en fichier .po (pour la machine).
Ces fichiers sont rangés dans un répertoire locale, contenant ensuite des réertoires par langue puis un répertoire LCMESSAGES, lui-même contenant un fichier .po et un fichier .mo (foo.po et foo.mo pour le programme foo).
Comment définir la langue dans le code ?
Examinons l'utilisation en php pour basculer en français
Remarquez bindtextdomain qui indique l'endroit ou trouver l'arborescence locale.
$locale='fr_FR.UTF-8'; $domain='foo' putenv("LANG=".$locale); putenv('LC_ALL='.$locale); setlocale(LC_ALL, $locale); bindtextdomain($domain, 'auth/locale'); bind_textdomain_codeset($domain, 'UTF-8'); textdomain($domain);
Comment écrire les chaines de caractères dans le code ?
Dans le code, toutes les chaines affichables devront être écrites en utilisant la fonction spéciale _()
echo _('Good morning');
affichera la chaine dans la langue choisie
On utilisera bien sûr la fonction sprintf parce que la place des mots n'est pas la même dans toutes les langues.
echo sprintf(_('I eat %s'),$fruit);
Poedit
Poedit est un programme à qui vous indiquez le répertoire de votre code source, il parcourt les fichiers et récupère toutes les chaines à traduire et vous les présente. Vous les traduisez et il produit le fichier .po, et vous pouvez lui demander de produire le fichier .mo correspondant qui doit être utilisé par le php pour la langue choisie.