<?php
declare(strict_types=1);
namespace App\Subscriber;
use App\Event\Application\LanguageChangedEvent;
use App\Service\Context\ContextInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
class LocaleSubscriber implements EventSubscriberInterface
{
const LANGUAGE_SYMBOL_LENGTH = 2;
private $defaultLocale;
private EventDispatcherInterface $eventDispatcher;
private ContextInterface $context;
public function __construct(
EventDispatcherInterface $eventDispatcher,
ContextInterface $context
)
{
$this->defaultLocale = getenv('locale');
$this->eventDispatcher = $eventDispatcher;
$this->context = $context;
}
public function onKernelRequest(RequestEvent $event): void
{
$request = $event->getRequest();
$locale = $this->defaultLocale;
if ($request->getPreferredLanguage()) {
$locale = $request->getPreferredLanguage();
} elseif ($request->getSession()->get('_locale', $this->defaultLocale)) {
$locale = $request->getSession()->get('_locale', $this->defaultLocale);
}
$language = substr($locale, 0, self::LANGUAGE_SYMBOL_LENGTH);
$this->context->setLanguage(!empty($language) ? mb_strtolower($language) : mb_strtolower(getenv('locale')));
$this->context->setIsLanguageSet(
$request->headers->has('Accept-Language') || $request->getSession()->has('_locale')
);
$this->eventDispatcher->dispatch(
new LanguageChangedEvent($locale)
);
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => [['onKernelRequest', 20]],
];
}
}