使用自定义侦听器设置的语言环境将被覆盖

时间:2019-06-23 15:44:40

标签: symfony localization

我的目的是根据“接受语言” HTTP请求标头设置区域设置。

我已经创建了自定义LocaleListener类,并在config / services.yaml中对其进行了配置,其优先级高于LocaleListener,如此处指示:https://symfony.com/doc/current/translation/locale.html

onKernelRequest()方法中包含的逻辑成功检索了语言环境,该语言环境已传递给setLocale()方法。

在同一文件中回显当前语言环境将返回预期的语言环境(由用户的浏览器定义的语言环境)。但是,在此行下,此语言环境被覆盖,更改为应用程序默认语言。

这就是问题所在。我需要确定什么是覆盖区域设置以及可能的解决方案。 Symfony文档没有深入。我打算用我发现的东西为文档做贡献。

这是在GNU / Linux上运行的Symfony 4应用程序。

我已经收集了php bin/console debug:event kernel.request的输出:

Registered Listeners for "kernel.request" Event
===============================================

 ------- ------------------------------------------------------------------------------------------------- ---------- 
  Order   Callable                                                                                          Priority  
 ------- ------------------------------------------------------------------------------------------------- ---------- 
  #1      Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure()                     2048      
  #2      Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest()             256       
  #3      Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelRequest()                     128       
  #4      App\EventListener\LocaleListener::onKernelRequest()                                               110       
  #5      Symfony\Component\HttpKernel\EventListener\LocaleListener::setDefaultLocale()                     100       
  #6      Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest()                      32        
  #7      Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber::onKernelRequest()   24        
  #8      Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest()                      16        
  #9      Symfony\Component\HttpKernel\EventListener\LocaleAwareListener::onKernelRequest()                 15        
  #10     Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::configureLogoutUrlGenerator()      8         
  #11     Symfony\Bundle\SecurityBundle\Debug\TraceableFirewallListener::onKernelRequest()                  8         
 ------- ------------------------------------------------------------------------------------------------- ----------

如您所见,在所有其他与语言环境相关的侦听器之上,都有我的自定义侦听器。

我试图设置其优先级,以便在setDefaultLocale()之后执行它,但是最后,语言环境仍然是默认的'en'。

这是来自src / EventListener /的自定义侦听器代码:

<?php

namespace App\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class LocaleListener
{
    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        // LOGIC TO RETRIEVE LOCALE

        $request->setLocale($locale);
    }
}

观察01:$ locale变量在回显时返回预期的字符串。

观察02:在上述方法中回显$ request-> getLocale()会返回预期的字符串,这意味着此处的语言环境已成功更改。

以下是config / services.yaml底部的侦听器配置

    App\EventListener\LocaleListener:
        tags:
            - { name: kernel.event_listener, event: kernel.request, priority: 110 }

预计语言环境将根据浏览器上定义的语言进行更改-第一个是“ pt”葡萄牙语;但是,语言环境继续设置为默认值'en'。

1 个答案:

答案 0 :(得分:0)

这是路由器。

路由器被配置为在所有路由上使用前缀,这确定了语言环境,例如/ pt或/ en。我只需要禁用它们,然后应用程序将根据我的浏览器语言环境成功确定语言环境。

现在,我只需要弄清楚如何保持可用的语言环境前缀,同时仍然主要使用“接受语言”信息。然后,前缀将充当此自动定义的语言环境的替代。即使不是通过单个URL提供不同内容的最佳做法,这也是许多受欢迎的网站的工作方式。