<?php
namespace App\EventSubscriber;
use App\Service\LocaleService;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class CheckLocaleSubscriber
{
/**
* @var RequestStack
*/
private $requestStack;
/**
* @var TranslatorInterface
*/
private $translator;
/**
* @var LocaleService
*/
private $localeService;
/**
* @var LocaleService $localeService
*/
public function __construct(RequestStack $requestStack, TranslatorInterface $translator, LocaleService $localeService)
{
$this->requestStack = $requestStack;
$this->translator = $translator;
$this->localeService = $localeService;
}
public function onKernelController(ControllerEvent $event)
{
$request = $event->getRequest();
$locale = $request->attributes->get('_locale');
$locales = $this->localeService->getLocales();
if (!in_array($locale, $locales)) {
$locale = $this->localeService->getDefaultLocale();
}
$request->attributes->set('_locale', $locale);
if (is_array($request->attributes->get('_route_params'))) {
$request->attributes->set('_route_params', array_merge($request->attributes->get('_route_params'), ['_locale' => $locale]));
}
$this->translator->setLocale($locale);
if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
$request->setLocale($locale);
}
}
}