delete [] m_pData;
}
-// return the directory to search for message catalogs under the given prefix
+// return the directories to search for message catalogs under the given
+// prefix, separated by wxPATH_SEP
static
-wxString GetMsgCatalogSubdir(const wxChar *prefix, const wxChar *lang)
+wxString GetMsgCatalogSubdirs(const wxChar *prefix, const wxChar *lang)
{
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;
}
count = gs_searchPrefixes.size();
for ( n = 0; n < count; n++ )
{
- paths.Add(GetMsgCatalogSubdir(gs_searchPrefixes[n], lang));
+ paths.Add(GetMsgCatalogSubdirs(gs_searchPrefixes[n], lang));
}
const wxChar *pszLcPath = wxGetenv(wxT("LC_PATH"));
if ( pszLcPath )
{
- const wxString lcp = GetMsgCatalogSubdir(pszLcPath, lang);
+ const wxString lcp = GetMsgCatalogSubdirs(pszLcPath, lang);
if ( paths.Index(lcp) == wxNOT_FOUND )
paths.Add(lcp);
}
wxString wxp = wxGetInstallPrefix();
if ( !wxp.empty() )
{
- wxp = GetMsgCatalogSubdir(wxp + _T("/share/locale"), lang);
+ wxp = GetMsgCatalogSubdirs(wxp + _T("/share/locale"), lang);
if ( paths.Index(wxp) == wxNOT_FOUND )
paths.Add(wxp);
}
// 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());
return NULL;
}
+// check if the given locale is provided by OS and C run time
+/* static */
+bool wxLocale::IsAvailable(int lang)
+{
+ const wxLanguageInfo *info = wxLocale::GetLanguageInfo(lang);
+ wxCHECK_MSG( info, false, _T("invalid language") );
+
+#ifdef __WIN32__
+ if ( !info->WinLang )
+ return false;
+
+ if ( !::IsValidLocale
+ (
+ MAKELCID(MAKELANGID(info->WinLang, info->WinSublang),
+ SORT_DEFAULT),
+ LCID_INSTALLED
+ ) )
+ return false;
+#else // !__WIN32__
+ // TODO: test if setlocale(info->CanonicalName) works under other OS?
+#endif // __WIN32__/!__WIN32__
+
+ return true;
+}
+
// check if the given catalog is loaded
bool wxLocale::IsLoaded(const wxChar *szDomain) const
{