]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/intl.cpp
use platform-specific styles in xTR_DEFAULT_STYLE but don't impose them forcefully...
[wxWidgets.git] / src / common / intl.cpp
index 2a4f5e16e704ad666f9cfac68a8e78d582116793..dfc8eb3ad35ce8302ff50b93ae3793b6bfe9c78b 100644 (file)
@@ -1018,6 +1018,25 @@ static wxArrayString gs_searchPrefixes;
 
 #ifdef __WXMSW__
 
+// helper used by wxLanguageInfo::GetLocaleName() and elsewhere to determine
+// whether the locale is Unicode-only (it is if this function returns empty
+// string)
+static wxString wxGetANSICodePageForLocale(LCID lcid)
+{
+    wxString cp;
+
+    wxChar buffer[16];
+    if ( ::GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE,
+                         buffer, WXSIZEOF(buffer)) > 0 )
+    {
+        if ( buffer[0] != _T('0') || buffer[1] != _T('\0') )
+            cp = buffer;
+        //else: this locale doesn't use ANSI code page
+    }
+
+    return cp;
+}
+
 wxUint32 wxLanguageInfo::GetLCID() const
 {
     return MAKELCID(MAKELANGID(WinLang, WinSublang), SORT_DEFAULT);
@@ -1044,12 +1063,10 @@ wxString wxLanguageInfo::GetLocaleName() const
         locale << _T('_') << buffer;
     }
 
-    if ( ::GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE,
-                         buffer, WXSIZEOF(buffer)) > 0 )
+    const wxString cp = wxGetANSICodePageForLocale(lcid);
+    if ( !cp.empty() )
     {
-        if ( buffer[0] != _T('0') || buffer[1] != _T('\0') )
-            locale << _T('.') << buffer;
-        //else: this locale doesn't use ANSI code page
+        locale << _T('.') << cp;
     }
 
     return locale;
@@ -1622,27 +1639,11 @@ bool wxLocale::Init(const wxString& name,
                  wxS("no locale to set in wxLocale::Init()") );
   }
 
-#ifdef __WXWINCE__
-  // FIXME: I'm guessing here
-  wxChar localeName[256];
-  int ret = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SLANGUAGE, localeName,
-      256);
-  if (ret != 0)
-  {
-    m_pszOldLocale = wxStrdup(wxConvLibc.cWC2MB(localeName));
-  }
-  else
-    m_pszOldLocale = NULL;
-
-  // TODO: how to find languageId
-  // SetLocaleInfo(languageId, SORT_DEFAULT, localeName);
-#else
   const char *oldLocale = wxSetlocale(LC_ALL, szLocale);
   if ( oldLocale )
       m_pszOldLocale = wxStrdup(oldLocale);
   else
       m_pszOldLocale = NULL;
-#endif
 
   if ( m_pszOldLocale == NULL )
     wxLogError(_("locale '%s' can not be set."), szLocale);
@@ -1831,34 +1832,25 @@ bool wxLocale::Init(int language, int flags)
 #endif // __AIX__
 
 #elif defined(__WIN32__)
-
-    #if wxUSE_UNICODE && (defined(__VISUALC__) || defined(__MINGW32__))
-        // NB: setlocale() from msvcrt.dll (used by VC++ and Mingw)
-        //     can't set locale to language that can only be written using
-        //     Unicode.  Therefore wxSetlocale call failed, but we don't want
-        //     to report it as an error -- so that at least message catalogs
-        //     can be used. Watch for code marked with
-        //     #ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS below.
-        #define SETLOCALE_FAILS_ON_UNICODE_LANGS
-    #endif
-
     const char *retloc = "C";
-    if (language != wxLANGUAGE_DEFAULT)
+    if ( language != wxLANGUAGE_DEFAULT )
     {
-        if (info->WinLang == 0)
+        if ( info->WinLang == 0 )
         {
             wxLogWarning(wxS("Locale '%s' not supported by OS."), name.c_str());
             // retloc already set to "C"
         }
-        else
+        else // language supported by Windows
         {
             const wxUint32 lcid = info->GetLCID();
 
-            // FIXME
+            // Windows CE doesn't have SetThreadLocale() and there doesn't seem
+            // to be any equivalent
 #ifndef __WXWINCE__
             // change locale used by Windows functions
             ::SetThreadLocale(lcid);
 #endif
+
             // and also call setlocale() to change locale used by the CRT
             locale = info->GetLocaleName();
             if ( locale.empty() )
@@ -1867,47 +1859,30 @@ bool wxLocale::Init(int language, int flags)
             }
             else // have a valid locale
             {
-                // FIXME
-#ifndef __WXWINCE__
                 retloc = wxSetlocale(LC_ALL, locale);
-#endif
-#ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS
-                if ( !retloc )
-                {
-                    // GetLocaleName() returns a string without period only if
-                    // there is no associated ANSI code page
-                    if ( locale.find(_T('.')) == wxString::npos )
-                    {
-                        retloc = "C";
-                    }
-                    //else: locale has code page information and hence this is
-                    //      a real error
-                }
-#endif // SETLOCALE_FAILS_ON_UNICODE_LANGS
             }
         }
     }
-    else
+    else // language == wxLANGUAGE_DEFAULT
     {
-            // FIXME
-#ifndef __WXWINCE__
         retloc = wxSetlocale(LC_ALL, wxEmptyString);
-#else
-        retloc = NULL;
-#endif
-#ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS
-        if (retloc == NULL)
+    }
+
+#if wxUSE_UNICODE && (defined(__VISUALC__) || defined(__MINGW32__))
+    // VC++ setlocale() (also used by Mingw) can't set locale to languages that
+    // can only be written using Unicode, therefore wxSetlocale() call fails
+    // for such languages but we don't want to report it as an error -- so that
+    // at least message catalogs can be used.
+    if ( !retloc )
+    {
+        if ( wxGetANSICodePageForLocale(LOCALE_USER_DEFAULT).empty() )
         {
-            wxChar buffer[16];
-            if (GetLocaleInfo(LOCALE_USER_DEFAULT,
-                              LOCALE_IDEFAULTANSICODEPAGE, buffer, 16) > 0 &&
-                 wxStrcmp(buffer, wxS("0")) == 0)
-            {
-                retloc = "C";
-            }
+            // we set the locale to a Unicode-only language, don't treat the
+            // inability of CRT to use it as an error
+            retloc = "C";
         }
-#endif
     }
+#endif // CRT not handling Unicode-only languages
 
     if ( !retloc )
         ret = false;
@@ -2365,12 +2340,7 @@ const wxLanguageInfo *wxLocale::FindLanguageInfo(const wxString& locale)
 
 wxString wxLocale::GetSysName() const
 {
-            // FIXME
-#ifndef __WXWINCE__
     return wxSetlocale(LC_ALL, NULL);
-#else
-    return wxEmptyString;
-#endif
 }
 
 // clean up
@@ -2387,10 +2357,7 @@ wxLocale::~wxLocale()
     // restore old locale pointer
     wxSetLocale(m_pOldLocale);
 
-    // FIXME
-#ifndef __WXWINCE__
     wxSetlocale(LC_ALL, m_pszOldLocale);
-#endif
     free((wxChar *)m_pszOldLocale);     // const_cast
 }