Signed-off-by: Francois Gouget fgouget@codeweavers.com --- testbot/bin/SetWinLocale | 67 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-)
diff --git a/testbot/bin/SetWinLocale b/testbot/bin/SetWinLocale index 3a74406a49..c62d663335 100755 --- a/testbot/bin/SetWinLocale +++ b/testbot/bin/SetWinLocale @@ -47,6 +47,7 @@ my $HKCU_USER_PROFILE = "HKCU\Control Panel\International\User Profile"; my $HKCU_DESKTOP = "HKCU\Control Panel\Desktop"; my $HKLM_LANGUAGE = "HKLM\SYSTEM\CurrentControlSet\Control\Nls\Language"; my $HKLM_LOCALE = "HKLM\SYSTEM\CurrentControlSet\Control\Nls\Locale"; +my $HKLM_CODE_PAGE = "HKLM\System\CurrentControlSet\Control\Nls\CodePage";
# @@ -297,7 +298,7 @@ sub CheckLocale($$) }
my ($OptHostName, $OptShow, $OptReboot); -my ($OptDefault, $OptLocale, $OptSystem, $OptMUI, $OptCountry, $OptKeyboard); +my ($OptDefault, $OptLocale, $OptSystem, $OptMUI, $OptCountry, $OptKeyboard, $OptUTF8); while (@ARGV) { my $Arg = shift @ARGV; @@ -351,6 +352,10 @@ while (@ARGV) { $OptCountry = CheckValue($Arg, $OptCountry); } + elsif ($Arg eq "--utf8") + { + $OptUTF8 = 1; + } elsif ($Arg eq "--debug") { $Debug = 1; @@ -413,7 +418,7 @@ if (!defined $Usage) }
if (!$OptLocale and !$OptSystem and !$OptMUI and !$OptKeyboard and - !$OptCountry and !$OptShow) + !$OptCountry and !$OptUTF8 and !$OptShow) { Error("you must specify at least one locale to change\n"); $Usage = 2; @@ -433,7 +438,7 @@ if (defined $Usage) exit $Usage; } print "Usage: $name0 [options] --show HOSTNAME\n"; - print "or $name0 [options] [--default DEF] [--locale LOC] [--system SYS] [--mui MUI] [--keyboard KBD] [--country CTY] HOSTNAME\n"; + print "or $name0 [options] [--default DEF] [--locale LOC] [--system SYS] [--utf8] [--mui MUI] [--keyboard KBD] [--country CTY] HOSTNAME\n"; print "\n"; print "Sets the locale of the specified Windows machine.\n"; print "\n"; @@ -456,6 +461,13 @@ if (defined $Usage) print " Administrative Language Settings -> Change system locale.\n"; print " . APIs: GetSystemDefaultLCID().\n"; print " . Powershell: Set-WinSystemLocale -SystemLocale SYS\n"; + print " --utf8 Set the code pages (ACP, MACCP and OEMCP) to UTF-8.\n"; + print " . Windows 10 GUI: Time & language -> Language ->\n"; + print " Administrative Language Settings -> Change system locale ->\n"; + print " Beta: Use Unicode UTF-8 for worldwide language support.\n"; + print " . APIs: GetACP(), GetOEMCP().\n"; + print " . Powershell: Automatically and unconditionally set by\n"; + print " Set-WinSystemLocale for the relevant locales.\n"; print " --mui MUI Specifies the display language (see --defaults).\n"; print " . Only takes effect after a log out + log in.\n"; print " . Windows 10 GUI: Time & language -> Language -> Windows\n"; @@ -533,6 +545,26 @@ sub RegGetValue($;$) return $Values->{defined $VName ? $VName : "(Default)"}; }
+sub RegSetValue($$$$) +{ + my ($Key, $VName, $Type, $Value) = @_; + + my $Cmd = ["reg.exe", "add", $Key, "/f"]; + push @$Cmd, (defined $VName ? ("/v", $VName) : ("/ve")); + $Value = join("\0", @$Value) if (ref($Value) eq "ARRAY"); + push @$Cmd, "/t" , $Type, "/d", $Value; + + my $Pid = $TA->Run($Cmd, 0); + if (!$Pid) + { + FatalError("failed to run @$Cmd\n"); + } + if (!defined $TA->Wait($Pid, 10)) + { + FatalError("@$Cmd timed out: ", $TA->GetLastError(), "\n"); + } +} +
# # Show the host's locale settings @@ -570,6 +602,11 @@ sub GetWinSettings($) $Settings->{SysLanguage} = RegGetValue($HKLM_LANGUAGE, "Default"); $Settings->{SysLocale} = RegGetValue($HKLM_LOCALE, "(Default)"); } + if ($OptUTF8 or $All) + { + my $Values = RegGetValues($HKLM_CODE_PAGE, "*CP"); + map { $Settings->{$_} = $Values->{$_} } ("ACP", "MACCP", "OEMCP"); + } return $Settings; }
@@ -595,6 +632,9 @@ sub ShowWinSettings($) print " Previous... (--mui) = ", Value2Str($Settings->{PreviousPreferredUILanguages}), "\n"; print "Nls:Language (--system) = ", Value2Str($Settings->{SysLanguage}), "\n"; print "Nls:Locale (--system) = ", Value2Str($Settings->{SysLocale}), "\n"; + print "ACP (--utf8) = ", Value2Str($Settings->{ACP}), "\n"; + print "MACCP (--utf8) = ", Value2Str($Settings->{MACCP}), "\n"; + print "OEMCP (--utf8) = ", Value2Str($Settings->{OEMCP}), "\n"; }
if ($OptShow) @@ -784,6 +824,20 @@ if (!$DryRun) }
+# +# Change the code pages manually +# + +if ($OptUTF8) +{ + # intl.cpl does not support setting a specific code page + foreach my $VName ("ACP", "MACCP", "OEMCP") + { + RegSetValue($HKLM_CODE_PAGE, $VName, "REG_SZ", "65001"); + } +} + + # # Reboot to finalize the changes # @@ -861,6 +915,13 @@ if ($OptSystem) CheckSetting($Settings, "SysLanguage", $LCIDSystem, "for --system $OptSystem", 1); CheckSetting($Settings, "SysLocale", "0000$LCIDSystem", "for --system $OptSystem", 1); } +if ($OptUTF8) +{ + foreach my $VName ("ACP", "MACCP", "OEMCP") + { + CheckSetting($Settings, $VName, "65001", "for --utf8"); + } +} exit(1) if (!$Success);