Fork me on GitHub
Oct 15th, 2009

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-variable key_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');

    return Zend_Registry::set('Zend_Translate', $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’);

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 ?


By the way, if you found a typo, please edit this post . Thank you so much!