Passed
Push — 6.0 ( 4cc368...44c261 )
by Olivier
01:44
created

LocaleId   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 641
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 585
dl 0
loc 641
rs 10
c 0
b 0
f 0
wmc 7
1
<?php
2
3
/**
4
 * CODE GENERATED; DO NOT EDIT.
5
 *
6
 * {@see \ICanBoogie\CLDR\Generator\Command\GenerateLocaleId}
7
 */
8
9
namespace ICanBoogie\CLDR;
10
11
final class LocaleId
12
{
13
    /**
14
     * Whether a locale ID is available.
15
     *
16
     * @param string $value
17
     *     A locale identifier; for example, fr-BE
18
     */
19
    public static function is_available(string $value): bool
20
    {
21
        if (isset(self::PARENT_LOCALES[$value])) {
22
            return true;
23
        }
24
25
        return in_array($value, self::AVAILABLE_LOCALES);
26
    }
27
28
    /**
29
     * @param string $value
30
     *     A locale identifier; for example, fr-BE
31
     *
32
     * @throws LocaleNotAvailable
33
     */
34
    public static function assert_is_available(string $value): void
35
    {
36
        self::is_available($value)
37
            or throw new LocaleNotAvailable($value);
38
    }
39
40
    /**
41
     * Returns a {@see LocaleId} of a value.
42
     *
43
     * Note: If the locale has a parent locale, that locale is used instead.
44
     *
45
     * @param string $value
46
     *     A locale identifier; for example, fr-BE
47
     *
48
     * @throws LocaleNotAvailable
49
     */
50
    public static function of(string $value): self
51
    {
52
        static $instances;
53
54
        self::assert_is_available($value);
55
56
        if (isset(self::PARENT_LOCALES[$value])) {
57
            $value = self::PARENT_LOCALES[$value];
58
        }
59
60
        return $instances[$value] ??= new self($value);
61
    }
62
63
    private function __construct(
64
        public readonly string $value,
65
    ) {
66
    }
67
68
    /**
69
     * @link https://github.com/unicode-org/cldr-json/blob/45.0.0/cldr-json/cldr-core/supplemental/parentLocales.json
70
     */
71
    public const PARENT_LOCALES =
72
        [
73
            'en-150' => 'en-001',
74
            'en-AG' => 'en-001',
75
            'en-AI' => 'en-001',
76
            'en-AU' => 'en-001',
77
            'en-BB' => 'en-001',
78
            'en-BM' => 'en-001',
79
            'en-BS' => 'en-001',
80
            'en-BW' => 'en-001',
81
            'en-BZ' => 'en-001',
82
            'en-CC' => 'en-001',
83
            'en-CK' => 'en-001',
84
            'en-CM' => 'en-001',
85
            'en-CX' => 'en-001',
86
            'en-CY' => 'en-001',
87
            'en-DG' => 'en-001',
88
            'en-DM' => 'en-001',
89
            'en-ER' => 'en-001',
90
            'en-FJ' => 'en-001',
91
            'en-FK' => 'en-001',
92
            'en-FM' => 'en-001',
93
            'en-GB' => 'en-001',
94
            'en-GD' => 'en-001',
95
            'en-GG' => 'en-001',
96
            'en-GH' => 'en-001',
97
            'en-GI' => 'en-001',
98
            'en-GM' => 'en-001',
99
            'en-GY' => 'en-001',
100
            'en-HK' => 'en-001',
101
            'en-ID' => 'en-001',
102
            'en-IE' => 'en-001',
103
            'en-IL' => 'en-001',
104
            'en-IM' => 'en-001',
105
            'en-IN' => 'en-001',
106
            'en-IO' => 'en-001',
107
            'en-JE' => 'en-001',
108
            'en-JM' => 'en-001',
109
            'en-KE' => 'en-001',
110
            'en-KI' => 'en-001',
111
            'en-KN' => 'en-001',
112
            'en-KY' => 'en-001',
113
            'en-LC' => 'en-001',
114
            'en-LR' => 'en-001',
115
            'en-LS' => 'en-001',
116
            'en-MG' => 'en-001',
117
            'en-MO' => 'en-001',
118
            'en-MS' => 'en-001',
119
            'en-MT' => 'en-001',
120
            'en-MU' => 'en-001',
121
            'en-MV' => 'en-001',
122
            'en-MW' => 'en-001',
123
            'en-MY' => 'en-001',
124
            'en-NA' => 'en-001',
125
            'en-NF' => 'en-001',
126
            'en-NG' => 'en-001',
127
            'en-NR' => 'en-001',
128
            'en-NU' => 'en-001',
129
            'en-NZ' => 'en-001',
130
            'en-PG' => 'en-001',
131
            'en-PK' => 'en-001',
132
            'en-PN' => 'en-001',
133
            'en-PW' => 'en-001',
134
            'en-RW' => 'en-001',
135
            'en-SB' => 'en-001',
136
            'en-SC' => 'en-001',
137
            'en-SD' => 'en-001',
138
            'en-SG' => 'en-001',
139
            'en-SH' => 'en-001',
140
            'en-SL' => 'en-001',
141
            'en-SS' => 'en-001',
142
            'en-SX' => 'en-001',
143
            'en-SZ' => 'en-001',
144
            'en-TC' => 'en-001',
145
            'en-TK' => 'en-001',
146
            'en-TO' => 'en-001',
147
            'en-TT' => 'en-001',
148
            'en-TV' => 'en-001',
149
            'en-TZ' => 'en-001',
150
            'en-UG' => 'en-001',
151
            'en-VC' => 'en-001',
152
            'en-VG' => 'en-001',
153
            'en-VU' => 'en-001',
154
            'en-WS' => 'en-001',
155
            'en-ZA' => 'en-001',
156
            'en-ZM' => 'en-001',
157
            'en-ZW' => 'en-001',
158
            'en-AT' => 'en-150',
159
            'en-BE' => 'en-150',
160
            'en-CH' => 'en-150',
161
            'en-DE' => 'en-150',
162
            'en-DK' => 'en-150',
163
            'en-FI' => 'en-150',
164
            'en-NL' => 'en-150',
165
            'en-SE' => 'en-150',
166
            'en-SI' => 'en-150',
167
            'hi-Latn' => 'en-IN',
168
            'es-AR' => 'es-419',
169
            'es-BO' => 'es-419',
170
            'es-BR' => 'es-419',
171
            'es-BZ' => 'es-419',
172
            'es-CL' => 'es-419',
173
            'es-CO' => 'es-419',
174
            'es-CR' => 'es-419',
175
            'es-CU' => 'es-419',
176
            'es-DO' => 'es-419',
177
            'es-EC' => 'es-419',
178
            'es-GT' => 'es-419',
179
            'es-HN' => 'es-419',
180
            'es-JP' => 'es-419',
181
            'es-MX' => 'es-419',
182
            'es-NI' => 'es-419',
183
            'es-PA' => 'es-419',
184
            'es-PE' => 'es-419',
185
            'es-PR' => 'es-419',
186
            'es-PY' => 'es-419',
187
            'es-SV' => 'es-419',
188
            'es-US' => 'es-419',
189
            'es-UY' => 'es-419',
190
            'es-VE' => 'es-419',
191
            'ht' => 'fr-HT',
192
            'nb' => 'no',
193
            'nn' => 'no',
194
            'no-NO' => 'no',
195
            'pt-AO' => 'pt-PT',
196
            'pt-CH' => 'pt-PT',
197
            'pt-CV' => 'pt-PT',
198
            'pt-FR' => 'pt-PT',
199
            'pt-GQ' => 'pt-PT',
200
            'pt-GW' => 'pt-PT',
201
            'pt-LU' => 'pt-PT',
202
            'pt-MO' => 'pt-PT',
203
            'pt-MZ' => 'pt-PT',
204
            'pt-ST' => 'pt-PT',
205
            'pt-TL' => 'pt-PT',
206
            'az-Arab' => 'und',
207
            'az-Cyrl' => 'und',
208
            'bal-Latn' => 'und',
209
            'blt-Latn' => 'und',
210
            'bm-Nkoo' => 'und',
211
            'bs-Cyrl' => 'und',
212
            'byn-Latn' => 'und',
213
            'cu-Glag' => 'und',
214
            'dje-Arab' => 'und',
215
            'dyo-Arab' => 'und',
216
            'en-Dsrt' => 'und',
217
            'en-Shaw' => 'und',
218
            'ff-Adlm' => 'und',
219
            'ff-Arab' => 'und',
220
            'ha-Arab' => 'und',
221
            'iu-Latn' => 'und',
222
            'kk-Arab' => 'und',
223
            'ks-Deva' => 'und',
224
            'ku-Arab' => 'und',
225
            'kxv-Deva' => 'und',
226
            'kxv-Orya' => 'und',
227
            'kxv-Telu' => 'und',
228
            'ky-Arab' => 'und',
229
            'ky-Latn' => 'und',
230
            'ml-Arab' => 'und',
231
            'mn-Mong' => 'und',
232
            'mni-Mtei' => 'und',
233
            'ms-Arab' => 'und',
234
            'pa-Arab' => 'und',
235
            'sat-Deva' => 'und',
236
            'sd-Deva' => 'und',
237
            'sd-Khoj' => 'und',
238
            'sd-Sind' => 'und',
239
            'shi-Latn' => 'und',
240
            'so-Arab' => 'und',
241
            'sr-Latn' => 'und',
242
            'sw-Arab' => 'und',
243
            'tg-Arab' => 'und',
244
            'ug-Cyrl' => 'und',
245
            'uz-Arab' => 'und',
246
            'uz-Cyrl' => 'und',
247
            'vai-Latn' => 'und',
248
            'wo-Arab' => 'und',
249
            'yo-Arab' => 'und',
250
            'yue-Hans' => 'und',
251
            'zh-Hant' => 'und',
252
            'zh-Hant-MO' => 'zh-Hant-HK',
253
        ];
254
255
    /**
256
     * @link https://github.com/unicode-org/cldr-json/blob/45.0.0/cldr-json/cldr-core/availableLocales.json
257
     */
258
    public const AVAILABLE_LOCALES =
259
        [
260
            'af',
261
            'af-NA',
262
            'am',
263
            'ar',
264
            'ar-AE',
265
            'ar-BH',
266
            'ar-DJ',
267
            'ar-DZ',
268
            'ar-EG',
269
            'ar-EH',
270
            'ar-ER',
271
            'ar-IL',
272
            'ar-IQ',
273
            'ar-JO',
274
            'ar-KM',
275
            'ar-KW',
276
            'ar-LB',
277
            'ar-LY',
278
            'ar-MA',
279
            'ar-MR',
280
            'ar-OM',
281
            'ar-PS',
282
            'ar-QA',
283
            'ar-SA',
284
            'ar-SD',
285
            'ar-SO',
286
            'ar-SS',
287
            'ar-SY',
288
            'ar-TD',
289
            'ar-TN',
290
            'ar-YE',
291
            'as',
292
            'az',
293
            'az-Latn',
294
            'be',
295
            'be-tarask',
296
            'bg',
297
            'bn',
298
            'bn-IN',
299
            'bs',
300
            'bs-Latn',
301
            'ca',
302
            'ca-AD',
303
            'ca-ES-valencia',
304
            'ca-FR',
305
            'ca-IT',
306
            'chr',
307
            'cs',
308
            'cy',
309
            'da',
310
            'da-GL',
311
            'de',
312
            'de-AT',
313
            'de-BE',
314
            'de-CH',
315
            'de-IT',
316
            'de-LI',
317
            'de-LU',
318
            'dsb',
319
            'el',
320
            'el-CY',
321
            'el-polyton',
322
            'en',
323
            'en-001',
324
            'en-150',
325
            'en-AE',
326
            'en-AG',
327
            'en-AI',
328
            'en-AS',
329
            'en-AT',
330
            'en-AU',
331
            'en-BB',
332
            'en-BE',
333
            'en-BI',
334
            'en-BM',
335
            'en-BS',
336
            'en-BW',
337
            'en-BZ',
338
            'en-CA',
339
            'en-CC',
340
            'en-CH',
341
            'en-CK',
342
            'en-CM',
343
            'en-CX',
344
            'en-CY',
345
            'en-DE',
346
            'en-DG',
347
            'en-DK',
348
            'en-DM',
349
            'en-ER',
350
            'en-FI',
351
            'en-FJ',
352
            'en-FK',
353
            'en-FM',
354
            'en-GB',
355
            'en-GD',
356
            'en-GG',
357
            'en-GH',
358
            'en-GI',
359
            'en-GM',
360
            'en-GU',
361
            'en-GY',
362
            'en-HK',
363
            'en-ID',
364
            'en-IE',
365
            'en-IL',
366
            'en-IM',
367
            'en-IN',
368
            'en-IO',
369
            'en-JE',
370
            'en-JM',
371
            'en-KE',
372
            'en-KI',
373
            'en-KN',
374
            'en-KY',
375
            'en-LC',
376
            'en-LR',
377
            'en-LS',
378
            'en-MG',
379
            'en-MH',
380
            'en-MO',
381
            'en-MP',
382
            'en-MS',
383
            'en-MT',
384
            'en-MU',
385
            'en-MV',
386
            'en-MW',
387
            'en-MY',
388
            'en-NA',
389
            'en-NF',
390
            'en-NG',
391
            'en-NL',
392
            'en-NR',
393
            'en-NU',
394
            'en-NZ',
395
            'en-PG',
396
            'en-PH',
397
            'en-PK',
398
            'en-PN',
399
            'en-PR',
400
            'en-PW',
401
            'en-RW',
402
            'en-SB',
403
            'en-SC',
404
            'en-SD',
405
            'en-SE',
406
            'en-SG',
407
            'en-SH',
408
            'en-SI',
409
            'en-SL',
410
            'en-SS',
411
            'en-SX',
412
            'en-SZ',
413
            'en-TC',
414
            'en-TK',
415
            'en-TO',
416
            'en-TT',
417
            'en-TV',
418
            'en-TZ',
419
            'en-UG',
420
            'en-UM',
421
            'en-VC',
422
            'en-VG',
423
            'en-VI',
424
            'en-VU',
425
            'en-WS',
426
            'en-ZA',
427
            'en-ZM',
428
            'en-ZW',
429
            'es',
430
            'es-419',
431
            'es-AR',
432
            'es-BO',
433
            'es-BR',
434
            'es-BZ',
435
            'es-CL',
436
            'es-CO',
437
            'es-CR',
438
            'es-CU',
439
            'es-DO',
440
            'es-EA',
441
            'es-EC',
442
            'es-GQ',
443
            'es-GT',
444
            'es-HN',
445
            'es-IC',
446
            'es-MX',
447
            'es-NI',
448
            'es-PA',
449
            'es-PE',
450
            'es-PH',
451
            'es-PR',
452
            'es-PY',
453
            'es-SV',
454
            'es-US',
455
            'es-UY',
456
            'es-VE',
457
            'et',
458
            'eu',
459
            'fa',
460
            'fa-AF',
461
            'fi',
462
            'fil',
463
            'fr',
464
            'fr-BE',
465
            'fr-BF',
466
            'fr-BI',
467
            'fr-BJ',
468
            'fr-BL',
469
            'fr-CA',
470
            'fr-CD',
471
            'fr-CF',
472
            'fr-CG',
473
            'fr-CH',
474
            'fr-CI',
475
            'fr-CM',
476
            'fr-DJ',
477
            'fr-DZ',
478
            'fr-GA',
479
            'fr-GF',
480
            'fr-GN',
481
            'fr-GP',
482
            'fr-GQ',
483
            'fr-HT',
484
            'fr-KM',
485
            'fr-LU',
486
            'fr-MA',
487
            'fr-MC',
488
            'fr-MF',
489
            'fr-MG',
490
            'fr-ML',
491
            'fr-MQ',
492
            'fr-MR',
493
            'fr-MU',
494
            'fr-NC',
495
            'fr-NE',
496
            'fr-PF',
497
            'fr-PM',
498
            'fr-RE',
499
            'fr-RW',
500
            'fr-SC',
501
            'fr-SN',
502
            'fr-SY',
503
            'fr-TD',
504
            'fr-TG',
505
            'fr-TN',
506
            'fr-VU',
507
            'fr-WF',
508
            'fr-YT',
509
            'ga',
510
            'ga-GB',
511
            'gd',
512
            'gl',
513
            'gu',
514
            'ha',
515
            'ha-GH',
516
            'ha-NE',
517
            'he',
518
            'hi',
519
            'hi-Latn',
520
            'hr',
521
            'hr-BA',
522
            'hsb',
523
            'hu',
524
            'hy',
525
            'id',
526
            'ig',
527
            'is',
528
            'it',
529
            'it-CH',
530
            'it-SM',
531
            'it-VA',
532
            'ja',
533
            'jv',
534
            'ka',
535
            'kk',
536
            'km',
537
            'kn',
538
            'ko',
539
            'ko-CN',
540
            'ko-KP',
541
            'kok',
542
            'ky',
543
            'lo',
544
            'lt',
545
            'lv',
546
            'mk',
547
            'ml',
548
            'mn',
549
            'mr',
550
            'ms',
551
            'ms-BN',
552
            'ms-ID',
553
            'ms-SG',
554
            'my',
555
            'nb',
556
            'nb-SJ',
557
            'ne',
558
            'ne-IN',
559
            'nl',
560
            'nl-AW',
561
            'nl-BE',
562
            'nl-BQ',
563
            'nl-CW',
564
            'nl-SR',
565
            'nl-SX',
566
            'nn',
567
            'no',
568
            'or',
569
            'pa',
570
            'pa-Guru',
571
            'pl',
572
            'ps',
573
            'ps-PK',
574
            'pt',
575
            'pt-AO',
576
            'pt-CH',
577
            'pt-CV',
578
            'pt-GQ',
579
            'pt-GW',
580
            'pt-LU',
581
            'pt-MO',
582
            'pt-MZ',
583
            'pt-PT',
584
            'pt-ST',
585
            'pt-TL',
586
            'ro',
587
            'ro-MD',
588
            'ru',
589
            'ru-BY',
590
            'ru-KG',
591
            'ru-KZ',
592
            'ru-MD',
593
            'ru-UA',
594
            'sd',
595
            'sd-Arab',
596
            'si',
597
            'sk',
598
            'sl',
599
            'so',
600
            'so-DJ',
601
            'so-ET',
602
            'so-KE',
603
            'sq',
604
            'sq-MK',
605
            'sq-XK',
606
            'sr',
607
            'sr-Cyrl',
608
            'sr-Cyrl-BA',
609
            'sr-Cyrl-ME',
610
            'sr-Cyrl-XK',
611
            'sr-Latn',
612
            'sr-Latn-BA',
613
            'sr-Latn-ME',
614
            'sr-Latn-XK',
615
            'sv',
616
            'sv-AX',
617
            'sv-FI',
618
            'sw',
619
            'sw-CD',
620
            'sw-KE',
621
            'sw-UG',
622
            'ta',
623
            'ta-LK',
624
            'ta-MY',
625
            'ta-SG',
626
            'te',
627
            'th',
628
            'tk',
629
            'tr',
630
            'tr-CY',
631
            'uk',
632
            'und',
633
            'ur',
634
            'ur-IN',
635
            'uz',
636
            'uz-Latn',
637
            'vi',
638
            'yo',
639
            'yo-BJ',
640
            'yue',
641
            'yue-Hans',
642
            'yue-Hant',
643
            'zh',
644
            'zh-Hans',
645
            'zh-Hans-HK',
646
            'zh-Hans-MO',
647
            'zh-Hans-SG',
648
            'zh-Hant',
649
            'zh-Hant-HK',
650
            'zh-Hant-MO',
651
            'zu',
652
        ];
653
}
654