Completed
Pull Request — development (#546)
by Nick
06:25
created

LanguageProvider   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 0
Metric Value
dl 0
loc 86
rs 10
c 0
b 0
f 0
wmc 7
lcom 1
cbo 5

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 11 1
B getPreferredLanguage() 0 22 4
A getUserLocale() 0 8 2
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
 */
15
class LanguageProvider
16
{
17
    /**
18
     * @var LanguageService
19
     */
20
    private $languageService;
21
22
    /**
23
     * @var SessionDataInterface
24
     */
25
    private $sessionData;
26
27
    /**
28
     * @var string
29
     */
30
    private $defaultLanguage;
31
32
    /**
33
     * @var UserProvider
34
     */
35
    private $userProvider;
36
37
    /**
38
     * LanguageProvider constructor.
39
     *
40
     * @param LanguageService $languageService
41
     * @param SessionDataInterface $sessionData
42
     * @param UserProvider $userProvider
43
     * @param string $defaultLanguage
44
     */
45
    public function __construct(
46
        LanguageService $languageService,
47
        SessionDataInterface $sessionData,
48
        UserProvider $userProvider,
49
        $defaultLanguage
50
    ) {
51
        $this->languageService = $languageService;
52
        $this->sessionData = $sessionData;
53
        $this->defaultLanguage = $defaultLanguage;
54
        $this->userProvider = $userProvider;
55
    }
56
57
    /**
58
     * Determines the language of the user.
59
     *
60
     * @param Request $request
61
     *
62
     * @return string
63
     */
64
    public function getPreferredLanguage(Request $request)
65
    {
66
        // Determine session locale
67
        $sessionLocale = $this->sessionData->get('locale');
68
69
        if ($sessionLocale !== null) {
70
            return strtolower($sessionLocale);
71
        }
72
73
        $userLocale = $this->getUserLocale();
74
75
        if ($userLocale !== null) {
76
            return $userLocale;
77
        }
78
79
        $availableTranslations = $this->languageService->getAvailableTranslations();
80
81
        // Determine preferred language by Accepted-Language header and the available translations.
82
        $preferredLanguage = $request->getPreferredLanguage($availableTranslations);
83
84
        return $preferredLanguage ?: $this->defaultLanguage;
85
    }
86
87
    /**
88
     * Fetches the user locale.
89
     *
90
     * @return string|null
91
     */
92
    private function getUserLocale()
93
    {
94
        if ($user = $this->userProvider->bySession()) {
95
            return $user->language;
96
        }
97
98
        return null;
99
    }
100
}
101