17 août
Par Clément dans Tutoriels
Mots-clefs :Internationalisation, PHP, Zend, Zend Framework, Zend_Session, Zend_Translate

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.
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 :
$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.
Dans le fichier application/Bootstrap.php nous allons créer une nouvelle méthode nommée _initTranslate et configurer le module de traduction.
protected function _initTranslate()
{
// On récupère la session du site.
$session = Zend_Registry::get('session');
// On définit la langue par défaut sur le site.
$locale = new Zend_Locale('fr');
// On enregistre cette langue dans notre registre.
Zend_Registry::set('Zend_Locale', $locale);
// Si la langue existe en session, on récupère la session, sinon on prend la valeur par défaut.
$langLocale = isset($session->lang) ? $session->lang : $locale;
// On lance l'objet de traduction en lui passant les fichiers de langues
$translate = new Zend_Translate('array',APPLICATION_PATH.'/languages/fr_FR.php','fr');
$translate->addTranslation(APPLICATION_PATH.'/languages/en_US.php','en');
// On lui passe la langue courante du site
$translate->setLocale($langLocale);
// Important pour utiliser le helper.
Zend_Registry::set('Zend_Translate', $translate);
}
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 :
protected function _initSession()
{
// On initialise la session
$session = new Zend_Session_Namespace('watchmydesk', true);
Zend_Registry::set('session', $session);
return $session;
}
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
< ?php return array( 'hello' => 'Bonjour et bienvenue sur notre site', 'english' => 'Anglais', 'french' => 'Français' );
Fichier en_US.php
< ?php return array( 'hello' => 'Hello and welcome on the website', 'english' => 'English', 'french' => 'French' );
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..
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:
public function languageAction(){
$params = $this->getRequest()->getParams();
if(isset($params['lang']) && in_array($params['lang'], array('en','fr'))){
Zend_Registry::get('session')->lang = $params['lang'];
}
$this->_redirect('/');
}
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 :
<div id="menu">
<ul>
<li><a href="<?= $this->link('index', 'language', null, array('lang' => 'en'))?>">Anglais</a></li>
<li><a href="<?= $this->link('index', 'language', null, array('lang' => 'fr'))?>">Français</a></li>
</ul>
</div>
<?php 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.
Maintenant que la traduction est opérationnelle, il nous faut utiliser le helper de traduction du Zend Framework :
$this->translate("lenomatraduire");
Nous allons donc éditer deux fichiers, layout.phtml et et /application/frontend/views/index/index.phtml.
Layout.phtml
<li><a href="<?= $this->link('index', 'language', null, array('lang' => 'en'))?>"><?=this->translate("english"); ?></a></li>
<li><a href="<?= $this->link('index', 'language', null, array('lang' => 'fr'))?>"><?=this->translate("french"); ?></a></li>
et index.phtml
< ?= $this->translate("hello")?>
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
« Comment utiliser la connexion OAuth de Twitter avec PHP | Colorbox, une Lightbox jQuery vraiment pratique »
Aucun trackback
37 commentaires
Tamsir SENE
17 août 2009 à 18:51
1Merci, je suis avec intérêt les tutos sur zend que vous publiez tous les lundis. GOOD JOB et vivement la suite
yveson33
17 août 2009 à 21:14
2une question. j’ai pas encore cherché mais.supposons que je declare la ressource session dans le boostrap avec une fonction donc je fais une return session et non le registry.alors comment utiliser une ressource du boostrap dans une autre methode du meme boostrap. merci
Manu
18 août 2009 à 13:01
3Vraiment très intéressant, bien documenté, continues !
Gilou
18 août 2009 à 15:30
4Question :
$session = Zend_Registry::get(’session’);
No entry is registered for key ’session’…
Un bug ou j’ai loupé quelque chose ?
Patrice Robitaille
18 août 2009 à 15:49
5Tient Gilou, j’allais décrire le bug que je viens de voir ton message tout juste apparaître.
$session = Zend_Registry::get(’session’);
No entry is registered for key ’session’…
Hum…je n’ai pas vu dans les étapes l’enregistrement de la session comme une valeur dans le registre, peut-être qu’il faut utiliser la méthode statique set().
Patrice Robitaille
18 août 2009 à 18:26
6Pour ceux qui font des tests avec cette erreur,voici une façon de vérifier si la session est enregistré:
if (Zend_Registry::isRegistered(’session’))
Dans notre cas, ceci va tout le temps retourner false puisqu’elle n’existe tout simplement pas. Pour continuer à programmer en attendant, vous pouvez ajouter ceci:
Zend_Registry::set(’session’, » );
Mais ce code va seulement enlever l’erreur mais ne règlera pas le problème. J’ai vérifié et peut-être qu’il y aurait un lien avec l’étape 1 qui consiste a réaliser cette fonction:
protected function _initSession()
{
// On initialise la session
$session = new Zend_Session_Namespace(’session’, true);
return $session;
}
Clément
18 août 2009 à 18:38
7@Patrice Robitaille: @Gilou: En effet ! Merci de vos commentaires ! J’ai oublié une partie du code ! (vraiment désolé
)
Donc dans la partie _initSession du Bootstrap.php, il suffit d’ajouter en dessous de la déclaration du namespace ce morceaux de code :
Zend_Registry::set(’session’, $session);
Je modifie l’article en conséquence !
Patrice Robitaille
18 août 2009 à 18:58
8Wow merci pour la rapidité, j’ai déclaré l’erreur sur ton email et ailleurs aussi, j’espère que ceci te dérangeras pas trop !
Aidons-nous pour le partage d’information !
Patrice Robitaille
18 août 2009 à 19:31
9C’est encore moi, le code fonctionne parfaitement mais je vais indiquer dans mon commentaire un petit ajout pour ceux qui travail déjà avec des formulaires.
Voici le code qui va permettre de traduire tous les messages d’erreurs dans la langue choisis avec le même principe. Il suffit de rajouter la ligne suivant à la toute fine de la fonction _initTranslate:
Zend_Validate_Abstract::setDefaultTranslator($translate);
Puis, dans votre fichier de traduction dans le dossier languages, vous pouvez rajouter des lignes comme ceux-ci:
‘hello’ => ‘Bonjour et bienvenue sur notre site’,
‘english’ => ‘Anglais’,
‘french’ => ‘Français’,
‘notAlnum’ =>
« ‘%value%’ ne contient pas que des lettres et/ou des chiffres.» ,
‘notAlpha’ =>
« ‘%value%’ ne contient pas que des lettres.»
etc…
Pour voir tous les clés des messages d’erreurs disponibles, ils sont sur le site officiel:
http://framework.zend.com/manual/fr/zend.validate.html
BADEM Hayg
2 septembre 2009 à 9:11
10Bonjour, je suis nouveau dans le Zend Framework
j’aurais une critique (peut-être) le fait d’ecrire 5 lignes de code pour chaque controller, il n’y a pas moyen de le faire autre part ?
car pour chaque controller c’est très redondant (et en plus des autres chose qu’on écrit poru chaque controller).
laurent HADJADJ
2 septembre 2009 à 13:48
11Bonjour,
j’utilise la version 1.9.2 de zend et j’ai de très grande difficulté pour mettre en pratique ces tutos. Pour ce tuto, je n’ai pas d’erreur, mais rien ne se passe. Je n’ai pas de traduction, ni lien qui s’affiche. Pouvez-vous poster l’ensemble des sources des scripts.
merci d’avance
Clément
2 septembre 2009 à 14:14
12@laurent HADJADJ: J’y pense depuis plusieurs semaines. Je vais surement mettre en place la semaine prochain un repository git en place pour télécharger les sources !
@BADEM Hayg: Les 5 lignes sont pour expliquer comme ce passe l’internationalisation, regarde le nouvel épisode, la traduction est optimisé
Bonne journée !
laurent HADJADJ
2 septembre 2009 à 15:53
13Merci, effectivement cela ne marche pas, l’épisode 7 non plus, mais à force de chercher et de faire des mofications dans tout les sens, le mixte des deux fonctionne :
J’ai repris les exemples tu tuto 7 sans le plugin que je n’arrive pas à charger, et la fonction _initTranslate().
J’ai une traduction qui s’affiche, super. Mainetenant, je dois nettoyer le code pour comprendre comment ça marche.
merci
laurent HADJADJ
2 septembre 2009 à 16:03
14Super, cela marche….
il faut remplacer :
translate(» hello» )?>
par :
translate(» hello» )?>
Pourquoi le code est-il incorrect ?
Farid
27 septembre 2009 à 11:47
15pour avoir l’affichage faire attention aux petites erreurs dans le code :
<a href="link(’index’, ‘language’, null, array(’lang’ => ‘en’))?>» >translate(» english» ); ?>
<a href="link(’index’, ‘language’, null, array(’lang’ => ‘fr’))?>» >translate(» french» ); ?>
manque $ à this->translate(» ..» )
et aussi :
translate(» hello» )?> le petite espace avant le ? ne passe pas bien :
translate(» hello» )?>
Sinon merci pour ce bon tuto.
Farid
27 septembre 2009 à 11:53
16oh des caractères du copié collé ont sauté je retente en tapant au clavier :
1) manque $ à this->translate(» ..» ) sur les liens pour layout.html
2) dernière ligne dans index.phtml attention à l’espace :
translate(» hello» ) ?> mettre translate(» hello» )?>
Aurao
26 octobre 2009 à 12:08
17Hello
Tout d’abord merci pour ces tutos, ils sont vraiment très intéressants quand on débute sur Zend.
Juste un petit détail pas très important mais qui me turlupine pas mal xD
Pourquoi enregistrer la session dans le Zend_Registry alors qu’on est toujours dans le bootstrap. Si dans _iniSession() on fait un return $session, il suffit de faire $this->getRessource(’session’) dans les autres méthodes du bootstrap pour la récupérer.
Alexandre Mercier
21 avril 2010 à 6:18
18Bonjour,
Je vois dans votre tutorial que vous traduisez le nom des langues dans la locale courante :
<a href="link(’index’, ‘language’, null, array(’lang’ => ‘en’))?>» >translate(» english» ); ?>
<a href="link(’index’, ‘language’, null, array(’lang’ => ‘fr’))?>» >translate(» french» ); ?>
Je pense qu’en termes d’accessibilite c’est une erreur. En effet, si l’utilisateur souhaite changer la langue, c’est que par definition la langue actuelle ne lui correspond pas. Un exemple: vous vous connectez depuis un ordinateur dans un cyber-cafe a l’etranger, qui est configure dans la langue locale. Imaginez la galere si votre site est ecrit tout en Thai ou Vietnamien !!!
Je pense donc qu’un bonne pratique est plutot d’afficher le nom de la langue dans cette meme langue :
<a href="link(’index’, ‘language’, null, array(’lang’ => ‘en’))?>» >English
<a href="link(’index’, ‘language’, null, array(’lang’ => ‘it’))?>» >Italiano
<a href="link(’index’, ‘language’, null, array(’lang’ => ‘es’))?>» >Espanol
<a href="link(’index’, ‘language’, null, array(’lang’ => ‘nl’))?>» >Nederlands
<a href="link(’index’, ‘language’, null, array(’lang’ => ‘de’))?>» >Deustch
<a href="link(’index’, ‘language’, null, array(’lang’ => ‘fr’))?>» >Francais
etc…
Je pense que c’est la methode la plus accessible…
Une autre note : evitez les drapeaux pour les liens de langues. Dans certains pays, ca peut etre mal vu par les utilisateurs. Je n’y avais jamais songe jusqu’a ce qu’un ami bresilien me fasse la remarque : il ne supporte pas les sites ou on lui demande de cliquer sur un drapeau portugais :s Et apparemment il n’est pas le seul… Bon apres, je trouve ca un peu extreme, mais c’est dur de se mettre a leur place… Aurtout que dans ce cas c’est souvent des ex-colonies, toussa… donc perso j’evite et je ne mets que du texte.
Sinon, felicitation et merci beaucoup pour ce tutorial qui m’a beaucoup aide !
P.S. : desole pour les accents :/
Cyrille
27 avril 2010 à 16:08
19Juste une petite remarque… Pour ceux qui sont comme moi un peu bête…
J’avais une erreur dans les liens générés… avec un undefined…
J’ai modifié le fichier Link.php pour le helper link en rajoutant juste au début de la fonction l’initialisation de la variable $p
Ca donne donc :
public function link($controllerName = null, $actionName = null, $moduleName = null, $params = » , $name = ‘default’, $reset = true)
{
$p = » ;
…
}
Et merci encore pour ces tutos, ça m’aide bien…
dialloma
16 mai 2010 à 17:55
20Salut,
Excellent tuto. Je l’ai suivi jusqu’à la fin, mais ça ne marche pas chez moi. Les valeurs de mes clés ne sont pas affiché, donc je pense que mes fichiers d’internationalisation ne sont pas lu. Auriez vous une idée ?
Merci d’avance
dialloma
16 mai 2010 à 19:00
21j’ai même essayé d’utiliser des fichier .ini pour l’internationalisation mais toujours la même chose, rien ne s’affiche pour moi.
Serait il possible d’avoir le code source du tuto.
Merci d’avance
dialloma
16 mai 2010 à 19:48
22ça marche. l’erreur venait du fait que je n’avais pas fait attention à la notation <?=…?< au lieu de <?php … ?<. J’avais pensé à une erreur de frappe ou un formatage de code au moment de la publication. Quelle est la différence entre ces 2 notations ?
Merci à tous
dialloma
16 mai 2010 à 19:49
23je m’étais trompé…
ça marche. l’erreur venait du fait que je n’avais pas fait attention à la notation <?=…?> au lieu de <?php … ?>. J’avais pensé à une erreur de frappe ou un formatage de code au moment de la publication. Quelle est la différence entre ces 2 notations ?
Merci à tous
dialloma
18 mai 2010 à 21:01
24salut j’ai bien suivi le tutoriel. l’internationalisation marche bien. Mais le seul souci est comment rester dans la même page quand on clique sur les liens de changement de langues. Merci de m’éclairer ces points.
Merci d’avance
Alex
16 juin 2010 à 0:11
25Hello msieur !!!
Bon jusqu’ici tout allait plutot pas mal.
Mais des que j’ai voulu lancer dans le Bootsrap ma fonction _initTranslate ca plante severe.
J ai un gros message d’erreur que voici :
Fatal error: Uncaught exception ‘Zend_Translate_Exception’ with message ‘Error including array or file ‘1» in /Applications/MAMP/htdocs/applizend/library/Zend/Translate/Adapter/Array.php:61 Stack trace: #0 /Applications/MAMP/htdocs/applizend/library/Zend/Translate/Adapter.php(604): Zend_Translate_Adapter_Array->_loadTranslationData(’/Applications/M…’, ‘fr’, Array) #1 /Applications/MAMP/htdocs/applizend/library/Zend/Translate/Adapter.php(298): Zend_Translate_Adapter->_addTranslationData(Array) #2 /Applications/MAMP/htdocs/applizend/library/Zend/Translate/Adapter.php(160): Zend_Translate_Adapter->addTranslation(Array) #3 /Applications/MAMP/htdocs/applizend/library/Zend/Translate.php(136): Zend_Translate_Adapter->__construct(Array) #4 /Applications/MAMP/htdocs/applizend/library/Zend/Translate.php(89): Zend_Translate->setAdapter(Array) #5 /Applications/MAMP/htdocs/applizend/application/Bootstrap.php(57): Zend_Translate->__construct(’array’, ‘/Applications/M…’, ‘fr’) #6 /Applications/MAMP/htdocs/applizend/library/Zend/App in /Applications/MAMP/htdocs/applizend/library/Zend/Translate/Adapter/Array.php on line 61
Auriez vous la solution ?
Alex
16 juin 2010 à 0:16
26J’ai peut etre avance mais j ai un nouveau message qui me dit
Fatal error: Uncaught exception ‘Zend_Exception’ with message ‘No entry is registered for key ’session» in /Applications/MAMP/htdocs/applizend/library/Zend/Registry.php:147 Stack trace: #0 /Applications/MAMP/htdocs/applizend/application/Bootstrap.php(31): Zend_Registry::get(’session’) #1 /Applications/MAMP/htdocs/applizend/library/Zend/Application/Bootstrap/BootstrapAbstract.php(666): Bootstrap->_initTranslate() #2 /Applications/MAMP/htdocs/applizend/library/Zend/Application/Bootstrap/BootstrapAbstract.php(619): Zend_Application_Bootstrap_BootstrapAbstract->_executeResource(’translate’) #3 /Applications/MAMP/htdocs/applizend/library/Zend/Application/Bootstrap/BootstrapAbstract.php(583): Zend_Application_Bootstrap_BootstrapAbstract->_bootstrap(NULL) #4 /Applications/MAMP/htdocs/applizend/library/Zend/Application.php(355): Zend_Application_Bootstrap_BootstrapAbstract->bootstrap(NULL) #5 /Applications/MAMP/htdocs/applizend/public/index.php(25): Zend_Application->bootstrap() #6 {main} thrown in /Applications/MAMP/htdocs/applizend/library/Zend/Registry.php on line 147
Une idée ?
J’aimerais trop pouvoir avancer car c’est vraiment le meilleur tuto sur zend que j’ai trouvé !!!
Alex
16 juin 2010 à 0:19
27Bon allez le dernier post !!
J ai revérifié et je reviens sur mon premier message d’erreur !!
PS : c est normal pour le chemin de mon framework je l’inclut toujours dans la library
Zied
9 octobre 2010 à 9:53
28Bonjour
La traduction ne marche pas, rien n’est affiché : ni le texte du lien ni le lien dans le code source :
Voici comment je l’ai écrit:
‘en’))?>» >translate(» english» );?>
‘fr’))?>» >translate(» french» );?>
bien sur il y a le $ et this- et> devant le link et translate
Zied
9 octobre 2010 à 20:02
29J’ai du rajouter echo au début de chaque instruction pour que l’affichage marche.
Emil
21 octobre 2010 à 15:54
30Bonjour,
Mon problème est assez simple, j’ai suivi le tutos de bout en bout et lorsque j’essaye d’accéder à ma page ou de changer de langue j’arrive sur l’erreur suivante :
Fatal Error : Cannot redeclare class Zend_Locale in /**/**/**/library/Zend/Locale.php on line 31
Les étoiles correspondant à mon arborescence de projet, la ligne 31 du fichier correspond à la déclaration de la classe.
Je suis un peu perdu… Auriez vous déjà rencontré ce problème??
MErci d’avance.
Mael
26 octobre 2010 à 19:44
31Bonjour,
d’abord pour le problème d’Alex: as tu bien nommé ton fichier en_US.php et pas us_US.php ?
Ensuite, pour moi (^^): j’ai un peu le même problème qu’Emil, à savoir « Cannot redeclare class Zend_Translate» .
Pourtant je pense que la méthode _initTranslate, où est instancié Zend_translate, n’est appelé qu’une fois. J’ai cherché pendant 2 heures, et là je sèche.
Help!
Pandemus
29 octobre 2010 à 8:02
32Bonjour,
j’ai un léger problème, il semblerait que mon helpers ne soit pas reconnu.
Y a t il une déclaration particulière à faire?
Ma class se trouve bien dans /application/views/helpers/
Merci à vous
Pandemus
29 octobre 2010 à 11:03
33Problème résolu
merci
maki
25 juillet 2011 à 23:10
34Merci beaucoup pour ce tutoriel! Débutant avec Zend, j’avais du mal à faire fonctionner le changement de langue, et après plusieurs essais sans succès voilà le tuto simple et accessible que j’attendais
Andro
9 septembre 2011 à 12:11
35Bonjour,
L’internationalisation fonctionne, mais le layout n’a pas l’air de se charger
(si j’inspecte ma page, il n’y a effectivement rien)
Qqun aurait une idée d’ou cela pourrait provenir ?
(mes noms de repertoires, noms de fichiers sont correcte)
Merci d’avance
pappy cami
15 mai 2012 à 15:41
36Bonjour,
je suis nouveau sur Zend, et Merci bcp pour cet tuto, ça a bien marché, mais mon petit souci c’est coment faire si je veyt change seulement mon page actuel, sans revenir tout le temps dans l’ index/index merci pour votre aide
Zo Andrinina
5 novembre 2012 à 13:08
37Moi j’ai un problème, quand je change de langue toutes les données sont perdue. c’est comme une réinitialisation du page actuelle.
Laisser un commentaire
Devenir Fan de Dator.fr
Nuage de tags
Sponsors
Warning: gzinflate() [function.gzinflate]: data error in /homez.27/dator/www/wp-includes/http.php on line 1787
Blogoliste
Blogs Amis
Derniers Posts
Derniers Commentaires
Les meilleurs sujets
Propulsé par WordPress