Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/facebook-graph-api/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mfc 获取COleDateTime::返回的格式";Stychnia“;而不是",;斯泰奇ń&引用;“波兰月”;一月“;_Mfc_Locale_Polish_Coledatetime - Fatal编程技术网

Mfc 获取COleDateTime::返回的格式";Stychnia“;而不是",;斯泰奇ń&引用;“波兰月”;一月“;

Mfc 获取COleDateTime::返回的格式";Stychnia“;而不是",;斯泰奇ń&引用;“波兰月”;一月“;,mfc,locale,polish,coledatetime,Mfc,Locale,Polish,Coledatetime,我使用此方法将区域设置设置为波兰语: void CMeetingScheduleAssistantApp::SetLocale() { // https://www.microsoft.com/resources/msdn/goglobal/default.mspx#ISO2 CString strLang[NUM_LANGUAGES] = { _T("plk") // Add more languages here };

我使用此方法将区域设置设置为波兰语:

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
对象并显示月份(比如一月)时,它显示为:

斯泰琴斯

但我想把它表现为:

斯提克尼亚

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

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

我希望返回的月份是:

  • 斯提克尼亚
  • 卢特戈
  • 马卡
  • 奎特尼亚
  • 马贾
  • 捷克
  • 利普卡
  • 锡尔皮尼亚
  • 乌尔兹尼亚
  • 帕季尔尼卡
  • 利斯托帕达
  • 格鲁德尼亚
  • 更新 它说:

    一些语言,如芬兰语、德语、波兰语和俄语,已经被广泛使用 几个名词形式。如果您计划使用 系统,请进行语言学家检查,以确保您在 正确的语境。Windows同时具有主格和属格形式 波兰和俄罗斯月份名称表格根据不同的情况而变化 月份名称在字符串中相对于日期名称的位置。 Windows在一个字符串中返回两个表单,字符串之间用null分隔 价值观系统每个月或日只携带一种形式 所有其他语言的名称

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

    %1 %2!d!-%3!d!
    
  • %1
    月份
  • %2!d!
    第一天的值
  • %3!d!
    是第二天的值
  • 如果我的约会需要跨越两个月,我有:

    %1 %2!d!–%3 %4!d!
    
  • %1
    月份的值
  • %2!d!
    第一天的值
  • %3
    是第二个月的
  • %3!d!
    是第二天的值
  • 上面是这样使用的:

    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());
    }
    
    GetDateFormatEx(_T("pl"), DATE_LONGDATE, &sTime, NULL, szDate, 100, NULL);
    
    对于波兰语,我各自的格式字符串是:

    %2!d!-%3!d! %1
    %2!d! %1–%4!d! %3
    
    因此,我可以看到,因为我正在使用
    FormatMessage
    格式化日期字符串,并且仅使用
    COleDateTime::Format
    方法解析月份,所以它可能是问题的原因

    因为我的日期字符串中有两个日期,所以我不能只使用一个日期格式化API调用(因为我的日期字符串代表一周的跨度)

    所以我查了一下:

    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对象的日期范围考虑在内

    困惑

    更新2: 还尝试:

    TCHAR szDate[100] = _T("");
    GetDateFormatEx(_T("pl"), NULL, &sTime, _T("ddd MMMM"), szDate, 100, NULL);
    AfxMessageBox(szDate);
    
    只是不会显示变体

    更新3 我能让它显示正确日期的唯一方法是:

    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());
    }
    
    GetDateFormatEx(_T("pl"), DATE_LONGDATE, &sTime, NULL, szDate, 100, NULL);
    
    那么这个月是正确的。我提到的那篇文章说:

    Windows在一个字符串中返回两个表单,字符串之间用null分隔 价值观


    我甚至不知道如何访问它。

    我遇到了其他问题,但它们与这个问题不同,因此我仍将在这里提供我的答案

    首先,我发现了一个声明,声明您必须在日期中包含
    d
    ,才能显示该月的正确版本

    因为我想显示一个日期范围,所以我从以下内容开始:

    磨光 模板:
    %1-%2
    日期1:
    d
    日期2:
    d毫米

    然后我格式化日期:

    SYSTEMTIME sysTime;
    ENSURE(rDate.GetAsSystemTime(sysTime));
    GetDateFormatEx(_T("pl"),
        NULL,
        &sysTime, 
        strDateFormat, 
        strDate.GetBuffer(_MAX_PATH), _MAX_PATH, nullptr);
    
    正确显示。如果日期范围跨越两个月,我有:

    模板:
    %1-%2
    日期1:
    d毫米
    日期2:
    d毫米


    它工作得很好。

    自Windows 7以来,您还可以使用
    区域设置\u RETURN\u GENITIVE\u NAMES
    返回月份的GENITIVE name。运行此操作:

    const wchar_t localeName[] = L"pl-PL";
    for (LCTYPE m = LOCALE_SMONTHNAME1; m <= LOCALE_SMONTHNAME12; ++m) {
      wchar_t buf[1024];
      GetLocaleInfoEx(localeName, m | LOCALE_RETURN_GENITIVE_NAMES, buf, sizeof(buf) / sizeof(*buf));
      std::cout << to_utf8(buf) << '\n';
    }
    

    在波兰语中,这确实是几个月的专有名词。

    谷歌搜索结果“将一月翻译成波兰语”给了我
    “Styczen”
    ,Windows似乎是对的。它应该是
    “stycznia”吗
    ?@BarmakShemirani我不是专家,但也可以。试着用第二种方法反向翻译。看这里:。另一种方法是我试图复制的资源中正在使用的内容。我认为“styczeń”是正确的。我想这是来自
    GetLocaleInfo中的Windows资源的(这些设置可以更改,但会影响所有应用程序,不推荐)。我只需要输入并用正确的月份名称替换错误的月份名称。这有点复杂。当您枚举月份时,“Styczenń”是正确的值。但当您指定日期时,如2019年1月15日,正确的是“2019年1月15日”这有点像在英语中你会说15-15,但日期是15-15。我会在波兰资源中搜索一点,当我找到答案时,我会回答“Styczen”和“Stycznia”这两个词都可以用,在波兰语中,当你在脑海中说它是有意义的。Stychnia在语法上是100%正确的,但即使使用了Styczen,也没有人会注意到区别,因为这是一个很小的细节,在读出时仍然有意义,换句话说,“Stychnia”是一个有效的“Stychne”是正确的,我尝试查找一些内容,但需要花费比今天更多的时间。感谢您提供此信息。尽管如此,我尝试设置实际日期/日期范围的格式,而不是获取特定的月份名称。因此,我的代码必须适应这两种类型的月份名称。