Magazine High tech

Internationalisation (i18n) de projet PHP avec gettext et Poedit

Publié le 19 avril 2012 par Menerve
Un bon moyen d'internationaliser un site web est d'utiliser l'outil gettext.
Une extension est heureusement disponible pour PHP, ce qui va nous permettre de créér un site PHP traductible! Voir comme exemple de succès le fameux Wordpress...
Pour info, i18n signifie internationalization, le 18 correspond aux 18 lettres entre le i et le n... Pareil pour l10n (localization).
Comment cela marche?
Dans le code source de nos fichiers PHP se trouvent des chaînes de caractères, le texte du site. Celles-ci vont être affichées au moyen des fonctions gettext de PHP, à savoir principalement gettext(), son alias _() et _e() qui fait directement un echo.
Ensuite, un fichier .po regroupant toutes ces chaines (en général en anglais, donc), appelé catalogue, va être créé en parsant tous les fichiers *.php de notre projet.
Ce fichier va être traduit et enfin, un fichier .mo lisible par gettext va être généré.
Enfin, nous allons indiquer un domaine et une locale à PHP pour qu'il affiche les chaines traduites!
Voici un tutoriel expliquant un exemple d'utilisation de gettext pour PHP, sous Windows:
Note: J'ai d'abord essayé cela avec WampServer 2.2 sous Windows 7 sans succès... Mais cela marche sans problème avec EasyPHP 5.3.9!
1. Sous Windows, installer un logiciel gratuit et open source comme Poedit permet de grandement simplifier la tâche de la traduction et par la même permet de générer les fichier .mo à partir des fichier .po! http://www.poedit.net/
2. Nous suivons ici le tutoriel O'Reilly:
http://onlamp.com/pub/a/php/2002/06/12/php.html
  2.1 Créer un nouveau projet sur son serveur web:
Par example, C:\easyphp\www\gettext pour EasyPHP.
   2.2 Créer un nouveau fichier PHP (qui contient le minimum pour faire fonctionner gettext):
<?php
//http://onlamp.com/pub/a/php/2002/06/12/php.html
// I18N support information here
$language = 'fra_FRA';
putenv("LANG=$language"); 
var_dump(setlocale(LC_ALL, $language));

// Set the text domain as 'messages'
$domain = 'messages';
echo bindtextdomain($domain, "./locale")."<br />"; 
textdomain($domain);

echo gettext("A string to be translated would go here");
?>

  2.3 Créer ensuite l'arborescence de répertoires suivante (qui contiendra au final les fichiers .po et .mo):
/locale
    /fra_FRA
        /LC_MESSAGES
            messages.po
            messages.mo
(Note: "fra_FRA" pour francais de France, locale Windows, contrairement à fr_FR pour Linux...)
  2.4 Dans Poedit, créer un nouveau catalogue qui pointe sur le dossier du projet (C:\easyphp\www\gettext). Et remplissez les informations de la traduction (langue, traducteur, encodage (préférer UTF-8, cependant, les caractères accentués ne passent que en ISO... pour moi)): via le menu Catalogue > Paramètres.
Votre fichier .po est prêt à recevoir les traductions!
  2.5 Traduire le fichier .po (qui contient tous les textes contenus dans les appels gettext(), ou _() (alias de gettext), ou _e() (echo), voir http://us2.php.net/manual/fr/book.gettext.php)
Personnelement, voici mon fichier messages.po:
msgid ""
msgstr ""
"Project-Id-Version: Hello2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-04-18 15:52-0500\n"
"PO-Revision-Date: 2012-04-18 17:06-0500\n"
"Last-Translator: Francois \n"
"Language-Team: no \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"
"X-Poedit-Basepath: .\n"
"X-Poedit-Language: French\n"
"X-Poedit-Country: FRANCE\n"
"X-Poedit-SearchPath-0: C:\\wamp\\www\\gettext\n"

#: C:\wamp\www\gettext/hello.php:15
msgid "A string to be translated would go here"
msgstr "Chaîne traduite"

  2.6 Générer le fichier .mo (le fichier final compilé qui sera lu par la librairie gettext de PHP) simplement en enregistrant le fichier messages.po traduit au sein de Poedit.
Le fichier messages.mo est créé, déplacez-le dans le dossier /locale/fra_FRA/LC_MESSAGES/
  2.7 Activer l'extension PHP gettext, sous EasyPHP, via le fichier easyphp/conf_files/php.ini : rechercher "gettext" et enlever le ; de la ligne
extension=php_gettext.dll
Redémarrer EasyPHP
3. Attention, à chaque fois que vous modifiez un fichier .mo, il faut redémarrer le serveur pour que les modifications apparaissent.
Poedit

Retour à La Une de Logo Paperblog

A propos de l’auteur


Menerve 243 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Magazine