|
| 1 | +--- |
| 2 | +title: Install language packs on Windows 11 Enterprise VMs in Azure Virtual Desktop - Azure |
| 3 | +description: How to install language packs for Windows 11 Enterprise VMs in Azure Virtual Desktop. |
| 4 | +author: Heidilohr |
| 5 | +ms.topic: how-to |
| 6 | +ms.date: 10/04/2021 |
| 7 | +ms.author: helohr |
| 8 | +manager: femila |
| 9 | +--- |
| 10 | +# Add languages to a Windows 11 Enterprise image |
| 11 | + |
| 12 | +It's important to make sure users within your organization from all over the world can use your Azure Virtual Desktop deployment. That's why you can customize the Windows 11 Enterprise image you use for your virtual machines (VMs) to have different language packs. Starting with Windows 11, non-administrator user accounts can now add both the display language and its corresponding language features. This feature means you won't need to pre-install language packs for users in a personal host pool. For pooled host pools, we still recommend you add the languages you plan to add to a custom image. You can use the instructions in this article for both single-session and multi-session versions of Windows 11 Enterprise. |
| 13 | + |
| 14 | +When your organization includes users with multiple different languages, you have two options: |
| 15 | + |
| 16 | +- Create one dedicated host pool with a customized image per language. |
| 17 | +- Have multiple users with different languages in the same host pool. |
| 18 | + |
| 19 | +The second option is more efficient in terms of resources and cost, but requires a few extra steps. Fortunately, this article will help walk you through how to build an image that can accommodate users of all languages and localization needs. |
| 20 | + |
| 21 | +## Requirements |
| 22 | + |
| 23 | +Before you can add languages to a Windows 11 Enterprise VM, you'll need to have the following things ready: |
| 24 | + |
| 25 | +- An Azure VM with Windows 11 Enterprise installed |
| 26 | +- A Language and Feature on Demand (FOD) ISO. You can download the iso at [Windows 11 Language and FOD ISO](https://software-download.microsoft.com/download/sg/22000.1.210604-1628.co_release_amd64fre_CLIENT_LOF_PACKAGES_OEM.iso) |
| 27 | +- An Azure Files share or a file share on a Windows File Server VM |
| 28 | + |
| 29 | +>[!NOTE] |
| 30 | +>The file share repository must be accessible from the Azure VM that you're going to use to create the custom image. |
| 31 | +
|
| 32 | +## Create a content repository for language packages and features on demand |
| 33 | + |
| 34 | +To create the content repository you'll use to add languages and features to your VM: |
| 35 | + |
| 36 | +1. Open the VM you want to add languages to in Azure. |
| 37 | + |
| 38 | +2. Open and mount the ISO file you downloaded in [Requirements](#requirements) on the VM. |
| 39 | + |
| 40 | +3. Create a folder on the file share. |
| 41 | + |
| 42 | +4. Copy all content from the **LanguagesAndOptionalFeatures** folder in the ISO to the folder you created. |
| 43 | + |
| 44 | + >[!NOTE] |
| 45 | + > If you're working with limited storage, you can use the mounted "Languages and Features On Demand" ISO as a repository. To learn how to create a repository, see [Build a custom FOD and language pack repository](/windows-hardware/manufacture/desktop/languages-overview#build-a-custom-fod-and-language-pack-repository). |
| 46 | +
|
| 47 | + >[!IMPORTANT] |
| 48 | + > Some languages require additional fonts included in satellite packages that follow different naming conventions. For example, Japanese font file names include “Jpan." |
| 49 | + > |
| 50 | + > [!div class="mx-imgBorder"] |
| 51 | + >  |
| 52 | +
|
| 53 | +5. Set the permissions on the language content repository share so that you have read access from the VM you'll use to build the custom image. |
| 54 | + |
| 55 | +## Create a custom Windows 11 Enterprise image manually |
| 56 | + |
| 57 | +You can create a custom image by following these steps: |
| 58 | + |
| 59 | +1. Deploy an Azure VM, then go to the Azure Gallery and select the current version of Windows 11 Enterprise you're using. |
| 60 | + |
| 61 | +2. After you've deployed the VM, connect to it using RDP as a local admin. |
| 62 | + |
| 63 | +3. Connect to the file share repository you created in [Create a content repository for language packages and features on demand](#create-a-content-repository-for-language-packages-and-features-on-demand) and mount it to a letter drive (for example, drive E). |
| 64 | + |
| 65 | +4. Run the following PowerShell script from an elevated PowerShell session to install language packs and satellite packages on Windows 11 Enterprise: |
| 66 | + |
| 67 | + ```powershell |
| 68 | + ######################################################## |
| 69 | + ## Add Languages to running Windows Image for Capture## |
| 70 | + ######################################################## |
| 71 | + ##Disable Language Pack Cleanup## |
| 72 | + Disable-ScheduledTask -TaskPath "\Microsoft\Windows\AppxDeploymentClient\" -TaskName "Pre-staged app cleanup" |
| 73 | + Disable-ScheduledTask -TaskPath "\Microsoft\Windows\MUI\" -TaskName "LPRemove" |
| 74 | + Disable-ScheduledTask -TaskPath "\Microsoft\Windows\LanguageComponentsInstaller" -TaskName "Uninstallation" |
| 75 | + reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Control Panel\International" /v "BlockCleanupOfUnusedPreinstalledLangPacks" /t REG_DWORD /d 1 /f |
| 76 | +
|
| 77 | + ##Set Language Pack Content Stores## |
| 78 | + $LIPContent = "E:" |
| 79 | +
|
| 80 | + ##Set Path of CSV File## |
| 81 | + $CSVFile = "Windows-10-1809-FOD-to-LP-Mapping-Table.csv" |
| 82 | + $filePath = (Get-Location).Path + "/$CSVFile" |
| 83 | +
|
| 84 | + ##Import Necesarry CSV File## |
| 85 | + $FODList = Import-Csv -Path $filePath -Delimiter ";" |
| 86 | +
|
| 87 | + ##Set Language (Target)## |
| 88 | + $targetLanguage = "es-es" |
| 89 | +
|
| 90 | + $sourceLanguage = (($FODList | Where-Object {$_.'Target Lang' -eq $targetLanguage}) | Where-Object {$_.'Source Lang' -ne $targetLanguage} | Select-Object -Property 'Source Lang' -Unique).'Source Lang' |
| 91 | + if(!($sourceLanguage)){ |
| 92 | + $sourceLanguage = $targetLanguage |
| 93 | + } |
| 94 | +
|
| 95 | + $langGroup = (($FODList | Where-Object {$_.'Target Lang' -eq $targetLanguage}) | Where-Object {$_.'Lang Group:' -ne ""} | Select-Object -Property 'Lang Group:' -Unique).'Lang Group:' |
| 96 | +
|
| 97 | + ##List of additional features to be installed## |
| 98 | + $additionalFODList = @( |
| 99 | + "$LIPContent\Microsoft-Windows-NetFx3-OnDemand-Package~31bf3856ad364e35~amd64~~.cab", |
| 100 | + "$LIPContent\Microsoft-Windows-MSPaint-FoD-Package~31bf3856ad364e35~amd64~$sourceLanguage~.cab", |
| 101 | + "$LIPContent\Microsoft-Windows-SnippingTool-FoD-Package~31bf3856ad364e35~amd64~$sourceLanguage~.cab", |
| 102 | + "$LIPContent\Microsoft-Windows-Lip-Language_x64_$sourceLanguage.cab" ##only if applicable## |
| 103 | + ) |
| 104 | + |
| 105 | + $additionalCapabilityList = @( |
| 106 | + "Language.Basic~~~$sourceLanguage~0.0.1.0", |
| 107 | + "Language.Handwriting~~~$sourceLanguage~0.0.1.0", |
| 108 | + "Language.OCR~~~$sourceLanguage~0.0.1.0", |
| 109 | + "Language.Speech~~~$sourceLanguage~0.0.1.0", |
| 110 | + "Language.TextToSpeech~~~$sourceLanguage~0.0.1.0" |
| 111 | + ) |
| 112 | +
|
| 113 | + ##Install all FODs or fonts from the CSV file### |
| 114 | + Dism /Online /Add-Package /PackagePath:$LIPContent\Microsoft-Windows-Client-Language-Pack_x64_$sourceLanguage.cab |
| 115 | + Dism /Online /Add-Package /PackagePath:$LIPContent\Microsoft-Windows-Lip-Language-Pack_x64_$sourceLanguage.cab |
| 116 | + foreach($capability in $additionalCapabilityList){ |
| 117 | + Dism /Online /Add-Capability /CapabilityName:$capability /Source:$LIPContent |
| 118 | + } |
| 119 | +
|
| 120 | + foreach($feature in $additionalFODList){ |
| 121 | + Dism /Online /Add-Package /PackagePath:$feature |
| 122 | + } |
| 123 | +
|
| 124 | + if($langGroup){ |
| 125 | + Dism /Online /Add-Capability /CapabilityName:Language.Fonts.$langGroup~~~und-$langGroup~0.0.1.0 |
| 126 | + } |
| 127 | +
|
| 128 | + ##Add installed language to language list## |
| 129 | + $LanguageList = Get-WinUserLanguageList |
| 130 | + $LanguageList.Add("$targetlanguage") |
| 131 | + Set-WinUserLanguageList $LanguageList -force |
| 132 | + ``` |
| 133 | +
|
| 134 | + >[!NOTE] |
| 135 | + >This example script uses the Spanish (es-es) language code. To automatically install the appropriate files for a different language change the *$targetLanguage* parameter to the correct language code. For a list of language codes, see [Available language packs for Windows](/windows-hardware/manufacture/desktop/available-language-packs-for-windows). |
| 136 | +
|
| 137 | + The script might take a while to finish depending on the number of languages you need to install. You can also install additional languages after initial setup by running the script again with a different *$targetLanguage* parameter. |
| 138 | +
|
| 139 | +5. To automatically select the appropriate installation files, download and save the [Available Windows 10 1809 Languages and Features on Demand table](https://download.microsoft.com/download/7/6/0/7600F9DC-C296-4CF8-B92A-2D85BAFBD5D2/Windows-10-1809-FOD-to-LP-Mapping-Table.xlsx ) as a CSV file, then save it in the same folder as your PowerShell script. |
| 140 | +
|
| 141 | +6. Once the script is finished running, check to make sure the language packs installed correctly by going to **Start** > **Settings** > **Time & Language** > **Language**. If the language files are there, you're all set. |
| 142 | +
|
| 143 | +7. Finally, if the VM is connected to the Internet while installing languages, you'll need to run a cleanup process to remove any unnecessary language experience packs. To clean up the files, run these commands: |
| 144 | +
|
| 145 | + ```powershell |
| 146 | + ##Cleanup to prepare sysprep## |
| 147 | + Remove-AppxPackage -Package Microsoft.LanguageExperiencePackes-ES_22000.8.13.0_neutral__8wekyb3d8bbwe |
| 148 | +
|
| 149 | + Remove-AppxPackage -Package Microsoft.OneDriveSync_22000.8.13.0_neutral__8wekyb3d8bbwe |
| 150 | + ``` |
| 151 | +
|
| 152 | + To clean up different language packs, replace "es-ES" with a different language code. |
| 153 | +
|
| 154 | +8. Once you're done with cleanup, disconnect the share. |
| 155 | +
|
| 156 | +## Finish customizing your image |
| 157 | +
|
| 158 | +After you've installed the language packs, you can install any other software you want to add to your customized image. |
| 159 | +
|
| 160 | +Once you're finished customizing your image, you'll need to run the system preparation tool (sysprep). |
| 161 | +
|
| 162 | +To run sysprep: |
| 163 | +
|
| 164 | +1. Open an elevated command prompt and run the following command to generalize the image: |
| 165 | + |
| 166 | + ```cmd |
| 167 | + C:\Windows\System32\Sysprep\sysprep.exe /oobe /generalize /shutdown |
| 168 | + ``` |
| 169 | +
|
| 170 | +2. If you run into any issues, check the **SetupErr.log** file in your C drive at **Windows** > **System32** > **Sysprep** > **Panther**. After that, follow the instructions in [Sysprep fails with Microsoft Store apps](/troubleshoot/windows-client/deployment/sysprep-fails-remove-or-update-store-apps) to troubleshoot your setup. |
| 171 | +
|
| 172 | +3. If setup is successful, stop the VM, then capture it in a managed image by following the instructions in [Create a managed image of a generalized VM in Azure](../virtual-machines/windows/capture-image-resource.md). |
| 173 | +
|
| 174 | +4. You can now use the customized image to deploy an Azure Virtual Desktop host pool. To learn how to deploy a host pool, see [Tutorial: Create a host pool with the Azure portal](create-host-pools-azure-marketplace.md). |
| 175 | +
|
| 176 | +>[!NOTE] |
| 177 | +>When a user changes their display language, they'll need to sign out of their Azure Virtual Desktop session, then sign back in. They must sign out from the Start menu. |
| 178 | +
|
| 179 | +## Next steps |
| 180 | +
|
| 181 | +Learn how to install language packages for Windows 10 multi-session VMs at [Add language packs to a Windows 10 multi-session image](language-packs.md). |
| 182 | +
|
| 183 | +For a list of known issues, see [Adding languages in Windows 10: Known issues](/windows-hardware/manufacture/desktop/language-packs-known-issue). |
0 commit comments