<?php
namespace App\EventSubscriber;
use App\Form\Model\Settings;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\Storage\UsageTrackingTokenStorage;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class LocaleSubscriber implements EventSubscriberInterface
{
/**
* LocaleSubscriber constructor.
*/
public function __construct(
protected UsageTrackingTokenStorage $tokenStorage,
protected TranslatorInterface $translator,
private string $defaultLocale = 'en'
) {
}
public function onKernelRequest(RequestEvent $event): void
{
$route = $event->getRequest()->get('_route');
if ('front' != substr((string) $route, 0, 5)) {
$settings = new Settings();
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
$locale = $request->attributes->get('_locale');
/** @var UserInterface $user */
$user = $this->tokenStorage->getToken() ? $this->tokenStorage->getToken()->getUser() : null;
if (null !== $user && 'anon.' != $user) {
if (method_exists($user, 'getPreferredLanguage') && $user->getPreferredLanguage()) {
$locale = $user->getPreferredLanguage();
} else {
$locale = $settings->getPreferredLanguage();
}
}
if ($locale != $request->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
$request->setLocale($locale);
$this->translator->setLocale($locale);
} else {
$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}
}
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => [['onKernelRequest', 1]],
];
}
}