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

@@ -132,7 +132,7 @@ public:
~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
@@ -178,6 +178,9 @@ private:
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
@@ -301,7 +304,7 @@ static wxString GetFullSearchPath(const wxChar *lang)
}
// 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.
@@ -402,6 +405,8 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName0)
m_pszName = new wxChar[wxStrlen(szName) + 1];
wxStrcpy(m_pszName, szName);
if (bConvertEncoding) ConvertEncoding();
// everything is fine
return TRUE;
}
@@ -458,6 +463,36 @@ const char *wxMsgCatalog::GetString(const char *szOrig) const
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
// ----------------------------------------------------------------------------
@@ -472,10 +507,12 @@ wxLocale::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 )
@@ -623,7 +660,7 @@ bool wxLocale::AddCatalog(const wxChar *szDomain)
{
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;