BOOL SetDefaultLanguage( IN BOOL UserProfile) { HKEY BaseKey; LPCWSTR SubKey; LPCWSTR ValueName; LONG rc; HKEY hKey = NULL; DWORD dwType, dwSize; LPWSTR Value = NULL; UNICODE_STRING ValueString; NTSTATUS Status; LCID Lcid; BOOL ret = FALSE; if (UserProfile) { BaseKey = HKEY_CURRENT_USER; SubKey = L"Control Panel\\International"; ValueName = L"Locale"; } else { BaseKey = HKEY_LOCAL_MACHINE; SubKey = L"System\\CurrentControlSet\\Control\\Nls\\Language"; ValueName = L"Default"; } rc = RegOpenKeyExW( BaseKey, SubKey, 0, KEY_READ, &hKey); if (rc != ERROR_SUCCESS) { TRACE("RegOpenKeyEx() failed with error %lu\n", rc); goto cleanup; } rc = RegQueryValueExW( hKey, ValueName, NULL, &dwType, NULL, &dwSize); if (rc != ERROR_SUCCESS) { TRACE("RegQueryValueEx() failed with error %lu\n", rc); goto cleanup; } else if (dwType != REG_SZ) { TRACE("Wrong type for %S\\%S registry entry (got 0x%lx, expected 0x%x)\n", SubKey, ValueName, dwType, REG_SZ); goto cleanup; } Value = HeapAlloc(GetProcessHeap(), 0, dwSize); if (!Value) { TRACE("HeapAlloc() failed\n"); goto cleanup; } rc = RegQueryValueExW( hKey, ValueName, NULL, NULL, (LPBYTE)Value, &dwSize); if (rc != ERROR_SUCCESS) { TRACE("RegQueryValueEx() failed with error %lu\n", rc); goto cleanup; } /* Convert Value to a Lcid */ ValueString.Length = ValueString.MaximumLength = (USHORT)dwSize; ValueString.Buffer = Value; Status = RtlUnicodeStringToInteger(&ValueString, 16, (PULONG)&Lcid); if (!NT_SUCCESS(Status)) { TRACE("RtlUnicodeStringToInteger() failed with status 0x%08lx\n", Status); goto cleanup; } TRACE("%s language is 0x%08lx\n", UserProfile ? "User" : "System", Lcid); Status = NtSetDefaultLocale(UserProfile, Lcid); if (!NT_SUCCESS(Status)) { TRACE("NtSetDefaultLocale() failed with status 0x%08lx\n", Status); goto cleanup; } ret = TRUE; cleanup: if (hKey) RegCloseKey(hKey); if (Value) HeapFree(GetProcessHeap(), 0, Value); return ret; }
BOOL SetDefaultLanguage( IN PWLSESSION Session) { BOOL ret = FALSE; BOOL UserProfile; LONG rc; HKEY UserKey, hKey = NULL; LPCWSTR SubKey, ValueName; DWORD dwType, dwSize; LPWSTR Value = NULL; UNICODE_STRING ValueString; NTSTATUS Status; LCID Lcid; UserProfile = (Session && Session->UserToken); if (UserProfile && !ImpersonateLoggedOnUser(Session->UserToken)) { ERR("WL: ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError()); return FALSE; // FIXME: ... or use the default language of the system?? // UserProfile = FALSE; } if (UserProfile) { rc = RegOpenCurrentUser(MAXIMUM_ALLOWED, &UserKey); if (rc != ERROR_SUCCESS) { TRACE("RegOpenCurrentUser() failed with error %lu\n", rc); goto cleanup; } SubKey = L"Control Panel\\International"; ValueName = L"Locale"; } else { UserKey = NULL; SubKey = L"System\\CurrentControlSet\\Control\\Nls\\Language"; ValueName = L"Default"; } rc = RegOpenKeyExW(UserKey ? UserKey : HKEY_LOCAL_MACHINE, SubKey, 0, KEY_READ, &hKey); if (UserKey) RegCloseKey(UserKey); if (rc != ERROR_SUCCESS) { TRACE("RegOpenKeyEx() failed with error %lu\n", rc); goto cleanup; } rc = RegQueryValueExW(hKey, ValueName, NULL, &dwType, NULL, &dwSize); if (rc != ERROR_SUCCESS) { TRACE("RegQueryValueEx() failed with error %lu\n", rc); goto cleanup; } else if (dwType != REG_SZ) { TRACE("Wrong type for %S\\%S registry entry (got 0x%lx, expected 0x%x)\n", SubKey, ValueName, dwType, REG_SZ); goto cleanup; } Value = HeapAlloc(GetProcessHeap(), 0, dwSize); if (!Value) { TRACE("HeapAlloc() failed\n"); goto cleanup; } rc = RegQueryValueExW(hKey, ValueName, NULL, NULL, (LPBYTE)Value, &dwSize); if (rc != ERROR_SUCCESS) { TRACE("RegQueryValueEx() failed with error %lu\n", rc); goto cleanup; } /* Convert Value to a Lcid */ ValueString.Length = ValueString.MaximumLength = (USHORT)dwSize; ValueString.Buffer = Value; Status = RtlUnicodeStringToInteger(&ValueString, 16, (PULONG)&Lcid); if (!NT_SUCCESS(Status)) { TRACE("RtlUnicodeStringToInteger() failed with status 0x%08lx\n", Status); goto cleanup; } TRACE("%s language is 0x%08lx\n", UserProfile ? "User" : "System", Lcid); Status = NtSetDefaultLocale(UserProfile, Lcid); if (!NT_SUCCESS(Status)) { TRACE("NtSetDefaultLocale() failed with status 0x%08lx\n", Status); goto cleanup; } ret = TRUE; cleanup: if (Value) HeapFree(GetProcessHeap(), 0, Value); if (hKey) RegCloseKey(hKey); if (UserProfile) RevertToSelf(); return ret; }
static void LOCALE_Init(void) { /* extern void __wine_init_codepages( const union cptable *ansi_cp, const union cptable *oem_cp, const union cptable *unix_cp ); */ // UINT ansi_cp = 1252, oem_cp = 437, mac_cp = 10000, unix_cp; UINT unix_cp = 0; #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]; 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 ); 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__ */ // FIXME setlocale( LC_ALL, "" ); unix_cp = setup_unix_locales(); if (!lcid_LC_MESSAGES) lcid_LC_MESSAGES = lcid_LC_CTYPE; #if 0 #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 ); } if (preferred_locales) CFRelease( preferred_locales ); #endif NtSetDefaultUILanguage( LANGIDFROMLCID(lcid_LC_MESSAGES) ); NtSetDefaultLocale( TRUE, lcid_LC_MESSAGES ); NtSetDefaultLocale( FALSE, lcid_LC_CTYPE ); ansi_cp = get_lcid_codepage( LOCALE_USER_DEFAULT ); GetLocaleInfoW( LOCALE_USER_DEFAULT, LOCALE_IDEFAULTMACCODEPAGE | LOCALE_RETURN_NUMBER, (LPWSTR)&mac_cp, sizeof(mac_cp)/sizeof(WCHAR) ); GetLocaleInfoW( LOCALE_USER_DEFAULT, LOCALE_IDEFAULTCODEPAGE | LOCALE_RETURN_NUMBER, (LPWSTR)&oem_cp, sizeof(oem_cp)/sizeof(WCHAR) ); if (!unix_cp) GetLocaleInfoW( LOCALE_USER_DEFAULT, LOCALE_IDEFAULTUNIXCODEPAGE | LOCALE_RETURN_NUMBER, (LPWSTR)&unix_cp, sizeof(unix_cp)/sizeof(WCHAR) ); if (!(ansi_cptable = wine_cp_get_table( ansi_cp ))) ansi_cptable = wine_cp_get_table( 1252 ); if (!(oem_cptable = wine_cp_get_table( oem_cp ))) oem_cptable = wine_cp_get_table( 437 ); if (!(mac_cptable = wine_cp_get_table( mac_cp ))) mac_cptable = wine_cp_get_table( 10000 ); if (unix_cp != CP_UTF8) { if (!(unix_cptable = wine_cp_get_table( unix_cp ))) unix_cptable = wine_cp_get_table( 28591 ); } __wine_init_codepages( ansi_cptable, oem_cptable, unix_cptable ); TRACE( "ansi=%03d oem=%03d mac=%03d unix=%03d\n", ansi_cptable->info.codepage, oem_cptable->info.codepage, mac_cptable->info.codepage, unix_cp ); setlocale(LC_NUMERIC, "C"); /* FIXME: oleaut32 depends on this */ #endif }