src/EventSubscriber/LocaleSubscriber.php line 52
<?phpdeclare(strict_types=1);namespace App\EventSubscriber;use App\Entity\User;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\Security\Core\Security;use Symfony\Component\HttpKernel\Event\RequestEvent;use Symfony\Component\HttpKernel\KernelEvents;final class LocaleSubscriber implements EventSubscriberInterface{private const SUPPORTED_LOCALES = ['fr', 'en'];public function __construct(private readonly Security $security,private readonly string $defaultLocale = 'en'){}public static function getSubscribedEvents(): array{return [KernelEvents::REQUEST => [['onKernelRequest', 20]],];}public function onKernelRequest(RequestEvent $event): void{if (!$event->isMainRequest()) {return;}$request = $event->getRequest();$routeLocale = $request->attributes->get('_locale');if (is_string($routeLocale) && $this->isSupportedLocale($routeLocale)) {$normalizedRouteLocale = $this->normalizeLocale($routeLocale);$request->setLocale($normalizedRouteLocale);if ($request->hasSession()) {$request->getSession()->set('_locale', $normalizedRouteLocale);}return;}if ($request->hasSession()) {$sessionLocale = $request->getSession()->get('_locale');if (is_string($sessionLocale) && $this->isSupportedLocale($sessionLocale)) {$request->setLocale($this->normalizeLocale($sessionLocale));return;}}$authenticatedUser = $this->security->getUser();if ($authenticatedUser instanceof User) {$userLocale = $authenticatedUser->getLanguage();if (is_string($userLocale) && $this->isSupportedLocale($userLocale)) {$normalizedUserLocale = $this->normalizeLocale($userLocale);$request->setLocale($normalizedUserLocale);if ($request->hasSession()) {$request->getSession()->set('_locale', $normalizedUserLocale);}return;}}$request->setLocale($this->normalizeLocale($this->defaultLocale));}private function isSupportedLocale(string $locale): bool{return in_array($this->normalizeLocale($locale), self::SUPPORTED_LOCALES, true);}private function normalizeLocale(string $locale): string{return strtolower(substr($locale, 0, 2));}}