wxString searchPath;
searchPath << prefix << wxFILE_SEP_PATH << lang;
- // under Unix, the message catalogs are supposed to go into LC_MESSAGES
- // subdirectory so look there too
-#ifdef __UNIX__
+ // Under Unix, the message catalogs are supposed to go into LC_MESSAGES
+ // subdirectory so look there too. Note that we do it on all platforms
+ // and not just Unix, because it doesn't cost much to look into one more
+ // directory and doing it this way has two important benefits:
+ // a) we don't break compatibility with wx-2.6 and older by stopping to
+ // look in a directory where the catalogs used to be and thus silently
+ // breaking apps after they are recompiled against the latest wx
+ // b) it makes it possible to package app's support files in the same
+ // way on all target platforms
const wxString searchPathOrig(searchPath);
searchPath << wxFILE_SEP_PATH << wxT("LC_MESSAGES")
<< wxPATH_SEP << searchPathOrig;
-#endif // __UNIX__
return searchPath;
}
// an error if this does not exist
if ( bOk )
{
- wxString port(wxPlatformInfo().GetPortIdName());
+ wxString port(wxPlatformInfo::Get().GetPortIdName());
if ( !port.empty() )
{
AddCatalog(port.BeforeFirst(wxT('/')).MakeLower());
const wxLanguageInfo *info = wxLocale::GetLanguageInfo(lang);
wxCHECK_MSG( info, false, _T("invalid language") );
-#ifdef __WIN32__
+#if defined(__WIN32__)
if ( !info->WinLang )
return false;
SORT_DEFAULT),
LCID_INSTALLED
) )
- return false;
-#else // !__WIN32__
- // TODO: test if setlocale(info->CanonicalName) works under other OS?
-#endif // __WIN32__/!__WIN32__
+ return false;
+
+#elif defined(__UNIX__)
+
+ // Test if setting the locale works, then set it back.
+ wxMB2WXbuf oldLocale = wxSetlocale(LC_ALL, wxEmptyString);
+ wxMB2WXbuf tmp = wxSetlocaleTryUTF(LC_ALL, info->CanonicalName);
+ if ( !tmp )
+ {
+ // Some C libraries don't like xx_YY form and require xx only
+ tmp = wxSetlocaleTryUTF(LC_ALL, info->CanonicalName.Left(2));
+ if ( !tmp )
+ return false;
+ }
+ // restore the original locale
+ wxSetlocale(LC_ALL, oldLocale);
+#endif
return true;
}