通过GET param在Symfony中设置区域设置
我创建了一个控制器,根据加密的GET参数手动设置安全令牌。我使用它来创建一个远程登录URL,当用户遵循此链接时,该URL将执行登录 现在我想添加区域设置。当提供Lang参数时,它应该设置语言环境。我将此添加到我的控制器:通过GET param在Symfony中设置区域设置,symfony,internationalization,Symfony,Internationalization,我创建了一个控制器,根据加密的GET参数手动设置安全令牌。我使用它来创建一个远程登录URL,当用户遵循此链接时,该URL将执行登录 现在我想添加区域设置。当提供Lang参数时,它应该设置语言环境。我将此添加到我的控制器: $lang = strtolower($lang); $this->getRequest()->getSession()->set('_locale', $lang); $this->getRequest()->setLocale($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}}会话:{{app.session.get(“'u locale')}}
。下面发布的LocaleListener正在工作,我通过插入die()
检查了这一点,并且设置翻译服务的区域设置似乎也在工作
因此,通过设置翻译程序的语言环境,我实现了这一点。我不明白为什么。翻译服务不应该使用请求区域设置吗?为什么我需要手动设置
请求对象中的区域设置是否用于翻译以外的内容
<?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)),
);
}
}
如果有人能告诉我这里发生了什么,我会很高兴:-)我也有同样的问题,我想知道这是否取决于听众的顺序:
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
而#10是我的,应该在#7 LocaleListener之后和#8 translator Listener之前,这就是为什么我必须在我的服务中召回translator。这就是我的工作 必须降低优先级,以便这是发生的最后一个evenet,并且必须始终从会话设置cookie 然后,在控制器中,我得到正确的语言。另外,我正在通过
SessionInterface
上的api调用设置语言
<?php
namespace App\EventSubscriber\Session;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LocaleSubscriber implements EventSubscriberInterface
{
/**
* @var string $defaultLocale
*/
private $defaultLocale;
/**
* LocaleSubscriber constructor.
* @param string $defaultLocale
*/
public function __construct($defaultLocale = 'en')
{
$this->defaultLocale = $defaultLocale;
}
/**
* @param RequestEvent $event
*/
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
// if no explicit locale has been set on this request, use one from the session
$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return array(
// must be registered before (i.e. with a higher priority than) the default Locale listener
KernelEvents::REQUEST => array(array('onKernelRequest', 0)),
);
}
}
这也帮我解决了!我还使用了LocaleListener方法,请求在侦听器中具有正确的区域设置,但不再在控制器中。感谢分享翻译解决方案。仍然无法告诉你为什么会发生这种情况:p
<?php
namespace App\EventSubscriber\Session;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LocaleSubscriber implements EventSubscriberInterface
{
/**
* @var string $defaultLocale
*/
private $defaultLocale;
/**
* LocaleSubscriber constructor.
* @param string $defaultLocale
*/
public function __construct($defaultLocale = 'en')
{
$this->defaultLocale = $defaultLocale;
}
/**
* @param RequestEvent $event
*/
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
// if no explicit locale has been set on this request, use one from the session
$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return array(
// must be registered before (i.e. with a higher priority than) the default Locale listener
KernelEvents::REQUEST => array(array('onKernelRequest', 0)),
);
}
}