Multilingual Windows 10 20H2 OSD with ConfigMgr

Adam CookEndpoint Management, MECM/MEMCM/SCCM, Task Sequence, Windows85 Comments


In this post I’m going to share with you a task sequence for ConfigMgr / SCCM / MEMCM / MECM / MCM (this is just getting silly now) that localises Windows 10 to a language other than the default language of the OS install media.

This is a follow up from my previous post Language Packs, Language Experience Packs, Language Interface Packs… what?!

In that post I broke down the necessary bits in order to understand how to localise a Windows system. I covered what Language Packs, Language Experience Packs, Language Interface Packs and Features on Demand are. I took a couple of cheap shots at Microsoft by complaining how annoying the process is, but ended on a high note because they came through with huge improvements to the process in Windows 10 2004 onwards.

In this post I’ll discuss what those improvements are and what the process of localising a Windows 10 system in your ConfigMgr task sequence is now moving forward.

In summary of said improvements, instead of completely changing the system default language, we now have a distinction between a user default language and system default language – this negates the whole InstallLanguage issue (read my previous post if you don’t know what the InstallLanguage issue is).

Language Pack (LP), Language Experience Pack (LXP), Language Interface Pack (LIP) and Features on Demand (FoD). For simplicity I’m just going to use acronyms from here on out.

What changed?

Microsoft created a difference between system default language and user default language.

Here is the dism.exe /online /get-intl output after we have built a fr-fr system using en-us base install media with this “new” process in Windows 10 2004 or 20H2:

dism.exe /online /get-intl output in French

Here’s the translation of the above output:

Deployment Image Maintenance and Management Tool
Version: 10.0.19041.572

Image version: 10.0.19042.685

International settings report online.

System user interface default language: en-US
System locale: fr-FR

Default time zone: GMT Standard Time
Active keypad (s): 040c: 0000040c
Keyboard Layer Driver: Not Installed.

Installed language (s): en-US
Type: fully localized language.
Installed language (s): fr-FR
Type: partially localized language, MUI type.
Relief languages ​​en-US

The operation is a success.

We can see from the above output, this is the new distinction of user and system default languages on a system.

This means in our task sequence, after the Apply Operating System Image step, we can now install our language content (LP, LXP and FoD) and set the locale options to match that of the newly installed LP in the Apply Windows Settings step.

You’ll notice below I’m depending on the OSDWindowsSettings* task sequence variables, which are picked up by collection variables. This saves from needing multiple Apply Windows Settings steps.

Windows 10 20H2 task sequence, click to enlarge

So what? That’s not new! Correct, but what is new, is that previously, doing the above would have changed the system’s default language and the InstallLanguage key to French. This caused a problem when admins tried to later IPU or deploy feature updates to their Windows 10 devices in the language that was of the install media they used in their task sequences (in this scenario, English en-us).

Specifically, the issue they would have seen is a halted IPU / feature upgrade, with setupact.log and SetupDiag.exe complaining about:

Target language en-US is not compatible with the host language

This new change means we don’t have to do anything special or overly cumbersome in our task sequence! All we need is to specify the language we want in the Apply Windows Settings step. And more importantly, we can do so without worrying about it coming back to bite us later when you upgrade the system to a newer version of Windows 10.

I don’t know how much work the lucky people in the Windows team did behind the scenes in order to make this work, but if you think about what they’ve done, they’ve nailed it. They solved the problem by not giving us any special instructions to follow. We literally no longer need to do anything special in our builds, or arguably any different compared to the way we should have been doing in all along, and it just works.

The InstallLanguage issue is now no more:


Above is what HKLM:SYSTEM\CurrentControlSet\Control\Nls\Language looks like after building a Windows 10 2004 or 20H2 system and changing the user default language to French (fr-fr – 040c), not the system default language (en-us – 0409)!


Before we get started, I still recommend you create LXP and FoD repositories.

We’ll be using that content from those repositories in this task sequence to further localise and improve the user experience with Windows 10 in their preferred language.

As mentioned in my last blog post, LXPs “top up” translations in parts of the UI where LPs fall short and FoDs improve the user experience with Windows 10 features in their preferred language.

Both LXP and FoDs frequently receive translation improves because their updates come from the Microsoft Store.

LXPs are also how Microsoft reach their 110+ language support in Windows 10, while only offering 38 base language ISO install media.

To get started, install my PSCMWin10Language PowerShell module from the gallery and download the following ISO:

Microsoft Volume Licensing Service Center searching for language content

Note: yes you will be downloading content for 2004, even though we are building a 20H2 task seqeuence.

The above is a screenshot from the Visual Studio Subscription downloads portal and VLSC.

You’ll see what we can download ISOs containing just LXPs, which have a new and confusing naming convention of 9B, 9C, 10C and 11C.

It looks like this naming convention is relevant to a known issue with Windows 10 2004:

When servicing a Windows image with a cumulative monthly security update or public preview, the corresponding LXP ISO for that update needs to be downloaded and installed for the LXPs to work correctly. If this step is skipped, then the user may experience unexpected language fallback (e.g., see text in a language that they cannot understand) until they are able to update their LXP via the Microsoft Store. Note that LXPs cannot be updated until OOBE is completed (i.e., device has reached the Desktop) and the device has established internet connectivity.

To find the correct LXP ISO for your associated monthly quality update, look for the abbreviation of your update in the LXP ISO filename (e.g., 9B). If a quality update doesn’t have a corresponding LXP ISO, use the LXP ISO from the previous release.

Adding Local Experience Packs (LXPs) in Windows 10 version 2004 and later versions: Known issue

Thanks so much to @SCCM_Ryan for helping me by sharing the above info with me, and the screenshot from VLSC.

In any case, grab the one which reads just “Language Packs” because it contains LPs and LXPs:

Language Pack and Language Experience Pack ISO

You’ll also want to download the FoD ISO. You’ll only want Part 1, Part 2 contains retail demo stuff.

Features on Demand ISO

Now you have the ISOs downloaded and mounted, let’s use the PSCMWin10Language PowerShell module to create our folder structure for each language, ready to create Packages with in ConfigMgr.

I did write another blog post which covers how to use this module in a little more detail if you need it.

Install-Module "PSCMWin10Language" -Scope CurrentUser
Import-Module "PSCMWin10Language"
New-LPRepository -Language "fr-FR", "de-DE" -SourcePath "D:\x64\langpacks\" -TargetPath "G:\OSD\Windows10-1903-Languages\"
New-LXPRepository -Language "fr-FR", "de-DE" -SourcePath "D:\LocalExperiencePack" -TargetPath "G:\OSD\Windows10-1903-Languages\"
New-FoDLanguageFeaturesRepository -Language "fr-FR", "de-DE" -SourcePath "E:\" -TargetPath "G:\OSD\Windows10-1903-Languages\"
(click to enlarge)
(click to enlarge)
(click to enlarge)

Now you should have a nice folder structure ready for you to create your Packages with in ConfigMgr. Here’s a screenshot of how I organised my ConfigMgr Packages using the newly created folders made by PSCMWin10Language.

Note: PSCMWin10Language will not create these Packages for you.

Packages for Windows 10 2004 LP, LXP and FoD

One last thing we want to take care of are your collections. In the task sequence we’ll be using the OSDWindowsSettings* task sequence variables so we don’t have lots of Apply Windows Settings steps.

My OSD collections used here have these collection variables defined:

Windows 10 French OSD collection with collection variables

Using the OSDWindowsSettings* collection variables so they’re picked up in your task sequence is completely optional. If you you prefer, you can of course use your own conditions in your task sequence and have multiple Apply Windows Settings steps if you prefer, and for each of those Apply Windows Settings steps you would choose the language options from each dropdown.

Shut up and give me the task sequence

Download Exported Task Sequence

The Task Sequence was exported from a ConfigMgr 2010 environment.

This task sequence contains just enough to not only build a quick VM to demonstrate what I’ve discussing, but also it should be enough in order for you to glean the insight you need. Or to perhaps incorporate it into your own existing task sequence.


You will need to set the option to ignore dependencies, simply because the PackageID references in the task sequence would not resolve in your environment.

Set the Action to Ignore Depedency

Once imported, you will see that beyond the initial few steps of formatting the drive and applying the OS image, there’s nothing more complicated than the 3 steps for each language you want in your task sequence: installing the LP, LXP and FoD language content.

Steps in the task sequence which install the language content for fr-FR and de-DE

It’s these steps you will have to update to use the Packages you made in the previous section, from your environment.

You’ll notice the Apply Windows Settings step has the locale options set to Do not specify . This is by design because these are set on the fly by the OSDWindowsSettings* task sequence variables.

Poke around each step’s condition so you understand how the collection variables come in to play, as this is ultimately how you control which client installs which language during the task sequence.

After running the task sequence, the result on the device is that it will have a system default language of en-us, and a user default language of either fr-fr or de-de.

Trust but verify


There’s a slight issue here. I want to be able to verify we can successfully IPU or feature update a system using en-us media/content after building a French/German system following this process. But we can’t. Yet.

This new change to Windows was introduced in Windows 10 2004, and the latest version of Windows is 20H2. To upgrade 2004 to 20H2, we can only use the enablement package.

Therefore the moment Windows 10 21H1 comes out, we should all be testing we can upgrade IPU / feature update from 2004, with no InstallLanguage issue. In theory, the InstallLanguage is literally non-existent and we can see that now from looking at the registry of a 2004/20H2 system today.

Wrap up

I hope you found my content on localising Windows 10 helpful. I get a kick out of doing this for the community when I know I’ve helped someone. If you have any issues/questions, comment below or DM/tweet on Twitter @codaamok. Equally, if any of this helped, still let me know.

Further reading

85 Comments on “Multilingual Windows 10 20H2 OSD with ConfigMgr”

  1. This is a fantastic article, and I am interested in trying it, but I can’t seem to find the downloads for the language packs. How do you access them/where are they? We have an EA and I have access to MVLS/VLSC, but these don’t seem to be there. Where is your Visual Studio Subscriptions screenshot pointing to?

  2. Sorry, I think I asked the question incorrectly. I don’t have a Visual Studio subscription. The only thing I have access to is Volume licensing Service Center, but the LP’s are not there. What do I need to do to get access the LP’s for download? Where else can I get the LP’s? Thanks so much for the reply!

    1. I wish I could help you but I’ve never logged in to the volume licence portal before. I’ve never been “lucky” like that 😉 what if you just keyword searched “language” in there, do you see anything? Would be good if you did find it, and was able to share some screenshots I could include in this post – it could help others. No need to thank for replying 🙂

    2. Hi Ken,

      In VLSC under software look for “Windows 10 Language Packs”.

      Click the download button, select “MultiLanguage” in the Language drop down, then click continue. Then choose the correct Windows 10 version and “patch”.

      Example “Windows 10, version 2004 or 20H2 11C Local Experience Packs (LXPs) (released Dec 2020)” is the newest one right now for me.


  3. I have searched for “language” and all other possible alternatives. I found the older LP’s but nothing for newer way MSFT is doing things now. I will let you know what I find out. I’ve requested some help from our internal company MSFT account licensing manager.

  4. Adam,

    Excellent article! Thank you for posting this and your previous guidance. Both have been a huge time saver for us. The improvements in LP and InstallLanguage you noted in this article have not been well publicized from MS. If I missed the announcement, it was not for lack of trying.

    Decoder ring for the 3 character string for the LPX – the numerical characters are month of release. Note the known issue statement from MS on 2004 release:

    Based on this linked article, the LXP may be rolled back after a monthly update. What i am hearing from that statement, MS is directing installation LXP, then follow up with installation of LCU. Each month after LCU, the LXP needs to be updated as well.

    I am curious to hear your thoughts on LXP/LCU timing.


    1. Hi Rick! Thank you for the kind words!!

      That known issue you’re referring to is only for offline servicing a Windows image (aka “slip streaming” or “injecting” updates into a .wim). Not about live systems receiving Windows updates on a monthly basis.

      I think the problem they’re trying to solve is problems in translations around the UI caused by installing RTM versions of LXP. I have an example of that with a screenshot in my other post showing issues with the en-gb LXP immediately after OSD. It was only resolved by installing updates for LXP after OSD from the Store. It looks like they’re providing a fix here for people who need to offline service this Windows images: to install the latest LXP content first before LCU.

      I hope this helps. If you’re interested in learning more about offline Windows servicing, there is functionality built in to the ConfigMgr console to do this, but there’s a community made tool to automate this further with PowerShell:


  5. To SCCM_Ryan. Thank you very very very much! I see them now! I wasn’t going quite far enough. The descriptions were misleading and I didn’t see Multilanguage. A couple other silly things I didn’t catch on to. Excellent suggestion!

    1. @ Ken,

      Yeah, I’ve struggled enough with that to now know where to look, but they kind of hide it if you don’t know what you’re looking for…

  6. SCCM_Ryan…maybe just one more thing if you know. I see 9B, 9C, 10C etc. for the LXP’s. How do I know which one? I’m running 20H2 (OS Build 19042.804) at the moment. This is after a few monthly updates.

    1. The # references the monthly patch, so 9 = September, the letter is the patch type. B= Cumulative Update C = Cumulative Update PREVIEW.

      According to the Known Issues link ( you should try and match the LPX Patch with your WIMs Patch Level if servicing the WIM to avoid issues.

      I Believe if you’re just installing the LPXs and such in the TS like in Adams post it shouldn’t matter and I would just use the newest one. If you’re applying LCUs at the end of your TS I think it would sort out any conflicts you might have anyways…

      This is all just just theory since i haven’t had the chance to test myself yet (in progress right now).


  7. Hello, I spent almost all Saturday to study how to install languages in 20H2 with TS.
    I read you article with 2004 and now this updated with 20H2. Both of them are really nice and help me understend more the entire process

    Anyway, I am missing here one important think. In 2004 you did installation and also you have to apply LPX with local user.
    Here in this article you do not do that anymore.

    So I am now confused. Is this step still required?

    1. Hey Pavel! I’m glad you found them useful 🙂
      No, you don’t need to install LXP as a local user anymore (when using that minging control.exe “hack”). Installing as a regular step like I’ve shown in screenshots in this article is all you need now in Win 10 2004+ 🙂
      You can download, import and look at the TS referenced in the screenshots in this article to get a better insight on how it comes together.
      Hope this helps

  8. Hi, thanks for the update. I just have an issue, that all the Windows Store Apps (and the Store) is still english.
    So for example Alarms & Clocks or Calculator. Paint is localized correctly though.
    Any idea why?
    Thank you.

    1. Hey Dieter, what does it look like after you kick off all available updates from the Microsoft Store? I assume you’re installing the needed LXP, too, during OSD in your task sequence?

      1. Well, we have the store disabled via GPO, so I cannot actually update in the store. Yes I am installing LXP too. I just used the 1C LXP with the Feb. Win 10 Enterprise ISO.

        1. Hi Dieter, that will be your problem. Store apps update via the Store, and LXP RTM (aka out of the box, i.e. immediately after OSD) doesn’t fully localise Store apps, inc the Store itself. Updating these apps improves localisation after OSD, too. I talk about this in my other blog post which I linked in this post, definitely give it a read. It might explain it more clearly than I just have now. Read the section with the heading “Language Experience Packs”.

          1. Hey Adam, thanks for the quick reply. Well so basically I am stuck with either english apps or enabling the store then 🙁 Thank you Microsoft

          2. No worries, glad I can help. I highly recommend you revisit any objections you have with the Store. If you want to control what apps from the Store your users can use/see/install, consider Microsoft Store for Business.

    1. Hey Dieter. I guess it’s all relative. To me, localisation is absolutely ideal there because the intention here is to completely translate the entire system to another language, away from the base language from the install media. If you want partial translations, where the majority or most important parts of the UI are localised only, but the other “bits” kept as English (or whatever language the install media is), then installing only LXPs, and not LPs, might be ideal for you. 🙂

  9. Hi Adam,
    Thanks for the great write-up. I have a lot of systems that I am looking to upgrade to 20H2 worldwide and was trying to figure all of this out. So you are going from a bare metal type install. What about in place upgrades? I am using a TS to deploy the upgrade for customization options. Is there a way to update the languages during IPU? Any suggestions/links on this?


    1. Hey Clyde,

      Unfortunately it’s a little tricky to preserve language content on devices through IPU task sequence. It’s not impossible, it’s just much more involved.

      If you’re able to get your devices to use Windows Update for Business and use Feature Updates, instead of IPU task sequence with ConfigMgr, that is by far the simplest solution – language content is preserved during Windows 10 upgrades via WUfB.

      On-prem admins that depend on IPU task sequences with ConfigMgr have been promised for years for a technology called Unified Update Platform on-prem, but it’s long overdue. UUP is leveraged in WUfB. UUP is the technology for Microsoft that brings the benefit of preserving language content through upgrades.

      If you’re confined to task sequences, in a rough overview of the steps you need in your TS: upgrade Windows, install needed language content, apply latest CU, set user language list and set user’s display language. I’ve written ugly scripts before which involved CIs to dynamically determine and pre cache devices with their currently installed language packs, to install them immediately after upgrading Windows during IPU. So trust me when I say this, that it really is much more involved and you really should consider WUfB – it just works.

      I hope this helps. Not the answer you wanted I know.

  10. Thanks for the info Adam. So I dont see us being able to move to WUfB anytime soon. I am a team of 1 right now trying to clean up from a previous admin.

    So I tried a modification of what you are doing to install the LP, FXP, and FoD content during the upgrade process. I have collections created looking at the MUILanguages of the OS and assigning collection variables for language (MUILanguages contains “%de-de%”). I want to use WMI queries in the TS steps so it doesn’t require HW inventory to work, but that was not working as expected and ran out of time. I then extracted your steps for languages from your sample TS, converted the commands to PoSh, and deployed a test machine. It installed the update and the languages correctly, and since the machine was already set with localization, I’m hoping it worked correctly. I stuck with an easy one to start with (en-GB) so I can still read it. The localization from what I can see still seemed to be intact. Do you think this is working as expected, or am I missing something?

    I am going to find someone to help me test some other languages tomorrow, but wanted to see if I am completely off with all of this.

    Thanks for all your help,

    1. That sounds like a reasonable flow to me.

      The only thing I can think of that you might run in to: you might see your devices not display the intended language after the IPU task sequence, despite installing all of the language content. It might display the system default language / that of the base install media. You may also not see the newly installed languages in the “Windows display language” dropdown within Settings > Time & Language > Language.

      At this point you would need to use the cmdlets Set-WinUserLanguageList and Set-WinUILanguageOverride. The former populates the aforementioned dropdown with new languages and the latter changes the user’s display language (requires log off and signing back in again). The catch here is that these cmdlets must run as the user once they’re logged in. In my previous hacky attempts I used the RunOnce registry keys under HKCU to run some code to do this, in hindsight maybe I should have just used a scheduled task or something – might have been easier.

      I for sure know the feeling of being the only one and cleaning up mess. My opinion is that time spent on switching your clients to using WUfB is more valuable in the long run, but I appreciate you have the better judgement on your environment and business needs/restrictions compared to a rando on the Internet.

      Hope this helps.

  11. Thank you very much Adam for putting this together in a way that so easy to understand and follow. I have been struggled for a long time in getting these LP, LXP, and FoD to properly installed and configured in OSD task sequence.

    I have a question though, I thought the end result for the “Default system UI language” should reflect the newly added language. In my case I added fr-CA and hoping to see

    Default system UI language: fr-Ca

    But it shows up as en-US

    I think this may contribute to another issue that I’m seeing now on the French imaged computer, the built-in groups are in English instead of French. What do you see on your computer that has different language applied?

    i.e. for the local User and Groups

    Administrators should be Administrateurs

    I can confirmed that with Windows 10 1809, it shows up with French language for all the local group name.

    Any ideas to collect this issue?

    Thank you, Bob

    1. Hey Bob, someone has mentioned this to me before, specifically about fr-CA. I was hoping this doc by Microsoft would clarify which base language is needed in order to reach fr-CA but unfortunately it doesn’t. If I were to guess, the base language to reach fr-CA might be fr-FR and not en-US. The issue with that is it makes the idea of using only one base language (en-US) in your task sequence impossible. Let me test this in a lab and I’ll reply later on today – I’ll use fr-FR base media and install fr-CA content. When I test, I won’t be able to recognise parts of UI to definitively identify a system as fr-CA so I’ll just be working off of the value from dism like you did.

    2. Hey Bob, I thought I would build a VM in the same way you said you did, just to see what you described. I think you might be missing something in your task sequence. Here is what I see when I use en-us ISO media for Windows 10 20H2 and apply fr-CA LP, LXP and FoD in the way I described in the post. Everything looked translated to French throughout the entire UI. dism does show Default system UI language to be en-US but that’s what we want because that’s the new improvement that came in Windows 10 2004 to mitigate the InstallLanguage issue. Let me know if I’m missing something? It’s possible I misunderstood.

      1. Hi Adam,

        Thank you for doing the testing for me. I like your result because everything in the built-in groups are in French. However, somehow my results are still in English and I thought the “Default system UI language” has something to do with but obviously not because your has the same setting as mine: “en-US”. Do you know what I may have done incorrectly? I want to get the same result as yours. Below is a screenshot of what I see:

        Thank you Bob

        1. Hey Bob,

          I exported my task sequence for you so you can see what I did. You can download that here. The link survives a week and requires a password, I’ve emailed you the password – probably overcautious but /shrug.

          In your task sequence, I would just make sure you’re setting the OSDWindowsSettings* task sequence variables correctly and that en-US isn’t creeping in anywhere unexpectedly. Make sure they’re all set to fr-CA. Note that these task sequence variables aren’t necessary, you can just set the dropdown options for language in the Apply Windows settings step. However if you do both, I’m not 100% sure which take precedence. You can read more about the task sequence variables here.

          If that looks good, then I would ask when are you installing the latest cumulative update in your task sequence (if at all)? These should be installed after installing language content. If you aren’t installing updates in your task sequence, can you just manually patch your test VM after OSD and see if the group names then become translated?

          I hope this helps.

  12. I’m having a similar issue as Ken where I am not finding the current language packs. I don’t have a Visual Studio subscription, but I do have access to VLSC. On searching for and selecting “Windows 10 Language Packs”, I do not have “Multilanguage” to choose from. I do have a list of several language, all leading to the older 2015 version LP. I feel like I have been running circles on this for days.

    1. Hey Sean,

      I’m seeing the same thing. I’ve seen this in the past as well.
      If I had to guess they might be servicing the WIM and so its down.

      You would think it would be a “leave it up until the new one is ready” but I think I’ve read that its multiple teams that run this site so not everything runs perfectly

      I would just keep checking and it will magically show up.

      I’ve also seen where the new windows WIMs are available but the FOD and other supplemental WIMs don’t make it out as fast which delays testing them.

  13. Hi Adam,

    Excellent article! However the MultiLanguage ISO for Windows 10 2004/20H2 isn’t available anymore on VLSC ( and I don’t have access to the Visual Studio Subscriptions downloads page.

    Do you have any idea why it isn’t available anymore? Is it still available on the Visual Studio Subscriptions downloads page? I would like to grab the Language Packs (LP cabs).


    1. Hey Yannick, take a look at Ryan’s latest reply to Sean. In summary: apparently it’s normal for content to sometimes disappear from VLSC for a short while.

  14. First of all, thank you for these great articles.
    I run this your TS from the 1909 and 20H2 Software center and then received error:
    Failed to read installation type from environment.. Please ensure you are running this executable inside a properly configured OS Deployment task sequence
    Could you please assist with this case?
    How I should apply language for existing 20H2? In-place from 1909/1903/2004 or just install from scratch using your TS?
    But if we’ll deploy for Unknown collection, how Unknown computer will receive correct Language?
    Sorry for question. Maybe it’ll be a little dumb for you. I’m new gay in MECM.
    But, anyway. Please explain me. Maybe I’ll repeat again to be more clear.
    If your TS for already machines with 20H2(2004) Windows version why we need apply operating system image? If your TS for clean machines, how these machines will included to necassary group like “OSD – Windows 10 20H2 – fr-fr”? May I use it for in-place upgrade? If yes, after that step I should add it?

    1. Tried to create application from the post “Deploy languages via Software Center with PSCMWin10Language”.
      It works perfecly fine. Thank you for your efforts.
      But I still have a questions:
      How to apply language for the machine during clean install or in-place upgrade.
      How to apply language for the machine, not for an user. I see english date and time before login.

    2. Hey AVP.Riga. I really appreciate your kind words and taking the time to read my posts. Thank you!

      I’m struggling with your questions mainly for two reasons: 1) they are off-topic from my post – I discuss solely bare metal OSD, not IPU and 2) you have so many questions. If you can, ask fewer questions and more concisely. I can’t possibly answer all of your questions and give you an end-to-end course in a blog post reply.

      I recommend you join the WinAdmins Discord and jump in the #configmgr channel, there’s so many helpful people on that server who will no doubt be able to help you. Platforms like that are better for free flowing conversations like this one could be.

      Just to reiterate what this post is: it explains how to bare metal OSD Windows 10 to another language that is not the same as the install media. It enables you to (ideally) use 1 OS media in your task sequence, and dynamically change the language in the task sequence on the fly using supplemented content (LP, LXP and FoDs etc). It is definitely not a guide for IPU, that comes with its own requirements and challenges. The task sequence and methods I discuss in this post are especially not intended to be launched from the Software Center while in full OS – you need to get to WinPE to do a lot of the stuff in the task sequence I shared without modifying it too much.

      1. Thank you and sorry for the mess!
        Maybe because it so confuses me, LP, LXO, FoDs… instead old good DISM.
        But your answer like a lighthouse in the fog for me.
        How TS detects which language must be if device is bare metal and included only in All Unknown Computers?

        1. That’s a great question! I honestly have not supported an environment with OSD’ing unknown computers before. However here’s an idea: you can define task sequence variables in a Powershell script early in your task sequence. Perhaps the script did the logic of trying to determine which language to install based on some arbitrary factors, e.g. subnet or something? The examples I’ve given in my last two posts on this largely revolve around using collection variables.

  15. Hi Adam,
    Finding your blog has been so helpful, so much clearer than Microsoft’s official documentation!
    This week i started working on a 20h2 Task sequence, and used your modules, and created packages, and deployments from your other posts, all have been great.

    But now i have a weird issue! During my OSD baremetal deployment, using your template for the LXP/FoD in my TS, i get the error Task Sequence has failed with the error 0x80070002 when it tries to run either the LXP or FoD powershell command. The LP DISM works great.
    – I created the respositories and packages as per your post
    – I am using a bootable media iso (dunno if that matters at this point?)
    – I have updated the command to point to
    – I checked and the package is copied to my VM’s C:_SMSTaskSequence\Package folder during the deployment, and the file are all there, so i know it is not network related
    I removed the conditions, so it would preinstall everything needed as we are in a Domain environment, with the Store blocked, i want my users to have the choice if they want En-US or Fr-CA interfaces. Any suggestions on what am i missing?

    1. Hey Michael, I appreciate the kind words!

      0x80070002 resolves to a “file not found” error. I would double check the files exist in your LXP/FoD packages and that they’re in the expected locations on disk in which the command line steps to install them is referencing them. i.e. maybe your Packages contains a sub folder with everything in them, thus the install steps can’t find the files.

    2. You might get this error if the Powershell module isn’t enabled in the boot image. It’s powershell it can’t find and not the language pack. 🙂

        1. Great article too Adam. Language packs are extremely confusing. I’m so glad I found your post. Thanks a lot.

  16. Hi Adam, thank you so much for running this blog. I find it very helpful and was able to solve my the language issue in my SCCM task sequence now. Keep up the good work, it’s very appreciated!!!

    Regards, Bob

  17. Good day,
    First of all thank you for such a awesome job.
    But I meat new difficulties. During TS I received this error:

    dism.exe /Image:”%OSDTargetSystemDrive%\” /ScratchDir:%OSDTargetSystemDrive%\Windows\Temp /Add-Package /PackagePath:”.\”
    The task sequence execution engine failed executing the action (DE-DE – Install LP) in the group (DE-DE – 2004 + 20H2) with the error code 87.

    I tired to do it by hands after TS in same machine and I received error:
    dism.exe /Image:”C:\” /ScratchDir:C:\Windows\Temp /Add-Package /PackagePath:”.\”
    Error 87 the Parameter is Incorrect” (/Image)

    1. In case anyone comes across this in future, AVP.Riga came on Discord and we helped him out. We removed the quotes around the /Image parameter value and used colon instead of equals symbol for the /PackagePath parameter.

      1. Thank you one more time! It works! If someone will have this issue please make sure that Multi Language steps are located right after Apply Operating System Image and LP command line looks like ” dism.exe /Image:%OSDTargetSystemDrive%\ /ScratchDir:%OSDTargetSystemDrive%\Windows\Temp /Add-Package /PackagePath:”.\” “

  18. Hi Adam,

    Can you provide more detail on your collection concept? I understand using the variables, but can’t quite grasp how you are using collections for the different languages. We currently only deploy our OSD task sequences to the Unknown Computer collection. I’m trying to understand if we decide to use this new method for installing languages if we need to change our setup. We have MDT integrated and are using the UDI Wizard designer for optional applications which also use collection variables.

    Maybe I’m missing the obvious. Is it as simple as having a collection per language with the language collection variables set and deploy the task sequence to all language collections?


    1. Hi Kim, sure. Yes, you got it. I have a collection with the OSDWindowsSettings* task sequence variables defined:

      You don’t have to use this, you could curate your own logic within your task sequence to define these variables. Alternatively you could define your own conditions for x many “Apply Windows Settings” steps (where x is the number of languages that are in your task sequence).

    1. Direct membership. This probably doesn’t help your scenario of deploying to unknown computers, but it’s not impossible, it just means you need to determine and define your task sequence variables on the fly within the task sequence.

  19. I can’t seem to change the system default UI language to change. Is that something that can’t be done automatically?

    Here is an export of the system information:

    C:\WINDOWS\system32>dism /online /get-intl

    Deployment Image Servicing and Management tool
    Version: 10.0.18362.1379

    Image Version: 10.0.18363.1556

    Reporting online international settings.

    Default system UI language : en-US
    System locale : es-CL
    Default time zone : Pacific SA Standard Time
    Active keyboard(s) : 340a:0000080a
    Keyboard layered driver : Not installed.

    Installed language(s): en-US
    Type : Fully localized language.
    Installed language(s): es-ES
    Type : Partially localized language, MUI Type.
    Fallback Language en-US

    The operation completed successfully.

    Can’t get the Default System UI language to change to es-CL after imaging through SCCM OSD Task sequence.

    1. Hi Tom, a few questions:
      – What is the language of your ISO media?
      – What language do you see on the system when you log in? Presumably English
      – What LPs and LXPs are you using in your task sequence?
      – What are you setting in the Apply Windows Settings step, or, what OSDWindowsSettings* task sequence variables are you defining?
      Please try to answer all questions. Something which could be tricky here is that Microsoft does not document what the base OS language needs to be for es-CL. It’s not even listed here. In fact, if I download the ISOs for languages, I not see an LXP or LP for es-CL at all, only Spanish and Spanish Mexican.

  20. Hi Adam,
    The language of the ISO media is the US English iso I grab from volume license. In Language settings, the Windows Display Language would show as English (United States), but the preferred languages it would show Espanol (chile), Under the Region section it would show “Chile”, and regional format it would show Spanish (Chile), so the Apply Windows Settings does seem to set most of item under the language sections. I selected Spanish (Chile) or tried Spanish(Argentina) as well but all give same result. It just doesn’t change the Windows UI or system UI to Spanish for some reason. Yeah, it doesn’t provide a es-CL or any sub region like Argentina, Colombia,etc. I’m guessing they are using the es-es in the display language.

  21. Hello, Firstly, thank you vers much for the post that i really appreciate ! Everything was clearly explained.

    I got an issue on the TS when trying to install the LXP using the same command as you.

    I’ve got the following :

    Add-AppxProvisionedPackage : the offline image specifid is the running system. The macro DISM_ONLINE_IMAGE must be used instead.
    I’ve also tryed with dism but it’s not working too.

    Do you have any suggestion ?

    Edit : I think I got this issue because I’m installing the LP, LXP and FOD when I’m already in the Windows 10 system and not inside de Win PE environnement.


  22. Worked perfectly for my bare metal OSD.

    What is the best method for already imaged en-US clients that we want to add a language pack too? Say we want to add Spanish es-ES ‘LP’ and ‘LXP’ to a plain en-US machine, whats the best way to setup a task sequence for that to have available to our users in Software Center?

  23. First of all great article thanks for putting this together. I am having a strange issue with this though. I’m putting together our 20H2 bare metal build and testing it with a hyper-v test VM. When these language steps are included the build will fail to install our Universal print drivers further down the TS due to the print spooler being unable to start. If I launch command prompt during build I can see with sc query that spooler is stopped and if I start it will start then stop again. Without the language steps the print spooler starts normally, the UPDs installs and the build completes successfully. I’m continuing to troubleshoot but I am not understanding the link here!

    1. Hi Rich, thanks for your kind words! That is a bizarre link there, I can’t possibly imagine why there would be a link. Before you said removing the language steps resolves the issue, I was inclined to think maybe patching the OS install media or maybe checking if the device has domain joined at that point and you have a group policy disabling the service (given recent printer spooler CVE antics). Would you be up for exporting your task sequence (without content / packages) so I can take a look at the steps?

      1. Hi Adam, just as a follow up in case other people end up here from a web search. I’ve had a case open with Premier support for some time and it looks like the latest 20H2 isos (June and July 21) from VLSC that include PrintNightmare mitigation are causing issues. As of right now August 21 ISO is not available but I’ve tested with July 21 iso and then serviced with August 21 LCU. I did a lot more testing with this and found that the issue is only when DISM is used to install the client language pack, the FOD and LXP installs don’t affect it. Also there doesn’t even need to be a print driver installation for the spooler to fail, I can press F8 during the build and see the spooler crashing in event viewer from the very first boot at the Setup Windows and ConfigMgr step. It only gets fixed when I log into Windows post-build and either wait some time or then do another reboot and it then fixes itself, remains stable and I can install print drivers. The specific issue seems to be an access/permission violation when the LP is trying to update the Spooler component which ends up breaking it. When I switch to using the 20H2 Nov 20 ISO the LP installs and spooler is OK. I’m just waiting on a permanent solution from MS now!

        1. Hi Rich,
          Can you please more about the solution if you got one from MSFT? We have same issue and trying to get some resolution
          Thanks in advance

  24. Hey Adman,
    firstly Thanks for this blog it now makes things more clear.
    Wanted o understand how does the upgrade work if the Base OS is installed with English and then we have installed language pack
    Then during the upgrade do we install the english langauge and then install the langage pack?
    Please can you share some details

    1. Yes, that’s the premise of the improvements introduced in Windows 10 2004 onwards – upgrade using the original OS install media.

      Unfortunately, feature upgrading Windows 10 using ConfigMgr feature updates or IPU task sequences means installed languages are not preserved through to the new version. To reinstall languages after installing a Windows 10 feature update, you need to look at using Windows Update for Business.

      If you’re able to get your devices to use Windows Update for Business and use Feature Updates, instead of IPU task sequence with ConfigMgr, that is by far the simplest solution – language content is preserved during Windows 10 upgrades via WUfB.

      On-prem admins that depend on IPU task sequences with ConfigMgr have been promised for years for a technology called Unified Update Platform on-prem, but it’s long overdue. UUP is leveraged in WUfB. UUP is the technology for Microsoft that brings the benefit of preserving language content through upgrades.

      If you’re confined to task sequences, in a rough overview of the steps you need in your TS: upgrade Windows, install needed language content, apply latest CU, set user language list and set user’s display language. I’ve written ugly scripts before which involved CIs to dynamically determine and pre cache devices with their currently installed language packs, to install them immediately after upgrading Windows during IPU. So trust me when I say this, that it really is much more involved and you really should consider WUfB – it just works.

  25. Cheers Adam! Important to highlights that in VLC you need to change the ‘language’ dropdown to be ‘MultiLanguage’ (as per your screenshot) and not ‘english’ or ‘english international’ otherwise you only seen 1507 language packs

  26. This is great stuff Adam.
    This is my first time having to ever add language to my deployment.. so thank you.

    I do have a question though. I am using the en-us media, and we are setting it up to be fr-ca.
    All of this works by adding the LP and setting the windows settings to all be fr-ca.
    My issue is when the machine boots up, the en-us keyboard is default, but I do see the other french Canadian keyboards.. is it supposed to default to en-us?

      1. Hi Adam,

        I re-read that comment, but I am not seeing what the solution was, or the reference with default keyboard.

        Everything (exception to PowerShell output of the dism command) is in fr-ca. It is exactly what I was expecting.. and even though the french-canadian keyboard layout is applied and I can see them and select them, the experience of logging in for the first time and having an English US keyboard as the default is weird for me.

        Is the keyboard supposed to be set to the defined language chosen?
        I feel like I am almost there, I am just missing the french Canadian default keyboard layout.

        What I have read on the web, is my settings should be applied.. so I am going to see if there is a script I can run after the LP is applied to ensure the keyboard is french-Canadian.

  27. Hi, i get the error “Add-AppxProvisionedPackage : the term is not recognized name of cmdlet, function etc.. what could that be? the task is running right after “Apply Operating system” in the task sequence

  28. Just a note that Microsoft’s naming convention for their Font Cab file is different so PSCMWin10Language won’t grab the font file out of the FOD disc.

  29. Could we get updated article for Windows 11? 🙂 There seems to be multiple changes in language packs compared to W10.

  30. Great article.
    I have 2 questions:
    – Could we get an updated article for Windows 10 21H2?
    – Did you try the update from on older version (1909 or 2004) to 21H1?

  31. Hi Adam – thanks for the great effort and article !
    Maybe to mention that using english base and adding other languages there are also language specific fod’s for paint, wordpad etc. which might also be added too.
    And as I had been using 20H2 en base, so after adding german, italian, french languages I had to apply SSU and then latest CU or the system got weird behavior in operation.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.