У меня есть этот метод для установки языка на польский:
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
?
В противном случае мне придется добавитьчто-то ручное, чтобы переопределить.
Месяцы, которые я хотел бы вернуть:
- stycznia
- lutego
- marca
- kwietnia
- maja
- czerwca
- lipca
- sierpnia
- września
- października
- листопада
- grudnia
Обновление
Согласно здесь говорится:
Некоторые языки, такие как финский,Немецкий, польский и русский имеют несколько существительных.Если вы планируете использовать локализованные имена, предоставляемые системой, сделайте проверку лингвиста, чтобы убедиться, что вы используете их в правильном контексте.Windows имеет как именительные, так и родительные формы польских и русских названий месяцев форма изменяется в зависимости от позиции названия месяца в строке относительно названия дня .Windows возвращает обе формы в одной строке, разделенной нулевым значением. Система содержит только одну форму названия месяца или месяца для всех других языков .
Теперь, вот как я на самом деле форматирую свои строки дат (так как я поддерживаюболее 40 языков это немного сложно. Итак, (для английского) я начинаю с этой строки формата:
%1 %2!d!-%3!d!
%1
это месяц . %2!d!
- это значение первого дня . %3!d!
- это значение второго дня .
Если мойдата должна обслуживать пересечение более двух месяцев, у меня есть:
%1 %2!d!–%3 %4!d!
%1
- это значение month . %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());
}
Для Польский , мои соответствующие строки формата:
%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 возвращает обе формы в одной строке, разделенной нулевым значением.
Я даже не могу понять, какчтобы получить доступ к этому.