add wxLanguageInfo::GetLocaleName(), this simplifies the current code and will be used with wxXLocale

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51669 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-02-11 23:40:03 +00:00
parent ea65760d5c
commit 86d62b51c0
2 changed files with 60 additions and 29 deletions

View File

@@ -332,8 +332,18 @@ struct WXDLLIMPEXP_BASE wxLanguageInfo
// return the LCID corresponding to this language // return the LCID corresponding to this language
wxUint32 GetLCID() const; wxUint32 GetLCID() const;
#endif // __WXMSW__ #endif // __WXMSW__
// return the locale name corresponding to this language usable with
// setlocale() on the current system
wxString GetLocaleName() const;
}; };
// for Unix systems GetLocaleName() is trivial so implement it inline here, for
// MSW it's implemented in intl.cpp
#ifndef __WXMSW__
inline wxString wxLanguageInfo::GetLocaleName() const { return CanonicalName; }
#endif // !__WXMSW__
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxLocaleCategory: the category of locale settings // wxLocaleCategory: the category of locale settings
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -1023,6 +1023,38 @@ wxUint32 wxLanguageInfo::GetLCID() const
return MAKELCID(MAKELANGID(WinLang, WinSublang), SORT_DEFAULT); return MAKELCID(MAKELANGID(WinLang, WinSublang), SORT_DEFAULT);
} }
wxString wxLanguageInfo::GetLocaleName() const
{
wxString locale;
const LCID lcid = GetLCID();
wxChar buffer[256];
buffer[0] = _T('\0');
if ( !::GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, buffer, WXSIZEOF(buffer)) )
{
wxLogLastError(_T("GetLocaleInfo(LOCALE_SENGLANGUAGE)"));
return locale;
}
locale << buffer;
if ( ::GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY,
buffer, WXSIZEOF(buffer)) > 0 )
{
locale << _T('_') << buffer;
}
if ( ::GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE,
buffer, WXSIZEOF(buffer)) > 0 )
{
if ( buffer[0] != _T('0') || buffer[1] != _T('\0') )
locale << _T('.') << buffer;
//else: this locale doesn't use ANSI code page
}
return locale;
}
#endif // __WXMSW__ #endif // __WXMSW__
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -1806,7 +1838,7 @@ bool wxLocale::Init(int language, int flags)
// Unicode. Therefore wxSetlocale call failed, but we don't want // Unicode. Therefore wxSetlocale call failed, but we don't want
// to report it as an error -- so that at least message catalogs // to report it as an error -- so that at least message catalogs
// can be used. Watch for code marked with // can be used. Watch for code marked with
// #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS bellow. // #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS below.
#define SETLOCALE_FAILS_ON_UNICODE_LANGS #define SETLOCALE_FAILS_ON_UNICODE_LANGS
#endif #endif
@@ -1820,49 +1852,38 @@ bool wxLocale::Init(int language, int flags)
} }
else else
{ {
int codepage
#ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS
= -1
#endif
;
const wxUint32 lcid = info->GetLCID(); const wxUint32 lcid = info->GetLCID();
// FIXME // FIXME
#ifndef __WXWINCE__ #ifndef __WXWINCE__
SetThreadLocale(lcid); // change locale used by Windows functions
::SetThreadLocale(lcid);
#endif #endif
// NB: we must translate LCID to CRT's setlocale string ourselves, // and also call setlocale() to change locale used by the CRT
// because SetThreadLocale does not modify change the locale = info->GetLocaleName();
// interpretation of setlocale(LC_ALL, "") call: if ( locale.empty() )
wxChar buffer[256];
buffer[0] = wxS('\0');
GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, buffer, 256);
locale << buffer;
if (GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY, buffer, 256) > 0)
locale << wxS("_") << buffer;
if (GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE, buffer, 256) > 0)
{ {
codepage = wxAtoi(buffer);
if (codepage != 0)
locale << wxS(".") << buffer;
}
if (locale.empty())
{
wxLogLastError(wxS("SetThreadLocale"));
ret = false; ret = false;
} }
else else // have a valid locale
{ {
// FIXME // FIXME
#ifndef __WXWINCE__ #ifndef __WXWINCE__
retloc = wxSetlocale(LC_ALL, locale); retloc = wxSetlocale(LC_ALL, locale);
#endif #endif
#ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS
if (codepage == 0 && retloc == NULL) if ( !retloc )
{
// GetLocaleName() returns a string without period only if
// there is no associated ANSI code page
if ( locale.find(_T('.')) == wxString::npos )
{ {
retloc = "C"; retloc = "C";
} }
#endif //else: locale has code page information and hence this is
// a real error
}
#endif // SETLOCALE_FAILS_ON_UNICODE_LANGS
} }
} }
} }