num2words2-core 0.1.3

Number-to-words conversion for 120+ languages (Rust port of num2words). 42 -> forty-two.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
// GENERATED by bench/gen_registry.py — do not edit by hand.
// Language modules are discovered from src/lang_*.rs.

pub mod base;
pub mod currency;
pub mod floatpath;
pub mod presentation;
pub mod strnum;
pub mod lang_af;
pub mod lang_am;
pub mod lang_ar;
pub mod lang_as;
pub mod lang_az;
pub mod lang_ba;
pub mod lang_ban;
pub mod lang_be;
pub mod lang_bg;
pub mod lang_bm;
pub mod lang_bn;
pub mod lang_bo;
pub mod lang_br;
pub mod lang_bs;
pub mod lang_ca;
pub mod lang_ce;
pub mod lang_ceb;
pub mod lang_ckb;
pub mod lang_cnh;
pub mod lang_cs;
pub mod lang_cy;
pub mod lang_da;
pub mod lang_de;
pub mod lang_dv;
pub mod lang_el;
pub mod lang_en;
pub mod lang_en_aero;
pub mod lang_en_aero_faa;
pub mod lang_en_aero_nato;
pub mod lang_en_aero_us_army;
pub mod lang_en_aero_usn;
pub mod lang_en_in;
pub mod lang_en_ne;
pub mod lang_en_ng;
pub mod lang_en_np;
pub mod lang_eo;
pub mod lang_es;
pub mod lang_es_co;
pub mod lang_es_cr;
pub mod lang_es_gt;
pub mod lang_es_hn;
pub mod lang_es_ni;
pub mod lang_es_ve;
pub mod lang_et;
pub mod lang_eu;
pub mod lang_fa;
pub mod lang_ff;
pub mod lang_fi;
pub mod lang_fil;
pub mod lang_fo;
pub mod lang_fr;
pub mod lang_fr_be;
pub mod lang_fr_ch;
pub mod lang_fr_dz;
pub mod lang_gl;
pub mod lang_gu;
pub mod lang_ha;
pub mod lang_haw;
pub mod lang_he;
pub mod lang_hi;
pub mod lang_hmn;
pub mod lang_hr;
pub mod lang_ht;
pub mod lang_hu;
pub mod lang_hy;
pub mod lang_id;
pub mod lang_is;
pub mod lang_it;
pub mod lang_ja;
pub mod lang_jv;
pub mod lang_ka;
pub mod lang_ki;
pub mod lang_kk;
pub mod lang_km;
pub mod lang_kn;
pub mod lang_ko;
pub mod lang_kok;
pub mod lang_ksw;
pub mod lang_ku;
pub mod lang_ky;
pub mod lang_kz;
pub mod lang_la;
pub mod lang_lb;
pub mod lang_lg;
pub mod lang_lij;
pub mod lang_ln;
pub mod lang_lo;
pub mod lang_lt;
pub mod lang_lus;
pub mod lang_lv;
pub mod lang_mg;
pub mod lang_mi;
pub mod lang_mk;
pub mod lang_ml;
pub mod lang_mn;
pub mod lang_mr;
pub mod lang_ms;
pub mod lang_mt;
pub mod lang_my;
pub mod lang_nb;
pub mod lang_ne;
pub mod lang_nl;
pub mod lang_nn;
pub mod lang_oc;
pub mod lang_om;
pub mod lang_or;
pub mod lang_pa;
pub mod lang_pap;
pub mod lang_pl;
pub mod lang_pli;
pub mod lang_ps;
pub mod lang_pt;
pub mod lang_pt_br;
pub mod lang_rm;
pub mod lang_rm_puter;
pub mod lang_rm_surmiran;
pub mod lang_rm_sursilv;
pub mod lang_rm_sutsilv;
pub mod lang_rm_vallader;
pub mod lang_ro;
pub mod lang_ru;
pub mod lang_rw;
pub mod lang_sa;
pub mod lang_sd;
pub mod lang_si;
pub mod lang_sk;
pub mod lang_sl;
pub mod lang_sn;
pub mod lang_so;
pub mod lang_sq;
pub mod lang_sr;
pub mod lang_sr_latn;
pub mod lang_su;
pub mod lang_sv;
pub mod lang_sw;
pub mod lang_ta;
pub mod lang_te;
pub mod lang_tet;
pub mod lang_tg;
pub mod lang_th;
pub mod lang_ti;
pub mod lang_tk;
pub mod lang_tl;
pub mod lang_tr;
pub mod lang_tt;
pub mod lang_uk;
pub mod lang_ur;
pub mod lang_uz;
pub mod lang_uz_cyr;
pub mod lang_vi;
pub mod lang_wo;
pub mod lang_xh;
pub mod lang_yi;
pub mod lang_yo;
pub mod lang_zh;
pub mod lang_zh_hk;
pub mod lang_zh_tw;
pub mod lang_zu;

pub use base::{Kwargs, KwVal, Lang, N2WError, Result};
pub use currency::{CurrencyForms, CurrencyValue};
pub use floatpath::FloatValue;
pub use strnum::ParsedNumber;
pub use lang_af::LangAf;
pub use lang_am::LangAm;
pub use lang_ar::LangAr;
pub use lang_as::LangAs;
pub use lang_az::LangAz;
pub use lang_ba::LangBa;
pub use lang_ban::LangBan;
pub use lang_be::LangBe;
pub use lang_bg::LangBg;
pub use lang_bm::LangBm;
pub use lang_bn::LangBn;
pub use lang_bo::LangBo;
pub use lang_br::LangBr;
pub use lang_bs::LangBs;
pub use lang_ca::LangCa;
pub use lang_ce::LangCe;
pub use lang_ceb::LangCeb;
pub use lang_ckb::LangCkb;
pub use lang_cnh::LangCnh;
pub use lang_cs::LangCs;
pub use lang_cy::LangCy;
pub use lang_da::LangDa;
pub use lang_de::LangDe;
pub use lang_dv::LangDv;
pub use lang_el::LangEl;
pub use lang_en::LangEn;
pub use lang_en_aero::LangEnAero;
pub use lang_en_aero_faa::LangEnAeroFaa;
pub use lang_en_aero_nato::LangEnAeroNato;
pub use lang_en_aero_us_army::LangEnAeroUsArmy;
pub use lang_en_aero_usn::LangEnAeroUsn;
pub use lang_en_in::LangEnIn;
pub use lang_en_ne::LangEnNe;
pub use lang_en_ng::LangEnNg;
pub use lang_en_np::LangEnNp;
pub use lang_eo::LangEo;
pub use lang_es::LangEs;
pub use lang_es_co::LangEsCo;
pub use lang_es_cr::LangEsCr;
pub use lang_es_gt::LangEsGt;
pub use lang_es_hn::LangEsHn;
pub use lang_es_ni::LangEsNi;
pub use lang_es_ve::LangEsVe;
pub use lang_et::LangEt;
pub use lang_eu::LangEu;
pub use lang_fa::LangFa;
pub use lang_ff::LangFf;
pub use lang_fi::LangFi;
pub use lang_fil::LangFil;
pub use lang_fo::LangFo;
pub use lang_fr::LangFr;
pub use lang_fr_be::LangFrBe;
pub use lang_fr_ch::LangFrCh;
pub use lang_fr_dz::LangFrDz;
pub use lang_gl::LangGl;
pub use lang_gu::LangGu;
pub use lang_ha::LangHa;
pub use lang_haw::LangHaw;
pub use lang_he::LangHe;
pub use lang_hi::LangHi;
pub use lang_hmn::LangHmn;
pub use lang_hr::LangHr;
pub use lang_ht::LangHt;
pub use lang_hu::LangHu;
pub use lang_hy::LangHy;
pub use lang_id::LangId;
pub use lang_is::LangIs;
pub use lang_it::LangIt;
pub use lang_ja::LangJa;
pub use lang_jv::LangJv;
pub use lang_ka::LangKa;
pub use lang_ki::LangKi;
pub use lang_kk::LangKk;
pub use lang_km::LangKm;
pub use lang_kn::LangKn;
pub use lang_ko::LangKo;
pub use lang_kok::LangKok;
pub use lang_ksw::LangKsw;
pub use lang_ku::LangKu;
pub use lang_ky::LangKy;
pub use lang_kz::LangKz;
pub use lang_la::LangLa;
pub use lang_lb::LangLb;
pub use lang_lg::LangLg;
pub use lang_lij::LangLij;
pub use lang_ln::LangLn;
pub use lang_lo::LangLo;
pub use lang_lt::LangLt;
pub use lang_lus::LangLus;
pub use lang_lv::LangLv;
pub use lang_mg::LangMg;
pub use lang_mi::LangMi;
pub use lang_mk::LangMk;
pub use lang_ml::LangMl;
pub use lang_mn::LangMn;
pub use lang_mr::LangMr;
pub use lang_ms::LangMs;
pub use lang_mt::LangMt;
pub use lang_my::LangMy;
pub use lang_nb::LangNb;
pub use lang_ne::LangNe;
pub use lang_nl::LangNl;
pub use lang_nn::LangNn;
pub use lang_oc::LangOc;
pub use lang_om::LangOm;
pub use lang_or::LangOr;
pub use lang_pa::LangPa;
pub use lang_pap::LangPap;
pub use lang_pl::LangPl;
pub use lang_pli::LangPli;
pub use lang_ps::LangPs;
pub use lang_pt::LangPt;
pub use lang_pt_br::LangPtBr;
pub use lang_rm::LangRm;
pub use lang_rm_puter::LangRmPuter;
pub use lang_rm_surmiran::LangRmSurmiran;
pub use lang_rm_sursilv::LangRmSursilv;
pub use lang_rm_sutsilv::LangRmSutsilv;
pub use lang_rm_vallader::LangRmVallader;
pub use lang_ro::LangRo;
pub use lang_ru::LangRu;
pub use lang_rw::LangRw;
pub use lang_sa::LangSa;
pub use lang_sd::LangSd;
pub use lang_si::LangSi;
pub use lang_sk::LangSk;
pub use lang_sl::LangSl;
pub use lang_sn::LangSn;
pub use lang_so::LangSo;
pub use lang_sq::LangSq;
pub use lang_sr::LangSr;
pub use lang_sr_latn::LangSrLatn;
pub use lang_su::LangSu;
pub use lang_sv::LangSv;
pub use lang_sw::LangSw;
pub use lang_ta::LangTa;
pub use lang_te::LangTe;
pub use lang_tet::LangTet;
pub use lang_tg::LangTg;
pub use lang_th::LangTh;
pub use lang_ti::LangTi;
pub use lang_tk::LangTk;
pub use lang_tl::LangTl;
pub use lang_tr::LangTr;
pub use lang_tt::LangTt;
pub use lang_uk::LangUk;
pub use lang_ur::LangUr;
pub use lang_uz::LangUz;
pub use lang_uz_cyr::LangUzCyr;
pub use lang_vi::LangVi;
pub use lang_wo::LangWo;
pub use lang_xh::LangXh;
pub use lang_yi::LangYi;
pub use lang_yo::LangYo;
pub use lang_zh::LangZh;
pub use lang_zh_hk::LangZhHk;
pub use lang_zh_tw::LangZhTw;
pub use lang_zu::LangZu;

use std::sync::OnceLock;

/// Resolve a Python CONVERTER_CLASSES key to a cached language.
pub fn get_lang_by_key(lang: &str) -> Option<&'static (dyn Lang + Sync)> {
    static AF: OnceLock<LangAf> = OnceLock::new();
    static AM: OnceLock<LangAm> = OnceLock::new();
    static AR: OnceLock<LangAr> = OnceLock::new();
    static AS: OnceLock<LangAs> = OnceLock::new();
    static AZ: OnceLock<LangAz> = OnceLock::new();
    static BA: OnceLock<LangBa> = OnceLock::new();
    static BAN: OnceLock<LangBan> = OnceLock::new();
    static BE: OnceLock<LangBe> = OnceLock::new();
    static BG: OnceLock<LangBg> = OnceLock::new();
    static BM: OnceLock<LangBm> = OnceLock::new();
    static BN: OnceLock<LangBn> = OnceLock::new();
    static BO: OnceLock<LangBo> = OnceLock::new();
    static BR: OnceLock<LangBr> = OnceLock::new();
    static BS: OnceLock<LangBs> = OnceLock::new();
    static CA: OnceLock<LangCa> = OnceLock::new();
    static CE: OnceLock<LangCe> = OnceLock::new();
    static CEB: OnceLock<LangCeb> = OnceLock::new();
    static CKB: OnceLock<LangCkb> = OnceLock::new();
    static CNH: OnceLock<LangCnh> = OnceLock::new();
    static CS: OnceLock<LangCs> = OnceLock::new();
    static CY: OnceLock<LangCy> = OnceLock::new();
    static DA: OnceLock<LangDa> = OnceLock::new();
    static DE: OnceLock<LangDe> = OnceLock::new();
    static DV: OnceLock<LangDv> = OnceLock::new();
    static EL: OnceLock<LangEl> = OnceLock::new();
    static EN: OnceLock<LangEn> = OnceLock::new();
    static EN_AERO: OnceLock<LangEnAero> = OnceLock::new();
    static EN_AERO_FAA: OnceLock<LangEnAeroFaa> = OnceLock::new();
    static EN_AERO_NATO: OnceLock<LangEnAeroNato> = OnceLock::new();
    static EN_AERO_US_ARMY: OnceLock<LangEnAeroUsArmy> = OnceLock::new();
    static EN_AERO_USN: OnceLock<LangEnAeroUsn> = OnceLock::new();
    static EN_IN: OnceLock<LangEnIn> = OnceLock::new();
    static EN_NE: OnceLock<LangEnNe> = OnceLock::new();
    static EN_NG: OnceLock<LangEnNg> = OnceLock::new();
    static EN_NP: OnceLock<LangEnNp> = OnceLock::new();
    static EO: OnceLock<LangEo> = OnceLock::new();
    static ES: OnceLock<LangEs> = OnceLock::new();
    static ES_CO: OnceLock<LangEsCo> = OnceLock::new();
    static ES_CR: OnceLock<LangEsCr> = OnceLock::new();
    static ES_GT: OnceLock<LangEsGt> = OnceLock::new();
    static ES_HN: OnceLock<LangEsHn> = OnceLock::new();
    static ES_NI: OnceLock<LangEsNi> = OnceLock::new();
    static ES_VE: OnceLock<LangEsVe> = OnceLock::new();
    static ET: OnceLock<LangEt> = OnceLock::new();
    static EU: OnceLock<LangEu> = OnceLock::new();
    static FA: OnceLock<LangFa> = OnceLock::new();
    static FF: OnceLock<LangFf> = OnceLock::new();
    static FI: OnceLock<LangFi> = OnceLock::new();
    static FIL: OnceLock<LangFil> = OnceLock::new();
    static FO: OnceLock<LangFo> = OnceLock::new();
    static FR: OnceLock<LangFr> = OnceLock::new();
    static FR_BE: OnceLock<LangFrBe> = OnceLock::new();
    static FR_CH: OnceLock<LangFrCh> = OnceLock::new();
    static FR_DZ: OnceLock<LangFrDz> = OnceLock::new();
    static GL: OnceLock<LangGl> = OnceLock::new();
    static GU: OnceLock<LangGu> = OnceLock::new();
    static HA: OnceLock<LangHa> = OnceLock::new();
    static HAW: OnceLock<LangHaw> = OnceLock::new();
    static HE: OnceLock<LangHe> = OnceLock::new();
    static HI: OnceLock<LangHi> = OnceLock::new();
    static HMN: OnceLock<LangHmn> = OnceLock::new();
    static HR: OnceLock<LangHr> = OnceLock::new();
    static HT: OnceLock<LangHt> = OnceLock::new();
    static HU: OnceLock<LangHu> = OnceLock::new();
    static HY: OnceLock<LangHy> = OnceLock::new();
    static ID: OnceLock<LangId> = OnceLock::new();
    static IS: OnceLock<LangIs> = OnceLock::new();
    static IT: OnceLock<LangIt> = OnceLock::new();
    static JA: OnceLock<LangJa> = OnceLock::new();
    static JV: OnceLock<LangJv> = OnceLock::new();
    static KA: OnceLock<LangKa> = OnceLock::new();
    static KI: OnceLock<LangKi> = OnceLock::new();
    static KK: OnceLock<LangKk> = OnceLock::new();
    static KM: OnceLock<LangKm> = OnceLock::new();
    static KN: OnceLock<LangKn> = OnceLock::new();
    static KO: OnceLock<LangKo> = OnceLock::new();
    static KOK: OnceLock<LangKok> = OnceLock::new();
    static KSW: OnceLock<LangKsw> = OnceLock::new();
    static KU: OnceLock<LangKu> = OnceLock::new();
    static KY: OnceLock<LangKy> = OnceLock::new();
    static KZ: OnceLock<LangKz> = OnceLock::new();
    static LA: OnceLock<LangLa> = OnceLock::new();
    static LB: OnceLock<LangLb> = OnceLock::new();
    static LG: OnceLock<LangLg> = OnceLock::new();
    static LIJ: OnceLock<LangLij> = OnceLock::new();
    static LN: OnceLock<LangLn> = OnceLock::new();
    static LO: OnceLock<LangLo> = OnceLock::new();
    static LT: OnceLock<LangLt> = OnceLock::new();
    static LUS: OnceLock<LangLus> = OnceLock::new();
    static LV: OnceLock<LangLv> = OnceLock::new();
    static MG: OnceLock<LangMg> = OnceLock::new();
    static MI: OnceLock<LangMi> = OnceLock::new();
    static MK: OnceLock<LangMk> = OnceLock::new();
    static ML: OnceLock<LangMl> = OnceLock::new();
    static MN: OnceLock<LangMn> = OnceLock::new();
    static MR: OnceLock<LangMr> = OnceLock::new();
    static MS: OnceLock<LangMs> = OnceLock::new();
    static MT: OnceLock<LangMt> = OnceLock::new();
    static MY: OnceLock<LangMy> = OnceLock::new();
    static NB: OnceLock<LangNb> = OnceLock::new();
    static NE: OnceLock<LangNe> = OnceLock::new();
    static NL: OnceLock<LangNl> = OnceLock::new();
    static NN: OnceLock<LangNn> = OnceLock::new();
    static OC: OnceLock<LangOc> = OnceLock::new();
    static OM: OnceLock<LangOm> = OnceLock::new();
    static OR: OnceLock<LangOr> = OnceLock::new();
    static PA: OnceLock<LangPa> = OnceLock::new();
    static PAP: OnceLock<LangPap> = OnceLock::new();
    static PL: OnceLock<LangPl> = OnceLock::new();
    static PLI: OnceLock<LangPli> = OnceLock::new();
    static PS: OnceLock<LangPs> = OnceLock::new();
    static PT: OnceLock<LangPt> = OnceLock::new();
    static PT_BR: OnceLock<LangPtBr> = OnceLock::new();
    static RM: OnceLock<LangRm> = OnceLock::new();
    static RM_PUTER: OnceLock<LangRmPuter> = OnceLock::new();
    static RM_SURMIRAN: OnceLock<LangRmSurmiran> = OnceLock::new();
    static RM_SURSILV: OnceLock<LangRmSursilv> = OnceLock::new();
    static RM_SUTSILV: OnceLock<LangRmSutsilv> = OnceLock::new();
    static RM_VALLADER: OnceLock<LangRmVallader> = OnceLock::new();
    static RO: OnceLock<LangRo> = OnceLock::new();
    static RU: OnceLock<LangRu> = OnceLock::new();
    static RW: OnceLock<LangRw> = OnceLock::new();
    static SA: OnceLock<LangSa> = OnceLock::new();
    static SD: OnceLock<LangSd> = OnceLock::new();
    static SI: OnceLock<LangSi> = OnceLock::new();
    static SK: OnceLock<LangSk> = OnceLock::new();
    static SL: OnceLock<LangSl> = OnceLock::new();
    static SN: OnceLock<LangSn> = OnceLock::new();
    static SO: OnceLock<LangSo> = OnceLock::new();
    static SQ: OnceLock<LangSq> = OnceLock::new();
    static SR: OnceLock<LangSr> = OnceLock::new();
    static SR_LATN: OnceLock<LangSrLatn> = OnceLock::new();
    static SU: OnceLock<LangSu> = OnceLock::new();
    static SV: OnceLock<LangSv> = OnceLock::new();
    static SW: OnceLock<LangSw> = OnceLock::new();
    static TA: OnceLock<LangTa> = OnceLock::new();
    static TE: OnceLock<LangTe> = OnceLock::new();
    static TET: OnceLock<LangTet> = OnceLock::new();
    static TG: OnceLock<LangTg> = OnceLock::new();
    static TH: OnceLock<LangTh> = OnceLock::new();
    static TI: OnceLock<LangTi> = OnceLock::new();
    static TK: OnceLock<LangTk> = OnceLock::new();
    static TL: OnceLock<LangTl> = OnceLock::new();
    static TR: OnceLock<LangTr> = OnceLock::new();
    static TT: OnceLock<LangTt> = OnceLock::new();
    static UK: OnceLock<LangUk> = OnceLock::new();
    static UR: OnceLock<LangUr> = OnceLock::new();
    static UZ: OnceLock<LangUz> = OnceLock::new();
    static UZ_CYR: OnceLock<LangUzCyr> = OnceLock::new();
    static VI: OnceLock<LangVi> = OnceLock::new();
    static WO: OnceLock<LangWo> = OnceLock::new();
    static XH: OnceLock<LangXh> = OnceLock::new();
    static YI: OnceLock<LangYi> = OnceLock::new();
    static YO: OnceLock<LangYo> = OnceLock::new();
    static ZH: OnceLock<LangZh> = OnceLock::new();
    static ZH_HK: OnceLock<LangZhHk> = OnceLock::new();
    static ZH_TW: OnceLock<LangZhTw> = OnceLock::new();
    static ZU: OnceLock<LangZu> = OnceLock::new();
    match lang {
        "af" => Some(AF.get_or_init(LangAf::new)),
        "am" => Some(AM.get_or_init(LangAm::new)),
        "ar" => Some(AR.get_or_init(LangAr::new)),
        "as" => Some(AS.get_or_init(LangAs::new)),
        "az" => Some(AZ.get_or_init(LangAz::new)),
        "ba" => Some(BA.get_or_init(LangBa::new)),
        "ban" => Some(BAN.get_or_init(LangBan::new)),
        "be" => Some(BE.get_or_init(LangBe::new)),
        "bg" => Some(BG.get_or_init(LangBg::new)),
        "bm" => Some(BM.get_or_init(LangBm::new)),
        "bn" => Some(BN.get_or_init(LangBn::new)),
        "bo" => Some(BO.get_or_init(LangBo::new)),
        "br" => Some(BR.get_or_init(LangBr::new)),
        "bs" => Some(BS.get_or_init(LangBs::new)),
        "ca" => Some(CA.get_or_init(LangCa::new)),
        "ce" => Some(CE.get_or_init(LangCe::new)),
        "ceb" => Some(CEB.get_or_init(LangCeb::new)),
        "ckb" => Some(CKB.get_or_init(LangCkb::new)),
        "cnh" => Some(CNH.get_or_init(LangCnh::new)),
        "cs" | "cz" => Some(CS.get_or_init(LangCs::new)),
        "cy" => Some(CY.get_or_init(LangCy::new)),
        "da" | "dk" => Some(DA.get_or_init(LangDa::new)),
        "de" => Some(DE.get_or_init(LangDe::new)),
        "dv" => Some(DV.get_or_init(LangDv::new)),
        "el" => Some(EL.get_or_init(LangEl::new)),
        "en" => Some(EN.get_or_init(LangEn::new)),
        "en_AERO" | "en_Aero_ICAO" | "en_aero_icao" | "en_x_aero_icao" => Some(EN_AERO.get_or_init(LangEnAero::new)),
        "en_Aero_FAA" => Some(EN_AERO_FAA.get_or_init(LangEnAeroFaa::new)),
        "en_Aero_NATO" => Some(EN_AERO_NATO.get_or_init(LangEnAeroNato::new)),
        "en_Aero_US_Army" => Some(EN_AERO_US_ARMY.get_or_init(LangEnAeroUsArmy::new)),
        "en_Aero_USN" | "en_Aero_US_Navy" => Some(EN_AERO_USN.get_or_init(LangEnAeroUsn::new)),
        "en_IN" => Some(EN_IN.get_or_init(LangEnIn::new)),
        "en_NE" => Some(EN_NE.get_or_init(LangEnNe::new)),
        "en_NG" => Some(EN_NG.get_or_init(LangEnNg::new)),
        "en_NP" => Some(EN_NP.get_or_init(LangEnNp::new)),
        "eo" => Some(EO.get_or_init(LangEo::new)),
        "es" => Some(ES.get_or_init(LangEs::new)),
        "es_CO" => Some(ES_CO.get_or_init(LangEsCo::new)),
        "es_CR" => Some(ES_CR.get_or_init(LangEsCr::new)),
        "es_GT" => Some(ES_GT.get_or_init(LangEsGt::new)),
        "es_HN" => Some(ES_HN.get_or_init(LangEsHn::new)),
        "es_NI" => Some(ES_NI.get_or_init(LangEsNi::new)),
        "es_VE" => Some(ES_VE.get_or_init(LangEsVe::new)),
        "et" => Some(ET.get_or_init(LangEt::new)),
        "eu" => Some(EU.get_or_init(LangEu::new)),
        "fa" => Some(FA.get_or_init(LangFa::new)),
        "ff" => Some(FF.get_or_init(LangFf::new)),
        "fi" => Some(FI.get_or_init(LangFi::new)),
        "fil" => Some(FIL.get_or_init(LangFil::new)),
        "fo" => Some(FO.get_or_init(LangFo::new)),
        "fr" => Some(FR.get_or_init(LangFr::new)),
        "fr_BE" => Some(FR_BE.get_or_init(LangFrBe::new)),
        "fr_CH" => Some(FR_CH.get_or_init(LangFrCh::new)),
        "fr_DZ" => Some(FR_DZ.get_or_init(LangFrDz::new)),
        "gl" => Some(GL.get_or_init(LangGl::new)),
        "gu" => Some(GU.get_or_init(LangGu::new)),
        "ha" => Some(HA.get_or_init(LangHa::new)),
        "haw" => Some(HAW.get_or_init(LangHaw::new)),
        "he" => Some(HE.get_or_init(LangHe::new)),
        "hi" => Some(HI.get_or_init(LangHi::new)),
        "hmn" => Some(HMN.get_or_init(LangHmn::new)),
        "hr" => Some(HR.get_or_init(LangHr::new)),
        "ht" => Some(HT.get_or_init(LangHt::new)),
        "hu" => Some(HU.get_or_init(LangHu::new)),
        "hy" => Some(HY.get_or_init(LangHy::new)),
        "id" => Some(ID.get_or_init(LangId::new)),
        "is" => Some(IS.get_or_init(LangIs::new)),
        "it" => Some(IT.get_or_init(LangIt::new)),
        "ja" | "jp" => Some(JA.get_or_init(LangJa::new)),
        "jv" | "jw" => Some(JV.get_or_init(LangJv::new)),
        "ka" => Some(KA.get_or_init(LangKa::new)),
        "ki" => Some(KI.get_or_init(LangKi::new)),
        "kk" => Some(KK.get_or_init(LangKk::new)),
        "km" => Some(KM.get_or_init(LangKm::new)),
        "kn" => Some(KN.get_or_init(LangKn::new)),
        "ko" => Some(KO.get_or_init(LangKo::new)),
        "kok" => Some(KOK.get_or_init(LangKok::new)),
        "ksw" => Some(KSW.get_or_init(LangKsw::new)),
        "ku" => Some(KU.get_or_init(LangKu::new)),
        "ky" => Some(KY.get_or_init(LangKy::new)),
        "kz" => Some(KZ.get_or_init(LangKz::new)),
        "la" => Some(LA.get_or_init(LangLa::new)),
        "lb" => Some(LB.get_or_init(LangLb::new)),
        "lg" => Some(LG.get_or_init(LangLg::new)),
        "lij" => Some(LIJ.get_or_init(LangLij::new)),
        "ln" => Some(LN.get_or_init(LangLn::new)),
        "lo" => Some(LO.get_or_init(LangLo::new)),
        "lt" => Some(LT.get_or_init(LangLt::new)),
        "lus" | "miz" => Some(LUS.get_or_init(LangLus::new)),
        "lv" => Some(LV.get_or_init(LangLv::new)),
        "mg" => Some(MG.get_or_init(LangMg::new)),
        "mi" => Some(MI.get_or_init(LangMi::new)),
        "mk" => Some(MK.get_or_init(LangMk::new)),
        "ml" => Some(ML.get_or_init(LangMl::new)),
        "mn" => Some(MN.get_or_init(LangMn::new)),
        "mr" => Some(MR.get_or_init(LangMr::new)),
        "ms" => Some(MS.get_or_init(LangMs::new)),
        "mt" => Some(MT.get_or_init(LangMt::new)),
        "my" => Some(MY.get_or_init(LangMy::new)),
        "nb" | "no" => Some(NB.get_or_init(LangNb::new)),
        "ne" => Some(NE.get_or_init(LangNe::new)),
        "nl" => Some(NL.get_or_init(LangNl::new)),
        "nn" => Some(NN.get_or_init(LangNn::new)),
        "oc" => Some(OC.get_or_init(LangOc::new)),
        "om" => Some(OM.get_or_init(LangOm::new)),
        "or" => Some(OR.get_or_init(LangOr::new)),
        "pa" => Some(PA.get_or_init(LangPa::new)),
        "pap" => Some(PAP.get_or_init(LangPap::new)),
        "pl" => Some(PL.get_or_init(LangPl::new)),
        "pli" => Some(PLI.get_or_init(LangPli::new)),
        "ps" => Some(PS.get_or_init(LangPs::new)),
        "pt" => Some(PT.get_or_init(LangPt::new)),
        "pt_BR" => Some(PT_BR.get_or_init(LangPtBr::new)),
        "rm" => Some(RM.get_or_init(LangRm::new)),
        "rm_puter" => Some(RM_PUTER.get_or_init(LangRmPuter::new)),
        "rm_surmiran" => Some(RM_SURMIRAN.get_or_init(LangRmSurmiran::new)),
        "rm_sursilv" => Some(RM_SURSILV.get_or_init(LangRmSursilv::new)),
        "rm_sutsilv" => Some(RM_SUTSILV.get_or_init(LangRmSutsilv::new)),
        "rm_vallader" => Some(RM_VALLADER.get_or_init(LangRmVallader::new)),
        "ro" => Some(RO.get_or_init(LangRo::new)),
        "ru" => Some(RU.get_or_init(LangRu::new)),
        "rw" => Some(RW.get_or_init(LangRw::new)),
        "sa" => Some(SA.get_or_init(LangSa::new)),
        "sd" => Some(SD.get_or_init(LangSd::new)),
        "si" => Some(SI.get_or_init(LangSi::new)),
        "sk" => Some(SK.get_or_init(LangSk::new)),
        "sl" => Some(SL.get_or_init(LangSl::new)),
        "sn" => Some(SN.get_or_init(LangSn::new)),
        "so" => Some(SO.get_or_init(LangSo::new)),
        "sq" => Some(SQ.get_or_init(LangSq::new)),
        "sr" | "sr_Cyrl" => Some(SR.get_or_init(LangSr::new)),
        "sr_Latn" => Some(SR_LATN.get_or_init(LangSrLatn::new)),
        "su" => Some(SU.get_or_init(LangSu::new)),
        "sv" => Some(SV.get_or_init(LangSv::new)),
        "sw" => Some(SW.get_or_init(LangSw::new)),
        "ta" => Some(TA.get_or_init(LangTa::new)),
        "te" => Some(TE.get_or_init(LangTe::new)),
        "tet" => Some(TET.get_or_init(LangTet::new)),
        "tg" => Some(TG.get_or_init(LangTg::new)),
        "th" => Some(TH.get_or_init(LangTh::new)),
        "ti" => Some(TI.get_or_init(LangTi::new)),
        "tk" => Some(TK.get_or_init(LangTk::new)),
        "tl" => Some(TL.get_or_init(LangTl::new)),
        "tr" => Some(TR.get_or_init(LangTr::new)),
        "tt" => Some(TT.get_or_init(LangTt::new)),
        "uk" => Some(UK.get_or_init(LangUk::new)),
        "ur" => Some(UR.get_or_init(LangUr::new)),
        "uz" => Some(UZ.get_or_init(LangUz::new)),
        "uz_Cyrl" | "uz_cyr" => Some(UZ_CYR.get_or_init(LangUzCyr::new)),
        "vi" => Some(VI.get_or_init(LangVi::new)),
        "wo" => Some(WO.get_or_init(LangWo::new)),
        "xh" => Some(XH.get_or_init(LangXh::new)),
        "yi" => Some(YI.get_or_init(LangYi::new)),
        "yo" => Some(YO.get_or_init(LangYo::new)),
        "cn" | "zh" | "zh_CN" => Some(ZH.get_or_init(LangZh::new)),
        "zh_HK" => Some(ZH_HK.get_or_init(LangZhHk::new)),
        "zh_TW" => Some(ZH_TW.get_or_init(LangZhTw::new)),
        "zu" => Some(ZU.get_or_init(LangZu::new)),
        _ => None,
    }
}

/// Every Python key the core can serve.
pub fn supported_lang_keys() -> Vec<&'static str> {
    vec!["af", "am", "ar", "as", "az", "ba", "ban", "be", "bg", "bm", "bn", "bo", "br", "bs", "ca", "ce", "ceb", "ckb", "cn", "cnh", "cs", "cy", "cz", "da", "de", "dk", "dv", "el", "en", "en_AERO", "en_Aero_FAA", "en_Aero_ICAO", "en_Aero_NATO", "en_Aero_USN", "en_Aero_US_Army", "en_Aero_US_Navy", "en_IN", "en_NE", "en_NG", "en_NP", "en_aero_icao", "en_x_aero_icao", "eo", "es", "es_CO", "es_CR", "es_GT", "es_HN", "es_NI", "es_VE", "et", "eu", "fa", "ff", "fi", "fil", "fo", "fr", "fr_BE", "fr_CH", "fr_DZ", "gl", "gu", "ha", "haw", "he", "hi", "hmn", "hr", "ht", "hu", "hy", "id", "is", "it", "ja", "jp", "jv", "jw", "ka", "ki", "kk", "km", "kn", "ko", "kok", "ksw", "ku", "ky", "kz", "la", "lb", "lg", "lij", "ln", "lo", "lt", "lus", "lv", "mg", "mi", "miz", "mk", "ml", "mn", "mr", "ms", "mt", "my", "nb", "ne", "nl", "nn", "no", "oc", "om", "or", "pa", "pap", "pl", "pli", "ps", "pt", "pt_BR", "rm", "rm_puter", "rm_surmiran", "rm_sursilv", "rm_sutsilv", "rm_vallader", "ro", "ru", "rw", "sa", "sd", "si", "sk", "sl", "sn", "so", "sq", "sr", "sr_Cyrl", "sr_Latn", "su", "sv", "sw", "ta", "te", "tet", "tg", "th", "ti", "tk", "tl", "tr", "tt", "uk", "ur", "uz", "uz_Cyrl", "uz_cyr", "vi", "wo", "xh", "yi", "yo", "zh", "zh_CN", "zh_HK", "zh_TW", "zu"]
}