X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e90c1d2a19361551eb07778280f22be3e759cf64..8e3f12618963afb2d52b06f8d4a0134a34e802a2:/src/common/intl.cpp diff --git a/src/common/intl.cpp b/src/common/intl.cpp index 76b2e672f4..81b1ee4942 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 @@ -179,6 +179,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 static inline size_t32 GetHash(const char *sz); @@ -267,7 +270,7 @@ static wxString GetAllMsgCatalogSubdirs(const wxChar *prefix, // search first in prefix/fr/LC_MESSAGES, then in prefix/fr and finally in // prefix (assuming the language is 'fr') searchPath << prefix << wxFILE_SEP_PATH << lang << wxFILE_SEP_PATH - << T("LC_MESSAGES") << wxPATH_SEP + << wxT("LC_MESSAGES") << wxPATH_SEP << prefix << wxFILE_SEP_PATH << lang << wxPATH_SEP << prefix << wxPATH_SEP; @@ -289,28 +292,28 @@ static wxString GetFullSearchPath(const wxChar *lang) // then take the current directory // FIXME it should be the directory of the executable - searchPath << GetAllMsgCatalogSubdirs(T("."), lang) << wxPATH_SEP; + searchPath << GetAllMsgCatalogSubdirs(wxT("."), lang) << wxPATH_SEP; // and finally add some standard ones searchPath - << GetAllMsgCatalogSubdirs(T("/usr/share/locale"), lang) << wxPATH_SEP - << GetAllMsgCatalogSubdirs(T("/usr/lib/locale"), lang) << wxPATH_SEP - << GetAllMsgCatalogSubdirs(T("/usr/local/share/locale"), lang); + << GetAllMsgCatalogSubdirs(wxT("/usr/share/locale"), lang) << wxPATH_SEP + << GetAllMsgCatalogSubdirs(wxT("/usr/lib/locale"), lang) << wxPATH_SEP + << GetAllMsgCatalogSubdirs(wxT("/usr/local/share/locale"), lang); return searchPath; } // 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. FIXME: UNICODE SUPPORT: must use CHARSET specifier! */ wxString szName = szName0; - if(szName.Find('.') != -1) // contains a dot - szName = szName.Left(szName.Find('.')); - + if(szName.Find(wxT('.')) != -1) // contains a dot + szName = szName.Left(szName.Find(wxT('.'))); + // FIXME VZ: I forgot the exact meaning of LC_PATH - anyone to remind me? // KB: search path where to find the mo files, probably : delimited #if 0 @@ -320,7 +323,7 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName0) #endif // 0 wxString searchPath = GetFullSearchPath(szDirPrefix); - const wxChar *sublocale = wxStrchr(szDirPrefix, T('_')); + const wxChar *sublocale = wxStrchr(szDirPrefix, wxT('_')); if ( sublocale ) { // also add just base locale name: for things like "fr_BE" (belgium @@ -340,7 +343,7 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName0) // (we're using an object because we have several return paths) NoTransErr noTransErr; - wxLogVerbose(T("looking for catalog '%s' in path '%s'."), + wxLogVerbose(wxT("looking for catalog '%s' in path '%s'."), szName.c_str(), searchPath.c_str()); wxString strFullName; @@ -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; } @@ -418,7 +423,13 @@ const char *wxMsgCatalog::GetString(const char *szOrig) const size_t32 nIncr = 1 + (nHashVal % (m_nHashSize - 2)); - while ( TRUE ) { +#if defined(__VISAGECPP__) +// VA just can't stand while(1) or while(TRUE) + bool bOs2var = TRUE; + while(bOs2var) { +#else + while (1) { +#endif size_t32 nStr = Swap(m_pHashTable[nIndex]); if ( nStr == 0 ) return NULL; @@ -452,6 +463,53 @@ 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 = StringAtOfs(m_pOrigTable, 0); + if (hdr == NULL) return; // not supported by this catalog, does not have non-fuzzy header + if (hdr[0] != 0) return; // ditto + + /* we support catalogs with header (msgid "") that is _not_ marked as "#, fuzzy" (otherwise + the string would not be included into compiled catalog) */ + wxString header(StringAtOfs(m_pTransTable, 0)); + wxString charset; + int pos = header.Find(wxT("Content-Type: text/plain; charset=")); + if (pos == wxNOT_FOUND) + return; // incorrectly filled Content-Type header + size_t n = pos + 34; /*strlen("Content-Type: text/plain; charset=")*/ + while (header[n] != wxT('\n')) + charset << header[n++]; + + enc = wxTheFontMapper->CharsetToEncoding(charset, FALSE); + if ( enc == wxFONTENCODING_SYSTEM ) + return; // unknown encoding + + 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 (size_t i = 0; i < m_numStrings; i++) + converter.Convert((char*)StringAtOfs(m_pTransTable, i)); +#endif +} + + // ---------------------------------------------------------------------------- // wxLocale // ---------------------------------------------------------------------------- @@ -466,10 +524,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 ) @@ -496,7 +556,7 @@ bool wxLocale::Init(const wxChar *szName, m_pMsgCat = NULL; bool bOk = TRUE; if ( bLoadDefault ) - bOk = AddCatalog(T("wxstd")); + bOk = AddCatalog(wxT("wxstd")); return bOk; } @@ -586,12 +646,8 @@ const wxMB2WXbuf wxLocale::GetString(const wxChar *szOrigString, } else { - // FIXME it was - // return (wxMB2WXbuf)(wxConvCurrent->cMB2WX(pszTrans)); - // before, but we don't want to use wxConvCurrent explicitly to - // avoid linking unnecessary code in ANSI programs without MB - // support - return (wxMB2WXbuf)(pszTrans); + return wxConvertMB2WX(pszTrans); // or preferably wxCSConv(charset).cMB2WX(pszTrans) or something, + // a macro similar to wxConvertMB2WX could be written for that } #undef szOrgString @@ -621,7 +677,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;