[PATCH] kernel32: Respect the LANG environment variable on Mac OS.

Ken Thomases ken at codeweavers.com
Mon Nov 23 15:08:06 CST 2009


The call to setenv() has 0 (false) as its third parameter, so that LANG is not overwritten.

-Ken

On Nov 23, 2009, at 9:12 AM, Charles Davis wrote:

> ---
> dlls/kernel32/locale.c |   53
> +++++++++++++++++++++++++----------------------
> 1 files changed, 28 insertions(+), 25 deletions(-)
> 
> 
> 
> diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
> index fb9b517..d9ea8eb 100644
> --- a/dlls/kernel32/locale.c
> +++ b/dlls/kernel32/locale.c
> @@ -2925,32 +2925,35 @@ void LOCALE_Init(void)
>     UINT ansi_cp = 1252, oem_cp = 437, mac_cp = 10000, unix_cp;
> 
> #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];
> -    char* p;
> -
> -    CFLocaleRef user_locale_ref = CFLocaleCopyCurrent();
> -    CFStringRef user_locale_string_ref = CFLocaleGetIdentifier( user_locale_ref );
> -
> -    CFStringGetCString( user_locale_string_ref, user_locale, sizeof(user_locale), kCFStringEncodingUTF8 );
> -    CFRelease( user_locale_ref );
> -    /* Strip modifiers because setlocale() can't parse them. */
> -    if ((p = strchr( user_locale, '@' ))) *p = 0;
> -    if (!strchr( user_locale, '.' )) strcat( user_locale, ".UTF-8" );
> -    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 );
> -
> -    /* 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 && CFArrayGetCount( preferred_locales ))
> -        user_language_string_ref = CFArrayGetValueAtIndex( preferred_locales, 0 );
> -    CFRelease( all_locales );
> +    if (!getenv( "LANG" ))
> +    {
> +        /* MacOS doesn't set the locale environment variables so we have to do it ourselves */
> +        CFArrayRef preferred_locales, all_locales;
> +        char user_locale[50];
> +        char* p;
> +
> +        CFLocaleRef user_locale_ref = CFLocaleCopyCurrent();
> +        CFStringRef user_locale_string_ref = CFLocaleGetIdentifier( user_locale_ref );
> +
> +        CFStringGetCString( user_locale_string_ref, user_locale, sizeof(user_locale), kCFStringEncodingUTF8 );
> +        CFRelease( user_locale_ref );
> +        /* Strip modifiers because setlocale() can't parse them. */
> +        if ((p = strchr( user_locale, '@' ))) *p = 0;
> +        if (!strchr( user_locale, '.' )) strcat( user_locale, ".UTF-8" );
> +        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 );
> +
> +        /* 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 && CFArrayGetCount( preferred_locales ))
> +            user_language_string_ref = CFArrayGetValueAtIndex( preferred_locales, 0 );
> +        CFRelease( all_locales );
> +    }
> #endif /* __APPLE__ */
> 
>     setlocale( LC_ALL, "" );
> 
> 
> 




More information about the wine-devel mailing list