Completed
Pull Request — development (#546)
by Nick
07:54 queued 01:05
created

LanguageProvider::getPreferredLanguage()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 22
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 10
nc 4
nop 1
dl 0
loc 22
rs 8.9197
c 0
b 0
f 0
1
<?php
2
3
namespace Oc\GlobalContext\Provider;
4
5
use Oc\Language\LanguageService;
6
use Oc\Session\SessionDataInterface;
7
use Oc\User\UserProvider;
8
use Symfony\Component\HttpFoundation\Request;
9
10
/**
11
 * Class LanguageProvider
12
 *
13
 * @package Oc\GlobalContext\Provider
14
 * @author Nick Lubisch <[email protected]>
15
 */
16
class LanguageProvider
17
{
18
    /**
19
     * @var LanguageService
20
     */
21
    private $languageService;
22
23
    /**
24
     * @var SessionDataInterface
25
     */
26
    private $sessionData;
27
28
    /**
29
     * @var string
30
     */
31
    private $defaultLanguage;
32
33
    /**
34
     * @var UserProvider
35
     */
36
    private $userProvider;
37
38
    /**
39
     * LanguageProvider constructor.
40
     *
41
     * @param LanguageService $languageService
42
     * @param SessionDataInterface $sessionData
43
     * @param UserProvider $userProvider
44
     * @param string $defaultLanguage
45
     */
46
    public function __construct(
47
        LanguageService $languageService,
48
        SessionDataInterface $sessionData,
49
        UserProvider $userProvider,
50
        $defaultLanguage
51
    ) {
52
        $this->languageService = $languageService;
53
        $this->sessionData = $sessionData;
54
        $this->defaultLanguage = $defaultLanguage;
55
        $this->userProvider = $userProvider;
56
    }
57
58
    /**
59
     * Determines the language of the user.
60
     *
61
     * @param Request $request
62
     *
63
     * @return string
64
     */
65
    public function getPreferredLanguage(Request $request)
66
    {
67
        // Determine session locale
68
        $sessionLocale = $this->sessionData->get('locale');
69
70
        if ($sessionLocale !== null) {
71
            return strtolower($sessionLocale);
72
        }
73
74
        $userLocale = $this->getUserLocale();
75
76
        if ($userLocale !== null) {
77
            return $userLocale;
78
        }
79
80
        $availableTranslations = $this->languageService->getAvailableTranslations();
81
82
        // Determine preferred language by Accepted-Language header and the available translations.
83
        $preferredLanguage = $request->getPreferredLanguage($availableTranslations);
84
85
        return $preferredLanguage ?: $this->defaultLanguage;
86
    }
87
88
    /**
89
     * Fetches the user locale.
90
     *
91
     * @return string|null
92
     */
93
    private function getUserLocale()
94
    {
95
        if ($user = $this->userProvider->bySession()) {
96
            return $user->language;
97
        }
98
99
        return null;
100
    }
101
}
102