1

我按照这个http://symfony.com/it/doc/current/cookbook/controller/error_pages.html

但是当我在 404 页面时,我的语言环境更改为我的默认语言环境

我的语言环境默认是“it”,但是当我在 en(mysite/en/foo 没有 foo 的地方)时,我的语言环境切换到“it”

我也试试这个监听器http://symfony.com/it/doc/current/cookbook/session/locale_sticky_session.html

什么时候

if ($locale = $request->attributes->get('_locale')) {

我的 $locale 为 null 并且切换到默认语言环境

4

1 回答 1

0

我找到了一个解决方案,不是最好的解决方案,但有效

在我的主页上

主页控制器

公共函数 indexAction()
{
    $request = $this->get('request');
    /**
     * 将其存储到会话中的用户语言
     */
    $sessionId = $this->get("session");
    if($sessionId->get("lingua")==""){
        $this->get('session')->set('lingua', $request->getLocale());
    }

    返回数组();

}

在已被覆盖的 FOSUserBundle 的另一个包中

UserBundle/Controller/RegistrationController.php(例如)

公共函数 customAction() {

    /**
     * 将其存储到会话中的用户语言
     */
    $sessionId = $this->container->get("session");
    if($sessionId->get("lingua")==""){
        $this->container->get("session")->set('lingua', $this->container->get('request')->getLocale());
    }

    返回数组(

    );
}

然后我创建一个服务,如:http ://symfony.com/doc/current/cookbook/session/locale_sticky_session.html

服务.xml

服务:
    acme_locale.locale_listener:
        类:Acme\LocaleBundle\EventListener\LocaleListener
        参数:["%kernel.default_locale%",@session]
        标签:
            - {名称:kernel.event_subscriber}

语言环境监听器


命名空间 Acme\LocaleBundle\EventListener;

使用 Symfony\Component\HttpKernel\Event\GetResponseEvent;
使用 Symfony\Component\HttpKernel\KernelEvents;
使用 Symfony\Component\EventDispatcher\EventSubscriberInterface;
使用 Symfony\Component\HttpFoundation\Session;


SnLocaleListener 类实现 EventSubscriberInterface
{
    私人 $defaultLocale;
    私人$会话;


    公共函数 __construct($defaultLocale = 'it', $session)
    {
        $this->defaultLocale = $defaultLocale;
        $this->session = $session;
    }

    公共函数 onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        if (!$request->hasPreviousSession()) {
            返回;
        }

        //incapsula la lingua in sessione se siste
        $locale_session = $this->session->get('lingua');

        if ($locale_session == "") {

            // prova a vedere se il locale sia stato imppostato come parametro _locale di una rotta
            if ($locale = $request->attributes->get('_locale')) {
                $request->getSession()->set('_locale', $locale);
            } 别的 {
                // se non trova un locale esplito in questa Richiesta, 美国 quello della sessione
                $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
            }

        } 别的 {
            $request->setLocale($request->getSession()->get('_locale', $locale_session));
            $request->getSession()->set('_locale', $locale_session);
            $request->attributes->set('_locale', $locale_session);
        }


    }

    公共静态函数 getSubscribedEvents()
    {
        返回数组(
            // deve essere registrato prima dell'ascoltatore predefinito di locale
            KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
        );
    }
}

对不起我的英语不完美..这个解决方案对我有用,它不会是最好的

于 2013-10-04T15:27:54.030 回答