Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour tous le monde.
Voila j'ai un petit bout de code que j'aimerais placer dans mon application ZF2, mais je cherche quel serait le meilleur endroit dans l'architecture pour placer ça.
Il s'agit de faire un setLocale de mon translator en fonction de l'url rentré par l'internaute :
$sm=$this->getServiceLocator(); $lang = $this->getEvent()->getRouteMatch()->getParam('lang','fr'); switch ($lang) { case 'fr': $sm->get('translator')->setLocale('fr_FR')->setFallbackLocale('fr_FR'); break; case 'en': $sm->get('translator')->setLocale('en_US')->setFallbackLocale('en_US'); break; }
Ca marche parfaitement dans une action de controller. Je voudrais remonter ça de façon automatique. Mais je ne sais pas quel serait la meilleur option Bootstrap, EventManager, dispatch ....
Si vous avez des conseils je suis preneur
Hors ligne
Salut, à vu de nez je dirais via un évènement au niveau du routage.
Hors ligne
Au niveau du routage j'ai pas vraiment réussi à attacher l'event
J'essaye au niveau du dispatch, j'ai mis le code suivant dans Module.php de mon module.
public function init(\Zend\ModuleManager\ModuleManager $mm){ $sem = $mm->getEventManager()->getSharedManager(); $sem->attach('Monmodule', \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'onDispatch')); } public function onDispatch(\Zend\Mvc\MvcEvent $e){ $sm = $e->getApplication()->getServiceManager(); $lang = $e->getRouteMatch()->getParam('lang','fr'); switch ($lang) { case 'fr': $sm->get('translator')->setLocale('fr_FR')->setFallbackLocale('fr_FR'); break; case 'en': $sm->get('translator')->setLocale('en_US')->setFallbackLocale('en_US'); break; } }
Dans mes vues ça fonctionne, le $this->translate() marche. Par contre j'aurais besoin dans mes action de controller de récupérer la locale en cours.
Et quand dans une action je fais :
$locale=$sm->get('translator')->getLocale();
Bah j'obtient pas la bonne locale. L'event Dispatch est bien lancé avant l'action du controller non ?
Hors ligne
Je ne suis pas sûr pour moi non, j'ai pas tous les évènements en tête mais dispatch c'est juste après le contrôleur et avant de retourner la vue.
Normalement si tu fais la même chose que ce que tu fais là sur l'évènement route ça devrait fonctionner.
Hors ligne
Mouai mais alors si je met
$sem->attach('Eridufront', \Zend\Mvc\MvcEvent::EVENT_ROUTE, array($this, 'onDispatch'));
y'a rien qui se passe...
Hors ligne
Et si tu mets * comment identifiant au lieu de Eridufront ?
Hors ligne
dans ton controller essaie ceci :
public function indexAction() { $tr = $this->getServiceLocator()->get('translator'); $locale = $tr->getLocale(); return array( 'locale' => $locale, ); }
dans ta vue :
<p><?php echo $this->locale; ?></p>
Dernière modification par aromatix (10-09-2013 01:23:34)
Hors ligne
Salut mtcocktail !
Si tu souhaites faire une gestion de fichiers de langue (avec les .po et .mo). Je te conseillerai de set ta variable locale dans le module.config.php de ton module principal pour toutes les traductions d'interface, menu non dynamique, pied de page, etc...
Cas de site anglais/francais:
[lang=php] 'translator' => array( 'locale' => ($_SERVER['HTTP_HOST'] == 'mondomaine.fr') ? 'fr_FR' : 'en_US', 'translation_file_patterns' => array( array( 'type' => 'gettext', 'base_dir' => __DIR__ . '/../language', 'pattern' => '%s.mo', ), ), ),
Dans l'exemple ci-dessus, on gère le locale pour des noms de domaines différents mais dans la majorité des cas on le gère dans les URI vu que l'on a qu'un seul nom de domaine à gérer. :p
Et ensuite comme aromatix l'explique, tu utilises la méthode getLocale() que tu passes dans ta vue.
Tu t'en serviras alors pour toutes les traductions enregistrées en base de données.
Dernière modification par Vishnu (13-09-2013 09:05:48)
Hors ligne