Php symfony2:如何进行参数本地化,使我们可以有两种语言?

Php symfony2:如何进行参数本地化,使我们可以有两种语言?,php,symfony,internationalization,twig,locale,Php,Symfony,Internationalization,Twig,Locale,在我的symfony2应用程序中,我设置了JMSI18nRoutingBundle: 我有以下配置: jms_i18n_routing: default_locale: fr locales: [fr, en] strategy: prefix_except_default 我已设置控制器操作以更改区域设置: /** * @Route("/public/change_locale/{locale}", name="change_locale", requiremen

在我的symfony2应用程序中,我设置了JMSI18nRoutingBundle:

我有以下配置:

jms_i18n_routing:
    default_locale: fr
    locales: [fr, en]
    strategy: prefix_except_default
我已设置控制器操作以更改区域设置:

/**
 * @Route("/public/change_locale/{locale}", name="change_locale", requirements={"locale" = "fr|en"})
 * @Template(":Core/Admin:test.html.twig")
 * @param Request $request
 * @param string $locale
 * @return array
 */
public function changeLocaleAction(Request $request, $locale)
{
    $request->setLocale($locale);
    $this->get('session')->set('_locale', $locale);

    return $this->redirectToRoute('home');
}
我发现该区域设置没有在会话中持久化。出于一个我不理解的原因,在细枝中生成路由时,不会自动使用区域设置。 因此,我来构建一个侦听器,以将区域设置重新分配给请求和会话,但仍然无法正常工作,我不能简单地将区域设置从“fr”更改为“en”,并将布局点的所有路由更改为包含“en”区域设置参数的路由

在实现这个捆绑包的过程中,我遗漏了什么

我的听众:

<?php

namespace AppBundle\EventListener;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class LocaleListener
{
    private $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    public function setLocale(GetResponseEvent $event)
    {
        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
            return;
        }

        $request = $event->getRequest();
        if (!$request->hasPreviousSession()) {
            $request->setLocale($request->getPreferredLanguage($this->container->getParameter('jms_i18n_routing.locales')));
            return;
        }

        // on essaie de voir si la locale a été fixée dans le paramètre de routing _locale
        if ($locale = $request->attributes->get('_locale')) {
            $request->getSession()->set('_locale', $locale);
            $request->setLocale($locale);
        } else {
            // si aucune locale n'a été fixée explicitement dans la requête, on utilise celle de la session
            $request->setLocale($request->getSession()->get('_locale', $this->container->getParameter('jms_i18n_routing.default_locale')));
        }


}
}

我上次编辑的路径是正确的:请求上下文参数\u locale也必须定义:

我的听众变成:

<?php

namespace AppBundle\EventListener;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Routing\RequestContext;

class LocaleListener
{
    /**
     * @var RequestContext
     */
    private $context;
    private $locales;
    private $defautLocales;

    public function __construct(RequestContext $context, $locales, $defautLocales)
    {
        $this->context = $context;
        $this->locales = $locales;
        $this->defautLocales = $defautLocales;
    }

    public function setLocale(GetResponseEvent $event)
    {  
        $request = $event->getRequest();

        if (!$request->hasPreviousSession()) {
            $request->setLocale($request->getPreferredLanguage($this->locales));
            return;
        }

        // on essaie de voir si la locale a été fixée dans le paramètre de routing _locale
        if ($locale = $request->attributes->get('_locale')) {
            $request->getSession()->set('_locale', $locale);
        } else {
            // si aucune locale n'a été fixée explicitement dans la requête, on utilise celle de la session
            $locale = $request->getSession()->get('_locale', $this->defautLocales);
        }

        $request->setLocale($locale);
        $this->context->setParameter('_locale', $locale);

    }
}

我上次编辑的路径是正确的:请求上下文参数\u locale也必须定义:

我的听众变成:

<?php

namespace AppBundle\EventListener;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Routing\RequestContext;

class LocaleListener
{
    /**
     * @var RequestContext
     */
    private $context;
    private $locales;
    private $defautLocales;

    public function __construct(RequestContext $context, $locales, $defautLocales)
    {
        $this->context = $context;
        $this->locales = $locales;
        $this->defautLocales = $defautLocales;
    }

    public function setLocale(GetResponseEvent $event)
    {  
        $request = $event->getRequest();

        if (!$request->hasPreviousSession()) {
            $request->setLocale($request->getPreferredLanguage($this->locales));
            return;
        }

        // on essaie de voir si la locale a été fixée dans le paramètre de routing _locale
        if ($locale = $request->attributes->get('_locale')) {
            $request->getSession()->set('_locale', $locale);
        } else {
            // si aucune locale n'a été fixée explicitement dans la requête, on utilise celle de la session
            $locale = $request->getSession()->get('_locale', $this->defautLocales);
        }

        $request->setLocale($locale);
        $this->context->setParameter('_locale', $locale);

    }
}