langid: finish

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman 2024-08-19 16:29:22 +02:00
parent 8bd8143c6b
commit d9eb8292a9

View File

@ -30,6 +30,38 @@ namespace stdex
#endif #endif
constexpr langid langid_unknown = 127; 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 /// Parses language name and returns matching language code
@ -245,6 +277,462 @@ namespace stdex
} }
return langid_unknown; 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<langid, const char *> 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__) #if defined(__GNUC__)