These provide control over copying the new locale to the system and
default user accounts.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/SetWinLocale | 94 ++++++++++++++++++++++++++++++++++++----
1 file changed, 86 insertions(+), 8 deletions(-)
diff --git a/testbot/bin/SetWinLocale b/testbot/bin/SetWinLocale
index fa5f90cdbb..e544a580d3 100755
--- a/testbot/bin/SetWinLocale
+++ b/testbot/bin/SetWinLocale
@@ -310,7 +310,7 @@ sub CheckLocale($$)
return undef;
}
-my ($OptHostName, $OptShow, $OptReboot);
+my ($OptHostName, $OptShow, $OptSysCopy, $OptDefCopy, $OptReboot);
my ($OptDefault, $OptLocale, $OptCountry, $OptSystem, $OptUTF8, $OptMUI, $OptKeyboard);
while (@ARGV)
{
@@ -323,6 +323,22 @@ while (@ARGV)
{
$OptShow = 1;
}
+ elsif ($Arg eq "--sys-copy")
+ {
+ $OptSysCopy = 1;
+ }
+ elsif ($Arg eq "--no-sys-copy")
+ {
+ $OptSysCopy = 0;
+ }
+ elsif ($Arg eq "--def-copy")
+ {
+ $OptDefCopy = 1;
+ }
+ elsif ($Arg eq "--no-def-copy")
+ {
+ $OptDefCopy = 0;
+ }
elsif ($Arg eq "--reboot")
{
if (defined $OptReboot and !$OptReboot)
@@ -426,13 +442,32 @@ if (!defined $Usage)
}
}
- if (!$OptLocale and !$OptSystem and !$OptMUI and !$OptKeyboard and
- !$OptCountry and !$OptUTF8 and !$OptShow)
+ if (!$OptLocale and !$OptCountry and !$OptSystem and !$OptUTF8 and
+ !$OptMUI and !$OptKeyboard and !defined $OptSysCopy and
+ !defined $OptDefCopy)
+ {
+ if (!$OptShow)
+ {
+ Error("you must specify at least one locale to change\n");
+ $Usage = 2;
+ }
+ if (defined $OptReboot)
+ {
+ Error("--(no-)reboot can only be used when changing a locale\n");
+ $Usage = 2;
+ }
+ }
+ if ($OptShow and ($OptLocale or $OptCountry or $OptSystem or $OptUTF8 or
+ $OptMUI or $OptKeyboard or defined $OptSysCopy or
+ defined $OptDefCopy or defined $OptReboot))
{
- Error("you must specify at least one locale to change\n");
+ Error("--show and the locale options are mutually incompatible\n");
$Usage = 2;
}
+ $OptSysCopy = 1 if (!defined $OptSysCopy);
+ $OptDefCopy = 1 if (!defined $OptDefCopy);
+
# Two settings only take effect after a reboot:
# - System locale changes.
# - Display language changes only require a log out + log in but that cannot
@@ -447,7 +482,7 @@ if (defined $Usage)
exit $Usage;
}
print "Usage: $name0 [options] --show HOSTNAME\n";
- print "or $name0 [options] [--default DEF] [--locale LOC] [--country CTY] [--system SYS] [--utf8] [--mui MUI] [--keyboard KBD] [--no-reboot] HOSTNAME\n";
+ print "or $name0 [options] [--default DEF] [--locale LOC] [--country CTY] [--system SYS] [--utf8] [--mui MUI] [--keyboard KBD] [--no-sys-copy] [--no-def-copy] [--no-reboot] HOSTNAME\n";
print "\n";
print "Sets the locale of the specified Windows machine.\n";
print "\n";
@@ -490,13 +525,32 @@ if (defined $Usage)
print " . Only takes effect after a log out + log in.\n";
print " . Windows 10 GUI: Time & language -> Language -> Windows\n";
print " display language.\n";
- print " . APIs: GetSystemPreferredUILanguages(),\n";
+ print " . APIs: GetSystemPreferredUILanguages() (--sys-copy case),\n";
print " GetUserDefaultUILanguage(), GetThreadUILanguage().\n";
print " . Powershell: Set-WinUILanguageOverride -Language MUI\n";
print " --keyboard KBD Specifies the keyboard layout (see --defaults).\n";
print " . Windows 10 GUI: Time & language -> Language -> Keyboard ->\n";
print " Override for default input method.\n";
print " . Powershell: Set-WinDefaultInputMethodOverride -InputTip KBD-ID\n";
+ print " --sys-copy Copy the current locales (--locale --country --mui --keyboard)\n";
+ print " to the system accounts (System/LocalSystem, NT Authority) and\n";
+ print " in particular the one used by the logon screen. This is the\n";
+ print " default.\n";
+ print " . This requires elevated privileges.\n";
+ print " . Windows 10 GUI: Time & language -> Language -> Administrative\n";
+ print " language settings -> Copy Settings -> Welcome Screen and\n";
+ print " system accounts.\n";
+ print " . Powershell (Windows 11+): Copy-UserInternationalSettingsToSystem -WelcomeScreen \$True\n";
+ print " . Intl.cpl: CopySettingsToSystemAcct='true'\n";
+ print " --no-sys-copy Do not copy the current locale to the system accounts such as\n";
+ print " the one used by the logon screen.\n";
+ print " --def-copy Copy the current locales (--locale --country --mui --keyboard)\n";
+ print " to the default user account. This is the default.\n";
+ print " . Windows 10 GUI: Time & language -> Language -> Administrative\n";
+ print " language settings -> Copy Settings -> New user accounts.\n";
+ print " . Powershell (Windows 11+): Copy-UserInternationalSettingsToSystem -NewUser \$True\n";
+ print " . Intl.cpl: CopySettingsToDefaultUserAcct='true'\n";
+ print " --no-def-copy Do not copy the current locales to the default user account.\n";
print " --no-reboot Do not reboot Windows. Some locale changes only take effect\n";
print " after a reboot so this option should only be used for\n";
print " debugging.\n";
@@ -652,7 +706,7 @@ sub ShowWinSettings($)
print "OEMCP (--utf8) = ", Value2Str($Settings->{OEMCP}), "\n";
print "\n";
- print ".DEFAULT account:\n";
+ print ".DEFAULT account (see --sys-copy):\n";
# Locale used for the date and time in the logon screen
print "Locale (--locale) = ", Value2Str($Settings->{DefLocale}), "\n";
print "LocaleName (--locale) = ", Value2Str($Settings->{DefLocaleName}), "\n";
@@ -772,11 +826,13 @@ $OptKeyboard ||= $OptDefault;
# Generate the intl.cpl configuration
#
+my $CopyToSys = $OptSysCopy ? "true" : "false";
+my $CopyToDef = $OptDefCopy ? "true" : "false";
my @Config = (
# intl.cpl does not want single quotes on that one line!
"<gs:GlobalizationServices xmlns:gs=\"urn:longhornGlobalizationUnattend\">",
" <gs:UserList>",
- " <gs:User UserID='Current' CopySettingsToDefaultUserAcct='true' CopySettingsToSystemAcct='true'/>",
+ " <gs:User UserID='Current' CopySettingsToDefaultUserAcct='$CopyToDef' CopySettingsToSystemAcct='$CopyToSys'/>",
" </gs:UserList>",
);
if (defined $CountryId)
@@ -952,6 +1008,28 @@ if ($KeyboardIds)
CheckSetting($Settings, "InputMethod", $KeyboardIds->[0], "for --keyboard $OptKeyboard", 1);
}
+if ($OptSysCopy)
+{
+ if ($OptLocale)
+ {
+ CheckSetting($Settings, "DefLocale", "0000$LCIDLocale", "for --locale $OptLocale", 1);
+ CheckSetting($Settings, "DefLocaleName", $OptLocale, "for --locale $OptLocale");
+ }
+ if ($OptCountry)
+ {
+ CheckSetting($Settings, "DefCountry", $CountryId, "for --country $OptCountry");
+ CheckSetting($Settings, "DefCountryName", $OptCountry, "for --country $OptCountry");
+ }
+ if ($OptMUI)
+ {
+ CheckSetting($Settings, "DefMachinePreferredUILanguages", $OptMUI, "for --mui $OptMUI");
+ }
+ if ($KeyboardIds)
+ {
+ CheckSetting($Settings, "DefInputMethod", $KeyboardIds->[0], "for --keyboard $OptKeyboard", 1);
+ }
+}
+
Cleanup();
exit(1) if (!$Success);
Debug(Elapsed($Start), " All done!\n");
--
2.30.2