gettext

Dernière modification : 2008/03/09 20:32

Étude de la possibilité d'utiliser gettext pour internationaliser WiKiss (FS#37).

Avantages de gettext


  • système éprouvé et efficace
  • répandu chez les hébergeurs ?
  • facilité pour les traducteurs (de nombreux outils existent)
  • gestion automatique de l'absence d'un message

Problèmes de gettext


  • des heures pour comprendre comment ça fonctionne :)
  • l'extension gettext doit être activée pour php
  • la locale concernée doit être installée sur le système
  • les fichiers .mo sont dépendants du système du serveur (linux/windows)
  • le nom de la locale est différente du code langue (en, en_US) et pour chaque système
→ tester quelles sont les locales chez les différents hébergeurs

Locales installées


Voici une liste de plateformes d'hébergements (ou distribution linux) et les locales qui y sont installées.
Pour les distributions linux, je me base sur l'install standard, sans chercher à reconfigurer quoi que ce soit.

locale hébergeur distribution linux
free.fr tuxfamily kelio.org Ubuntu (fr)debian (ovh)mandriva 2007
fr img/i.png
fr_FR img/i.png img/i.png img/i.png img/i.png img/i.png
fr_FR.utf8 img/i.png img/i.png img/i.png img/i.png
fr_FR.iso885915img/i.png
fr_FR.iso88591img/i.png img/i.png img/i.png img/i.png
fr_BE img/i.png img/i.png img/i.png
fr_BE.utf8 img/i.png img/i.png img/i.png
fr_BE.iso885915img/i.png
fr_BE.iso88591img/i.png img/i.png
fr_CA img/i.png img/i.png img/i.png
fr_CA.utf8 img/i.png img/i.png img/i.png
fr_CA.iso885915img/i.png
fr_CA.iso88591img/i.png img/i.png
en img/i.png
en.iso88591 img/i.png
en_US img/i.png img/i.png img/i.png
en_US.utf8 img/i.png img/i.png img/i.png
en_US.iso885915img/i.pngimg/i.png
en_US.iso88591img/i.png img/i.png img/i.png
en_GB img/i.png img/i.png img/i.png img/i.png
en_GB.utf8 img/i.png img/i.png img/i.png
en_GB.iso885915img/i.pngimg/i.png img/i.png
en_GB.iso88591img/i.png img/i.png img/i.png img/i.png
es_ES img/i.png img/i.png
es_ES.utf8 img/i.png img/i.png
es_ES.iso88591img/i.png img/i.png
de_DE img/i.png img/i.png
de_DE.utf8 img/i.png img/i.png
de_DE.iso88591img/i.png img/i.png
nl_NL img/i.png img/i.png
nl_NL.utf8 img/i.png img/i.png
nl_NL.iso88591img/i.png img/i.png


Sous linux, la commande locale -a permet d'avoir une liste plus détaillée.

Script de test


Ce script permet de tester le fonctionnement de quelques locales sur un système. Pour l'utiliser, il suffit de le copier sur votre site et de l'afficher dans votre navigateur web. Par exemple : http://wikiss.tuxfamily.org/test/test_gettext.php
Il serait alors sympa de copier/coller le résultat dans un mail sur la liste de WiKiss avec le nom de votre hébergeur.

<?php
   $testlangs = array('fr','fr_FR','fr_BE','fr_CA','en','en_US','en_GB','es','es_ES','de','de_DE','nl','nl_NL');

   function testlocale($lang)
   {
      putenv("LANGUAGE=$lang");
      $dir=setlocale(LC_ALL, $lang);
      if ($dir == $lang)
         return "<li>$lang : OK</li>\n";
      else
         return "";
   }

   if (extension_loaded('gettext'))
   {
      echo 'gettext is installed. Testing some locales ...<br/><ul>';
      foreach ($testlangs as $lang)
      {
         echo testlocale($lang);
         echo testlocale($lang.'.utf8');
         echo testlocale($lang.'.iso885915');
         echo testlocale($lang.'.iso88591');
      }
      echo '</ul>';
   }
   else
      echo 'gettext is not installed :(';
?>


Code


Voici un code php minimal d'utilisation de gettext :
// Choix de la langue
$domain="messages";
$lang = 'en_US.utf8';
putenv("LANGUAGE=$lang");
$dir=setlocale(LC_ALL, $lang);
echo 'setlocal:'.$dir."<br/>"; // si chaine vide alors la locale  n'est pas installée et gettext ne fonctionnera pas !
// Spécifie la localisation des tables de traduction
bindtextdomain("$domain", "./locale");
// Choisit le domaine
$dir=textdomain("$domain");
echo gettext('Aide');
// normalement affiche Help :)

Le fichier de langues doit être ./locale/en_US/LC_MESSAGES/messages.mo

Pour générer le fichier .po :
xgettext --language=PHP --default-domain=messages --from-code=UTF-8 index.php


Puis pour le compiler en .mo:
msgfmt -o locale/en_US/LC_MESSAGES/messages.mo locale/en_US/LC_MESSAGES/messages.po


Liens


Voici quelques liens utiles pour gettext en php :
%%