Pierre d'Herbemont : kernel32: Allow the preferred language to be different from the preferred locale on Mac OS X .

Alexandre Julliard julliard at wine.codeweavers.com
Tue Dec 12 14:29:51 CST 2006


Module: wine
Branch: master
Commit: 3c0d2e3808424e68c9bc0c3d982c13bbc639f4cc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3c0d2e3808424e68c9bc0c3d982c13bbc639f4cc

Author: Pierre d'Herbemont <pdherbemont at free.fr>
Date:   Tue Dec 12 13:55:57 2006 +0100

kernel32: Allow the preferred language to be different from the preferred locale on Mac OS X.

---

 dlls/kernel32/locale.c |   37 ++++++++++++++++++++++++++++++++++++-
 1 files changed, 36 insertions(+), 1 deletions(-)

diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index 8792623..16310a0 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -31,9 +31,12 @@
 #include <stdio.h>
 #include <ctype.h>
 #include <stdlib.h>
+#include <sys/types.h>
 
 #ifdef __APPLE__
+# include <CoreFoundation/CFBundle.h>
 # include <CoreFoundation/CFLocale.h>
+# include <CoreFoundation/CFPreferences.h>
 # include <CoreFoundation/CFString.h>
 #endif
 
@@ -2822,7 +2825,10 @@ void LOCALE_Init(void)
 
 #ifdef __APPLE__
     /* MacOS doesn't set the locale environment variables so we have to do it ourselves */
+    CFArrayRef preferred_locales, all_locales;
+    CFStringRef user_language_string_ref = NULL;
     char user_locale[50];
+
     CFLocaleRef user_locale_ref = CFLocaleCopyCurrent();
     CFStringRef user_locale_string_ref = CFLocaleGetIdentifier( user_locale_ref );
 
@@ -2832,11 +2838,40 @@ void LOCALE_Init(void)
     unix_cp = CP_UTF8;  /* default to utf-8 even if we don't get a valid locale */
     setenv( "LANG", user_locale, 0 );
     TRACE( "setting locale to '%s'\n", user_locale );
-#endif
+
+    /* We still want to set the retrieve the preferred language as chosen in
+       System Preferences.app, because it can differ from CFLocaleCopyCurrent().
+    */
+    all_locales = CFLocaleCopyAvailableLocaleIdentifiers();
+    preferred_locales = CFBundleCopyLocalizationsForPreferences( all_locales, NULL );
+    if (preferred_locales)
+    {
+        if (CFArrayGetCount( preferred_locales ))
+            user_language_string_ref = CFArrayGetValueAtIndex( preferred_locales, 0 );
+        CFRelease( preferred_locales );
+    }
+    CFRelease( all_locales );
+#endif /* __APPLE__ */
+
     setlocale( LC_ALL, "" );
 
     unix_cp = setup_unix_locales();
     if (!lcid_LC_MESSAGES) lcid_LC_MESSAGES = lcid_LC_CTYPE;
+
+#ifdef __APPLE__
+    /* Override lcid_LC_MESSAGES with user_language if LC_MESSAGES is set to default */
+    if (lcid_LC_MESSAGES == lcid_LC_CTYPE && user_language_string_ref)
+    {
+        struct locale_name locale_name;
+        WCHAR buffer[128];
+        CFStringGetCString( user_language_string_ref, user_locale, sizeof(user_locale), kCFStringEncodingUTF8 );
+        strcpynAtoW( buffer, user_locale, sizeof(buffer)/sizeof(WCHAR) );
+        parse_locale_name( buffer, &locale_name );
+        lcid_LC_MESSAGES = locale_name.lcid;
+        TRACE( "setting lcid_LC_MESSAGES to '%s'\n", user_locale );
+    }
+#endif
+
     NtSetDefaultUILanguage( LANGIDFROMLCID(lcid_LC_MESSAGES) );
     NtSetDefaultLocale( TRUE, lcid_LC_MESSAGES );
     NtSetDefaultLocale( FALSE, lcid_LC_CTYPE );




More information about the wine-cvs mailing list