src/EventListener/LocaleListener.php line 70

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