]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/intl.cpp
wxGTK now chooses the best visual X offers,
[wxWidgets.git] / src / common / intl.cpp
index 28ded97bb0051ff0fe1edadd0cef42778ebfc8ef..020bd9be8b7037d07ae2af5b848bd316e2bb520a 100644 (file)
 // ----------------------------------------------------------------------------
 
 #ifdef __GNUG__
-#pragma implementation "intl.h"
+    #pragma implementation "intl.h"
 #endif
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
+#if wxUSE_INTL
+
 // standard headers
 #include  <locale.h>
+#include  <ctype.h>
 
 // wxWindows
 #include "wx/defs.h"
 
 #include <stdlib.h>
 
+// ----------------------------------------------------------------------------
+// simple types
+// ----------------------------------------------------------------------------
+
+// this should *not* be wxChar, this type must have exactly 8 bits!
+typedef unsigned char size_t8;
+
+#ifdef __WXMSW__
+    #if defined(__WIN16__)
+        typedef unsigned long size_t32;
+    #elif defined(__WIN32__)
+        typedef unsigned int size_t32;
+    #else
+        // Win64 will have different type sizes
+        #error "Please define a 32 bit type"
+    #endif
+#else // !Windows
+    // SIZEOF_XXX are defined by configure
+    #if defined(SIZEOF_INT) && (SIZEOF_INT == 4)
+        typedef unsigned int size_t32;
+    #elif defined(SIZEOF_LONG) && (SIZEOF_LONG == 4)
+        typedef unsigned long size_t32;
+    #else
+        // assume sizeof(int) == 4 - what else can we do
+        typedef unsigned int size_t32;
+
+        // ... but at least check it during run time
+        static class IntSizeChecker
+        {
+        public:
+            IntSizeChecker()
+            {
+                wxASSERT_MSG( sizeof(int) == 4,
+                              "size_t32 is incorrectly defined!" );
+            }
+        } intsizechecker;
+    #endif
+#endif // Win/!Win
+
 // ----------------------------------------------------------------------------
 // constants
 // ----------------------------------------------------------------------------
@@ -68,8 +110,7 @@ void wxRestoreTransErrors();
 // get the current state
 bool wxIsLoggingTransErrors();
 
-// get the current locale object (## may be NULL!)
-extern wxLocale *wxSetLocale(wxLocale *pLocale);
+static wxLocale *wxSetLocale(wxLocale *pLocale);
 
 // ----------------------------------------------------------------------------
 // wxMsgCatalog corresponds to one disk-file message catalog.
@@ -86,11 +127,11 @@ public:
  ~wxMsgCatalog();
 
   // load the catalog from disk (szDirPrefix corresponds to language)
-  bool Load(const char *szDirPrefix, const char *szName);
+  bool Load(const wxChar *szDirPrefix, const wxChar *szName);
   bool IsLoaded() const { return m_pData != NULL; }
 
   // get name of the catalog
-  const char *GetName() const { return m_pszName; }
+  const wxChar *GetName() const { return m_pszName; }
 
   // get the translated string: returns NULL if not found
   const char *GetString(const char *sz) const;
@@ -112,21 +153,21 @@ private:
   struct wxMsgCatalogHeader
   {
     size_t32  magic,          // offset +00:  magic id
-            revision,       //        +04:  revision
-            numStrings;     //        +08:  number of strings in the file
+              revision,       //        +04:  revision
+              numStrings;     //        +08:  number of strings in the file
     size_t32  ofsOrigTable,   //        +0C:  start of original string table
-            ofsTransTable;  //        +10:  start of translated string table
+              ofsTransTable;  //        +10:  start of translated string table
     size_t32  nHashSize,      //        +14:  hash table size
-            ofsHashTable;   //        +18:  offset of hash table start
+              ofsHashTable;   //        +18:  offset of hash table start
   };
 
   // all data is stored here, NULL if no data loaded
   size_t8 *m_pData;
 
   // data description
-  size_t32            m_numStrings,   // number of strings in this domain
+  size_t32          m_numStrings,   // number of strings in this domain
                     m_nHashSize;    // number of entries in hash table
-  size_t32           *m_pHashTable;   // pointer to hash table
+  size_t32         *m_pHashTable;   // pointer to hash table
   wxMsgTableEntry  *m_pOrigTable,   // pointer to original   strings
                    *m_pTransTable;  //            translated
 
@@ -145,7 +186,7 @@ private:
 
   bool          m_bSwapped;   // wrong endianness?
 
-  char         *m_pszName;    // name of the domain
+  wxChar       *m_pszName;    // name of the domain
 };
 
 // ----------------------------------------------------------------------------
@@ -213,15 +254,15 @@ public:
 };
 
 // return all directories to search for given prefix
-static wxString GetAllMsgCatalogSubdirs(const char *prefix,
-                                        const char *lang)
+static wxString GetAllMsgCatalogSubdirs(const wxChar *prefix,
+                                        const wxChar *lang)
 {
     wxString searchPath;
 
     // search first in prefix/fr/LC_MESSAGES, then in prefix/fr and finally in
     // prefix (assuming the language is 'fr')
     searchPath << prefix << wxFILE_SEP_PATH << lang << wxFILE_SEP_PATH
-                         << "LC_MESSAGES" << wxPATH_SEP
+                         << _T("LC_MESSAGES") << wxPATH_SEP
                << prefix << wxFILE_SEP_PATH << lang << wxPATH_SEP
                << prefix << wxPATH_SEP;
 
@@ -229,7 +270,7 @@ static wxString GetAllMsgCatalogSubdirs(const char *prefix,
 }
 
 // construct the search path for the given language
-static wxString GetFullSearchPath(const char *lang)
+static wxString GetFullSearchPath(const wxChar *lang)
 {
     wxString searchPath;
 
@@ -243,29 +284,29 @@ static wxString GetFullSearchPath(const char *lang)
 
     // then take the current directory
     // FIXME it should be the directory of the executable
-    searchPath << GetAllMsgCatalogSubdirs(".", lang) << wxPATH_SEP;
+    searchPath << GetAllMsgCatalogSubdirs(_T("."), lang) << wxPATH_SEP;
 
     // and finally add some standard ones
     searchPath
-        << GetAllMsgCatalogSubdirs("/usr/share/locale", lang) << wxPATH_SEP
-        << GetAllMsgCatalogSubdirs("/usr/lib/locale", lang) << wxPATH_SEP
-        << GetAllMsgCatalogSubdirs("/usr/local/share/locale", lang);
+        << GetAllMsgCatalogSubdirs(_T("/usr/share/locale"), lang) << wxPATH_SEP
+        << GetAllMsgCatalogSubdirs(_T("/usr/lib/locale"), lang) << wxPATH_SEP
+        << GetAllMsgCatalogSubdirs(_T("/usr/local/share/locale"), lang);
 
     return searchPath;
 }
 
 // open disk file and read in it's contents
-bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName)
+bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName)
 {
   // FIXME VZ: I forgot the exact meaning of LC_PATH - anyone to remind me?
 #if 0
-  const char *pszLcPath = getenv("LC_PATH");
+  const wxChar *pszLcPath = wxGetenv("LC_PATH");
   if ( pszLcPath != NULL )
       strPath += pszLcPath + wxString(szDirPrefix) + MSG_PATH;
 #endif // 0
 
   wxString searchPath = GetFullSearchPath(szDirPrefix);
-  const char *sublocale = strchr(szDirPrefix, '_');
+  const wxChar *sublocale = wxStrchr(szDirPrefix, _T('_'));
   if ( sublocale )
   {
       // also add just base locale name: for things like "fr_BE" (belgium
@@ -344,8 +385,8 @@ bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName)
   m_nHashSize   = Swap(pHeader->nHashSize);
   m_pHashTable  = (size_t32 *)(m_pData + Swap(pHeader->ofsHashTable));
 
-  m_pszName = new char[strlen(szName) + 1];
-  strcpy(m_pszName, szName);
+  m_pszName = new wxChar[wxStrlen(szName) + 1];
+  wxStrcpy(m_pszName, szName);
 
   // everything is fine
   return TRUE;
@@ -408,9 +449,9 @@ wxLocale::wxLocale()
 }
 
 // NB: this function has (desired) side effect of changing current locale
-bool wxLocale::Init(const char *szName,
-                    const char *szShort,
-                    const char *szLocale,
+bool wxLocale::Init(const wxChar *szName,
+                    const wxChar *szShort,
+                    const wxChar *szLocale,
                     bool        bLoadDefault)
 {
   m_strLocale = szName;
@@ -419,7 +460,7 @@ bool wxLocale::Init(const char *szName,
   // change current locale (default: same as long name)
   if ( szLocale == NULL )
     szLocale = szName;
-  m_pszOldLocale = setlocale(LC_ALL, szLocale);
+  m_pszOldLocale = wxSetlocale(LC_ALL, szLocale);
   if ( m_pszOldLocale == NULL )
     wxLogError(_("locale '%s' can not be set."), szLocale);
 
@@ -428,7 +469,7 @@ bool wxLocale::Init(const char *szName,
   if ( m_strShort.IsEmpty() ) {
     // FIXME I don't know how these 2 letter abbreviations are formed,
     //       this wild guess is surely wrong
-    m_strShort = wxToLower(szLocale[0]) + wxToLower(szLocale[1]);
+    m_strShort = tolower(szLocale[0]) + tolower(szLocale[1]);
   }
 
   // save the old locale to be able to restore it later
@@ -438,7 +479,7 @@ bool wxLocale::Init(const char *szName,
   m_pMsgCat = NULL;
   bool bOk = TRUE;
   if ( bLoadDefault )
-    bOk = AddCatalog("wxstd");
+    bOk = AddCatalog(_T("wxstd"));
 
   return bOk;
 }
@@ -465,16 +506,18 @@ wxLocale::~wxLocale()
 
     // restore old locale
     wxSetLocale(m_pOldLocale);
-    setlocale(LC_ALL, m_pszOldLocale);
+    wxSetlocale(LC_ALL, m_pszOldLocale);
 }
 
 // get the translation of given string in current locale
-const char *wxLocale::GetString(const char *szOrigString,
-                                const char *szDomain) const
+const wxMB2WXbuf wxLocale::GetString(const wxChar *szOrigString,
+                                    const wxChar *szDomain) const
 {
-  wxASSERT( szOrigString != NULL ); // would be pretty silly
+  if ( wxIsEmpty(szOrigString) )
+      return szDomain;
 
   const char *pszTrans = NULL;
+  const wxWX2MBbuf szOrgString = wxConvCurrent->cWX2MB(szOrigString);
 
   wxMsgCatalog *pMsgCat;
   if ( szDomain != NULL ) {
@@ -482,12 +525,12 @@ const char *wxLocale::GetString(const char *szOrigString,
 
     // does the catalog exist?
     if ( pMsgCat != NULL )
-      pszTrans = pMsgCat->GetString(szOrigString);
+      pszTrans = pMsgCat->GetString(szOrgString);
   }
   else {
     // search in all domains
     for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext ) {
-      pszTrans = pMsgCat->GetString(szOrigString);
+      pszTrans = pMsgCat->GetString(szOrgString);
       if ( pszTrans != NULL )   // take the first found
         break;
     }
@@ -518,19 +561,19 @@ const char *wxLocale::GetString(const char *szOrigString,
       }
     }
 
-    return szOrigString;
+    return (wxMB2WXbuf)(szOrigString);
   }
   else
-    return pszTrans;
+    return (wxMB2WXbuf)(wxConvCurrent->cMB2WX(pszTrans));
 }
 
 // find catalog by name in a linked list, return NULL if !found
-wxMsgCatalog *wxLocale::FindCatalog(const char *szDomain) const
+wxMsgCatalog *wxLocale::FindCatalog(const wxChar *szDomain) const
 {
 // linear search in the linked list
   wxMsgCatalog *pMsgCat;
   for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext ) {
-    if ( Stricmp(pMsgCat->GetName(), szDomain) == 0 )
+    if ( wxStricmp(pMsgCat->GetName(), szDomain) == 0 )
       return pMsgCat;
   }
 
@@ -538,13 +581,13 @@ wxMsgCatalog *wxLocale::FindCatalog(const char *szDomain) const
 }
 
 // check if the given catalog is loaded
-bool wxLocale::IsLoaded(const char *szDomain) const
+bool wxLocale::IsLoaded(const wxChar *szDomain) const
 {
   return FindCatalog(szDomain) != NULL;
 }
 
 // add a catalog to our linked list
-bool wxLocale::AddCatalog(const char *szDomain)
+bool wxLocale::AddCatalog(const wxChar *szDomain)
 {
   wxMsgCatalog *pMsgCat = new wxMsgCatalog;
 
@@ -592,7 +635,7 @@ bool wxIsLoggingTransErrors()
 // ------------------------------
 
 // the current locale object
-wxLocale *g_pLocale = NULL;
+static wxLocale *g_pLocale = NULL;
 
 wxLocale *wxGetLocale()
 {
@@ -605,3 +648,6 @@ wxLocale *wxSetLocale(wxLocale *pLocale)
   g_pLocale = pLocale;
   return pOld;
 }
+
+#endif // wxUSE_INTL
+