基于用户首选项的语言环境

时间:2019-09-18 14:46:28

标签: php symfony locale symfony4

我尝试根据用户设置(即用户实体中的“语言”属性)设置语言环境,但是由于用户在防火墙侦听器之前调用了LocaleListener(还包括TranslatorListener),因此它在第一个请求(使用用户身份验证)时失败。

我尝试了此示例documentation,但是在首次请求时,默认语言环境(在配置中)为“ fr”,我的用户使用“ en”定义了他的语言,最后页面以法语显示。

诀窍可能是创建一个侦听器(在LocaleListener或TranslatorListener之前调用)以从另一种方法获取用户的语言环境,但是我找不到要使用的方法。你有什么建议吗?

1 个答案:

答案 0 :(得分:0)

最后,我使用了Compiler Pass覆盖了TranslatorListener定义,现在以FirewallListener命名。

class OverrideTranslatorListenerCompilerPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container): void
    {
        if ($container->hasDefinition('translator_listener')) {
            $definition = $container->getDefinition('translator_listener');
            $definition->setTags([
                'kernel.event_listener' => [
                    [
                        'event' => KernelEvents::REQUEST,
                        'method' => 'onKernelRequest',
                        'priority' => 2, // 10 before
                    ],
                    [
                        'event' => KernelEvents::FINISH_REQUEST,
                        'method' => 'onKernelFinishRequest',
                        'priority' => 0, // not changed, needed because overridding ALL tags
                    ],
                ],
            ]);
        }
    }
}

还有我的订户

class LocaleSubscriber implements EventSubscriberInterface
{
    ...

    /**
     * @var Security
     */
    private $security;

    public function __construct(..., Security $security)
    {
        ...

        $this->security = $security;
    }

    public function onKernelRequest(GetResponseEvent $event): void
    {
        $request = $event->getRequest();
        if (!$event->isMasterRequest()) {
            return;
        }

        if (null !== ($user = $this->security->getUser())) {
            $request->setLocale($user->getLanguage());

            return;
        }

        ...
    }

    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::REQUEST => ['onKernelRequest', 4],
        ];
    }

我希望这会有所帮助;)