0

我一直试图让 Symfony 使用用户的区域设置来请求,而不使用 URL 路径中的区域设置。

我已经遵循了许多 SO 答案,而这篇食谱文章让我走得很远。

我在登录事件中获取用户的语言偏好并将其设置到会话中。然后对于每个请求,我都有这个事件监听器:

<?php
namespace My\UserBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class LocaleListener implements EventSubscriberInterface
{
    private $defaultLocale;

    public function __construct($defaultLocale = 'fi')
    {
        $this->defaultLocale = $defaultLocale;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        if (!$request->hasPreviousSession()) {
            return;
        }

        // try to see if the locale has been set as a _locale routing parameter
        #if ($locale = $request->attributes->get('_locale')) {
        #    $request->getSession()->set('_locale', $locale);
        #} else {
            // if no explicit locale has been set on this request, use one from the session
            $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
        #}
        echo $request->getLocale();
    }

    public static function getSubscribedEvents()
    {
        return array(
            // must be registered before the default Locale listener
            KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
        );
    }
}

当我在列表器中回显语言环境时,我得到“sv”,这根据用户的偏好是正确的。但是当我echo $this->getRequest()->getLocale();在控制器中时,它又是“fi”,这是我在配置和其他地方的首选语言。会话密钥_locale在控制器中是“sv”。

我将如何让控​​制器和树枝中的请求正确地基于会话?

4

1 回答 1

0

这里的解决方案有效:Set Locale in Symfony by GET param

所以服务也需要注入翻译服务,然后->setLocale应该调用翻译服务来设置语言环境。

于 2013-09-16T10:45:05.503 回答