<?php
declare(strict_types=1);
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
final class LocaleSubscriber implements EventSubscriberInterface
{
/**
* Allowed locales that exist in our i18n resources / translations.
*/
private const SUPPORTED = [
'fr', 'en', 'de', 'es', 'ru', 'ja', 'zh', 'hi',
'zh-CN', 'zh-TW', 'zh-SG', 'zh-HK',
'ja-JP', 'de-DE', 'de-AT', 'de-CH',
'es-ES', 'es-MX', 'es-AR',
'ru-RU', 'hi-IN',
];
public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$request = $event->getRequest();
// Priority: explicit _locale attribute, then cookie `locale`, then navigator fallback handled client-side.
$cookieLocale = $request->cookies->get('locale');
$locale = $request->getLocale();
if ($cookieLocale && $this->isSupported($cookieLocale)) {
$locale = $cookieLocale;
// Propager dans la session pour les prochains appels Twig / routes.
$request->getSession()?->set('_locale', $locale);
}
// Normalize: keep short language code when possible
if (str_contains($locale, '-')) {
$parts = explode('-', $locale);
$short = strtolower($parts[0]);
if ($this->isSupported($short)) {
$locale = $short;
}
}
$request->setLocale($locale);
}
private function isSupported(string $locale): bool
{
return in_array($locale, self::SUPPORTED, true);
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => [['onKernelRequest', 20]],
];
}
}