Symfony验证消息始终使用默认语言环境

时间:2020-05-31 15:55:12

标签: php symfony internationalization symfony5

因此,我已将网站配置为具有多个语言环境,具体取决于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变量未按每个请求的期望进行更新。 谢谢你们帮助我解决问题!

1 个答案:

答案 0 :(得分:0)

如果已将侦听器添加到内核响应,请通过将其设置为更高的优先级来确保其在其他侦听器之前运行。默认优先级为0,即最后运行。

我遇到了同样的问题,并通过将内核侦听器的优先级更改为127来解决了这个问题。