src/EventSubscriber/LocaleSubscriber.php line 21

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpFoundation\RequestStack;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use Symfony\Component\HttpKernel\KernelEvents;
  7. class LocaleSubscriber implements EventSubscriberInterface
  8. {
  9.     private const SUPPORTED_LOCALES = ['fr''en'];
  10.     private $defaultLocale;
  11.     public function __construct(string $defaultLocale 'fr')
  12.     {
  13.         $this->defaultLocale $defaultLocale;
  14.     }
  15.     public function onKernelRequest(RequestEvent $event)
  16.     {
  17.         $request $event->getRequest();
  18.         $session $request->hasPreviousSession() ? $request->getSession() : null;
  19.         // La langue passée en paramètre de l'URL a toujours la priorité
  20.         if ($locale $request->query->get('_locale')) {
  21.             $request->setLocale($locale);
  22.             $session?->set('_locale'$locale);
  23.             return;
  24.         }
  25.         // Sinon celle déjà choisie en session (utilisateurs connectés côté web)
  26.         if ($session && $session->has('_locale')) {
  27.             $request->setLocale($session->get('_locale'));
  28.             return;
  29.         }
  30.         // Sinon on négocie via l'en-tête Accept-Language (clients API/mobile sans session)
  31.         $request->setLocale($request->getPreferredLanguage(self::SUPPORTED_LOCALES) ?? $this->defaultLocale);
  32.     }
  33.     public static function getSubscribedEvents()
  34.     {
  35.         return [
  36.             // Priorité élevée pour gérer la langue au début du processus de requête
  37.             KernelEvents::REQUEST => [['onKernelRequest'20]],
  38.         ];
  39.     }
  40. }