Skip to main content

language_distribution/
language_distribution.rs

1crate::ix!();
2
3pub trait LanguageDistribution {
4    fn language_distribution(&self) -> HashMap<Language, f64>;
5}
6
7impl LanguageDistribution for Country {
8    fn language_distribution(&self) -> HashMap<Language, f64> {
9        let mut map = HashMap::new();
10        match self {
11            Country::Afghanistan => {
12                // Pashto, Dari (Persian)
13                map.insert(Language::Pashto, 0.5);
14                map.insert(Language::Farsi, 0.5);
15                map
16            },
17            Country::Albania => {
18                // Albanian
19                map.insert(Language::Albanian, 1.0);
20                map
21            },
22            Country::Algeria => {
23                // Arabic, Berber
24                map.insert(Language::Arabic, 0.9);
25                map.insert(Language::Berber, 0.1);
26                map
27            },
28            Country::Andorra => {
29                // Catalan
30                map.insert(Language::Catalan, 1.0);
31                map
32            },
33            Country::Angola => {
34                // Portuguese
35                map.insert(Language::Portuguese, 1.0);
36                map
37            },
38            Country::AntiguaAndBarbuda => {
39                // English
40                map.insert(Language::English, 1.0);
41                map
42            },
43            Country::Argentina => {
44                // Spanish
45                map.insert(Language::Spanish, 1.0);
46                map
47            },
48            Country::Armenia => {
49                // Armenian
50                map.insert(Language::Armenian, 1.0);
51                map
52            },
53            Country::Australia => {
54                // English (de facto)
55                map.insert(Language::English, 1.0);
56                map
57            },
58            Country::Austria => {
59                // German
60                map.insert(Language::German, 1.0);
61                map
62            },
63            Country::Azerbaijan => {
64                // Azerbaijani (Azeri)
65                map.insert(Language::Azeri, 1.0);
66                map
67            },
68            Country::Bahamas => {
69                // English
70                map.insert(Language::English, 1.0);
71                map
72            },
73            Country::Bahrain => {
74                // Arabic
75                map.insert(Language::Arabic, 1.0);
76                map
77            },
78            Country::Bangladesh => {
79                // Bengali
80                map.insert(Language::Bengali, 1.0);
81                map
82            },
83            Country::Barbados => {
84                // English
85                map.insert(Language::English, 1.0);
86                map
87            },
88            Country::Belarus => {
89                // Belarusian, Russian
90                map.insert(Language::Belarusian, 0.5);
91                map.insert(Language::Russian, 0.5);
92                map
93            },
94            Country::Belgium => {
95                // Dutch, French, German
96                map.insert(Language::Dutch, 0.55);
97                map.insert(Language::French, 0.44);
98                map.insert(Language::German, 0.01);
99                map
100            },
101            Country::Belize => {
102                // English (official), plus Spanish and others
103                map.insert(Language::English, 0.5);
104                map.insert(Language::Spanish, 0.3);
105                map.insert(Language::Kriol, 0.2);
106                map
107            },
108            Country::Benin => {
109                // French
110                map.insert(Language::French, 1.0);
111                map
112            },
113            Country::Bhutan => {
114                // Dzongkha
115                map.insert(Language::Dzongkha, 1.0);
116                map
117            },
118            Country::Bolivia => {
119                // Spanish, Quechua, Aymara
120                map.insert(Language::Spanish, 0.6);
121                map.insert(Language::Quechua, 0.3);
122                map.insert(Language::Aymara, 0.1);
123                map
124            },
125            Country::BosniaAndHerzegovina => {
126                // Bosnian, Croatian, Serbian
127                map.insert(Language::Bosnian, 0.4);
128                map.insert(Language::Croatian, 0.3);
129                map.insert(Language::Serbian, 0.3);
130                map
131            },
132            Country::Botswana => {
133                // English, Tswana
134                map.insert(Language::English, 0.3);
135                map.insert(Language::Tswana, 0.7);
136                map
137            },
138            Country::Brazil => {
139                // Portuguese
140                map.insert(Language::Portuguese, 1.0);
141                map
142            },
143            Country::Brunei => {
144                // Malay
145                map.insert(Language::Malay, 1.0);
146                map
147            },
148            Country::Bulgaria => {
149                // Bulgarian
150                map.insert(Language::Bulgarian, 1.0);
151                map
152            },
153            Country::BurkinaFaso => {
154                // French
155                map.insert(Language::French, 1.0);
156                map
157            },
158            Country::Burundi => {
159                // Kirundi, French
160                map.insert(Language::Kirundi, 0.8);
161                map.insert(Language::French, 0.2);
162                map
163            },
164            Country::Cambodia => {
165                // Khmer
166                map.insert(Language::Khmer, 1.0);
167                map
168            },
169            Country::Cameroon => {
170                // French, English
171                map.insert(Language::French, 0.7);
172                map.insert(Language::English, 0.3);
173                map
174            },
175            Country::Canada => {
176                // English, French
177                map.insert(Language::English, 0.75);
178                map.insert(Language::French, 0.25);
179                map
180            },
181            Country::CapeVerde => {
182                // Portuguese
183                map.insert(Language::Portuguese, 1.0);
184                map
185            },
186            Country::CentralAfricanRepublic => {
187                // French, Sango
188                map.insert(Language::French, 0.5);
189                map.insert(Language::Sango, 0.5);
190                map
191            },
192            Country::Chad => {
193                // Arabic, French
194                map.insert(Language::Arabic, 0.5);
195                map.insert(Language::French, 0.5);
196                map
197            },
198            Country::Chile => {
199                // Spanish
200                map.insert(Language::Spanish, 1.0);
201                map
202            },
203            Country::China => {
204                // Mandarin
205                map.insert(Language::Mandarin, 1.0);
206                map
207            },
208            Country::Colombia => {
209                // Spanish
210                map.insert(Language::Spanish, 1.0);
211                map
212            },
213            Country::Comoros => {
214                // Comorian, Arabic, French
215                map.insert(Language::Comorian, 0.6);
216                map.insert(Language::Arabic, 0.2);
217                map.insert(Language::French, 0.2);
218                map
219            },
220            Country::CongoBrazzaville => {
221                // French, Lingala and other local languages
222                map.insert(Language::French, 0.5);
223                map.insert(Language::Lingala, 0.5);
224                map
225            },
226            Country::CongoKinshasa => {
227                // French + Lingala, Swahili, Kikongo, Tshiluba
228                map.insert(Language::French, 0.4);
229                map.insert(Language::Lingala, 0.2);
230                map.insert(Language::Swahili, 0.2);
231                map.insert(Language::Kikongo, 0.1);
232                map.insert(Language::Tshiluba, 0.1);
233                map
234            },
235            Country::CostaRica => {
236                // Spanish
237                map.insert(Language::Spanish, 1.0);
238                map
239            },
240            Country::Croatia => {
241                // Croatian
242                map.insert(Language::Croatian, 1.0);
243                map
244            },
245            Country::Cuba => {
246                // Spanish
247                map.insert(Language::Spanish, 1.0);
248                map
249            },
250            Country::Cyprus => {
251                // Greek, Turkish
252                map.insert(Language::Greek, 0.8);
253                map.insert(Language::Turkish, 0.2);
254                map
255            },
256            Country::CzechRepublic => {
257                // Czech
258                map.insert(Language::Czech, 1.0);
259                map
260            },
261            Country::Denmark => {
262                // Danish
263                map.insert(Language::Danish, 1.0);
264                map
265            },
266            Country::Djibouti => {
267                // French, Arabic
268                map.insert(Language::French, 0.5);
269                map.insert(Language::Arabic, 0.5);
270                map
271            },
272            Country::Dominica => {
273                // English
274                map.insert(Language::English, 1.0);
275                map
276            },
277            Country::DominicanRepublic => {
278                // Spanish
279                map.insert(Language::Spanish, 1.0);
280                map
281            },
282            Country::Ecuador => {
283                // Spanish, some Quechua
284                map.insert(Language::Spanish, 0.95);
285                map.insert(Language::Quechua, 0.05);
286                map
287            },
288            Country::Egypt => {
289                // Arabic
290                map.insert(Language::Arabic, 1.0);
291                map
292            },
293            Country::ElSalvador => {
294                // Spanish
295                map.insert(Language::Spanish, 1.0);
296                map
297            },
298            Country::EquatorialGuinea => {
299                // Spanish, French, Portuguese
300                map.insert(Language::Spanish, 0.7);
301                map.insert(Language::French, 0.2);
302                map.insert(Language::Portuguese, 0.1);
303                map
304            },
305            Country::Eritrea => {
306                // Tigrinya, Arabic, English
307                map.insert(Language::Tigrinya, 0.6);
308                map.insert(Language::Arabic, 0.2);
309                map.insert(Language::English, 0.2);
310                map
311            },
312            Country::Estonia => {
313                // Estonian
314                map.insert(Language::Estonian, 1.0);
315                map
316            },
317            Country::Eswatini => {
318                // Swati, English
319                map.insert(Language::Swati, 0.8);
320                map.insert(Language::English, 0.2);
321                map
322            },
323            Country::Ethiopia => {
324                // Amharic (official), plus many others
325                map.insert(Language::Amharic, 0.4);
326                map.insert(Language::Oromo, 0.3);
327                map.insert(Language::Tigrinya, 0.3);
328                map
329            },
330            Country::Fiji => {
331                // English, Fijian, Hindi
332                map.insert(Language::English, 0.4);
333                map.insert(Language::Fijian, 0.3);
334                map.insert(Language::Hindi, 0.3);
335                map
336            },
337            Country::Finland => {
338                // Finnish, Swedish
339                map.insert(Language::Finnish, 0.92);
340                map.insert(Language::Swedish, 0.08);
341                map
342            },
343            Country::France => {
344                // French
345                map.insert(Language::French, 0.95);
346                map.insert(Language::English, 0.03);
347                map.insert(Language::Breton, 0.01);
348                map.insert(Language::Basque, 0.01);
349                map
350            },
351            Country::Gabon => {
352                // French
353                map.insert(Language::French, 1.0);
354                map
355            },
356            Country::Gambia => {
357                // English
358                map.insert(Language::English, 1.0);
359                map
360            },
361            Country::Georgia => {
362                // Georgian
363                map.insert(Language::Georgian, 1.0);
364                map
365            },
366            Country::Germany => {
367                // German
368                map.insert(Language::German, 0.94);
369                map.insert(Language::English, 0.04);
370                map.insert(Language::Turkish, 0.02);
371                map
372            },
373            Country::Ghana => {
374                // English
375                map.insert(Language::English, 1.0);
376                map
377            },
378            Country::Greece => {
379                // Greek
380                map.insert(Language::Greek, 1.0);
381                map
382            },
383            Country::Grenada => {
384                // English
385                map.insert(Language::English, 1.0);
386                map
387            },
388            Country::Guatemala => {
389                // Spanish, plus Mayan languages (Mayan family; representative selection)
390                map.insert(Language::Spanish, 0.9);
391                map.insert(Language::Kiche, 0.04);
392                map.insert(Language::Qeqchi, 0.03);
393                map.insert(Language::Kaqchikel, 0.02);
394                map.insert(Language::Mam, 0.01);
395                map
396            },
397            Country::Guinea => {
398                // French
399                map.insert(Language::French, 1.0);
400                map
401            },
402            Country::GuineaBissau => {
403                // Portuguese
404                map.insert(Language::Portuguese, 1.0);
405                map
406            },
407            Country::Guyana => {
408                // English
409                map.insert(Language::English, 1.0);
410                map
411            },
412            Country::Haiti => {
413                // Haitian Creole, French
414                map.insert(Language::HaitianCreole, 0.8);
415                map.insert(Language::French, 0.2);
416                map
417            },
418            Country::Honduras => {
419                // Spanish
420                map.insert(Language::Spanish, 1.0);
421                map
422            },
423            Country::Hungary => {
424                // Hungarian
425                map.insert(Language::Hungarian, 1.0);
426                map
427            },
428            Country::Iceland => {
429                // Icelandic
430                map.insert(Language::Icelandic, 1.0);
431                map
432            },
433            Country::India => {
434                // Hindi, English, and major regional languages (representative selection)
435                map.insert(Language::Hindi, 0.4);
436                map.insert(Language::English, 0.1);
437                map.insert(Language::Bengali, 0.1);
438                map.insert(Language::Telugu, 0.08);
439                map.insert(Language::Marathi, 0.06);
440                map.insert(Language::Tamil, 0.06);
441                map.insert(Language::Urdu, 0.06);
442                map.insert(Language::Gujarati, 0.04);
443                map.insert(Language::Kannada, 0.03);
444                map.insert(Language::Malayalam, 0.03);
445                map.insert(Language::Oriya, 0.02);
446                map.insert(Language::Punjabi, 0.02);
447                map
448            },
449            Country::Indonesia => {
450                // Indonesian
451                map.insert(Language::Indonesian, 1.0);
452                map
453            },
454            Country::Iran => {
455                // Persian (Farsi)
456                map.insert(Language::Farsi, 1.0);
457                map
458            },
459            Country::Iraq => {
460                // Arabic, Kurdish
461                map.insert(Language::Arabic, 0.8);
462                map.insert(Language::Kurdish, 0.2);
463                map
464            },
465            Country::Ireland => {
466                // English, Irish Gaeilge
467                map.insert(Language::English, 0.98);
468                map.insert(Language::IrishGaeilge, 0.02);
469                map
470            },
471            Country::Israel => {
472                // Hebrew, Arabic
473                map.insert(Language::Hebrew, 0.9);
474                map.insert(Language::Arabic, 0.1);
475                map
476            },
477            Country::Italy => {
478                // Italian
479                map.insert(Language::Italian, 0.97);
480                map.insert(Language::German, 0.02);
481                map.insert(Language::French, 0.01);
482                map
483            },
484            Country::IvoryCoast => {
485                // French
486                map.insert(Language::French, 1.0);
487                map
488            },
489            Country::Jamaica => {
490                // English (with Jamaican Creole widely spoken)
491                map.insert(Language::English, 0.5);
492                map.insert(Language::JamaicanCreole, 0.5);
493                map
494            },
495            Country::Japan => {
496                // Japanese
497                map.insert(Language::Japanese, 1.0);
498                map
499            },
500            Country::Jordan => {
501                // Arabic
502                map.insert(Language::Arabic, 1.0);
503                map
504            },
505            Country::Kazakhstan => {
506                // Kazakh, Russian
507                map.insert(Language::Kazakh, 0.6);
508                map.insert(Language::Russian, 0.4);
509                map
510            },
511            Country::Kenya => {
512                // Swahili, English
513                map.insert(Language::Swahili, 0.7);
514                map.insert(Language::English, 0.3);
515                map
516            },
517            Country::Kiribati => {
518                // Gilbertese, English
519                map.insert(Language::Gilbertese, 0.9);
520                map.insert(Language::English, 0.1);
521                map
522            },
523            Country::Kosovo => {
524                // Albanian, Serbian
525                map.insert(Language::Albanian, 0.9);
526                map.insert(Language::Serbian, 0.1);
527                map
528            },
529            Country::Kuwait => {
530                // Arabic
531                map.insert(Language::Arabic, 1.0);
532                map
533            },
534            Country::Kyrgyzstan => {
535                // Kyrgyz, Russian
536                map.insert(Language::Kyrgyz, 0.7);
537                map.insert(Language::Russian, 0.3);
538                map
539            },
540            Country::Laos => {
541                // Lao
542                map.insert(Language::Lao, 1.0);
543                map
544            },
545            Country::Latvia => {
546                // Latvian
547                map.insert(Language::Latvian, 0.9);
548                map.insert(Language::Russian, 0.1);
549                map
550            },
551            Country::Lebanon => {
552                // Arabic, French widely used
553                map.insert(Language::Arabic, 0.8);
554                map.insert(Language::French, 0.2);
555                map
556            },
557            Country::Lesotho => {
558                // Sotho, English
559                map.insert(Language::Sotho, 0.9);
560                map.insert(Language::English, 0.1);
561                map
562            },
563            Country::Liberia => {
564                // English
565                map.insert(Language::English, 1.0);
566                map
567            },
568            Country::Libya => {
569                // Arabic
570                map.insert(Language::Arabic, 1.0);
571                map
572            },
573            Country::Liechtenstein => {
574                // German
575                map.insert(Language::German, 1.0);
576                map
577            },
578            Country::Lithuania => {
579                // Lithuanian
580                map.insert(Language::Lithuanian, 1.0);
581                map
582            },
583            Country::Luxembourg => {
584                // Luxembourgish, French, German
585                map.insert(Language::Luxembourgish, 0.5);
586                map.insert(Language::French, 0.3);
587                map.insert(Language::German, 0.2);
588                map
589            },
590            Country::Madagascar => {
591                // Malagasy, French
592                map.insert(Language::Malagasy, 0.8);
593                map.insert(Language::French, 0.2);
594                map
595            },
596            Country::Malawi => {
597                // English, Chichewa
598                map.insert(Language::English, 0.5);
599                map.insert(Language::Chichewa, 0.5);
600                map
601            },
602            Country::Malaysia => {
603                // Malay
604                map.insert(Language::Malay, 1.0);
605                map
606            },
607            Country::Maldives => {
608                // Dhivehi
609                map.insert(Language::Dhivehi, 1.0);
610                map
611            },
612            Country::Mali => {
613                // French
614                map.insert(Language::French, 1.0);
615                map
616            },
617            Country::Malta => {
618                // Maltese, English
619                map.insert(Language::Maltese, 0.9);
620                map.insert(Language::English, 0.1);
621                map
622            },
623            Country::MarshallIslands => {
624                // Marshallese, English
625                map.insert(Language::Marshallese, 0.9);
626                map.insert(Language::English, 0.1);
627                map
628            },
629            Country::Mauritania => {
630                // Arabic
631                map.insert(Language::Arabic, 1.0);
632                map
633            },
634            Country::Mauritius => {
635                // English, French, Creole widely used
636                map.insert(Language::English, 0.3);
637                map.insert(Language::French, 0.3);
638                map.insert(Language::MauritianCreole, 0.4);
639                map
640            },
641            Country::Mexico => {
642                // Spanish, plus indigenous languages (representative selection)
643                map.insert(Language::Spanish, 0.97);
644                map.insert(Language::Nahuatl, 0.015);
645                map.insert(Language::YucatecMaya, 0.005);
646                map.insert(Language::Tzotzil, 0.003);
647                map.insert(Language::Tzeltal, 0.003);
648                map.insert(Language::Chol, 0.002);
649                map.insert(Language::Mam, 0.001);
650                map.insert(Language::Chuj, 0.001);
651                map
652            },
653            Country::Micronesia => {
654                // English, plus local languages (transitional umbrella bucket)
655                map.insert(Language::English, 0.5);
656                #[allow(deprecated)]
657                map.insert(Language::VariousMicronesianLocal, 0.5);
658                map
659            },
660            Country::Moldova => {
661                // Romanian (Moldovan)
662                map.insert(Language::Romanian, 1.0);
663                map
664            },
665            Country::Monaco => {
666                // French
667                map.insert(Language::French, 1.0);
668                map
669            },
670            Country::Mongolia => {
671                // Mongolian
672                map.insert(Language::Mongolian, 1.0);
673                map
674            },
675            Country::Montenegro => {
676                // Montenegrin (very close to Serbian)
677                map.insert(Language::Serbian, 1.0);
678                map
679            },
680            Country::Morocco => {
681                // Arabic, Berber
682                map.insert(Language::Arabic, 0.8);
683                map.insert(Language::Berber, 0.2);
684                map
685            },
686            Country::Mozambique => {
687                // Portuguese
688                map.insert(Language::Portuguese, 1.0);
689                map
690            },
691            Country::Myanmar => {
692                // Burmese
693                map.insert(Language::Burmese, 1.0);
694                map
695            },
696            Country::Namibia => {
697                // English
698                map.insert(Language::English, 1.0);
699                map
700            },
701            Country::Nauru => {
702                // Nauruan, English
703                map.insert(Language::Nauruan, 0.9);
704                map.insert(Language::English, 0.1);
705                map
706            },
707            Country::Nepal => {
708                // Nepali
709                map.insert(Language::Nepali, 1.0);
710                map
711            },
712            Country::Netherlands => {
713                // Dutch
714                map.insert(Language::Dutch, 0.97);
715                map.insert(Language::English, 0.03);
716                map
717            },
718            Country::NewZealand => {
719                // English, Maori
720                map.insert(Language::English, 0.9);
721                map.insert(Language::Maori, 0.1);
722                map
723            },
724            Country::Nicaragua => {
725                // Spanish
726                map.insert(Language::Spanish, 1.0);
727                map
728            },
729            Country::Niger => {
730                // French
731                map.insert(Language::French, 1.0);
732                map
733            },
734            Country::Nigeria => {
735                // English + many local languages
736                map.insert(Language::English, 0.5);
737                map.insert(Language::Hausa, 0.2);
738                map.insert(Language::Yoruba, 0.15);
739                map.insert(Language::Igbo, 0.15);
740                map
741            },
742            Country::NorthKorea => {
743                // Korean
744                map.insert(Language::Korean, 1.0);
745                map
746            },
747            Country::NorthMacedonia => {
748                // Macedonian, Albanian
749                map.insert(Language::Macedonian, 0.85);
750                map.insert(Language::Albanian, 0.15);
751                map
752            },
753            Country::Norway => {
754                // Norwegian
755                map.insert(Language::Norwegian, 1.0);
756                map
757            },
758            Country::Oman => {
759                // Arabic
760                map.insert(Language::Arabic, 1.0);
761                map
762            },
763            Country::Pakistan => {
764                // Urdu, English plus regional
765                map.insert(Language::Urdu, 0.6);
766                map.insert(Language::English, 0.4);
767                map
768            },
769            Country::Palau => {
770                // Palauan, English
771                map.insert(Language::Palauan, 0.8);
772                map.insert(Language::English, 0.2);
773                map
774            },
775            Country::Palestine => {
776                // Arabic
777                map.insert(Language::Arabic, 1.0);
778                map
779            },
780            Country::Panama => {
781                // Spanish
782                map.insert(Language::Spanish, 1.0);
783                map
784            },
785            Country::PapuaNewGuinea => {
786                // English, Tok Pisin, Hiri Motu
787                map.insert(Language::English, 0.3);
788                map.insert(Language::TokPisin, 0.4);
789                map.insert(Language::HiriMotu, 0.3);
790                map
791            },
792            Country::Paraguay => {
793                // Spanish, Guarani
794                map.insert(Language::Spanish, 0.5);
795                map.insert(Language::Guarani, 0.5);
796                map
797            },
798            Country::Peru => {
799                // Spanish, Quechua, Aymara
800                map.insert(Language::Spanish, 0.8);
801                map.insert(Language::Quechua, 0.18);
802                map.insert(Language::Aymara, 0.02);
803                map
804            },
805            Country::Philippines => {
806                // Filipino, English
807                map.insert(Language::Filipino, 0.5);
808                map.insert(Language::English, 0.5);
809                map
810            },
811            Country::Poland => {
812                // Polish
813                map.insert(Language::Polish, 1.0);
814                map
815            },
816            Country::Portugal => {
817                // Portuguese
818                map.insert(Language::Portuguese, 1.0);
819                map
820            },
821            Country::Qatar => {
822                // Arabic
823                map.insert(Language::Arabic, 1.0);
824                map
825            },
826            Country::Romania => {
827                // Romanian
828                map.insert(Language::Romanian, 1.0);
829                map
830            },
831            Country::Russia => {
832                // Russian plus a representative set of minority languages
833                map.insert(Language::Russian, 0.95);
834                map.insert(Language::Tatar, 0.01);
835                map.insert(Language::Chechen, 0.01);
836                map.insert(Language::Bashkir, 0.01);
837                map.insert(Language::Chuvash, 0.008);
838                map.insert(Language::Yakut, 0.006);
839                map.insert(Language::Ossetian, 0.006);
840                map
841            },
842            Country::Rwanda => {
843                // Kinyarwanda, French, English
844                map.insert(Language::Kinyarwanda, 0.8);
845                map.insert(Language::French, 0.1);
846                map.insert(Language::English, 0.1);
847                map
848            },
849            Country::SaintKittsAndNevis => {
850                // English
851                map.insert(Language::English, 1.0);
852                map
853            },
854            Country::SaintLucia => {
855                // English, French Creole
856                map.insert(Language::English, 0.7);
857                map.insert(Language::FrenchCreole, 0.3);
858                map
859            },
860            Country::SaintVincentAndTheGrenadines => {
861                // English
862                map.insert(Language::English, 1.0);
863                map
864            },
865            Country::Samoa => {
866                // Samoan, English
867                map.insert(Language::Samoan, 0.9);
868                map.insert(Language::English, 0.1);
869                map
870            },
871            Country::SanMarino => {
872                // Italian
873                map.insert(Language::Italian, 1.0);
874                map
875            },
876            Country::SaoTomeAndPrincipe => {
877                // Portuguese
878                map.insert(Language::Portuguese, 1.0);
879                map
880            },
881            Country::SaudiArabia => {
882                // Arabic
883                map.insert(Language::Arabic, 1.0);
884                map
885            },
886            Country::Senegal => {
887                // French
888                map.insert(Language::French, 1.0);
889                map
890            },
891            Country::Serbia => {
892                // Serbian
893                map.insert(Language::Serbian, 1.0);
894                map
895            },
896            Country::Seychelles => {
897                // Seychellois Creole, French, English
898                map.insert(Language::SeychelloisCreole, 0.7);
899                map.insert(Language::French, 0.15);
900                map.insert(Language::English, 0.15);
901                map
902            },
903            Country::SierraLeone => {
904                // English
905                map.insert(Language::English, 1.0);
906                map
907            },
908            Country::Singapore => {
909                // English, Malay, Mandarin, Tamil
910                map.insert(Language::English, 0.4);
911                map.insert(Language::Malay, 0.2);
912                map.insert(Language::Mandarin, 0.35);
913                map.insert(Language::Tamil, 0.05);
914                map
915            },
916            Country::Slovakia => {
917                // Slovak
918                map.insert(Language::Slovak, 1.0);
919                map
920            },
921            Country::Slovenia => {
922                // Slovenian
923                map.insert(Language::Slovenian, 1.0);
924                map
925            },
926            Country::SolomonIslands => {
927                // English + Pijin
928                map.insert(Language::English, 0.5);
929                map.insert(Language::Pijin, 0.5);
930                map
931            },
932            Country::Somalia => {
933                // Somali, Arabic
934                map.insert(Language::Somali, 0.8);
935                map.insert(Language::Arabic, 0.2);
936                map
937            },
938            Country::SouthAfrica => {
939                // 11 official languages: we enumerate a representative set explicitly.
940                map.insert(Language::Zulu, 0.22);
941                map.insert(Language::Xhosa, 0.16);
942                map.insert(Language::Afrikaans, 0.13);
943                map.insert(Language::English, 0.09);
944                map.insert(Language::Sotho, 0.15);
945                map.insert(Language::Tswana, 0.15);
946                map.insert(Language::Ndebele, 0.06);
947                map.insert(Language::Swati, 0.04);
948                map
949            },
950            Country::SouthKorea => {
951                // Korean
952                map.insert(Language::Korean, 1.0);
953                map
954            },
955            Country::SouthSudan => {
956                // English + many local languages, Dinka, Nuer
957                map.insert(Language::English, 0.3);
958                map.insert(Language::Dinka, 0.35);
959                map.insert(Language::Nuer, 0.35);
960                map
961            },
962            Country::Spain => {
963                // Spanish, Catalan, Galician, Basque
964                map.insert(Language::Spanish, 0.88);
965                map.insert(Language::Catalan, 0.06);
966                map.insert(Language::Galician, 0.02);
967                map.insert(Language::Basque, 0.02);
968                map
969            },
970            Country::SriLanka => {
971                // Sinhala, Tamil
972                map.insert(Language::Sinhala, 0.7);
973                map.insert(Language::Tamil, 0.3);
974                map
975            },
976            Country::Sudan => {
977                // Arabic, English
978                map.insert(Language::Arabic, 0.9);
979                map.insert(Language::English, 0.1);
980                map
981            },
982            Country::Suriname => {
983                // Dutch
984                map.insert(Language::Dutch, 1.0);
985                map
986            },
987            Country::Sweden => {
988                // Swedish
989                map.insert(Language::Swedish, 1.0);
990                map
991            },
992            Country::Switzerland => {
993                // German, French, Italian, Romansh
994                map.insert(Language::German, 0.65);
995                map.insert(Language::French, 0.23);
996                map.insert(Language::Italian, 0.08);
997                map.insert(Language::Romansh, 0.04);
998                map
999            },
1000            Country::Syria => {
1001                // Arabic
1002                map.insert(Language::Arabic, 1.0);
1003                map
1004            },
1005            Country::Taiwan => {
1006                // Mandarin, Taiwanese Hokkien, Hakka
1007                map.insert(Language::Mandarin, 0.7);
1008                map.insert(Language::TaiwaneseHokkien, 0.25);
1009                map.insert(Language::Hakka, 0.05);
1010                map
1011            },
1012            Country::Tajikistan => {
1013                // Tajik
1014                map.insert(Language::Tajik, 1.0);
1015                map
1016            },
1017            Country::Tanzania => {
1018                // Swahili, English
1019                map.insert(Language::Swahili, 0.9);
1020                map.insert(Language::English, 0.1);
1021                map
1022            },
1023            Country::Thailand => {
1024                // Thai
1025                map.insert(Language::Thai, 1.0);
1026                map
1027            },
1028            Country::TimorLeste => {
1029                // Tetum, Portuguese
1030                map.insert(Language::Tetum, 0.7);
1031                map.insert(Language::Portuguese, 0.3);
1032                map
1033            },
1034            Country::Togo => {
1035                // French
1036                map.insert(Language::French, 1.0);
1037                map
1038            },
1039            Country::Tonga => {
1040                // Tongan, English
1041                map.insert(Language::Tongan, 0.9);
1042                map.insert(Language::English, 0.1);
1043                map
1044            },
1045            Country::TrinidadAndTobago => {
1046                // English
1047                map.insert(Language::English, 1.0);
1048                map
1049            },
1050            Country::Tunisia => {
1051                // Arabic
1052                map.insert(Language::Arabic, 1.0);
1053                map
1054            },
1055            Country::Turkey => {
1056                // Turkish
1057                map.insert(Language::Turkish, 1.0);
1058                map
1059            },
1060            Country::Turkmenistan => {
1061                // Turkmen
1062                map.insert(Language::Turkmen, 1.0);
1063                map
1064            },
1065            Country::Tuvalu => {
1066                // Tuvaluan, English
1067                map.insert(Language::Tuvaluan, 0.9);
1068                map.insert(Language::English, 0.1);
1069                map
1070            },
1071            Country::Uganda => {
1072                // English, Swahili + many local languages
1073                map.insert(Language::English, 0.5);
1074                map.insert(Language::Swahili, 0.5);
1075                map
1076            },
1077            Country::UAE => {
1078                // Arabic
1079                map.insert(Language::Arabic, 1.0);
1080                map
1081            },
1082            Country::Ukraine => {
1083                // Ukrainian, Russian
1084                map.insert(Language::Ukrainian, 0.9);
1085                map.insert(Language::Russian, 0.1);
1086                map
1087            },
1088            Country::UnitedKingdom => {
1089                // English, Welsh, Scottish Gaelic
1090                map.insert(Language::English, 0.95);
1091                map.insert(Language::Welsh, 0.03);
1092                map.insert(Language::ScottishGaelic, 0.02);
1093                map
1094            },
1095            Country::USA => {
1096                // English (de facto), Spanish widely spoken
1097                map.insert(Language::English, 0.8);
1098                map.insert(Language::Spanish, 0.2);
1099                map
1100            },
1101            Country::Uruguay => {
1102                // Spanish
1103                map.insert(Language::Spanish, 1.0);
1104                map
1105            },
1106            Country::Uzbekistan => {
1107                // Uzbek
1108                map.insert(Language::Uzbek, 1.0);
1109                map
1110            },
1111            Country::Vanuatu => {
1112                // Bislama, English, French
1113                map.insert(Language::Bislama, 0.6);
1114                map.insert(Language::English, 0.2);
1115                map.insert(Language::French, 0.2);
1116                map
1117            },
1118            Country::VaticanCity => {
1119                // Italian, Latin
1120                map.insert(Language::Italian, 0.99);
1121                map.insert(Language::Latin, 0.01);
1122                map
1123            },
1124            Country::Venezuela => {
1125                // Spanish
1126                map.insert(Language::Spanish, 1.0);
1127                map
1128            },
1129            Country::Vietnam => {
1130                // Vietnamese
1131                map.insert(Language::Vietnamese, 1.0);
1132                map
1133            },
1134            Country::Yemen => {
1135                // Arabic
1136                map.insert(Language::Arabic, 1.0);
1137                map
1138            },
1139            Country::Zambia => {
1140                // English plus major local languages (Chichewa/Nyanja represented explicitly; remainder via transitional umbrella bucket)
1141                map.insert(Language::English, 0.5);
1142                map.insert(Language::Chichewa, 0.2);
1143                #[allow(deprecated)]
1144                map.insert(Language::VariousBembaNyanjaLocal, 0.3);
1145                map
1146            },
1147            Country::Zimbabwe => {
1148                // 16 official languages, including English, Shona, Ndebele
1149                map.insert(Language::English, 0.3);
1150                map.insert(Language::Shona, 0.35);
1151                map.insert(Language::Ndebele, 0.35);
1152                map
1153            },
1154        }
1155    }
1156}
1157
1158#[cfg(test)]
1159mod language_distribution_tests {
1160    use super::*;
1161
1162    #[test]
1163    fn test_distribution_for_simple_case() {
1164        let c = Country::Japan; // Known single language: Japanese
1165        let dist = c.language_distribution();
1166        assert_eq!(dist.len(), 1, "Japan should have exactly one language entry");
1167        assert_eq!(*dist.get(&Language::Japanese).unwrap_or(&0.0), 1.0, "Japanese should be 100% in Japan");
1168    }
1169
1170    #[test]
1171    fn test_distribution_multiple_languages() {
1172        let c = Country::Belgium;
1173        let dist = c.language_distribution();
1174        assert!(dist.contains_key(&Language::Dutch), "Belgium should have Dutch");
1175        assert!(dist.contains_key(&Language::French), "Belgium should have French");
1176        assert!(dist.contains_key(&Language::German), "Belgium should have German");
1177
1178        let dutch = dist.get(&Language::Dutch).copied().unwrap_or(0.0);
1179        let french = dist.get(&Language::French).copied().unwrap_or(0.0);
1180        let german = dist.get(&Language::German).copied().unwrap_or(0.0);
1181        let sum = dutch + french + german;
1182
1183        assert!((sum - 1.0).abs() < f64::EPSILON, "Sum of language proportions should be 1.0");
1184    }
1185
1186    #[test]
1187    fn test_distribution_with_indigenous() {
1188        let c = Country::Bolivia;
1189        let dist = c.language_distribution();
1190        // Bolivia: Spanish (0.6), Quechua (0.3), Aymara (0.1)
1191        let spanish = dist.get(&Language::Spanish).copied().unwrap_or(0.0);
1192        let quechua = dist.get(&Language::Quechua).copied().unwrap_or(0.0);
1193        let aymara = dist.get(&Language::Aymara).copied().unwrap_or(0.0);
1194
1195        assert!((spanish - 0.6).abs() < f64::EPSILON, "Spanish should be 0.6 in Bolivia");
1196        assert!((quechua - 0.3).abs() < f64::EPSILON, "Quechua should be 0.3 in Bolivia");
1197        assert!((aymara - 0.1).abs() < f64::EPSILON, "Aymara should be 0.1 in Bolivia");
1198    }
1199}