Comment mettre en place un systeme de traduction dans Zend Framework

zend_translation

Avoir un site, c’est bien, mais c’est encore mieux si on peut le traduire facilement dans plusieurs langues. On va voir ensemble comment mettre en place un fichier de traduction avec Zend_Translate dans notre application. Il y a plusieurs moyens de gérer les traductions avec Zend Framework. Chacun a ses avantages et inconvénients. La je vais utiliser un simple fichier php qui va contenir un tableau (array) avec les traductions. L’avantage du tableau php : on peut facilement le mettre a jour, il est lisible par un humain. Par contre il a un inconvénient : Si l’application est énorme, on aura des problème de performance. A vous de bien choisir la gestion de la traduction.

Le fichier de traduction :

Il faut le placer dans le dossier : application/languages/. Pour le nom on va être créatif et l’appeler fr.php pour la traduction en français. Il ressemble a ça :

<?php
return array(
	'key_1'=>'Traduction 1',
	'key_2'=>'Traduction 2',
);

Donc quand on va utiliser la pseudo-variablekey_1‘, l’application traduira automatiquement key_1‘ en ‘Traduction 1‘ (bien sur si on est en français dans l’application. Sinon j’ai dit pseudo-variable car on utilise ‘key_1‘ d’une façon bien particulières. Tout dépend du contexte. On va y venir…

Le bootstrap

Il faut bien entendu « dire » à notre application qu’il faut qu’elle utilise les traductions et il faut aussi lui donner une langue par défaut. On peut même faire en sorte que l’application choisisse elle même la langue en fonction de la position géographique de l’utilisateur final, mais la j’y reviendrais dans un prochain tuto.
Voilà, on ajoute ce code dans notre bootstrap :

	/**
	* Initialize Translation
	*
	* @return Zend_Translate
	*/
	public function _initTranslate()
	{
		$translate = new Zend_Translate('array', APPLICATION_PATH . '/languages/fr.php', 'fr');
		Zend_Registry::set('Zend_Translate', $translate);
		return $translate;
	}

voilà on peut maintenant utiliser notre fichier de traduction :

Dans un model :

Ici c’est (relativement extrêmement) simple. Par exemple si on veut mettre un label a un élément d’un formulaire (Zend_Element, Zend_Form), et bien sur le traduire il n’y a rien a faire, il suffit de donner a la méthode setLabel la clé de notre tableau qui est dans le fichier fr.php. Par exemple pour un champs password :

$password = new Zend_Form_Element_Password(‘password’);
$password->setLabel(‘form_user_add_password’);[/code]

Et dans notre fichier fr.php :

'form_user_add_password'=>'Mot de passe : ',

Petit tips : Si on a besoin de traduire des messages d'erreurs liés aux validateurs (Zend_Validate) d'éléments du formulaire il faut ajouter dans le fichier de traduction, le message original renvoyé par le validateur. On peu trouvé les messages originaux ici (merci guiton)

//Pour la validation : valeur requise
'Value is required and can't be empty'=>'la valeur est requise',
//Pour la validation : Le champs values est deja dans la BDD
'A record matching %value% was found'=>'Il y a déja  '%value%' dans la BDD',

Comme on peut le voir sur le deuxième exemple, on peut récupérer le paramètre %value% directement dans le message traduit. C'est la valeur qui a été saisi par l'utilisateur.

Dans une vue (view) :

Si on a besoin d'une traduction dans une vue, la c'est un tout petit peu plus compliqué :

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

Et dans notre fichier fr.php :

'view_user_add'=>'Ajouter un utilisateur',

Voilà, c'est assez simple, si on veut la traduction de 'key_1' il suffit de faire

$this->translate('key_1')

Bon voilà on a fait le tours ! Enfin il me semble. Il y a des questions ou des remarques ?

Articles en rapport:

6 thoughts on “Comment mettre en place un systeme de traduction dans Zend Framework

  1. Merci pour le post, ca parait beaucoup plus simple! En creusant un peu, je suis tomber sur cette page http://framework.zend.com/manual/fr/zend.form.i18n.html où l’on peut lire ceci :

    « Messages d’erreur des validateurs : les messages d’erreurs des validateurs peuvent être traduits. Pour cela, utilisez les identifiants des messages des validateurs (constantes de vos validateurs Zend_Validate. Pour plus d’informations sur ces clés, voyez la documentation de Zend_Validate.

    Aussi, depuis la version 1.6.0, vous pouvez fournir des chaînes de traduction en utilisant les messages d’erreur actuels comme identifiants. C’est le comportement recommandé pour 1.6.0 ou supérieures, nous allons déprécier l’utilisation des clés (constantes de classe) dans les prochaines versions. »

    Du coup, je suis un peu embrouillé, et je me demande s’il faut utiliser les constantes des validateurs comme clé de traduction, ou autre chose.

    Un avis ?

  2. Salut,
    J’utilise suite à un post de Julien Pauli, les fichiers de traduction des Validators sur : http://framework.zend.com/svn/framework/standard/trunk/resources/languages/

    Pour ce qui est de la traduction, pour l’instant je ne désirais que traduire les messages d’erreurs dans les Form, issus des Validators. En grattant un peu, car j’ai pas trouvé ni doc ni exemple, il y a Zend_Application_Resource_Locale et Zend_Application_Resource_Translate qui se chargent de tout, sans rien faire d’autre que remplir le fichier application.ini.
    Les messages des Zend_Validator dans Zend_Form sont traduits automatiquement sans aucun recours a des $this-translate un peu partout: mon fichier de config :
    ; ## Local et Translate
    ; tentative de détection automatique, si impossible alors on prend fr_FR.
    resources.locale.default = « fr_FR »
    ; Pour dans tous les cas, forcer fr_FR à être utiliser :
    ;;resources.locale.force = true
    resources.translate.data = ROOT_PATH « /data/languages »
    resources.translate.adapter = »array »
    resources.translate.locale = »auto »
    resources.translate.options.scan= »directory » ; ou « filename »
    resources.translate.options.disableNotices = 1

  3. J’oubliais, ci dessus c’est la config production, pour le developpement :
    resources.translate.options.disableNotices = 0
    … afin de voir ce qui n’est pas traduits.
    Par contre il resterais à ajouter (car j’ai pas encore tester), pour la prod :
    options.logUntranslated = true
    options.log = Instance de Zend Log
    et surtout, aussi le système de cache, j’ai vu qu’il y a des options, toujours possible via la config, car depuis cet ajout à mon appli, on sent de suite que le chargement est plus long, pas besoin de profiler pour le voir !