<?php
namespace App\EventSubscriber;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\HeaderUtils;
class LocaleSubscriber implements EventSubscriberInterface
{
private $defaultLocale;
private $session;
public function __construct($defaultLocale = 'en', SessionInterface $session)
{
$this->defaultLocale = $defaultLocale;
$this->session = $session;
}
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
$acceptLanguage = $request->headers->get('accept-language');
if (!empty($acceptLanguage)) {
$arr = HeaderUtils::split($acceptLanguage, ',;');
if (empty($arr[0][0])) {
return;
}
$locale = str_replace('-', '_', $arr[0][0]);
$request->setLocale($locale);
}
if (!$request->hasPreviousSession()) {
return;
}
// try to see if the locale has been set as a _locale routing parameter
if ($locale = $request->attributes->get('_locale')) {
$this->session->set('_locale', $locale);
} else {
// if no explicit locale has been set on this request, use one from the session
$request->setLocale($this->session->get('_locale', $this->defaultLocale));
}
}
public static function getSubscribedEvents(): array
{
return [
// must be registered before (i.e. with a higher priority than) the default Locale listener
KernelEvents::REQUEST => [['onKernelRequest', 20]],
];
}
}