我最近将基于symfony的平台国际化了。我为每个语言环境使用不同的主机,并使用请求侦听器确定请求语言环境(documentation here)。我还希望翻译路径,因此我实现了本地化路线功能(documentation here)。 我希望在我的请求侦听器中设置的语言环境优先于本地化路由设置的语言环境,但是不幸的是,并非如此。
我尝试更改内核请求侦听器的优先级,但没有成功。根据文档,它在LocaleListener和Translator Listener之前,以及其他所有内容之后。
这是我的内核请求侦听器的优先级列表:
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 Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest() 32
#5 Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber::onKernelRequest() 24
#6 App\EventListener\RequestListener::onKernelRequest() 18
#7 Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest() 16
#8 Symfony\Component\HttpKernel\EventListener\TranslatorListener::onKernelRequest() 10
我的请求侦听器:
// App\EventListener\RequestListener
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$request_host = $request->getHost();
foreach ($this->domains as $locale_domain) {
list($locale, $domain) = explode(':', $locale_domain);
if ($domain === $request_host) {
$request->setLocale($locale);
}
}
$request->setDefaultLocale($this->default_locale);
}
我的一条本地路线示例:
search:
path:
en: /search/
fr: /rechercher/
controller: App\Controller\SearchController::searchStart
methods: [GET]
以及预期结果与实际结果的主机+路径组合列表:
www.english-domain /
www.french-domain / french-path
www.english-domain / french-path