<?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 const SUPPORTED_LOCALES = ['fr', 'en'];
private $defaultLocale;
public function __construct(string $defaultLocale = 'fr')
{
$this->defaultLocale = $defaultLocale;
}
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
$session = $request->hasPreviousSession() ? $request->getSession() : null;
// La langue passée en paramètre de l'URL a toujours la priorité
if ($locale = $request->query->get('_locale')) {
$request->setLocale($locale);
$session?->set('_locale', $locale);
return;
}
// Sinon celle déjà choisie en session (utilisateurs connectés côté web)
if ($session && $session->has('_locale')) {
$request->setLocale($session->get('_locale'));
return;
}
// Sinon on négocie via l'en-tête Accept-Language (clients API/mobile sans session)
$request->setLocale($request->getPreferredLanguage(self::SUPPORTED_LOCALES) ?? $this->defaultLocale);
}
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]],
];
}
}