You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过GetLocaleInfoEx获取小众语言的星期名称?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:22:39