From c4e57f15dfa78e2ff5f4128e8f4e7c737f32c57e Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Thu, 22 Aug 2024 17:02:44 +0200 Subject: [PATCH] langid: extend and fix conversions LANGID 9 should convert to "en" and 1033 to "en-US". 36 to "sl" and 1060 to "sl-SI". Likewise backwards. Otherwise, we are loosing disambiguation between generic and country-specific language variants. Signed-off-by: Simon Rozman --- UnitTests/langid.cpp | 4 +- include/stdex/langid.hpp | 1532 ++++++++++++++++++++++---------------- 2 files changed, 896 insertions(+), 640 deletions(-) diff --git a/UnitTests/langid.cpp b/UnitTests/langid.cpp index 5f2ccfe49..2b23f5fe5 100644 --- a/UnitTests/langid.cpp +++ b/UnitTests/langid.cpp @@ -25,10 +25,10 @@ namespace UnitTests Assert::AreEqual(2057, stdex::langid_from_rfc1766("EN-GB")); Assert::AreEqual(2057, stdex::langid_from_rfc1766("EN_GB")); - Assert::AreEqual(1060, stdex::langid_from_rfc1766("sl")); + Assert::AreEqual(36, stdex::langid_from_rfc1766("sl")); Assert::AreEqual(1060, stdex::langid_from_rfc1766("sl-SI")); Assert::AreEqual(1060, stdex::langid_from_rfc1766("sl_SI")); - Assert::AreEqual(1060, stdex::langid_from_rfc1766("SL")); + Assert::AreEqual(36, stdex::langid_from_rfc1766("SL")); Assert::AreEqual(1060, stdex::langid_from_rfc1766("SL-SI")); Assert::AreEqual(1060, stdex::langid_from_rfc1766("SL_SI")); } diff --git a/include/stdex/langid.hpp b/include/stdex/langid.hpp index bddaef9e5..28cc62182 100644 --- a/include/stdex/langid.hpp +++ b/include/stdex/langid.hpp @@ -29,15 +29,16 @@ namespace stdex using langid = uint16_t; #endif - constexpr langid langid_unknown = 127; - constexpr langid langid_system = 2048; + constexpr langid langid_neutral = 0x0; + constexpr langid langid_unknown = 0x7f; + constexpr langid langid_system = 0x800; - constexpr langid sublangid_neutral = 0<<10; ///< Language neutral - constexpr langid sublangid_default = 1<<10; ///< User default - constexpr langid sublangid_sys_default = 2<<10; ///< System default - constexpr langid sublangid_custom_default = 3<<10; ///< Default custom language/locale - constexpr langid sublangid_custom_unspecified = 4<<10; ///< Custom language/locale - constexpr langid sublangid_ui_custom_default = 5<<10; ///< Default custom MUI language/locale + constexpr langid sublangid_neutral = 0 << 10; ///< Language neutral + constexpr langid sublangid_default = 1 << 10; ///< User default + constexpr langid sublangid_sys_default = 2 << 10; ///< System default + constexpr langid sublangid_custom_default = 3 << 10; ///< Default custom language/locale + constexpr langid sublangid_custom_unspecified = 4 << 10; ///< Custom language/locale + constexpr langid sublangid_ui_custom_default = 5 << 10; ///< Default custom MUI language/locale /// /// Simplifies language code to base language @@ -82,199 +83,458 @@ namespace stdex for (i = 0; ; ++i) { auto a = stdex::tolower(str1[i]); auto b = stdex::tolower(str2[i]); - auto a_end = !a || stdex::ispunct(a); - auto b_end = !b || stdex::ispunct(b); - if (a_end && b_end) return false; - if (b_end || a > b) return false; - if (a_end || a < b) return true; + if (!a && !b) return false; + if (!b) return false; + if (!a) return true; + auto a_punct = stdex::ispunct(a); + auto b_punct = stdex::ispunct(b); + if (a_punct && b_punct) continue; + if (b_punct) return false; + if (a_punct) return true; + if (a > b) return false; + if (a < b) return true; } } }; - struct language_mapping - { - langid id; ///< Language ID - std::map sublanguages; ///< Sublanguages + static const std::map languages = { + {"af-ZA", 0x436}, // Afrikaans (South Africa) + {"af", 0x36}, // Afrikaans + {"am-ET", 0x45e}, // Amharic (Ethiopia) + {"am", 0x5e}, // Amharic + {"ar-AE", 0x3801}, // Arabic (United Arab Emirates) + {"ar-BH", 0x3c01}, // Arabic (Bahrain) + {"ar-DZ", 0x1401}, // Arabic (Algeria) + {"ar-EG", 0xc01}, // Arabic (Egypt) + {"ar-IQ", 0x801}, // Arabic (Iraq) + {"ar-JO", 0x2c01}, // Arabic (Jordan) + {"ar-KW", 0x3401}, // Arabic (Kuwait) + {"ar-LB", 0x3001}, // Arabic (Lebanon) + {"ar-LY", 0x1001}, // Arabic (Libya) + {"ar-MA", 0x1801}, // Arabic (Morocco) + {"ar-OM", 0x2001}, // Arabic (Oman) + {"ar-QA", 0x4001}, // Arabic (Qatar) + {"ar-SA", 0x401}, // Arabic (Saudi Arabia) + {"ar-SY", 0x2801}, // Arabic (Syria) + {"ar-TN", 0x1c01}, // Arabic (Tunisia) + {"ar-YE", 0x2401}, // Arabic (Yemen) + {"ar", 0x1}, // Arabic + {"arn-CL", 0x47a}, // Mapuche (Chile) + {"arn", 0x7a}, // Mapuche + {"as-IN", 0x44d}, // Assamese (India) + {"as", 0x4d}, // Assamese + {"az-Cyrl-AZ", 0x742c}, // Azerbaijani (Cyrillic, Azerbaijan) + {"az-Cyrl-AZ", 0x82c}, // Azerbaijani (Cyrillic, Azerbaijan) + {"az-Latn-AZ", 0x42c}, // Azerbaijani (Latin, Azerbaijan) + {"az-Latn-AZ", 0x782c}, // Azerbaijani (Latin, Azerbaijan) + {"az", 0x2c}, // Azerbaijani + {"ba-RU", 0x46d}, // Bashkir (Russia) + {"ba", 0x6d}, // Bashkir + {"be-BY", 0x423}, // Belarusian (Belarus) + {"be", 0x23}, // Belarusian + {"bg-BG", 0x402}, // Bulgarian (Bulgaria) + {"bg", 0x2}, // Bulgarian + {"bin-NG", 0x466}, // Edo (Nigeria) + {"bin", 0x66}, // Edo + {"bn-BD", 0x845}, // Bangla (Bangladesh) + {"bn-IN", 0x445}, // Bengali (India) + {"bn", 0x45}, // Bangla + {"bo-CN", 0x451}, // Tibetan (China) + {"bo", 0x51}, // Tibetan + {"br-FR", 0x47e}, // Breton (France) + {"br", 0x7e}, // Breton + {"bs-Cyrl-BA", 0x201a}, // Bosnian (Cyrillic, Bosnia and Herzegovina) + {"bs-Cyrl-BA", 0x641a}, // Bosnian (Cyrillic, Bosnia and Herzegovina) + {"bs-Latn-BA", 0x141a}, // Bosnian (Latin, Bosnia & Herzegovina) + {"bs-Latn-BA", 0x681a}, // Bosnian (Latin, Bosnia & Herzegovina) + {"bs-Latn-BA", 0x781a}, // Bosnian (Latin, Bosnia & Herzegovina) + {"ca-ES-valencia", 0x803}, // Valencian (Spain) + {"ca-ES", 0x403}, // Catalan (Catalan) + {"ca", 0x3}, // Catalan + {"chr-Cher-US", 0x45c}, // Cherokee (Cherokee, United States) + {"chr-Cher-US", 0x7c5c}, // Cherokee (Cherokee, United States) + {"chr", 0x5c}, // Cherokee + {"co-FR", 0x483}, // Corsican (France) + {"co", 0x83}, // Corsican + {"cs-CZ", 0x405}, // Czech (Czechia) + {"cs", 0x5}, // Czech + {"cy-GB", 0x452}, // Welsh (United Kingdom) + {"cy", 0x52}, // Welsh + {"da-DK", 0x406}, // Danish (Denmark) + {"da", 0x6}, // Danish + {"de-AT", 0xc07}, // German (Austria) + {"de-CH", 0x807}, // German (Switzerland) + {"de-DE", 0x407}, // German (Germany) + {"de-LI", 0x1407}, // German (Liechtenstein) + {"de-LU", 0x1007}, // German (Luxembourg) + {"de", 0x7}, // German + {"dsb-DE", 0x7c2e}, // Lower Sorbian (Germany) + {"dsb-DE", 0x82e}, // Lower Sorbian (Germany) + {"dv-MV", 0x465}, // Divehi (Maldives) + {"dv", 0x65}, // Divehi + {"dz-BT", 0xc51}, // Dzongkha (Bhutan) + {"el-GR", 0x408}, // Greek (Greece) + {"el", 0x8}, // Greek + {"en-029", 0x2409}, // English (Caribbean) + {"en-AE", 0x4c09}, // English (United Arab Emirates) + {"en-AU", 0xc09}, // English (Australia) + {"en-BZ", 0x2809}, // English (Belize) + {"en-CA", 0x1009}, // English (Canada) + {"en-GB", 0x809}, // English (United Kingdom) + {"en-HK", 0x3c09}, // English (Hong Kong SAR) + {"en-ID", 0x3809}, // English (Indonesia) + {"en-IE", 0x1809}, // English (Ireland) + {"en-IN", 0x4009}, // English (India) + {"en-JM", 0x2009}, // English (Jamaica) + {"en-MY", 0x4409}, // English (Malaysia) + {"en-NZ", 0x1409}, // English (New Zealand) + {"en-PH", 0x3409}, // English (Philippines) + {"en-SG", 0x4809}, // English (Singapore) + {"en-TT", 0x2c09}, // English (Trinidad & Tobago) + {"en-US", 0x409}, // English (United States) + {"en-ZA", 0x1c09}, // English (South Africa) + {"en-ZW", 0x3009}, // English (Zimbabwe) + {"en", 0x9}, // English + {"es-419", 0x580a}, // Spanish (Latin America) + {"es-AR", 0x2c0a}, // Spanish (Argentina) + {"es-BO", 0x400a}, // Spanish (Bolivia) + {"es-CL", 0x340a}, // Spanish (Chile) + {"es-CO", 0x240a}, // Spanish (Colombia) + {"es-CR", 0x140a}, // Spanish (Costa Rica) + {"es-CU", 0x5c0a}, // Spanish (Cuba) + {"es-DO", 0x1c0a}, // Spanish (Dominican Republic) + {"es-EC", 0x300a}, // Spanish (Ecuador) + {"es-ES_tradnl", 0x40a}, // Spanish (Spain, Traditional Sort) + {"es-ES", 0xc0a}, // Spanish (Spain, International Sort) + {"es-GT", 0x100a}, // Spanish (Guatemala) + {"es-HN", 0x480a}, // Spanish (Honduras) + {"es-MX", 0x80a}, // Spanish (Mexico) + {"es-NI", 0x4c0a}, // Spanish (Nicaragua) + {"es-PA", 0x180a}, // Spanish (Panama) + {"es-PE", 0x280a}, // Spanish (Peru) + {"es-PR", 0x500a}, // Spanish (Puerto Rico) + {"es-PY", 0x3c0a}, // Spanish (Paraguay) + {"es-SV", 0x440a}, // Spanish (El Salvador) + {"es-US", 0x540a}, // Spanish (United States) + {"es-UY", 0x380a}, // Spanish (Uruguay) + {"es-VE", 0x200a}, // Spanish (Venezuela) + {"es", 0xa}, // Spanish + {"et-EE", 0x425}, // Estonian (Estonia) + {"et", 0x25}, // Estonian + {"eu-ES", 0x42d}, // Basque (Basque) + {"eu", 0x2d}, // Basque + {"fa-AF", 0x48c}, // Persian (Afghanistan) + {"fa-IR", 0x429}, // Persian (Iran) + {"fa", 0x29}, // Persian + {"fa", 0x8c}, // Persian + {"ff-Latn-NG", 0x467}, // Fulah (Latin, Nigeria) + {"ff-Latn-SN", 0x7c67}, // Fulah (Latin, Senegal) + {"ff-Latn-SN", 0x867}, // Fulah (Latin, Senegal) + {"ff", 0x67}, // Fulah + {"fi-FI", 0x40b}, // Finnish (Finland) + {"fi", 0xb}, // Finnish + {"fil-PH", 0x464}, // Filipino (Philippines) + {"fil", 0x64}, // Filipino + {"fo-FO", 0x438}, // Faroese (Faroe Islands) + {"fo", 0x38}, // Faroese + {"fr-029", 0x1c0c}, // French (Caribbean) + {"fr-BE", 0x80c}, // French (Belgium) + {"fr-CA", 0xc0c}, // French (Canada) + {"fr-CD", 0x240c}, // French Congo (DRC) + {"fr-CH", 0x100c}, // French (Switzerland) + {"fr-CI", 0x300c}, // French (Côte d’Ivoire) + {"fr-CM", 0x2c0c}, // French (Cameroon) + {"fr-FR", 0x40c}, // French (France) + {"fr-HT", 0x3c0c}, // French (Haiti) + {"fr-LU", 0x140c}, // French (Luxembourg) + {"fr-MA", 0x380c}, // French (Morocco) + {"fr-MC", 0x180c}, // French (Monaco) + {"fr-ML", 0x340c}, // French (Mali) + {"fr-RE", 0x200c}, // French (Réunion) + {"fr-SN", 0x280c}, // French (Senegal) + {"fr", 0xc}, // French + {"fy-NL", 0x462}, // Western Frisian (Netherlands) + {"fy", 0x62}, // Western Frisian + {"ga-IE", 0x83c}, // Irish (Ireland) + {"ga", 0x3c}, // Irish + {"gd-GB", 0x491}, // Scottish Gaelic (United Kingdom) + {"gd", 0x91}, // Scottish Gaelic + {"gl-ES", 0x456}, // Galician (Galician) + {"gl", 0x56}, // Galician + {"gn-PY", 0x474}, // Guarani (Paraguay) + {"gn", 0x74}, // Guarani + {"gsw-FR", 0x484}, // Alsatian (France) + {"gsw", 0x84}, // Swiss German + {"gu-IN", 0x447}, // Gujarati (India) + {"gu", 0x47}, // Gujarati + {"ha-Latn-NG", 0x468}, // Hausa (Latin, Nigeria) + {"ha-Latn-NG", 0x7c68}, // Hausa (Latin, Nigeria) + {"ha", 0x68}, // Hausa + {"haw-US", 0x475}, // Hawaiian (United States) + {"haw", 0x75}, // Hawaiian + {"he-IL", 0x40d}, // Hebrew (Israel) + {"he", 0xd}, // Hebrew + {"hi-IN", 0x439}, // Hindi (India) + {"hi", 0x39}, // Hindi + {"hr-BA", 0x101a}, // Croatian (Bosnia & Herzegovina) + {"hr-HR", 0x41a}, // Croatian (Croatia) + {"hr", 0x1a}, // Croatian + {"hsb-DE", 0x42e}, // Upper Sorbian (Germany) + {"hsb", 0x2e}, // Upper Sorbian + {"hu-HU", 0x40e}, // Hungarian (Hungary) + {"hu", 0xe}, // Hungarian + {"hy-AM", 0x42b}, // Armenian (Armenia) + {"hy", 0x2b}, // Armenian + {"ibb-NG", 0x469}, // Ibibio (Nigeria) + {"ibb", 0x69}, // Ibibio + {"id-ID", 0x421}, // Indonesian (Indonesia) + {"id", 0x21}, // Indonesian + {"ig-NG", 0x470}, // Igbo (Nigeria) + {"ig", 0x70}, // Igbo + {"ii-CN", 0x478}, // Yi (China) + {"ii", 0x78}, // Yi + {"is-IS", 0x40f}, // Icelandic (Iceland) + {"is", 0xf}, // Icelandic + {"it-CH", 0x810}, // Italian (Switzerland) + {"it-IT", 0x410}, // Italian (Italy) + {"it", 0x10}, // Italian + {"iu-Cans-CA", 0x45d}, // Inuktitut (Syllabics, Canada) + {"iu-Cans-CA", 0x785d}, // Inuktitut (Syllabics, Canada) + {"iu-Latn-CA", 0x7c5d}, // Inuktitut (Latin, Canada) + {"iu-Latn-CA", 0x85d}, // Inuktitut (Latin, Canada) + {"iu", 0x5d}, // Inuktitut + {"ja-JP", 0x411}, // Japanese (Japan) + {"ja", 0x11}, // Japanese + {"ka-GE", 0x437}, // Georgian (Georgia) + {"ka", 0x37}, // Georgian + {"kk-KZ", 0x43f}, // Kazakh (Kazakhstan) + {"kk", 0x3f}, // Kazakh + {"kl-GL", 0x46f}, // Kalaallisut (Greenland) + {"kl", 0x6f}, // Kalaallisut + {"km-KH", 0x453}, // Khmer (Cambodia) + {"km", 0x53}, // Khmer + {"kn-IN", 0x44b}, // Kannada (India) + {"kn", 0x4b}, // Kannada + {"ko-KR", 0x412}, // Korean (Korea) + {"ko", 0x12}, // Korean + {"kok-IN", 0x457}, // Konkani (India) + {"kok", 0x57}, // Konkani + {"kr-Latn-NG", 0x471}, // Kanuri (Latin, Nigeria) + {"kr", 0x71}, // Kanuri + {"ks-Arab-IN", 0x460}, // Kashmiri (Arabic) + {"ks-Deva-IN", 0x860}, // Kashmiri (Devanagari) + {"ks", 0x60}, // Kashmiri + {"ku-Arab-IQ", 0x492}, // Central Kurdish (Iraq) + {"ku-Arab-IQ", 0x7c92}, // Central Kurdish (Iraq) + {"ku", 0x92}, // Central Kurdish + {"ky-KG", 0x440}, // Kyrgyz (Kyrgyzstan) + {"ky", 0x40}, // Kyrgyz + {"la-VA", 0x476}, // Latin (Vatican City) + {"la", 0x76}, // Latin + {"lb-LU", 0x46e}, // Luxembourgish (Luxembourg) + {"lb", 0x6e}, // Luxembourgish + {"lo-LA", 0x454}, // Lao (Laos) + {"lo", 0x54}, // Lao + {"lt-LT", 0x427}, // Lithuanian (Lithuania) + {"lt", 0x27}, // Lithuanian + {"lv-LV", 0x426}, // Latvian (Latvia) + {"lv", 0x26}, // Latvian + {"mi-NZ", 0x481}, // Maori (New Zealand) + {"mi", 0x81}, // Maori + {"mk-MK", 0x42f}, // Macedonian (North Macedonia) + {"mk", 0x2f}, // Macedonian + {"ml-IN", 0x44c}, // Malayalam (India) + {"ml", 0x4c}, // Malayalam + {"mn-MN", 0x450}, // Mongolian (Mongolia) + {"mn-MN", 0x7850}, // Mongolian (Mongolia) + {"mn-Mong-CN", 0x7c50}, // Mongolian (Traditional Mongolian, China) + {"mn-Mong-CN", 0x850}, // Mongolian (Traditional Mongolian, China) + {"mn-Mong-MN", 0xc50}, // Mongolian (Traditional Mongolian, Mongolia) + {"mn", 0x50}, // Mongolian + {"mni-IN", 0x458}, // Manipuri (Bangla, India) + {"mni", 0x58}, // Manipuri + {"moh-CA", 0x47c}, // Mohawk (Canada) + {"moh", 0x7c}, // Mohawk + {"mr-IN", 0x44e}, // Marathi (India) + {"mr", 0x4e}, // Marathi + {"ms-BN", 0x83e}, // Malay (Brunei) + {"ms-MY", 0x43e}, // Malay (Malaysia) + {"ms", 0x3e}, // Malay + {"mt-MT", 0x43a}, // Maltese (Malta) + {"mt", 0x3a}, // Maltese + {"my-MM", 0x455}, // Burmese (Myanmar) + {"my", 0x55}, // Burmese + {"nb-NO", 0x414}, // Norwegian Bokmål (Norway) + {"nb-NO", 0x7c14}, // Norwegian Bokmål (Norway) + {"nb", 0x14}, // Norwegian Bokmål + {"ne-IN", 0x861}, // Nepali (India) + {"ne-NP", 0x461}, // Nepali (Nepal) + {"ne", 0x61}, // Nepali + {"nl-BE", 0x813}, // Dutch (Belgium) + {"nl-NL", 0x413}, // Dutch (Netherlands) + {"nl", 0x13}, // Dutch + {"nn-NO", 0x7814}, // Norwegian Nynorsk (Norway) + {"nn-NO", 0x814}, // Norwegian Nynorsk (Norway) + {"nso-ZA", 0x46c}, // Sesotho sa Leboa (South Africa) + {"nso", 0x6c}, // Sesotho sa Leboa + {"oc-FR", 0x482}, // Occitan (France) + {"oc", 0x82}, // Occitan + {"om-ET", 0x472}, // Oromo (Ethiopia) + {"om", 0x72}, // Oromo + {"or-IN", 0x448}, // Odia (India) + {"or", 0x48}, // Odia + {"pa-Arab-PK", 0x7c46}, // Punjabi (Pakistan) + {"pa-Arab-PK", 0x846}, // Punjabi (Pakistan) + {"pa-IN", 0x446}, // Punjabi (India) + {"pa", 0x46}, // Punjabi + {"pap-029", 0x479}, // Papiamento (Caribbean) + {"pap", 0x79}, // Papiamento + {"pl-PL", 0x415}, // Polish (Poland) + {"pl", 0x15}, // Polish + {"ps-AF", 0x463}, // Pashto (Afghanistan) + {"ps", 0x63}, // Pashto + {"pt-BR", 0x416}, // Portuguese (Brazil) + {"pt-PT", 0x816}, // Portuguese (Portugal) + {"pt", 0x16}, // Portuguese + {"qps-Latn-x-sh", 0x901}, // Pseudo (Pseudo Selfhost) + {"qps-ploc", 0x501}, // Pseudo (Pseudo) + {"qps-ploca", 0x5fe}, // Pseudo (Pseudo Asia) + {"qps-plocm", 0x9ff}, // Pseudo (Pseudo Mirrored) + {"quc-Latn-GT", 0x486}, // Kʼicheʼ (Latin, Guatemala) + {"quc-Latn-GT", 0x7c86}, // Kʼicheʼ (Latin, Guatemala) + {"quc", 0x86}, // Kʼicheʼ + {"quz-BO", 0x46b}, // Quechua (Bolivia) + {"quz-EC", 0x86b}, // Quechua (Ecuador) + {"quz-PE", 0xc6b}, // Quechua (Peru) + {"quz", 0x6b}, // Quechua + {"rm-CH", 0x417}, // Romansh (Switzerland) + {"rm", 0x17}, // Romansh + {"ro-MD", 0x818}, // Romanian (Moldova) + {"ro-RO", 0x418}, // Romanian (Romania) + {"ro", 0x18}, // Romanian + {"ru-MD", 0x819}, // Russian (Moldova) + {"ru-RU", 0x419}, // Russian (Russia) + {"ru", 0x19}, // Russian + {"rw-RW", 0x487}, // Kinyarwanda (Rwanda) + {"rw", 0x87}, // Kinyarwanda + {"sa-IN", 0x44f}, // Sanskrit (India) + {"sa", 0x4f}, // Sanskrit + {"sah-RU", 0x485}, // Sakha (Russia) + {"sah", 0x85}, // Sakha + {"sd-Arab-PK", 0x7c59}, // Sindhi (Pakistan) + {"sd-Arab-PK", 0x859}, // Sindhi (Pakistan) + {"sd-Deva-IN", 0x459}, // Sindhi (Devanagari, India) + {"sd", 0x59}, // Sindhi + {"se-FI", 0xc3b}, // Sami, Northern (Finland) + {"se-NO", 0x43b}, // Sami, Northern (Norway) + {"se-SE", 0x83b}, // Sami, Northern (Sweden) + {"se", 0x3b}, // Sami, Northern + {"si-LK", 0x45b}, // Sinhala (Sri Lanka) + {"si", 0x5b}, // Sinhala + {"sk-SK", 0x41b}, // Slovak (Slovakia) + {"sk", 0x1b}, // Slovak + {"sl-SI", 0x424}, // Slovenian (Slovenia) + {"sl", 0x24}, // Slovenian + {"sma-NO", 0x183b}, // Sami, Southern (Norway) + {"sma-SE", 0x1c3b}, // Sami, Southern (Sweden) + {"sma-SE", 0x783b}, // Sami, Southern (Sweden) + {"smj-NO", 0x103b}, // Sami, Lule (Norway) + {"smj-SE", 0x143b}, // Sami, Lule (Sweden) + {"smj-SE", 0x7c3b}, // Sami, Lule (Sweden) + {"smn-FI", 0x243b}, // Sami, Inari (Finland) + {"smn-FI", 0x703b}, // Sami, Inari (Finland) + {"sms-FI", 0x203b}, // Sami, Skolt (Finland) + {"sms-FI", 0x743b}, // Sami, Skolt (Finland) + {"so-SO", 0x477}, // Somali (Somalia) + {"so", 0x77}, // Somali + {"sq-AL", 0x41c}, // Albanian (Albania) + {"sq", 0x1c}, // Albanian + {"sr-Cyrl-BA", 0x1c1a}, // Serbian (Cyrillic, Bosnia and Herzegovina) + {"sr-Cyrl-CS", 0xc1a}, // Serbian (Cyrillic, Serbia and Montenegro (Former)) + {"sr-Cyrl-ME", 0x301a}, // Serbian (Cyrillic, Montenegro) + {"sr-Cyrl-RS", 0x281a}, // Serbian (Cyrillic, Serbia) + {"sr-Cyrl-RS", 0x6c1a}, // Serbian (Cyrillic, Serbia) + {"sr-Latn-BA", 0x181a}, // Serbian (Latin, Bosnia & Herzegovina) + {"sr-Latn-CS", 0x81a}, // Serbian (Latin, Serbia and Montenegro (Former)) + {"sr-Latn-ME", 0x2c1a}, // Serbian (Latin, Montenegro) + {"sr-Latn-RS", 0x241a}, // Serbian (Latin, Serbia) + {"sr-Latn-RS", 0x701a}, // Serbian (Latin, Serbia) + {"sr-Latn-RS", 0x7c1a}, // Serbian (Latin, Serbia) + {"st-ZA", 0x430}, // Sesotho (South Africa) + {"st", 0x30}, // Sesotho + {"sv-FI", 0x81d}, // Swedish (Finland) + {"sv-SE", 0x41d}, // Swedish (Sweden) + {"sv", 0x1d}, // Swedish + {"sw-KE", 0x441}, // Kiswahili (Kenya) + {"sw", 0x41}, // Kiswahili + {"syr-SY", 0x45a}, // Syriac (Syria) + {"syr", 0x5a}, // Syriac + {"ta-IN", 0x449}, // Tamil (India) + {"ta-LK", 0x849}, // Tamil (Sri Lanka) + {"ta", 0x49}, // Tamil + {"te-IN", 0x44a}, // Telugu (India) + {"te", 0x4a}, // Telugu + {"tg-Cyrl-TJ", 0x428}, // Tajik (Cyrillic, Tajikistan) + {"tg-Cyrl-TJ", 0x7c28}, // Tajik (Cyrillic, Tajikistan) + {"tg", 0x28}, // Tajik + {"th-TH", 0x41e}, // Thai (Thailand) + {"th", 0x1e}, // Thai + {"ti-ER", 0x873}, // Tigrinya (Eritrea) + {"ti-ET", 0x473}, // Tigrinya (Ethiopia) + {"ti", 0x73}, // Tigrinya + {"tk-TM", 0x442}, // Turkmen (Turkmenistan) + {"tk", 0x42}, // Turkmen + {"tn-BW", 0x832}, // Setswana (Botswana) + {"tn-ZA", 0x432}, // Setswana (South Africa) + {"tn", 0x32}, // Setswana + {"tr-TR", 0x41f}, // Turkish (Türkiye) + {"tr", 0x1f}, // Turkish + {"ts-ZA", 0x431}, // Xitsonga (South Africa) + {"ts", 0x31}, // Xitsonga + {"tt-RU", 0x444}, // Tatar (Russia) + {"tt", 0x44}, // Tatar + {"tzm-Arab-MA", 0x45f}, // Central Atlas Tamazight (Arabic, Morocco) + {"tzm-Latn-DZ", 0x7c5f}, // Central Atlas Tamazight (Latin, Algeria) + {"tzm-Latn-DZ", 0x85f}, // Central Atlas Tamazight (Latin, Algeria) + {"tzm-Tfng-MA", 0x105f}, // Central Atlas Tamazight (Tifinagh, Morocco) + {"tzm-Tfng-MA", 0x785f}, // Central Atlas Tamazight (Tifinagh, Morocco) + {"tzm", 0x5f}, // Central Atlas Tamazight + {"ug-CN", 0x480}, // Uyghur (China) + {"ug", 0x80}, // Uyghur + {"uk-UA", 0x422}, // Ukrainian (Ukraine) + {"uk", 0x22}, // Ukrainian + {"ur-IN", 0x820}, // Urdu (India) + {"ur-PK", 0x420}, // Urdu (Pakistan) + {"ur", 0x20}, // Urdu + {"uz-Cyrl-UZ", 0x7843}, // Uzbek (Cyrillic, Uzbekistan) + {"uz-Cyrl-UZ", 0x843}, // Uzbek (Cyrillic, Uzbekistan) + {"uz-Latn-UZ", 0x443}, // Uzbek (Latin, Uzbekistan) + {"uz-Latn-UZ", 0x7c43}, // Uzbek (Latin, Uzbekistan) + {"uz", 0x43}, // Uzbek + {"ve-ZA", 0x433}, // Venda (South Africa) + {"ve", 0x33}, // Venda + {"vi-VN", 0x42a}, // Vietnamese (Vietnam) + {"vi", 0x2a}, // Vietnamese + {"wo-SN", 0x488}, // Wolof (Senegal) + {"wo", 0x88}, // Wolof + {"xh-ZA", 0x434}, // isiXhosa (South Africa) + {"xh", 0x34}, // isiXhosa + {"yi-001", 0x43d}, // Yiddish (World) + {"yi", 0x3d}, // Yiddish + {"yo-NG", 0x46a}, // Yoruba (Nigeria) + {"yo", 0x6a}, // Yoruba + {"zh-CN", 0x7804}, // Chinese (Simplified, China) + {"zh-CN", 0x804}, // Chinese (Simplified, China) + {"zh-HK", 0x7c04}, // Chinese (Traditional, Hong Kong SAR) + {"zh-HK", 0xc04}, // Chinese (Traditional, Hong Kong SAR) + {"zh-MO", 0x1404}, // Chinese (Traditional, Macao SAR) + {"zh-SG", 0x1004}, // Chinese (Simplified, Singapore) + {"zh-TW", 0x404}, // Chinese (Traditional, Taiwan) + {"zh", 0x4}, // Chinese + {"zu-ZA", 0x435}, // isiZulu (South Africa) + {"zu", 0x35}, // isiZulu }; - static const std::map languages = { - {"af", {1078, {}}}, // Afrikaans - {"ar", {0x01, // Arabic - { - {"ae", static_cast(14337)}, // Arabic(U.A.E.) - {"bh", static_cast(15361)}, // Arabic(Bahrain) - {"dz", static_cast(5121)}, // Arabic(Algeria) - {"eg", static_cast(3073)}, // Arabic(Egypt) - {"iq", static_cast(2049)}, // Arabic(Iraq) - {"jo", static_cast(11265)}, // Arabic(Jordan) - {"kw", static_cast(13313)}, // Arabic(Kuwait) - {"lb", static_cast(12289)}, // Arabic(Lebanon) - {"ly", static_cast(4097)}, // Arabic(Libya) - {"ma", static_cast(6145)}, // Arabic(Morocco) - {"om", static_cast(8193)}, // Arabic(Oman) - {"qa", static_cast(16385)}, // Arabic(Qatar) - {"sa", static_cast(1025)}, // Arabic(Saudi Arabia) - {"sy", static_cast(10241)}, // Arabic(Syria) - {"tn", static_cast(7169)}, // Arabic(Tunisia) - {"ye", static_cast(9217)}, // Arabic(Yemen) - }}}, - {"be", {1059, {}}}, // Belarusian - {"bg", {1026, {}}}, // Bulgarian - {"ca", {1027, {}}}, // Catalan - {"cs", {1029, {}}}, // Czech - {"da", {1030, {}}}, // Danish - {"de", {0x07, // German - { - {"at", static_cast(3079)}, // German(Austrian) - {"ch", static_cast(2055)}, // German(Swiss) - {"de", static_cast(1031)}, // German(Germany) - {"li", static_cast(5127)}, // German(Liechtenstein) - {"lu", static_cast(4103)}, // German(Luxembourg) - }}}, - {"el", {1032, {}}}, // Greek - {"en", {0x09, // English - { - {"au", static_cast(3081)}, // English(Australian) - {"bz", static_cast(10249)}, // English(Belize) - {"ca", static_cast(4105)}, // English(Canadian) - {"ca", static_cast(9225)}, // English(Caribbean) - {"gb", static_cast(2057)}, // English(British) - {"ie", static_cast(6153)}, // English(Ireland) - {"jm", static_cast(8201)}, // English(Jamaica) - {"nz", static_cast(5129)}, // English(New Zealand) - {"tt", static_cast(11273)}, // English(Trinidad) - {"us", static_cast(1033)}, // English(United States) - {"za", static_cast(7177)}, // English(South Africa) - }}}, - {"es", {0x0a, // Spanish - { - {"ar", static_cast(11274)}, // Spanish(Argentina) - {"bo", static_cast(16394)}, // Spanish(Bolivia) - {"cl", static_cast(13322)}, // Spanish(Chile) - {"co", static_cast(9226)}, // Spanish(Colombia) - {"cr", static_cast(5130)}, // Spanish(Costa Rica) - {"do", static_cast(7178)}, // Spanish(Dominican Republic) - {"ec", static_cast(12298)}, // Spanish(Ecuador) - {"es", static_cast(1034)}, // Spanish(Spain) - {"gt", static_cast(4106)}, // Spanish(Guatemala) - {"hn", static_cast(18442)}, // Spanish(Honduras) - {"mx", static_cast(2058)}, // Spanish(Mexican) - {"ni", static_cast(19466)}, // Spanish(Nicaragua) - {"pa", static_cast(6154)}, // Spanish(Panama) - {"pe", static_cast(10250)}, // Spanish(Peru) - {"pr", static_cast(20490)}, // Spanish(Puerto Rico) - {"py", static_cast(15370)}, // Spanish(Paraguay) - {"sv", static_cast(17418)}, // Spanish(El Salvador) - {"uy", static_cast(14346)}, // Spanish(Uruguay) - {"ve", static_cast(8202)}, // Spanish(Venezuela) - }}}, - {"et", {1061, {}}}, // Estonian - {"eu", {1069, {}}}, // Basque - {"fa", {1065, {}}}, // Farsi - {"fi", {1035, {}}}, // Finnish - {"fo", {1080, {}}}, // Faeroese - {"fr", {0x0c, // French - { - {"be", static_cast(2060)}, // French(Belgian) - {"ca", static_cast(3084)}, // French(Canadian) - {"ch", static_cast(4108)}, // French(Swiss) - {"fr", static_cast(1036)}, // French(Luxembourg) - {"lu", static_cast(5132)}, // French(Luxembourg) - }}}, - {"gd", {1084, {}}}, // Gaelic(Scots) - {"he", {1037, {}}}, // Hebrew - {"hi", {1081, {}}}, // Hindi - {"hr", {1050, {}}}, // Croatian - {"hu", {1038, {}}}, // Hungarian - {"in", {1057, {}}}, // Indonesian - {"is", {1039, {}}}, // Icelandic - {"it", {0x10, // Italian - { - {"ch", static_cast(2064)}, // Italian(Swiss) - {"it", static_cast(1040)}, // Italian(Italy) - }}}, - {"ja", {1041, {}}}, // Japanese - {"ji", {1085, {}}}, // Yiddish - {"ko", {0x12, // Korean - { - {"johab", static_cast(2066)}, // Korean(Johab) - {"kr", static_cast(1042)}, // Korean(Korea) - }}}, - {"lt", {1063, {}}}, // Lithuanian - {"lv", {1062, {}}}, // Latvian - {"mk", {1071, {}}}, // Macedonian (FYROM) - {"ms", {1086, {}}}, // Malaysian - {"mt", {1082, {}}}, // Maltese - {"nl", {0x13, // Dutch - { - {"be", static_cast(2067)}, // Dutch(Belgian) - {"nl", static_cast(1043)}, // Dutch(Netherland) - }}}, - {"no", {0x14, // Norwegian - { - {"bokmaal", static_cast(1044)}, // Norwegian(Bokmaal) - {"nynorsk", static_cast(2068)}, // Norwegian(Nynorsk) - }}}, - {"pl", {1045, {}}}, // Polish - {"pt", {0x16, // Portuguese - { - {"br", static_cast(1046)}, // Portuguese(Brazil) - {"pt", static_cast(2070)}, // Portuguese(Portugal) - }}}, - {"rm", {1047, {}}}, // Rhaeto-Romanic - {"ro", {0x18, // Romanian - { - {"mo", static_cast(2072)}, // Romanian(Moldavia) - {"ro", static_cast(1048)}, // Romanian(Romania) - }}}, - {"ru", {0x19, // Russian - { - {"mo", static_cast(2073)}, // Russian(Moldavia) - {"ru", static_cast(1049)}, // Russian(Russia) - }}}, - {"sb", {1070, {}}}, // Sorbian - {"sk", {1051, {}}}, // Slovak - {"sl", {1060, {}}}, // Slovenian - {"sq", {1052, {}}}, // Albanian - {"sr", {0x1a, // Serbian - { - {"cyrillic", static_cast(3098)}, // Serbian(Cyrillic) - {"latin", static_cast(2074)}, // Serbian(Latin) - }}}, - {"sv", {0x1d, // Swedish - { - {"fi", static_cast(2077)}, // Swedish(Finland) - {"se", static_cast(1053)}, // Swedish(Sweden) - }}}, - {"sx", {1072, {}}}, // Sutu - {"sz", {1083, {}}}, // Sami(Lappish) - {"th", {1054, {}}}, // Thai - {"tn", {1074, {}}}, // Tswana - {"tr", {1055, {}}}, // Turkish - {"ts", {1073, {}}}, // Tsonga - {"uk", {1058, {}}}, // Ukrainian - {"ur", {1056, {}}}, // Urdu - {"ve", {1075, {}}}, // Venda - {"vi", {1066, {}}}, // Vietnamese - {"xh", {1076, {}}}, // Xhosa - {"zh", {0x04, // Chinese - { - {"cn", static_cast(2052)}, // Chinese(PRC) - {"hk", static_cast(3076)}, // Chinese(Hong Kong) - {"sg", static_cast(4100)}, // Chinese(Singapore) - {"tw", static_cast(1028)}, // Chinese(Taiwan) - }}}, - {"zu", {1077, {}}}, // Zulu - }; - - if (auto el = languages.find(rfc1766); el != languages.end()) { - if (!el->second.sublanguages.empty()) { - if (auto n = stdex::strlen(el->first); ispunct(rfc1766[n])) { - n++; - if (auto el_sub = el->second.sublanguages.find(&rfc1766[n]); el_sub != el->second.sublanguages.end()) - return el_sub->second; - } - } - return el->second.id; - } + if (auto el = languages.find(rfc1766); el != languages.end()) + return el->second; return langid_unknown; } @@ -286,448 +546,444 @@ namespace stdex /// /// \returns Language name in RFC1766 syntax or `fallback` if not found. /// - inline _Ret_maybenull_z_ const char *rfc1766_from_langid(_In_ langid lang, _In_opt_z_ const char* fallback = nullptr) + inline _Ret_maybenull_z_ const char* rfc1766_from_langid(_In_ langid lang, _In_opt_z_ const char* fallback = nullptr) { - static const std::map languages = { - {1, "ar"}, - {2, "bg-bg"}, - {3, "ca-es"}, - {4, "zh"}, - {5, "cs-cz"}, - {6, "da-dk"}, - {7, "de-de"}, - {8, "el-gr"}, - {9, "en"}, - {10, "es-es"}, - {11, "fi-fi"}, - {12, "fr-fr"}, - {13, "he-il"}, - {14, "hu-hu"}, - {15, "is-is"}, - {16, "it-it"}, - {17, "ja-jp"}, - {18, "ko-kr"}, - {19, "nl-nl"}, - {20, "nb-no"}, - {21, "pl-pl"}, - {22, "pt-br"}, - {23, "rm-ch"}, - {24, "ro-ro"}, - {25, "ru-ru"}, - {26, "hr-hr"}, - {27, "sk-sk"}, - {28, "sq-al"}, - {29, "sv-se"}, - {30, "th-th"}, - {31, "tr-tr"}, - {32, "ur-pk"}, - {33, "id-id"}, - {34, "uk-ua"}, - {35, "be-by"}, - {36, "sl-si"}, - {37, "et-ee"}, - {38, "lv-lv"}, - {39, "lt-lt"}, - {40, "tg-tj"}, - {41, "fa-ir"}, - {42, "vi-vn"}, - {43, "hy-am"}, - {44, "az-az"}, - {45, "eu-es"}, - {46, "hsb"}, - {47, "mk-mk"}, - {48, "st-za"}, - {49, "ts-za"}, - {50, "tn-za"}, - {51, "ve-za"}, - {52, "xh-za"}, - {53, "zu-za"}, - {54, "af-za"}, - {55, "ka-ge"}, - {56, "fo-fo"}, - {57, "hi-in"}, - {58, "mt-mt"}, - {59, "se-no"}, - {60, "ga-ie"}, - {61, "yi"}, - {62, "ms-my"}, - {63, "kk-kz"}, - {64, "ky-kg"}, - {65, "sw-ke"}, - {66, "tk-tm"}, - {67, "uz-uz"}, - {68, "tt-ru"}, - {69, "bn-bd"}, - {70, "pa-in"}, - {71, "gu-in"}, - {72, "or-in"}, - {73, "ta-in"}, - {74, "te-in"}, - {75, "kn-in"}, - {76, "ml-in"}, - {77, "as-in"}, - {78, "mr-in"}, - {79, "sa-in"}, - {80, "mn-mn"}, - {81, "bo-cn"}, - {82, "cy-gb"}, - {83, "km-kh"}, - {84, "lo-la"}, - {85, "my-mm"}, - {86, "gl-es"}, - {87, "kok"}, - {88, "mni"}, - {89, "sd-pk"}, - {90, "syr"}, - {91, "si-lk"}, - {92, "chr"}, - {93, "iu-ca"}, - {94, "am-et"}, - {95, "tzm"}, - {96, "ks-in"}, - {97, "ne-np"}, - {98, "fy-nl"}, - {99, "ps-af"}, - {100, "fil"}, - {101, "dv-mv"}, - {102, "bin"}, - {103, "ff-sn"}, - {104, "ha-ng"}, - {105, "ibb"}, - {106, "yo-ng"}, - {107, "quz"}, - {108, "nso"}, - {109, "ba-ru"}, - {110, "lb-lu"}, - {111, "kl-gl"}, - {112, "ig-ng"}, - {113, "kr-ng"}, - {114, "om-et"}, - {115, "ti-er"}, - {116, "gn-py"}, - {117, "haw"}, - {118, "la-va"}, - {119, "so-so"}, - {120, "ii-cn"}, - {121, "pap"}, - {122, "arn"}, - {124, "moh"}, - {126, "br-fr"}, - {127, "iv-iv"}, - {128, "ug-cn"}, - {129, "mi-nz"}, - {130, "oc-fr"}, - {131, "co-fr"}, - {132, "gsw"}, - {133, "sah"}, - {134, "quc"}, - {135, "rw-rw"}, - {136, "wo-sn"}, - {140, "fa-ir"}, - {145, "gd-gb"}, - {146, "ku-iq"}, - {1025, "ar-sa"}, - {1026, "bg"}, - {1027, "ca"}, - {1028, "zh-tw"}, - {1029, "cs"}, - {1030, "da"}, - {1031, "de"}, - {1032, "el"}, - {1033, "en-us"}, - {1034, "es"}, - {1035, "fi"}, - {1036, "fr"}, - {1037, "he"}, - {1038, "hu"}, - {1039, "is"}, - {1040, "it"}, - {1041, "ja"}, - {1042, "ko"}, - {1043, "nl"}, - {1044, "no"}, - {1045, "pl"}, - {1046, "pt-br"}, - {1047, "rm"}, - {1048, "ro"}, - {1049, "ru"}, - {1050, "hr"}, - {1051, "sk"}, - {1052, "sq"}, - {1053, "sv"}, - {1054, "th"}, - {1055, "tr"}, - {1056, "ur"}, - {1057, "id"}, - {1058, "uk"}, - {1059, "be"}, - {1060, "sl"}, - {1061, "et"}, - {1062, "lv"}, - {1063, "lt"}, - {1064, "tg-tj"}, - {1065, "fa"}, - {1066, "vi"}, - {1067, "hy"}, - {1068, "az"}, - {1069, "eu"}, - {1070, "sb"}, - {1071, "mk"}, - {1072, "sx"}, - {1073, "ts"}, - {1074, "tn"}, - {1075, "ve-za"}, - {1076, "xh"}, - {1077, "zu"}, - {1078, "af"}, - {1079, "ka"}, - {1080, "fo"}, - {1081, "hi"}, - {1082, "mt"}, - {1083, "se-no"}, - {1084, "gd"}, - {1085, "yi"}, - {1086, "ms"}, - {1087, "kk"}, - {1088, "kz"}, - {1089, "sw"}, - {1090, "tk-tm"}, - {1091, "uz"}, - {1092, "tt"}, - {1093, "bn"}, - {1094, "pa"}, - {1095, "gu"}, - {1096, "or"}, - {1097, "ta"}, - {1098, "te"}, - {1099, "kn"}, - {1100, "ml"}, - {1101, "as"}, - {1102, "mr"}, - {1103, "sa"}, - {1104, "mn"}, - {1105, "bo-cn"}, - {1106, "cy-gb"}, - {1107, "km-kh"}, - {1108, "lo-la"}, - {1109, "my-mm"}, - {1110, "gl"}, - {1111, "kok"}, - {1112, "mni"}, - {1113, "sd-in"}, - {1114, "syr"}, - {1115, "si-lk"}, - {1116, "chr"}, - {1117, "iu-ca"}, - {1118, "am-et"}, - {1119, "tzm"}, - {1120, "ks-in"}, - {1121, "ne-np"}, - {1122, "fy-nl"}, - {1123, "ps-af"}, - {1124, "fil"}, - {1125, "div"}, - {1126, "bin"}, - {1127, "ff-ng"}, - {1128, "ha-ng"}, - {1129, "ibb"}, - {1130, "yo-ng"}, - {1131, "quz"}, - {1132, "nso"}, - {1133, "ba-ru"}, - {1134, "lb-lu"}, - {1135, "kl-gl"}, - {1136, "ig-ng"}, - {1137, "kr-ng"}, - {1138, "om-et"}, - {1139, "ti-et"}, - {1140, "gn-py"}, - {1141, "haw"}, - {1142, "la-va"}, - {1143, "so-so"}, - {1144, "ii-cn"}, - {1145, "pap"}, - {1146, "arn"}, - {1148, "moh"}, - {1150, "br-fr"}, - {1152, "ug-cn"}, - {1153, "mi-nz"}, - {1154, "oc-fr"}, - {1155, "co-fr"}, - {1156, "gsw"}, - {1157, "sah"}, - {1158, "quc"}, - {1159, "rw-rw"}, - {1160, "wo-sn"}, - {1164, "fa-af"}, - {1169, "gd-gb"}, - {1170, "ku-iq"}, - {1281, "en-us"}, - {1534, "qps"}, - {2049, "ar-iq"}, - {2051, "ca-es"}, - {2052, "zh-cn"}, - {2055, "de-ch"}, - {2057, "en-gb"}, - {2058, "es-mx"}, - {2060, "fr-be"}, - {2064, "it-ch"}, - {2067, "nl-be"}, - {2068, "nn-no"}, - {2070, "pt"}, - {2072, "ro-md"}, - {2073, "ru-md"}, - {2074, "sr"}, - {2077, "sv-fi"}, - {2080, "ur-in"}, - {2092, "az"}, - {2094, "dsb"}, - {2098, "tn-bw"}, - {2107, "se-se"}, - {2108, "ga-ie"}, - {2110, "ms"}, - {2115, "uz"}, - {2117, "bn-bd"}, - {2118, "pa-pk"}, - {2121, "ta-lk"}, - {2128, "mn-cn"}, - {2137, "sd-pk"}, - {2141, "iu-ca"}, - {2143, "tzm"}, - {2144, "ks-in"}, - {2145, "ne"}, - {2151, "ff-sn"}, - {2155, "quz"}, - {2163, "ti-er"}, - {2305, "en-us"}, - {2559, "ar-sa"}, - {3073, "ar-eg"}, - {3076, "zh-hk"}, - {3079, "de-at"}, - {3081, "en-au"}, - {3082, "es"}, - {3084, "fr-ca"}, - {3098, "sr"}, - {3131, "se-fi"}, - {3152, "mn-mn"}, - {3153, "dz-bt"}, - {3179, "quz"}, - {4096, "ks-in"}, - {4097, "ar-ly"}, - {4100, "zh-sg"}, - {4103, "de-lu"}, - {4105, "en-ca"}, - {4106, "es-gt"}, - {4108, "fr-ch"}, - {4122, "hr-ba"}, - {4155, "smj"}, - {4191, "tzm"}, - {5120, "en-us"}, - {5121, "ar-dz"}, - {5124, "zh-mo"}, - {5127, "de-li"}, - {5129, "en-nz"}, - {5130, "es-cr"}, - {5132, "fr-lu"}, - {5146, "bs-ba"}, - {5179, "smj"}, - {6145, "ar-ma"}, - {6153, "en-ie"}, - {6154, "es-pa"}, - {6156, "fr-mc"}, - {6170, "sr-ba"}, - {6203, "sma"}, - {7169, "ar-tn"}, - {7177, "en-za"}, - {7178, "es-do"}, - {7180, "fr"}, - {7194, "sr-ba"}, - {7227, "sma"}, - {8193, "ar-om"}, - {8201, "en-jm"}, - {8202, "es-ve"}, - {8204, "fr-re"}, - {8218, "bs-ba"}, - {8251, "sms"}, - {9217, "ar-ye"}, - {9225, "en"}, - {9226, "es-co"}, - {9228, "fr-cd"}, - {9242, "sr-rs"}, - {9275, "smn"}, - {10241, "ar-sy"}, - {10249, "en-bz"}, - {10250, "es-pe"}, - {10252, "fr-sn"}, - {10266, "sr-rs"}, - {11265, "ar-jo"}, - {11273, "en-tt"}, - {11274, "es-ar"}, - {11276, "fr-cm"}, - {11290, "sr-me"}, - {12289, "ar-lb"}, - {12297, "en-zw"}, - {12298, "es-ec"}, - {12300, "fr-ci"}, - {12314, "sr-me"}, - {13313, "ar-kw"}, - {13321, "en-ph"}, - {13322, "es-cl"}, - {13324, "fr-ml"}, - {14337, "ar-ae"}, - {14345, "en-id"}, - {14346, "es-uy"}, - {14348, "fr-ma"}, - {15361, "ar-bh"}, - {15369, "en-hk"}, - {15370, "es-py"}, - {15372, "fr-ht"}, - {16385, "ar-qa"}, - {16393, "en-in"}, - {16394, "es-bo"}, - {17417, "en-my"}, - {17418, "es-sv"}, - {18441, "en-sg"}, - {18442, "es-hn"}, - {19465, "en-ae"}, - {19466, "es-ni"}, - {20490, "es-pr"}, - {21514, "es-us"}, - {22538, "es"}, - {23562, "es-cu"}, - {25626, "bs-ba"}, - {26650, "bs-ba"}, - {27674, "sr-rs"}, - {28698, "sr-rs"}, - {28731, "smn"}, - {29740, "az-az"}, - {29755, "sms"}, - {30724, "zh-cn"}, - {30740, "nn-no"}, - {30746, "bs-ba"}, - {30764, "az-az"}, - {30779, "sma"}, - {30787, "uz-uz"}, - {30800, "mn-mn"}, - {30813, "iu-ca"}, - {30815, "tzm"}, - {31748, "zh-hk"}, - {31764, "nb-no"}, - {31770, "sr-rs"}, - {31784, "tg-tj"}, - {31790, "dsb"}, - {31803, "smj"}, - {31811, "uz-uz"}, - {31814, "pa-pk"}, - {31824, "mn-cn"}, - {31833, "sd-pk"}, - {31836, "chr"}, - {31837, "iu-ca"}, - {31839, "tzm"}, - {31847, "ff-sn"}, - {31848, "ha-ng"}, - {31878, "quc"}, - {31890, "ku-iq"}, + static const std::map languages = { + {0x1, "ar"}, // Arabic + {0x401, "ar-SA"}, // Arabic (Saudi Arabia) + {0x801, "ar-IQ"}, // Arabic (Iraq) + {0xc01, "ar-EG"}, // Arabic (Egypt) + {0x1001, "ar-LY"}, // Arabic (Libya) + {0x1401, "ar-DZ"}, // Arabic (Algeria) + {0x1801, "ar-MA"}, // Arabic (Morocco) + {0x1c01, "ar-TN"}, // Arabic (Tunisia) + {0x2001, "ar-OM"}, // Arabic (Oman) + {0x2401, "ar-YE"}, // Arabic (Yemen) + {0x2801, "ar-SY"}, // Arabic (Syria) + {0x2c01, "ar-JO"}, // Arabic (Jordan) + {0x3001, "ar-LB"}, // Arabic (Lebanon) + {0x3401, "ar-KW"}, // Arabic (Kuwait) + {0x3801, "ar-AE"}, // Arabic (United Arab Emirates) + {0x3c01, "ar-BH"}, // Arabic (Bahrain) + {0x4001, "ar-QA"}, // Arabic (Qatar) + {0x2, "bg"}, // Bulgarian + {0x402, "bg-BG"}, // Bulgarian (Bulgaria) + {0x3, "ca"}, // Catalan + {0x403, "ca-ES"}, // Catalan (Catalan) + {0x803, "ca-ES-valencia"}, // Valencian (Spain) + {0x4, "zh"}, // Chinese + {0x404, "zh-TW"}, // Chinese (Traditional, Taiwan) + {0x804, "zh-CN"}, // Chinese (Simplified, China) + {0xc04, "zh-HK"}, // Chinese (Traditional, Hong Kong SAR) + {0x1004, "zh-SG"}, // Chinese (Simplified, Singapore) + {0x1404, "zh-MO"}, // Chinese (Traditional, Macao SAR) + {0x7804, "zh-CN"}, // Chinese (Simplified, China) + {0x7c04, "zh-HK"}, // Chinese (Traditional, Hong Kong SAR) + {0x5, "cs"}, // Czech + {0x405, "cs-CZ"}, // Czech (Czechia) + {0x6, "da"}, // Danish + {0x406, "da-DK"}, // Danish (Denmark) + {0x7, "de"}, // German + {0x407, "de-DE"}, // German (Germany) + {0x807, "de-CH"}, // German (Switzerland) + {0xc07, "de-AT"}, // German (Austria) + {0x1007, "de-LU"}, // German (Luxembourg) + {0x1407, "de-LI"}, // German (Liechtenstein) + {0x8, "el"}, // Greek + {0x408, "el-GR"}, // Greek (Greece) + {0x9, "en"}, // English + {0x409, "en-US"}, // English (United States) + {0x809, "en-GB"}, // English (United Kingdom) + {0xc09, "en-AU"}, // English (Australia) + {0x1009, "en-CA"}, // English (Canada) + {0x1409, "en-NZ"}, // English (New Zealand) + {0x1809, "en-IE"}, // English (Ireland) + {0x1c09, "en-ZA"}, // English (South Africa) + {0x2009, "en-JM"}, // English (Jamaica) + {0x2409, "en-029"}, // English (Caribbean) + {0x2809, "en-BZ"}, // English (Belize) + {0x2c09, "en-TT"}, // English (Trinidad & Tobago) + {0x3009, "en-ZW"}, // English (Zimbabwe) + {0x3409, "en-PH"}, // English (Philippines) + {0x3809, "en-ID"}, // English (Indonesia) + {0x3c09, "en-HK"}, // English (Hong Kong SAR) + {0x4009, "en-IN"}, // English (India) + {0x4409, "en-MY"}, // English (Malaysia) + {0x4809, "en-SG"}, // English (Singapore) + {0x4c09, "en-AE"}, // English (United Arab Emirates) + {0xa, "es"}, // Spanish + {0x40a, "es-ES_tradnl"}, // Spanish (Spain, Traditional Sort) + {0x80a, "es-MX"}, // Spanish (Mexico) + {0xc0a, "es-ES"}, // Spanish (Spain, International Sort) + {0x100a, "es-GT"}, // Spanish (Guatemala) + {0x140a, "es-CR"}, // Spanish (Costa Rica) + {0x180a, "es-PA"}, // Spanish (Panama) + {0x1c0a, "es-DO"}, // Spanish (Dominican Republic) + {0x200a, "es-VE"}, // Spanish (Venezuela) + {0x240a, "es-CO"}, // Spanish (Colombia) + {0x280a, "es-PE"}, // Spanish (Peru) + {0x2c0a, "es-AR"}, // Spanish (Argentina) + {0x300a, "es-EC"}, // Spanish (Ecuador) + {0x340a, "es-CL"}, // Spanish (Chile) + {0x380a, "es-UY"}, // Spanish (Uruguay) + {0x3c0a, "es-PY"}, // Spanish (Paraguay) + {0x400a, "es-BO"}, // Spanish (Bolivia) + {0x440a, "es-SV"}, // Spanish (El Salvador) + {0x480a, "es-HN"}, // Spanish (Honduras) + {0x4c0a, "es-NI"}, // Spanish (Nicaragua) + {0x500a, "es-PR"}, // Spanish (Puerto Rico) + {0x540a, "es-US"}, // Spanish (United States) + {0x580a, "es-419"}, // Spanish (Latin America) + {0x5c0a, "es-CU"}, // Spanish (Cuba) + {0xb, "fi"}, // Finnish + {0x40b, "fi-FI"}, // Finnish (Finland) + {0xc, "fr"}, // French + {0x40c, "fr-FR"}, // French (France) + {0x80c, "fr-BE"}, // French (Belgium) + {0xc0c, "fr-CA"}, // French (Canada) + {0x100c, "fr-CH"}, // French (Switzerland) + {0x140c, "fr-LU"}, // French (Luxembourg) + {0x180c, "fr-MC"}, // French (Monaco) + {0x1c0c, "fr-029"}, // French (Caribbean) + {0x200c, "fr-RE"}, // French (Réunion) + {0x240c, "fr-CD"}, // French Congo (DRC) + {0x280c, "fr-SN"}, // French (Senegal) + {0x2c0c, "fr-CM"}, // French (Cameroon) + {0x300c, "fr-CI"}, // French (Côte d’Ivoire) + {0x340c, "fr-ML"}, // French (Mali) + {0x380c, "fr-MA"}, // French (Morocco) + {0x3c0c, "fr-HT"}, // French (Haiti) + {0xd, "he"}, // Hebrew + {0x40d, "he-IL"}, // Hebrew (Israel) + {0xe, "hu"}, // Hungarian + {0x40e, "hu-HU"}, // Hungarian (Hungary) + {0xf, "is"}, // Icelandic + {0x40f, "is-IS"}, // Icelandic (Iceland) + {0x10, "it"}, // Italian + {0x410, "it-IT"}, // Italian (Italy) + {0x810, "it-CH"}, // Italian (Switzerland) + {0x11, "ja"}, // Japanese + {0x411, "ja-JP"}, // Japanese (Japan) + {0x12, "ko"}, // Korean + {0x412, "ko-KR"}, // Korean (Korea) + {0x13, "nl"}, // Dutch + {0x413, "nl-NL"}, // Dutch (Netherlands) + {0x813, "nl-BE"}, // Dutch (Belgium) + {0x14, "nb"}, // Norwegian Bokmål + {0x414, "nb-NO"}, // Norwegian Bokmål (Norway) + {0x814, "nn-NO"}, // Norwegian Nynorsk (Norway) + {0x7814, "nn-NO"}, // Norwegian Nynorsk (Norway) + {0x7c14, "nb-NO"}, // Norwegian Bokmål (Norway) + {0x15, "pl"}, // Polish + {0x415, "pl-PL"}, // Polish (Poland) + {0x16, "pt"}, // Portuguese + {0x416, "pt-BR"}, // Portuguese (Brazil) + {0x816, "pt-PT"}, // Portuguese (Portugal) + {0x17, "rm"}, // Romansh + {0x417, "rm-CH"}, // Romansh (Switzerland) + {0x18, "ro"}, // Romanian + {0x418, "ro-RO"}, // Romanian (Romania) + {0x818, "ro-MD"}, // Romanian (Moldova) + {0x19, "ru"}, // Russian + {0x419, "ru-RU"}, // Russian (Russia) + {0x819, "ru-MD"}, // Russian (Moldova) + {0x1a, "hr"}, // Croatian + {0x41a, "hr-HR"}, // Croatian (Croatia) + {0x81a, "sr-Latn-CS"}, // Serbian (Latin, Serbia and Montenegro (Former)) + {0xc1a, "sr-Cyrl-CS"}, // Serbian (Cyrillic, Serbia and Montenegro (Former)) + {0x101a, "hr-BA"}, // Croatian (Bosnia & Herzegovina) + {0x141a, "bs-Latn-BA"}, // Bosnian (Latin, Bosnia & Herzegovina) + {0x181a, "sr-Latn-BA"}, // Serbian (Latin, Bosnia & Herzegovina) + {0x1c1a, "sr-Cyrl-BA"}, // Serbian (Cyrillic, Bosnia and Herzegovina) + {0x201a, "bs-Cyrl-BA"}, // Bosnian (Cyrillic, Bosnia and Herzegovina) + {0x241a, "sr-Latn-RS"}, // Serbian (Latin, Serbia) + {0x281a, "sr-Cyrl-RS"}, // Serbian (Cyrillic, Serbia) + {0x2c1a, "sr-Latn-ME"}, // Serbian (Latin, Montenegro) + {0x301a, "sr-Cyrl-ME"}, // Serbian (Cyrillic, Montenegro) + {0x641a, "bs-Cyrl-BA"}, // Bosnian (Cyrillic, Bosnia and Herzegovina) + {0x681a, "bs-Latn-BA"}, // Bosnian (Latin, Bosnia & Herzegovina) + {0x6c1a, "sr-Cyrl-RS"}, // Serbian (Cyrillic, Serbia) + {0x701a, "sr-Latn-RS"}, // Serbian (Latin, Serbia) + {0x781a, "bs-Latn-BA"}, // Bosnian (Latin, Bosnia & Herzegovina) + {0x7c1a, "sr-Latn-RS"}, // Serbian (Latin, Serbia) + {0x1b, "sk"}, // Slovak + {0x41b, "sk-SK"}, // Slovak (Slovakia) + {0x1c, "sq"}, // Albanian + {0x41c, "sq-AL"}, // Albanian (Albania) + {0x1d, "sv"}, // Swedish + {0x41d, "sv-SE"}, // Swedish (Sweden) + {0x81d, "sv-FI"}, // Swedish (Finland) + {0x1e, "th"}, // Thai + {0x41e, "th-TH"}, // Thai (Thailand) + {0x1f, "tr"}, // Turkish + {0x41f, "tr-TR"}, // Turkish (Türkiye) + {0x20, "ur"}, // Urdu + {0x420, "ur-PK"}, // Urdu (Pakistan) + {0x820, "ur-IN"}, // Urdu (India) + {0x21, "id"}, // Indonesian + {0x421, "id-ID"}, // Indonesian (Indonesia) + {0x22, "uk"}, // Ukrainian + {0x422, "uk-UA"}, // Ukrainian (Ukraine) + {0x23, "be"}, // Belarusian + {0x423, "be-BY"}, // Belarusian (Belarus) + {0x24, "sl"}, // Slovenian + {0x424, "sl-SI"}, // Slovenian (Slovenia) + {0x25, "et"}, // Estonian + {0x425, "et-EE"}, // Estonian (Estonia) + {0x26, "lv"}, // Latvian + {0x426, "lv-LV"}, // Latvian (Latvia) + {0x27, "lt"}, // Lithuanian + {0x427, "lt-LT"}, // Lithuanian (Lithuania) + {0x28, "tg"}, // Tajik + {0x428, "tg-Cyrl-TJ"}, // Tajik (Cyrillic, Tajikistan) + {0x7c28, "tg-Cyrl-TJ"}, // Tajik (Cyrillic, Tajikistan) + {0x29, "fa"}, // Persian + {0x429, "fa-IR"}, // Persian (Iran) + {0x2a, "vi"}, // Vietnamese + {0x42a, "vi-VN"}, // Vietnamese (Vietnam) + {0x2b, "hy"}, // Armenian + {0x42b, "hy-AM"}, // Armenian (Armenia) + {0x2c, "az"}, // Azerbaijani + {0x42c, "az-Latn-AZ"}, // Azerbaijani (Latin, Azerbaijan) + {0x82c, "az-Cyrl-AZ"}, // Azerbaijani (Cyrillic, Azerbaijan) + {0x742c, "az-Cyrl-AZ"}, // Azerbaijani (Cyrillic, Azerbaijan) + {0x782c, "az-Latn-AZ"}, // Azerbaijani (Latin, Azerbaijan) + {0x2d, "eu"}, // Basque + {0x42d, "eu-ES"}, // Basque (Basque) + {0x2e, "hsb"}, // Upper Sorbian + {0x42e, "hsb-DE"}, // Upper Sorbian (Germany) + {0x82e, "dsb-DE"}, // Lower Sorbian (Germany) + {0x7c2e, "dsb-DE"}, // Lower Sorbian (Germany) + {0x2f, "mk"}, // Macedonian + {0x42f, "mk-MK"}, // Macedonian (North Macedonia) + {0x30, "st"}, // Sesotho + {0x430, "st-ZA"}, // Sesotho (South Africa) + {0x31, "ts"}, // Xitsonga + {0x431, "ts-ZA"}, // Xitsonga (South Africa) + {0x32, "tn"}, // Setswana + {0x432, "tn-ZA"}, // Setswana (South Africa) + {0x832, "tn-BW"}, // Setswana (Botswana) + {0x33, "ve"}, // Venda + {0x433, "ve-ZA"}, // Venda (South Africa) + {0x34, "xh"}, // isiXhosa + {0x434, "xh-ZA"}, // isiXhosa (South Africa) + {0x35, "zu"}, // isiZulu + {0x435, "zu-ZA"}, // isiZulu (South Africa) + {0x36, "af"}, // Afrikaans + {0x436, "af-ZA"}, // Afrikaans (South Africa) + {0x37, "ka"}, // Georgian + {0x437, "ka-GE"}, // Georgian (Georgia) + {0x38, "fo"}, // Faroese + {0x438, "fo-FO"}, // Faroese (Faroe Islands) + {0x39, "hi"}, // Hindi + {0x439, "hi-IN"}, // Hindi (India) + {0x3a, "mt"}, // Maltese + {0x43a, "mt-MT"}, // Maltese (Malta) + {0x3b, "se"}, // Sami, Northern + {0x43b, "se-NO"}, // Sami, Northern (Norway) + {0x83b, "se-SE"}, // Sami, Northern (Sweden) + {0xc3b, "se-FI"}, // Sami, Northern (Finland) + {0x103b, "smj-NO"}, // Sami, Lule (Norway) + {0x143b, "smj-SE"}, // Sami, Lule (Sweden) + {0x183b, "sma-NO"}, // Sami, Southern (Norway) + {0x1c3b, "sma-SE"}, // Sami, Southern (Sweden) + {0x203b, "sms-FI"}, // Sami, Skolt (Finland) + {0x243b, "smn-FI"}, // Sami, Inari (Finland) + {0x703b, "smn-FI"}, // Sami, Inari (Finland) + {0x743b, "sms-FI"}, // Sami, Skolt (Finland) + {0x783b, "sma-SE"}, // Sami, Southern (Sweden) + {0x7c3b, "smj-SE"}, // Sami, Lule (Sweden) + {0x3c, "ga"}, // Irish + {0x83c, "ga-IE"}, // Irish (Ireland) + {0x3d, "yi"}, // Yiddish + {0x43d, "yi-001"}, // Yiddish (World) + {0x3e, "ms"}, // Malay + {0x43e, "ms-MY"}, // Malay (Malaysia) + {0x83e, "ms-BN"}, // Malay (Brunei) + {0x3f, "kk"}, // Kazakh + {0x43f, "kk-KZ"}, // Kazakh (Kazakhstan) + {0x40, "ky"}, // Kyrgyz + {0x440, "ky-KG"}, // Kyrgyz (Kyrgyzstan) + {0x41, "sw"}, // Kiswahili + {0x441, "sw-KE"}, // Kiswahili (Kenya) + {0x42, "tk"}, // Turkmen + {0x442, "tk-TM"}, // Turkmen (Turkmenistan) + {0x43, "uz"}, // Uzbek + {0x443, "uz-Latn-UZ"}, // Uzbek (Latin, Uzbekistan) + {0x843, "uz-Cyrl-UZ"}, // Uzbek (Cyrillic, Uzbekistan) + {0x7843, "uz-Cyrl-UZ"}, // Uzbek (Cyrillic, Uzbekistan) + {0x7c43, "uz-Latn-UZ"}, // Uzbek (Latin, Uzbekistan) + {0x44, "tt"}, // Tatar + {0x444, "tt-RU"}, // Tatar (Russia) + {0x45, "bn"}, // Bangla + {0x445, "bn-IN"}, // Bengali (India) + {0x845, "bn-BD"}, // Bangla (Bangladesh) + {0x46, "pa"}, // Punjabi + {0x446, "pa-IN"}, // Punjabi (India) + {0x846, "pa-Arab-PK"}, // Punjabi (Pakistan) + {0x7c46, "pa-Arab-PK"}, // Punjabi (Pakistan) + {0x47, "gu"}, // Gujarati + {0x447, "gu-IN"}, // Gujarati (India) + {0x48, "or"}, // Odia + {0x448, "or-IN"}, // Odia (India) + {0x49, "ta"}, // Tamil + {0x449, "ta-IN"}, // Tamil (India) + {0x849, "ta-LK"}, // Tamil (Sri Lanka) + {0x4a, "te"}, // Telugu + {0x44a, "te-IN"}, // Telugu (India) + {0x4b, "kn"}, // Kannada + {0x44b, "kn-IN"}, // Kannada (India) + {0x4c, "ml"}, // Malayalam + {0x44c, "ml-IN"}, // Malayalam (India) + {0x4d, "as"}, // Assamese + {0x44d, "as-IN"}, // Assamese (India) + {0x4e, "mr"}, // Marathi + {0x44e, "mr-IN"}, // Marathi (India) + {0x4f, "sa"}, // Sanskrit + {0x44f, "sa-IN"}, // Sanskrit (India) + {0x50, "mn"}, // Mongolian + {0x450, "mn-MN"}, // Mongolian (Mongolia) + {0x850, "mn-Mong-CN"}, // Mongolian (Traditional Mongolian, China) + {0xc50, "mn-Mong-MN"}, // Mongolian (Traditional Mongolian, Mongolia) + {0x7850, "mn-MN"}, // Mongolian (Mongolia) + {0x7c50, "mn-Mong-CN"}, // Mongolian (Traditional Mongolian, China) + {0x51, "bo"}, // Tibetan + {0x451, "bo-CN"}, // Tibetan (China) + {0xc51, "dz-BT"}, // Dzongkha (Bhutan) + {0x52, "cy"}, // Welsh + {0x452, "cy-GB"}, // Welsh (United Kingdom) + {0x53, "km"}, // Khmer + {0x453, "km-KH"}, // Khmer (Cambodia) + {0x54, "lo"}, // Lao + {0x454, "lo-LA"}, // Lao (Laos) + {0x55, "my"}, // Burmese + {0x455, "my-MM"}, // Burmese (Myanmar) + {0x56, "gl"}, // Galician + {0x456, "gl-ES"}, // Galician (Galician) + {0x57, "kok"}, // Konkani + {0x457, "kok-IN"}, // Konkani (India) + {0x58, "mni"}, // Manipuri + {0x458, "mni-IN"}, // Manipuri (Bangla, India) + {0x59, "sd"}, // Sindhi + {0x459, "sd-Deva-IN"}, // Sindhi (Devanagari, India) + {0x859, "sd-Arab-PK"}, // Sindhi (Pakistan) + {0x7c59, "sd-Arab-PK"}, // Sindhi (Pakistan) + {0x5a, "syr"}, // Syriac + {0x45a, "syr-SY"}, // Syriac (Syria) + {0x5b, "si"}, // Sinhala + {0x45b, "si-LK"}, // Sinhala (Sri Lanka) + {0x5c, "chr"}, // Cherokee + {0x45c, "chr-Cher-US"}, // Cherokee (Cherokee, United States) + {0x7c5c, "chr-Cher-US"}, // Cherokee (Cherokee, United States) + {0x5d, "iu"}, // Inuktitut + {0x45d, "iu-Cans-CA"}, // Inuktitut (Syllabics, Canada) + {0x85d, "iu-Latn-CA"}, // Inuktitut (Latin, Canada) + {0x785d, "iu-Cans-CA"}, // Inuktitut (Syllabics, Canada) + {0x7c5d, "iu-Latn-CA"}, // Inuktitut (Latin, Canada) + {0x5e, "am"}, // Amharic + {0x45e, "am-ET"}, // Amharic (Ethiopia) + {0x5f, "tzm"}, // Central Atlas Tamazight + {0x45f, "tzm-Arab-MA"}, // Central Atlas Tamazight (Arabic, Morocco) + {0x85f, "tzm-Latn-DZ"}, // Central Atlas Tamazight (Latin, Algeria) + {0x105f, "tzm-Tfng-MA"}, // Central Atlas Tamazight (Tifinagh, Morocco) + {0x785f, "tzm-Tfng-MA"}, // Central Atlas Tamazight (Tifinagh, Morocco) + {0x7c5f, "tzm-Latn-DZ"}, // Central Atlas Tamazight (Latin, Algeria) + {0x60, "ks"}, // Kashmiri + {0x460, "ks-Arab-IN"}, // Kashmiri (Arabic) + {0x860, "ks-Deva-IN"}, // Kashmiri (Devanagari) + {0x61, "ne"}, // Nepali + {0x461, "ne-NP"}, // Nepali (Nepal) + {0x861, "ne-IN"}, // Nepali (India) + {0x62, "fy"}, // Western Frisian + {0x462, "fy-NL"}, // Western Frisian (Netherlands) + {0x63, "ps"}, // Pashto + {0x463, "ps-AF"}, // Pashto (Afghanistan) + {0x64, "fil"}, // Filipino + {0x464, "fil-PH"}, // Filipino (Philippines) + {0x65, "dv"}, // Divehi + {0x465, "dv-MV"}, // Divehi (Maldives) + {0x66, "bin"}, // Edo + {0x466, "bin-NG"}, // Edo (Nigeria) + {0x67, "ff"}, // Fulah + {0x467, "ff-Latn-NG"}, // Fulah (Latin, Nigeria) + {0x867, "ff-Latn-SN"}, // Fulah (Latin, Senegal) + {0x7c67, "ff-Latn-SN"}, // Fulah (Latin, Senegal) + {0x68, "ha"}, // Hausa + {0x468, "ha-Latn-NG"}, // Hausa (Latin, Nigeria) + {0x7c68, "ha-Latn-NG"}, // Hausa (Latin, Nigeria) + {0x69, "ibb"}, // Ibibio + {0x469, "ibb-NG"}, // Ibibio (Nigeria) + {0x6a, "yo"}, // Yoruba + {0x46a, "yo-NG"}, // Yoruba (Nigeria) + {0x6b, "quz"}, // Quechua + {0x46b, "quz-BO"}, // Quechua (Bolivia) + {0x86b, "quz-EC"}, // Quechua (Ecuador) + {0xc6b, "quz-PE"}, // Quechua (Peru) + {0x6c, "nso"}, // Sesotho sa Leboa + {0x46c, "nso-ZA"}, // Sesotho sa Leboa (South Africa) + {0x6d, "ba"}, // Bashkir + {0x46d, "ba-RU"}, // Bashkir (Russia) + {0x6e, "lb"}, // Luxembourgish + {0x46e, "lb-LU"}, // Luxembourgish (Luxembourg) + {0x6f, "kl"}, // Kalaallisut + {0x46f, "kl-GL"}, // Kalaallisut (Greenland) + {0x70, "ig"}, // Igbo + {0x470, "ig-NG"}, // Igbo (Nigeria) + {0x71, "kr"}, // Kanuri + {0x471, "kr-Latn-NG"}, // Kanuri (Latin, Nigeria) + {0x72, "om"}, // Oromo + {0x472, "om-ET"}, // Oromo (Ethiopia) + {0x73, "ti"}, // Tigrinya + {0x473, "ti-ET"}, // Tigrinya (Ethiopia) + {0x873, "ti-ER"}, // Tigrinya (Eritrea) + {0x74, "gn"}, // Guarani + {0x474, "gn-PY"}, // Guarani (Paraguay) + {0x75, "haw"}, // Hawaiian + {0x475, "haw-US"}, // Hawaiian (United States) + {0x76, "la"}, // Latin + {0x476, "la-VA"}, // Latin (Vatican City) + {0x77, "so"}, // Somali + {0x477, "so-SO"}, // Somali (Somalia) + {0x78, "ii"}, // Yi + {0x478, "ii-CN"}, // Yi (China) + {0x79, "pap"}, // Papiamento + {0x479, "pap-029"}, // Papiamento (Caribbean) + {0x7a, "arn"}, // Mapuche + {0x47a, "arn-CL"}, // Mapuche (Chile) + {0x7c, "moh"}, // Mohawk + {0x47c, "moh-CA"}, // Mohawk (Canada) + {0x7e, "br"}, // Breton + {0x47e, "br-FR"}, // Breton (France) + {0x80, "ug"}, // Uyghur + {0x480, "ug-CN"}, // Uyghur (China) + {0x81, "mi"}, // Maori + {0x481, "mi-NZ"}, // Maori (New Zealand) + {0x82, "oc"}, // Occitan + {0x482, "oc-FR"}, // Occitan (France) + {0x83, "co"}, // Corsican + {0x483, "co-FR"}, // Corsican (France) + {0x84, "gsw"}, // Swiss German + {0x484, "gsw-FR"}, // Alsatian (France) + {0x85, "sah"}, // Sakha + {0x485, "sah-RU"}, // Sakha (Russia) + {0x86, "quc"}, // Kʼicheʼ + {0x486, "quc-Latn-GT"}, // Kʼicheʼ (Latin, Guatemala) + {0x7c86, "quc-Latn-GT"}, // Kʼicheʼ (Latin, Guatemala) + {0x87, "rw"}, // Kinyarwanda + {0x487, "rw-RW"}, // Kinyarwanda (Rwanda) + {0x88, "wo"}, // Wolof + {0x488, "wo-SN"}, // Wolof (Senegal) + {0x8c, "fa"}, // Persian + {0x48c, "fa-AF"}, // Persian (Afghanistan) + {0x91, "gd"}, // Scottish Gaelic + {0x491, "gd-GB"}, // Scottish Gaelic (United Kingdom) + {0x92, "ku"}, // Central Kurdish + {0x492, "ku-Arab-IQ"}, // Central Kurdish (Iraq) + {0x7c92, "ku-Arab-IQ"}, // Central Kurdish (Iraq) + {0x501, "qps-ploc"}, // Pseudo (Pseudo) + {0x901, "qps-Latn-x-sh"}, // Pseudo (Pseudo Selfhost) + {0x5fe, "qps-ploca"}, // Pseudo (Pseudo Asia) + {0x9ff, "qps-plocm"}, // Pseudo (Pseudo Mirrored) }; if (auto el = languages.find(lang); el != languages.end()) return el->second;