Passed
Push — master ( 81593c...33129c )
by Alexey
10:12 queued 12s
created

LocaleHelper::isDependOnDevice()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 3
c 1
b 0
f 0
dl 0
loc 6
ccs 4
cts 4
cp 1
rs 10
cc 2
nc 2
nop 2
crap 2
1
<?php
2
3
/** @noinspection SpellCheckingInspection */
4
declare(strict_types=1);
5
6
/*
7
 * Copyright (c) Ne-Lexa
8
 *
9
 * For the full copyright and license information, please view
10
 * the LICENSE file that was distributed with this source code.
11
 *
12
 * @see https://github.com/Ne-Lexa/google-play-scraper
13
 */
14
15
namespace Nelexa\GPlay\Util;
16
17
/**
18
 * Class LocaleHelper.
19
 */
20
class LocaleHelper
21
{
22
    public const DEFAULT_GOOGLE_PLAY_LOCALE = 'en_US';
23
24
    public const SUPPORTED_LOCALES = [
25
        'en_us' => 'en_US', // English (United States)
26
        'af' => 'af', // Afrikaans
27
        'am' => 'am', // Amharic
28
        'ar' => 'ar', // Arabic
29
        'az_az' => 'az_AZ', // Azerbaijani
30
        'be' => 'be', // Belarusian
31
        'bg' => 'bg', // Bulgarian
32
        'bn_bd' => 'bn_BD', // Bengali
33
        'ca' => 'ca', // Catalan
34
        'cs_cz' => 'cs_CZ', // Czech
35
        'da_dk' => 'da_DK', // Danish
36
        'de_de' => 'de_DE', // German
37
        'el_gr' => 'el_GR', // Greek
38
        'en_au' => 'en_AU', // English (Australia)
39
        'en_ca' => 'en_CA', // English (Canada)
40
        'en_gb' => 'en_GB', // English (United Kingdom)
41
        'en_in' => 'en_IN', // English (India)
42
        'en_sg' => 'en_SG', // English (Singapore)
43
        'en_za' => 'en_ZA', // English (South Africa)
44
        'es_419' => 'es_419', // Spanish (Latin America)
45
        'es_es' => 'es_ES', // Spanish (Spain)
46
        'es_us' => 'es_US', // Spanish (United States)
47
        'et' => 'et', // Estonian
48
        'eu_es' => 'eu_ES', // Basque
49
        'fa' => 'fa', // Persian
50
        'fi_fi' => 'fi_FI', // Finnish
51
        'fil' => 'fil', // Filipino
52
        'fr_ca' => 'fr_CA', // French (Canada)
53
        'fr_fr' => 'fr_FR', // French
54
        'gl_es' => 'gl_ES', // Galician
55
        'hi_in' => 'hi_IN', // Hindi
56
        'hr' => 'hr', // Croatian
57
        'hu_hu' => 'hu_HU', // Hungarian
58
        'hy_am' => 'hy_AM', // Armenian
59
        'id' => 'id', // Indonesian
60
        'is_is' => 'is_IS', // Icelandic
61
        'it_it' => 'it_IT', // Italian
62
        'iw_il' => 'iw_IL', // Hebrew
63
        'ja_jp' => 'ja_JP', // Japanese
64
        'ka_ge' => 'ka_GE', // Georgian
65
        'kk' => 'kk', // Kazakh
66
        'km_kh' => 'km_KH', // Khmer
67
        'kn_in' => 'kn_IN', // Kannada
68
        'ko_kr' => 'ko_KR', // Korean (South Korea)
69
        'ky_kg' => 'ky_KG', // Kyrgyz
70
        'lo_la' => 'lo_LA', // Lao
71
        'lt' => 'lt', // Lithuanian
72
        'lv' => 'lv', // Latvian
73
        'mk_mk' => 'mk_MK', // Macedonian
74
        'ml_in' => 'ml_IN', // Malayalam
75
        'mn_mn' => 'mn_MN', // Mongolian
76
        'mr_in' => 'mr_IN', // Marathi
77
        'ms' => 'ms', // Malay
78
        'my_mm' => 'my_MM', // Burmese
79
        'ne_np' => 'ne_NP', // Nepali
80
        'nl_nl' => 'nl_NL', // Dutch
81
        'no_no' => 'no_NO', // Norwegian
82
        'pl_pl' => 'pl_PL', // Polish
83
        'pt_br' => 'pt_BR', // Portuguese (Brazil)
84
        'pt_pt' => 'pt_PT', // Portuguese (Portugal)
85
        'ro' => 'ro', // Romanian
86
        'ru_ru' => 'ru_RU', // Russian
87
        'si_lk' => 'si_LK', // Sinhala
88
        'sk' => 'sk', // Slovak
89
        'sl' => 'sl', // Slovenian
90
        'sr' => 'sr', // Serbian
91
        'sv_se' => 'sv_SE', // Swedish
92
        'sw' => 'sw', // Swahili
93
        'ta_in' => 'ta_IN', // Tamil
94
        'te_in' => 'te_IN', // Telugu
95
        'th' => 'th', // Thai
96
        'tr_tr' => 'tr_TR', // Turkish
97
        'uk' => 'uk', // Ukrainian
98
        'vi' => 'vi', // Vietnamese
99
        'zh_cn' => 'zh_CN', // Chinese (Simplified)
100
        'zh_hk' => 'zh_HK', // Chinese (Hong Kong)
101
        'zh_tw' => 'zh_TW', // Chinese (Traditional)
102
        'zu' => 'zu', // Zulu
103
    ];
104
105
    private const ALIASES_LOCALE = [
106
        'az' => 'az_AZ',
107
        'bn' => 'bn_BD',
108
        'bo' => 'zh_TW',
109
        'bo_cn' => 'zh_TW',
110
        'bo_in' => 'zh_TW',
111
        'br' => 'fr_FR',
112
        'ckb' => 'ar',
113
        'cs' => 'cs_CZ',
114
        'da' => 'da_DK',
115
        'de' => 'de_DE',
116
        'el' => 'el_GR',
117
        'en' => 'en_US',
118
        'en_001' => 'en_AU',
119
        'en_150' => 'en_AU',
120
        'en_ae' => 'en_AU',
121
        'en_ag' => 'en_AU',
122
        'en_ai' => 'en_AU',
123
        'en_as' => 'en_AU',
124
        'en_at' => 'en_AU',
125
        'en_bb' => 'en_AU',
126
        'en_be' => 'en_AU',
127
        'en_bi' => 'en_AU',
128
        'en_bm' => 'en_AU',
129
        'en_bs' => 'en_AU',
130
        'en_bw' => 'en_AU',
131
        'en_bz' => 'en_AU',
132
        'en_cc' => 'en_AU',
133
        'en_ch' => 'en_AU',
134
        'en_ck' => 'en_AU',
135
        'en_cm' => 'en_AU',
136
        'en_cx' => 'en_AU',
137
        'en_cy' => 'en_AU',
138
        'en_de' => 'en_AU',
139
        'en_dg' => 'en_AU',
140
        'en_dk' => 'en_AU',
141
        'en_dm' => 'en_AU',
142
        'en_er' => 'en_AU',
143
        'en_ie' => 'en_AU',
144
        'en_fi' => 'en_AU',
145
        'en_fj' => 'en_AU',
146
        'en_fk' => 'en_AU',
147
        'en_fm' => 'en_AU',
148
        'en_gd' => 'en_AU',
149
        'en_gg' => 'en_AU',
150
        'en_gh' => 'en_AU',
151
        'en_gi' => 'en_AU',
152
        'en_gm' => 'en_AU',
153
        'en_gu' => 'en_AU',
154
        'en_gy' => 'en_AU',
155
        'en_hk' => 'en_AU',
156
        'en_il' => 'en_AU',
157
        'en_im' => 'en_AU',
158
        'en_io' => 'en_AU',
159
        'en_je' => 'en_AU',
160
        'en_jm' => 'en_AU',
161
        'en_ke' => 'en_AU',
162
        'en_ki' => 'en_AU',
163
        'en_kn' => 'en_AU',
164
        'en_ky' => 'en_AU',
165
        'en_lc' => 'en_AU',
166
        'en_lr' => 'en_AU',
167
        'en_ls' => 'en_AU',
168
        'en_mg' => 'en_AU',
169
        'en_mh' => 'en_AU',
170
        'en_mo' => 'en_AU',
171
        'en_mp' => 'en_AU',
172
        'en_ms' => 'en_AU',
173
        'en_mt' => 'en_AU',
174
        'en_mu' => 'en_AU',
175
        'en_mw' => 'en_AU',
176
        'en_my' => 'en_AU',
177
        'en_na' => 'en_AU',
178
        'en_nf' => 'en_AU',
179
        'en_ng' => 'en_AU',
180
        'en_nl' => 'en_AU',
181
        'en_nr' => 'en_AU',
182
        'en_nu' => 'en_AU',
183
        'en_nz' => 'en_AU',
184
        'en_pg' => 'en_AU',
185
        'en_ph' => 'en_AU',
186
        'en_pk' => 'en_AU',
187
        'en_pn' => 'en_AU',
188
        'en_pr' => 'en_AU',
189
        'en_pw' => 'en_AU',
190
        'en_rw' => 'en_AU',
191
        'en_sb' => 'en_AU',
192
        'en_sc' => 'en_AU',
193
        'en_sd' => 'en_AU',
194
        'en_se' => 'en_AU',
195
        'en_sh' => 'en_AU',
196
        'en_si' => 'en_AU',
197
        'en_sl' => 'en_AU',
198
        'en_ss' => 'en_AU',
199
        'en_sx' => 'en_AU',
200
        'en_sz' => 'en_AU',
201
        'en_tc' => 'en_AU',
202
        'en_tk' => 'en_AU',
203
        'en_to' => 'en_AU',
204
        'en_tt' => 'en_AU',
205
        'en_tv' => 'en_AU',
206
        'en_tz' => 'en_AU',
207
        'en_ug' => 'en_AU',
208
        'en_um' => 'en_AU',
209
        'en_us_posix' => 'en_US',
210
        'en_vc' => 'en_AU',
211
        'en_vg' => 'en_AU',
212
        'en_vi' => 'en_AU',
213
        'en_vu' => 'en_AU',
214
        'en_ws' => 'en_AU',
215
        'en_zm' => 'en_AU',
216
        'en_zw' => 'en_AU',
217
        'es' => 'es_ES',
218
        'es_br' => 'es_419',
219
        'es_bz' => 'es_419',
220
        'es_cu' => 'es_419',
221
        'eu' => 'eu_ES',
222
        'fi' => 'fi_FI',
223
        'fil' => 'fil',
224
        'fo' => 'da_DK',
225
        'fr' => 'fr_FR',
226
        'fr_bl' => 'fr_CA',
227
        'fr_gf' => 'fr_CA',
228
        'fr_gp' => 'fr_CA',
229
        'fr_ht' => 'fr_CA',
230
        'fr_mf' => 'fr_CA',
231
        'fr_mq' => 'fr_CA',
232
        'fr_pm' => 'fr_CA',
233
        'fy' => 'nl_NL',
234
        'gl' => 'gl_ES',
235
        'he' => 'iw_IL',
236
        'hi' => 'hi_IN',
237
        'hu' => 'hu_HU',
238
        'hy' => 'hy_AM',
239
        'in' => 'id',
240
        'is' => 'is_IS',
241
        'it' => 'it_IT',
242
        'iw' => 'iw_IL',
243
        'ja' => 'ja_JP',
244
        'jv' => 'id',
245
        'ka' => 'ka_GE',
246
        'km' => 'km_KH',
247
        'kn' => 'kn_IN',
248
        'ko' => 'ko_KR',
249
        'ku' => 'tr_TR',
250
        'ky' => 'ky_KG',
251
        'lo' => 'lo_LA',
252
        'mg' => 'fr_FR',
253
        'mk' => 'mk_MK',
254
        'ml' => 'ml_IN',
255
        'mn' => 'mn_MN',
256
        'mo' => 'ro',
257
        'mr' => 'mr_IN',
258
        'mt' => 'en_GB',
259
        'mt_mt' => 'en_GB',
260
        'my' => 'my_MM',
261
        'nb' => 'no_NO',
262
        'ne' => 'ne_NP',
263
        'nl' => 'nl_NL',
264
        'nn' => 'no_NO',
265
        'no' => 'no_NO',
266
        'or' => 'en_GB',
267
        'or_in' => 'en_GB',
268
        'pl' => 'pl_PL',
269
        'ps' => 'en_GB',
270
        'ps_af' => 'en_GB',
271
        'pt' => 'pt_PT',
272
        'pt_ao' => 'pt_PT',
273
        'pt_ch' => 'pt_PT',
274
        'pt_cv' => 'pt_PT',
275
        'pt_gq' => 'pt_PT',
276
        'pt_gw' => 'pt_PT',
277
        'pt_lu' => 'pt_PT',
278
        'pt_mo' => 'pt_PT',
279
        'pt_mz' => 'pt_PT',
280
        'pt_st' => 'pt_PT',
281
        'pt_tl' => 'pt_PT',
282
        'qu' => 'es_419',
283
        'qu_bo' => 'es_419',
284
        'qu_ec' => 'es_419',
285
        'qu_pe' => 'es_419',
286
        'rm' => 'de_DE',
287
        'ro' => 'ro',
288
        'ru' => 'ru_RU',
289
        'rw' => 'fr_FR',
290
        'sh' => 'sr',
291
        'sh_ba' => 'sr',
292
        'sh_cs' => 'sr',
293
        'sh_yu' => 'sr',
294
        'si' => 'si_LK',
295
        'sv' => 'sv_SE',
296
        'ta' => 'ta_IN',
297
        'te' => 'te_IN',
298
        'tg' => 'ru_RU',
299
        'ti' => 'en_GB',
300
        'ti_er' => 'en_GB',
301
        'ti_et' => 'en_GB',
302
        'tk' => 'ru_RU',
303
        'tl' => 'fil',
304
        'tr' => 'tr_TR',
305
        'tt' => 'ru_RU',
306
        'ug' => 'zh_CN',
307
        'ug_cn' => 'zh_CN',
308
        'wo' => 'fr_FR',
309
        'zh' => 'zh_CN',
310
        'zh_hans_cn' => 'zh_CN',
311
        'zh_hant' => 'zh_TW',
312
        'zh_hant_hk' => 'zh_HK',
313
        'zh_hant_mo' => 'zh_HK',
314
        'zh_hant_tw' => 'zh_TW',
315
        'zh_mo' => 'zh_HK',
316
    ];
317
318
    /**
319
     * Normalizes the locale.
320
     *
321
     * @param string $locale
322
     *
323
     * @return string
324
     */
325 1797
    public static function getNormalizeLocale(string $locale): string
326
    {
327 1797
        if ($locale === '') {
328 1
            return self::DEFAULT_GOOGLE_PLAY_LOCALE;
329
        }
330 1797
        $locale = str_replace('-', '_', strtolower($locale));
331
332 1797
        if (isset(self::SUPPORTED_LOCALES[$locale])) {
333 1076
            return self::SUPPORTED_LOCALES[$locale];
334
        }
335
336 728
        if (isset(self::ALIASES_LOCALE[$locale])) {
337 215
            return self::ALIASES_LOCALE[$locale];
338
        }
339
340 514
        if (($pos = strpos($locale, '_')) !== false) {
341 395
            $locale = substr($locale, 0, $pos);
342
343 395
            if (isset(self::SUPPORTED_LOCALES[$locale])) {
344 83
                return self::SUPPORTED_LOCALES[$locale];
345
            }
346
347 312
            if (isset(self::ALIASES_LOCALE[$locale])) {
348 125
                return self::ALIASES_LOCALE[$locale];
349
            }
350
        }
351
352 306
        return self::DEFAULT_GOOGLE_PLAY_LOCALE;
353
    }
354
355
    /**
356
     * Normalizes the locales.
357
     *
358
     * @param array $locales
359
     *
360
     * @return array
361
     */
362 1
    public static function getNormalizeLocales(array $locales): array
363
    {
364 1
        $locales = !empty($locales) ? $locales : self::SUPPORTED_LOCALES;
365 1
        $locales = array_map([self::class, 'getNormalizeLocale'], $locales);
366
367 1
        return array_values(array_unique($locales));
368
    }
369
}
370