From: Václav Slavík Date: Mon, 21 May 2007 17:44:37 +0000 (+0000) Subject: return reference to non-temporary wxString instance from wxGetTranslation() even... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/a64be16ef8aac40c68ed53cbe0f79979f8f6a898 return reference to non-temporary wxString instance from wxGetTranslation() even when not translating git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46144 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/intl.h b/include/wx/intl.h index 21f326d23e..5218a63a84 100644 --- a/include/wx/intl.h +++ b/include/wx/intl.h @@ -512,6 +512,11 @@ public: size_t n, const wxString& domain = wxEmptyString) const; + // this is hack to work around a problem with wxGetTranslation() which + // returns const wxString& and not wxString, so when it returns untranslated + // string, it needs to have a copy of it somewhere + static const wxString& GetUntranslatedString(const wxString& str); + // Returns the current short name for the locale const wxString& GetName() const { return m_strShort; } @@ -569,7 +574,9 @@ inline const wxString& wxGetTranslation(const wxString& str, if (pLoc) return pLoc->GetString(str, domain); else - return str; + // NB: this function returns reference to a string, so we have to keep + // a copy of it somewhere + return wxLocale::GetUntranslatedString(str); } inline const wxString& wxGetTranslation(const wxString& str1, const wxString& str2, @@ -580,7 +587,11 @@ inline const wxString& wxGetTranslation(const wxString& str1, if (pLoc) return pLoc->GetString(str1, str2, n, domain); else - return n == 1 ? str1 : str2; + // NB: this function returns reference to a string, so we have to keep + // a copy of it somewhere + return n == 1 + ? wxLocale::GetUntranslatedString(str1) + : wxLocale::GetUntranslatedString(str2); } #else // !wxUSE_INTL @@ -596,22 +607,27 @@ inline const wxString& wxGetTranslation(const wxString& str1, #define wxTRANSLATE(str) _T(str) -inline const wxString& wxGetTranslation(const wxString& str, - const wxString& WXUNUSED(domain) = wxEmptyString) -{ - return str; -} +// NB: we use a template here in order to avoid using +// wxLocale::GetUntranslatedString() above, which would be required if +// we returned const wxString&; this way, the compiler should be able to +// optimize wxGetTranslation() away -inline const wxString& wxGetTranslation(const wxString& str1, - const wxString& str2, - size_t n, - const wxString& WXUNUSED(domain) = wxEmptyString) -{ - if ( n == 1 ) - return str1; - else - return str2; -} +template +inline TString wxGetTranslation(TString str) + { return str; } + +template +inline TString wxGetTranslation(TString str, TDomain WXUNUSED(domain)) + { return str; } + +template +inline TString wxGetTranslation(TString str1, TString str2, size_t n) + { return n == 1 ? str1 : str2; } + +template +inline TString wxGetTranslation(TString str1, TString str2, size_t n, + TDomain WXUNUSED(domain)) + { return n == 1 ? str1 : str2; } #endif // wxUSE_INTL/!wxUSE_INTL diff --git a/src/common/intl.cpp b/src/common/intl.cpp index f8129005d8..dec5ce8daa 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -69,6 +69,7 @@ #include "wx/ptr_scpd.h" #include "wx/apptrait.h" #include "wx/stdpaths.h" +#include "wx/hashset.h" #if defined(__WXMAC__) #include "wx/mac/private.h" // includes mac headers @@ -2614,7 +2615,7 @@ const wxString& wxLocale::GetString(const wxString& origString, const wxString& domain) const { if ( origString.empty() ) - return origString; + return GetUntranslatedString(origString); const wxString *trans = NULL; wxMsgCatalog *pMsgCat; @@ -2656,14 +2657,31 @@ const wxString& wxLocale::GetString(const wxString& origString, #endif // __WXDEBUG__ if (n == size_t(-1)) - return origString; + return GetUntranslatedString(origString); else - return n == 1 ? origString : origString2; + return GetUntranslatedString(n == 1 ? origString : origString2); } return *trans; } +WX_DECLARE_HASH_SET(wxString, wxStringHash, wxStringEqual, + wxLocaleUntranslatedStrings); + +/* static */ +const wxString& wxLocale::GetUntranslatedString(const wxString& str) +{ + static wxLocaleUntranslatedStrings s_strings; + + wxLocaleUntranslatedStrings::iterator i = s_strings.find(str); + if ( i != s_strings.end() ) + return *i; + else + return *s_strings.insert(str).first; + + return *i; +} + wxString wxLocale::GetHeaderValue(const wxString& header, const wxString& domain) const {