wxLocale now uses wxEncodingConverter (must be explicitly enabled)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5179 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2000-01-02 19:51:30 +00:00
parent 82545b58f4
commit afc94fa6b4
2 changed files with 54 additions and 13 deletions

View File

@@ -62,16 +62,18 @@ public:
// call Init() if you use this ctor // call Init() if you use this ctor
wxLocale(); wxLocale();
// the ctor has a side effect of changing current locale // 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 *szShort = (const wxChar *) NULL, // dir prefix (for msg files)
const wxChar *szLocale = (const wxChar *) NULL, // locale (for setlocale) const wxChar *szLocale = (const wxChar *) NULL, // locale (for setlocale)
bool bLoadDefault = TRUE) // preload wxstd.mo? bool bLoadDefault = TRUE, // preload wxstd.mo?
{ Init(szName, szShort, szLocale, bLoadDefault); } bool bConvertEncoding = FALSE) // convert Win<->Unix if neccessary?
{ Init(szName, szShort, szLocale, bLoadDefault, bConvertEncoding); }
// the same as a function (returns TRUE on success) // the same as a function (returns TRUE on success)
bool Init(const wxChar *szName, bool Init(const wxChar *szName,
const wxChar *szShort = (const wxChar *) NULL, const wxChar *szShort = (const wxChar *) NULL,
const wxChar *szLocale = (const wxChar *) NULL, const wxChar *szLocale = (const wxChar *) NULL,
bool bLoadDefault = TRUE); bool bLoadDefault = TRUE,
bool bConvertEncoding = FALSE);
// restores old locale // restores old locale
~wxLocale(); ~wxLocale();
@@ -117,13 +119,15 @@ private:
// find catalog by name in a linked list, return NULL if !found // find catalog by name in a linked list, return NULL if !found
wxMsgCatalog *FindCatalog(const wxChar *szDomain) const; wxMsgCatalog *FindCatalog(const wxChar *szDomain) const;
wxString m_strLocale, // this locale name wxString m_strLocale, // this locale name
m_strShort; // short name for the locale m_strShort; // short name for the locale
const wxChar *m_pszOldLocale; // previous locale from setlocale() const wxChar *m_pszOldLocale; // previous locale from setlocale()
wxLocale *m_pOldLocale; // previous wxLocale 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;
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -132,7 +132,7 @@ public:
~wxMsgCatalog(); ~wxMsgCatalog();
// load the catalog from disk (szDirPrefix corresponds to language) // 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; } bool IsLoaded() const { return m_pData != NULL; }
// get name of the catalog // get name of the catalog
@@ -178,6 +178,9 @@ private:
const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 index) const const char *StringAtOfs(wxMsgTableEntry *pTable, size_t32 index) const
{ return (const char *)(m_pData + Swap(pTable[index].ofsString)); } { return (const char *)(m_pData + Swap(pTable[index].ofsString)); }
// convert encoding to platform native one, if neccessary
void ConvertEncoding();
// utility functions // utility functions
// calculate the hash value of given string // calculate the hash value of given string
@@ -301,7 +304,7 @@ static wxString GetFullSearchPath(const wxChar *lang)
} }
// open disk file and read in it's contents // 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 /* We need to handle locales like de_AT.iso-8859-1
For this we first chop off the .CHARSET specifier and ignore it. For this we first chop off the .CHARSET specifier and ignore it.
@@ -402,6 +405,8 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName0)
m_pszName = new wxChar[wxStrlen(szName) + 1]; m_pszName = new wxChar[wxStrlen(szName) + 1];
wxStrcpy(m_pszName, szName); wxStrcpy(m_pszName, szName);
if (bConvertEncoding) ConvertEncoding();
// everything is fine // everything is fine
return TRUE; return TRUE;
} }
@@ -458,6 +463,36 @@ const char *wxMsgCatalog::GetString(const char *szOrig) const
return NULL; 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 // wxLocale
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -472,10 +507,12 @@ wxLocale::wxLocale()
bool wxLocale::Init(const wxChar *szName, bool wxLocale::Init(const wxChar *szName,
const wxChar *szShort, const wxChar *szShort,
const wxChar *szLocale, const wxChar *szLocale,
bool bLoadDefault) bool bLoadDefault,
bool bConvertEncoding)
{ {
m_strLocale = szName; m_strLocale = szName;
m_strShort = szShort; m_strShort = szShort;
m_bConvertEncoding = bConvertEncoding;
// change current locale (default: same as long name) // change current locale (default: same as long name)
if ( szLocale == NULL ) if ( szLocale == NULL )
@@ -623,7 +660,7 @@ bool wxLocale::AddCatalog(const wxChar *szDomain)
{ {
wxMsgCatalog *pMsgCat = new wxMsgCatalog; 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 // add it to the head of the list so that in GetString it will
// be searched before the catalogs added earlier // be searched before the catalogs added earlier
pMsgCat->m_pNext = m_pMsgCat; pMsgCat->m_pNext = m_pMsgCat;