Jump to content


How can I dynamically install Windows 10 language packs and associated features on demand in an offline environment

Recommended Posts


Sometimes you need to install Windows features that normally need internet access (to install other components), language packs installed today are done in a modular and different format from previous years. In previous times you could simply install a language pack for the associate language and all was good, now there are additional components that also need to be installed otherwise Windows will attempt to download them from the internet (and notify you via the notification center if it cannot).

I needed to install Windows 10 LTSC version 2019 in an offline environment (with no internet access) and I also needed to configure language pack settings and configure keyboard layout. I came up with a solution that works for me and I thought I'd share it. You might know of a simpler or better way, if so feel free to comment.

Note: The LTSC (Long Term Servicing Channel) version of Windows 10 is suited for special environments, and environments without Internet certainly are special. I've even verified that the equivalent version of Windows 10 (aka Windows 10 version 1809) behaves the same way, in fact the screenshots used here are from Windows 10 1809, I didn't import LTSC into my lab yet.  I've also tested this method with Windows 10 version 2004 (and the associated version 2004 LP and FOD files and it works perfectly !


Step 1. Get the feature on demand packages

Normally if you install a language pack on a Windows 10 computer with valid internet, it will automatically download the associated features on demand for that language and those can include:

  • Display language
  • Text-to-speech
  • Handwriting
  • Speech recognition
  • Typing

You can see these additional items listed in the screenshot below. Depending on the language pack capabilities, some will have all of these and some will have only a few.

language fod packs.png

Most of these components (features on demand or FOD packages) can be found on the features on demand ISO for the respective operating system and you can download those ISOs from the Volume License Servicing Center (VLSC) website or go to Visual Studio downloads (formally MSDN). Below you can see some of the FOD packages listed on the mounted ISO.

FOD packages.png

There are FOD packages for different types of function within Windows and the packages I was most interested in were any related to language (specifically). You may find that you want to install additional FODs for your particular solution.

If you scroll down the long list of FOD packages you'll see some that begin with Microsoft-Windows-LanguageFeatures, and they are sorted by country code (where applicable) into the following sections.

  • Microsoft-Windows-LanguageFeatures-Basic
  • Microsoft-Windows-LanguageFeatures-Fonts
  • Microsoft-Windows-LanguageFeatures-Handwriting
  • Microsoft-Windows-LanguageFeatures-OCR
  • Microsoft-Windows-LanguageFeatures-Speech
  • Microsoft-Windows-LanguageFeatures-TextToSpeech

such as below.


This was my first clue to solve this. I decided to copy all the LanguageFeatures FOD packages from the ISO to somewhere local. The next thing I found on the ISO was Metadata, so I copied that also.

fod metadata.png


Step 2. Get the Language packs

Finally, there are also Language Pack ISOs available for download for your respective version of Windows 10, and on that ISO are larger cab files containing the client language pack for each language that is available. You can find the language packs in the architecture folder on this ISO.

language packs in iso.png

They'll look something like this.

lp cabs.png

Step 3. Sort the downloads by country code

Now that you've got the necessary files, you need to decide which languages you are going to support during OSD and sort them into their own respective folders. I copied language specific FOD packages and the client language pack for each language I was interested in into it's own separate folder like below (sv-SE for Sweden), and then copied those folders onto my package sources folder on the ConfigMgr server.

Note that some languages may have more (or less) FOD packages available than others, so copy all that are available on the ISO and you should be good to go. The first cab file listed below is the Client Language Pack from the Language Pack ISO and the remaining 4 cabs are from the FOD ISO.

sorted by country code.png

Next create another folder with the Metadata files within it.

metadata files.png

Step 4. Create packages

In ConfigMgr, create a separate package for each language you intend to add support for and point it to the folder containing the Client Language Pack and FOD packages.

create packages for each language pack.png

Once you've created all the language pack packages, don't forget to create the Metadata package.

some of the language packages.png

Distribute the packages to your distribution points.

Step 5. Import the task sequence

To save you a lot of effort all you need to do is import my task sequence and then modify the package references to suit your environment.

Note: This is an MDT integrated task sequence so if you want to use it please integrate MDT with ConfigMgr. You will get messages about missing content during the import, choose 'ignore dependancies' and it will import the task sequence steps anyway. However, you must then step through each step in the task sequence that references a package, and point it to the equivalent package on your ConfigMgr environment.


After importing the task sequence, make sure to add your language packages (and metadata) to the appropriate steps that reference them otherwise this won't work, pretty much all of the xcopy steps will need a package attached to them.

add your language packs to the appropriate step.png

Download the following, and import into ConfigMgr.

Windows 10 LTSC language packs without internet.zip

Step 6. A quick look at the task sequence logic

The task sequence works by first setting a variable, called Location. You can set this as a step in the task sequence dynamically based on various inputs (such as DHCP IP address, gateway, computer variable, collection variable). That I leave up to you, I've forced this example to use Sweden as the location.

set location.png

Next, it dynamically sets Language specific variables based on the Location set previously.

You need to add one of these dynamic groups for each language you intend to support. The below screenshot shows two languages configured but you could have multiple.

set dynamic variables.png

Next (1) it injects the system, user, locale specific settings based on the dynamic variables set above.

  • SysLocale
  • UserLocale
  • InputLocale


Thee next group (2) copies the en-US language pack+FOD packages, and metadata. This is needed if you want to be able to switch languages via the input switch in the task tray (language bar).

Next, it dynamically downloads (3) the FOD package containing the needed files to add features on demand plus the language pack for the language you are adding support for. It then uses a bunch of DISM commands (4) to inject the necessary FOD packages. After that it sets some reg-keys (5) to deal with known issues relating to language packs cleanup before adding some more steps to allow both languages (en-US and sv-SE in this example) to display on the login screen using the input methods switch.


Step 7. Viewing the result

After all that hard work you'll want to see the end result. In this lab I've disabled internet access by simply powering off my Smoothwall (which controls internet to the lab). We can see in WinPE that there is no internet.

no internet.png

After selecting the task sequence it downloads the Operating System, applies it and then starts injecting the cab files and other dism operations. Below you can see it inject one of the FOD packages

injecting the fods.png

And below it's injecting the Client Language Pack, all of this is dynamic based on the Location variable.

injecting client language pack.png

After installation is complete the login screen shows no internet in the LAN connection, but the language is in Swedish.

no internet but language is swedish.png

When you attempt to login you'll see the language bar, awesome.

language bar on login screen.png

And after logging in, you will see that your chosen language pack is installed along with the necessary FOD packages, automatically and dynamically even without internet !

Awesome or what !

no internet but language is configured.png

And of course you can use PowerShell to verify the installation of your language pack with Get-WinUserLanguageList.


Windows 10 version 2004

What about Windows 10 version 2004 ? it works perfectly using this exact same method, just switch out the Operating System wim file with the 2004 version and replace the FOD and LP packages with the correct version, see below.

windows 10 version 2004 language pack and fods installed.png


Recommended reading



  • Like 1

Share this post

Link to post
Share on other sites


I reviewed the Task Sequence (for which thanks a million!) and I believe the reason for 'error 87:parameter is not correct' in two of the steps you disabled for the time being is the wrong dism parameter: 

DISM.exe /image:%OSDisk%\ /Set-UILanguage:%OSDUILanguage% that should be-> DISM.exe /image:%OSDisk%\ /Set-UILang:%OSDUILanguage%

Similarly Set-UILanguageFallback should be changed to Set-UILangFallback.

I did not have enough time to test that one myself yet but according to DISM documentation Set-UILang is the parameter name that exists. 

Edited by Aleksandra
  • Like 2

Share this post

Link to post
Share on other sites

Nice catch even if I'm not using those settings, thanks !

I'll update those two steps and re-offer the download, thanks @Aleksandra


Share this post

Link to post
Share on other sites

  Error: Imported Task Sequence Package (1):
•    Ignore Dependency Windows 10 LTSC x64 install language packs offline
Not found
instance of __ExtendedStatus
    Description = "Failed to load class properties and qualifiers for class BDD_UsePackage in task sequence.";
    Operation = "ExecMethod";
    ParameterInfo = "SMS_TaskSequence";
    ProviderName = "WinMgmt";
    StatusCode = 2147749890;

To fix it follow this.


Share this post

Link to post
Share on other sites


yup, that's why I had a Note: in step 5, shown again below 🙂

Note: This is an MDT integrated task sequence so if you want to use it please integrate MDT with ConfigMgr. You will get messages about missing content during the import, choose 'ignore dependancies' and it will import the task sequence steps anyway. However, you must then step through each step in the task sequence that references a package, and point it to the equivalent package on your ConfigMgr environment. 


Share this post

Link to post
Share on other sites

thanks !

if you look at the apps included on the FOD discs, chances are they are there, and you need to add them (if that's what you want), you can modify the steps i've added and add additional steps to include the apps you want localised

Share this post

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.