mercredi 19 octobre 2016

La traduction normalisée avec Gettext


Pour cet article, je vais vous parler de l'internationalisation de contenu et plus précisément de la traduction liée au domaine du numérique et plus précisément d'un standard qui existe depuis 1995 : Gettext

Le principe est de fournir des fichiers de traduction pour chaque langue que l'on veut distribuer dans son programme et par extension son site web.


Dans le schéma ci-dessus, le foo.c correspond au fichier source de notre programme chargé des traductions (ici en C). Évidemment, dans un autre langage, le fichier sera différent : en php par exemple on peut assigner une classe Translation contenue dans Translation.php chargée de faire un appel aux traductions.

Le fichier .POT est un template contenant le texte avec la langue d'origine à traduire et permet de créer les différents fichiers .PO, le nom du fichier .POT n'a pas vraiment d'importance.
Les fichiers .PO contiennent la traduction de chaque texte dans la langue voulue, chaque fichier est par convention nommé avec le diminutif de la langue après traduction ou avec le diminutif de la langue et du pays concerné. (fr.po, fr_FR.po)
Dans l'exemple ci-dessus, il est fort probable que la langue originelle soit l'anglais et que les traductions découlent de celle-ci. Mais il est tout à fait possible de partir d'une autre langue d'origine.

La modification des fichiers .POT et .PO peuvent se faire aussi bien avec un éditeur de texte standard qu'avec un logiciel en ligne de commande ou graphique. Tout dépend de vos besoins, si vous souhaiter modifier ces fichiers manuellement vous pouvez regarder une des documentations qui en décrit l'architecture :
https://fr.opensuse.org/Equipe_de_traduction/Les_fichiers_PO_et_POT
Si vous préférez utiliser un logiciel avec interface graphique quelques logiciels gratuits existent :
https://userbase.kde.org/Lokalize
http://www.omegat.org/fr/omegat.html
https://poedit.net/
https://poeditor.com/ (gratuit pour utilisation avec moins de 1000 strings ou pour projets OpenSource)

Les fichiers .MO sont les fichiers binaires qui correspondent aux traductions, ils sont utilisés par le programme pour récupérer les chaînes à remplacer, ils n'ont pas forcément le nom de la langue car définissent plutôt un contexte.

Voilà pour la description générale du concept de Gettext mais ça ne nous indique pas vraiment comment récupérer les traductions pour les inclure dans notre programme. Pour ça, il faut passer par une bibliothèque qui sera liée à votre projet. Il en existe énormément pour chaque langage de programmation, je vous laisse le soin de chercher mais si vous ne trouvez pas, vous pouvez toujours en faire la demande en commentaire.

Tuto Gettext PHP avec Composer

Je vais vous expliquer comment utiliser une de ce bibliothèques très facile à implémenter en PHP.

Prérequis :

  1. Un serveur PHP (tuto XAMPP bientôt disponible)
  2. Composer

(Tuto vidéo bientôt disponible)

De base, je travaille avec Composer qui permet de récupérer des librairies très facilement, j'admets donc qu'il est déjà lié à votre projet.
Pour récupérer la librairie Gettext la plus connue, il suffit de faire dans le terminal :
$ composer require gettext/gettext 
La librairie permet de générer les fichiers .MO dont on aura besoin par la suite mais propose une alternative plutôt intéressante, la création d'un fichier .PHP qui contiendra les traductions sous forme d'objets. Cette seconde solution peut-être utilisée pour se passer de la bibliothèque si par exemple nous ne voulons pas l'inclure sur un environnement de production.

Page à traduire


Le fichier .PHP contenant le code HTML devra contenir les chaînes de caractères à traduire sous un format spécifique. Par exemple, pour une chaîne de caractères à traduire, j'utilise la notation :

<h1><?= __("Texte à traduire"); ?></h1>

à la place de :

<h1>Texte à traduire</h1>

La méthode __() est un raccourci pour la méthode gettext()

 

Génération des .POT et .PO

La génération des .POT et .PO se fait par l'utilisation d'un logiciel tiers ou de l'éditeur de texte. Vous pouvez partir de votre page à traduire en faisant un import. Cela permet de récupérer automatiquement les textes à traduire, il ne reste plus qu'à faire la traduction de chaque chaîne de caractères.

Génération des .MO

Les MO peuvent être générés avec les logiciels tiers mais je conseille de le faire avec la librairie en passant par la méthode :
use Gettext\Translations;
//import from a .po file:
$translations = Translations::fromPoFile('locales/fr.po');
//and export to a .mo file
$translations->toMoFile('Locale/fr/LC_MESSAGES/messages.mo');
Ceci permet de garder l'arborescence obligatoire pour les fichiers .MO.
En effet ils doivent être placés dans Locale/{langue}/LC_MESSAGES/

Remplacement du texte

Le remplacement du texte dans la page à traduire se fait avec le contexte et le domaine de la langue. En début de fichier :
<?php
use Gettext\GettextTranslator;
//Create the translator instance
$->setLanguage('gl');
$t->loadDomain('messages', 'Locale');
?>  
 Nous pouvons imaginer une liste déroulante qui change la valeur du langage de la page à la volée ou un détecteur de langue liée au navigateur.
Vous trouverez les sources (bientôt) d'un petit projet de traduction.

Liens utiles :

http://tassedecafe.org/fr/internationaliser-site-web-php-gettext-2878
https://github.com/oscarotero/Gettext

2 commentaires:

  1. Bonjour! Pour traduire des fichiers po, je vous recommende utiliser un outil de traduction comme https://poeditor.com

    RépondreSupprimer
  2. Merci pour le lien et le commentaire, je ne connaissais pas. J'ai regardé et effectivement ça à l'air vraiment sympa, et en plus c'est un nombre illimité de string pour les projets open sources donc c'est pas mal. Je le mets en lien dans l'article! ;)

    RépondreSupprimer