X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7a4b1e6623fc295707fd30203a66a7d1fc671098..2d672c46c0c68ae560a537eacd3614b4114d73d4:/src/common/intl.cpp diff --git a/src/common/intl.cpp b/src/common/intl.cpp index 748f0d6aac..c51372ac9e 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -39,28 +39,27 @@ #if wxUSE_INTL -// standard headers +#ifndef WX_PRECOMP + #include "wx/dynarray.h" + #include "wx/string.h" + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/utils.h" + #include "wx/app.h" + #include "wx/hashmap.h" +#endif // WX_PRECOMP #ifndef __WXWINCE__ -#include + #include #endif +// standard headers #include #include #ifdef HAVE_LANGINFO_H - #include + #include #endif -// wxWidgets -#ifndef WX_PRECOMP - #include "wx/string.h" - #include "wx/intl.h" - #include "wx/log.h" - #include "wx/debug.h" - #include "wx/utils.h" - #include "wx/dynarray.h" -#endif // WX_PRECOMP - #ifdef __WIN32__ #include "wx/msw/private.h" #elif defined(__UNIX_LIKE__) @@ -73,14 +72,12 @@ #include "wx/module.h" #include "wx/fontmap.h" #include "wx/encconv.h" -#include "wx/hashmap.h" #include "wx/ptr_scpd.h" -#include "wx/app.h" #include "wx/apptrait.h" #include "wx/stdpaths.h" #if defined(__WXMAC__) - #include "wx/mac/private.h" // includes mac headers + #include "wx/mac/private.h" // includes mac headers #endif // ---------------------------------------------------------------------------- @@ -885,9 +882,14 @@ public: wxPluralFormsCalculatorPtr& rPluralFormsCalculator); // fills the hash with string-translation pairs - void FillHash(wxMessagesHash& hash, const wxString& msgIdCharset, + void FillHash(wxMessagesHash& hash, + const wxString& msgIdCharset, bool convertEncoding) const; + // return the charset of the strings in this catalog or empty string if + // none/unknown + wxString GetCharset() const { return m_charset; } + private: // this implementation is binary compatible with GNU gettext() version 0.10 @@ -921,7 +923,8 @@ private: wxMsgTableEntry *m_pOrigTable, // pointer to original strings *m_pTransTable; // translated - wxString m_charset; + wxString m_charset; // from the message catalog header + // swap the 2 halves of 32 bit integer if needed size_t32 Swap(size_t32 ui) const @@ -961,6 +964,9 @@ private: class wxMsgCatalog { public: + wxMsgCatalog() { m_conv = NULL; } + ~wxMsgCatalog(); + // load the catalog from disk (szDirPrefix corresponds to language) bool Load(const wxChar *szDirPrefix, const wxChar *szName, const wxChar *msgIdCharset = NULL, bool bConvertEncoding = false); @@ -977,6 +983,11 @@ public: private: wxMessagesHash m_messages; // all messages in the catalog wxString m_name; // name of the domain + + // the conversion corresponding to this catalog charset if we installed it + // as the global one + wxCSConv *m_conv; + wxPluralFormsCalculatorPtr m_pluralFormsCalculator; }; @@ -1003,7 +1014,7 @@ wxMsgCatalogFile::wxMsgCatalogFile() wxMsgCatalogFile::~wxMsgCatalogFile() { - wxDELETEA(m_pData); + delete [] m_pData; } // return the directory to search for message catalogs under the given prefix @@ -1253,9 +1264,9 @@ void wxMsgCatalogFile::FillHash(wxMessagesHash& hash, // Unicode build convertEncoding = true; #elif wxUSE_FONTMAP - // determine if we need any conversion at all if ( convertEncoding ) { + // determine if we need any conversion at all wxFontEncoding encCat = wxFontMapperBase::GetEncodingFromName(m_charset); if ( encCat == wxLocale::GetSystemEncoding() ) { @@ -1392,6 +1403,21 @@ void wxMsgCatalogFile::FillHash(wxMessagesHash& hash, // wxMsgCatalog class // ---------------------------------------------------------------------------- +wxMsgCatalog::~wxMsgCatalog() +{ + if ( m_conv ) + { + if ( wxConvUI == m_conv ) + { + // we only change wxConvUI if it points to wxConvLocal so we reset + // it back to it too + wxConvUI = &wxConvLocal; + } + + delete m_conv; + } +} + bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName, const wxChar *msgIdCharset, bool bConvertEncoding) { @@ -1399,13 +1425,28 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName, m_name = szName; - if ( file.Load(szDirPrefix, szName, m_pluralFormsCalculator) ) + if ( !file.Load(szDirPrefix, szName, m_pluralFormsCalculator) ) + return false; + + file.FillHash(m_messages, msgIdCharset, bConvertEncoding); + + // we should use a conversion compatible with the message catalog encoding + // in the GUI if we don't convert the strings to the current conversion but + // as the encoding is global, only change it once, otherwise we could get + // into trouble if we use several message catalogs with different encodings + // + // this is, of course, a hack but it at least allows the program to use + // message catalogs in any encodings without asking the user to change his + // locale + if ( !bConvertEncoding && + !file.GetCharset().empty() && + wxConvUI == &wxConvLocal ) { - file.FillHash(m_messages, msgIdCharset, bConvertEncoding); - return true; + wxConvUI = + m_conv = new wxCSConv(file.GetCharset()); } - return false; + return true; } const wxChar *wxMsgCatalog::GetString(const wxChar *sz, size_t n) const @@ -1898,9 +1939,9 @@ void wxLocale::AddCatalogLookupPathPrefix(const wxString& prefix) // check for this // do we have just the language (or sublang too)? - bool justLang = langFull.Len() == LEN_LANG; + bool justLang = langFull.length() == LEN_LANG; if ( justLang || - (langFull.Len() == LEN_FULL && langFull[LEN_LANG] == wxT('_')) ) + (langFull.length() == LEN_FULL && langFull[LEN_LANG] == wxT('_')) ) { // 0. Make sure the lang is according to latest ISO 639 // (this is necessary because glibc uses iw and in instead