merged branch fabpot/locale-fix (PR #7099)
This PR was merged into the 2.1 branch.
Commits
-------
3e40c17
[HttpKernel] fixed locale management when exiting sub-requests
Discussion
----------
[HttpKernel] fixed locale management when exiting sub-requests
| Q | A
| ------------- | ---
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #7063
| License | MIT
| Doc PR | n/a
This fix is temporary as #7007 will fix it properly in Symfony 2.3.
---------------------------------------------------------------------------
by vicb at 2013-02-17T20:17:44Z
changelog ?
---------------------------------------------------------------------------
by fabpot at 2013-02-17T20:27:22Z
The changelogs are updated when we release a new version only.
---------------------------------------------------------------------------
by stof at 2013-02-17T20:41:00Z
@fabpot the intl locale should be reset to the right value too
---------------------------------------------------------------------------
by stof at 2013-02-17T20:42:31Z
hmm sorry, I missed the fact that you are changing the locale in the Request again, which will set the intl one
This commit is contained in:
commit
50c3de3e89
@ -12,7 +12,9 @@
|
|||||||
namespace Symfony\Component\HttpKernel\EventListener;
|
namespace Symfony\Component\HttpKernel\EventListener;
|
||||||
|
|
||||||
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
|
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
|
||||||
|
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
|
||||||
use Symfony\Component\HttpKernel\KernelEvents;
|
use Symfony\Component\HttpKernel\KernelEvents;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\Routing\RequestContextAwareInterface;
|
use Symfony\Component\Routing\RequestContextAwareInterface;
|
||||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
|
|
||||||
@ -25,6 +27,7 @@ class LocaleListener implements EventSubscriberInterface
|
|||||||
{
|
{
|
||||||
private $router;
|
private $router;
|
||||||
private $defaultLocale;
|
private $defaultLocale;
|
||||||
|
private $locales = array();
|
||||||
|
|
||||||
public function __construct($defaultLocale = 'en', RequestContextAwareInterface $router = null)
|
public function __construct($defaultLocale = 'en', RequestContextAwareInterface $router = null)
|
||||||
{
|
{
|
||||||
@ -32,19 +35,24 @@ class LocaleListener implements EventSubscriberInterface
|
|||||||
$this->router = $router;
|
$this->router = $router;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onKernelResponse(FilterResponseEvent $event)
|
||||||
|
{
|
||||||
|
array_shift($this->locales);
|
||||||
|
|
||||||
|
// setting back the locale to the previous value
|
||||||
|
$locale = isset($this->locales[0]) ? $this->locales[0] : $this->defaultLocale;
|
||||||
|
$request = $event->getRequest();
|
||||||
|
$this->setLocale($request, $locale);
|
||||||
|
}
|
||||||
|
|
||||||
public function onKernelRequest(GetResponseEvent $event)
|
public function onKernelRequest(GetResponseEvent $event)
|
||||||
{
|
{
|
||||||
$request = $event->getRequest();
|
$request = $event->getRequest();
|
||||||
|
|
||||||
$request->setDefaultLocale($this->defaultLocale);
|
$request->setDefaultLocale($this->defaultLocale);
|
||||||
|
$this->setLocale($request, $request->attributes->get('_locale', $this->defaultLocale));
|
||||||
|
|
||||||
if ($locale = $request->attributes->get('_locale')) {
|
array_unshift($this->locales, $request->getLocale());
|
||||||
$request->setLocale($locale);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (null !== $this->router) {
|
|
||||||
$this->router->getContext()->setParameter('_locale', $request->getLocale());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function getSubscribedEvents()
|
public static function getSubscribedEvents()
|
||||||
@ -52,6 +60,16 @@ class LocaleListener implements EventSubscriberInterface
|
|||||||
return array(
|
return array(
|
||||||
// must be registered after the Router to have access to the _locale
|
// must be registered after the Router to have access to the _locale
|
||||||
KernelEvents::REQUEST => array(array('onKernelRequest', 16)),
|
KernelEvents::REQUEST => array(array('onKernelRequest', 16)),
|
||||||
|
KernelEvents::RESPONSE => 'onKernelResponse',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function setLocale(Request $request, $locale)
|
||||||
|
{
|
||||||
|
$request->setLocale($locale);
|
||||||
|
|
||||||
|
if (null !== $this->router) {
|
||||||
|
$this->router->getContext()->setParameter('_locale', $request->getLocale());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user