L’internationalisation

6 L’internationalisation

internationalisation-zend
Dans cet épisode, nous allons mettre en place l’internationalisation sur notre application Zend Framework. De cette façon, notre site pourra accueillir les visiteurs du monde entier ! Dans notre cas, nous allons prendre en compte la langue française ainsi que l’anglais.

Plan de l’épisode #06


La culture de l’utilisateur

Chaque utilisateur possède une culture spéciale en arrivant sur un site internet. Par exemple, nous pouvons avoir des visiteurs français (fr_FR) mais aussi des français belges (fr_BE). Avec le Zend Framework, on peut récupérer la culture de l’utilisateur par rapport à son navigateur grâce à au code :
1.$locale = new Zend_Locale(Zend_Locale::BROWSER);
Mais dans notre cas nous avons besoin uniquement de deux langues, le français et l’anglais, avec comme langue par défaut le français.

Mise en place de la traduction dans le bootstrap

Dans le fichier application/Bootstrap.php nous allons créer une nouvelle méthode nommée _initTranslate et configurer le module de traduction.
01.protected function _initTranslate()
02.    {
03.        // On récupère la session du site.
04.        $session = Zend_Registry::get('session');
05.        // On définit la langue par défaut sur le site.
06.        $locale = new Zend_Locale('fr');
07.        // On enregistre cette langue dans notre registre.
08.        Zend_Registry::set('Zend_Locale', $locale);
09.        // Si la langue existe en session, on récupère la session, sinon on prend la valeur par défaut.
10.        $langLocale = isset($session->lang) ? $session->lang : $locale;
11.        // On lance l'objet de traduction en lui passant les fichiers de langues
12.        $translate = new Zend_Translate('array',APPLICATION_PATH.'/languages/fr_FR.php','fr');
13.        $translate->addTranslation(APPLICATION_PATH.'/languages/en_US.php','en');
14.        // On lui passe la langue courante du site
15.        $translate->setLocale($langLocale);
16.        // Important pour utiliser le helper.
17.        Zend_Registry::set('Zend_Translate', $translate);
18.    }
Grâce à ce code, notre langue par défaut est définit et si la langue est en session, il va prendre cette langue.
De plus, il faut charger la session dans le registre, pour effectuer cela, rendez-vous dans la méthode _initSession de votre Bootstrap.php et modifier comme cela :
1.protected function _initSession()
2.    {
3.        // On initialise la session
4.        $session = new Zend_Session_Namespace('watchmydesk', true);
5.        Zend_Registry::set('session', $session);
6.        return $session;
7.    }
Ensuite nous charger les fichiers de traductions en fonction de la langue utilisée.
Pour créer les fichiers de langues, nous allons aller application/languages/ et créer deux fichiers, fr_FR.php et en_US.php .
Fichier fr_FR.php
1.< ?php
2.return array(
3.'hello' => 'Bonjour et bienvenue sur notre site',
4.'english' => 'Anglais',
5.'french' => 'Français'
6.);
Fichier en_US.php
1.< ?php
2.return array(
3.'hello' => 'Hello and welcome on the website',
4.'english' => 'English',
5.'french' => 'French'
6.);
Dans cet exemple, j’ai choisis le type array pour mes fichiers de traduction, mais il existe beaucoup de solution comme Array, CSV, Gettext, Ini … vous pouvez vous renseigner sur les types sur cette page..

Le changement de la langue

Notre application multi-langue est prête, mais il faut maintenant pouvoir changer la langue du site avec un lien par exemple.
Nous allons donc ouvrir le fichier application/modules/frontend/controllers/IndexController.php et ajouter cette méthode:
1.public function languageAction(){
2.        $params = $this->getRequest()->getParams();
3.        if(isset($params['lang']) && in_array($params['lang'], array('en','fr'))){
4.            Zend_Registry::get('session')->lang = $params['lang'];
5.        }
6.        $this->_redirect('/');
7.    }
Cette fonction permet de changer la langue qui est en session, tout en utilisant uniquement deux langues.
Ensuite nous allons éditer quelques lignes de code dans notre fichier application/layouts/layout.phtml :
7.echo $this->layout()->content ?>
Le helper utilisé ici n’existe pas dans le Zend Framework, je vous donne donc la source ici. Il faudra créer un fichier dans application/views/helpers/ , le nommer Link.php et le remplir avec le code source que je vous donne.

Le helper

Maintenant que la traduction est opérationnelle, il nous faut utiliser le helper de traduction du Zend Framework :
1.$this->translate("lenomatraduire");
Nous allons donc éditer deux fichiers, layout.phtml et et /application/frontend/views/index/index.phtml.
Layout.phtml
et index.phtml
1.< ?= $this->translate("hello")?>

Conclusion

Dans cet épisode, nous avons vu comment utiliser les composant Zend_Locale et Zend_Translate du Zend Framework dans le but de mettre en place l’internationalisation (i18n) de notre application. Vous trouverez la version pour Symfony sur le blog de la fermeduweb