These past few days, I’ve shared some scripts and tricks on how you can create a Windows 10 reference image. Next up is how to add Language Packs to your reference image. Over the years, I’ve worked with customers that have the need for adding Language Packs into their deployment process. Dealing with Language Packs in MDT, essentially adding them to your reference image, is a process that’s not very well documented. I’ve seen many examples of using for instance dism.exe, lpksetup.exe and other methods. They all may do the trick, but since MDT has built-in support for adding Language Packs to the reference image, I always tend to use that.

In this post, I’ll show you how to add Language Packs in your Windows 10 reference image by using MDT 2013 Update 2. I will also cover some bits of what’s going on under the hood regarding how MDT is applying the Language Pack, since it’s not really documented well.

NOTE! If you’re using MDT 2013 U1 (even the re-released version), you should install Update 2 and update your deployment share, since Update 2 contains fixes to a bug regarding Language Packs in Windows 10. You do not have to re-create your Task Sequence since the client.xml file have not been updated.

Obtaining Language Packs

Language Packs are available for each Current Branch release of Windows 10. The most recent version as to date is 1511. So if you’re creating a Windows 10 1511 reference image, you should look for the corresponding Language Packs. For volume licensed customers, you have access to download a bundle of all available Language Packs for Windows 10 through the Volume Licensing Service Center. OEMs can download Language Packs from the OEM Partner portal. Once you have obtained the Language Packs, simply extract the ones you need and save them on your MDT Build server for import into your Deployment Share.

Import Language Packs as Packages in MDT

Once you have extracted the desired Language Packs that you need, and placed them on your MDT Build server, you can go ahead and import them into your Deployment Share. This process is the same as any other process of importing Applications, Operating Systems etc in MDT. In the picture below, I’ve extracted the Swedish and Norwegian Language Packs, which I’ll be using through out this post.

1. Open Deployment WorkBench and expand your Deployment Share.
2. I recommend that you create a folder under the Packages node, called e.g. Windows 10 Enterprise x64. With that folder created, right click on the newly created folder under Packages and select Import OS Package.
3. Browse to the folder where you’ve extracted the Language Packs and click Next.
4. On the Summary and Confirmation pages, click Next and Finish.
5. Once imported, you should now see your Language Packs in the WorkBench under the folder called Windows 10 Enterprise x64.

With that completed, there’s no more to in terms of importing the Packages. Except for one small thing, that could be proven useful if you want to automate the selection of Language Packs during the Deployment Wizard by leveraging the Rules for your Deployment Share. Each of the imported Language Packs have been given an unique ID, also known as GUID. To locate the GUID of each Language Pack, either expand the columns to show the GUID:

Or open up the Properties of each Language Pack, to give you the ability to copy the GUID, like shown below:

Control what Language Packs should be installed

We have several options to control what Language Packs to install. One of them is the manual way, by simply select the desired Language Packs during the Deployment Wizard. Another is to leverage the Rules of the Deployment Share to dynamically install Language Packs based upon various variable values. Either way, whatever option you end up choosing, you should be familiar with two built-in MDT variables that comes into play when dealing with Language Packs. They are:

  • SkipPackageDisplay
  • LanguagePacks (property array)

The SkipPackageDisplay variable can be set to either YES or NO, and will control whether or not any Packages Deployment Wizard pages are shown in the Deployment Wizard, like in the screenshot below:

If we were to dynamically select for instance the only the Swedish Language Pack when building a reference image on a specific machine, we can control that with the Rules by looking for a particular MAC address. See the Rules example  below:

Priority=MacAddress, Default


In the example above, we say that the Swedish Language Pack (with the GUID taken from the Language Package properties), should be installed on a machine with the MAC address of 00:15:5D:85:6B:00. When running the Deployment Wizard for that particular system, it will look like below:

To skip this page in the wizard, ultimately not showing any of the Deployment Wizard pages, change the SkipPackageDisplay property to YES. On a final note on how to control what Language Packs to install in your reference image, remember that the LanguagePacks property is a sort of an array. You can specify multiple Language Packs by incrementing the trailing number, like in the following example:

Priority=MacAddress, Default


That’s everything you need to do, select a method of selecting what Language Packs to install and MDT will take care of the rest.

What’s happening behind the scenes

For advanced users, and also the curious ones (like me), I wanted to give you an overview of what’s going on behind the scenes after a Language Pack have been selected for installation. In your Task Sequence, under the Preinstall phase, there’s a step called Apply Patches. This step is eventually a script (like most of MDT, which is pretty cool) called ZTIPatches.wsf that takes care of imported OS packages (Language Packs, Hotfixes etc).

To explore what’s going a bit more, I’ve added a suspend step by calling the LTISuspend.wsf script in the State Restore phase. At this point, I’ve kicked off a reference image creation process, selected the Swedish Language Pack to be installed and have suspended the deployment right before the machine will get syspreped. If I open up Windows Explorer and go to C:\MININT\SMSOSD\OSDLOGS there’s a log file called ZTIPatches.log, created by the Apply Patches step in the Preinstall phase of my deployment.

In that file, we can examine what has happened in terms of installing our Language Pack. As we can see, it’s actually not installing anything, while instead it’s amending the unattend.xml file with a servicing section that holds a package.

With that knowledge, we can dig deeper and have a look at the unattend.xml that have been used during this deployment. Browse to C:\MININT and open up the unattend.xml file.

In order to get a better viewing experience while reading the XML file, I suggest that you open up the file by using Windows System Image Manager from Windows ADK. As we can see in the screenshot below, at the bottom of the different phases, there’s a Packages section containing information about the select Language Pack:

This is how MDT is in fact telling the deployment process to install the desired Language Pack.

Verify that your Language Pack have been installed

Once your reference image creation process has completed, you can start up the machine again and log back on.

1. Open the Control Panel and go to Clock, Language and Region.
2. Click on Languages.
3. Select options next to e.g. Swedish.
4. Under Windows display language, it should say whether a Language Pack for the select language is available and give you options to make it the primary language or to uninstall it.

That should cover it about how to add a Language Pack to your Windows 10 reference image. As usual, if you have any questions, write a comment in the section below.



Nickolaj Andersen

Principal Consultant and Enterprise Mobility MVP since 2016. Nickolaj has been in the IT industry for the past 10 years specializing in Enterprise Mobility and Security, Windows devices and deployments including automation. Currently working for TrueSec as a Principal Consultant. Awarded as PowerShell Hero in 2015 by the community for his script and tools contributions. Creator of ConfigMgr Prerequisites Tool, ConfigMgr OSD FrontEnd, ConfigMgr WebService to name a few. Frequent speaker at conferences and user groups.

  • Alslinet
    Posted at 08:45 March 3, 2016

    Also, remember that Cortana, OCR, Text-to-speech translations/ language features are separate from the language pack

    • Nickolaj
      Posted at 08:48 March 3, 2016

      Great additional information, thanks Vegard!

      • Toaha
        Posted at 15:09 December 14, 2017

        Can we make Language pack primary with some script. So that users dont have to do it manually.

  • Jesper
    Posted at 15:43 March 7, 2016

    Thanks for the post. Great stuff!
    Any ideas on how to make that installed language pack the default UI during OSD?

  • Michael
    Posted at 15:34 April 20, 2016

    the Windows where I can select the language will not Display. Try all what you have done. when I add the LanguagePacks Setting to the CustomSettings.ini file it will installed but I can not devide between Windows 7 and Windows 10 Installation. Any Idea?

  • Ani_Admin
    Posted at 15:49 July 6, 2016

    i want to install language pack manually but even after using the variable, i am not getting the language pack selection screen could you tell me how to set this variables

  • Vincent
    Posted at 21:39 August 3, 2016


    Thank you for this tutorial.

    I want to automatically include a language pack to my reference image using MDT2013 but without displaying any choice during the initial install.

    Any clue?

  • Jonathan Conway
    Posted at 13:33 August 5, 2016
    Jonathan Conway

    Following this tutorial I end up with my deployment halting on a screen saying “Hi there, Lets get a few basic things out of the way” which then needs me to choose the default language (out of the languages I have installed as per the steps in your article) and click next before the TS proceeds.

    Any ideas on how to skip this screen automatically?

    • Patrick
      Posted at 22:16 September 14, 2016

      Hi Jonathan, you had to specifiy the settings into the unattend.xml file.
      Important thing is to set it into the oobe and the specilized phase.

  • stu
    Posted at 04:39 February 23, 2017

    Great post!

    Question – any idea on how to force the primary language?

  • or
    Posted at 15:53 February 22, 2018

    great post.
    very helpfull.

  • Edy WErder
    Posted at 12:51 April 4, 2018
    Edy WErder


    In my MDT the window the PackageDisplay window doesn’t show up. Even though I have specified in rules.ini SkipPackageDisplay=NO

    Any idea why it is not showing?


    • Nickolaj Andersen
      Posted at 11:23 August 23, 2018
      Nickolaj Andersen

      Hi Edy,

      The Language Pack cab files need to match the selected OS image for the task sequence that will run, in terms of build version. So if the task sequence will deploy Windows 10 1803, the Language Pack selection in the wizard will only be shown when there’s matching Language Packs for that build in the selection profile.


  • Leave a Reply

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