Wait, wait...
On Dec 12, 2006, at 6:55 AM, Pierre d'Herbemont wrote:
> This time with Alexandre suggestion to use directly parse_locale_name.
>
> We still leave the possibility not to use the System preferences
> language if LC_MESSAGES env variable LC_MESSAGES was set to a value
> different than the default ("C").
>
> Pierre.
> ---
> 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..c70e08c 100644
> --- a/dlls/kernel32/locale.c
> +++ b/dlls/kernel32/locale.c
> @@ -2832,11 +2839,39 @@ 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 prefered language as
> choosen in
> + System Preferences.app, because it can differ from
> CFLocaleCopyCurrent().
> + */
> + all_locales = CFLocaleCopyAvailableLocaleIdentifiers();
> + preferred_locales = CFBundleCopyLocalizationsForPreferences
> ( all_locales, NULL );
I thought I explained that exactly the above combination of calls
produces unusable results. For example, for me it produces "en_ZW"
-- English (Zimbabwe). In System Preferences, I have set
"English" (no country) as my preferred language and U.S. for other
locale settings.
In other words, it is picking a random country.
> + 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 );
>
>