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.
187_7

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.
187_8
3. Browse to the folder where you’ve extracted the Language Packs and click Next.
187_9
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.
187_10

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:
187_11

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

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:
187_13

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:

[Settings]
Priority=MacAddress, Default
Properties=MyCustomProperty

[00:15:5D:85:6B:00]
SkipPackageDisplay=NO
LanguagePacks001={94419870-8d3b-4bcf-96a4-9aa562891dec}

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:
187_14

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:

[Settings]
Priority=MacAddress, Default
Properties=MyCustomProperty

[00:15:5D:85:6B:00]
SkipPackageDisplay=YES
LanguagePacks001={94419870-8d3b-4bcf-96a4-9aa562891dec}
LanguagePacks002={435d07a1-3384-4691-8c62-cb227db67c8b}

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).
187_15

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.
187_1

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.
187_3

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.
187_2

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:
187_4

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.
187_6
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.
187_5

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.

 

(16640)

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.

comments
  • Alslinet
    Posted at 08:45 March 3, 2016
    Alslinet
    Reply
    Author

    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
      Nickolaj
      Reply
      Author

      Great additional information, thanks Vegard!

      • Toaha
        Posted at 15:09 December 14, 2017
        Toaha
        Reply
        Author

        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
    Jesper
    Reply
    Author

    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
    Michael
    Reply
    Author

    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
    Ani_Admin
    Reply
    Author

    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
    Vincent
    Reply
    Author

    hi,

    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?
    Thx,
    V.

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

    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
      Patrick
      Reply
      Author

      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
    stu
    Reply
    Author

    Great post!

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

  • or
    Posted at 15:53 February 22, 2018
    or
    Reply
    Author

    great post.
    very helpfull.

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

    Hi,

    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?

    Thanks,
    Edy

    • Jason
      Posted at 14:43 July 26, 2018
      Jason
      Reply
      Author

      After struggling with this same issue, I’ve found you have to download the correct language pack VERSION for your build! I downloaded the wrong ISO version from Volume Licensing Service Center. Make sure you use the large ISO (9GB or so) that has all the Windows 10 build versions!!!

    • Gio
      Posted at 18:42 August 21, 2018
      Gio
      Reply
      Author

      yeah I’d like to know too….

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

      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.

      Regards,
      Nickolaj

  • Jason
    Posted at 12:57 July 21, 2018
    Jason
    Reply
    Author

    Nickolaj,

    Like a couple others, even though I specify SkipPackageDisplay=NO in my customsettings.ini, the Language Packs step does not show up in my Deployment Wizard. I have read of this issue on a few other sites as well, and am curious as to what the issue is? Could it be the lastest version of MDT (8450) dropped support for SkipPackageDisplay=NO? Wondering if you could share your cs.ini so I can compare.

    Thanks, great article!

    • Nickolaj Andersen
      Posted at 03:15 December 5, 2018
      Nickolaj Andersen
      Reply
      Author

      Hi Jason,

      Packages will only be shown they their build version matches what’s being deployed.

      Regards,
      Nickolaj

  • Mattias
    Posted at 09:12 November 30, 2018
    Mattias
    Reply
    Author

    Very nice guide! But is this still working for new Windows 10 v1809? They have done something to the language packs in Windows 10 v1809. Right? Have issues to find the correct LanguagePacks for v1809. :-/

    • Nickolaj Andersen
      Posted at 02:13 December 5, 2018
      Nickolaj Andersen
      Reply
      Author

      Hi Matthias,

      I don’t have access to VLSC right now, but on MSDN there’s a Windows 10 Language Pack version 1809 downloadable ISO, so there should also be one for volume licensing. Since 1803, they started developing LXP’s that could be used the same way as LP’s but during an in-place upgrade from 1803 to 1809 the language packs installed could be updated automatically from the Microsoft Store (if there’s any access to internet). Not really sure if that’s what you’re referring to though?

      Regards,
      Nickolaj

  • Leave a Reply

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