Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
100.00% |
153 / 153 |
|
100.00% |
11 / 11 |
CRAP | |
100.00% |
1 / 1 |
| Language | |
100.00% |
153 / 153 |
|
100.00% |
11 / 11 |
16 | |
100.00% |
1 / 1 |
| label | |
100.00% |
90 / 90 |
|
100.00% |
1 / 1 |
1 | |||
| nativeName | |
100.00% |
36 / 36 |
|
100.00% |
1 / 1 |
1 | |||
| direction | |
100.00% |
5 / 5 |
|
100.00% |
1 / 1 |
1 | |||
| isRightToLeft | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| baseLanguage | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
2 | |||
| hasRegion | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| region | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
2 | |||
| labelList | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| toArray | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
2 | |||
| toArrayWithLabels | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
2 | |||
| toArrayWithNativeNames | |
100.00% |
4 / 4 |
|
100.00% |
1 / 1 |
2 | |||
| 1 | <?php |
| 2 | |
| 3 | declare(strict_types=1); |
| 4 | |
| 5 | namespace DevToolbelt\Enums\Locale; |
| 6 | |
| 7 | use DevToolbelt\Enums\EnumInterface; |
| 8 | |
| 9 | enum 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 | } |