Correctly restore the originally used C locale in wxLocale dtor.
Save the original locale used before we changed it instead of "restoring" the same locate that this wxLocale object was using. Add a unit test to verify that this does work as expected. Closes #14873. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74426 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -206,7 +206,11 @@ wxLanguageInfoArray *wxLocale::ms_languagesDB = NULL;
|
|||||||
|
|
||||||
void wxLocale::DoCommonInit()
|
void wxLocale::DoCommonInit()
|
||||||
{
|
{
|
||||||
m_pszOldLocale = NULL;
|
// Store the current locale in order to be able to restore it in the dtor.
|
||||||
|
m_pszOldLocale = wxSetlocale(LC_ALL, NULL);
|
||||||
|
if ( m_pszOldLocale )
|
||||||
|
m_pszOldLocale = wxStrdup(m_pszOldLocale);
|
||||||
|
|
||||||
|
|
||||||
m_pOldLocale = wxSetLocale(this);
|
m_pOldLocale = wxSetLocale(this);
|
||||||
|
|
||||||
@@ -285,13 +289,7 @@ bool wxLocale::DoInit(const wxString& name,
|
|||||||
wxS("no locale to set in wxLocale::Init()") );
|
wxS("no locale to set in wxLocale::Init()") );
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *oldLocale = wxSetlocale(LC_ALL, szLocale);
|
if ( !wxSetlocale(LC_ALL, szLocale) )
|
||||||
if ( oldLocale )
|
|
||||||
m_pszOldLocale = wxStrdup(oldLocale);
|
|
||||||
else
|
|
||||||
m_pszOldLocale = NULL;
|
|
||||||
|
|
||||||
if ( m_pszOldLocale == NULL )
|
|
||||||
{
|
{
|
||||||
wxLogError(_("locale '%s' cannot be set."), szLocale);
|
wxLogError(_("locale '%s' cannot be set."), szLocale);
|
||||||
}
|
}
|
||||||
|
@@ -39,6 +39,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
CPPUNIT_TEST_SUITE( IntlTestCase );
|
CPPUNIT_TEST_SUITE( IntlTestCase );
|
||||||
|
CPPUNIT_TEST( RestoreLocale );
|
||||||
CPPUNIT_TEST( Domain );
|
CPPUNIT_TEST( Domain );
|
||||||
CPPUNIT_TEST( Headers );
|
CPPUNIT_TEST( Headers );
|
||||||
CPPUNIT_TEST( DateTimeFmtFrench );
|
CPPUNIT_TEST( DateTimeFmtFrench );
|
||||||
@@ -46,12 +47,18 @@ private:
|
|||||||
CPPUNIT_TEST( IsAvailable );
|
CPPUNIT_TEST( IsAvailable );
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
|
void RestoreLocale();
|
||||||
void Domain();
|
void Domain();
|
||||||
void Headers();
|
void Headers();
|
||||||
void DateTimeFmtFrench();
|
void DateTimeFmtFrench();
|
||||||
void DateTimeFmtC();
|
void DateTimeFmtC();
|
||||||
void IsAvailable();
|
void IsAvailable();
|
||||||
|
|
||||||
|
static wxString GetDecimalPoint()
|
||||||
|
{
|
||||||
|
return wxLocale::GetInfo(wxLOCALE_DECIMAL_POINT, wxLOCALE_CAT_NUMBER);
|
||||||
|
}
|
||||||
|
|
||||||
wxLocale *m_locale;
|
wxLocale *m_locale;
|
||||||
|
|
||||||
DECLARE_NO_COPY_CLASS(IntlTestCase)
|
DECLARE_NO_COPY_CLASS(IntlTestCase)
|
||||||
@@ -92,6 +99,25 @@ void IntlTestCase::tearDown()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IntlTestCase::RestoreLocale()
|
||||||
|
{
|
||||||
|
if ( !m_locale )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// We must be using the French locale now, it was changed in setUp().
|
||||||
|
CPPUNIT_ASSERT_EQUAL( ",", GetDecimalPoint() );
|
||||||
|
|
||||||
|
// Switch to the English locale.
|
||||||
|
{
|
||||||
|
wxLocale locEn(wxLANGUAGE_ENGLISH);
|
||||||
|
CPPUNIT_ASSERT_EQUAL( ".", GetDecimalPoint() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify that after destroying the English locale object, French locale is
|
||||||
|
// restored.
|
||||||
|
CPPUNIT_ASSERT_EQUAL( ",", GetDecimalPoint() );
|
||||||
|
}
|
||||||
|
|
||||||
void IntlTestCase::Domain()
|
void IntlTestCase::Domain()
|
||||||
{
|
{
|
||||||
if (!m_locale)
|
if (!m_locale)
|
||||||
|
Reference in New Issue
Block a user