[PATCH v4 0/3] MR4357: ntdll/unix: Try harder to initialize locale from Mac setting.
This allows initializing locale from Mac locale identifiers like 'zh-Hans-US'. The current implementation recognizes it as 'zh-US' which isn't a valid locale identifier for Windows. This patch will try again with the 'lang-script' identifier after get_win_locale() fails with the 'lang-region' identifier. -- v4: ntdll/unix: Try harder to fallback to neutral locales. ntdll/unix: Support to initialize locale from Mac language identifiers with script name. ntdll/unix: Use different variable names for Mac locales. https://gitlab.winehq.org/wine/wine/-/merge_requests/4357
From: Jactry Zeng <jzeng(a)codeweavers.com> --- dlls/ntdll/unix/env.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c index 5a58911c759..6b249917cfe 100644 --- a/dlls/ntdll/unix/env.c +++ b/dlls/ntdll/unix/env.c @@ -807,9 +807,9 @@ static void init_locale(void) #ifdef __APPLE__ if (!system_locale[0]) { - CFLocaleRef locale = CFLocaleCopyCurrent(); - CFStringRef lang = CFLocaleGetValue( locale, kCFLocaleLanguageCode ); - CFStringRef country = CFLocaleGetValue( locale, kCFLocaleCountryCode ); + CFLocaleRef mac_sys_locale = CFLocaleCopyCurrent(); + CFStringRef lang = CFLocaleGetValue( mac_sys_locale, kCFLocaleLanguageCode ); + CFStringRef country = CFLocaleGetValue( mac_sys_locale, kCFLocaleCountryCode ); CFStringRef locale_string; if (country) @@ -818,7 +818,7 @@ static void init_locale(void) locale_string = CFStringCreateCopy(NULL, lang); CFStringGetCString(locale_string, system_locale, sizeof(system_locale), kCFStringEncodingUTF8); - CFRelease(locale); + CFRelease(mac_sys_locale); CFRelease(locale_string); } if (!user_locale[0]) @@ -833,13 +833,13 @@ static void init_locale(void) { CFStringRef lang = CFDictionaryGetValue( components, kCFLocaleLanguageCode ); CFStringRef country = CFDictionaryGetValue( components, kCFLocaleCountryCode ); - CFLocaleRef locale = NULL; + CFLocaleRef mac_user_locale = NULL; CFStringRef locale_string; if (!country) { - locale = CFLocaleCopyCurrent(); - country = CFLocaleGetValue( locale, kCFLocaleCountryCode ); + mac_user_locale = CFLocaleCopyCurrent(); + country = CFLocaleGetValue( mac_user_locale, kCFLocaleCountryCode ); } if (country) locale_string = CFStringCreateWithFormat( NULL, NULL, CFSTR("%@-%@"), lang, country ); @@ -847,7 +847,7 @@ static void init_locale(void) locale_string = CFStringCreateCopy( NULL, lang ); CFStringGetCString( locale_string, user_locale, sizeof(user_locale), kCFStringEncodingUTF8 ); CFRelease( locale_string ); - if (locale) CFRelease( locale ); + if (mac_user_locale) CFRelease( mac_user_locale ); CFRelease( components ); } } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4357
From: Jactry Zeng <jzeng(a)codeweavers.com> --- dlls/ntdll/unix/env.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c index 6b249917cfe..c88357b1b68 100644 --- a/dlls/ntdll/unix/env.c +++ b/dlls/ntdll/unix/env.c @@ -833,6 +833,7 @@ static void init_locale(void) { CFStringRef lang = CFDictionaryGetValue( components, kCFLocaleLanguageCode ); CFStringRef country = CFDictionaryGetValue( components, kCFLocaleCountryCode ); + CFStringRef script = CFDictionaryGetValue( components, kCFLocaleScriptCode ); CFLocaleRef mac_user_locale = NULL; CFStringRef locale_string; @@ -841,7 +842,11 @@ static void init_locale(void) mac_user_locale = CFLocaleCopyCurrent(); country = CFLocaleGetValue( mac_user_locale, kCFLocaleCountryCode ); } - if (country) + if (country && script) + locale_string = CFStringCreateWithFormat( NULL, NULL, CFSTR("%@-%@-%@"), lang, script, country ); + else if (!country && script) + locale_string = CFStringCreateWithFormat( NULL, NULL, CFSTR("%@-%@"), lang, script ); + else if (country && !script) locale_string = CFStringCreateWithFormat( NULL, NULL, CFSTR("%@-%@"), lang, country ); else locale_string = CFStringCreateCopy( NULL, lang ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4357
From: Jactry Zeng <jzeng(a)codeweavers.com> --- dlls/ntdll/unix/env.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c index c88357b1b68..31b793a553a 100644 --- a/dlls/ntdll/unix/env.c +++ b/dlls/ntdll/unix/env.c @@ -799,6 +799,7 @@ static void init_locale(void) struct locale_nls_header *header; const NLS_LOCALE_HEADER *locale_table; const NLS_LOCALE_DATA *locale; + char *p, buffer[LOCALE_NAME_MAX_LENGTH]; setlocale( LC_ALL, "" ); if (!unix_to_win_locale( setlocale( LC_CTYPE, NULL ), system_locale )) system_locale[0] = 0; @@ -867,6 +868,20 @@ static void init_locale(void) system_lcid = locale->idefaultlanguage; if ((locale = get_win_locale( locale_table, user_locale ))) user_lcid = locale->idefaultlanguage; + else + { + strcpy( buffer, user_locale ); + while ((p = strrchr( buffer, '-' ))) + { + *p = 0; + if ((locale = get_win_locale( locale_table, buffer ))) + { + user_lcid = locale->idefaultlanguage; + strcpy( user_locale, buffer ); + break; + } + } + } free( header ); } if (!system_lcid) system_lcid = MAKELANGID( LANG_ENGLISH, SUBLANG_DEFAULT ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4357
participants (2)
-
Jactry Zeng -
Jactry Zeng (@jactry)