2014-02-06 44 views
2

我有一個對象語言,我可以從管理頁面添加,刪除和更新語言。Symfony中的語言切換器2.4

我想要做什麼,是增加一種語言切換,我把這個HTML /枝代碼:

{% for language in languages %}   
     <li><a href="{{ path('evr_footer_switch_language',{'locale': language.code | lower }) }}">{{ language.language | capitalize }} ({{ language.code }})</a></li> 
{% endfor %} 

和動作the route for the action is evr_footer_switch_language,我在轉接器使用上面的一個:

public function switchlanguageAction($locale = 'en') { 

     $this->get('session')->set('_locale', $locale); 
     $request = $this->getRequest(); 
     $request->setLocale($locale); 
     return $this->redirect($request->headers->get('referer')); 
    } 

這是我的動作/控制器switchlanguageAction()定義的路由

evr_footer_switch_language: 
    pattern: /language/switch/{locale} 
    defaults: { _controller: EvrHomeBundle:Footer:switchlanguage, locale: en } 

在我看來,原則上很簡單,你點擊語言鏈接(從數據庫獲得),發送語言的代碼(例如:'fr','en','zh'等...)作爲$ locale變量的操作,然後將會話/請求的語言環境設置爲該值。

問題是,這些都不起作用,並且語言仍然是'EN'(默認值)。

注意根據本項目的要求,語言不能在URL中提到的(如FR /條,連接/篇),但相同的URL(/用品/)可以在不同的顯示語言,這就是爲什麼我沒有使用預定義的slug(_locale)

感謝

回答

3

雖然爲了寫一個答案,我偶然發現了這個Symfony食譜進入搜索一些細節:Making the Locale "Sticky" during a User's Session

我認爲這正是你所需要的;)

+0

非常感謝您的回答+1,但是......我創建了一個監聽器,並把它添加到services.yml(你提到的文章中描述的相同步驟),然後我設置的語言環境從控制器,但徒勞無功......它還沒有奏效。 – SmootQ

+0

非常感謝你,我申請了doc說的內容,但是爲了設置我只使用'$ request-> setLocale()'的語言環境,現在我添加了'$ this-> get('session') - >設置('_ locale')',它的作品...最佳答案! – SmootQ

3

Symfony 2.6: 我使用了「製作語言環境粘滯」中提到的LocaleListener,但也必須使用它來使事情正常工作:

/** from Controller 
* 
* @Route("/changeLanguage/{changeToLocale}", name="changeLanguage") 
* 
*/ 
public function changeLanguageAction($changeToLocale){ 
    $this->get('request')->attributes->set('_locale', null); 
    $this->get('session')->set('_locale', $changeToLocale); 

    return $this->redirect($this->generateUrl('index')); 
} 
+1

非常感謝你+1 – SmootQ