我的目的是根据“接受语言” 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'。
答案 0 :(得分:0)
这是路由器。
路由器被配置为在所有路由上使用前缀,这确定了语言环境,例如/ pt或/ en。我只需要禁用它们,然后应用程序将根据我的浏览器语言环境成功确定语言环境。
现在,我只需要弄清楚如何保持可用的语言环境前缀,同时仍然主要使用“接受语言”信息。然后,前缀将充当此自动定义的语言环境的替代。即使不是通过单个URL提供不同内容的最佳做法,这也是许多受欢迎的网站的工作方式。