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