Install Language Packs when creating a Windows 10 reference image

187_0

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.

 

9 Comments

  1. Alslinet

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

    Reply
    1. NickolajNickolaj (Post author)

      Great additional information, thanks Vegard!

      Reply
  2. Jesper

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

    Reply
  3. Michael

    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?

    Reply
  4. Pingback: [MDT] Add Russian Support during imaging?

  5. Ani_Admin

    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

    Reply
  6. Vincent

    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.

    Reply
  7. 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?

    Reply
    1. Patrick

      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.

      Reply

Leave a Comment

Your email address will not be published. Required fields are marked *