vendor/ibexa/admin-ui/src/lib/EventListener/RequestLocaleListener.php line 74

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. declare(strict_types=1);
  7. namespace Ibexa\AdminUi\EventListener;
  8. use Ibexa\AdminUi\Specification\SiteAccess\IsAdmin;
  9. use Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface;
  10. use Ibexa\Core\MVC\Symfony\Locale\UserLanguagePreferenceProviderInterface;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpKernel\Event\RequestEvent;
  14. use Symfony\Component\HttpKernel\HttpKernelInterface;
  15. use Symfony\Component\HttpKernel\KernelEvents;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. class RequestLocaleListener implements EventSubscriberInterface
  18. {
  19.     /** @var array */
  20.     private $siteAccessGroups;
  21.     /** @var array */
  22.     private $availableTranslations;
  23.     /** @var \Symfony\Contracts\Translation\TranslatorInterface */
  24.     private $translator;
  25.     /** @var \Ibexa\Core\MVC\Symfony\Locale\UserLanguagePreferenceProviderInterface */
  26.     private $userLanguagePreferenceProvider;
  27.     /** @var \Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface */
  28.     private $configResolver;
  29.     /**
  30.      * @param array $siteAccessGroups
  31.      * @param array $availableTranslations
  32.      * @param \Symfony\Contracts\Translation\TranslatorInterface $translator
  33.      * @param \Ibexa\Core\MVC\Symfony\Locale\UserLanguagePreferenceProviderInterface $userLanguagePreferenceProvider
  34.      * @param \Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface $configResolver
  35.      */
  36.     public function __construct(
  37.         array $siteAccessGroups,
  38.         array $availableTranslations,
  39.         TranslatorInterface $translator,
  40.         UserLanguagePreferenceProviderInterface $userLanguagePreferenceProvider,
  41.         ConfigResolverInterface $configResolver
  42.     ) {
  43.         $this->siteAccessGroups $siteAccessGroups;
  44.         $this->availableTranslations $availableTranslations;
  45.         $this->translator $translator;
  46.         $this->userLanguagePreferenceProvider $userLanguagePreferenceProvider;
  47.         $this->configResolver $configResolver;
  48.     }
  49.     /**
  50.      * {@inheritdoc}
  51.      */
  52.     public static function getSubscribedEvents(): array
  53.     {
  54.         return [
  55.             KernelEvents::REQUEST => ['onKernelRequest'6],
  56.         ];
  57.     }
  58.     /**
  59.      * @param \Symfony\Component\HttpKernel\Event\RequestEvent $event
  60.      *
  61.      * @throws \Ibexa\AdminUi\Exception\InvalidArgumentException
  62.      */
  63.     public function onKernelRequest(RequestEvent $event): void
  64.     {
  65.         $request $event->getRequest();
  66.         if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType() || !$this->isAdminSiteAccess($request)) {
  67.             return;
  68.         }
  69.         $additionalTranslations $this->configResolver->getParameter('user_preferences.additional_translations');
  70.         $preferableLocales $this->userLanguagePreferenceProvider->getPreferredLocales($request);
  71.         $locale null;
  72.         foreach ($preferableLocales as $preferableLocale) {
  73.             if (\in_array($preferableLocale$this->availableTranslationstrue)
  74.                 || \in_array($preferableLocale$additionalTranslationstrue)
  75.             ) {
  76.                 $locale $preferableLocale;
  77.                 break;
  78.             }
  79.         }
  80.         $locale $locale ?? reset($preferableLocales);
  81.         $request->setLocale($locale);
  82.         $request->attributes->set('_locale'$locale);
  83.         // Set of the current locale on the translator service is needed because RequestLocaleListener has lower
  84.         // priority than LocaleListener and messages are not translated on login, forgot and reset password pages.
  85.         $this->translator->setLocale($locale);
  86.     }
  87.     /**
  88.      * @param \Symfony\Component\HttpFoundation\Request $request
  89.      *
  90.      * @return bool
  91.      *
  92.      * @throws \Ibexa\AdminUi\Exception\InvalidArgumentException
  93.      */
  94.     protected function isAdminSiteAccess(Request $request): bool
  95.     {
  96.         return (new IsAdmin($this->siteAccessGroups))->isSatisfiedBy($request->attributes->get('siteaccess'));
  97.     }
  98. }
  99. class_alias(RequestLocaleListener::class, 'EzSystems\EzPlatformAdminUi\EventListener\RequestLocaleListener');