因此,我已将网站配置为具有多个语言环境,具体取决于URL中的语言环境,例如:
http://127.0.0.1:8000/signup/es/
http://127.0.0.1:8000/signup/en/
我有一个LocaleSubscriber,就像这样:
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
/* If first request */
if (!$request->hasPreviousSession()) {
/* Set locale in session (locale from URL) */
// ...
}
return;
}
这对除验证消息以外的所有内容都适用。 翻译的存储方式如下:
/translations/messages.en.yaml
/translations/messages.es.yaml
/translations/validators.en.yaml
/translations/validators.es.yaml
我唯一可以确定的是,无论我将默认语言环境设置为在这里:
/config/packages/translation.yaml
例如:
framework:
default_locale: es
translator:
default_path: '%kernel.project_dir%/translations'
fallbacks:
- es
然后,验证消息将始终位于那个语言环境中,在这种情况下为 ES 。 所有其他翻译工作正常。 我在这里想念什么吗? 似乎翻译未配置为使用会话'_locale'变量或类似的变量。 有什么想法吗?
编辑: 添加了路由配置:
* @Route(
* "/signup/{_locale}/",
* locale="en",
* requirements={
* "_locale": "en|fr|de|es|it"
* },
* name="signup",
* methods={"GET"}
* )
编辑: 内核请求正文应如下所示:
if ($locale = $request->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
} else {
$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}
因此,会话_locale变量未按每个请求的期望进行更新。 谢谢你们帮助我解决问题!
答案 0 :(得分:0)
如果已将侦听器添加到内核响应,请通过将其设置为更高的优先级来确保其在其他侦听器之前运行。默认优先级为0,即最后运行。
我遇到了同样的问题,并通过将内核侦听器的优先级更改为127来解决了这个问题。