The return value of setlocale() was used incorrectly in this code: it
represents the newly set locale and not the previously active one so we didn't
actually restore the original locale before.
Fix the code and check that we do actually restore the locale in a new unit
test for it.
See #13117.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67405
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
#elif defined(__UNIX__)
// Test if setting the locale works, then set it back.
#elif defined(__UNIX__)
// Test if setting the locale works, then set it back.
- const char *oldLocale = wxSetlocaleTryUTF8(LC_ALL, info->CanonicalName);
- if ( !oldLocale )
- {
- // Some C libraries don't like xx_YY form and require xx only
- oldLocale = wxSetlocaleTryUTF8(LC_ALL, ExtractLang(info->CanonicalName));
- if ( !oldLocale )
- return false;
- }
+ char * const oldLocale = wxStrdupA(setlocale(LC_ALL, NULL));
+
+ // Some platforms don't like xx_YY form and require xx only so test for
+ // it too.
+ const bool
+ available = wxSetlocaleTryUTF8(LC_ALL, info->CanonicalName) ||
+ wxSetlocaleTryUTF8(LC_ALL, ExtractLang(info->CanonicalName));
+
// restore the original locale
wxSetlocale(LC_ALL, oldLocale);
// restore the original locale
wxSetlocale(LC_ALL, oldLocale);
+
+ free(oldLocale);
+
+ if ( !available )
+ return false;
CPPUNIT_TEST( Headers );
CPPUNIT_TEST( DateTimeFmtFrench );
CPPUNIT_TEST( DateTimeFmtC );
CPPUNIT_TEST( Headers );
CPPUNIT_TEST( DateTimeFmtFrench );
CPPUNIT_TEST( DateTimeFmtC );
+ CPPUNIT_TEST( IsAvailable );
CPPUNIT_TEST_SUITE_END();
void Domain();
void Headers();
void DateTimeFmtFrench();
void DateTimeFmtC();
CPPUNIT_TEST_SUITE_END();
void Domain();
void Headers();
void DateTimeFmtFrench();
void DateTimeFmtC();
m_locale->GetInfo(wxLOCALE_TIME_FMT) );
}
m_locale->GetInfo(wxLOCALE_TIME_FMT) );
}
+void IntlTestCase::IsAvailable()
+{
+ const wxString origLocale(setlocale(LC_ALL, NULL));
+
+ // Calling IsAvailable() shouldn't change the locale.
+ wxLocale::IsAvailable(wxLANGUAGE_ENGLISH);
+
+ CPPUNIT_ASSERT_EQUAL( origLocale, setlocale(LC_ALL, NULL) );
+}
+