From: Václav Slavík Date: Fri, 11 Apr 2003 23:20:36 +0000 (+0000) Subject: don't report setlocale failure if trying to set Unicode-only language X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/65dc921d3f1080b8b5c6ca49d2cce228d6924480 don't report setlocale failure if trying to set Unicode-only language git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20146 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/samples/internat/internat.cpp b/samples/internat/internat.cpp index 3856f2ebfc..e887968b5b 100644 --- a/samples/internat/internat.cpp +++ b/samples/internat/internat.cpp @@ -119,9 +119,12 @@ bool MyApp::OnInit() wxLANGUAGE_FRENCH, wxLANGUAGE_GERMAN, wxLANGUAGE_RUSSIAN, +#if wxUSE_UNICODE wxLANGUAGE_JAPANESE, + wxLANGUAGE_GEORGIAN, +#endif wxLANGUAGE_ENGLISH, - wxLANGUAGE_ENGLISH_US, + wxLANGUAGE_ENGLISH_US }; if ( lng == -1 ) @@ -134,7 +137,10 @@ bool MyApp::OnInit() _T("French"), _T("German"), _T("Russian"), - _T("Japanese"), // this will only work in Unicode build +#if wxUSE_UNICODE + _T("Japanese"), + _T("Georgian (no translation)"), +#endif _T("English"), _T("English (U.S.)") }; diff --git a/src/common/intl.cpp b/src/common/intl.cpp index e78a33c9d0..339b71aad0 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -711,6 +711,17 @@ bool wxLocale::Init(int language, int flags) return FALSE; } #elif defined(__WIN32__) + + #if wxUSE_UNICODE && (defined(__VISUALC__) || defined(__MINGW32__)) + // NB: setlocale() from msvcrt.dll (used by VC++ and Mingw) + // can't set locale to language that can only be written using + // Unicode. Therefore wxSetlocale call failed, but we don't want + // to report it as an error -- so that at least message catalogs + // can be used. Watch for code marked with + // #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS bellow. + #define SETLOCALE_FAILS_ON_UNICODE_LANGS + #endif + wxMB2WXbuf retloc = wxT("C"); if (language != wxLANGUAGE_DEFAULT) { @@ -721,42 +732,58 @@ bool wxLocale::Init(int language, int flags) } else { + int codepage = -1; wxUint32 lcid = MAKELCID(MAKELANGID(info->WinLang, info->WinSublang), SORT_DEFAULT); - if (SetThreadLocale(lcid)) + SetThreadLocale(lcid); + // NB: we must translate LCID to CRT's setlocale string ourselves, + // because SetThreadLocale does not modify change the + // interpretation of setlocale(LC_ALL, "") call: + wxChar buffer[256]; + buffer[0] = wxT('\0'); + GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, buffer, 256); + locale << buffer; + if (GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY, buffer, 256) > 0) + locale << wxT("_") << buffer; + if (GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE, buffer, 256) > 0) + { + codepage = wxAtoi(buffer); + if (codepage != 0) + locale << wxT(".") << buffer; + } + if (locale.IsEmpty()) { - retloc = wxSetlocale(LC_ALL, wxEmptyString); + wxLogLastError(wxT("SetThreadLocale")); + wxLogError(wxT("Cannot set locale to language %s."), name.c_str()); + return FALSE; } else { - // Windows9X doesn't support SetThreadLocale, so we must - // translate LCID to CRT's setlocale string ourselves - locale.Empty(); - if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) - { - wxChar buffer[256]; - buffer[0] = wxT('\0'); - GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, buffer, 256); - locale << buffer; - if (GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY, buffer, 256) > 0) - locale << wxT("_") << buffer; - } - if (locale.IsEmpty()) - { - wxLogLastError(wxT("SetThreadLocale")); - wxLogError(wxT("Cannot set locale to language %s."), name.c_str()); - return FALSE; - } - else + retloc = wxSetlocale(LC_ALL, locale); +#ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS + if (codepage == 0 && (const wxChar*)retloc == NULL) { - retloc = wxSetlocale(LC_ALL, locale); + retloc = wxT("C"); } +#endif } } } else { retloc = wxSetlocale(LC_ALL, wxEmptyString); +#ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS + if ((const wxChar*)retloc == NULL) + { + wxChar buffer[16]; + if (GetLocaleInfo(LOCALE_USER_DEFAULT, + LOCALE_IDEFAULTANSICODEPAGE, buffer, 16) > 0 && + wxStrcmp(buffer, wxT("0")) == 0) + { + retloc = wxT("C"); + } + } +#endif } if ( !retloc )