src/EventSubscriber/LocaleSubscriber.php line 37

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpKernel\Event\RequestEvent;
  5. use Symfony\Component\HttpKernel\KernelEvents;
  6. /**
  7.  * Détermine la langue de la requête (i18n).
  8.  *
  9.  * Ordre de résolution :
  10.  *   1. Paramètre d'URL `?_locale=` (ex. via le lien de changement de langue) — s'il est valide, il est aussi mémorisé en session.
  11.  *   2. Valeur mémorisée en session (`_locale`).
  12.  *   3. Langue par défaut (français).
  13.  *
  14.  * Seules les langues déclarées dans self::SUPPORTED_LOCALES sont acceptées :
  15.  * toute valeur inconnue retombe sur la langue par défaut (protection contre les valeurs arbitraires).
  16.  */
  17. class LocaleSubscriber implements EventSubscriberInterface
  18. {
  19.     /**
  20.      * Langues prises en charge. Doit rester cohérent avec `framework.enabled_locales`
  21.      * (config/packages/translation.yaml) et les fichiers translations/messages.<locale>.yaml.
  22.      *
  23.      * @var string[]
  24.      */
  25.     private const SUPPORTED_LOCALES = ['fr''ar_TN'];
  26.     private string $defaultLocale;
  27.     public function __construct(string $defaultLocale 'fr')
  28.     {
  29.         $this->defaultLocale $defaultLocale;
  30.     }
  31.     public function onKernelRequest(RequestEvent $event): void
  32.     {
  33.         $request $event->getRequest();
  34.         if (!$request->hasPreviousSession()) {
  35.             return;
  36.         }
  37.         $session $request->getSession();
  38.         // 1. Langue passée en paramètre d'URL : on la valide puis on la mémorise.
  39.         $queryLocale $request->query->get('_locale');
  40.         if (\is_string($queryLocale) && $this->isSupported($queryLocale)) {
  41.             $session->set('_locale'$queryLocale);
  42.             $request->setLocale($queryLocale);
  43.             return;
  44.         }
  45.         // 2. Langue mémorisée en session, sinon 3. langue par défaut.
  46.         $sessionLocale $session->get('_locale'$this->defaultLocale);
  47.         $request->setLocale($this->isSupported($sessionLocale) ? $sessionLocale $this->defaultLocale);
  48.     }
  49.     private function isSupported($locale): bool
  50.     {
  51.         return \is_string($locale) && \in_array($localeself::SUPPORTED_LOCALEStrue);
  52.     }
  53.     public static function getSubscribedEvents(): array
  54.     {
  55.         return [
  56.             // Priorité élevée pour définir la locale avant les autres listeners (routing, sécurité...).
  57.             KernelEvents::REQUEST => [['onKernelRequest'20]],
  58.         ];
  59.     }
  60. }