{
// 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!" );
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);
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();
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)
<< 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;
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 )
// (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;
m_pszName = new wxChar[wxStrlen(szName) + 1];
wxStrcpy(m_pszName, szName);
- if (bConvertEncoding) ConvertEncoding();
+ if (bConvertEncoding)
+ ConvertEncoding();
// everything is fine
return TRUE;
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
}
}
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);
}
// 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
// ------------------------------