src/CoreBundle/EventSubscriber/LocaleSubscriber.php line 70

  1. <?php
  2. declare(strict_types=1);
  3. /* For licensing terms, see /license.txt */
  4. namespace Chamilo\CoreBundle\EventSubscriber;
  5. use Chamilo\CoreBundle\Entity\Course;
  6. use Chamilo\CoreBundle\Settings\SettingsManager;
  7. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpKernel\Event\RequestEvent;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. /**
  13.  * Checks the portal listener depending of different settings:
  14.  * platform, user, course.
  15.  */
  16. class LocaleSubscriber implements EventSubscriberInterface
  17. {
  18.     protected string $defaultLocale;
  19.     protected ParameterBagInterface $parameterBag;
  20.     protected SettingsManager $settingsManager;
  21.     public function __construct(string $defaultLocaleSettingsManager $settingsManagerParameterBagInterface $parameterBag)
  22.     {
  23.         $this->defaultLocale $defaultLocale;
  24.         $this->settingsManager $settingsManager;
  25.         $this->parameterBag $parameterBag;
  26.     }
  27.     public function onKernelRequest(RequestEvent $event): void
  28.     {
  29.         $request $event->getRequest();
  30.         /*if (!$request->hasPreviousSession()) {
  31.             return;
  32.         }*/
  33.         $installed false;
  34.         if ($this->parameterBag->has('installed')) {
  35.             $installed === (int) $this->parameterBag->get('installed');
  36.         }
  37.         if (!$installed) {
  38.             return;
  39.         }
  40.         if (!$request->hasSession()) {
  41.             return;
  42.         }
  43.         $sessionHandler $request->getSession();
  44.         if ($attrLocale $request->query->get('_locale')) {
  45.             $sessionHandler->set('_selected_locale'$attrLocale);
  46.         }
  47.         $locale $this->getCurrentLanguage($request);
  48.         // if no explicit locale has been set on this request, use one from the session
  49.         $request->setLocale($locale);
  50.         $sessionHandler->set('_locale'$locale);
  51.     }
  52.     public function getCurrentLanguage(Request $request): string
  53.     {
  54.         $sessionHandler $request->getSession();
  55.         $localeList = [];
  56.         // 1. Check platform locale;
  57.         if ($platformLocale $this->settingsManager->getSetting('language.platform_language')) {
  58.             $localeList['platform_lang'] = $platformLocale;
  59.         }
  60.         // 2. Check user locale
  61.         // _locale_user is set when user logins the system check UserLocaleListener
  62.         if ($userLocale $sessionHandler->get('_locale_user')) {
  63.             $localeList['user_profil_lang'] = $userLocale;
  64.         }
  65.         // 3. Check course locale
  66.         if ($request->query->getInt('cid')
  67.             || $request->request->getInt('cid')
  68.             || $request->attributes->getInt('cid')
  69.         ) {
  70.             /** @var Course|null $course */
  71.             // 3. Check course locale
  72.             if ($course $sessionHandler->get('course')) {
  73.                 if ($courseLocale $course->getCourseLanguage()) {
  74.                     $localeList['course_lang'] = $courseLocale;
  75.                 }
  76.             }
  77.         }
  78.         // 4. force locale if it was selected from the URL
  79.         if ($localeFromUrl $sessionHandler->get('_selected_locale')) {
  80.             $localeList['user_selected_lang'] = $localeFromUrl;
  81.         }
  82.         $priorityList = [
  83.             'language_priority_1',
  84.             'language_priority_2',
  85.             'language_priority_3',
  86.             'language_priority_4',
  87.         ];
  88.         $locale '';
  89.         foreach ($priorityList as $setting) {
  90.             $priority $this->settingsManager->getSetting(sprintf('language.%s'$setting));
  91.             if (!empty($priority) && !empty($localeList[$priority])) {
  92.                 $locale $localeList[$priority];
  93.                 break;
  94.             }
  95.         }
  96.         if (empty($locale)) {
  97.             // Use default order
  98.             $priorityList = [
  99.                 'platform_lang',
  100.                 'user_profil_lang',
  101.                 'course_lang',
  102.                 'user_selected_lang',
  103.             ];
  104.             foreach ($priorityList as $setting) {
  105.                 if (!empty($localeList[$setting])) {
  106.                     $locale $localeList[$setting];
  107.                 }
  108.             }
  109.         }
  110.         if (empty($locale)) {
  111.             $locale $this->defaultLocale;
  112.         }
  113.         return $locale;
  114.     }
  115.     public static function getSubscribedEvents(): array
  116.     {
  117.         return [
  118.             // must be registered before the default Locale listener
  119.             KernelEvents::REQUEST => [['onKernelRequest'20]],
  120.         ];
  121.     }
  122. }