LanguageHelper::detect_client_preference()   C
last analyzed

Complexity

Conditions 12
Paths 64

Size

Total Lines 51
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 24
CRAP Score 12

Importance

Changes 0
Metric Value
cc 12
eloc 22
nc 64
nop 3
dl 0
loc 51
ccs 24
cts 24
cp 1
crap 12
rs 5.6668
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Vendi\HttpLanguageHelper;
6
7
use Vendi\Shared\utils;
8
9
final class LanguageHelper
10
{
11
    private const KNOWN_BAD_KEY = '!!EMPTY!!';
12
13
    public const DEFAULT_KEY_VALUE = 'lang';
14
15
    public const KEY_FOR_POST = 'post';
16
17
    public const KEY_FOR_GET = 'get';
18
19
    public const KEY_FOR_COOKIES = 'cookie';
20
21
    public const KEY_FOR_SERVER = 'server';
22
23
    public const DEFAULT_KEY_VALUE_FOR_GET = self::DEFAULT_KEY_VALUE;
24
25
    public const DEFAULT_KEY_VALUE_FOR_POST = self::DEFAULT_KEY_VALUE;
26
27
    public const DEFAULT_KEY_VALUE_FOR_COOKIE = self::DEFAULT_KEY_VALUE;
28
29
    public const DEFAULT_KEY_VALUE_FOR_SERVER = 'HTTP_ACCEPT_LANGUAGE';
30
31 4
    public static function get_server_language_from_client_string(string $default_server_language, array $all_server_languages, string $client_string) : string
32
    {
33 4
        $client_languages = LanguageStringParser::create_from_string($client_string)->get_languages_ordered();
34 4
        if (0 === count($client_languages)) {
35
            //No client languages, return server default
36 4
            return $default_server_language;
37
        }
38
39 4
        $server_languages = LanguageStringParser::create_from_array($all_server_languages)->get_languages_ordered();
40 4
        if (0 === count($server_languages)) {
41
            //No server languages, return server default
42 1
            return $default_server_language;
43
        }
44
45
        //We've got at least one valid server language and one valid client language
46
47 4
        foreach ($client_languages as $client_lang) {
48
49
            //Look for exact matches first
50 4
            foreach ($server_languages as $server_lang) {
51 4
                if ($client_lang->get_language() === $server_lang->get_language() && $client_lang->get_variant() === $server_lang->get_variant()) {
52 4
                    return $server_lang->get_original();
53
                }
54
            }
55
56
            //Look for language-only matches next
57 3
            foreach ($server_languages as $server_lang) {
58 3
                if ($client_lang->get_language() === $server_lang->get_language()) {
59 3
                    return $server_lang->get_original();
60
                }
61
            }
62
        }
63
64 2
        return $default_server_language;
65
    }
66
67 3
    public static function get_default_keys() : array
68
    {
69
        return [
70 3
                    self::KEY_FOR_COOKIES => [ self::DEFAULT_KEY_VALUE_FOR_COOKIE ],
71 3
                    self::KEY_FOR_GET     => [ self::DEFAULT_KEY_VALUE_FOR_GET ],
72 3
                    self::KEY_FOR_POST    => [ self::DEFAULT_KEY_VALUE_FOR_POST ],
73 3
                    self::KEY_FOR_SERVER  => [ self::DEFAULT_KEY_VALUE_FOR_SERVER ],
74
            ];
75
    }
76
77 3
    public static function detect_client_preference(string $default_server_language, array $all_server_languages, array $keys = null)
78
    {
79 3
        if (! $keys) {
80 3
            $keys = self::get_default_keys();
81
        }
82
83 3
        $langs = [];
84
85
        //Search POST first
86 3
        if (utils::is_post() && array_key_exists(self::KEY_FOR_POST, $keys)) {
87 2
            foreach ($keys[self::KEY_FOR_POST] as $key) {
88 2
                $langs[] = self::get_server_language_from_client_string(self::KNOWN_BAD_KEY, $all_server_languages, utils::get_post_value($key));
89
            }
90
        }
91
92
        //Search GET second
93 3
        if (array_key_exists(self::KEY_FOR_GET, $keys)) {
94 3
            foreach ($keys[self::KEY_FOR_GET] as $key) {
95 3
                $langs[] = self::get_server_language_from_client_string(self::KNOWN_BAD_KEY, $all_server_languages, utils::get_get_value($key));
96
            }
97
        }
98
99
        //Search cookies third
100 3
        if (array_key_exists(self::KEY_FOR_COOKIES, $keys)) {
101 3
            foreach ($keys[self::KEY_FOR_COOKIES] as $key) {
102 3
                $langs[] = self::get_server_language_from_client_string(self::KNOWN_BAD_KEY, $all_server_languages, utils::get_cookie_value($key));
103
            }
104
        }
105
106
        //Search server vars last
107 3
        if (array_key_exists(self::KEY_FOR_SERVER, $keys)) {
108 3
            foreach ($keys[self::KEY_FOR_SERVER] as $key) {
109 3
                $langs[] = self::get_server_language_from_client_string(self::KNOWN_BAD_KEY, $all_server_languages, utils::get_server_value($key));
110
            }
111
        }
112
113
        //Remove known bad keys (which happen when a key search above can't find anything)
114 3
        $langs = array_filter(
115 3
                                $langs,
116 3
                                function ($lang) {
117 3
                                    return $lang !== self::KNOWN_BAD_KEY;
118 3
                                }
119
                            );
120
121
        //If we don't have anything return the default
122 3
        if (0 === count($langs)) {
123 1
            return $default_server_language;
124
        }
125
126
        //Return the first item found in the array
127 2
        return reset($langs);
128
    }
129
}
130