diff --git a/src/common/intl.cpp b/src/common/intl.cpp index 575900d041..9b38ffbf14 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -1045,16 +1045,21 @@ bool wxLocale::IsAvailable(int lang) #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); + + free(oldLocale); + + if ( !available ) + return false; #endif return true; diff --git a/tests/intl/intltest.cpp b/tests/intl/intltest.cpp index 02b98472ed..3308e4e210 100644 --- a/tests/intl/intltest.cpp +++ b/tests/intl/intltest.cpp @@ -43,12 +43,14 @@ private: CPPUNIT_TEST( Headers ); CPPUNIT_TEST( DateTimeFmtFrench ); CPPUNIT_TEST( DateTimeFmtC ); + CPPUNIT_TEST( IsAvailable ); CPPUNIT_TEST_SUITE_END(); void Domain(); void Headers(); void DateTimeFmtFrench(); void DateTimeFmtC(); + void IsAvailable(); wxLocale *m_locale; @@ -204,4 +206,14 @@ void IntlTestCase::DateTimeFmtC() 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) ); +} + #endif // wxUSE_INTL