I have not worked with multi-language Windows for a while, which seems to have changed a lot compared to Windows 10, I am happy that I found Peter Klapwijk’s blog post and his script . If you are still using the XML, maybe it’s time to try out the PowerShell LanguagePackManagement in Windows 11.
Inspired by Peter’s post, I did some tests some tests my own and would like to write down some of my findings.
New module
There are some useful commands in the module, just remember some of them are Alias, and they do the same things.
Other International commands can be found in this documentation: https://learn.microsoft.com/en-us/powershell/module/international/?view=windowsserver2022-ps
Language and Regional Settings
There are four settings in the “Language & Region” UI:
- Windows display language. This language will be used in File Explorer and Settings
- Preferred languages. Microsoft Store apps will appear in the first supported language in the list. Example Company Portal will use the first language in the list. Also input keyboard
- Country or region. Windows and Apps might use this information to get local content
- Regional format. Windows and apps might use this for time, and currency based on regional format.
What else? The Region Administrative settings.
- non-Unicode program. Some old or bad applications don’t support Unicode, it might need to change the language to help show the correct characters.
- Welcome screen and new user account settings. This allows us to copy the current user’s international language settings to the Welcome screen and system accounts, and/or New user accounts.
When we want to change the whole OS, for example “installing updates”, “restarting computer”, “Welcome”, “Getting ready”, or File Explorer, start menu, all of these settings are needed to be changed.
Before we changed anything
Before we change anything, just use some PowerShell command to show the current settings.
So let’s change to Finnish
Install Finnish language
We can use Install-Language -Language “fi-FI” -CopyToSettings or without -CopyToSettings for installing the Finnish language, the language tag can be found in the link Language tag can be found here: https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/available-language-packs-for-windows?view=windows-11#language-packs
Note: Install-language command needs to be run as admin
Question: Difference between using CopyToSettings or without?
In my example here, I use CopyToSettings, before I run this command, I have everything in English, as the screenshots showed above. Let’s see again after I have run the command and before I restart the machine.
After I restarted the machine
Results:
- Install-Langauge did install our desired language
- Users can now change “Windows display language” to the language we just installed.
- The additional language we just installed isn’t added to the preferred language list
- Welcome screen (and system) Display Language and region format are changed. CopyToSettings parameter has changed these settings
- Non-Unicode language support is changed. CopyToSettings parameter has changed these settings
- Current user’s settings aren’t changed.
- New users’ settings aren’t changed
Change Windows display language
We can use Set-WinUILangaugeOverride -Language “fi-FI” to change Windows display language to Finnish.
Adding additional preferred languages
Normally when we want to change Windows display language, we first choose “Add a language” in the Preferred languages, and then the language will show up last in the list. Then when we choose this language from the “Windows display language” list, we will see this language will become the first of the preferred language list.
But since we install the language by using the PowerShell command that runs as admin, we don’t see the language show up in the user’s preferred languages, we only see it shown in the “Windows display language” list. By running the command Set-WinUILangaugeOverride, it only sets the Windows display language and doesn’t add the language to the preferred language list for this user, so we are missing the input locale for this language. That’s why we need another set of commands to add the input locale.
Preferred language input locales can be found here: https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/default-input-locales-for-windows-language-packs?view=windows-11#input-locales
$OldList = Get-WinUserLanguageList
$UserLanguageList = New-WinUserLanguageList -Language "fi-FI"
$UserLanguageList += $OldList
Set-WinUserLanguageList -LanguageList $UserLanguageList -Force
After signing out and login again, Windows display language has now changed.
Change Region and Region format
We can use Set-WinHomeLocation -GeoId “77” command to change “Country or region” to “Finland”, and use Set-Culture -CultureInfo “fi-FI” command to change the regional format to Finland.
GeoID can be found here: https://learn.microsoft.com/en-us/windows/win32/intl/table-of-geographical-locations
After we have made all the changes above, what do the regional administrative settings look like? Current user’s settings are all changed to Finnish (Suomi), The Welcome screen is 80% changed, and new users’ settings are untouched.
Copy the current user setting
One last step, we copy the current user’s international settings to the Welcome screen and system, and new users.
Copy-UserInternationalSettingsToSystem -WelcomeScreen $True -NewUser $True
Restart the machine, and we see the changes are applied.
Now you have successfully added a new language pack to your Windows 11 and changed everything to that language. One more thing, the Company portal will use the first language in the preferred language list. It will change its language in time (maybe not immediately).
What else do you need to know?
Wipe the device
Remember this? System language (Welcome screen display language). If I wipe the machine from Microsoft Intune or reset the machine locally, the default OS language is Finnish, and language packs will be still in the machine even if you wipe/reset the device.
If you have Autopilot profile Langauge (Region) set to “Operating system default”, the whole OS will be Finnish, so your local Administrator account will show as “Järjestelmänvalvoja“, not English “Administrator”. If you have some scripts or Intune User account control policy using the name “Administrator”, you will have some issues. It means, if you are handling a multi-language environment, you need to always consider using SID as much as possible, not the name.
If you have Autopilot profile Language (Region) set to “User select”, the user will see this language selection in OOBE, and the default selected language is the “System Language” we had before we wiped the device.
Another option is, in the Autopilot profile, to use Language (Region) to English. Then use script or IntuneWin32App to change the region, language, input, and timezone as you desire later.
With or without CopyToSettings?
The Install-Language command has CopyToSettings parameter, it is optional. So if you want to change the Non-Unicode language settings, you need to use this CopyToSettings parameter. If you don’t want to change Non-Unicode language setting, then don’t use the CopyToSetting parameter.
Change System Language
Change System language can use Set-SystemPreferredUILanguage, it changes the Welcome screen display language and system language. Now if you look at my script, you might notice I didn’t use this command at all. Why? Because I used the Set-WinUILangaugeOverride to set the current user’s Windows Display language, then I used Copy-UserInternationalSettingsToSystem -WelcomeScreen $True to copy the current user’s Windows display language to the Welcome screen and System. In my test, regardless I run the Set-SystemPreferredUILanguage before or after I run Copy-UserInternationalSettingsToSystem -WelcomeScreen $True without restarting the computer in between, the Copy-UserInternationalSettingsToSystem -WelcomeScreen $True always wins. Now remember, it is without restarting between these two commands, if I would run first Copy-UserInternationalSettingsToSystem -WelcomeScreen $True, then restart the machine, then run again Set-SystemPreferredUILanguage, then restart the machine, you will see the Set-SystemPreferredUILanguage language would apply.
Autopilot and ESP
Now finally we talk about Autopilot and ESP. Change MUI requires the machine to restart, it doesn’t matter if you do this in PowerShell or from Window UI itself. Can you change these settings and apply the settings without a restart? No, simply just no.
So what do we do in Autopilot?
- Modify the script and add some of your detection methods. Remember to leave the exit code as 3010
- Pack the script as Intune Win32App
- Use the Install command to make sure it runs the script in 64bit:
%windir%\SysNative\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -file Invoke-ChangeDefaultLanguage.ps1 - Chose 3010 Soft reboot
- Assign this package to device group, not user group. When assigning the app to the device group, this app will be installed during device setup, and make sure to use the Enrollment Status page (ESP) to track this app. Intune triggered reboot is supported during device setup, and not supported in User state Account setup.
You will see the language changed during the ESP state, and you might see it change between two different languages during the whole process, but it will eventually apply the language you have configured in your script.
Note, The Install-Language takes a long time to download and install the language pack and feature package, I sometimes had to wait almost 20 minutes until it finished installation.
A short video of my User-Driven Autopilot in fast mode.
What about those devices are already installed and has existing user?
If the device is already provisioned/Enrolled, the whole OOBE provisioning state is already gone. So running the script in System context will not change existing users’ profile language settings. Which means you will need two scripts. One for installing language and copying the settings to system and new users, same as the one that we use during Autopilot. Then use another script run as user context, and change whatever you need to change for the user.
Since the user is already using the machine, and the user might have preferred input locale, I would consider not enforcing the newly installed language as the first of the preferred language, but set it as the last of the list. Please modify the script as you see fit for user context.
Enterprise State Roaming
Just a side note here, if you are using the Enterprise State Roaming feature and sync language settings, you might see some languages added back to the preferred language list.
Finally
Finally, you can find the script in my Github Gist here. Hope you enjoy this post!
Add comment