我有一个对象语言,我可以从管理页面添加,删除和更新语言。
我想要做的是添加一个语言切换器,我把这个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
,就是我在上面的切换台中使用的动作:
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)。
由于
答案 0 :(得分:3)
在搜索更多详细信息以便撰写答案时,我偶然发现了这个Symfony
食谱条目: Making the Locale "Sticky" during a User's Session
我认为这正是你所需要的;)
答案 1 :(得分:3)
Symfony 2.6: 我使用了#34;提到Locale Sticky&#34;中提到的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'));
}
答案 2 :(得分:2)
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);
}
}
您可以添加为内核请求,并使用查询字符串swich_language进行更改