首页 文章

获取COleDateTime :: Format为波兰月“1月”返回“stycznia”而不是“styczeń”

提问于
浏览
2

我有这种方法将语言环境设置为波兰语:

void CMeetingScheduleAssistantApp::SetLocale()
{
    // https://www.microsoft.com/resources/msdn/goglobal/default.mspx#ISO2
    CString strLang[NUM_LANGUAGES] =
    {
        _T("plk")
        // Add more languages here
    };

    _tsetlocale(LC_ALL, strLang[m_eLanguage - LANGUAGE_ENGLISH]);
}

为简洁起见,我已将其他语言删除了 . 现在,当我格式化 COleDateTime 对象并显示月份时,比如1月,它显示为:

styczeń

但我想把它表现为:

stycznia

是否有区域设置来调整 COleDateTime::Format 方法或区域设置返回的月份值?

否则我将不得不添加一些手动来覆盖 .

我想回来的月份是:

  • stycznia

  • lutego

  • 马卡

  • kwietnia

  • maja

  • czerwca

  • lipca

  • sierpnia

  • września

  • października

  • listopada

  • grudnia

更新

根据here,它说:

某些语言,如芬兰语,德语,波兰语和俄语,有几种名词形式 . 如果您计划使用系统提供的本地化名称,请进行语言检查以确保您在正确的上下文中使用它们 . Windows带有波兰和俄罗斯月份名称的主格和属格形式;表单的更改取决于月份名称在字符串中相对于日期名称的位置 . Windows将单个字符串中的两个表单都返回,并以空值分隔 . 对于所有其他语言,系统每个月只有一种形式的名称或日期名称 .

现在,这就是我实际格式化日期字符串的方式(因为我支持超过40种语言,这有点棘手 . 所以,(对于英语)我从这个格式字符串开始:

%1 %2!d!-%3!d!
  • %1month .

  • %2!d!first day 值 .

  • %3!d!second day 值 .

如果我的约会需要迎合超过两个月,我有:

%1 %2!d!–%3 %4!d!
  • %1month 值 .

  • %2!d!first day 值 .

  • %3second month 值 .

  • %3!d!second day 值 .

以上使用如下:

if (datThisMonday.GetMonth() == datEndOfWeek.GetMonth())
{
    strDate.FormatMessage(IDS_STR_TPL_OCLM_WEEK,
            datThisMonday.Format(_T("%B")), datThisMonday.GetDay(), datEndOfWeek.GetDay());
}
else
{
    strDate.FormatMessage(IDS_STR_TPL_OCLM_WEEK2,
            datThisMonday.Format(_T("%B")), datThisMonday.GetDay(),
            datEndOfWeek.Format(_T("%B")), datEndOfWeek.GetDay());
}

对于波兰语,我的格式字符串是:

%2!d!-%3!d! %1
%2!d! %1–%4!d! %3

所以,我可以看到,因为我使用 FormatMessage 格式化日期字符串,并且仅使用 COleDateTime::Format 方法解析 month ,这可能是导致问题的原因 .

由于我在日期字符串中有两个日期,因此我不能只使用一个日期格式化API调用(因为我的日期字符串表示一周的 Span ) .

所以我查了一下:

strDate = datThisMonday.Format(_T("%d %B"));

它没有任何区别 . 所以我尝试了这个:

SYSTEMTIME sTime;
datThisMonday.GetAsSystemTime(sTime);
GetDateFormat(GetThreadLocale(), 
              DATE_LONGDATE, 
              &sTime, _T("d MMMM"), 
              strDate.GetBuffer(_MAX_PATH), _MAX_PATH);

它没有任何区别 . 它仍然以与以前相同的方式显示日期 . 即使它确实正确显示了日期,它也不会考虑来自两个COleDateTime对象的 date range .

困惑 .

更新2:

还尝试过:

TCHAR szDate[100] = _T("");
GetDateFormatEx(_T("pl"), NULL, &sTime, _T("ddd MMMM"), szDate, 100, NULL);
AfxMessageBox(szDate);

只是不会显示变体 .

更新3

我能让它显示正确日期的唯一方法是这样的:

GetDateFormatEx(_T("pl"), DATE_LONGDATE, &sTime, NULL, szDate, 100, NULL);

然后月份是正确的 . 现在在我提到的文章中指出:

Windows将两个表单都返回到由空值分隔的单个字符串中 .

我甚至无法弄清楚如何访问它 .

1 回答

  • 1

    我遇到了其他问题,但它们与这个问题截然不同,所以我仍然会在这里提供答案 .

    首先,我发现document表明你必须在日期中显示 d 才能显示月份的正确版本 .

    既然,我想显示一个日期范围,我从这开始:

    波兰语

    模板: %1-%2 日期1: d 日期2: d MMMM

    然后我格式化日期:

    SYSTEMTIME sysTime;
    ENSURE(rDate.GetAsSystemTime(sysTime));
    GetDateFormatEx(_T("pl"),
        NULL,
        &sysTime, 
        strDateFormat, 
        strDate.GetBuffer(_MAX_PATH), _MAX_PATH, nullptr);
    

    这显示正确 . 如果日期范围跨越两个月,我有:

    模板: %1-%2 日期1: d MMMM 日期2: d MMMM

    它运作良好 .

相关问题