我创建了一个控制器,根据加密的 GET 参数手动设置安全令牌。我使用它来创建一个远程登录 URL,当用户点击此链接时将执行登录。
现在我想添加语言环境的设置。当提供 Lang 参数时,它应该设置语言环境。我将此添加到我的控制器中:
$lang = strtolower($lang);
$this->getRequest()->getSession()->set('_locale', $lang);
$this->getRequest()->setLocale($lang);
$this->container->get('translator')->setLocale($lang);
_locale 变量正在根据开发栏设置到设置中。但是语言文件没有加载,它回退到默认语言。
我阅读了有关创建侦听器来实现此目的的信息,但在我看来,当您想在 URL 中提供语言时,这很有用。我不想将它添加到我的路由中,我只想在创建会话时设置语言环境。
更新:
我选择了 Symfony 提供的“模拟旧行为”解决方案。设置请求区域设置似乎不起作用。当我在我的 Twig 模板中回显这个时,值不相等:req lang: {{ app.request.locale }} session: {{ app.session.get('_locale') }}
. 下面发布的 LocaleListener 正在工作,我通过插入 a 来检查这一点die()
,并且设置 Translator 服务的区域设置似乎正在工作。
所以通过设置翻译的语言环境,我得到了这个工作。我不明白为什么。翻译服务不应该使用请求语言环境吗?为什么我需要手动设置?
Request 对象中的语言环境是否用于翻译以外的其他内容?
<?php
namespace Mb\MyBundle\Listener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LocaleListener implements EventSubscriberInterface
{
private $translator;
public function __construct($translator) {
$this->translator = $translator;
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
if (strlen( $request->getSession()->get('_locale') )) {
$request->setLocale($request->getSession()->get('_locale'));
$this->translator->setLocale($request->getSession()->get('_locale'));
}
}
static public function getSubscribedEvents()
{
return array(
// must be registered before the default Locale listener
KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
);
}
}
在我的 services.yml 中,我有:
mb.locale.listener:
class: Mb\MyBundle\Listener\LocaleListener
arguments: [@translator]
tags:An
- { name: kernel.event_subscriber }
如果有人可以向我解释这里发生了什么,我会很高兴:-)