Internationaliser avec gettext

Voir la vidéo

Dans cette vidéo nous allons découvrir l'extension PHP gettext qui permet de gérer la localisation des chaines de caractères.

Fonctionnement de gettext

gettext est un ensemble d'outils pensé dans le système GNU pour gérer l'internationalisation des interfaces utilisateurs. Ces outils vont se reposer sur 2 types de fichiers importants :

  • Les fichiers .po (pour Portable Object) peuvent être lu et édité par des humains et associe une traduction à une chaîne de caractère donnée.
  • Les fichiers .mo (pour Machine Object) sont des fichiers binaires qui sont conçu pour être lu par une machine.

Pour éditer et travailler sur ces fichiers on pourra par exemple utiliser poedit qui offre une interface visuelle pour gérer la création et la modification de ces fichiers. Il permettra aussi de scanner un code source à la recherche de nouvelles chaînes pour mettre à jour les traductions.

Intégration dans PHP

La première étape est de vérifier que votre projet supporte gettext, vous pouvez pour cela vérifier via phpinfo() l'activation de l'extension gettext ou plus simplement vérifier la présence de la méthode gettext. Vous pouvez modifier votre fichier de configuration php.ini pour activer l'extension si besoin.

if (!function_exists('gettext')) {
    throw new \Exception("L'extension gettext n'est pas active")
}

Ensuite, dans votre code vous pourrez utiliser la fonction gettext() (qui possède un alias _()) pour traduire une chaîne.

<h1><?= _('Welcome on my website') ?></h1>

Par défaut, en l'absence de traduction, cette fonction se contentera de retourner la chaîne de caractère directement. Vous pouvez aussi utiliser la fonction ngettext() pour gérer le pluriel.

<p><?= sprintf(ngettext("%d user", "%d users", $count), $count) ?></p>

Une fois ces fonctions utilisées vous pouvez utiliser poedit pour scanner votre code source et générer les traduction dans des fichier .po et .mo qu'il faudra placer d'une certaine manière dans un dossier de votre projet. La structure devra être la suivante.

<dossier>/<lang_code>_<COUNTRY_CODE>/<CATEGORY>/<domain>.po

Par exemple pour traduire une chaîne en français dans notre application on placera les fichiers de cette manière là.

locale/fr_FR/LC_MESSAGES/grafikart.po
locale/fr_FR/LC_MESSAGES/grafikart.mo

Ensuite on va pouvoir indiquer à gettext comment charger les fichiers liés à notre domaine.

$domain = 'grafikart';
$locale = 'fr_FR';
bindtextdomain($domain, dirname(__FILE__) . DIRECTORY_SEPARATOR . 'locale');
textdomain($domain);
if (!setlocale(LC_ALL, $locale, "{$locale}.UTF-8")) {
    throw new \Exception("Locale non supporée $locale")
};

Il est aussi possible d'utiliser les variables d'environnement pour définir la langue à utiliser, dans ce cas là il faudra utiliser setlocale en lui passant une chaîne de caractère vide.

Publié
Technologies utilisées
Auteur :
Grafikart
Partager