diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c index f1e6370d71d..ac33e788bcd 100644 --- a/dlls/kernel32/locale.c +++ b/dlls/kernel32/locale.c @@ -2929,16 +2929,27 @@ void LOCALE_Init(void) 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 ); + CFStringRef user_locale_lang_ref = CFLocaleGetValue( user_locale_ref, kCFLocaleLanguageCode ); + CFStringRef user_locale_country_ref = CFLocaleGetValue( user_locale_ref, kCFLocaleCountryCode ); + CFStringRef user_locale_string_ref; + + if (user_locale_country_ref) + { + user_locale_string_ref = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@_%@.UTF-8"), + user_locale_lang_ref, user_locale_country_ref); + } + else + { + user_locale_string_ref = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@.UTF-8"), + user_locale_lang_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" ); + 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 ); TRACE( "setting locale to '%s'\n", user_locale );