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:
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user