Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
6 / 6
CRAP
100.00% covered (success)
100.00%
1 / 1
LanguageCodes
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
6 / 6
7
100.00% covered (success)
100.00%
1 / 1
 getAll
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getAllSorted
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 get
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getSupported
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
2
 getKey
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getAllSupported
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3/**
4 * The language codes class provides support for language codes in phpMyFAQ translations.
5 *
6 * This Source Code Form is subject to the terms of the Mozilla Public License,
7 * v. 2.0. If a copy of the MPL was not distributed with this file, You can
8 * obtain one at https://mozilla.org/MPL/2.0/.
9 *
10 * @package   phpMyFAQ
11 * @author    Thorsten Rinne <thorsten@phpmyfaq.de
12 * @copyright 2022-2026 phpMyFAQ Team
13 * @license   https://www.mozilla.org/MPL/2.0/ Mozilla Public License Version 2.0
14 * @link      https://www.phpmyfaq.de
15 * @since     2022-03-22
16 */
17
18declare(strict_types=1);
19
20namespace phpMyFAQ\Language;
21
22class LanguageCodes
23{
24    /**
25     * ISO 639 language code list with native language names
26     *
27     * @var array<string, string>
28     */
29    protected static array $languageCodes = [
30        'aa' => 'Qafar',
31        'ab' => 'Аԥсуа бызшәа',
32        'af' => 'Afrikaans',
33        'am' => 'አማርኛ',
34        'ar' => 'العربية',
35        'ar_ae' => 'العربية (الإمارات)',
36        'ar_bh' => 'العربية (البحرين)',
37        'ar_dz' => 'العربية (الجزائر)',
38        'ar_eg' => 'العربية (مصر)',
39        'ar_iq' => 'العربية (العراق)',
40        'ar_jo' => 'العربية (الأردن)',
41        'ar_kw' => 'العربية (الكويت)',
42        'ar_lb' => 'العربية (لبنان)',
43        'ar_ly' => 'العربية (ليبيا)',
44        'ar_ma' => 'العربية (المغرب)',
45        'ar_om' => 'العربية (عمان)',
46        'ar_qa' => 'العربية (قطر)',
47        'ar_sa' => 'العربية (السعودية)',
48        'ar_sy' => 'العربية (سوريا)',
49        'ar_tn' => 'العربية (تونس)',
50        'ar_ye' => 'العربية (اليمن)',
51        'as' => 'অসমীয়া',
52        'ay' => 'Aymar aru',
53        'az' => 'Azərbaycan dili',
54        'ba' => 'Башҡорт теле',
55        'be' => 'Беларуская',
56        'bg' => 'Български',
57        'bh' => 'भोजपुरी',
58        'bi' => 'Bislama',
59        'bn' => 'বাংলা',
60        'bo' => 'བོད་ཡིག',
61        'br' => 'Brezhoneg',
62        'bs' => 'Bosanski',
63        'ca' => 'Català',
64        'co' => 'Corsu',
65        'cs' => 'Čeština',
66        'cy' => 'Cymraeg',
67        'da' => 'Dansk',
68        'de' => 'Deutsch',
69        'de_at' => 'Deutsch (Österreich)',
70        'de_ch' => 'Deutsch (Schweiz)',
71        'de_li' => 'Deutsch (Liechtenstein)',
72        'de_lu' => 'Deutsch (Luxemburg)',
73        'div' => 'ދިވެހި',
74        'dz' => 'རྫོང་ཁ',
75        'el' => 'Ελληνικά',
76        'en' => 'English',
77        'en_au' => 'English (Australia)',
78        'en_bz' => 'English (Belize)',
79        'en_ca' => 'English (Canada)',
80        'en_gb' => 'English (United Kingdom)',
81        'en_ie' => 'English (Ireland)',
82        'en_jm' => 'English (Jamaica)',
83        'en_nz' => 'English (New Zealand)',
84        'en_ph' => 'English (Philippines)',
85        'en_tt' => 'English (Trinidad)',
86        'en_us' => 'English (United States)',
87        'en_za' => 'English (South Africa)',
88        'en_zw' => 'English (Zimbabwe)',
89        'eo' => 'Esperanto',
90        'es' => 'Español',
91        'es_ar' => 'Español (Argentina)',
92        'es_bo' => 'Español (Bolivia)',
93        'es_cl' => 'Español (Chile)',
94        'es_co' => 'Español (Colombia)',
95        'es_cr' => 'Español (Costa Rica)',
96        'es_do' => 'Español (República Dominicana)',
97        'es_ec' => 'Español (Ecuador)',
98        'es_es' => 'Español (España)',
99        'es_gt' => 'Español (Guatemala)',
100        'es_hn' => 'Español (Honduras)',
101        'es_mx' => 'Español (México)',
102        'es_ni' => 'Español (Nicaragua)',
103        'es_pa' => 'Español (Panamá)',
104        'es_pe' => 'Español (Perú)',
105        'es_pr' => 'Español (Puerto Rico)',
106        'es_py' => 'Español (Paraguay)',
107        'es_sv' => 'Español (El Salvador)',
108        'es_us' => 'Español (Estados Unidos)',
109        'es_uy' => 'Español (Uruguay)',
110        'es_ve' => 'Español (Venezuela)',
111        'et' => 'Eesti',
112        'eu' => 'Euskara',
113        'fa' => 'فارسی',
114        'fi' => 'Suomi',
115        'fj' => 'Vosa Vakaviti',
116        'fo' => 'Føroyskt',
117        'fr' => 'Français',
118        'fr_be' => 'Français (Belgique)',
119        'fr_ca' => 'Français (Canada)',
120        'fr_ch' => 'Français (Suisse)',
121        'fr_lu' => 'Français (Luxembourg)',
122        'fr_mc' => 'Français (Monaco)',
123        'fy' => 'Frysk',
124        'ga' => 'Gaeilge',
125        'gd' => 'Gàidhlig',
126        'gl' => 'Galego',
127        'gn' => "Avañe'ẽ",
128        'gu' => 'ગુજરાતી',
129        'ha' => 'Hausa',
130        'he' => 'עברית',
131        'hi' => 'हिन्दी',
132        'hr' => 'Hrvatski',
133        'hu' => 'Magyar',
134        'hy' => 'Հայերեն',
135        'ia' => 'Interlingua',
136        'id' => 'Bahasa Indonesia',
137        'ie' => 'Interlingue',
138        'ik' => 'Iñupiaq',
139        'in' => 'Bahasa Indonesia',
140        'is' => 'Íslenska',
141        'it' => 'Italiano',
142        'it_ch' => 'Italiano (Svizzera)',
143        'iw' => 'עברית',
144        'ja' => '日本語',
145        'ji' => 'ייִדיש',
146        'jw' => 'Basa Jawa',
147        'ka' => 'ქართული',
148        'kk' => 'Қазақ тілі',
149        'kl' => 'Kalaallisut',
150        'km' => 'ភាសាខ្មែរ',
151        'kn' => 'ಕನ್ನಡ',
152        'ko' => '한국어',
153        'kok' => 'कोंकणी',
154        'ks' => 'कश्मिरी',
155        'ku' => 'Kurdî',
156        'ky' => 'Кыргызча',
157        'kz' => 'Кыргызча',
158        'la' => 'Latina',
159        'ln' => 'Lingála',
160        'lo' => 'ລາວ',
161        'ls' => 'Slovenščina',
162        'lt' => 'Lietuvių',
163        'lv' => 'Latviešu',
164        'mg' => 'Malagasy',
165        'mi' => 'Te Reo Māori',
166        'mk' => 'Македонски',
167        'ml' => 'മലയാളം',
168        'mn' => 'Монгол',
169        'mo' => 'Moldovenească',
170        'mr' => 'मराठी',
171        'ms' => 'Bahasa Melayu',
172        'mt' => 'Malti',
173        'my' => 'ဗမာစာ',
174        'na' => 'Dorerin Naoero',
175        'nb' => 'Norsk (Bokmål)',
176        'nb_no' => 'Norsk (Bokmål)',
177        'ne' => 'नेपाली',
178        'nl' => 'Nederlands',
179        'nl_be' => 'Nederlands (België)',
180        'nn_no' => 'Norsk (Nynorsk)',
181        'no' => 'Norsk (Bokmål)',
182        'oc' => 'Occitan',
183        'om' => 'Oromoo',
184        'or' => 'ଓଡ଼ିଆ',
185        'pa' => 'ਪੰਜਾਬੀ',
186        'pl' => 'Polski',
187        'ps' => 'پښتو',
188        'pt' => 'Português',
189        'pt_br' => 'Português (Brasil)',
190        'qu' => 'Runa Simi',
191        'rm' => 'Rumantsch',
192        'rn' => 'Ikirundi',
193        'ro' => 'Română',
194        'ro_md' => 'Română (Moldova)',
195        'ru' => 'Русский',
196        'ru_md' => 'Русский (Молдова)',
197        'rw' => 'Kinyarwanda',
198        'sa' => 'संस्कृतम्',
199        'sb' => 'Serbšćina',
200        'sd' => 'سنڌي',
201        'sg' => 'Sängö',
202        'sh' => 'Srpskohrvatski',
203        'si' => 'සිංහල',
204        'sk' => 'Slovenčina',
205        'sl' => 'Slovenščina',
206        'sm' => "Gagana fa'a Samoa",
207        'sn' => 'chiShona',
208        'so' => 'Soomaali',
209        'sq' => 'Shqip',
210        'sr' => 'Српски',
211        'ss' => 'SiSwati',
212        'st' => 'Sesotho',
213        'su' => 'Basa Sunda',
214        'sv' => 'Svenska',
215        'sv_fi' => 'Svenska (Finland)',
216        'sw' => 'Kiswahili',
217        'sx' => 'Sesotho',
218        'syr' => 'ܣܘܪܝܝܐ',
219        'ta' => 'தமிழ்',
220        'te' => 'తెలుగు',
221        'tg' => 'Тоҷикӣ',
222        'th' => 'ไทย',
223        'ti' => 'ትግርኛ',
224        'tk' => 'Türkmen',
225        'tl' => 'Tagalog',
226        'tn' => 'Setswana',
227        'to' => 'Lea faka-Tonga',
228        'tr' => 'Türkçe',
229        'ts' => 'Xitsonga',
230        'tt' => 'Татар',
231        'tw' => 'Twi',
232        'uk' => 'Українська',
233        'ur' => 'اردو',
234        'uz' => 'Oʻzbekcha',
235        'vi' => 'Tiếng Việt',
236        'vo' => 'Volapük',
237        'wo' => 'Wolof',
238        'xh' => 'isiXhosa',
239        'yi' => 'ייִדיש',
240        'yo' => 'Yorùbá',
241        'zh' => '中文',
242        'zh_cn' => '中文 (中国)',
243        'zh_hk' => '中文 (香港)',
244        'zh_mo' => '中文 (澳門)',
245        'zh_sg' => '中文 (新加坡)',
246        'zh_tw' => '中文 (台灣)',
247        'zu' => 'isiZulu',
248    ];
249
250    /**
251     * phpMyFAQ supported language code list, this is a representation of phpMyFAQ translations
252     *
253     * @var array|string[]
254     */
255    protected static array $supportedLanguageCodes = [
256        'ar' => 'العربية',
257        'eu' => 'Euskara',
258        'bn' => 'বাংলা',
259        'bs' => 'Bosanski',
260        'zh' => '中文',
261        'cs' => 'Čeština',
262        'da' => 'Dansk',
263        'nl' => 'Nederlands',
264        'en' => 'English',
265        'fa' => 'فارسی',
266        'fi' => 'Suomi',
267        'fr' => 'Français',
268        'fr_ca' => 'Français (Canada)',
269        'de' => 'Deutsch',
270        'el' => 'Ελληνικά',
271        'he' => 'עברית',
272        'hi' => 'हिन्दी',
273        'hu' => 'Magyar',
274        'id' => 'Bahasa Indonesia',
275        'it' => 'Italiano',
276        'ja' => '日本語',
277        'ko' => '한국어',
278        'lv' => 'Latviešu',
279        'lt' => 'Lietuvių',
280        'ms' => 'Bahasa Melayu',
281        'mn' => 'Монгол',
282        'nb' => 'Norsk (Bokmål)',
283        'pl' => 'Polski',
284        'pt' => 'Português',
285        'pt_br' => 'Português (Brasil)',
286        'ro' => 'Română',
287        'ru' => 'Русский',
288        'sr' => 'Српски',
289        'sk' => 'Slovenčina',
290        'sl' => 'Slovenščina',
291        'es' => 'Español',
292        'sv' => 'Svenska',
293        'th' => 'ไทย',
294        'tr' => 'Türkçe',
295        'zh_tw' => '中文 (台灣)',
296        'uk' => 'Українська',
297        'ur' => 'اردو',
298        'vi' => 'Tiếng Việt',
299        'cy' => 'Cymraeg',
300    ];
301
302    /**
303     * Returns all language codes.
304     *
305     * @return array<string, string>
306     */
307    public static function getAll(): array
308    {
309        return static::$languageCodes;
310    }
311
312    public static function getAllSorted(): array
313    {
314        $sortedLanguageCodes = static::$languageCodes;
315        asort($sortedLanguageCodes);
316        return $sortedLanguageCodes;
317    }
318
319    /**
320     * Return language name from language code.
321     *
322     * @return string|null → language code or null
323     */
324    public static function get(string $key): ?string
325    {
326        return static::$languageCodes[strtolower($key)] ?? null;
327    }
328
329    /**
330     * Return language name from a phpMyFAQ supported language code.
331     *
332     * @return string|null → language code or null
333     */
334    public static function getSupported(string $key): ?string
335    {
336        $supported = static::$supportedLanguageCodes[strtolower($key)] ?? null;
337
338        return is_string($supported) ? $supported : null;
339    }
340
341    public static function getKey(string $value): false|int|string
342    {
343        return array_search($value, static::$languageCodes, strict: true);
344    }
345
346    public static function getAllSupported(): array
347    {
348        return static::$supportedLanguageCodes;
349    }
350}