如何通过GetLocaleInfoEx获取小众语言的星期名称?
看起来你遇到的核心问题是Windows对部分IETF语言标签的locale支持有限——不是所有你列出的语言代码都被Windows的GetLocaleInfoEx完全支持,有些语言要么没有对应的系统locale,要么需要使用更完整的区域标识符(带国家/地区后缀),或者需要额外安装语言包。
下面针对每个无效的语言代码给出具体解决方案,以及通用的应对策略:
一、针对各语言的具体调整
1. drk (Aukan)
Windows没有原生支持Aukan语的独立locale,你可以尝试使用苏里南的荷兰语locale(nl-SR)作为替代,或者手动维护Aukan语的星期名称列表(Aukan主要在苏里南使用,很多本地化资源会复用荷兰语区域设置的规则)。
2. ceb (Cebuano)
Cebuano的Windows系统支持非常有限,建议使用菲律宾的Tagalog locale(tl-PH)作为替代,或者直接在代码中嵌入Cebuano的星期名称:Linggo, Lunes, Martes, Miyerkules, Huwebes, Biyernes, Sabado。
3. guw (Gun)
Gun语几乎没有Windows系统级的locale支持,最可靠的方式是手动添加自定义的星期名称列表,因为系统没有对应的本地化资源可以调用。
4. ht (Haitian Creole)
尝试使用完整的区域标签ht-HT(海地克里奥尔语-海地),而不是仅ht。另外,确保你的Windows系统已经安装了海地克里奥尔语的语言包——有些语言需要手动安装语言包才能启用locale支持。
5. srn (Sranantongo)
和Aukan类似,Sranantongo主要在苏里南使用,可尝试使用nl-SR(苏里南荷兰语)作为替代,或者手动维护Sranantongo的星期名称。
6. tl (Tagalog)
将语言代码从tl改为完整的区域标识符tl-PH(他加禄语-菲律宾),Windows需要完整的区域信息才能正确返回本地化的星期名称。
7. tw (Twi)
正确的IETF区域标签应该是tw-GH(契维语-加纳),尝试使用这个完整标签替代tw。如果仍然无效,可手动嵌入Twi的星期名称:Kwasi, Kwadwo, Kwabena, Kwaku, Yaw, Kofi, Kwame。
二、通用优化方案
1. 检查GetLocaleInfoEx的返回值
在调用GetLocaleInfoEx后,检查返回值是否为0(表示调用失败),如果失败则加载自定义的星期名称,避免空字符串或错误数据:
CString strDay; TCHAR szDay[_MAX_PATH]; int iDay; LCTYPE lcDay[] = { LOCALE_SDAYNAME7, LOCALE_SDAYNAME1, LOCALE_SDAYNAME2, LOCALE_SDAYNAME3, LOCALE_SDAYNAME4, LOCALE_SDAYNAME5, LOCALE_SDAYNAME6 }; // 自定义星期名称映射,key是语言代码,value是星期数组(周日到周六) std::map<CString, std::vector<CString>> customWeekDays = { {_T("drk"), {_T("Sondag"), _T("Maan dag"), _T("Dinsdag"), _T("Woensdag"), _T("Donderdag"), _T("Vrydag"), _T("Saterdag")}}, {_T("ceb"), {_T("Linggo"), _T("Lunes"), _T("Martes"), _T("Miyerkules"), _T("Huwebes"), _T("Biyernes"), _T("Sabado")}}, // 可补充其他语言的自定义列表 }; CString langCode = theApp.GetHtmlLanguageCode(); for(iDay = 0; iDay < 7; iDay++) { int result = GetLocaleInfoEx(langCode, lcDay[iDay], szDay, _MAX_PATH); if(result == 0) { // 调用失败,使用自定义名称 if(customWeekDays.count(langCode)) { strDay = customWeekDays[langCode][iDay]; } else { // fallback到默认值 strDay = _T("Day") + CString(iDay+1); } } else { strDay = szDay; } m_cbDays.AddString(strDay); }
2. 确认系统语言包安装
对于ht这类有官方支持但需要语言包的语言,需要在Windows设置中安装对应的语言包:
- 打开「设置」→「时间和语言」→「语言和区域」→「添加语言」,搜索并安装目标语言,重启系统后再测试。
3. 考虑使用ICU库替代
如果需要更全面的多语言支持,建议使用ICU(International Components for Unicode)库,它对全球语言的locale支持比Windows原生API更完整,可以轻松获取各种语言的星期名称,无需依赖系统语言包。
内容的提问来源于stack exchange,提问作者Andrew Truckle

