Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
153 / 153
100.00% covered (success)
100.00%
11 / 11
CRAP
100.00% covered (success)
100.00%
1 / 1
Language
100.00% covered (success)
100.00%
153 / 153
100.00% covered (success)
100.00%
11 / 11
16
100.00% covered (success)
100.00%
1 / 1
 label
100.00% covered (success)
100.00%
90 / 90
100.00% covered (success)
100.00%
1 / 1
1
 nativeName
100.00% covered (success)
100.00%
36 / 36
100.00% covered (success)
100.00%
1 / 1
1
 direction
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 isRightToLeft
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 baseLanguage
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 hasRegion
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 region
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 labelList
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 toArray
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 toArrayWithLabels
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 toArrayWithNativeNames
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3declare(strict_types=1);
4
5namespace DevToolbelt\Enums\Locale;
6
7use DevToolbelt\Enums\EnumInterface;
8
9enum Language: string implements EnumInterface
10{
11    // Arabic
12    case AR = 'ar';
13    case AR_SA = 'ar-SA';
14    case AR_EG = 'ar-EG';
15    case AR_AE = 'ar-AE';
16
17    // Chinese
18    case ZH = 'zh';
19    case ZH_CN = 'zh-CN';
20    case ZH_TW = 'zh-TW';
21    case ZH_HK = 'zh-HK';
22
23    // Czech
24    case CS = 'cs';
25    case CS_CZ = 'cs-CZ';
26
27    // Danish
28    case DA = 'da';
29    case DA_DK = 'da-DK';
30
31    // Dutch
32    case NL = 'nl';
33    case NL_NL = 'nl-NL';
34    case NL_BE = 'nl-BE';
35
36    // English
37    case EN = 'en';
38    case EN_US = 'en-US';
39    case EN_GB = 'en-GB';
40    case EN_AU = 'en-AU';
41    case EN_CA = 'en-CA';
42    case EN_NZ = 'en-NZ';
43    case EN_IE = 'en-IE';
44    case EN_ZA = 'en-ZA';
45    case EN_IN = 'en-IN';
46
47    // Finnish
48    case FI = 'fi';
49    case FI_FI = 'fi-FI';
50
51    // French
52    case FR = 'fr';
53    case FR_FR = 'fr-FR';
54    case FR_CA = 'fr-CA';
55    case FR_BE = 'fr-BE';
56    case FR_CH = 'fr-CH';
57
58    // German
59    case DE = 'de';
60    case DE_DE = 'de-DE';
61    case DE_AT = 'de-AT';
62    case DE_CH = 'de-CH';
63
64    // Greek
65    case EL = 'el';
66    case EL_GR = 'el-GR';
67
68    // Hebrew
69    case HE = 'he';
70    case HE_IL = 'he-IL';
71
72    // Hindi
73    case HI = 'hi';
74    case HI_IN = 'hi-IN';
75
76    // Hungarian
77    case HU = 'hu';
78    case HU_HU = 'hu-HU';
79
80    // Indonesian
81    case ID = 'id';
82    case ID_ID = 'id-ID';
83
84    // Italian
85    case IT = 'it';
86    case IT_IT = 'it-IT';
87    case IT_CH = 'it-CH';
88
89    // Japanese
90    case JA = 'ja';
91    case JA_JP = 'ja-JP';
92
93    // Korean
94    case KO = 'ko';
95    case KO_KR = 'ko-KR';
96
97    // Malay
98    case MS = 'ms';
99    case MS_MY = 'ms-MY';
100
101    // Norwegian
102    case NO = 'no';
103    case NB = 'nb';
104    case NB_NO = 'nb-NO';
105    case NN = 'nn';
106    case NN_NO = 'nn-NO';
107
108    // Polish
109    case PL = 'pl';
110    case PL_PL = 'pl-PL';
111
112    // Portuguese
113    case PT = 'pt';
114    case PT_BR = 'pt-BR';
115    case PT_PT = 'pt-PT';
116
117    // Romanian
118    case RO = 'ro';
119    case RO_RO = 'ro-RO';
120
121    // Russian
122    case RU = 'ru';
123    case RU_RU = 'ru-RU';
124
125    // Slovak
126    case SK = 'sk';
127    case SK_SK = 'sk-SK';
128
129    // Spanish
130    case ES = 'es';
131    case ES_ES = 'es-ES';
132    case ES_MX = 'es-MX';
133    case ES_AR = 'es-AR';
134    case ES_CO = 'es-CO';
135    case ES_CL = 'es-CL';
136    case ES_PE = 'es-PE';
137    case ES_VE = 'es-VE';
138
139    // Swedish
140    case SV = 'sv';
141    case SV_SE = 'sv-SE';
142
143    // Thai
144    case TH = 'th';
145    case TH_TH = 'th-TH';
146
147    // Turkish
148    case TR = 'tr';
149    case TR_TR = 'tr-TR';
150
151    // Ukrainian
152    case UK = 'uk';
153    case UK_UA = 'uk-UA';
154
155    // Vietnamese
156    case VI = 'vi';
157    case VI_VN = 'vi-VN';
158
159    public function label(): string
160    {
161        return match ($this) {
162            self::AR => 'Arabic',
163            self::AR_SA => 'Arabic (Saudi Arabia)',
164            self::AR_EG => 'Arabic (Egypt)',
165            self::AR_AE => 'Arabic (United Arab Emirates)',
166            self::ZH => 'Chinese',
167            self::ZH_CN => 'Chinese (Simplified)',
168            self::ZH_TW => 'Chinese (Traditional)',
169            self::ZH_HK => 'Chinese (Hong Kong)',
170            self::CS => 'Czech',
171            self::CS_CZ => 'Czech (Czech Republic)',
172            self::DA => 'Danish',
173            self::DA_DK => 'Danish (Denmark)',
174            self::NL => 'Dutch',
175            self::NL_NL => 'Dutch (Netherlands)',
176            self::NL_BE => 'Dutch (Belgium)',
177            self::EN => 'English',
178            self::EN_US => 'English (United States)',
179            self::EN_GB => 'English (United Kingdom)',
180            self::EN_AU => 'English (Australia)',
181            self::EN_CA => 'English (Canada)',
182            self::EN_NZ => 'English (New Zealand)',
183            self::EN_IE => 'English (Ireland)',
184            self::EN_ZA => 'English (South Africa)',
185            self::EN_IN => 'English (India)',
186            self::FI => 'Finnish',
187            self::FI_FI => 'Finnish (Finland)',
188            self::FR => 'French',
189            self::FR_FR => 'French (France)',
190            self::FR_CA => 'French (Canada)',
191            self::FR_BE => 'French (Belgium)',
192            self::FR_CH => 'French (Switzerland)',
193            self::DE => 'German',
194            self::DE_DE => 'German (Germany)',
195            self::DE_AT => 'German (Austria)',
196            self::DE_CH => 'German (Switzerland)',
197            self::EL => 'Greek',
198            self::EL_GR => 'Greek (Greece)',
199            self::HE => 'Hebrew',
200            self::HE_IL => 'Hebrew (Israel)',
201            self::HI => 'Hindi',
202            self::HI_IN => 'Hindi (India)',
203            self::HU => 'Hungarian',
204            self::HU_HU => 'Hungarian (Hungary)',
205            self::ID => 'Indonesian',
206            self::ID_ID => 'Indonesian (Indonesia)',
207            self::IT => 'Italian',
208            self::IT_IT => 'Italian (Italy)',
209            self::IT_CH => 'Italian (Switzerland)',
210            self::JA => 'Japanese',
211            self::JA_JP => 'Japanese (Japan)',
212            self::KO => 'Korean',
213            self::KO_KR => 'Korean (South Korea)',
214            self::MS => 'Malay',
215            self::MS_MY => 'Malay (Malaysia)',
216            self::NO => 'Norwegian',
217            self::NB => 'Norwegian Bokmål',
218            self::NB_NO => 'Norwegian Bokmål (Norway)',
219            self::NN => 'Norwegian Nynorsk',
220            self::NN_NO => 'Norwegian Nynorsk (Norway)',
221            self::PL => 'Polish',
222            self::PL_PL => 'Polish (Poland)',
223            self::PT => 'Portuguese',
224            self::PT_BR => 'Portuguese (Brazil)',
225            self::PT_PT => 'Portuguese (Portugal)',
226            self::RO => 'Romanian',
227            self::RO_RO => 'Romanian (Romania)',
228            self::RU => 'Russian',
229            self::RU_RU => 'Russian (Russia)',
230            self::SK => 'Slovak',
231            self::SK_SK => 'Slovak (Slovakia)',
232            self::ES => 'Spanish',
233            self::ES_ES => 'Spanish (Spain)',
234            self::ES_MX => 'Spanish (Mexico)',
235            self::ES_AR => 'Spanish (Argentina)',
236            self::ES_CO => 'Spanish (Colombia)',
237            self::ES_CL => 'Spanish (Chile)',
238            self::ES_PE => 'Spanish (Peru)',
239            self::ES_VE => 'Spanish (Venezuela)',
240            self::SV => 'Swedish',
241            self::SV_SE => 'Swedish (Sweden)',
242            self::TH => 'Thai',
243            self::TH_TH => 'Thai (Thailand)',
244            self::TR => 'Turkish',
245            self::TR_TR => 'Turkish (Turkey)',
246            self::UK => 'Ukrainian',
247            self::UK_UA => 'Ukrainian (Ukraine)',
248            self::VI => 'Vietnamese',
249            self::VI_VN => 'Vietnamese (Vietnam)',
250        };
251    }
252
253    public function nativeName(): string
254    {
255        return match ($this) {
256            self::AR, self::AR_SA, self::AR_EG, self::AR_AE => 'العربية',
257            self::ZH, self::ZH_CN => '简体中文',
258            self::ZH_TW, self::ZH_HK => '繁體中文',
259            self::CS, self::CS_CZ => 'Čeština',
260            self::DA, self::DA_DK => 'Dansk',
261            self::NL, self::NL_NL, self::NL_BE => 'Nederlands',
262            self::EN, self::EN_US, self::EN_GB, self::EN_AU, self::EN_CA,
263            self::EN_NZ, self::EN_IE, self::EN_ZA, self::EN_IN => 'English',
264            self::FI, self::FI_FI => 'Suomi',
265            self::FR, self::FR_FR, self::FR_CA, self::FR_BE, self::FR_CH => 'Français',
266            self::DE, self::DE_DE, self::DE_AT, self::DE_CH => 'Deutsch',
267            self::EL, self::EL_GR => 'Ελληνικά',
268            self::HE, self::HE_IL => 'עברית',
269            self::HI, self::HI_IN => 'हिन्दी',
270            self::HU, self::HU_HU => 'Magyar',
271            self::ID, self::ID_ID => 'Bahasa Indonesia',
272            self::IT, self::IT_IT, self::IT_CH => 'Italiano',
273            self::JA, self::JA_JP => '日本語',
274            self::KO, self::KO_KR => '한국어',
275            self::MS, self::MS_MY => 'Bahasa Melayu',
276            self::NO, self::NB, self::NB_NO => 'Norsk Bokmål',
277            self::NN, self::NN_NO => 'Norsk Nynorsk',
278            self::PL, self::PL_PL => 'Polski',
279            self::PT, self::PT_BR, self::PT_PT => 'Português',
280            self::RO, self::RO_RO => 'Română',
281            self::RU, self::RU_RU => 'Русский',
282            self::SK, self::SK_SK => 'Slovenčina',
283            self::ES, self::ES_ES, self::ES_MX, self::ES_AR, self::ES_CO,
284            self::ES_CL, self::ES_PE, self::ES_VE => 'Español',
285            self::SV, self::SV_SE => 'Svenska',
286            self::TH, self::TH_TH => 'ไทย',
287            self::TR, self::TR_TR => 'Türkçe',
288            self::UK, self::UK_UA => 'Українська',
289            self::VI, self::VI_VN => 'Tiếng Việt',
290        };
291    }
292
293    public function direction(): string
294    {
295        return match ($this) {
296            self::AR, self::AR_SA, self::AR_EG, self::AR_AE,
297            self::HE, self::HE_IL => 'rtl',
298            default => 'ltr',
299        };
300    }
301
302    public function isRightToLeft(): bool
303    {
304        return $this->direction() === 'rtl';
305    }
306
307    public function baseLanguage(): string
308    {
309        $value = $this->value;
310
311        if (str_contains($value, '-')) {
312            return explode('-', $value)[0];
313        }
314
315        return $value;
316    }
317
318    public function hasRegion(): bool
319    {
320        return str_contains($this->value, '-');
321    }
322
323    public function region(): ?string
324    {
325        if (!$this->hasRegion()) {
326            return null;
327        }
328
329        return explode('-', $this->value)[1];
330    }
331
332    /**
333     * @return string[]
334     */
335    public function labelList(): array
336    {
337        return array_map(fn (self $case) => $case->label(), self::cases());
338    }
339
340    /**
341     * @return array<string, string>
342     */
343    public static function toArray(): array
344    {
345        $result = [];
346
347        foreach (self::cases() as $language) {
348            $result[$language->value] = $language->value;
349        }
350
351        return $result;
352    }
353
354    /**
355     * @return array<string, string>
356     */
357    public static function toArrayWithLabels(): array
358    {
359        $result = [];
360
361        foreach (self::cases() as $language) {
362            $result[$language->value] = $language->label();
363        }
364
365        return $result;
366    }
367
368    /**
369     * @return array<string, string>
370     */
371    public static function toArrayWithNativeNames(): array
372    {
373        $result = [];
374
375        foreach (self::cases() as $language) {
376            $result[$language->value] = $language->nativeName();
377        }
378
379        return $result;
380    }
381}