You might be working with a default Windows installation for all your users no matter where they are located. For example, all the devices you order from your vendor have a Windows 11 installation in English. But there might be a requirement in some countries to hand over the device to the end-user not in English but in the language of that specific country.
This creates the challenge of automatically installing an (additional) language pack on the device and changing the complete Windows installation to another language.
In Windows 11 22H2 we have two PowerShell commands available which together make it possible to install a new language pack and change the Windows machine in another language:
With the PowerShell command Install-Language, we install the new language pack including the Feature On Demand (FOD) items. In the past, we needed to take several steps with our scripts to install the language pack including the FODs, but on Windows 11 we have just this PS command.
Another big advantage of this command, we have no requirement for an Azure AD signed-in user or the related language store app which needs to be assigned to an AAD user. This allows us to install the language pack during Autopilot enrollment.
To get this job done I created a PowerShell script, that is available on GitHub.
In my case, I wrapped the script as a win32 application to deploy it with Microsoft Intune. I assigned it as required to a device group and added it to the Enrollment Status Page. This makes sure the script is executed during Autopilot enrollment and before the first end-user is signed in.
The script explained
The script consists of a few parts, which I explain here.
I first set a few variables.
The Company name is used in the registry path I use for Intune detection.
The language tag is used in several places in the script, to install the new language and set it as the default language in several parts of Windows.
The GeoID is used to set the home location.
To install the new language pack, we simply use the command Install-Language.
When we add the parameter CopySettings, the installed language is set as default in several places on the device.
After installing the language pack, we set the new language as System Preferred UI Language with Set-SystemPreferredUILanguage.
Although we use the CopyToSettings parameter with the install command, not all parts of the system are changed to the new language. In Windows 11 we have a new PowerShell command available; Copy-UserInternationalSettingsToSystem. This command Copies the current user’s international settings (Windows Display language, Input language, Regional Format/locale, and Location/GeoID) to the Welcome screen, system, and new user accounts. This changes the last pieces of the system to the new language.
But before we can do that, we first need to configure the new language for the account (system) under which the script is running, because the international settings are copied from the current user to the system.
That is done for several parts of Windows with the below commands.
After setting the language defaults, this is copied to the system.
And as last, I add a registry key, which is used for Intune detection.
That’s all for the script.
Win32 install command and detection rule
In case you want to wrap the script as a WIN32 app to deploy it during Autopilot enrollment these are the install command and detection rule you can use.
For the install and uninstall commands, I use the same rule. This is because I don’t provide an uninstall script.
This is my install rule, change it so it matches the name of your PowerShell script:
PowerShell.exe -ExecutionPolicy Bypass -file .\InstallLanguagePackDuringAutopilotESP_Windows11nl-NL.ps1
At the end of the script, a registry key is written when the language is installed successfully. This registry key is used in Intune for the detection of the installation status of the package.
This is the detection rule, change it to match your needs (company name, script version and language):
Key path: HKEY_LOCAL_MACHINE\Software\Klapwijk\LanguageXPWIN11ESP\v1.1
Value name: SetLanguage-nl-NL
Detection method: Value exists
The end-user experience
When we have a look at a device that was installed with an English (en-US) Windows 11 22H2 image and the script executed to install the Dutch (nl-NL) language, this is the Welcome screen shown in Dutch after enrollment.
And the login screen is shown in Dutch.
If we have a look at the language and region settings tab in Windows, we see the Windows display language is set to Nederlands (Dutch). And also Country or region is set to Nederland (The Netherlands).
Searching shows results in the new language.
The Microsoft Store is completely shown in the new language.
But directly after signing in to the device, we see in the start menu that store applications are still updating, because some app names show in Dutch and others still show in English.
So it might be a good idea the also remove unused/ unwanted store apps during the enrollment, to reduce the time of updating all these apps.
But after some time, all store app names show in the new language.
And to confirm via PowerShell under the user, all these items are set to Dutch and The Netherlands.
So that’s all to completely change the language of a Windows 11 device during Windows Autopilot enrollment.
If you are interested in changing the complete Windows language of an existing device in an automated way, also have a look at this blog post of mine.
If you want to change the time zone automatically (during Autopilot enrollment), have a look at this blog post.
Again, the script is found on my GitHub. Let me know if you make any improvements/ changes to the script for your usage in the comments below.