Here is a working language listener. the second way is to change the language to the user preferences that the user selects. You can omit this method if your user does not have the ability to determine their language.
<?php namespace Acme\UserBundle\EventListener; use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\HttpKernel\HttpKernelInterface; class LanguageListener { private $session; public function setSession(Session $session) { $this->session = $session; } public function setLocaleForUnauthenticatedUser(GetResponseEvent $event) { if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) { return; } $request = $event->getRequest(); if ('undefined' == $request->getLocale()) { if ($locale = $request->getSession()->get('_locale')) { $request->setLocale($locale); } else { $request->setLocale($request->getPreferredLanguage()); } } } public function setLocaleForAuthenticatedUser(InteractiveLoginEvent $event) { $user = $event->getAuthenticationToken()->getUser(); if ($lang = $user->getLanguage()) { $this->session->set('_locale', $lang); } } }
in your services.yml:
services: acme.language.interactive_login_listener: class: Acme\UserBundle\EventListener\LanguageListener calls: - [ setSession, [@session] ] tags: - { name: kernel.event_listener, event: security.interactive_login, method: setLocaleForAuthenticatedUser } acme.language.kernel_request_listener: class: Acme\UserBundle\EventListener\LanguageListener tags: - { name: kernel.event_listener, event: kernel.request, method: setLocaleForUnauthenticatedUser }
Oh, and you need to define undefined fallback_language in config.yml to make it work.
framework: translator: { fallback: "undefined" } default_locale: "en"
source share