Windows 10 1903 / 1909 – SCCM Language Pack Integration
As I’ve already described in one of my previous post, language pack integration could be a hell of a ride. Since Windows 10 Version 1809 Microsoft changed the way how language packs are installed. Microsoft now provides “LanguageExperiencePacks” that contain partially-localized language packs. These “LanguageExperiencePacks” that are provided as appx-packages still require base language packs.
Requirements
- VLSC W10 1909 Image: Download the Windows 10 installation media from the “Volume Licensing Service Center“. Do not download the sources from other official Microsoft sites like https://my.visualstudio.com/ . The language pack integration with dism will fail if not using a VLSC image! Example Image: SW_DVD9_Win_Pro_10_1909.3_64BIT_English_Pro_Ent_EDU_N_MLF_X22-27457.ISO
- VLSC W10 1903 Multi Language Pack: Even when installing W10 1909 the language pack for 1903 is required! Example: SW_DVD9_NTRL_Win_10_1903_32_64_ARM64_MultiLang_LangPackAll_LIP_X22-01656.ISO
- VLSC W10 1903 Features on Demand: Even when installing W10 1909 the features on demand pack for 1903 is required! Example: SW_DVD9_NTRL_Win_10_1903_64Bit_MultiLang_FOD_1_X22-01658.ISO
Installation Order
- Install language packs (e.g Microsoft-Windows-Client-Language-Pack_x64_de-de.cab)
- Restart
- Install “LanguageExperiencePack” (e.g. LanguageExperiencePack.de-DE.Neutral.appx)
- Activate language pack for all users (e.g. C:\Windows\System32\control.exe intl.cpl /f:”configuartion.xml”)
- Restart
Create SCCM Package
Start creating an individual SCCM package “MS_W10 1909 LanguagePack de-DE_x64_MU_01” containing all necessary content for language activation:
Microsoft-Windows-Client-Language-Pack_x64_de-de.cab
This file was extracted from the VLSC media file “SW_DVD9_NTRL_Win_10_1903_32_64_ARM64_MultiLang_LangPackAll_LIP_X22-01656.ISO” and contains the gui translation for the german language.
LanguageExperiencePack.de-DE.Neutral.appx
This file was extracted from the VLSC media file “SW_DVD9_NTRL_Win_10_1903_32_64_ARM64_MultiLang_LangPackAll_LIP_X22-01656.ISO” Do not forget to copy the “License.xml” file!
Microsoft-Windows-LanguageFeatures-Basic-de-de-Package[…].cab & […]Handwriting-de-de[…].cap & […]OCR-de-de[…].cap & […]Speech-de-de[…].cap & […]TextToSpeech-de-de[…].cap
These files were extracted from “SW_DVD9_NTRL_Win_10_1903_64Bit_MultiLang_FOD_1_X22-01658.ISO” and include the translation parts for different recognition parts.
SCCM_Install_APPX.ps1
This PowerShell Script will install the “LanguageExperiencePack.de-DE.Neutral.appx”. The script will search the root folder of the sccm package for *.appx and License.xml files. Ensure that you anly have one appx package and one License.xml file available otherwise the script will fail.
$LogFileLocation = "C:\ProgramData\SCCM_Install-LanguageExperiencePack.log" #Start Script Start-Transcript -path $LogFileLocation -Force function Write-Log($string) { $dateTimeNow = Get-Date -Format "dd.MM.yyyy - HH:mm:ss" $outStr = "" + $dateTimeNow +" "+$string Write-Output $outStr } function Get-ScriptName { if ($hostinvocation -ne $null) {$hostinvocation.MyCommand.Path} else {$script:MyInvocation.MyCommand.Path} } [string]$ScriptName = Get-ScriptName [string]$ScriptDirectory = Split-Path $ScriptName Write-Log "------------ Start Script ------------" Write-Log "" Write-Log $ScriptName Write-Log "" Write-Log "------------------------------------" Write-Log "Install APPX Package" Write-Log "------------------------------------" $appxbundle = Get-ChildItem -Path $ScriptDirectory -Filter *.appx -ErrorAction Stop $appxbundlepath = $ScriptDirectory + "\" + $appxbundle Write-Log "" Write-Log "APPX Bundle Package Path: $appxbundlepath" $license = Get-ChildItem -Path $ScriptDirectory -Filter License.xml -ErrorAction Stop $licensepath = $ScriptDirectory + '\' + $license Write-Log "License File: $licensepath" Add-AppxProvisionedPackage -Online -PackagePath $appxbundlepath -Licensepath $licensepath Write-Log "" Write-Log "------------- End Script -------------" Stop-Transcript
SCCM_SetLangPack.ps1
This PowerShell script will search the SCCM package root folder for the file “de-DE.xml” containing the language configuration for the operating system. If you like to use a different xml file name just rewrite line 31.
$LogFileLocation = "C:\ProgramData\SCCM_SetLangPack.log" #Start Script Start-Transcript -path $LogFileLocation -Force function Write-Log($string) { $dateTimeNow = Get-Date -Format "dd.MM.yyyy - HH:mm:ss" $outStr = "" + $dateTimeNow +" "+$string Write-Output $outStr } function Get-ScriptName { if ($hostinvocation -ne $null) {$hostinvocation.MyCommand.Path} else {$script:MyInvocation.MyCommand.Path} } [string]$ScriptName = Get-ScriptName [string]$ScriptDirectory = Split-Path $ScriptName Write-Log "------------ Start Script ------------" Write-Log "" Write-Log $ScriptName Write-Log "" Write-Log "------------------------------------" Write-Log "Get Language XML Path" Write-Log "------------------------------------" $XMLfile = Get-ChildItem -Path $ScriptDirectory -Filter de-DE.xml -ErrorAction Stop $XML = $ScriptDirectory + "\" + $XMLfile Write-Log "" Write-Log $XML Write-Log "" Write-Log "------------------------------------" Write-Log "Set Language XML as Active" Write-Log "------------------------------------" Write-Log "" Write-Log "Execute $env:SystemRoot\System32\control.exe intl.cpl,,/f:`"$XML`"" & $env:SystemRoot\System32\control.exe "intl.cpl,,/f:`"$XML`"" Write-Log "" Write-Log "Start Sleep for 2 seconds" start-sleep -seconds 2 Write-Log "" Write-Log "------------- End Script -------------" Stop-Transcript
de-DE.xml
- Set language as default language for all users
- Set the system locale to “de-DE”
- Set the GEOID to “94”
- Set “en-US” as fallback language
- Add the German keyboard layout “0407:00000407”
- Remove the English keyboard layout “0409:00000409”
<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
<!--User List-->
<gs:UserList>
<gs:User UserID="Current" CopySettingsToDefaultUserAcct="true" CopySettingsToSystemAcct="true"/>
</gs:UserList>
<!-- user locale -->
<gs:UserLocale>
<gs:Locale Name="de-DE" SetAsCurrent="true"/>
</gs:UserLocale>
<!-- system locale -->
<gs:SystemLocale Name="de-DE"/>
<!-- GeoID -->
<gs:LocationPreferences>
<gs:GeoID Value="94"/>
</gs:LocationPreferences>
<gs:MUILanguagePreferences>
<gs:MUILanguage Value="de-DE"/>
<gs:MUIFallback Value="en-US"/>
</gs:MUILanguagePreferences>
<!-- input preferences -->
<gs:InputPreferences>
<!--de-DE-->
<gs:InputLanguageID Action="add" ID="0407:00000407" Default="true"/>
<!--en-US-->
<gs:InputLanguageID Action="remove" ID="0409:00000409"/>
</gs:InputPreferences>
</gs:GlobalizationServices>
Modify Task Sequence
Get your Windows 10 deployment Task Sequence (TS) and add the following steps to your TS.
- Create the TS Step
Install Windows-Client-Language-Pack_x64_de-de
- Add the command
dism.exe /norestart /online /add-package /packagepath:.\Microsoft-Windows-Client-Language-Pack_x64_de-de.cab
- Select the distributed package.
- Create the TS Step
Install Windows-LanguageFeatures-Basic-de-de
- Add the command
dism.exe /norestart /online /add-package /packagepath:.\Microsoft-Windows-LanguageFeatures-Basic-de-de-Package~31bf3856ad364e35~amd64~~.cab
- Select the distributed package.
- Create the TS Step
Install Windows-LanguageFeatures-Handwriting-de-de
- Add the command
dism.exe /norestart /online /add-package /packagepath:.\Microsoft-Windows-LanguageFeatures-Handwriting-de-de-Package~31bf3856ad364e35~amd64~~.cab
- Select the distributed package.
- Create the TS Step
Install Windows-LanguageFeatures-OCR-de-de
- Add the command
dism.exe /norestart /online /add-package /packagepath:.\Microsoft-Windows-LanguageFeatures-OCR-de-de-Package~31bf3856ad364e35~amd64~~.cab
- Select the distributed package.
- Create the TS Step
Install Windows-LanguageFeatures-Speech-de-de
- Add the command
dism.exe /norestart /online /add-package /packagepath:.\Microsoft-Windows-LanguageFeatures-Speech-de-de-Package~31bf3856ad364e35~amd64~~.cab
- Select the distributed package.
- Create the TS Step
Install Windows-LanguageFeatures-TextToSpeech-de
- Add the command
dism.exe /norestart /online /add-package /packagepath:.\Microsoft-Windows-LanguageFeatures-TextToSpeech-de-de-Package~31bf3856ad364e35~amd64~~.cab
- Select the distributed package.
- Create the TS Step
Restart Computer (Installed OS)
- Create the TS Step
Install LanguageExperiencePack.de-DE.Neutral.appxRestart Computer (Installed OS)
- Run Script
SCCM_Install_APPX.ps1
- Bypass!
- Create the TS Step
Run SCCM_SetLangPack.ps1
- Run Script
SCCM_SetLangPack.ps1
- Bypass!
- Create the TS Step
Restart Computer (Installed OS)
- Create the TS Step
Install KB4556799 (Language Settings Fix)
- Add the command
wusa.exe windows10.0-kb4556799-x64_9de920d8738612baa81a751b003ff98f0ce7156b.msu /quiet
- Select the distributed package.
- Create the TS Step
Restart Computer (Installed OS)
Fixing errors in settings menu
Right after the succesfull installation I’ve noticed several error messages in the settings menu:
It took me hours to figure out that the installation of the newest Cumulative Update will fix all these errors.