基础树枝模板忽略 Symfony2 语言环境
Symfony2 locale ignored for base twig template
情况
我正在为监听 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 %}
路由的Controller会渲染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。
工作解决方案:完全按照记录here(Yoshi 提示)创建了 LocaleListener。
附录:我想使用存储在用户实体中的语言环境,所以我必须创建一个 InteractiveLoginListener
(class file)。从版本 1.3.6 开始,有一个(像 2.0-alpha,尽管没有记录)必须注入的名为 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' }
情况
我正在为监听 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 %}
路由的Controller会渲染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。
工作解决方案:完全按照记录here(Yoshi 提示)创建了 LocaleListener。
附录:我想使用存储在用户实体中的语言环境,所以我必须创建一个 InteractiveLoginListener
(class file)。从版本 1.3.6 开始,有一个(像 2.0-alpha,尽管没有记录)必须注入的名为 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' }