2012-10-18 132 views
6

我想在我的symfony 2.1网站上有一个语言切换器。在Symfony 2.1中设置语言环境

我跟着official documentation,设置翻译文件,但设置语言环境$ request-> setLocale('en_US');似乎没有工作。经过一番调查,我找到this question,它提供了这个listener technique的答案的开始。

但是,我仍然没有设法让它工作,我不太确定我的听众声明,是不是有问题?

我的控制器:

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

服务声明在config.yml:

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

我的路由:

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

什么是您的需要?用例的一个例子?也许你不需要这个听众 – webda2l

+0

@ webda2l我只想让访问者选择网站的语言。你的答案中的代码是行不通的,但我想我必须改变我的路线,我会再努力一些.. –

+0

我是否正确设置了监听器?我的LocaleListener会被这样调用吗? –

回答

9

YML的LocaleListener的声明(由当前的启发声明新的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 } 

一些片段:

在你的模板语言切换:

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

来自控制器区域变化的重定向:

$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似乎工作真的很好。现在必须走了,当我回来时会玩更多,并且可能会接受答案,因为它似乎工作正常:)虽然我不确定要了解代码,但:( –

+0

工程很不错,因为我在服务中正确添加了服务('session') - > set('_ locale','en_US'); return $ this-> redirect($ request-> headers-> get(' ); –

+0

好的,YML中的基本声明必须能够工作,但是如果你使用service.xml来做XML,那就更好了:) – webda2l

0

你应该将翻译器实例链接到您的symfony内核容器:

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