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]] ]; } }