Локаль, установленная с пользовательским слушателем, переопределяется - PullRequest
0 голосов
/ 23 июня 2019

Я намерен установить языковой стандарт на основе заголовка 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».

1 Ответ

0 голосов
/ 24 июня 2019

Это маршрутизатор.

Маршрутизатор настроен на использование префиксов на всех маршрутах, которые определяют локаль, например / pt или / en.Мне просто нужно было их отключить, тогда приложение успешно определит локаль на основе локали моего браузера.

Теперь мне просто нужно выяснить, как сохранить префиксы локали доступными для использования, при этом в основном используя Accept-Информация о языке.Затем префиксы будут действовать как переопределения для этой автоматически определенной локали.Так работают многие популярные веб-сайты, хотя не рекомендуется размещать различное содержимое по одному URL-адресу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...