]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/intl.cpp
Committing in .
[wxWidgets.git] / src / common / intl.cpp
index 8954ce3384d15b203e40b4bd077025a9e7728902..117271939001bed827cfd47d7f726517ef88e64f 100644 (file)
@@ -28,6 +28,8 @@
     #pragma hdrstop
 #endif
 
     #pragma hdrstop
 #endif
 
+#if wxUSE_INTL
+
 // standard headers
 #include  <locale.h>
 #include  <ctype.h>
 // standard headers
 #include  <locale.h>
 #include  <ctype.h>
@@ -38,6 +40,7 @@
 #include "wx/intl.h"
 #include "wx/file.h"
 #include "wx/log.h"
 #include "wx/intl.h"
 #include "wx/file.h"
 #include "wx/log.h"
+#include "wx/debug.h"
 #include "wx/utils.h"
 
 #include <stdlib.h>
 #include "wx/utils.h"
 
 #include <stdlib.h>
 // simple types
 // ----------------------------------------------------------------------------
 
 // simple types
 // ----------------------------------------------------------------------------
 
-// FIXME adjust if necessary
+// this should *not* be wxChar, this type must have exactly 8 bits!
 typedef unsigned char size_t8;
 typedef unsigned char size_t8;
-typedef unsigned long size_t32;
+
+#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()
+            {
+                // Asserting a sizeof directly causes some compilers to
+                // issue a "using constant in a conditional expression" warning
+                size_t                   intsize = sizeof(int);
+
+                wxASSERT_MSG( intsize == 4,
+                              "size_t32 is incorrectly defined!" );
+            }
+        } intsizechecker;
+    #endif
+#endif // Win/!Win
 
 // ----------------------------------------------------------------------------
 // constants
 
 // ----------------------------------------------------------------------------
 // constants
@@ -94,11 +132,11 @@ public:
  ~wxMsgCatalog();
 
   // load the catalog from disk (szDirPrefix corresponds to language)
  ~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
   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;
 
   // get the translated string: returns NULL if not found
   const char *GetString(const char *sz) const;
@@ -153,7 +191,7 @@ private:
 
   bool          m_bSwapped;   // wrong endianness?
 
 
   bool          m_bSwapped;   // wrong endianness?
 
-  char         *m_pszName;    // name of the domain
+  wxChar       *m_pszName;    // name of the domain
 };
 
 // ----------------------------------------------------------------------------
 };
 
 // ----------------------------------------------------------------------------
@@ -221,15 +259,15 @@ public:
 };
 
 // return all directories to search for given prefix
 };
 
 // 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
 {
     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
+                         << wxT("LC_MESSAGES") << wxPATH_SEP
                << prefix << wxFILE_SEP_PATH << lang << wxPATH_SEP
                << prefix << wxPATH_SEP;
 
                << prefix << wxFILE_SEP_PATH << lang << wxPATH_SEP
                << prefix << wxPATH_SEP;
 
@@ -237,7 +275,7 @@ static wxString GetAllMsgCatalogSubdirs(const char *prefix,
 }
 
 // construct the search path for the given language
 }
 
 // construct the search path for the given language
-static wxString GetFullSearchPath(const char *lang)
+static wxString GetFullSearchPath(const wxChar *lang)
 {
     wxString searchPath;
 
 {
     wxString searchPath;
 
@@ -251,29 +289,38 @@ static wxString GetFullSearchPath(const char *lang)
 
     // then take the current directory
     // FIXME it should be the directory of the executable
 
     // then take the current directory
     // FIXME it should be the directory of the executable
-    searchPath << GetAllMsgCatalogSubdirs(".", lang) << wxPATH_SEP;
+    searchPath << GetAllMsgCatalogSubdirs(wxT("."), lang) << wxPATH_SEP;
 
     // and finally add some standard ones
     searchPath
 
     // 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(wxT("/usr/share/locale"), lang) << wxPATH_SEP
+        << GetAllMsgCatalogSubdirs(wxT("/usr/lib/locale"), lang) << wxPATH_SEP
+        << GetAllMsgCatalogSubdirs(wxT("/usr/local/share/locale"), lang);
 
     return searchPath;
 }
 
 // open disk file and read in it's contents
 
     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 *szName0)
 {
 {
+   /* We need to handle locales like  de_AT.iso-8859-1
+      For this we first chop off the .CHARSET specifier and ignore it.
+      FIXME: UNICODE SUPPORT: must use CHARSET specifier!
+   */
+   wxString szName = szName0;
+   if(szName.Find('.') != -1) // contains a dot
+      szName = szName.Left(szName.Find('.'));
+   
   // FIXME VZ: I forgot the exact meaning of LC_PATH - anyone to remind me?
   // FIXME VZ: I forgot the exact meaning of LC_PATH - anyone to remind me?
+  // KB: search path where to find the mo files, probably : delimited
 #if 0
 #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);
   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, wxT('_'));
   if ( sublocale )
   {
       // also add just base locale name: for things like "fr_BE" (belgium
   if ( sublocale )
   {
       // also add just base locale name: for things like "fr_BE" (belgium
@@ -291,20 +338,20 @@ bool wxMsgCatalog::Load(const char *szDirPrefix, const char *szName)
   // not yet be loaded (and it's normal)
   //
   // (we're using an object because we have several return paths)
   // not yet be loaded (and it's normal)
   //
   // (we're using an object because we have several return paths)
-  NoTransErr noTransErr;
 
 
-  wxLogVerbose(_("looking for catalog '%s' in path '%s'."),
-               szName, searchPath.c_str());
+  NoTransErr noTransErr;
+  wxLogVerbose(wxT("looking for catalog '%s' in path '%s'."),
+               szName.c_str(), searchPath.c_str());
 
   wxString strFullName;
   if ( !wxFindFileInPath(&strFullName, searchPath, strFile) ) {
 
   wxString strFullName;
   if ( !wxFindFileInPath(&strFullName, searchPath, strFile) ) {
-    wxLogWarning(_("catalog file for domain '%s' not found."), szName);
+    wxLogWarning(_("catalog file for domain '%s' not found."), szName.c_str());
     return FALSE;
   }
 
   // open file
   wxLogVerbose(_("using catalog '%s' from '%s'."),
     return FALSE;
   }
 
   // open file
   wxLogVerbose(_("using catalog '%s' from '%s'."),
-             szName, strFullName.c_str());
+             szName.c_str(), strFullName.c_str());
 
   wxFile fileMsg(strFullName);
   if ( !fileMsg.IsOpened() )
 
   wxFile fileMsg(strFullName);
   if ( !fileMsg.IsOpened() )
@@ -352,8 +399,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_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;
 
   // everything is fine
   return TRUE;
@@ -376,7 +423,7 @@ const char *wxMsgCatalog::GetString(const char *szOrig) const
       if ( nStr == 0 )
         return NULL;
 
       if ( nStr == 0 )
         return NULL;
 
-      if ( strcmp(szOrig, StringAtOfs(m_pOrigTable, nStr - 1)) == 0 )
+      if ( wxStrcmp(szOrig, StringAtOfs(m_pOrigTable, nStr - 1)) == 0 )
         return StringAtOfs(m_pTransTable, nStr - 1);
 
       if ( nIndex >= m_nHashSize - nIncr)
         return StringAtOfs(m_pTransTable, nStr - 1);
 
       if ( nIndex >= m_nHashSize - nIncr)
@@ -391,7 +438,7 @@ const char *wxMsgCatalog::GetString(const char *szOrig) const
            current;
     while ( bottom < top ) {
       current = (bottom + top) / 2;
            current;
     while ( bottom < top ) {
       current = (bottom + top) / 2;
-      int res = strcmp(szOrig, StringAtOfs(m_pOrigTable, current));
+      int res = wxStrcmp(szOrig, StringAtOfs(m_pOrigTable, current));
       if ( res < 0 )
         top = current;
       else if ( res > 0 )
       if ( res < 0 )
         top = current;
       else if ( res > 0 )
@@ -416,9 +463,9 @@ wxLocale::wxLocale()
 }
 
 // NB: this function has (desired) side effect of changing current locale
 }
 
 // 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;
                     bool        bLoadDefault)
 {
   m_strLocale = szName;
@@ -426,8 +473,11 @@ bool wxLocale::Init(const char *szName,
 
   // change current locale (default: same as long name)
   if ( szLocale == NULL )
 
   // change current locale (default: same as long name)
   if ( szLocale == NULL )
-    szLocale = szName;
-  m_pszOldLocale = setlocale(LC_ALL, szLocale);
+  {
+    // the argument to setlocale()
+    szLocale = szShort;
+  }
+  m_pszOldLocale = wxSetlocale(LC_ALL, szLocale);
   if ( m_pszOldLocale == NULL )
     wxLogError(_("locale '%s' can not be set."), szLocale);
 
   if ( m_pszOldLocale == NULL )
     wxLogError(_("locale '%s' can not be set."), szLocale);
 
@@ -446,7 +496,7 @@ bool wxLocale::Init(const char *szName,
   m_pMsgCat = NULL;
   bool bOk = TRUE;
   if ( bLoadDefault )
   m_pMsgCat = NULL;
   bool bOk = TRUE;
   if ( bLoadDefault )
-    bOk = AddCatalog("wxstd");
+    bOk = AddCatalog(wxT("wxstd"));
 
   return bOk;
 }
 
   return bOk;
 }
@@ -473,17 +523,22 @@ wxLocale::~wxLocale()
 
     // restore old locale
     wxSetLocale(m_pOldLocale);
 
     // 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
 }
 
 // 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
 {
 {
-  if ( IsEmpty(szOrigString) )
+  if ( wxIsEmpty(szOrigString) )
       return szDomain;
 
   const char *pszTrans = NULL;
       return szDomain;
 
   const char *pszTrans = NULL;
+#if wxUSE_UNICODE
+  const wxWX2MBbuf szOrgString = wxConvCurrent->cWX2MB(szOrigString);
+#else // ANSI
+  #define szOrgString szOrigString
+#endif // Unicode/ANSI
 
   wxMsgCatalog *pMsgCat;
   if ( szDomain != NULL ) {
 
   wxMsgCatalog *pMsgCat;
   if ( szDomain != NULL ) {
@@ -491,12 +546,12 @@ const char *wxLocale::GetString(const char *szOrigString,
 
     // does the catalog exist?
     if ( pMsgCat != NULL )
 
     // 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 ) {
   }
   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;
     }
       if ( pszTrans != NULL )   // take the first found
         break;
     }
@@ -527,19 +582,24 @@ const char *wxLocale::GetString(const char *szOrigString,
       }
     }
 
       }
     }
 
-    return szOrigString;
+    return (wxMB2WXbuf)(szOrigString);
   }
   else
   }
   else
-    return pszTrans;
+  {
+    return wxConvertMB2WX(pszTrans); // or preferably wxCSConv(charset).cMB2WX(pszTrans) or something,
+                                     // a macro similar to wxConvertMB2WX could be written for that
+  }
+
+  #undef szOrgString
 }
 
 // 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 *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 ) {
 {
 // 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;
   }
 
       return pMsgCat;
   }
 
@@ -547,13 +607,13 @@ wxMsgCatalog *wxLocale::FindCatalog(const char *szDomain) const
 }
 
 // check if the given catalog is loaded
 }
 
 // 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
 {
   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;
 
 {
   wxMsgCatalog *pMsgCat = new wxMsgCatalog;
 
@@ -614,3 +674,6 @@ wxLocale *wxSetLocale(wxLocale *pLocale)
   g_pLocale = pLocale;
   return pOld;
 }
   g_pLocale = pLocale;
   return pOld;
 }
+
+#endif // wxUSE_INTL
+