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
This commit is contained in:
Václav Slavík
2003-04-11 23:20:36 +00:00
parent ef4a634b1b
commit 65dc921d3f
2 changed files with 57 additions and 24 deletions

View File

@@ -119,9 +119,12 @@ bool MyApp::OnInit()
wxLANGUAGE_FRENCH, wxLANGUAGE_FRENCH,
wxLANGUAGE_GERMAN, wxLANGUAGE_GERMAN,
wxLANGUAGE_RUSSIAN, wxLANGUAGE_RUSSIAN,
#if wxUSE_UNICODE
wxLANGUAGE_JAPANESE, wxLANGUAGE_JAPANESE,
wxLANGUAGE_GEORGIAN,
#endif
wxLANGUAGE_ENGLISH, wxLANGUAGE_ENGLISH,
wxLANGUAGE_ENGLISH_US, wxLANGUAGE_ENGLISH_US
}; };
if ( lng == -1 ) if ( lng == -1 )
@@ -134,7 +137,10 @@ bool MyApp::OnInit()
_T("French"), _T("French"),
_T("German"), _T("German"),
_T("Russian"), _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"),
_T("English (U.S.)") _T("English (U.S.)")
}; };

View File

@@ -711,6 +711,17 @@ bool wxLocale::Init(int language, int flags)
return FALSE; return FALSE;
} }
#elif defined(__WIN32__) #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"); wxMB2WXbuf retloc = wxT("C");
if (language != wxLANGUAGE_DEFAULT) if (language != wxLANGUAGE_DEFAULT)
{ {
@@ -721,42 +732,58 @@ bool wxLocale::Init(int language, int flags)
} }
else else
{ {
int codepage = -1;
wxUint32 lcid = MAKELCID(MAKELANGID(info->WinLang, info->WinSublang), wxUint32 lcid = MAKELCID(MAKELANGID(info->WinLang, info->WinSublang),
SORT_DEFAULT); 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)
{ {
retloc = wxSetlocale(LC_ALL, wxEmptyString); codepage = wxAtoi(buffer);
if (codepage != 0)
locale << wxT(".") << buffer;
}
if (locale.IsEmpty())
{
wxLogLastError(wxT("SetThreadLocale"));
wxLogError(wxT("Cannot set locale to language %s."), name.c_str());
return FALSE;
} }
else else
{ {
// Windows9X doesn't support SetThreadLocale, so we must retloc = wxSetlocale(LC_ALL, locale);
// translate LCID to CRT's setlocale string ourselves #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS
locale.Empty(); if (codepage == 0 && (const wxChar*)retloc == NULL)
if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
{ {
wxChar buffer[256]; retloc = wxT("C");
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);
} }
#endif
} }
} }
} }
else else
{ {
retloc = wxSetlocale(LC_ALL, wxEmptyString); 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 ) if ( !retloc )