2012-10-18 172 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');