vendor/nucleos/user-bundle/src/EventListener/LocaleEventListener.php line 87

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4.  * This file is part of the NucleosUserBundle package.
  5.  *
  6.  * (c) Christian Gripp <mail@core23.de>
  7.  *
  8.  * For the full copyright and license information, please view the LICENSE
  9.  * file that was distributed with this source code.
  10.  */
  11. namespace Nucleos\UserBundle\EventListener;
  12. use Nucleos\UserBundle\Event\UserEvent;
  13. use Nucleos\UserBundle\Model\LocaleAwareUser;
  14. use Nucleos\UserBundle\NucleosUserEvents;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpKernel\Event\RequestEvent;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  20. use Symfony\Component\Security\Http\SecurityEvents;
  21. use Symfony\Contracts\Translation\LocaleAwareInterface as LocaleAwareTranslator;
  22. final class LocaleEventListener implements EventSubscriberInterface
  23. {
  24.     private LocaleAwareTranslator $translator;
  25.     public function __construct(LocaleAwareTranslator $translator)
  26.     {
  27.         $this->translator $translator;
  28.     }
  29.     public static function getSubscribedEvents(): array
  30.     {
  31.         return [
  32.             NucleosUserEvents::SECURITY_IMPLICIT_LOGIN => 'onImplicitLogin',
  33.             SecurityEvents::INTERACTIVE_LOGIN          => 'onSecurityInteractiveLogin',
  34.             KernelEvents::REQUEST                      => [['onKernelRequest'20]],
  35.             NucleosUserEvents::USER_LOCALE_CHANGED     => 'onLocaleChanged',
  36.             NucleosUserEvents::USER_TIMEZONE_CHANGED   => 'onTimezoneChanged',
  37.         ];
  38.     }
  39.     public function onImplicitLogin(UserEvent $event): void
  40.     {
  41.         $user $event->getUser();
  42.         if (!$user instanceof LocaleAwareUser || null === $event->getRequest()) {
  43.             return;
  44.         }
  45.         $this->setLocale($event->getRequest(), $user);
  46.         $this->setTimezone($event->getRequest(), $user);
  47.     }
  48.     public function onSecurityInteractiveLogin(InteractiveLoginEvent $event): void
  49.     {
  50.         $user $event->getAuthenticationToken()->getUser();
  51.         if (!$user instanceof LocaleAwareUser) {
  52.             return;
  53.         }
  54.         $this->setLocale($event->getRequest(), $user);
  55.         $this->setTimezone($event->getRequest(), $user);
  56.     }
  57.     public function onKernelRequest(RequestEvent $event): void
  58.     {
  59.         $request $event->getRequest();
  60.         if (!$request->hasPreviousSession()) {
  61.             return;
  62.         }
  63.         $session $request->getSession();
  64.         if (null !== $locale $session->get('_locale')) {
  65.             $this->translator->setLocale($locale);
  66.             $request->setLocale($locale);
  67.         }
  68.     }
  69.     public function onTimezoneChanged(UserEvent $event): void
  70.     {
  71.         $user $event->getUser();
  72.         if ($user instanceof LocaleAwareUser && null !== $event->getRequest()) {
  73.             $this->setTimezone($event->getRequest(), $user);
  74.         }
  75.     }
  76.     public function onLocaleChanged(UserEvent $event): void
  77.     {
  78.         $user $event->getUser();
  79.         if ($user instanceof LocaleAwareUser && null !== $event->getRequest()) {
  80.             $this->setLocale($event->getRequest(), $user);
  81.         }
  82.     }
  83.     private function setLocale(Request $requestLocaleAwareUser $user): void
  84.     {
  85.         if (!$request->hasSession()) {
  86.             return;
  87.         }
  88.         $session $request->getSession();
  89.         $locale $user->getLocale();
  90.         if ('' === $locale || null === $locale) {
  91.             return;
  92.         }
  93.         $this->translator->setLocale($locale);
  94.         $request->setLocale($locale);
  95.         $session->set('_locale'$locale);
  96.     }
  97.     private function setTimezone(Request $requestLocaleAwareUser $user): void
  98.     {
  99.         if (!$request->hasSession()) {
  100.             return;
  101.         }
  102.         $timezone $user->getTimezone();
  103.         if ('' === $timezone || null === $timezone) {
  104.             return;
  105.         }
  106.         $session $request->getSession();
  107.         $session->set('_timezone'$timezone);
  108.     }
  109. }