]> git.saurik.com Git - wxWidgets.git/commitdiff
wxLocale now uses wxEncodingConverter (must be explicitly enabled)
authorVáclav Slavík <vslavik@fastmail.fm>
Sun, 2 Jan 2000 19:51:30 +0000 (19:51 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Sun, 2 Jan 2000 19:51:30 +0000 (19:51 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5179 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/intl.h
src/common/intl.cpp

index ff519fcfef3e6994ade97a267afc460c26922531..fd8960ae457011ccc7147afc593b414041ae08f1 100644 (file)
@@ -62,16 +62,18 @@ public:
         // 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();
 
@@ -117,13 +119,15 @@ private:
     // 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;
 };
 
 // ----------------------------------------------------------------------------
index 84022468f4779b6e3d307f2dfb18f45977cd218a..e21fc7abe3d7fabb587bed2124ce0dc81eb46d6b 100644 (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;