rol*_*dow 5 internationalization symfony
我创建了一个控制器,该控制器根据加密的GET参数手动设置安全令牌。我用它来创建一个远程登录URL,当用户点击此链接时,它将执行登录。
现在,我想添加语言环境的设置。提供Lang参数时,应设置区域设置。我将此添加到我的控制器:
$lang = strtolower($lang);
$this->getRequest()->getSession()->set('_locale', $lang);
$this->getRequest()->setLocale($lang);
$this->container->get('translator')->setLocale($lang);
Run Code Online (Sandbox Code Playgroud)
根据开发栏,将_locale变量设置为该设置。语言文件虽然未加载,但已恢复为默认语言。
我读过有关创建一个侦听器以实现此目的的信息,但在我看来,当您想在URL中提供语言时,这很有用。我不想将其添加到我的路由中,我只想在创建会话时设置语言环境。
更新:
我去了Symfony提供的“ 模拟旧行为 ”解决方案。设置请求语言环境似乎不起作用。当我在Twig模板中回显此值时,值不相等:req lang: {{ app.request.locale }} session: {{ app.session.get('_locale') }}。虽然如下所示,但LocaleListener仍在工作,我通过插入进行了检查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)),
);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的services.yml中,我有:
mb.locale.listener:
class: Mb\MyBundle\Listener\LocaleListener
arguments: [@translator]
tags:An
- { name: kernel.event_subscriber }
Run Code Online (Sandbox Code Playgroud)
如果有人可以解释我在这里发生的事情,我会很高兴的:-)
我遇到了同样的问题,我想知道这是否取决于听众的顺序:
php bin/console debug:event-dispatcher节目
"kernel.request" event
----------------------
Order Callable Priority
------------------------------------------------ ----------
#1 Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure() 2048
#2 Symfony\Component\HttpKernel\EventListener\DumpListener::configure() 1024
#3 Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest() 256
#4 Symfony\Bundle\FrameworkBundle\EventListener\SessionListener::onKernelRequest() 128
#5 Symfony\Component\HttpKernel\EventListener\FragmentListener::onKernelRequest() 48
#6 Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest() 32
#7 Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest() 16
#8 Symfony\Component\HttpKernel\EventListener\TranslatorListener::onKernelRequest() 10
#9 Symfony\Component\Security\Http\Firewall::onKernelRequest() 8
#10 AppBundle\Service\LocaleListener::onKernelRequest() 0
#11 Symfony\Bundle\AsseticBundle\EventListener\RequestListener::onKernelRequest() 0
Run Code Online (Sandbox Code Playgroud)
#10 是我的,应该在 #7 LocaleListener 之后和 #8 TranslatorListener 之前,所以这就是为什么我必须召回我的服务中的翻译器。
| 归档时间: |
|
| 查看次数: |
2322 次 |
| 最近记录: |