Я устанавливаю язык на слушателя, слушающего kernel.request
как это:
<?php
// ...
class LocaleListener
{
//...
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$event->isMasterRequest()) {
return;
}
// [...] some logic to get $locale
$request->setLocale($locale);
}
}
?>
Затем у меня есть два шаблона веток: базовый и базовый расширяющий шаблон. Базовый шаблон (base.html.twig
):
<html>
<body>
{{ 'some.translation'|trans({}, 'messages') }}
{% block body %}{% endblock %}
</body>
</html>
И база-расширение-шаблон (profile.html.twig
):
{% extends '::base.html.twig' %}
{% block body %}
{{ 'some.translation'|trans({}, 'messages') }}
{% endblock %}
Контроллер маршрута отобразит profile.html.twig:
<?php
// ...
class SomeController extends Controller
{
//...
public function someAction()
{
return $this->render('::profile.html.twig');
}
}
?>
Ничего особенного, все очень просто …
Визуализированный шаблон, расширяющий базу (profile.html.twig
) использует языковой стандарт для перевода, установленного в слушателе. К сожалению базовый шаблон (base.html.twig
) НЕ ЯВЛЯЕТСЯ. Даже когда я сваливаю {{ dump(app.request.locale) }}
на базовом шаблоне он показывает правильный языковой стандарт, установленный в слушателе …
Что мне не хватает?
О, и я использую Symfony v2.7.11.
Рабочий раствор: Создал LocaleListener точно так же, как описано Вот (подсказка Йоши).
добавление: Я хотел, чтобы использовалась локаль, хранящаяся в сущности пользователя, поэтому мне пришлось создать InteractiveLoginListener
(файл класса). Начиная с версии 1.3.6, есть (например, 2.0-альфа, хотя и не документировано) событие, называемое security.interactive_login
который должен был быть введен:
app.interactive_login_listener:
class: AppBundle\EventListener\Security\InteractiveLoginListener
arguments: ['@fos_user.user_manager', '@session']
tags:
- { name: 'kernel.event_listener', event: 'security.interactive_login', method: 'onSecurityInteractiveLogin' }
Других решений пока нет …