Gettext et PHP, en général ça part vite en eau de boudin car la plupart du temps gettext n’est pas bien installé. Le but de cet article donc est de vous montrer comment faire marcher gettext avec Ubuntu (si je ne me trompe pas la démarche est identique avec une distribution Debian).
Rappelons tout de même que gettext est une bibliothèque (library en anglais) d’internationalisation du Projet GNU, qu’elle n’est pas utilisée que dans le cadre de PHP et qu’elle est assez répandue.
Il y a deux parties à prendre en compte dans gettext : d’une part les fichiers d’internationalisation, d’autre part l’utilisation de gettext par PHP.
Les fichiers d’internationalisation.
La bibliothèque gettext utilise des fichiers en extension .mo compilés avec msgfmt à partir de fichiers en extension .po qui ont une structure du type :
msgid "Hello"
msgstr "Bonjour"
msgid "My name is %s."
msgstr "Je m'appelle %s."
Pour compiler vos fichiers .po en .mo, deux solutions s’offrent à vous : Poedit qui est un application graphique ou la ligne de commande avec msgfmt.
msgfmt -o fichier.mo fichier.po
Utilisation de gettext par PHP.
D’abord installer le paquet php-gettext :
sudo apt-get install php-gettext
Puis générer les locales qui vont être utilisées par la traduction. Sans cela vous ne pourrez pas utiliser gettext avec les fonctions natives de gettext, seules les fonctions gettext spécifiques à PHP fonctionneront. Personnellement je préfère les natives mais c’est un peu plus lourd à gérer, il est vrai. Ce sont ces fonctions natives que je vous présente dans ce tutoriel. Donc on génère quelques locales qui nous intéressent avec la commande locale-gen :
sudo locale-gen en_US
sudo locale-gen en_BR
sudo locale-gen fr_FR
Maintenant il faut structurer les fichiers d’internationalisation de façon spécifique : langue → LC_MESSAGES → fichier.mo. Il faut impérativement les placer dans un sous-dossier LC_MESSAGES. Un exemple de comment les structurer :

Ensuite dans le script PHP du site on insère le code suivant à adapter selon la structure de celui-ci bien évidemment :
$locale = "fr_FR";
$fichier_mo = "messages"; // Fichier d'internationalisation compilé sans l'extension.
$folder_lang = "./lang"; // Dossier ou se trouver les dossiers de langues (en_US, fr_FR).
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
bindtextdomain($fichier_mo, $folder_lang);
textdomain($fichier_mo);
print gettext("Hello"); // Sans variable
printf(_("My name is %s."), "Brian"); // Avec une variable
Je tiens à préciser que _() est un alias de la fonction gettext() et que les deux lignes suivantes vous donneront le même résultat :
print gettext("Hello");
print _("Hello");
Voilà c’est tout pour ce tuto, et n’oubliez surtout pas : BI-DOU-ILLEZ !