From afc94fa6b43722d604017798a767fa84ef883b47 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Sun, 2 Jan 2000 19:51:30 +0000 Subject: [PATCH] wxLocale now uses wxEncodingConverter (must be explicitly enabled) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5179 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/intl.h | 22 +++++++++++++--------- src/common/intl.cpp | 45 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/include/wx/intl.h b/include/wx/intl.h index ff519fcfef..fd8960ae45 100644 --- a/include/wx/intl.h +++ b/include/wx/intl.h @@ -62,16 +62,18 @@ public: // call Init() if you use this ctor wxLocale(); // the ctor has a side effect of changing current locale - wxLocale(const wxChar *szName, // name (for messages) + wxLocale(const wxChar *szName, // name (for messages) const wxChar *szShort = (const wxChar *) NULL, // dir prefix (for msg files) const wxChar *szLocale = (const wxChar *) NULL, // locale (for setlocale) - bool bLoadDefault = TRUE) // preload wxstd.mo? - { Init(szName, szShort, szLocale, bLoadDefault); } + bool bLoadDefault = TRUE, // preload wxstd.mo? + bool bConvertEncoding = FALSE) // convert Win<->Unix if neccessary? + { Init(szName, szShort, szLocale, bLoadDefault, bConvertEncoding); } // the same as a function (returns TRUE on success) bool Init(const wxChar *szName, const wxChar *szShort = (const wxChar *) NULL, const wxChar *szLocale = (const wxChar *) NULL, - bool bLoadDefault = TRUE); + bool bLoadDefault = TRUE, + bool bConvertEncoding = FALSE); // restores old locale ~wxLocale(); @@ -117,13 +119,15 @@ private: // find catalog by name in a linked list, return NULL if !found wxMsgCatalog *FindCatalog(const wxChar *szDomain) const; - wxString m_strLocale, // this locale name - m_strShort; // short name for the locale + wxString m_strLocale, // this locale name + m_strShort; // short name for the locale - const wxChar *m_pszOldLocale; // previous locale from setlocale() - wxLocale *m_pOldLocale; // previous wxLocale + const wxChar *m_pszOldLocale; // previous locale from setlocale() + wxLocale *m_pOldLocale; // previous wxLocale - wxMsgCatalog *m_pMsgCat; // pointer to linked list of catalogs + wxMsgCatalog *m_pMsgCat; // pointer to linked list of catalogs + + bool m_bConvertEncoding; }; // ---------------------------------------------------------------------------- diff --git a/src/common/intl.cpp b/src/common/intl.cpp index 84022468f4..e21fc7abe3 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -132,7 +132,7 @@ public: ~wxMsgCatalog(); // load the catalog from disk (szDirPrefix corresponds to language) - bool Load(const wxChar *szDirPrefix, const wxChar *szName); + bool Load(const wxChar *szDirPrefix, const wxChar *szName, bool bConvertEncoding = FALSE); bool IsLoaded() const { return m_pData != NULL; } // get name of the catalog @@ -178,6 +178,9 @@ private: const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 index) const { return (const char *)(m_pData + Swap(pTable[index].ofsString)); } + + // convert encoding to platform native one, if neccessary + void ConvertEncoding(); // utility functions // calculate the hash value of given string @@ -301,7 +304,7 @@ static wxString GetFullSearchPath(const wxChar *lang) } // open disk file and read in it's contents -bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName0) +bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName0, bool bConvertEncoding) { /* We need to handle locales like de_AT.iso-8859-1 For this we first chop off the .CHARSET specifier and ignore it. @@ -402,6 +405,8 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName0) m_pszName = new wxChar[wxStrlen(szName) + 1]; wxStrcpy(m_pszName, szName); + if (bConvertEncoding) ConvertEncoding(); + // everything is fine return TRUE; } @@ -458,6 +463,36 @@ const char *wxMsgCatalog::GetString(const char *szOrig) const return NULL; } + +#if wxUSE_GUI +#include "wx/fontmap.h" +#include "wx/encconv.h" +#endif + +void wxMsgCatalog::ConvertEncoding() +{ +#if wxUSE_GUI + wxFontEncoding enc; + + // first, find encoding header: + const char *hdr = GetString("$ENCODING"); + if (hdr == NULL) return; // not supported by this catalog + if ((enc = wxTheFontMapper -> CharsetToEncoding(hdr, FALSE)) == wxFONTENCODING_SYSTEM) return; + + wxFontEncodingArray a = wxEncodingConverter::GetPlatformEquivalents(enc); + if (a[0] == enc) return; // no conversion needed, locale uses native encoding + + if (a.GetCount() == 0) return; // we don't know common equiv. under this platform + + wxEncodingConverter converter; + + converter.Init(enc, a[0]); + for (unsigned i = 0; i < m_numStrings; i++) + converter.Convert((char*)StringAtOfs(m_pTransTable, i)); +#endif +} + + // ---------------------------------------------------------------------------- // wxLocale // ---------------------------------------------------------------------------- @@ -472,10 +507,12 @@ wxLocale::wxLocale() bool wxLocale::Init(const wxChar *szName, const wxChar *szShort, const wxChar *szLocale, - bool bLoadDefault) + bool bLoadDefault, + bool bConvertEncoding) { m_strLocale = szName; m_strShort = szShort; + m_bConvertEncoding = bConvertEncoding; // change current locale (default: same as long name) if ( szLocale == NULL ) @@ -623,7 +660,7 @@ bool wxLocale::AddCatalog(const wxChar *szDomain) { wxMsgCatalog *pMsgCat = new wxMsgCatalog; - if ( pMsgCat->Load(m_strShort, szDomain) ) { + if ( pMsgCat->Load(m_strShort, szDomain, m_bConvertEncoding) ) { // add it to the head of the list so that in GetString it will // be searched before the catalogs added earlier pMsgCat->m_pNext = m_pMsgCat; -- 2.45.2