Locale independent wxDateTime::ParseFormat()

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
private_joker
Earned a small fee
Earned a small fee
Posts: 12
Joined: Tue Nov 24, 2009 6:26 pm

Locale independent wxDateTime::ParseFormat()

Post by private_joker »

Дано:
const char* date содержащий текстовое представление (НЕ в текущей locale!) DateTime: "Mon Nov 14 09:25:44 2022"
(в таком виде например отдаёт std::ctime() https://en.cppreference.com/w/cpp/chrono/c/ctime )

Code: Select all

wxDateTime dt;
wxString token = "%a %b %d %H:%M:%S %Y"; //or just "%c" https://en.cppreference.com/w/cpp/chrono/c/strftime#Format_string
wxString dateStr = wxString(date);
wxString::const_iterator end;
if (!dt.ParseFormat(dateStr, token, wxDefaultDateTime, &end))
{
  //parsing failed
 return false;
}
else if (end == dateStr.end())
{
  //entire string parsed
  dt.IsValid() ? wxLogDebug(dt.Format()) : wxEmptyString;
}
else
{
  //left over
  wxLogDebug(wxString(end, dateStr.end()));
}
Итог: если локаль в приложении соответствует представлению в строке dateStr "день недели" и "месяц", например "Mon Nov ..." при локали "en", либо "Пн Ноя ..." при "ru" парсинг успешен,
если локаль в приложении не соответствует представлению в строке dateStr "день недели" и "месяц", например "Mon Nov ..." при локали "ru" парсинг неудачен.

В src/common/datetimefmt.cpp
есть такое:

Code: Select all

enum
{
    DateLang_English = 1,
    DateLang_Local   = 2
};
но wxDateTime::ParseFormat() внутри метода использует только DateLang_Local.

Вопрос: locale independent парсинг возможен (можно распарсить "день недели" и "месяц" руками самому, вопрос не в этом), без кривых UB костылей, тем более с multithread приложением, вроде временного setlocale() внутри метода, с возвратом предыдущего значения, и без сторонних библиотек?

P.S. У MS есть такое: https://learn.microsoft.com/en-us/windo ... atefromstr но нужно портабельное решение.

WX 3.1.7
MSVC 2019
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Re: Locale independent wxDateTime::ParseFormat()

Post by T-Rex »

Красивого решения локального без прямого перебора пока не придумал, но если цель сделать любым путем, не смотря ни на что, то можно отдать текст на детекцию локали в Google Translate
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Re: Locale independent wxDateTime::ParseFormat()

Post by T-Rex »

Есть еще такое (ну и схожие решения) для определения языка оффлайн, но, судя по размерам баз, оно того не стоит, там десятки мегабайт словарей. Для такой задачи оверхед, мне кажется.
Post Reply