From d9eb8292a9ab4cb65e44eadbbcf53c95145c94b1 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Mon, 19 Aug 2024 16:29:22 +0200 Subject: [PATCH] langid: finish Signed-off-by: Simon Rozman --- include/stdex/langid.hpp | 488 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 488 insertions(+) diff --git a/include/stdex/langid.hpp b/include/stdex/langid.hpp index 1c74d6242..bddaef9e5 100644 --- a/include/stdex/langid.hpp +++ b/include/stdex/langid.hpp @@ -30,6 +30,38 @@ namespace stdex #endif constexpr langid langid_unknown = 127; + constexpr langid langid_system = 2048; + + 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 + /// + /// \param[in] lang Language code + /// + /// \return Language code of the base language + /// + inline constexpr langid primary_langid(_In_ langid lang) + { + return lang & 0x3ff; + } + + /// + /// Isolates language variant from the language code + /// + /// \param[in] lang Language code + /// + /// \return Language variant code + /// + inline constexpr langid sub_langid(_In_ langid lang) + { + return lang & 0xfc00; + } /// /// Parses language name and returns matching language code @@ -245,6 +277,462 @@ namespace stdex } return langid_unknown; } + + /// + /// Converts language code to language name + /// + /// \param[in] lang Language code + /// \param[in] fallback Fallback value to return, should language name could not be determined. + /// + /// \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) + { + 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"}, + }; + if (auto el = languages.find(lang); el != languages.end()) + return el->second; + return fallback; + } } #if defined(__GNUC__)