【发布时间】:2019-06-24 07:24:15
【问题描述】:
我的目的是根据 Accept-Language 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”。
【问题讨论】:
标签: symfony localization