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:
Fabien Potencier 2013-02-19 08:53:45 +01:00
commit 50c3de3e89

View File

@ -12,7 +12,9 @@
namespace Symfony\Component\HttpKernel\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RequestContextAwareInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
@ -25,6 +27,7 @@ class LocaleListener implements EventSubscriberInterface
{
private $router;
private $defaultLocale;
private $locales = array();
public function __construct($defaultLocale = 'en', RequestContextAwareInterface $router = null)
{
@ -32,19 +35,24 @@ class LocaleListener implements EventSubscriberInterface
$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)
{
$request = $event->getRequest();
$request->setDefaultLocale($this->defaultLocale);
$this->setLocale($request, $request->attributes->get('_locale', $this->defaultLocale));
if ($locale = $request->attributes->get('_locale')) {
$request->setLocale($locale);
}
if (null !== $this->router) {
$this->router->getContext()->setParameter('_locale', $request->getLocale());
}
array_unshift($this->locales, $request->getLocale());
}
public static function getSubscribedEvents()
@ -52,6 +60,16 @@ class LocaleListener implements EventSubscriberInterface
return array(
// must be registered after the Router to have access to the _locale
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());
}
}
}