]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/intl.cpp
Compilo.
[wxWidgets.git] / src / common / intl.cpp
index bac6f220533070bf5c94ec0d6b5fafa893ba934e..f8129005d8f1a8e2366da9ca88f6b4502dc373c3 100644 (file)
@@ -962,14 +962,14 @@ public:
     ~wxMsgCatalog();
 
     // load the catalog from disk (szDirPrefix corresponds to language)
-    bool Load(const wxChar *szDirPrefix, const wxChar *szName,
-              const wxChar *msgIdCharset = NULL, bool bConvertEncoding = false);
+    bool Load(const wxString& dirPrefix, const wxString& name,
+              const wxString& msgIdCharset, bool bConvertEncoding = false);
 
     // get name of the catalog
     wxString GetName() const { return m_name; }
 
     // get the translated string: returns NULL if not found
-    const wxChar *GetString(const wxChar *sz, size_t n = size_t(-1)) const;
+    const wxString *GetString(const wxString& sz, size_t n = size_t(-1)) const;
 
     // public variable pointing to the next element in a linked list (or NULL)
     wxMsgCatalog *m_pNext;
@@ -1304,7 +1304,7 @@ void wxMsgCatalogFile::FillHash(wxMessagesHash& hash,
                             : new wxCSConv(msgIdCharset);
 
 #elif wxUSE_FONTMAP
-    wxASSERT_MSG( msgIdCharset == NULL,
+    wxASSERT_MSG( msgIdCharset.empty(),
                   _T("non-ASCII msgid languages only supported if wxUSE_WCHAR_T=1") );
 
     wxEncodingConverter converter;
@@ -1374,7 +1374,7 @@ void wxMsgCatalogFile::FillHash(wxMessagesHash& hash,
                 msgstr = str;
 #else // !wxUSE_WCHAR_T
         #if wxUSE_FONTMAP
-            if ( convertEncoding )
+            if ( bConvertEncoding )
                 msgstr = wxString(converter.Convert(str));
             else
         #endif
@@ -1418,14 +1418,14 @@ wxMsgCatalog::~wxMsgCatalog()
     }
 }
 
-bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName,
-                        const wxChar *msgIdCharset, bool bConvertEncoding)
+bool wxMsgCatalog::Load(const wxString& dirPrefix, const wxString& name,
+                        const wxString& msgIdCharset, bool bConvertEncoding)
 {
     wxMsgCatalogFile file;
 
-    m_name = szName;
+    m_name = name;
 
-    if ( !file.Load(szDirPrefix, szName, m_pluralFormsCalculator) )
+    if ( !file.Load(dirPrefix, name, m_pluralFormsCalculator) )
         return false;
 
     file.FillHash(m_messages, msgIdCharset, bConvertEncoding);
@@ -1449,7 +1449,7 @@ bool wxMsgCatalog::Load(const wxChar *szDirPrefix, const wxChar *szName,
     return true;
 }
 
-const wxChar *wxMsgCatalog::GetString(const wxChar *sz, size_t n) const
+const wxString *wxMsgCatalog::GetString(const wxString& str, size_t n) const
 {
     int index = 0;
     if (n != size_t(-1))
@@ -1459,16 +1459,16 @@ const wxChar *wxMsgCatalog::GetString(const wxChar *sz, size_t n) const
     wxMessagesHash::const_iterator i;
     if (index != 0)
     {
-        i = m_messages.find(wxString(sz) + wxChar(index));   // plural
+        i = m_messages.find(wxString(str) + wxChar(index));   // plural
     }
     else
     {
-        i = m_messages.find(sz);
+        i = m_messages.find(str);
     }
 
     if ( i != m_messages.end() )
     {
-        return i->second.c_str();
+        return &i->second;
     }
     else
         return NULL;
@@ -1512,28 +1512,30 @@ void wxLocale::DoCommonInit()
 }
 
 // NB: this function has (desired) side effect of changing current locale
-bool wxLocale::Init(const wxChar *szName,
-                    const wxChar *szShort,
-                    const wxChar *szLocale,
-                    bool        bLoadDefault,
-                    bool        bConvertEncoding)
+bool wxLocale::Init(const wxString& name,
+                    const wxString& shortName,
+                    const wxString& locale,
+                    bool            bLoadDefault,
+                    bool            bConvertEncoding)
 {
   wxASSERT_MSG( !m_initialized,
                 _T("you can't call wxLocale::Init more than once") );
 
   m_initialized = true;
-  m_strLocale = szName;
-  m_strShort = szShort;
+  m_strLocale = name;
+  m_strShort = shortName;
   m_bConvertEncoding = bConvertEncoding;
   m_language = wxLANGUAGE_UNKNOWN;
 
   // change current locale (default: same as long name)
-  if ( szLocale == NULL )
+  wxString szLocale(locale);
+  if ( szLocale.empty() )
   {
     // the argument to setlocale()
-    szLocale = szShort;
+    szLocale = shortName;
 
-    wxCHECK_MSG( szLocale, false, _T("no locale to set in wxLocale::Init()") );
+    wxCHECK_MSG( !szLocale.empty(), false,
+                 _T("no locale to set in wxLocale::Init()") );
   }
 
 #ifdef __WXWINCE__
@@ -1566,10 +1568,10 @@ bool wxLocale::Init(const wxChar *szName,
   if ( m_strShort.empty() ) {
     // FIXME I don't know how these 2 letter abbreviations are formed,
     //       this wild guess is surely wrong
-    if ( szLocale && szLocale[0] )
+    if ( !szLocale.empty() )
     {
         m_strShort += (wxChar)wxTolower(szLocale[0]);
-        if ( szLocale[1] )
+        if ( szLocale.length() > 1 )
             m_strShort += (wxChar)wxTolower(szLocale[1]);
     }
   }
@@ -1598,10 +1600,14 @@ bool wxLocale::Init(const wxChar *szName,
 
 
 #if defined(__UNIX__) && wxUSE_UNICODE && !defined(__WXMAC__)
-static wxWCharBuffer wxSetlocaleTryUTF(int c, const wxChar *lc)
+static wxWCharBuffer wxSetlocaleTryUTF8(int c, const wxChar *lc)
 {
-    wxMB2WXbuf l = wxSetlocale(c, lc);
-    if ( !l && lc && lc[0] != 0 )
+    wxMB2WXbuf l;
+
+    // NB: We prefer to set UTF-8 locale if it's possible and only fall back to
+    //     non-UTF-8 locale if it fails
+
+    if ( lc && lc[0] != 0 )
     {
         wxString buf(lc);
         wxString buf2;
@@ -1623,10 +1629,15 @@ static wxWCharBuffer wxSetlocaleTryUTF(int c, const wxChar *lc)
             l = wxSetlocale(c, buf2.c_str());
         }
     }
+
+    // if we can't set UTF-8 locale, try non-UTF-8 one:
+    if ( !l )
+        l = wxSetlocale(c, lc);
+
     return l;
 }
 #else
-#define wxSetlocaleTryUTF(c, lc)  wxSetlocale(c, lc)
+#define wxSetlocaleTryUTF8(c, lc)  wxSetlocale(c, lc)
 #endif
 
 bool wxLocale::Init(int language, int flags)
@@ -1664,13 +1675,13 @@ bool wxLocale::Init(int language, int flags)
     if (language != wxLANGUAGE_DEFAULT)
         locale = info->CanonicalName;
 
-    wxMB2WXbuf retloc = wxSetlocaleTryUTF(LC_ALL, locale);
+    wxMB2WXbuf retloc = wxSetlocaleTryUTF8(LC_ALL, locale);
 
     const wxString langOnly = locale.Left(2);
     if ( !retloc )
     {
         // Some C libraries don't like xx_YY form and require xx only
-        retloc = wxSetlocaleTryUTF(LC_ALL, langOnly);
+        retloc = wxSetlocaleTryUTF8(LC_ALL, langOnly);
     }
 
 #if wxUSE_FONTMAP
@@ -1711,9 +1722,9 @@ bool wxLocale::Init(int language, int flags)
 
         if ( !localeAlt.empty() )
         {
-            retloc = wxSetlocaleTryUTF(LC_ALL, localeAlt);
+            retloc = wxSetlocaleTryUTF8(LC_ALL, localeAlt);
             if ( !retloc )
-                retloc = wxSetlocaleTryUTF(LC_ALL, localeAlt.Left(2));
+                retloc = wxSetlocaleTryUTF8(LC_ALL, localeAlt.Left(2));
         }
     }
 
@@ -1724,12 +1735,13 @@ bool wxLocale::Init(int language, int flags)
     }
 
 #ifdef __AIX__
-    // at least in AIX 5.2 libc is buggy and the string returned from setlocale(LC_ALL)
-    // can't be passed back to it because it returns 6 strings (one for each locale
-    // category), i.e. for C locale we get back "C C C C C C"
+    // at least in AIX 5.2 libc is buggy and the string returned from
+    // setlocale(LC_ALL) can't be passed back to it because it returns 6
+    // strings (one for each locale category), i.e. for C locale we get back
+    // "C C C C C C"
     //
-    // this contradicts IBM own docs but this is not of much help, so just work around
-    // it in the crudest possible manner
+    // this contradicts IBM own docs but this is not of much help, so just work
+    // around it in the crudest possible manner
     wxChar *p = wxStrchr((wxChar *)retloc, _T(' '));
     if ( p )
         *p = _T('\0');
@@ -1859,11 +1871,9 @@ bool wxLocale::Init(int language, int flags)
 #endif
 
 #ifndef WX_NO_LOCALE_SUPPORT
-    wxChar *szLocale = retloc ? wxStrdup(retloc) : NULL;
-    bool ret = Init(name, canonical, szLocale,
+    bool ret = Init(name, canonical, retloc,
                     (flags & wxLOCALE_LOAD_DEFAULT) != 0,
                     (flags & wxLOCALE_CONV_ENCODING) != 0);
-    free(szLocale);
 
     if (IsOk()) // setlocale() succeeded
         m_language = lang;
@@ -2592,43 +2602,43 @@ wxLocale::~wxLocale()
 }
 
 // get the translation of given string in current locale
-const wxChar *wxLocale::GetString(const wxChar *szOrigString,
-                                  const wxChar *szDomain) const
+const wxString& wxLocale::GetString(const wxString& origString,
+                                    const wxString& domain) const
 {
-    return GetString(szOrigString, szOrigString, size_t(-1), szDomain);
+    return GetString(origString, origString, size_t(-1), domain);
 }
 
-const wxChar *wxLocale::GetString(const wxChar *szOrigString,
-                                  const wxChar *szOrigString2,
-                                  size_t n,
-                                  const wxChar *szDomain) const
+const wxString& wxLocale::GetString(const wxString& origString,
+                                    const wxString& origString2,
+                                    size_t n,
+                                    const wxString& domain) const
 {
-    if ( wxIsEmpty(szOrigString) )
-        return wxEmptyString;
+    if ( origString.empty() )
+        return origString;
 
-    const wxChar *pszTrans = NULL;
+    const wxString *trans = NULL;
     wxMsgCatalog *pMsgCat;
 
-    if ( szDomain != NULL )
+    if ( !domain.empty() )
     {
-        pMsgCat = FindCatalog(szDomain);
+        pMsgCat = FindCatalog(domain);
 
         // does the catalog exist?
         if ( pMsgCat != NULL )
-            pszTrans = pMsgCat->GetString(szOrigString, n);
+            trans = pMsgCat->GetString(origString, n);
     }
     else
     {
         // search in all domains
         for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext )
         {
-            pszTrans = pMsgCat->GetString(szOrigString, n);
-            if ( pszTrans != NULL )   // take the first found
+            trans = pMsgCat->GetString(origString, n);
+            if ( trans != NULL )   // take the first found
                 break;
         }
     }
 
-    if ( pszTrans == NULL )
+    if ( trans == NULL )
     {
 #ifdef __WXDEBUG__
         if ( !NoTransErr::Suppress() )
@@ -2637,83 +2647,80 @@ const wxChar *wxLocale::GetString(const wxChar *szOrigString,
 
             wxLogTrace(TRACE_I18N,
                        _T("string \"%s\"[%ld] not found in %slocale '%s'."),
-                       szOrigString, (long)n,
-                       szDomain
-                         ? (const wxChar*)wxString::Format(_T("domain '%s' "), szDomain).c_str()
+                       origString, (long)n,
+                       domain.empty()
+                         ? (const wxChar*)wxString::Format(_T("domain '%s' "), domain).c_str()
                          : _T(""),
                        m_strLocale.c_str());
         }
 #endif // __WXDEBUG__
 
         if (n == size_t(-1))
-            return szOrigString;
+            return origString;
         else
-            return n == 1 ? szOrigString : szOrigString2;
+            return n == 1 ? origString : origString2;
     }
 
-    return pszTrans;
+    return *trans;
 }
 
-wxString wxLocale::GetHeaderValue( const wxChar* szHeader,
-                                   const wxChar* szDomain ) const
+wxString wxLocale::GetHeaderValue(const wxString& header,
+                                  const wxString& domain) const
 {
-    if ( wxIsEmpty(szHeader) )
+    if ( header.empty() )
         return wxEmptyString;
 
-    wxChar const * pszTrans = NULL;
+    const wxString *trans = NULL;
     wxMsgCatalog *pMsgCat;
 
-    if ( szDomain != NULL )
+    if ( !domain.empty() )
     {
-        pMsgCat = FindCatalog(szDomain);
+        pMsgCat = FindCatalog(domain);
 
         // does the catalog exist?
         if ( pMsgCat == NULL )
             return wxEmptyString;
 
-        pszTrans = pMsgCat->GetString(wxEmptyString, (size_t)-1);
+        trans = pMsgCat->GetString(wxEmptyString, (size_t)-1);
     }
     else
     {
         // search in all domains
         for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext )
         {
-            pszTrans = pMsgCat->GetString(wxEmptyString, (size_t)-1);
-            if ( pszTrans != NULL )   // take the first found
+            trans = pMsgCat->GetString(wxEmptyString, (size_t)-1);
+            if ( trans != NULL )   // take the first found
                 break;
         }
     }
 
-    if ( wxIsEmpty(pszTrans) )
+    if ( !trans || trans->empty() )
       return wxEmptyString;
 
-    wxChar const * pszFound = wxStrstr(pszTrans, szHeader);
-    if ( pszFound == NULL )
+    size_t found = trans->find(header);
+    if ( found == wxString::npos )
       return wxEmptyString;
 
-    pszFound += wxStrlen(szHeader) + 2 /* ': ' */;
+    found += header.length() + 2 /* ': ' */;
 
     // Every header is separated by \n
 
-    wxChar const * pszEndLine = wxStrchr(pszFound, wxT('\n'));
-    if ( pszEndLine == NULL ) pszEndLine = pszFound + wxStrlen(pszFound);
-
-
-    // wxString( wxChar*, length);
-    wxString retVal( pszFound, pszEndLine - pszFound );
+    size_t endLine = trans->find(wxT('\n'), found);
+    size_t len = (endLine == wxString::npos) ?
+                 wxString::npos : (endLine - found);
 
-    return retVal;
+    return trans->substr(found, len);
 }
 
 
 // find catalog by name in a linked list, return NULL if !found
-wxMsgCatalog *wxLocale::FindCatalog(const wxChar *szDomain) const
+wxMsgCatalog *wxLocale::FindCatalog(const wxString& domain) const
 {
     // linear search in the linked list
     wxMsgCatalog *pMsgCat;
     for ( pMsgCat = m_pMsgCat; pMsgCat != NULL; pMsgCat = pMsgCat->m_pNext )
     {
-        if ( wxStricmp(pMsgCat->GetName(), szDomain) == 0 )
+        if ( pMsgCat->GetName() == domain )
           return pMsgCat;
     }
 
@@ -2743,11 +2750,11 @@ bool wxLocale::IsAvailable(int lang)
     
     // Test if setting the locale works, then set it back. 
     wxMB2WXbuf oldLocale = wxSetlocale(LC_ALL, wxEmptyString);
-    wxMB2WXbuf tmp = wxSetlocaleTryUTF(LC_ALL, info->CanonicalName);
+    wxMB2WXbuf tmp = wxSetlocaleTryUTF8(LC_ALL, info->CanonicalName);
     if ( !tmp )
     {
         // Some C libraries don't like xx_YY form and require xx only
-        tmp = wxSetlocaleTryUTF(LC_ALL, info->CanonicalName.Left(2));
+        tmp = wxSetlocaleTryUTF8(LC_ALL, info->CanonicalName.Left(2));
         if ( !tmp )
             return false;
     }
@@ -2759,21 +2766,21 @@ bool wxLocale::IsAvailable(int lang)
 }
 
 // check if the given catalog is loaded
-bool wxLocale::IsLoaded(const wxChar *szDomain) const
+bool wxLocale::IsLoaded(const wxString& szDomain) const
 {
   return FindCatalog(szDomain) != NULL;
 }
 
 // add a catalog to our linked list
-bool wxLocale::AddCatalog(const wxChar *szDomain)
+bool wxLocale::AddCatalog(const wxString& szDomain)
 {
-    return AddCatalog(szDomain, wxLANGUAGE_ENGLISH_US, NULL);
+    return AddCatalog(szDomain, wxLANGUAGE_ENGLISH_US, wxEmptyString);
 }
 
 // add a catalog to our linked list
-bool wxLocale::AddCatalog(const wxChar *szDomain,
-                          wxLanguage    msgIdLanguage,
-                          const wxChar *msgIdCharset)
+bool wxLocale::AddCatalog(const wxString& szDomain,
+                          wxLanguage      msgIdLanguage,
+                          const wxString& msgIdCharset)
 
 {
   wxMsgCatalog *pMsgCat = new wxMsgCatalog;