src/EventSubscriber/LocaleSubscriber.php line 19

  1. <?php
  2. namespace App\EventSubscriber;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use Symfony\Component\HttpKernel\KernelEvents;
  7. use Symfony\Contracts\Translation\TranslatorInterface;
  8. use Twig\Environment;
  9. class LocaleSubscriber implements EventSubscriberInterface
  10. {
  11.     public function __construct(Environment $twigEntityManagerInterface $em, private TranslatorInterface $translator)
  12.     {
  13.         $this->twig    $twig;
  14.         $this->em $em;
  15.     }
  16.     public function onKernelRequest(RequestEvent $event): void
  17.     {
  18.         $request $event->getRequest();
  19.         $languages = ['en''fr''de''es''pt''ar''it'];
  20.         if ($request->query->get('lang') !== null && in_array($request->query->get('lang'), $languages)) {
  21.             $request->setLocale($request->query->get('lang'));
  22.             $request->getSession()->set('_locale'null);
  23.         } else {
  24.             // try to see if the locale has been set as a _locale routing parameter
  25.             if ($locale $request->attributes->get('_locale')) {
  26.                 $request->getSession()->set('_locale'$locale);
  27.             } else {
  28.                 if (!empty($request->getSession()->get('_locale'))) {
  29.                     $locale $request->getSession()->get('_locale');
  30.                 } elseif (!empty($request->cookies->get('_locale'))) {
  31.                     $locale $request->cookies->get('_locale');
  32.                 } elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
  33.                     $locale substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 02);
  34.                 }
  35.                 if (!in_array($locale$languages)) {
  36.                     $locale 'en';
  37.                 }
  38.                 $request->setLocale($locale);
  39.             }
  40.         }
  41.         $this->translator->setLocale($request->getLocale());
  42.     }
  43.     public static function getSubscribedEvents(): array
  44.     {
  45.         return [
  46.             KernelEvents::REQUEST => 'onKernelRequest',
  47.         ];
  48.     }
  49. }