gpt4 book ai didi

symfony - 通过 GET 参数在 Symfony 中设置语言环境

转载 作者:行者123 更新时间:2023-12-03 17:52:33 25 4
gpt4 key购买 nike

我创建了一个 Controller ,根据加密的 GET 参数手动设置安全 token 。我使用它来创建一个远程登录 URL,当用户点击此链接时,它将执行登录。

现在我想添加语言环境的设置。当提供 Lang 参数时,它应该设置语言环境。我将此添加到我的 Controller 中:

$lang = strtolower($lang);
$this->getRequest()->getSession()->set('_locale', $lang);
$this->getRequest()->setLocale($lang);
$this->container->get('translator')->setLocale($lang);

_locale 变量正在根据开发栏设置到设置中。虽然没有加载语言文件,但它会回退到默认语言。

我阅读了有关创建监听器来实现此目的的信息,但在我看来,当您想在 URL 中提供语言时,这很有用。我不想将它添加到我的路由中,我只想在创建 session 时设置语言环境。

更新:

我去了' simulate old beheaviour ' 解决方案,由 Symfony 提供。不过,设置请求语言环境似乎不起作用。当我在我的 Twig 模板中回应时,这些值不相等: req lang: {{ app.request.locale }} session: {{ app.session.get('_locale') }} .不过,下面发布的 LocaleListener 正在工作,我通过插入 die() 进行了检查。 ,并且还设置翻译服务的语言环境似乎有效。

所以通过设置翻译器的语言环境,我得到了这个工作。我不明白为什么。翻译服务不应该使用请求语言环境吗?为什么我需要手动设置?

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 }

如果有人能解释我这里发生了什么,我会很高兴:-)

最佳答案

我有同样的问题,我想知道这是否取决于听众的顺序:
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 TranslatorListener 之前,这就是为什么我必须在我的服务中召回翻译器。

关于symfony - 通过 GET 参数在 Symfony 中设置语言环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17274284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com