X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/92d609f4b623e38bf202cacc842a616250886faf..e733c4ce1e24cf7e4b0b0d8362fc59aaa7a7641c:/src/common/translation.cpp diff --git a/src/common/translation.cpp b/src/common/translation.cpp index 518713c743..455fb315d0 100644 --- a/src/common/translation.cpp +++ b/src/common/translation.cpp @@ -5,7 +5,6 @@ // Michael N. Filippov // (2003/09/30 - PluralForms support) // Created: 2010-04-23 -// RCS-ID: $Id$ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -48,7 +47,7 @@ #include "wx/tokenzr.h" #include "wx/fontmap.h" #include "wx/stdpaths.h" -#include "wx/hashset.h" +#include "wx/private/threadinfo.h" #ifdef __WINDOWS__ #include "wx/dynlib.h" @@ -101,7 +100,7 @@ void LogTraceArray(const char *prefix, const wxArrayString& arr) wxLogTrace(TRACE_I18N, "%s: [%s]", prefix, wxJoin(arr, ',')); } -void LogTraceLargeArray(const char *prefix, const wxArrayString& arr) +void LogTraceLargeArray(const wxString& prefix, const wxArrayString& arr) { wxLogTrace(TRACE_I18N, "%s:", prefix); for ( wxArrayString::const_iterator i = arr.begin(); i != arr.end(); ++i ) @@ -1507,17 +1506,11 @@ bool wxTranslations::AddCatalog(const wxString& domain, wxS("adding '%s' translation for domain '%s' (msgid language '%s')"), domain_lang, domain, msgIdLang); - // It is OK to not load catalog if the msgid language and m_language match, - // in which case we can directly display the texts embedded in program's - // source code: - if ( msgIdLang == domain_lang ) - return true; - - return LoadCatalog(domain, domain_lang); + return LoadCatalog(domain, domain_lang, msgIdLang); } -bool wxTranslations::LoadCatalog(const wxString& domain, const wxString& lang) +bool wxTranslations::LoadCatalog(const wxString& domain, const wxString& lang, const wxString& msgIdLang) { wxCHECK_MSG( m_loader, false, "loader can't be NULL" ); @@ -1554,6 +1547,15 @@ bool wxTranslations::LoadCatalog(const wxString& domain, const wxString& lang) cat = m_loader->LoadCatalog(domain, baselang); } + if ( !cat ) + { + // It is OK to not load catalog if the msgid language and m_language match, + // in which case we can directly display the texts embedded in program's + // source code: + if ( msgIdLang == lang ) + return true; + } + if ( cat ) { // add it to the head of the list so that in GetString it will @@ -1606,38 +1608,31 @@ wxString wxTranslations::GetBestTranslation(const wxString& domain, } -namespace -{ -WX_DECLARE_HASH_SET(wxString, wxStringHash, wxStringEqual, - wxLocaleUntranslatedStrings); -} - /* static */ const wxString& wxTranslations::GetUntranslatedString(const wxString& str) { - static wxLocaleUntranslatedStrings s_strings; + wxLocaleUntranslatedStrings& strings = wxThreadInfo.untranslatedStrings; - wxLocaleUntranslatedStrings::iterator i = s_strings.find(str); - if ( i == s_strings.end() ) - return *s_strings.insert(str).first; + wxLocaleUntranslatedStrings::iterator i = strings.find(str); + if ( i == strings.end() ) + return *strings.insert(str).first; return *i; } -const wxString& wxTranslations::GetString(const wxString& origString, - const wxString& domain) const +const wxString *wxTranslations::GetTranslatedString(const wxString& origString, + const wxString& domain) const { - return GetString(origString, origString, UINT_MAX, domain); + return GetTranslatedString(origString, UINT_MAX, domain); } -const wxString& wxTranslations::GetString(const wxString& origString, - const wxString& origString2, - unsigned n, - const wxString& domain) const +const wxString *wxTranslations::GetTranslatedString(const wxString& origString, + unsigned n, + const wxString& domain) const { if ( origString.empty() ) - return GetUntranslatedString(origString); + return NULL; const wxString *trans = NULL; wxMsgCatalog *pMsgCat; @@ -1672,14 +1667,9 @@ const wxString& wxTranslations::GetString(const wxString& origString, (!domain.empty() ? wxString::Format("domain '%s' ", domain) : wxString()), m_lang ); - - if (n == UINT_MAX) - return GetUntranslatedString(origString); - else - return GetUntranslatedString(n == 1 ? origString : origString2); } - return *trans; + return trans; } @@ -1761,7 +1751,7 @@ wxArrayString gs_searchPrefixes; wxString GetMsgCatalogSubdirs(const wxString& prefix, const wxString& lang) { // Search first in Unix-standard prefix/lang/LC_MESSAGES, then in - // prefix/lang and finally in just prefix. + // prefix/lang. // // Note that we use LC_MESSAGES on all platforms and not just Unix, because // it doesn't cost much to look into one more directory and doing it this @@ -1775,9 +1765,15 @@ wxString GetMsgCatalogSubdirs(const wxString& prefix, const wxString& lang) wxString searchPath; searchPath.reserve(4*prefixAndLang.length()); - searchPath << prefixAndLang << wxFILE_SEP_PATH << "LC_MESSAGES" << wxPATH_SEP + + searchPath +#ifdef __WXOSX__ + << prefixAndLang << ".lproj/LC_MESSAGES" << wxPATH_SEP + << prefixAndLang << ".lproj" << wxPATH_SEP +#endif + << prefixAndLang << wxFILE_SEP_PATH << "LC_MESSAGES" << wxPATH_SEP << prefixAndLang << wxPATH_SEP - << prefix; + ; return searchPath; } @@ -1790,7 +1786,7 @@ bool HasMsgCatalogInDir(const wxString& dir, const wxString& domain) // get prefixes to locale directories; if lang is empty, don't point to // OSX's .lproj bundles -wxArrayString GetSearchPrefixes(const wxString& lang = wxString()) +wxArrayString GetSearchPrefixes() { wxArrayString paths; @@ -1800,15 +1796,7 @@ wxArrayString GetSearchPrefixes(const wxString& lang = wxString()) #if wxUSE_STDPATHS // then look in the standard location wxString stdp; - if ( lang.empty() ) - { - stdp = wxStandardPaths::Get().GetResourcesDir(); - } - else - { - stdp = wxStandardPaths::Get(). - GetLocalizedResourcesDir(lang, wxStandardPaths::ResourceCat_Messages); - } + stdp = wxStandardPaths::Get().GetResourcesDir(); if ( paths.Index(stdp) == wxNOT_FOUND ) paths.Add(stdp); #endif // wxUSE_STDPATHS @@ -1844,7 +1832,7 @@ wxString GetFullSearchPath(const wxString& lang) wxString searchPath; searchPath.reserve(500); - const wxArrayString prefixes = GetSearchPrefixes(lang); + const wxArrayString prefixes = GetSearchPrefixes(); for ( wxArrayString::const_iterator i = prefixes.begin(); i != prefixes.end();