2012-10-18 10 views
6

Sto provando ad avere uno switcher di lingua sul mio sito web di symfony 2.1.Imposta locale in Symfony 2.1

Ho seguito il official documentation, ho impostato i file di traduzione ma ho impostato le impostazioni internazionali con $ request-> setLocale ('en_US'); non sembra funzionare. Dopo alcune ricerche, ho trovato this question che fornisce un inizio di una risposta con questo listener technique.

Tuttavia, non riesco ancora a farlo funzionare, non sono così sicuro della mia dichiarazione dell'ascoltatore, c'è qualcosa di sbagliato in esso?

mio regolatore:

public function englishAction(Request $request) 
{ 
    $this->get('session')->set('_locale', 'en_US'); 
    return $this->redirect($request->headers->get('referer')); 
} 

dichiarazione Servizio in config.yml:

services: 
    my_listener: 
     class:  "FK\MyWebsiteBundle\Listener\LocaleListener" 

mio percorso:

homepage: 
    pattern: /{_locale} 
    defaults: { _controller: FKMyWebsiteBundle:Default:index, _locale: en } 
    requirements: 
     _locale: en|fr|cn 
about: 
    pattern: /{_locale}/about 
    defaults: { _controller: FKMyWebsiteBundle:Default:about, _locale: en } 
    requirements: 
     _locale: en|fr|cn 
+0

Quali sono esattamente le vostre esigenze? Un esempio di caso d'uso? Forse non hai bisogno di questo ascoltatore – webda2l

+0

@ webda2l Voglio semplicemente consentire al visitatore di scegliere la lingua del sito web. Il codice nella tua risposta non funziona, ma suppongo di dover modificare i miei percorsi, lavorerò ancora su di esso .. –

+0

Sto configurando l'ascoltatore correttamente? Il mio LocaleListener sarà chiamato così? –

risposta

9

La dichiarazione del localeListener in yml (ispirato dalla corrente dichiarazione del nuovo LocaleListener: \ vendor \ symfony \ symfony \ src \ Symfony \ Bundle \ FrameworkBundle \ Resources \ config \ Web.xml)

services: 
    my_listener: 
     class: "FK\MyWebsiteBundle\Listener\LocaleListener" 
     arguments: [%locale%] 
     tags: 
      - { name: kernel.event_subscriber } 

Alcuni frammenti:

Uno switcher lingua nel modello:

{% for locale in ['en', 'fr', 'cn'] %} 
    <li {% if locale == app.request.locale %}class="active"{% endif %}> 
     <a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale' : locale})) }}">{{ locale }}</a> 
    </li> 
{% endfor %} 

Un reindirizzamento con il cambiamento locale da un controllore:

$LocalizedUrl = $this->get('router')->generate(
    $request->attributes->get('_route'), 
    ['_locale' => $locale] + $request->attributes->get('_route_params') 
); 

return new \Symfony\Component\HttpFoundation\RedirectResponse($LocalizedUrl); 
+0

@ webda2I Sembra funzionare davvero bene. Devo andare ora, giocherò di più quando torno e probabilmente accetterò la risposta perché sembra funzionare bene :) Non sono sicuro di capire il codice però :( –

+0

Funziona bene poiché ho aggiunto il servizio correttamente nei servizi .xml Nel mio controller, utilizzo: $ this-> get ('session') -> set ('_ locale', 'en_US'); restituisce $ this-> redirect ($ request-> header-> get (' referer ')); –

+0

Ok great La dichiarazione di base in YML deve funzionare ma se si esegue l'XML con service.xml, è meglio :) :) – webda2l

0

È dovrebbe portare l'istanza del traduttore collegata al contenitore del kernel di symfony:

$this->container->get('translator')->setLocale('fr');