diff --git a/include/wx/intl.h b/include/wx/intl.h index 3f60fb6335..54d18a45d5 100644 --- a/include/wx/intl.h +++ b/include/wx/intl.h @@ -247,10 +247,8 @@ public: // The loaded catalog will be used for message lookup by GetString(). // // Returns 'true' if it was successfully loaded - bool AddCatalog(const wxString& domain) - { return m_translations.AddCatalog(domain); } - bool AddCatalog(const wxString& domain, wxLanguage msgIdLanguage) - { return m_translations.AddCatalog(domain, msgIdLanguage); } + bool AddCatalog(const wxString& domain); + bool AddCatalog(const wxString& domain, wxLanguage msgIdLanguage); bool AddCatalog(const wxString& domain, wxLanguage msgIdLanguage, const wxString& msgIdCharset); @@ -258,8 +256,7 @@ public: static bool IsAvailable(int lang); // check if the given catalog is loaded - bool IsLoaded(const wxString& domain) const - { return m_translations.IsLoaded(domain); } + bool IsLoaded(const wxString& domain) const; // Retrieve the language info struct for the given language // @@ -300,7 +297,7 @@ public: const wxString& GetString(const wxString& origString, const wxString& domain = wxEmptyString) const { - return m_translations.GetString(origString, domain); + return wxGetTranslation(origString, domain); } // plural form version of the same: const wxString& GetString(const wxString& origString, @@ -308,7 +305,7 @@ public: size_t n, const wxString& domain = wxEmptyString) const { - return m_translations.GetString(origString, origString2, n, domain); + return wxGetTranslation(origString, origString2, n, domain); } // this is hack to work around a problem with wxGetTranslation() which @@ -322,10 +319,7 @@ public: // return the contents of .po file header wxString GetHeaderValue(const wxString& header, - const wxString& domain = wxEmptyString) const - { - return m_translations.GetHeaderValue(header, domain); - } + const wxString& domain = wxEmptyString) const; // These two methods are for internal use only. First one creates // ms_languagesDB if it doesn't already exist, second one destroys diff --git a/src/common/intl.cpp b/src/common/intl.cpp index cc1377007f..d27fc4899d 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -211,7 +211,24 @@ void wxLocale::DoCommonInit() m_pszOldLocale = NULL; m_pOldLocale = wxSetLocale(this); - wxTranslations::SetNonOwned(&m_translations); + + // Set translations object, but only if the user didn't do so yet. + // This is to preserve compatibility with wx-2.8 where wxLocale was + // the only API for translations. wxLocale works as a stack, with + // latest-created one being the active one: + // wxLocale loc_fr(wxLANGUAGE_FRENCH); + // // _() returns French + // { + // wxLocale loc_cs(wxLANGUAGE_CZECH); + // // _() returns Czech + // } + // // _() returns French again + wxTranslations *oldTrans = wxTranslations::Get(); + if ( !oldTrans || + (m_pOldLocale && oldTrans == &m_pOldLocale->m_translations) ) + { + wxTranslations::SetNonOwned(&m_translations); + } m_language = wxLANGUAGE_UNKNOWN; m_initialized = false; @@ -235,10 +252,14 @@ bool wxLocale::Init(const wxString& name, bool ret = DoInit(name, shortName, locale); // NB: don't use 'lang' here, 'language' may be wxLANGUAGE_DEFAULT - m_translations.SetLanguage(shortName); + wxTranslations *t = wxTranslations::Get(); + if ( t ) + { + t->SetLanguage(shortName); - if ( bLoadDefault ) - m_translations.AddStdCatalog(); + if ( bLoadDefault ) + t->AddStdCatalog(); + } return ret; } @@ -538,10 +559,14 @@ bool wxLocale::Init(int language, int flags) m_language = lang; // NB: don't use 'lang' here, 'language' - m_translations.SetLanguage(wx_static_cast(wxLanguage, language)); + wxTranslations *t = wxTranslations::Get(); + if ( t ) + { + t->SetLanguage(static_cast(language)); - if ( flags & wxLOCALE_LOAD_DEFAULT ) - m_translations.AddStdCatalog(); + if ( flags & wxLOCALE_LOAD_DEFAULT ) + t->AddStdCatalog(); + } return ret; #endif // !WX_NO_LOCALE_SUPPORT @@ -988,7 +1013,9 @@ wxString wxLocale::GetSysName() const // clean up wxLocale::~wxLocale() { - // restore old translations object + // Restore old translations object. + // See DoCommonInit() for explanation of why this is needed for backward + // compatibility. if ( wxTranslations::Get() == &m_translations ) { if ( m_pOldLocale ) @@ -1037,19 +1064,56 @@ bool wxLocale::IsAvailable(int lang) return true; } + +bool wxLocale::AddCatalog(const wxString& domain) +{ + wxTranslations *t = wxTranslations::Get(); + if ( !t ) + return false; + return t->AddCatalog(domain); +} + +bool wxLocale::AddCatalog(const wxString& domain, wxLanguage msgIdLanguage) +{ + wxTranslations *t = wxTranslations::Get(); + if ( !t ) + return false; + return t->AddCatalog(domain, msgIdLanguage); +} + // add a catalog to our linked list bool wxLocale::AddCatalog(const wxString& szDomain, wxLanguage msgIdLanguage, const wxString& msgIdCharset) { + wxTranslations *t = wxTranslations::Get(); + if ( !t ) + return false; #if wxUSE_UNICODE wxUnusedVar(msgIdCharset); - return m_translations.AddCatalog(szDomain, msgIdLanguage); + return t->AddCatalog(szDomain, msgIdLanguage); #else - return m_translations.AddCatalog(szDomain, msgIdLanguage, msgIdCharset); + return t->AddCatalog(szDomain, msgIdLanguage, msgIdCharset); #endif } +bool wxLocale::IsLoaded(const wxString& domain) const +{ + wxTranslations *t = wxTranslations::Get(); + if ( !t ) + return false; + return t->IsLoaded(domain); +} + +wxString wxLocale::GetHeaderValue(const wxString& header, + const wxString& domain) const +{ + wxTranslations *t = wxTranslations::Get(); + if ( !t ) + return wxEmptyString; + return t->GetHeaderValue(header, domain); +} + // ---------------------------------------------------------------------------- // accessors for locale-dependent data // ----------------------------------------------------------------------------