当前位置: 首页 > 知识库问答 >
问题:

在Symfony中通过GET参数设置区域设置

杜俊楚
2023-03-14

我创建了一个控制器,根据加密的GET参数手动设置安全令牌。我使用它来创建一个远程登录URL,当用户遵循此链接时,该URL将执行登录。

现在我想添加区域设置。当提供了朗参数时,它应该设置区域设置。我添加了这个到我的控制器:

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

正在根据开发栏将_locale变量设置到设置中。但是,未加载语言文件,它将返回默认语言。

我读过关于创建监听器来实现这一点的文章,但是在我看来,当你想在网址中提供语言时,这是有用的。我不想将此添加到我的路由中,我只想在创建会话时设置区域设置。

更新:

我选择了Symfony提供的“模拟旧beheaviour”解决方案。设置请求区域设置似乎不起作用。当我在我的Twig模板中重复这一点时,值不相等:req lang:{{app.request.locale}}会话:{{app.session.get('_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)),
        );
    }
}

在我的services.yml我有:

mb.locale.listener:
    class: Mb\MyBundle\Listener\LocaleListener
    arguments: [@translator]
    tags:An
      - { name: kernel.event_subscriber }

如果有人能告诉我这里发生了什么,我会非常高兴:——)

共有2个答案

丌官运诚
2023-03-14

这就是我的工作。

必须降低优先级,以便这是发生的最后一个evenet,并且必须始终从会话设置cookie。

然后,在控制器中我得到正确的语言。此外,我正在设置语言通过api调用上的SessionInterface

<?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)),
        );
    }
}
广楚
2023-03-14

我也有同样的问题,我想知道这是否取决于听众的顺序:

php bin/控制台调试:事件调度器显示

"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之前,所以这就是为什么我必须召回我服务中的翻译。

 类似资料:
  • 我安装了三个区域设置捆绑包: JMSi18nRoutingBundle 我的如下所示: 一切都按我的喜好工作,除了我在日志中发现了一个错误: 在堆栈中我发现:的区域设置,但是,我不明白如何将区域设置设置为“en_US”。 我想它来自于对Lunetics的猜测,但是有“en_US”的人应该匹配“en”,而不是“en_US”。 我的主要问题是,我不知道如何跟踪这一点。当我用自己的设置连接到主页时,首先

  • 我刚开始使用symfony,我正在尝试建立一个multilang网站,但是我在更改区域设置时遇到了一个问题 我读了一些帖子,也读了相关文档,但语言环境没有改变,我尝试: 但是$locale中的值总是'en'(我的默认语言环境) 我也试试 在本例中,$locale是fr,但翻译总是来自消息。ENyml 我想第一次使用$\u SERVER['HTTP\u ACCEPT\u LANGUAGE']检测用户

  • 我想强制我的Symfony 2.5应用程序的区域设置为。我希望这个区域设置用于strftime()函数。 我的: 我正在我的一个控制器中使用以下代码来调试: 当这样执行时,它显示:。 但是,当第一行未注释时,它会显示:,因此区域设置已安装在系统中并正常工作。 我如何使Symfony始终使用配置中指定的语言环境? $locale-a:

  • 我试图在Symfony中设置一个区域设置,除了我试图在布局文件中翻译或生成路线的地方,一切都很好。我创建了一个侦听器,这样我就可以在每个请求上设置区域设置。 } 如果在树枝模板中,我试图使用app.session.get('_locale')访问会话变量,该变量存储了它应该是的语言环境-我得到了所需的结果。但是当我尝试app.request.locale我得到默认的语言环境,而不是在网址。正因为如

  • 我正在尝试在Symfony 2.7项目中使用locale。我想将区域设置设置为

  • 我在我的注解里有。yaml使用注释管线设置的以下设置: 我这里的问题是,我可以创建一个像是否不带区域设置前缀? 这是保护区,我可以使用用户语言。我尝试使用这个symfony路由文档,但我希望保留注释。 目前它看起来像,但我希望。