From: Vadim Zeitlin Date: Sat, 29 Dec 2012 21:53:13 +0000 (+0000) Subject: Fix wxLocale::GetInfo() in C locale under Windows. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/7582edfbf9029a4f4a010329c1cd6bc7c1d084c4 Fix wxLocale::GetInfo() in C locale under Windows. Don't use LOCALE_USER_DEFAULT when the locale hadn't been changed because the user default locale often (and maybe even always) is different from "C" locale used by the CRT resulting in mismatch between the conventions used by wxDateTime::Format(), which uses the CRT locale, and wxDateTime::Parse(), which uses Windows format. Instead use the hard-coded values corresponding to the "C" locale to ensure we use the same values as the CRT in this case. This also reverts r73244 which was applies to make the unit tests pass before this fix as it's not necessary any longer. Closes #14918. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73320 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/common/intl.cpp b/src/common/intl.cpp index a7aaf30597..29132e9ad6 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -1422,15 +1422,54 @@ LCTYPE GetLCTYPEFormatFromLocalInfo(wxLocaleInfo index) /* static */ wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory cat) { - wxUint32 lcid = LOCALE_USER_DEFAULT; - if ( wxGetLocale() ) + const wxLanguageInfo * const + info = wxGetLocale() ? GetLanguageInfo(wxGetLocale()->GetLanguage()) + : NULL; + if ( !info ) { - const wxLanguageInfo * const - info = GetLanguageInfo(wxGetLocale()->GetLanguage()); - if ( info ) - lcid = info->GetLCID(); + // wxSetLocale() hadn't been called yet of failed, hence CRT must be + // using "C" locale -- but check it to detect bugs that would happen if + // this were not the case. + wxASSERT_MSG( strcmp(setlocale(LC_ALL, NULL), "C") == 0, + wxS("You probably called setlocale() directly instead ") + wxS("of calling wxSetLocale() and now there is a ") + wxS("mismatch between C/C++ and Windows locale.\n") + wxS("Things are going to break, use wxSetLocale() to ") + wxS("avoid this!") ); + + + // Return the hard coded values for C locale. This is really the right + // thing to do as there is no LCID we can use in the code below in this + // case, even LOCALE_INVARIANT is not quite the same as C locale (the + // only difference is that it uses %Y instead of %y in the date format + // but this difference is significant enough). + switch ( index ) + { + case wxLOCALE_THOUSANDS_SEP: + return wxString(); + + case wxLOCALE_DECIMAL_POINT: + return "."; + + case wxLOCALE_SHORT_DATE_FMT: + return "%m/%d/%y"; + + case wxLOCALE_LONG_DATE_FMT: + return "%A, %B %d, %Y"; + + case wxLOCALE_TIME_FMT: + return "%H:%M:%S"; + + case wxLOCALE_DATE_TIME_FMT: + return "%m/%d/%y %H:%M:%S"; + + default: + wxFAIL_MSG( "unknown wxLocaleInfo" ); + } } + const wxUint32 lcid = info->GetLCID(); + wxString str; wxChar buf[256]; diff --git a/tests/test.cpp b/tests/test.cpp index 5225ce76b1..6619dd21c5 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -472,8 +472,6 @@ bool TestApp::OnInit() if ( !TestAppBase::OnInit() ) return false; - SetCLocale(); - #if wxUSE_GUI cout << "Test program for wxWidgets GUI features\n" #else