jeudi 4 septembre 2008

[Zend Framework] Utilisation de la classe de traduction de ZF

Le Zend Framework (ZF) propose par défaut une classe de traduction très simple d'utilisation. Elle prend en compte de nombreux moyens de traduction comme les Array (PHP), CSV, Gettext, INI, TBX, TMX, Qt, XLIFF et XmlTm. Il est aussi possible de créer ses propres adaptateurs. Ici nous utiliserons Gettext car c'est le plus professionnel à mon gout. L'inconvénient est que le fichier de traduction est binaire et donc non lisible par l'homme et qu'il faut un logiciel pour générer ce fichier (il en existe des gratuits).

La classe de traduction de Zend Framework est Zend_Translate. La mise en place de la traduction se résume simplement à l'instanciation de cette classe. Ceci est fait comme ceci :

$translate = new
Zend_Translate('gettext','/languages/fr/LC_MESSAGES/lang.mo','fr');
Dans cette ligne nous créons tout d'abord un nouveau objet de type Zend_Translate. Le constructeur prend trois paramètres :
  • Le premier est l'adaptateur utilisé. Ici nous utilisons gettext mais vous pouvez très bien utiliser csv, tbx, …
  • Le deuxième paramètre est le chemin vers le fichier de traduction. Avec gettext il s'agit d'un fichier binaire d'extension mo.
  • Enfin le dernier paramètre est la langue chargé. Ici le français (fr).
Si vous avez plusieurs fichier de traduction (comme c'est souvent le cas !) il faut les ajouter avec

$translate->addTranslation('/languages/en/LC_MESSAGES/lang.mo','en');

A ce moment là vous pouvez déjà afficher vos messages. Pour cela il existe deux méthodes : La première avec la chaine d'origine, par exemple pour traduire 'Ma chaine à traduire' :

Print $translate->_("Ma chaine à traduire");
La deuxième à partir de l'id de la phrase traduite, par exemple pour la chaine traduite d'id 3 :

Print $translate->_(3);
Pour savoir dans quelle langue sera traduit notre phrase nous pouvons utiliser la méthode getLocale() qui retourne une instance de Zend_Locale ou un identifiant de localisation.

$langue = $translate->getLocale();
Pour spécifier la langue à utiliser il faut utiliser la méthode setLocale().

$translate->setLocale("en");
Pour améliorer les performances de l'application on peut spécifier à Zend_Translate un cache où il stockera des données pour y accéder plus rapidement. Ceci ce fait comme suit :

// Options du frontend et du backend
$frontendOptions = array('lifetime'
=> 7200, 'automatic_serialization' => true);
$backendOptions =
array('cache_dir' => '/tmp/' );
// Création d'un cache
$cache = Zend_Cache::factory(Core','File',$frontendOption,
$backendOptions);
// Spécifier à Zend_Translate le cache
Zend_Translate::setCache($cache);

Ainsi l'exécution sera plus rapide. Nous créons tout d'abord un cache en utilisant la factory de Zend_Cache. Les paramètres sont tout d'abord le frontend (ici Core) et le backend (ici File) suivit de leurs options. Ensuite nous spécifions à la classe Zend_Translate ce cache avec la méthode setCache.

2 commentaires:

  1. Bonjour,

    Est-il possible de télécharger que les classes pour la traduction ? Je ne veux pas utiliser tout le framework Zend. Mon serveur apache est sous Debian et j'utilise des fichiers TMX.

    Merci d'avance pour votre aide,

    Cordialement,

    Vincent BARBEROT (networkvb)

    RépondreSupprimer
  2. Bonjour Vincent,

    Tu trouvera dans le dossier Zend un fichier Translate.php ainsi que un dossier Translate qui contient toutes les dépendances de Zend_Translate.

    Il ne semble pas que Zend_Translate ai beaucoup de dépendance autre si ce n'est peu être Zend_Cache pour le cache des traductions.

    Bon courage.

    PS: Mon blog a changé d'adresse et est maintenant disponible ici : http://romain.therrat.fr

    RépondreSupprimer