Passed
Push — master ( 9bba7f...685a87 )
by Julito
09:22
created

LocaleSubscriber::onKernelRequest()   B

Complexity

Conditions 8
Paths 10

Size

Total Lines 38
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 20
nc 10
nop 1
dl 0
loc 38
rs 8.4444
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\EventSubscriber;
8
9
use Chamilo\CoreBundle\Entity\Course;
10
use Chamilo\CoreBundle\Settings\SettingsManager;
11
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
12
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
13
use Symfony\Component\HttpFoundation\Request;
14
use Symfony\Component\HttpKernel\Event\RequestEvent;
15
use Symfony\Component\HttpKernel\KernelEvents;
16
17
/**
18
 * Checks the portal listener depending of different settings:
19
 * platform, user, course.
20
 */
21
class LocaleSubscriber implements EventSubscriberInterface
22
{
23
    protected string $defaultLocale;
24
    protected ParameterBagInterface $parameterBag;
25
    protected SettingsManager $settingsManager;
26
27
    public function __construct(string $defaultLocale, SettingsManager $settingsManager, ParameterBagInterface $parameterBag)
28
    {
29
        $this->defaultLocale = $defaultLocale;
30
        $this->settingsManager = $settingsManager;
31
        $this->parameterBag = $parameterBag;
32
    }
33
34
    public function onKernelRequest(RequestEvent $event): void
35
    {
36
        $request = $event->getRequest();
37
        /*if (!$request->hasPreviousSession()) {
38
            return;
39
        }*/
40
41
        $installed = false;
42
        if ($this->parameterBag->has('installed')) {
43
            $installed = 1 === (int) $this->parameterBag->get('installed');
44
        }
45
46
        if (!$installed) {
47
            return;
48
        }
49
50
        if (!$request->hasSession()) {
51
            return;
52
        }
53
54
        $loadFromDb = $request->getSession()->get('check_locale_from_db', true);
55
56
        if (false === $loadFromDb &&
57
            $request->getSession()->has('_locale') &&
58
            !empty($request->getSession()->get('_locale'))
59
        ) {
60
            $locale = $request->getSession()->get('_locale');
61
            $request->setLocale($locale);
62
63
            return;
64
        }
65
66
        if ($loadFromDb) {
67
            $locale = $this->getCurrentLanguage($request);
68
            // if no explicit locale has been set on this request, use one from the session
69
            $request->setLocale($locale);
70
            $request->getSession()->set('_locale', $locale);
71
            $request->getSession()->set('check_locale_from_db', false);
72
        }
73
    }
74
75
    public function getCurrentLanguage(Request $request): string
76
    {
77
        $localeList = [];
78
79
        // 1. Check platform locale
80
        $platformLocale = $this->settingsManager->getSetting('language.platform_language');
81
82
        if (!empty($platformLocale)) {
83
            $localeList['platform_lang'] = $platformLocale;
84
        }
85
        // 2. Check user locale
86
        // _locale_user is set when user logins the system check UserLocaleListener
87
        $userLocale = $request->getSession()->get('_locale_user');
88
89
        if (!empty($userLocale)) {
90
            $localeList['user_profil_lang'] = $userLocale;
91
        }
92
93
        // 3. Check course locale
94
        $courseId = $request->get('cid');
95
96
        if (!empty($courseId)) {
97
            /** @var Course $course */
98
            $course = $request->getSession()->get('course');
99
            // 3. Check course locale
100
            if (!empty($course)) {
101
                $courseLocale = $course->getCourseLanguage();
102
                if (!empty($courseLocale)) {
103
                    $localeList['course_lang'] = $platformLocale;
104
                }
105
            }
106
        }
107
108
        // 4. force locale if it was selected from the URL
109
        $localeFromUrl = $request->get('_locale');
110
        if (!empty($localeFromUrl)) {
111
            $localeList['user_selected_lang'] = $platformLocale;
112
        }
113
114
        $priorityList = [
115
            'language_priority_4',
116
            'language_priority_3',
117
            'language_priority_2',
118
            'language_priority_1',
119
        ];
120
121
        $locale = '';
122
        foreach ($priorityList as $setting) {
123
            $priority = $this->settingsManager->getSetting(sprintf('language.%s', $setting));
124
            if (!empty($priority) && isset($localeList[$priority])) {
125
                $locale = $localeList[$priority];
126
127
                break;
128
            }
129
        }
130
131
        if (empty($locale)) {
132
            // Use default order
133
            $priorityList = [
134
                'platform_lang',
135
                'user_profil_lang',
136
                'course_lang',
137
                'user_selected_lang',
138
            ];
139
            foreach ($priorityList as $setting) {
140
                if (isset($localeList[$setting])) {
141
                    $locale = $localeList[$setting];
142
                }
143
            }
144
        }
145
146
        if (empty($locale)) {
147
            $locale = $this->defaultLocale;
148
        }
149
150
        return $locale;
151
    }
152
153
    public static function getSubscribedEvents()
154
    {
155
        return [
156
            // must be registered before the default Locale listener
157
            KernelEvents::REQUEST => [['onKernelRequest', 20]],
158
        ];
159
    }
160
}
161