<?php
namespace App\EventListener;
use App\Constant\LocaleEnum;
use App\Entity\Locale;
use App\Repository\LocaleRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpFoundation\Request;
use Gedmo\Translatable\TranslatableListener;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
/**
* [Description LocaleListener]
*/
class LocaleListener implements EventSubscriberInterface
{
/**
* @var TranslatableListener
*/
private TranslatableListener $translatableListener;
/**
* @var array
*/
private array $availableLocales;
/**
* @var string
*/
private string $defaultLocale;
/**
* @var string
*/
private string $currentLocale = LocaleEnum::FRENCH;
/**
* @param TranslatableListener $translatableListener
* @param LocaleRepository $localeRepository
*/
public function __construct(
TranslatableListener $translatableListener,
LocaleRepository $localeRepository,
) {
$this->translatableListener = $translatableListener;
$this->availableLocales = $localeRepository->getAvailableLocales();
$this->defaultLocale = $localeRepository->getDefaultLocale();
}
/**
* {@inheritDoc}
*
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => [['onKernelRequest', 200]],
KernelEvents::RESPONSE => ['setContentLanguage'],
];
}
/**
* @param RequestEvent $event
* @return void
*/
public function onKernelRequest(RequestEvent $event): void
{
/** @var Request $request */
$request = $event->getRequest();
if ($request->headers->has('X-LOCALE')) {
$locale = $request->headers->get('X-LOCALE');
if (in_array($locale, $this->availableLocales)) {
$request->setLocale($locale);
} else {
$request->setLocale($this->defaultLocale);
}
} else {
$request->setLocale($this->defaultLocale);
}
// Set currentLocale
$this->translatableListener->setTranslatableLocale($request->getLocale());
$this->currentLocale = $request->getLocale();
}
/**
* @param ResponseEvent $responseEvent
* @return Response
*/
public function setContentLanguage(ResponseEvent $responseEvent): Response
{
$response = $responseEvent->getResponse();
$response->headers->add(['Content-Language' => $this->currentLocale]);
return $response;
}
}