我遵循此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,并切换到默认语言环境
答案 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)), ); } }抱歉,我的英语不完美.. 对我来说这个解决方案有效,它不会是最好的