src/EventListener/LocaleListener.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Application\Service\Session\SessionService;
  4. use App\Entity\System\Customer;
  5. use App\Service\EnvironmentService;
  6. use Doctrine\ORM\NonUniqueResultException;
  7. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpKernel\Event\RequestEvent;
  10. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  11. use Symfony\Contracts\Translation\TranslatorInterface;
  12. class LocaleListener
  13. {
  14.     private TranslatorInterface $translator;
  15.     private TokenStorageInterface $tokenStorage;
  16.     private EnvironmentService $environmentService;
  17.     private SessionService $sessionService;
  18.     private string $defaultLocale;
  19.     private array $locales;
  20.     public function __construct(
  21.         TranslatorInterface $translator,
  22.         TokenStorageInterface $tokenStorage,
  23.         ParameterBagInterface $parameterBag,
  24.         EnvironmentService $environmentService,
  25.         SessionService $sessionService
  26.     ) {
  27.         $this->translator $translator;
  28.         $this->tokenStorage $tokenStorage;
  29.         $this->environmentService $environmentService;
  30.         $this->sessionService $sessionService;
  31.         $this->defaultLocale $parameterBag->get('locale');
  32.         $this->locales $parameterBag->get('locales');
  33.     }
  34.     public function onKernelRequest(RequestEvent $event): void
  35.     {
  36.         if ($this->environmentService->isApi()) {
  37.             return;
  38.         }
  39.         $request $event->getRequest();
  40.         $urlLocale $this->getLocaleFromUrl($request);
  41.         if ($urlLocale) {
  42.             $this->setLocale($urlLocale$request);
  43.             return;
  44.         }
  45.         $browserLocale $this->getLocaleFromBrowser($request);
  46.         if (!$request->getSession()->get('lang')) {
  47.             if ($this->tokenStorage->getToken()) {
  48.                 /** @var Customer $user */
  49.                 $user $this->tokenStorage->getToken()->getUser();
  50.                 $userLocale $user->getLanguage()->getIsoCode();
  51.                 $this->setLocale($userLocale$request);
  52.                 return;
  53.             }
  54.             $locale $browserLocale ?: $this->defaultLocale;
  55.             $this->setLocale($locale$request);
  56.         }
  57.     }
  58.     /**
  59.      * @throws NonUniqueResultException
  60.      */
  61.     private function setLocale(string $localeRequest $request): void
  62.     {
  63.         $request->setLocale($locale);
  64.         $this->translator->setLocale($locale);
  65.         $this->sessionService->setLocaleParameters($locale);
  66.     }
  67.     private function getLocaleFromBrowser(Request $request): ?string
  68.     {
  69.         return $request->getPreferredLanguage($this->locales);
  70.     }
  71.     private function isLocaleSupported(string $locale): bool
  72.     {
  73.         return \in_array($locale$this->localestrue);
  74.     }
  75.     private function getLocaleFromUrl(Request $request): ?string
  76.     {
  77.         $urlArray = \explode('/'$request->getPathInfo());
  78.         if (
  79.             is_array($urlArray)
  80.             && isset($urlArray[1])
  81.             && $this->isLocaleSupported($urlArray[1])
  82.         ) {
  83.             return $urlArray[1];
  84.         }
  85.         return $request->getSession()->get('lang') ?: null;
  86.     }
  87. }