X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/afc94fa6b43722d604017798a767fa84ef883b47..10992a81d39da31b79063387b7b71c0ff68737ce:/src/common/intl.cpp?ds=sidebyside diff --git a/src/common/intl.cpp b/src/common/intl.cpp index e21fc7abe3..272d7f3f63 100644 --- a/src/common/intl.cpp +++ b/src/common/intl.cpp @@ -79,7 +79,7 @@ typedef unsigned char size_t8; { // Asserting a sizeof directly causes some compilers to // issue a "using constant in a conditional expression" warning - size_t intsize = sizeof(int); + size_t intsize = sizeof(int); wxASSERT_MSG( intsize == 4, "size_t32 is incorrectly defined!" ); @@ -97,23 +97,39 @@ const size_t32 MSGCATALOG_MAGIC = 0x950412de; const size_t32 MSGCATALOG_MAGIC_SW = 0xde120495; // extension of ".mo" files -#define MSGCATALOG_EXTENSION ".mo" +#define MSGCATALOG_EXTENSION _T(".mo") // ---------------------------------------------------------------------------- // global functions // ---------------------------------------------------------------------------- -// suppress further error messages about missing translations -// (if you don't have one catalog file, you wouldn't like to see the -// error message for each string in it, so normally it's given only -// once) -void wxSuppressTransErrors(); +#ifdef __WXDEBUG__ + +// small class to suppress the translation erros until exit from current scope +class NoTransErr +{ +public: + NoTransErr() { ms_suppressCount++; } + ~NoTransErr() { ms_suppressCount--; } + + static bool Suppress() { return ms_suppressCount > 0; } + +private: + static size_t ms_suppressCount; +}; -// restore the logging -void wxRestoreTransErrors(); +size_t NoTransErr::ms_suppressCount = 0; -// get the current state -bool wxIsLoggingTransErrors(); +#else // !Debug + +class NoTransErr +{ +public: + NoTransErr() { } + ~NoTransErr() { } +}; + +#endif // Debug/!Debug static wxLocale *wxSetLocale(wxLocale *pLocale); @@ -178,7 +194,7 @@ 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(); @@ -253,14 +269,6 @@ wxMsgCatalog::~wxMsgCatalog() wxDELETEA(m_pszName); } -// small class to suppress the translation erros until exit from current scope -class NoTransErr -{ -public: - NoTransErr() { wxSuppressTransErrors(); } - ~NoTransErr() { wxRestoreTransErrors(); } -}; - // return all directories to search for given prefix static wxString GetAllMsgCatalogSubdirs(const wxChar *prefix, const wxChar *lang) @@ -290,14 +298,20 @@ static wxString GetFullSearchPath(const wxChar *lang) << wxPATH_SEP; } + // LC_PATH is a standard env var containing the search path for the .mo + // files + const wxChar *pszLcPath = wxGetenv(wxT("LC_PATH")); + if ( pszLcPath != NULL ) + searchPath << GetAllMsgCatalogSubdirs(pszLcPath, lang); + // then take the current directory // FIXME it should be the directory of the executable - searchPath << GetAllMsgCatalogSubdirs(wxT("."), lang) << wxPATH_SEP; + searchPath << GetAllMsgCatalogSubdirs(wxT("."), lang); // and finally add some standard ones searchPath - << GetAllMsgCatalogSubdirs(wxT("/usr/share/locale"), lang) << wxPATH_SEP - << GetAllMsgCatalogSubdirs(wxT("/usr/lib/locale"), lang) << wxPATH_SEP + << GetAllMsgCatalogSubdirs(wxT("/usr/share/locale"), lang) + << GetAllMsgCatalogSubdirs(wxT("/usr/lib/locale"), lang) << GetAllMsgCatalogSubdirs(wxT("/usr/local/share/locale"), lang); return searchPath; @@ -314,14 +328,6 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName0, bool b 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 - const wxChar *pszLcPath = wxGetenv("LC_PATH"); - if ( pszLcPath != NULL ) - strPath += pszLcPath + wxString(szDirPrefix) + MSG_PATH; -#endif // 0 - wxString searchPath = GetFullSearchPath(szDirPrefix); const wxChar *sublocale = wxStrchr(szDirPrefix, wxT('_')); if ( sublocale ) @@ -343,7 +349,7 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName0, bool b // (we're using an object because we have several return paths) NoTransErr noTransErr; - wxLogVerbose(wxT("looking for catalog '%s' in path '%s'."), + wxLogVerbose(_("looking for catalog '%s' in path '%s'."), szName.c_str(), searchPath.c_str()); wxString strFullName; @@ -405,7 +411,8 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName0, bool b m_pszName = new wxChar[wxStrlen(szName) + 1]; wxStrcpy(m_pszName, szName); - if (bConvertEncoding) ConvertEncoding(); + if (bConvertEncoding) + ConvertEncoding(); // everything is fine return TRUE; @@ -475,19 +482,36 @@ void wxMsgCatalog::ConvertEncoding() 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; + 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 - + 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++) + for (size_t i = 0; i < m_numStrings; i++) converter.Convert((char*)StringAtOfs(m_pTransTable, i)); #endif } @@ -601,29 +625,22 @@ const wxMB2WXbuf wxLocale::GetString(const wxChar *szOrigString, } if ( pszTrans == NULL ) { - if ( wxIsLoggingTransErrors() ) { - // suppress further error messages if we're not debugging: this avoids - // flooding the user with messages about each and every missing string if, - // for example, a whole catalog file is missing. - - // do it before calling LogWarning to prevent infinite recursion! #ifdef __WXDEBUG__ + if ( !NoTransErr::Suppress() ) { NoTransErr noTransErr; -#else // !debug - wxSuppressTransErrors(); -#endif // debug/!debug if ( szDomain != NULL ) { - wxLogWarning(_("string '%s' not found in domain '%s' for locale '%s'."), + wxLogDebug(_T("string '%s' not found in domain '%s' for locale '%s'."), szOrigString, szDomain, m_strLocale.c_str()); } else { - wxLogWarning(_("string '%s' not found in locale '%s'."), - szOrigString, m_strLocale.c_str()); + wxLogDebug(_T("string '%s' not found in locale '%s'."), + szOrigString, m_strLocale.c_str()); } } +#endif // __WXDEBUG__ return (wxMB2WXbuf)(szOrigString); } @@ -680,26 +697,6 @@ bool wxLocale::AddCatalog(const wxChar *szDomain) // global functions and variables // ---------------------------------------------------------------------------- -// translation errors logging -// -------------------------- - -static bool gs_bGiveTransErrors = TRUE; - -void wxSuppressTransErrors() -{ - gs_bGiveTransErrors = FALSE; -} - -void wxRestoreTransErrors() -{ - gs_bGiveTransErrors = TRUE; -} - -bool wxIsLoggingTransErrors() -{ - return gs_bGiveTransErrors; -} - // retrieve/change current locale // ------------------------------