src/EventSubscriber/LocaleSubscriber.php line 24

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use Symfony\Component\HttpKernel\KernelEvents;
  7. final class LocaleSubscriber implements EventSubscriberInterface
  8. {
  9.     /**
  10.      * Allowed locales that exist in our i18n resources / translations.
  11.      */
  12.     private const SUPPORTED = [
  13.         'fr''en''de''es''ru''ja''zh''hi',
  14.         'zh-CN''zh-TW''zh-SG''zh-HK',
  15.         'ja-JP''de-DE''de-AT''de-CH',
  16.         'es-ES''es-MX''es-AR',
  17.         'ru-RU''hi-IN',
  18.     ];
  19.     public function onKernelRequest(RequestEvent $event): void
  20.     {
  21.         if (!$event->isMainRequest()) {
  22.             return;
  23.         }
  24.         $request $event->getRequest();
  25.         // Priority: explicit _locale attribute, then cookie `locale`, then navigator fallback handled client-side.
  26.         $cookieLocale $request->cookies->get('locale');
  27.         $locale $request->getLocale();
  28.         if ($cookieLocale && $this->isSupported($cookieLocale)) {
  29.             $locale $cookieLocale;
  30.             // Propager dans la session pour les prochains appels Twig / routes.
  31.             $request->getSession()?->set('_locale'$locale);
  32.         }
  33.         // Normalize: keep short language code when possible
  34.         if (str_contains($locale'-')) {
  35.             $parts explode('-'$locale);
  36.             $short strtolower($parts[0]);
  37.             if ($this->isSupported($short)) {
  38.                 $locale $short;
  39.             }
  40.         }
  41.         $request->setLocale($locale);
  42.     }
  43.     private function isSupported(string $locale): bool
  44.     {
  45.         return in_array($localeself::SUPPORTEDtrue);
  46.     }
  47.     public static function getSubscribedEvents(): array
  48.     {
  49.         return [
  50.             KernelEvents::REQUEST => [['onKernelRequest'20]],
  51.         ];
  52.     }
  53. }