20#pragma GCC diagnostic push
21#pragma GCC diagnostic ignored "-Wexit-time-destructors"
27 using langid = LANGID;
29 using langid = uint16_t;
32 constexpr langid langid_unknown = 127;
33 constexpr langid langid_system = 2048;
35 constexpr langid sublangid_neutral = 0<<10;
36 constexpr langid sublangid_default = 1<<10;
37 constexpr langid sublangid_sys_default = 2<<10;
38 constexpr langid sublangid_custom_default = 3<<10;
39 constexpr langid sublangid_custom_unspecified = 4<<10;
40 constexpr langid sublangid_ui_custom_default = 5<<10;
49 inline constexpr langid primary_langid(_In_ langid lang)
61 inline constexpr langid sub_langid(_In_ langid lang)
73 inline langid langid_from_rfc1766(_In_z_
const char* rfc1766)
77 bool operator()(_In_z_
const char* str1, _In_z_
const char* str2)
const
83 auto a = stdex::tolower(str1[i]);
84 auto b = stdex::tolower(str2[i]);
85 auto a_end = !a || stdex::ispunct(a);
86 auto b_end = !b || stdex::ispunct(b);
87 if (a_end && b_end)
return false;
88 if (b_end || a > b)
return false;
89 if (a_end || a < b)
return true;
93 struct language_mapping
96 std::map<const char*, langid, stricmp_less> sublanguages;
98 static const std::map<const char*, language_mapping, stricmp_less> languages = {
102 {
"ae",
static_cast<langid
>(14337)},
103 {
"bh",
static_cast<langid
>(15361)},
104 {
"dz",
static_cast<langid
>(5121)},
105 {
"eg",
static_cast<langid
>(3073)},
106 {
"iq",
static_cast<langid
>(2049)},
107 {
"jo",
static_cast<langid
>(11265)},
108 {
"kw",
static_cast<langid
>(13313)},
109 {
"lb",
static_cast<langid
>(12289)},
110 {
"ly",
static_cast<langid
>(4097)},
111 {
"ma",
static_cast<langid
>(6145)},
112 {
"om",
static_cast<langid
>(8193)},
113 {
"qa",
static_cast<langid
>(16385)},
114 {
"sa",
static_cast<langid
>(1025)},
115 {
"sy",
static_cast<langid
>(10241)},
116 {
"tn",
static_cast<langid
>(7169)},
117 {
"ye",
static_cast<langid
>(9217)},
126 {
"at",
static_cast<langid
>(3079)},
127 {
"ch",
static_cast<langid
>(2055)},
128 {
"de",
static_cast<langid
>(1031)},
129 {
"li",
static_cast<langid
>(5127)},
130 {
"lu",
static_cast<langid
>(4103)},
135 {
"au",
static_cast<langid
>(3081)},
136 {
"bz",
static_cast<langid
>(10249)},
137 {
"ca",
static_cast<langid
>(4105)},
138 {
"ca",
static_cast<langid
>(9225)},
139 {
"gb",
static_cast<langid
>(2057)},
140 {
"ie",
static_cast<langid
>(6153)},
141 {
"jm",
static_cast<langid
>(8201)},
142 {
"nz",
static_cast<langid
>(5129)},
143 {
"tt",
static_cast<langid
>(11273)},
144 {
"us",
static_cast<langid
>(1033)},
145 {
"za",
static_cast<langid
>(7177)},
149 {
"ar",
static_cast<langid
>(11274)},
150 {
"bo",
static_cast<langid
>(16394)},
151 {
"cl",
static_cast<langid
>(13322)},
152 {
"co",
static_cast<langid
>(9226)},
153 {
"cr",
static_cast<langid
>(5130)},
154 {
"do",
static_cast<langid
>(7178)},
155 {
"ec",
static_cast<langid
>(12298)},
156 {
"es",
static_cast<langid
>(1034)},
157 {
"gt",
static_cast<langid
>(4106)},
158 {
"hn",
static_cast<langid
>(18442)},
159 {
"mx",
static_cast<langid
>(2058)},
160 {
"ni",
static_cast<langid
>(19466)},
161 {
"pa",
static_cast<langid
>(6154)},
162 {
"pe",
static_cast<langid
>(10250)},
163 {
"pr",
static_cast<langid
>(20490)},
164 {
"py",
static_cast<langid
>(15370)},
165 {
"sv",
static_cast<langid
>(17418)},
166 {
"uy",
static_cast<langid
>(14346)},
167 {
"ve",
static_cast<langid
>(8202)},
176 {
"be",
static_cast<langid
>(2060)},
177 {
"ca",
static_cast<langid
>(3084)},
178 {
"ch",
static_cast<langid
>(4108)},
179 {
"fr",
static_cast<langid
>(1036)},
180 {
"lu",
static_cast<langid
>(5132)},
191 {
"ch",
static_cast<langid
>(2064)},
192 {
"it",
static_cast<langid
>(1040)},
198 {
"johab",
static_cast<langid
>(2066)},
199 {
"kr",
static_cast<langid
>(1042)},
208 {
"be",
static_cast<langid
>(2067)},
209 {
"nl",
static_cast<langid
>(1043)},
213 {
"bokmaal",
static_cast<langid
>(1044)},
214 {
"nynorsk",
static_cast<langid
>(2068)},
219 {
"br",
static_cast<langid
>(1046)},
220 {
"pt",
static_cast<langid
>(2070)},
225 {
"mo",
static_cast<langid
>(2072)},
226 {
"ro",
static_cast<langid
>(1048)},
230 {
"mo",
static_cast<langid
>(2073)},
231 {
"ru",
static_cast<langid
>(1049)},
239 {
"cyrillic",
static_cast<langid
>(3098)},
240 {
"latin",
static_cast<langid
>(2074)},
244 {
"fi",
static_cast<langid
>(2077)},
245 {
"se",
static_cast<langid
>(1053)},
260 {
"cn",
static_cast<langid
>(2052)},
261 {
"hk",
static_cast<langid
>(3076)},
262 {
"sg",
static_cast<langid
>(4100)},
263 {
"tw",
static_cast<langid
>(1028)},
268 if (
auto el = languages.find(rfc1766); el != languages.end()) {
269 if (!el->second.sublanguages.empty()) {
270 if (
auto n = stdex::strlen(el->first); ispunct(rfc1766[n])) {
272 if (
auto el_sub = el->second.sublanguages.find(&rfc1766[n]); el_sub != el->second.sublanguages.end())
273 return el_sub->second;
276 return el->second.id;
278 return langid_unknown;
289 inline _Ret_maybenull_z_
const char *rfc1766_from_langid(_In_ langid lang, _In_opt_z_
const char* fallback =
nullptr)
291 static const std::map<langid, const char *> languages = {
732 if (
auto el = languages.find(lang); el != languages.end())
739#pragma GCC diagnostic pop