Symfony区域设置在布局中不可用

时间:2017-10-30 15:35:41

标签: symfony twig locale

我正在尝试在Symfony中设置 locale ,除了我尝试在布局文件中翻译或生成路径的地方外,一切正常。 我创建了一个监听器,因此我可以在每个请求上设置区域设置。

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

class LocaleListener implements EventSubscriberInterface {

private $container;
private $defaultLocale;

public function __construct(ContainerInterface $container, $defaultLocale = 'en') {
    $this->container = $container;
    $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

    $loc = $this->defaultLocale;
    if ($locale = $request->attributes->get('_locale')) {
        //$request->getSession()->set('lang', $locale);
        $event->getRequest()->getSession()->set('_locale', $locale);
        $event->getRequest()->setLocale($locale);
        $loc = $locale;
    } else {
        // if no explicit locale has been set on this request, use one from the session
        $request->setLocale($this->defaultLocale);
        $event->getRequest()->getSession()->set('_locale', $this->defaultLocale);
        $loc = $this->defaultLocale;
    }

    $this->container->get('translator')->setLoc($loc);
}

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

}

如果在twig模板中,我尝试使用 app.session.get('_ locale')来访问会话变量,该变量存储它应该是的语言环境 - 我得到了所需的结果。但是当我尝试 app.request.locale 时,我得到的默认语言环境不是网址中的默认语言环境。因此,我的所有路由都以默认语言环境为前缀,所有内容都使用默认语言进行翻译。如何从布局中的url获取区域设置并使用它生成路径和翻译?

1 个答案:

答案 0 :(得分:0)

您可能只应该使用一种方法来处理区域设置翻译。

我实施了这项行动

/**
     * @Route("/{_locale}")
     */

$request->setLocale('en');
$request->getSession()->set('_locale','fr');
$localesArray = [
            'request' => $request->getLocale(),
            'request_default' => $request->getDefaultLocale(),
            'config_default' => $this->getParameter('kernel.default_locale'),
            'session_locale' => $request->getSession()->get('_locale'),
            'request_attributes' => $request->attributes->get('_locale')
        ];



        var_dump($localesArray);
        die();

答案就是这个

array(5) { 
["request"]=> string(2) "en" 
["request_default"]=> string(2) "nl" 
["config_default"]=> string(2) "nl" 
["session_locale"]=> string(2) "fr" 
["request_attributes"]=> string(2) "es" 
} 

正如您所看到的,当我通过setLocale更改语言环境时,不会影响其他结果。我得到了结果accessi这个网址" / es"我测试的默认语言环境是" nl"。比较结果

我的建议:仅使用请求区域设置来描述此doc

相关问题