Получение COleDateTime :: Format для возврата «stycznia» вместо «styczeń» для польского месяца «январь» - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть этот метод для установки языка на польский:

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 и отображаю месяц, скажем, январь, он отображается как:

styczeń

Но я хочу показать его как:

stycznia

Существует ли настройка локали для настройки значений месяца, возвращаемых методом или локалью COleDateTime::Format?

В противном случае мне придется добавитьчто-то ручное, чтобы переопределить.

Месяцы, которые я хотел бы вернуть:

  1. stycznia
  2. lutego
  3. marca
  4. kwietnia
  5. maja
  6. czerwca
  7. lipca
  8. sierpnia
  9. września
  10. października
  11. листопада
  12. grudnia

Обновление

Согласно здесь говорится:

Некоторые языки, такие как финский,Немецкий, польский и русский имеют несколько существительных.Если вы планируете использовать локализованные имена, предоставляемые системой, сделайте проверку лингвиста, чтобы убедиться, что вы используете их в правильном контексте.Windows имеет как именительные, так и родительные формы польских и русских названий месяцев форма изменяется в зависимости от позиции названия месяца в строке относительно названия дня .Windows возвращает обе формы в одной строке, разделенной нулевым значением. Система содержит только одну форму названия месяца или месяца для всех других языков .

Теперь, вот как я на самом деле форматирую свои строки дат (так как я поддерживаюболее 40 языков это немного сложно. Итак, (для английского) я начинаю с этой строки формата:

%1 %2!d!-%3!d!
  1. %1 это месяц .
  2. %2!d! - это значение первого дня .
  3. %3!d! - это значение второго дня .

Если мойдата должна обслуживать пересечение более двух месяцев, у меня есть:

%1 %2!d!–%3 %4!d!
  1. %1 - это значение month .
  2. %2!d! - это значение первый день значение.
  3. %3 - это значение второй месяц .
  4. %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());
}

Для Польский , мои соответствующие строки формата:

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

Итак, я вижу это, потому что я форматирую строку даты, используя FormatMessage итолько с помощью метода COleDateTime::Format для анализа только month , что это может быть причиной проблемы.

Поскольку у меня есть две даты в строке даты, я не могу просто использоватьодиночный вызов 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

Единственный способ, которым я могу получить правильную дату, - вот так:

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

Тогда месяц правильный.Теперь в статье, на которую я ссылался, говорится:

Windows возвращает обе формы в одной строке, разделенной нулевым значением.

Я даже не могу понять, какчтобы получить доступ к этому.

1 Ответ

0 голосов
/ 10 декабря 2018

Я столкнулся с другими проблемами, но они отличаются от этого вопроса, поэтому я все равно предоставлю здесь свой ответ.

Во-первых, я нашел документ , в котором говорится, что вы должны иметь 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

Это работает хорошо.

...