我创建了一个EventListener来根据用户偏好设置语言环境,我在侦听器中这样设置语言:
$request->setLocale($user->getLanguage());
$request->getSession()->set('_locale',$user->getLanguage());
I tried both.
我在service.yml
中注册侦听器:
app.event_listener.locale:
class: 'AppBundle'EventListener'LocaleListener'
arguments:
- '@security.token_storage'
tags:
- {name: 'kernel.event_listener', event: 'kernel.request', method: 'onKernelRequest'}
我也试图添加一个priority: 17
到服务,但它没有改变任何东西…
侦听器似乎有效,我可以在我的控制器中使用$request->getLocale()
(或会话)获得区域设置。
但是Twig仍然使用我在config.yml
中定义的默认语言:
parameters:
locale: fr
我现在迷路了,有什么建议吗?
我尝试了很多东西(改变优先级,检查区域设置是否传递到前面等…)最后,我在EventListener中强制翻译:
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if ($this->tokenStorage->getToken()) {
$user = $this->tokenStorage->getToken()->getUser();
if ($user && $user instanceof User) {
$request->setLocale($user->getLanguage());
} elseif ($request->query->has('locale')) {
$request->setLocale($request->query->get('locale'));
} else {
$request->setLocale($request->getPreferredLanguage());
}
}
$this->translator->setLocale($request->getLocale());
}
我不明白为什么,这应该在Symfony翻译器中完成,但它工作…
您必须为翻译人员设置语言环境,以便在模板中获得正确的翻译。
E。控制器中的G:
$this->get('translator')->setLocale($user->getLanguage());