~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
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);
}
// 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
m_pszName = new wxChar[wxStrlen(szName) + 1];
wxStrcpy(m_pszName, szName);
+ if (bConvertEncoding) ConvertEncoding();
+
// everything is fine
return TRUE;
}
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;
- if ( wxStrcmp(szOrig, StringAtOfs(m_pOrigTable, nStr - 1)) == 0 )
+ if ( strcmp(szOrig, StringAtOfs(m_pOrigTable, nStr - 1)) == 0 )
return StringAtOfs(m_pTransTable, nStr - 1);
if ( nIndex >= m_nHashSize - nIncr)
current;
while ( bottom < top ) {
current = (bottom + top) / 2;
- int res = wxStrcmp(szOrig, StringAtOfs(m_pOrigTable, current));
+ int res = strcmp(szOrig, StringAtOfs(m_pOrigTable, current));
if ( res < 0 )
top = current;
else if ( res > 0 )
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
// ----------------------------------------------------------------------------
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 )
{
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;