Я пытаюсь использовать symfony липкая локаль для изменения веб-локали через URL-адрес. Для этого, как объясняется на странице, на которую я ссылался до того, как я создал подписчика событий, который реализует это в функции onKernelRequest.
Подписчик событий работает и выполняет блок de if ($loc) правильно, но транслятор, похоже, не обнаруживает его, поэтому это может быть проблема с приоритетом подписчика событий, но я попытался изменить его приоритет, но все еще получаю тот же локальный.
Подписчик событий
<?php
// src/EventSubscriber/LocaleSubscriber.php
namespace App\EventSubscriber;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LocaleSubscriber implements EventSubscriberInterface
{
private $defaultLocale;
public function __construct($defaultLocale = 'en')
{
$this->defaultLocale = $defaultLocale;
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
$loc = $request->attributes->get('_locale');
// try to see if the locale has been set as a _locale routing parameter
if ($loc) {
$request->getSession()->set('_locale', $loc);
$request->setLocale($loc);
} else {
// if no explicit locale has been set on this request, use one from the session
$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}
}
public static function getSubscribedEvents()
{
return [
// must be registered before (i.e. with a higher priority than) the default Locale listener
KernelEvents::REQUEST => [['onKernelRequest', 20]],
];
}
}
Контроллер
/**
* @Route("/{_locale}/pro/live")
*/
public function index(Request $request)
{
return $this->render('pro/live/index.html.twig');
}
Я ожидаю изменить языковой стандарт переводчика, на который написано в URL-адресе.
Если я изменю URL-адрес на /en/pro/live/
$request->getLocale()
в контроллере, он вернет правильную локаль, но локальный переводчик все еще будет в es
У меня нет локали по умолчанию в config/packages/framework.yaml. Да, похоже, он работает так же и без подписчика событий. Но проблема в том, что когда я меняю локаль в URL-адресе, переводчик не меняет свою локаль
в symfony.com/doc/current/translation/locale.html говорится, что локаль в запросе должна быть установлена перед прослушивателем локали, который по умолчанию имеет приоритет 16 (что ниже 20). так что это уже должно работать. возможно, вам захочется проверить, когда и каким образом установлена локаль в запросе и/или переводчике, путем ручного сброса трассировки стека в соответствующие объекты (Translator::setLocale
и Request::setLocale
) и дальнейшего изучения. Также: я надеюсь, что вы не работаете на проде и забыли обновить кеш...
Я решил проблему, предыдущий разработчик создал подписчик событий, который меняет локаль переводчика. Без него работает отлично
эй, я бы предположил, что ваша конфигурация не включает локаль
en
. проверьте config/packages/framework.yaml (вероятно, это место). попробуйте symfony.com/doc/current/translation.html#configuration и связанные страницы ("локаль и URL-адрес"). на самом деле это должно работать автоматически, и прослушиватель/подписчик не требуется. Действительно.