2012-10-18 17 views
6

Próbuję mieć przełącznik języka na mojej stronie Symfony 2.1.Ustaw regionalne w Symfony 2.1

Podążałem za official documentation, ustawiłem pliki tłumaczeń, ale ustawiłem locale za pomocą $ request-> setLocale ('en_US'); wydaje się nie działać. Po przeprowadzeniu pewnych badań znalazłem this question, który stanowi początek odpowiedzi z tym listener technique.

Jednak nadal nie udaje mi się działać, nie jestem pewien co do deklaracji mojego słuchacza, czy coś w tym jest nie tak?

Mój kontroler:

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

deklaracja usługi w config.yml:

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

Moja routingu:

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

Czego dokładnie potrzebujesz? Przykład użycia przypadku? Może nie potrzebujesz tego słuchacza – webda2l

+0

@ webda2l Po prostu chcę pozwolić odwiedzającemu wybrać język witryny. Kod w twojej odpowiedzi nie działa, ale myślę, że muszę zmienić moje trasy, będę pracował nad tym trochę więcej. –

+0

Czy odpowiednio ustawiam słuchacza? Czy mój LocaleListener będzie nazywał się tak? –

Odpowiedz

9

Deklaracja LocaleListener w yml (inspirowane przez prąd deklaracja nowego 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 } 

Niektóre fragmenty:

przełącznikiem język w szablonie:

{% 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 %} 

Przekierowanie ze zmianami locale z kontrolerem:

$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 Wydaje się działać naprawdę miło. Muszę już iść, zagra więcej, gdy wrócę i prawdopodobnie zaakceptuję odpowiedź, ponieważ wydaje mi się, że działa dobrze :) Nie jestem pewien, aby zrozumieć kod :( –

+0

Działa miło, ponieważ dodałem usługę poprawnie w usługach .xml W moim kontrolerze używam: $ this-> get ('session') -> set ('_ locale', 'en_US'); return $ this-> redirect ($ request-> headers-> get (' referer ')); –

+0

Dobrze, podstawowa deklaracja w YML musi działać, ale jeśli zrobisz XML z service.xml, to lepiej. :) – webda2l

0

You powinien dostać instancję tłumacza powiązaną z kontenerem jądra symfony:

$this->container->get('translator')->setLocale('fr'); 
Powiązane problemy