我创建了一个自定义LocaleListener:
class LocaleListener implements EventSubscriberInterface
{
public function onKernelRequest(GetResponseEvent $event)
{
if ($request->getSession()->get("language")) {
$lang = $request->getSession()->get("language");
} else {
$lang = $request->getPreferredLanguage(array("de", "en"));
}
$request->getSession()->set('_locale', $lang);
$request->setLocale($request->getSession()->get('_locale', $lang));
}
public static function getSubscribedEvents()
{
return array(
KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
);
}
}
我从会话(如果存在)或浏览器中获取语言代码。现在我想纠正/操纵路线。我在路由器中使用_locale
来设置语言代码(en
或de
)。现在我想覆盖用户的选择。
例如,LocaleListener
中的语言代码为de
。用户现在会请求_locale
= en
(例如:/en
而非自动/de
)的网址。
如何通过监听器或其他解决方案强制将用户_locale
设置为每个控制器外LocaleListener
的结果?
答案 0 :(得分:0)
在这种情况下,您需要添加RedirectResponse
$event->setResponse(new RedirectResponse($request->getBaseUrl().'/'.$locale.'/'.($params ? '?'.http_build_query($params) : '')));
或使用JMSI18nRoutingBundle https://github.com/schmittjoh/JMSI18nRoutingBundle