+<?php
+
+namespace Rapsys\AirBundle\EventSubscriber;
+
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\RequestEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+use Symfony\Component\Routing\RouterInterface;
+
+class LocaleSubscriber implements EventSubscriberInterface {
+ private $locales;
+ private $router;
+
+ public function __construct(RouterInterface $router, array $locales = ['en']) {
+ $this->locales = $locales;
+ $this->router = $router;
+ }
+
+ public function onKernelRequest(RequestEvent $event) {
+ //Retrieve request
+ $request = $event->getRequest();
+
+ //Check for session
+ //XXX: people blocking cookies will be stuck to preferred language version
+ if (!$request->hasPreviousSession()) {
+ //Get preferred language
+ //XXX: default language is unused, it will return locales[0] if everything fail
+ $preferred = $request->getPreferredLanguage($this->locales);
+
+ //Check if preferred language differs from current request locale
+ if ($preferred != $request->getLocale()) {
+ //Save preferred locale in session
+ $request->getSession()->set('_locale', $preferred);
+
+ //Generate current route with preferred language
+ //XXX: may trigger a Symfony\Component\Routing\Exception\RouteNotFoundException if route is not found for preferred locale
+ $uri = $this->router->generate(
+ //Current route
+ $request->get('_route'),
+ //Force preferred locale
+ ['_locale' => $preferred]+$request->get('_route_params')
+ );
+
+ //Regenerate route with preferred locale
+ $event->setResponse(new RedirectResponse($uri, 302));
+
+ //End process
+ return;
+ }
+ }
+ }
+
+ public static function getSubscribedEvents() {
+ return [
+ // must be registered before the default locale listener
+ KernelEvents::REQUEST => [['onKernelRequest', 10]]
+ ];
+ }
+}