Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 04-09-2013 18:37:22

mtcocktail
Membre
Date d'inscription: 20-09-2012
Messages: 71

Placer son setLocale au bon endroit

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 :

Code:

        $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 smile

Hors ligne

 

#2 04-09-2013 21:19:17

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Placer son setLocale au bon endroit

Salut, à vu de nez je dirais via un évènement au niveau du routage.

Hors ligne

 

#3 05-09-2013 09:53:40

mtcocktail
Membre
Date d'inscription: 20-09-2012
Messages: 71

Re: Placer son setLocale au bon endroit

Au niveau du routage j'ai pas vraiment réussi à attacher l'event sad

J'essaye au niveau du dispatch, j'ai mis le code suivant dans Module.php de mon module.

Code:

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 :

Code:

 $locale=$sm->get('translator')->getLocale();

Bah j'obtient pas la bonne locale. L'event Dispatch est bien lancé avant l'action du controller non ? sad

Hors ligne

 

#4 05-09-2013 10:42:28

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Placer son setLocale au bon endroit

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

 

#5 05-09-2013 14:19:38

mtcocktail
Membre
Date d'inscription: 20-09-2012
Messages: 71

Re: Placer son setLocale au bon endroit

Mouai mais alors si je met

       $sem->attach('Eridufront', \Zend\Mvc\MvcEvent::EVENT_ROUTE, array($this, 'onDispatch'));
 
y'a rien qui se passe... sad

Hors ligne

 

#6 05-09-2013 14:31:28

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: Placer son setLocale au bon endroit

Et si tu mets * comment identifiant au lieu de Eridufront ?

Hors ligne

 

#7 10-09-2013 00:56:15

aromatix
Membre
Lieu: paris - agadir
Date d'inscription: 12-03-2013
Messages: 20
Site web

Re: Placer son setLocale au bon endroit

dans ton controller essaie ceci :

Code:

    public function indexAction()
    {
        $tr = $this->getServiceLocator()->get('translator');
        $locale = $tr->getLocale();
        return array(
            'locale' => $locale,
        );
    }

dans ta vue :

Code:

<p><?php
    echo $this->locale; 
?></p>

Dernière modification par aromatix (10-09-2013 01:23:34)

Hors ligne

 

#8 10-09-2013 07:50:52

Vishnu
Nouveau membre
Date d'inscription: 11-07-2013
Messages: 4

Re: Placer son setLocale au bon endroit

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:

Code:

[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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages