<?php
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class LocaleSubscriber implements EventSubscriberInterface
{
private $defaultLocale;
private $requestStack;
public function __construct(RequestStack $requestStack, string $defaultLocale = 'fr')
{
// On utilise RequestStack pour récupérer la langue
$this->requestStack = $requestStack;
// On récupère la langue principale du navigateur ou une langue par défaut
$request = $this->requestStack->getCurrentRequest();
$this->defaultLocale = $request ? $request->getPreferredLanguage(['en', 'fr']) : $defaultLocale;
}
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
$session = $request->getSession();
// Si aucune session n'est active, on ne fait rien
if (!$session) {
return;
}
// On vérifie si la langue est passée en paramètre de l'URL
if ($locale = $request->query->get('_locale')) {
$request->setLocale($locale);
$session->set('_locale', $locale);
} else {
// Sinon on utilise celle de la session ou la langue par défaut
$request->setLocale($session->get('_locale', $this->defaultLocale) ?? 'fr');
}
}
public static function getSubscribedEvents()
{
return [
// Priorité élevée pour gérer la langue au début du processus de requête
KernelEvents::REQUEST => [['onKernelRequest', 20]],
];
}
}