【问题标题】:symfony 2.8 locale reseting every requestsymfony 2.8 语言环境重置每个请求
【发布时间】:2016-12-09 15:55:52
【问题描述】:

例子:

我正在尝试将语言环境设置为英语:

public function innerPageAction(Request $request, $slug)
{        
    $request->setLocale('en');
    return $this->render('@App/Front/Default/inner.html.twig', [
        ...
    ]);
}

然后我回到主页

public function indexAction(Request $request)
{
    $locale = $request->getLocale();
    return $this->render('@App/Front/Default/home.html.twig', [
        'locale' => $locale,
    ]);
}

这将返回我的默认语言环境 ('lt')。

我的配置文件如下所示:

parameters:
    locale: lt
framework:
    default_locale:  "%locale%"

我正在尝试使语言环境具有粘性,如下所述:http://symfony.com/doc/current/session/locale_sticky_session.html 但似乎它的设置区域设置始终为 defaultLocale。为什么?

当我从内页移动到主页时,我如何实现这一点,它会返回“en”而不是默认语言环境“lt”?

【问题讨论】:

    标签: php symfony locale symfony-2.8


    【解决方案1】:
    $request->setLocale('en');
    

    只是暂时的,意味着它不会被持久化,所以当你访问另一个页面时,请求区域设置会从配置文件中获取默认值,如果你遵循这个link(你提供的相同链接)

    class LocaleListener implements EventSubscriberInterface 
    {
        private $defaultLocale;
    
        public function __construct($defaultLocale = 'en')
        {
            $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));
            }
        }
    
        public static function getSubscribedEvents()
        {
            return array(
                // must be registered after the default Locale listener
                KernelEvents::REQUEST => array(array('onKernelRequest', 15)),
            );
        }
    }
    

    onKernelRequest 方法在每个请求上执行,如果在会话中设置了区域设置,则使用 $request->setLocale($locale) 应用它,这样您将在每个页面上都有一个“粘性”区域设置。

    【讨论】:

    • 我明白这一点,但正如我所说,它不起作用。我从来没有得到这个: $request->getSession()->set('_locale', $locale);和 $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));始终将语言环境设置为“lt”。我不明白为什么。
    • Symfony 4.3 在这里,我遇到了同样的问题。 $request->getLocale()$request->getSession()->get('_locale') 总是返回默认语言环境,从不返回 url 中设置的语言环境
    【解决方案2】:

    在您的事件侦听器(或订阅者)的 onKernelRequest 中需要额外的一行:

        // 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);
            $request->setLocale($locale); // seems that it's SIGNIFICANT
        } else {
            // if no explicit locale has been set on this request, use one from the session
            $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      相关资源
      最近更新 更多