src/EventListener/LocaleListener.php line 70

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Constant\LocaleEnum;
  4. use App\Entity\Locale;
  5. use App\Repository\LocaleRepository;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpKernel\KernelEvents;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Gedmo\Translatable\TranslatableListener;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpKernel\Event\RequestEvent;
  12. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  13. /**
  14.  * [Description LocaleListener]
  15.  */
  16. class LocaleListener implements EventSubscriberInterface
  17. {
  18.     /**
  19.      * @var TranslatableListener
  20.      */
  21.     private TranslatableListener $translatableListener;
  22.     /**
  23.      * @var array
  24.      */
  25.     private array $availableLocales;
  26.     /**
  27.      * @var string
  28.      */
  29.     private string $defaultLocale;
  30.     /**
  31.      * @var string
  32.      */
  33.     private string $currentLocale LocaleEnum::FRENCH;
  34.     /**
  35.      * @param TranslatableListener $translatableListener
  36.      * @param LocaleRepository $localeRepository
  37.      */
  38.     public function __construct(
  39.         TranslatableListener $translatableListener,
  40.         LocaleRepository $localeRepository,
  41.     ) {
  42.         $this->translatableListener $translatableListener;
  43.         $this->availableLocales $localeRepository->getAvailableLocales();
  44.         $this->defaultLocale $localeRepository->getDefaultLocale();
  45.     }
  46.     /**
  47.      * {@inheritDoc}
  48.      *
  49.      */
  50.     public static function getSubscribedEvents(): array
  51.     {
  52.         return [
  53.             KernelEvents::REQUEST => [['onKernelRequest'200]],
  54.             KernelEvents::RESPONSE => ['setContentLanguage'],
  55.         ];
  56.     }
  57.     /**
  58.      * @param RequestEvent $event
  59.      * @return void
  60.      */
  61.     public function onKernelRequest(RequestEvent $event): void
  62.     {
  63.         /** @var Request $request */
  64.         $request $event->getRequest();
  65.         if ($request->headers->has('X-LOCALE')) {
  66.             $locale $request->headers->get('X-LOCALE');
  67.             if (in_array($locale$this->availableLocales)) {
  68.                 $request->setLocale($locale);
  69.             } else {
  70.                 $request->setLocale($this->defaultLocale);
  71.             }
  72.         } else {
  73.             $request->setLocale($this->defaultLocale);
  74.         }
  75.         // Set currentLocale
  76.         $this->translatableListener->setTranslatableLocale($request->getLocale());
  77.         $this->currentLocale $request->getLocale();
  78.     }
  79.     /**
  80.      * @param ResponseEvent $responseEvent
  81.      * @return Response
  82.      */
  83.     public function setContentLanguage(ResponseEvent $responseEvent): Response
  84.     {
  85.         $response $responseEvent->getResponse();
  86.         $response->headers->add(['Content-Language' => $this->currentLocale]);
  87.         return $response;
  88.     }
  89. }