错误页面symfony 2中的错过语言环境

时间:2013-10-04 09:34:33

标签: symfony internationalization

我遵循此http://symfony.com/it/doc/current/cookbook/controller/error_pages.html

但是当我在404页面时,我的语言环境在我的默认语言环境中发生了变化

我的语言环境是“它”但是当我在en(mysite / en / foo,其中foo不存在)时,我的语言环境切换到“它”

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

以及何时

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

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

1 个答案:

答案 0 :(得分:0)

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

在我的主页

HomepageController

public function indexAction()
{
    $request = $this->get('request');
    /**
     * Store it into session the user language
     */
    $sessionId  = $this->get("session");
    if($sessionId->get("lingua")==""){
        $this->get('session')->set('lingua', $request->getLocale());
    }

    return array();

}

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

UserBundle / Controller / RegistrationController.php(例如)


public function customAction() {

    /**
     * Store it into session the user language
     */
    $sessionId  = $this->container->get("session");
    if($sessionId->get("lingua")==""){
        $this->container->get("session")->set('lingua',  $this->container->get('request')->getLocale());
    }

    return array(

    );
}

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

的services.xml

services:
    acme_locale.locale_listener:
        class: Acme\LocaleBundle\EventListener\LocaleListener
        arguments: ["%kernel.default_locale%",@session]
        tags:
            - { name: kernel.event_subscriber }

LocaleListener



namespace Acme\LocaleBundle\EventListener;

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


class SnLocaleListener implements EventSubscriberInterface
{
    private $defaultLocale;
    private $session;


    public function __construct($defaultLocale = 'it', $session)
    {
        $this->defaultLocale = $defaultLocale;
        $this->session = $session;
    }

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

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

        if ($locale_session == "") {

            // prova a vedere se il locale sia stato impostato come parametro _locale di una rotta
            if ($locale = $request->attributes->get('_locale')) {
                $request->getSession()->set('_locale', $locale);
            } else {
                // se non trova un locale esplicito in questa richiesta, usa quello della sessione
                $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
            }

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


    }

    public static function getSubscribedEvents()
    {
        return array(
            // deve essere registrato prima dell'ascoltatore predefinito di locale
            KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
        );
    }
}
抱歉,我的英语不完美.. 对我来说这个解决方案有效,它不会是最好的

相关问题