[英]A language switcher in Symfony 2.4
我有一個對象語言,我可以從管理頁面添加,刪除和更新語言。
我想要做的是添加語言切換器,我把這個html / twig代碼:
{% 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
,我在上面的切換器中使用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'));
}
這是我為action / controller switchlanguageAction()定義的路由
evr_footer_switch_language:
pattern: /language/switch/{locale}
defaults: { _controller: EvrHomeBundle:Footer:switchlanguage, locale: en }
在我看來,原理上非常簡單,你點擊語言的鏈接(從數據庫中獲取),發送語言的代碼(例如:'fr','en','zh'等...)將操作作為$ locale變量,然后將會話/請求的Locale設置為此值。
問題是這些都不起作用,語言仍然是'EN'(默認值)。
注意根據這個項目的要求,URL中沒有提到語言(如fr / articles,en / articles), 但是相同的URL(/ articles /)可以用不同的語言顯示,這就是為什么我沒有不要使用預定義的slug(_locale) 。
謝謝
在尋找更多細節以便撰寫答案時,我偶然發現了這個Symfony
食譜條目: 在用戶會話期間使語言環境“粘滯”
我認為這正是你所需要的;)
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'));
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
// try to see if the locale has been set as a _locale routing parameter
if ($locale = $request->query->get('swich_language')) {
$request->getSession()->set('_locale', $locale);
$routing = $this->router->match($request->getPathInfo());
$route_params = array();
foreach ($routing as $key => $value) {
if($key[0] !== "_")
{
$route_params[$key] = $value;
}
}
$parameters = \array_merge($route_params, array("_locale" => $locale));
$url = $this->urlGenerator->generate($routing['_route'], $parameters);
$response = new RedirectResponse($url);
$event->setResponse($response);
}
}
您可以添加內核請求,使用querystring swich_language可以更改它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.