]> git.saurik.com Git - wxWidgets.git/commitdiff
don't report setlocale failure if trying to set Unicode-only language
authorVáclav Slavík <vslavik@fastmail.fm>
Fri, 11 Apr 2003 23:20:36 +0000 (23:20 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Fri, 11 Apr 2003 23:20:36 +0000 (23:20 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20146 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

samples/internat/internat.cpp
src/common/intl.cpp

index 3856f2ebfce176d32208a42bfc6407cbdad4c6a2..e887968b5bb4681319605ce0175fff7e507b4079 100644 (file)
@@ -119,9 +119,12 @@ bool MyApp::OnInit()
         wxLANGUAGE_FRENCH,
         wxLANGUAGE_GERMAN,
         wxLANGUAGE_RUSSIAN,
+#if wxUSE_UNICODE
         wxLANGUAGE_JAPANESE,
+        wxLANGUAGE_GEORGIAN,
+#endif
         wxLANGUAGE_ENGLISH,
-        wxLANGUAGE_ENGLISH_US,
+        wxLANGUAGE_ENGLISH_US
     };
 
     if ( lng == -1 )
@@ -134,7 +137,10 @@ bool MyApp::OnInit()
             _T("French"),
             _T("German"),
             _T("Russian"),
-            _T("Japanese"),         // this will only work in Unicode build
+#if wxUSE_UNICODE
+            _T("Japanese"),
+            _T("Georgian (no translation)"),
+#endif
             _T("English"),
             _T("English (U.S.)")
         };
index e78a33c9d0195b46f91ab3133a5cf141248cc6f0..339b71aad0872aa2750c471a47c14ee469988cc2 100644 (file)
@@ -711,6 +711,17 @@ bool wxLocale::Init(int language, int flags)
         return FALSE;
     }
 #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 bellow.
+        #define SETLOCALE_FAILS_ON_UNICODE_LANGS
+    #endif
+    
     wxMB2WXbuf retloc = wxT("C");
     if (language != wxLANGUAGE_DEFAULT)
     {
@@ -721,42 +732,58 @@ bool wxLocale::Init(int language, int flags)
         }
         else
         {
+            int codepage = -1;
             wxUint32 lcid = MAKELCID(MAKELANGID(info->WinLang, info->WinSublang),
                                      SORT_DEFAULT);
-            if (SetThreadLocale(lcid))
+            SetThreadLocale(lcid);
+            // NB: we must translate LCID to CRT's setlocale string ourselves,
+            //     because SetThreadLocale does not modify change the
+            //     interpretation of setlocale(LC_ALL, "") call:
+            wxChar buffer[256];
+            buffer[0] = wxT('\0');
+            GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, buffer, 256);
+            locale << buffer;
+            if (GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY, buffer, 256) > 0)
+                locale << wxT("_") << buffer;
+            if (GetLocaleInfo(lcid, LOCALE_IDEFAULTANSICODEPAGE, buffer, 256) > 0)
+            {
+                codepage = wxAtoi(buffer);
+                if (codepage != 0)
+                    locale << wxT(".") << buffer;
+            }
+            if (locale.IsEmpty())
             {
-                retloc = wxSetlocale(LC_ALL, wxEmptyString);
+                wxLogLastError(wxT("SetThreadLocale"));
+                wxLogError(wxT("Cannot set locale to language %s."), name.c_str());
+                return FALSE;
             }
             else
             {
-                // Windows9X doesn't support SetThreadLocale, so we must
-                // translate LCID to CRT's setlocale string ourselves
-                locale.Empty();
-                if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
-                {
-                    wxChar buffer[256];
-                    buffer[0] = wxT('\0');
-                    GetLocaleInfo(lcid, LOCALE_SENGLANGUAGE, buffer, 256);
-                    locale << buffer;
-                    if (GetLocaleInfo(lcid, LOCALE_SENGCOUNTRY, buffer, 256) > 0)
-                        locale << wxT("_") << buffer;
-                }
-                if (locale.IsEmpty())
-                {
-                    wxLogLastError(wxT("SetThreadLocale"));
-                    wxLogError(wxT("Cannot set locale to language %s."), name.c_str());
-                    return FALSE;
-                }
-                else
+                retloc = wxSetlocale(LC_ALL, locale);
+#ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS
+                if (codepage == 0 && (const wxChar*)retloc == NULL)
                 {
-                    retloc = wxSetlocale(LC_ALL, locale);
+                    retloc = wxT("C");
                 }
+#endif
             }
         }
     }
     else
     {
         retloc = wxSetlocale(LC_ALL, wxEmptyString);
+#ifdef SETLOCALE_FAILS_ON_UNICODE_LANGS
+        if ((const wxChar*)retloc == NULL)
+        {
+            wxChar buffer[16];
+            if (GetLocaleInfo(LOCALE_USER_DEFAULT,
+                              LOCALE_IDEFAULTANSICODEPAGE, buffer, 16) > 0 &&
+                 wxStrcmp(buffer, wxT("0")) == 0)
+            {
+                retloc = wxT("C");
+            }
+        }
+#endif
     }
 
     if ( !retloc )