kernel32: Mac: If language is less specific variant of locale, keep locale.
authorKen Thomases <ken@codeweavers.com>
Fri, 19 Feb 2010 15:44:26 +0000 (09:44 -0600)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 22 Feb 2010 10:41:38 +0000 (11:41 +0100)
For a Mac user in Australia, for example, the out-of-the-box configuration is
that the preferred language is generic English ("en").  Their formats locale
should be Australia ("en_AU").  Detect that case and don't override
LC_MESSAGES.

dlls/kernel32/locale.c

index d6a8492b92f18482b7d0b3fa1fcbc9aef587b545..6f965e30aa8ece67c4a733ae16c32f6821fa23de 100644 (file)
@@ -2945,8 +2945,6 @@ void LOCALE_Init(void)
     }
 
     CFStringGetCString( user_locale_string_ref, user_locale, sizeof(user_locale), kCFStringEncodingUTF8 );
-    CFRelease( user_locale_ref );
-    CFRelease( user_locale_string_ref );
 
     unix_cp = CP_UTF8;  /* default to utf-8 even if we don't get a valid locale */
     setenv( "LANG", user_locale, 0 );
@@ -2963,11 +2961,14 @@ void LOCALE_Init(void)
     if (!getenv("LC_ALL") && !getenv("LC_MESSAGES"))
     {
         /* Retrieve the preferred language as chosen in System Preferences. */
+        /* If language is a less specific variant of locale (e.g. 'en' vs. 'en_US'),
+           leave things be. */
         CFArrayRef all_locales = CFLocaleCopyAvailableLocaleIdentifiers();
         CFArrayRef preferred_locales = CFBundleCopyLocalizationsForPreferences( all_locales, NULL );
         CFStringRef user_language_string_ref;
         if (preferred_locales && CFArrayGetCount( preferred_locales ) &&
-            (user_language_string_ref = CFArrayGetValueAtIndex( preferred_locales, 0 )))
+            (user_language_string_ref = CFArrayGetValueAtIndex( preferred_locales, 0 )) &&
+            !CFEqual(user_language_string_ref, user_locale_lang_ref))
         {
             struct locale_name locale_name;
             WCHAR buffer[128];
@@ -2981,6 +2982,9 @@ void LOCALE_Init(void)
         if (preferred_locales)
             CFRelease( preferred_locales );
     }
+
+    CFRelease( user_locale_ref );
+    CFRelease( user_locale_string_ref );
 #endif
 
     NtSetDefaultUILanguage( LANGIDFROMLCID(lcid_LC_MESSAGES) );