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
wxUint32 GetLCID() const;
#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
// ----------------------------------------------------------------------------

View File

@@ -1023,6 +1023,38 @@ wxUint32 wxLanguageInfo::GetLCID() const
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__
// ----------------------------------------------------------------------------
@@ -1806,7 +1838,7 @@ bool wxLocale::Init(int language, int flags)
// 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.
// #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS below.
#define SETLOCALE_FAILS_ON_UNICODE_LANGS
#endif
@@ -1820,49 +1852,38 @@ bool wxLocale::Init(int language, int flags)
}
else
{
int codepage
#ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS
= -1
#endif
;
const wxUint32 lcid = info->GetLCID();
// FIXME
#ifndef __WXWINCE__
SetThreadLocale(lcid);
// change locale used by Windows functions
::SetThreadLocale(lcid);
#endif
// 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] = 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)
// and also call setlocale() to change locale used by the CRT
locale = info->GetLocaleName();
if ( locale.empty() )
{
codepage = wxAtoi(buffer);
if (codepage != 0)
locale << wxS(".") << buffer;
}
if (locale.empty())
{
wxLogLastError(wxS("SetThreadLocale"));
ret = false;
}
else
else // have a valid locale
{
// FIXME
#ifndef __WXWINCE__
retloc = wxSetlocale(LC_ALL, locale);
#endif
#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";
}
#endif
//else: locale has code page information and hence this is
// a real error
}
#endif // SETLOCALE_FAILS_ON_UNICODE_LANGS
}
}
}