<?php
namespace App\EventSubscriber;
use Psr\Log\LoggerInterface;
use Symfony\Bridge\Monolog\Logger;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Contracts\EventDispatcher\Event;
class LocaleSubscriber implements EventSubscriberInterface
{
private $defaultLocale;
private $logger;
public function __construct(LoggerInterface $logger, string $defaultLocale = "en")
{
$this->defaultLocale = $defaultLocale;
$this->logger = $logger;
}
public function onKernelRequest(RequestEvent $event)
{
/*
* NOTE : the $request->getLanguages() method assumes that languages are sorted by descending quality.
* e.g : fr_FR, fr;q=0.5, en;q=0.8 will return the same result as fr_FR, fr;q=0.8, en;q=0.5 :
* ['fr_FR', 'fr', 'en'].
* But it manages non iso 639 languages wich can be registered with the i prefix like i-cherokee.
*/
$this->logger->info('=> BEGIN LocaleSubscriber::onKernelRequest');
$request = $event->getRequest();
$server_accept_languages = ['fr', 'en'];
$client_accept_languages = $request->getLanguages();
$default_language = 'en';
$match = false;
$language = $default_language;
$this->logger->info('* client_accept_languages => ' . json_encode($client_accept_languages));
foreach($client_accept_languages as $client_language)
{
if(in_array($client_language, $server_accept_languages))
{
$this->logger->info('* client_selected_language => ' . json_encode($client_language));
$request->setLocale($client_language);
$language = $client_language;
$match = true;
break;
}
}
$this->logger->info('=> END LocaleSubscriber::onKernelRequest');
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => [['onKernelRequest', 20]],
];
}
}