]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/intl.cpp
EVT_TEXT_UPDATED bug fixed, text ctrl callbacks simplified
[wxWidgets.git] / src / common / intl.cpp
index 3d3ca71c45883ce89d2ac134912436e1e4d1783b..aee8a90b393b131b968ac597f4ebdbd06128ba67 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     29/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence:    wxWindows license
+// Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
 // ----------------------------------------------------------------------------
 
 #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
 
 // standard headers
 
 #include <stdlib.h>
 
+// ----------------------------------------------------------------------------
+// simple types
+// ----------------------------------------------------------------------------
+
+// FIXME adjust if necessary
+typedef unsigned char size_t8;
+typedef unsigned long size_t32;
+
 // ----------------------------------------------------------------------------
 // constants
 // ----------------------------------------------------------------------------
@@ -68,8 +76,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.
@@ -97,7 +104,7 @@ public:
 
   // public variable pointing to the next element in a linked list (or NULL)
   wxMsgCatalog *m_pNext;
-  
+
 private:
   // this implementation is binary compatible with GNU gettext() version 0.10
 
@@ -112,21 +119,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
 
@@ -187,21 +194,21 @@ size_t32 wxMsgCatalog::GetHash(const char *sz)
 // swap the 2 halves of 32 bit integer if needed
 size_t32 wxMsgCatalog::Swap(size_t32 ui) const
 {
-  return m_bSwapped ? (ui << 24) | ((ui & 0xff00) << 8) | 
+  return m_bSwapped ? (ui << 24) | ((ui & 0xff00) << 8) |
                       ((ui >> 8) & 0xff00) | (ui >> 24)
                     : ui;
 }
 
-wxMsgCatalog::wxMsgCatalog() 
-{ 
+wxMsgCatalog::wxMsgCatalog()
+{
   m_pData   = NULL;
   m_pszName = NULL;
 }
 
-wxMsgCatalog::~wxMsgCatalog() 
-{ 
-  wxDELETEA(m_pData); 
-  wxDELETEA(m_pszName); 
+wxMsgCatalog::~wxMsgCatalog()
+{
+  wxDELETEA(m_pData);
+  wxDELETEA(m_pszName);
 }
 
 // small class to suppress the translation erros until exit from current scope
@@ -211,7 +218,7 @@ public:
     NoTransErr() { wxSuppressTransErrors(); }
    ~NoTransErr() { wxRestoreTransErrors();  }
 };
-    
+
 // return all directories to search for given prefix
 static wxString GetAllMsgCatalogSubdirs(const char *prefix,
                                         const char *lang)
@@ -220,10 +227,10 @@ static wxString GetAllMsgCatalogSubdirs(const char *prefix,
 
     // search first in prefix/fr/LC_MESSAGES, then in prefix/fr and finally in
     // prefix (assuming the language is 'fr')
-    searchPath << prefix << FILE_SEP_PATH << lang << FILE_SEP_PATH
-                         << "LC_MESSAGES" << PATH_SEP
-               << prefix << FILE_SEP_PATH << lang << PATH_SEP
-               << prefix << PATH_SEP;
+    searchPath << prefix << wxFILE_SEP_PATH << lang << wxFILE_SEP_PATH
+                         << "LC_MESSAGES" << wxPATH_SEP
+               << prefix << wxFILE_SEP_PATH << lang << wxPATH_SEP
+               << prefix << wxPATH_SEP;
 
     return searchPath;
 }
@@ -238,17 +245,17 @@ static wxString GetFullSearchPath(const char *lang)
     for ( size_t n = 0; n < count; n++ )
     {
         searchPath << GetAllMsgCatalogSubdirs(s_searchPrefixes[n], lang)
-                   << PATH_SEP;
+                   << wxPATH_SEP;
     }
 
     // then take the current directory
     // FIXME it should be the directory of the executable
-    searchPath << GetAllMsgCatalogSubdirs(".", lang) << PATH_SEP;
+    searchPath << GetAllMsgCatalogSubdirs(".", lang) << wxPATH_SEP;
 
     // and finally add some standard ones
     searchPath
-        << GetAllMsgCatalogSubdirs("/usr/share/locale", lang) << PATH_SEP
-        << GetAllMsgCatalogSubdirs("/usr/lib/locale", lang) << PATH_SEP
+        << GetAllMsgCatalogSubdirs("/usr/share/locale", lang) << wxPATH_SEP
+        << GetAllMsgCatalogSubdirs("/usr/lib/locale", lang) << wxPATH_SEP
         << GetAllMsgCatalogSubdirs("/usr/local/share/locale", lang);
 
     return searchPath;
@@ -263,7 +270,7 @@ bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName)
   if ( pszLcPath != NULL )
       strPath += pszLcPath + wxString(szDirPrefix) + MSG_PATH;
 #endif // 0
-  
+
   wxString searchPath = GetFullSearchPath(szDirPrefix);
   const char *sublocale = strchr(szDirPrefix, '_');
   if ( sublocale )
@@ -273,9 +280,9 @@ bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName)
       // exist
       searchPath << GetFullSearchPath(wxString(szDirPrefix).
                                       Left((size_t)(sublocale - szDirPrefix)))
-                 << PATH_SEP;
+                 << wxPATH_SEP;
   }
-  
+
   wxString strFile = szName;
   strFile += MSGCATALOG_EXTENSION;
 
@@ -297,7 +304,7 @@ bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName)
   // open file
   wxLogVerbose(_("using catalog '%s' from '%s'."),
              szName, strFullName.c_str());
-  
+
   wxFile fileMsg(strFullName);
   if ( !fileMsg.IsOpened() )
     return FALSE;
@@ -313,10 +320,10 @@ bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName)
     wxDELETEA(m_pData);
     return FALSE;
   }
-    
+
   // examine header
   bool bValid = (size_t)nSize > sizeof(wxMsgCatalogHeader);
-  
+
   wxMsgCatalogHeader *pHeader = (wxMsgCatalogHeader *)m_pData;
   if ( bValid ) {
     // we'll have to swap all the integers if it's true
@@ -325,20 +332,20 @@ bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName)
     // check the magic number
     bValid = m_bSwapped || pHeader->magic == MSGCATALOG_MAGIC;
   }
-  
+
   if ( !bValid ) {
     // it's either too short or has incorrect magic number
     wxLogWarning(_("'%s' is not a valid message catalog."), strFullName.c_str());
-    
+
     wxDELETEA(m_pData);
     return FALSE;
   }
-      
+
   // initialize
   m_numStrings  = Swap(pHeader->numStrings);
-  m_pOrigTable  = (wxMsgTableEntry *)(m_pData + 
+  m_pOrigTable  = (wxMsgTableEntry *)(m_pData +
                    Swap(pHeader->ofsOrigTable));
-  m_pTransTable = (wxMsgTableEntry *)(m_pData + 
+  m_pTransTable = (wxMsgTableEntry *)(m_pData +
                    Swap(pHeader->ofsTransTable));
 
   m_nHashSize   = Swap(pHeader->nHashSize);
@@ -358,16 +365,16 @@ const char *wxMsgCatalog::GetString(const char *szOrig) const
     return NULL;
 
   if ( HasHashTable() ) {   // use hash table for lookup if possible
-    size_t32 nHashVal = GetHash(szOrig); 
+    size_t32 nHashVal = GetHash(szOrig);
     size_t32 nIndex   = nHashVal % m_nHashSize;
 
     size_t32 nIncr = 1 + (nHashVal % (m_nHashSize - 2));
-    
+
     while ( TRUE ) {
       size_t32 nStr = Swap(m_pHashTable[nIndex]);
       if ( nStr == 0 )
         return NULL;
-      
+
       if ( strcmp(szOrig, StringAtOfs(m_pOrigTable, nStr - 1)) == 0 )
         return StringAtOfs(m_pTransTable, nStr - 1);
 
@@ -408,8 +415,8 @@ wxLocale::wxLocale()
 }
 
 // NB: this function has (desired) side effect of changing current locale
-bool wxLocale::Init(const char *szName, 
-                    const char *szShort, 
+bool wxLocale::Init(const char *szName,
+                    const char *szShort,
                     const char *szLocale,
                     bool        bLoadDefault)
 {
@@ -430,10 +437,10 @@ bool wxLocale::Init(const char *szName,
     //       this wild guess is surely wrong
     m_strShort = wxToLower(szLocale[0]) + wxToLower(szLocale[1]);
   }
-  
+
   // save the old locale to be able to restore it later
-       m_pOldLocale = wxSetLocale(this);
-  
+  m_pOldLocale = wxSetLocale(this);
+
   // load the default catalog with wxWindows standard messages
   m_pMsgCat = NULL;
   bool bOk = TRUE;
@@ -469,17 +476,18 @@ wxLocale::~wxLocale()
 }
 
 // get the translation of given string in current locale
-const char *wxLocale::GetString(const char *szOrigString, 
+const char *wxLocale::GetString(const char *szOrigString,
                                 const char *szDomain) const
 {
-  wxASSERT( szOrigString != NULL ); // would be pretty silly
+  if ( IsEmpty(szOrigString) )
+      return szDomain;
 
   const char *pszTrans = NULL;
 
   wxMsgCatalog *pMsgCat;
   if ( szDomain != NULL ) {
     pMsgCat = FindCatalog(szDomain);
-    
+
     // does the catalog exist?
     if ( pMsgCat != NULL )
       pszTrans = pMsgCat->GetString(szOrigString);
@@ -505,7 +513,7 @@ const char *wxLocale::GetString(const char *szOrigString,
 #else // !debug
       wxSuppressTransErrors();
 #endif // debug/!debug
-      
+
       if ( szDomain != NULL )
       {
         wxLogWarning(_("string '%s' not found in domain '%s' for locale '%s'."),
@@ -533,7 +541,7 @@ wxMsgCatalog *wxLocale::FindCatalog(const char *szDomain) const
     if ( Stricmp(pMsgCat->GetName(), szDomain) == 0 )
       return pMsgCat;
   }
-  
+
   return NULL;
 }
 
@@ -547,19 +555,19 @@ bool wxLocale::IsLoaded(const char *szDomain) const
 bool wxLocale::AddCatalog(const char *szDomain)
 {
   wxMsgCatalog *pMsgCat = new wxMsgCatalog;
-  
+
   if ( pMsgCat->Load(m_strShort, szDomain) ) {
     // 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;
     m_pMsgCat = pMsgCat;
-    
+
     return TRUE;
   }
   else {
     // don't add it because it couldn't be loaded anyway
     delete pMsgCat;
-    
+
     return FALSE;
   }
 }
@@ -592,16 +600,16 @@ bool wxIsLoggingTransErrors()
 // ------------------------------
 
 // the current locale object
-wxLocale *g_pLocale = NULL;
+static wxLocale *g_pLocale = NULL;
 
 wxLocale *wxGetLocale()
 {
-       return g_pLocale;
+  return g_pLocale;
 }
 
 wxLocale *wxSetLocale(wxLocale *pLocale)
 {
-       wxLocale *pOld = g_pLocale;
-       g_pLocale = pLocale;
-       return pOld;
+  wxLocale *pOld = g_pLocale;
+  g_pLocale = pLocale;
+  return pOld;
 }