Я намерен установить языковой стандарт на основе заголовка HTTP-запроса Accept-Language.
Я создал собственный класс LocaleListener и настроил его в config / services.yaml с приоритетом выше, чем у LocaleListener,как указано здесь: https://symfony.com/doc/current/translation/locale.html
Логика, содержащаяся в методе onKernelRequest()
, успешно получает локаль, которую я передаю методу setLocale()
.
Повторяет текущую локаль в этомтот же файл возвращает ожидаемую локаль (определенную браузером пользователя).Однако, по сути, эта локаль переопределяется и заменяется на приложение по умолчанию.
Вот в чем проблема.Мне нужно определить, что переопределяет локаль и каковы возможные решения.Документация Symfony не шла в такую глубину.Я собираюсь внести свой вклад в документацию с помощью того, что я найду.
Это приложение Symfony 4, работающее в GNU / Linux.
Я собрал вывод 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».