]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/intl.cpp
Always link with expat in monolithic build.
[wxWidgets.git] / src / common / intl.cpp
index cffa1cd034f8304b37c14a8f31d4e07e99fce198..97cb520a397b9eec5f633b859419c6512d36672f 100644 (file)
@@ -200,8 +200,7 @@ wxLanguageInfoArray *wxLocale::ms_languagesDB = NULL;
 
 /*static*/ void wxLocale::DestroyLanguagesDB()
 {
-    delete ms_languagesDB;
-    ms_languagesDB = NULL;
+    wxDELETE(ms_languagesDB);
 }
 
 
@@ -239,7 +238,7 @@ bool wxLocale::Init(const wxString& name,
                     const wxString& locale,
                     bool            bLoadDefault
 #if WXWIN_COMPATIBILITY_2_8
-                   ,bool            bConvertEncoding
+                   ,bool            WXUNUSED_UNLESS_DEBUG(bConvertEncoding)
 #endif
                     )
 {
@@ -294,7 +293,7 @@ bool wxLocale::DoInit(const wxString& name,
 
     if ( m_pszOldLocale == NULL )
     {
-        wxLogError(_("locale '%s' can not be set."), szLocale);
+        wxLogError(_("locale '%s' cannot be set."), szLocale);
     }
 
     // the short name will be used to look for catalog files as well,
@@ -1025,7 +1024,7 @@ wxLocale::~wxLocale()
     wxSetLocale(m_pOldLocale);
 
     wxSetlocale(LC_ALL, m_pszOldLocale);
-    free((wxChar *)m_pszOldLocale);     // const_cast
+    free(const_cast<char *>(m_pszOldLocale));
 }
 
 
@@ -1046,16 +1045,21 @@ bool wxLocale::IsAvailable(int lang)
 #elif defined(__UNIX__)
 
     // Test if setting the locale works, then set it back.
-    const char *oldLocale = wxSetlocaleTryUTF8(LC_ALL, info->CanonicalName);
-    if ( !oldLocale )
-    {
-        // Some C libraries don't like xx_YY form and require xx only
-        oldLocale = wxSetlocaleTryUTF8(LC_ALL, ExtractLang(info->CanonicalName));
-        if ( !oldLocale )
-            return false;
-    }
+    char * const oldLocale = wxStrdupA(setlocale(LC_ALL, NULL));
+
+    // Some platforms don't like xx_YY form and require xx only so test for
+    // it too.
+    const bool
+        available = wxSetlocaleTryUTF8(LC_ALL, info->CanonicalName) ||
+                    wxSetlocaleTryUTF8(LC_ALL, ExtractLang(info->CanonicalName));
+
     // restore the original locale
     wxSetlocale(LC_ALL, oldLocale);
+
+    free(oldLocale);
+
+    if ( !available )
+        return false;
 #endif
 
     return true;
@@ -1408,7 +1412,7 @@ LCTYPE GetLCTYPEFormatFromLocalInfo(wxLocaleInfo index)
 } // anonymous namespace
 
 /* static */
-wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory WXUNUSED(cat))
+wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory cat)
 {
     wxUint32 lcid = LOCALE_USER_DEFAULT;
     if ( wxGetLocale() )
@@ -1426,9 +1430,35 @@ wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory WXUNUSED(cat))
 
     switch ( index )
     {
+        case wxLOCALE_THOUSANDS_SEP:
+            if ( ::GetLocaleInfo(lcid, LOCALE_STHOUSAND, buf, WXSIZEOF(buf)) )
+                str = buf;
+            break;
+
         case wxLOCALE_DECIMAL_POINT:
-            if ( ::GetLocaleInfo(lcid, LOCALE_SDECIMAL, buf, WXSIZEOF(buf)) )
+            if ( ::GetLocaleInfo(lcid,
+                                 cat == wxLOCALE_CAT_MONEY
+                                     ? LOCALE_SMONDECIMALSEP
+                                     : LOCALE_SDECIMAL,
+                                 buf,
+                                 WXSIZEOF(buf)) )
+            {
                 str = buf;
+
+                // As we get our decimal point separator from Win32 and not the
+                // CRT there is a possibility of mismatch between them and this
+                // can easily happen if the user code called setlocale()
+                // instead of using wxLocale to change the locale. And this can
+                // result in very strange bugs elsewhere in the code as the
+                // assumptions that formatted strings do use the decimal
+                // separator actually fail, so check for it here.
+                wxASSERT_MSG
+                (
+                    wxString::Format("%.3f", 1.23).find(str) != wxString::npos,
+                    "Decimal separator mismatch -- did you use setlocale()?"
+                    "If so, use wxLocale to change the locale instead."
+                );
+            }
             break;
 
         case wxLOCALE_SHORT_DATE_FMT: