Blog développeur

« Etudie, non pour savoir plus, mais pour savoir mieux. »

Zend Framework

Traduire avec Zend_Translate

Par Guillaume Sarramegna, le 9 janv. 2012

Aujourd'hui, et après une longue absence de tutoriel (boulot oblige), je vous présente une nouvelle brique de Zend, celle de la traduction avec Zend_Translate.

Rien de plus simple ici, la mise en place de la traduction s'organise en 4 parties :

  1. Choisir le format de stockage des traductions
  2. Paramétrer Zend_Translate dans le bootstrap
  3. Intégrer Zend_Translate à la vue
  4. Créer le(s) fichier(s) de traduction

Partie 1 :

Le format de stockage, appelé aussi adaptateur, permet de stocker les traductions avec plusieurs avantages et inconvénients. Je ne ferai que citer les 3 principaux :

  • Tableau (array) : Utilise les tableaux PHP
    Avantages et inconvénients : Petites pages ; l'utilisation la plus simple ; seulement pour les programmeurs
  • Csv : Utilise les fichiers à séparation par virgule (*.csv/*.txt)
    Avantages et inconvénients : Format simple de fichier texte ; rapide ; problèmes possibles avec les caractères Unicode
  • Gettext : Utilise les fichiers binaires gettext (*.mo)
    Avantages et inconvénients : Norme GNU pour Linux ; thread-safe (contrairement à gettext de PHP) ; besoin d'outils pour la traduction

Nous allons ici prendre le cas de la traduction via un simple tableau PHP mais vous comprendrez qu'il est aussi très simple de mettre en œuvre une traduction avec les autres adaptateurs.

Partie 2 :

Le constructeur de la classe Zend_Translate prend 4 paramètres :

  1. Le type de l'adaptateur
  2. Le chemin vers le fichier ou le répertoire contenant les fichiers
  3. La langue
  4. Les options

Voici le code concernant la configuration de l'object Zend_Translate :

$translate = new Zend_Translate(
	'array',
	APPLICATION_PATH . '/languages',
	'auto',
	array('scan' => Zend_Translate::LOCALE_DIRECTORY)
);

On dit ici que :

  • le type de l'adaptateur est "array" (un tableau PHP)
  • les fichiers de langues sont stockés dans le répertoire "languages" du répertoire Application
  • la langue par défaut est la langue locale (ex : fr)
  • les fichiers se nomment et se trouvent en fonction de la langue locale (ex : fr.php ou fr/monfichierdelangue.php)

On peut définir la langue locale grâce à :

$translate->setLocale('fr');

Et finalement, on l'ajout au registre pour une utilisation plus tard dans l'affichage de la page :

Zend_Registry::set('Zend_Translate', $translate);

Voici le code complet :

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

	public function _initTranslate() {
		$translate = new Zend_Translate('array', APPLICATION_PATH.'/languages', 'auto', array('scan' => Zend_Translate::LOCALE_DIRECTORY));
		$translate->setLocale('fr');
		Zend_Registry::set('Zend_Translate', $translate);
		return $translate;
	}
}

Partie 3 :

Le plus dur est fait ! Voici donc le code pour la vue :

<?php echo $this->translate('I_LOVE_THIS_BLOG')?>

On fait donc appel à l'aide de vue Zend_View_Helper_Translate pour traduire un texte. Ici "I_LOVE_THIS_BLOG" est ce qu'on appelle une clé de traduction puisqu'elle sera la même pour toutes les langues. Il n'y a pas d'obligation de l'écrire en majuscule mais c'est une bonne habitude d'écrire les constantes des scripts PHP ainsi.

Partie 4 :

Eh oui, on enchaine ! Rien de plus simple que de constituer maintenant les fichiers de traductions. On prend pour premier exemple le fichier de traductions fr.php :

<?php
	return array(
		'I_LOVE_THIS_BLOG' => 'J\'adore ce blog !'
	);

Pour ajouter une clé de traduction, il suffit d'ajouter une valeur au tableau avec :

  • en clé : la clé de traduction
  • en valeur : le texte traduit dans la langue qui convient.

Pour le fichier de traductions en.php, il conviendra de traduire le texte comme ceci :

<?php
	return array(
		'I_LOVE_THIS_BLOG' => 'I love this blog !'
	);

Conclusion :

Voilà, c'est tout pour aujourd'hui, et comme vous avez été patient(e) et avez lu ce tutoriel jusqu'au bout, je vous donne un cadeau bonus pour gérer le changement de langue, le log des traductions inexistantes, et même un lien vers des fichiers pour traduire vos erreurs de formulaires automatiquement.

Bootstrap.php

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

	public function _initTranslate() {
		// On récupère la session de la langue
		$languageNamespace = new Zend_Session_Namespace('Language');
		$translate = new Zend_Translate('array', APPLICATION_PATH.'/languages', 'auto', array('scan' => Zend_Translate::LOCALE_DIRECTORY));
		// On définit la langue des traductions
		if ($translate->isAvailable($languageNamespace->country)) {
			$translate->setLocale($languageNamespace->country);
		} else {
			$translate->setLocale('fr');
		}

		// On stocke les traductions manquantes dans un fichier de log
		$writer = new Zend_Log_Writer_Stream(APPLICATION_PATH.'/log/translate-not-found.log');
		$log = new Zend_Log($writer);
		$translate->setOptions(array(
			'log' 				=> $log,
			'logMessage'      	=> "La clé de traduction '%message%' n'est pas connue en langue '%locale%'",
			'logUntranslated' 	=> true,
			'route'				=> array($translate->getLocale() => 'fr'),
		));

		Zend_Registry::set('Zend_Translate', $translate);

		Zend_Validate_Abstract::setDefaultTranslator($translate); // Pour gérer la traduction des erreurs de formulaires

		return $translate;
	}
}

IndexController.php

<?php

class IndexController extends Zend_Controller_Action {

	public function languageAction() {
		$this->_helper->layout()->disableLayout();
		$this->_helper->viewRenderer->setNoRender(true);

		$languageValue = $this->_request->getParam('country', 'fr');
		$languageNamespace = new Zend_Session_Namespace('Language');
		$languageNamespace->country = $languageValue;

		// On redirige vers la page précédente
		$this->_redirect($this->_request->getServer('HTTP_REFERER'));
	}
}

0 commentaire

Votre commentaire