src/EventSubscriber/LocaleSetterEventSubscriber.php line 86

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber;
  4. use Locale;
  5. use Symfony\Component\Console\ConsoleEvents;
  6. use Symfony\Component\Console\Event\ConsoleCommandEvent;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpKernel\Event\RequestEvent;
  10. class LocaleSetterEventSubscriber implements EventSubscriberInterface
  11. {
  12.     private const QUERY_PARAMETER_LOCALE 'lang';
  13.     private const LOCALE_LIST = [
  14.         'en',
  15.         'hu'
  16.     ];
  17.     public const SESSION_PARAM_LOCALE 'locale';
  18.     private string $defaultLocale;
  19.     public function __construct(string $defaultLocale)
  20.     {
  21.         $this->defaultLocale $defaultLocale;
  22.     }
  23.     public static function getSubscribedEvents(): array
  24.     {
  25.         return [
  26. //            InteractiveLoginEvent::class => 'onInteractiveLogin',
  27.             RequestEvent::class => [['onRequest'32]],
  28. //            WorkerStartedEvent::class => 'onWorkerStarted',
  29.             ConsoleEvents::COMMAND => 'onCommand'
  30.         ];
  31.     }
  32. //    public function onInteractiveLogin(InteractiveLoginEvent $event): void
  33. //    {
  34. //        $user = $event->getAuthenticationToken()->getUser();
  35. //
  36. //        if (isset($user)) {
  37. //            $event->getRequest()->getSession()->set(self::SESSION_PARAM_LOCALE, $user->getLocale());
  38. //        }
  39. //    }
  40.     public function onRequest(RequestEvent $event): void
  41.     {
  42.         $request $event->getRequest();
  43.         $locale $this->getLocaleForRequest($request);
  44.         $request->setLocale($locale);
  45.         $request->getSession()->set(self::SESSION_PARAM_LOCALE$locale);
  46.         Locale::setDefault($locale);
  47.     }
  48. //    public function onWorkerStarted(WorkerStartedEvent $event): void
  49. //    {
  50. //        Locale::setDefault($this->defaultLocale);
  51. //    }
  52.     public function onCommand(ConsoleCommandEvent $event): void
  53.     {
  54.         Locale::setDefault($this->defaultLocale);
  55.     }
  56.     private function getLocaleForRequest(Request $request): string
  57.     {
  58.         if (
  59.             $request->query->has(self::QUERY_PARAMETER_LOCALE) &&
  60.             in_array(
  61.                 $request->query->get(self::QUERY_PARAMETER_LOCALE),
  62.                 self::LOCALE_LIST,
  63.                 true
  64.             )
  65.         ) {
  66.             return $request->query->get(self::QUERY_PARAMETER_LOCALE);
  67.         }
  68.         if ($request->getSession()->has(self::SESSION_PARAM_LOCALE)) {
  69.             return $request->getSession()->get(self::SESSION_PARAM_LOCALE);
  70.         }
  71.         return $this->defaultLocale;
  72.     }
  73. }