Issue

Microsoft have released ISOs containing Windows 10 language packs. This TID details a method to select and integrate them into a Windows 10 build that is deployed via ZENworks Imaging.

Requirements

  • Windows 10 (Enterprise or Education edition)

  • Imaging Toolkit 10.0.4 (or newer)

  • ENGL build process configured in a ZENworks environment (ZMG imaging)

Solution

Integrate Language Pack selection and installation into the deployment process as follows;

  1. Update Zim to display a list of available language options when restoring images
  2. When a language is selected restore the appropriate files to the local machine and store information to ZISD
  3. Prompt to select the default language if more than one language is selected
  4. Prompt to enforce the selected default language (using Group policy setting)
  5. Install selected language packs during the deployment process and set as the default UI language
NOTE: More information on Windows 10 language packs is available at https://support.microsoft.com/en-us/help/14236/language-packs


WARNING! Do NOT perform this procedure in a production environment without first fully testing in a non-production test environment.



Steps

Done Task
 
1. Download appropriate language packs from Microsoft
 
2. Configure the Imaging Environment
 
3. Integrate updates into build process
 
4. Test updated files
  1. Download langauge pack ISO files from Microsoft

  2. Configure the Imaging Environment

    Zim is used to select which project is restored to the machine. With the changes in this TID Zim will also let you select the language to be configured once the machine has been built.

    Done Task
     
    1. Create a language lookup file, lang.ini
     
    2. Configure Zim to read the lang.ini file
     
    3. Configure the project restore form to display a language selection option (if available)
     
    4. Read in language settings from lang.ini based on information selected in the Zim form.
     
    5. Configure Zim to use ZISD to store and restore the selected langage details
     
    6. Configure Zim to restore the language image file(s)
     
    7. Update zimget.s
     
    8. Save files to the server
    1. Create a lang.ini lookup file

      This file will list the available languages for each base image name as well as the locale information for the each language. The locale information will be used to ensure the correct keyboard layout etc. is set for the deployed machine.

      This file should be created in the <integration path>/zenworks/tftp/zimfiles folder.

      In this example scenario there are three MUI packs available plus the default language of English. Note that the MUI language packs are specific to the OS version. So, in order to ensure that the correct version is restored the Base_Image name from the projects.ini file is used.

      Review the projects.ini file and identify the Base_Image name for the OS you wish to deploy MUI packs to. For example, the entries highlighted in red below:

      ;
      ; ENGL Zim projects.ini lookup file
      ;
      
      [projects]
      project1 = Windows 10 Education [10586 (Feb '16)] (x64) - en-US
      project2 = OSONLY-win7-sp1-pro-x86-zcm1142
      project3 = BASEOS-win10-ent-x86-14393-zcm1142
      
      ; Project details
      [Windows 10 Education [10586 (Feb '16)] (x64) - en-US]
      Description        = Windows 10 Education [10586 (Feb '16)] (x64) - en-US
      project_image_path = win10-edu-x64
      project_os         = win10-edu-x64
      partition_count    = 2
      partition1_size    = 600
      partition2_size    = 60000
      driver_os          = win10-x64
      base_image         = win10-edu-x64-10586-postsp
      ztoolkit           = ztoolkit
      efi_boot_image     = win10-edu-x64-10586-uefi-boot
      
      [OSONLY-win7-sp1-pro-x86-zcm1142]
      Description        = OSONLY-win7-sp1-pro-x86-zcm1142
      project_image_path = osonly-win7-sp1-pro-x86-zcm1142
      project_os         = win7-sp1-pro-x86
      partition_count    = 1
      partition1_size    = 60000
      driver_os          = win7-x86
      base_image         = win7-sp1-pro-x86-postsp
      ztoolkit           = ztoolkit
      
      [BASEOS-win10-ent-x86-14393-zcm1142]
      Description        = BASEOS-win10-ent-x86-14393-zcm1142
      project_image_path = baseos-win10-ent-x86-14393-zcm1142
      project_os         = win10-ent-x86
      partition_count    = 1
      partition1_size    = 60000
      driver_os          = win10-x86
      base_image         = win10-ent-x86-14393-postsp
      ztoolkit           = ztoolkit

      Now add these entries into the [language] section of the lang.ini file then populate the language specific settings using the following example as a template:

      ; lang.ini
      
      [language]
      win10-ent-x86-14393-postsp = en, fr, nl
      win10-edu-x64-10586-postsp = en, fr, nl, de
      
      [en]
      SystemLocale=en-GB
      UserLocale=en-GB
      InputLocale=0809:00000809
      mui=en-GB
      Geo = 242
      
      [fr]
      SystemLocale=fr-FR
      UserLocale=fr-FR
      InputLocale=040c:0000040C
      mui=fr-FR
      Geo = 84
      
      [nl]
      SystemLocale=nl-NL
      UserLocale=nl-NL
      InputLocale=0413:00000413
      mui=nl-NL
      Geo = 176
      
      [de]
      SystemLocale=de-DE
      UserLocale=de-DE
      InputLocale=0407:00000407
      mui=de-DE
      Geo = 94
    2. Configure Zim to read the lang.ini file

      Update the zim.cfg file to read in the available language options from the lang.ini file.

      • Open zim.cfg file in a text editor

      • Find the following section in the file and update to include the changes highlighted in green:

        Label:Lookup_Project_Info
        
        ; Read in project specific information
        File:Ini,Get,"%_ZimDir%projects.ini","%Lookup_Project%","Project_Image_Path",Project_Image_Path
        File:Ini,Get,"%_ZimDir%projects.ini","%Lookup_Project%","Project_OS",Project_OS
        File:Ini,Get,"%_ZimDir%projects.ini","%Lookup_Project%","Partition_Count",Partition_Count
        File:Ini,Get,"%_ZimDir%projects.ini","%Lookup_Project%","Driver_OS",Project_Driver_OS
        File:Ini,Get,"%_ZimDir%projects.ini","%Lookup_Project%","Base_Image",Base_Image
        File:Ini,Get,"%_ZimDir%projects.ini","%Lookup_Project%","Ztoolkit",Project_Ztoolkit
        File:Ini,Get,"%_ZimDir%projects.ini","%Lookup_Project%","Novcomp",Project_novcomp
        
        ; Read in language information
        ; This uses the baseimage name from the projects.ini as the key. 
        ; This allows different MUI options to be specified for different OS images to cater for version-specific files
        File:Ini,Get,"%_ZimDir%lang.ini","language","%Base_Image%",lookup_lang
        Set:Zisd_lang,GetKeyPairStringValue("%VendorDataENGLSTRING%", "lang")
        Set:Zisd_ForceMui,GetKeyPairStringValue("%VendorDataENGLSTRING%", "ForceMui")
        
        ; Identify Win 10 version number from Base_Image variable.
        Set:OSVersion,token("%Base_Image%","-","4")
      • Save the changes to the zim.cfg file

    3. Configure the project restore form to display a language selection option (if available)

      The project restore form only needs to display a list of language options when the base image being restored has language options configured in the lang.ini file.

      • Open the zim.cfg file in a text editor

      • Find the following section in the file and update to include the changes highlighted in  green:

        Label:Ztoolkit_ComputerName_Form
          
        ; Launch a Form to display detected hardware and select machine type
        Form:Start,"Info","Hardware Detected","_OkCancel^_Ok",Blue
        Form:Item,"Item1",Label,"Manufacturer"
        Form:Item,"Item2",EditBox,"%Lookup_Section%",ReadOnly
        Form:Item,"Item3",Label,"Model"
        Form:Item,"Item4",EditBox,"%Lookup_Value%",ReadOnly
        Form:Item,"Item5",Label,"Hardware Image"
        Form:Item,"Item6",EditBox,"%Drivers_Image%",ReadOnly
        Form:Item,"Item7",Label,"Hardware Type"
        Form:Item,"Item8",EditBox,"%Machine_Type%",ReadOnly
        Form:Item,"Item9",Label,"OS"
        Form:Item,"Item10",EditBox,"%Project_OS%",ReadOnly
        Form:Item,"Item11",Label,"Computer Name"
        Form:Item,"Item12",EditBox,"%Ask_COMPUTERNAME%"
        ; Only display language selection if lang.ini info has been identified successfully
        If:Var,lookup_lang,NE,""
          Form:Item,"mui1",Label,"Language:"
          Form:Item,"mui2",CheckBoxes,"%zisd_lang%","%lookup_lang%"
        End: 
        Form:Item,"Item13",Label,"Auto Restart after imaging"
        Form:Item,"Item14",RadioButtons,"Yes","Yes,No"
        Form:Display,"Info"
        Set:Ask_COMPUTERNAME,%_Info_item12%
        Set:Ask_lang,%_Info_mui2%
        Set:AutoRestart,%_Info_item14%
        If:Var,Ask_COMPUTERNAME,EQ,""
        Dialog:Ask,"","You must specify a Computer Name.","_Ok",Red
        Goto:Ztoolkit_ComputerName
        Else:
        Set:ComputerNameLength,Len(%Ask_COMPUTERNAME%)
        If:Var,ComputerNameLength,GT,"15"
        Dialog:Ask,"Error","You must specify a Computer Name less than 16 characters","_Ok",Red
        Goto:Ztoolkit_ComputerName_Form
        End:
        End:
        If:Var,Ask_COMPUTERNAME,CONTAINS," "
        Dialog:Ask,"","The Computer Name must not contain a space.","_Ok",Red
        Goto:Ztoolkit_ComputerName_Form
        End:
        If:Var,Ask_COMPUTERNAME,NE,"%COMPUTERNAME%"
        Set:COMPUTERNAME,"%Ask_COMPUTERNAME%"
        End:
        
        If:Var,lookup_lang,NE,""
        Set:MuiCount,TokenCount("%Ask_lang%", ",")
        If:Var,MuiCount,NE,0
        ; We need to specify which language pack will be set by default and if this will be locked for all users using group policy.
        ; Launch a Form to Set Default Language
        Form:Start,"MUI","Language Options","_BackFinishCancel^_Finish",Blue
        Form:Item,"Item1",Label,"Select Default Language"
        Form:Item,"Item2",RadioButtons,"%zisd_DefaultLang%","%ask_lang%"
        Form:Item,"Item3",Label,"Lock display language to selection"
        Form:Item,"Item4",RadioButtons,"%zisd_ForceMui%","Yes,No"
        Form:Display,"MUI"
        
        If:Var,_Form,EQ,"_Cancel"
        Menu:Return
        End:
        If:Var,_Form,EQ,"_Back"
        Goto:Ztoolkit_ComputerName_Form
        End:
        Set:Ask_DefaultLang,%_Mui_Item2%
        Set:Ask_ForceMui,%_Mui_Item4%
        End:
        End:
        
      • Save the changes to the zim.cfg file

    4. Read in language settings from lang.ini based on information selected in the Zim form.

      When you select a language code in the Zim form the appropriate information needs to then be read in from the lang.ini file.

      • Open the zim.cfg file in a text editor

      • Find the following section in the file and update to include the highlighted changes:

        Dialog:Ask,"", "Warning! All hard disk data on this machine will be erased.\n\nContinue?","_YesNo",red
        If:Var,_ask,eq,"_No"
                Menu:Return
        End:
         
        If:Var,lookup_lang,NE,""
        ; Lookup information based on the language selected in the zim form
        If:Var,ask_DefaultLang,NE,""
        File:Ini,Get,"%_ZimDir%lang.ini","%Ask_lang%","SystemLocale",lookup_SystemLocale
        File:Ini,Get,"%_ZimDir%lang.ini","%ask_lang%","UserLocale",lookup_UserLocale
        File:Ini,Get,"%_ZimDir%lang.ini","%ask_lang%","InputLocale",lookup_InputLocale
        File:Ini,Get,"%_ZimDir%lang.ini","%ask_lang%","Geo",lookup_Geo
        File:Ini,Get,"%_ZimDir%lang.ini","%ask_DefaultLang%","mui",lookup_defaultMui
        
        ; Identify each MUI pack based on the selection
        Set:MuiIndex,"1"
        Set:LookupMui,Token("%ask_lang%", ",", %MuiIndex%)
        File:Ini,Get,"%_ZimDir%lang.ini","%LookupMui%","mui",MuiPacks
        While:Var,MuiIndex,NE,"%MuiCount%"
        Set:MuiIndex,Math("+", 1)
        Set:LookupMui,Token("%Ask_lang%", ",", %MuiIndex%)
        File:Ini,Get,"%_ZimDir%lang.ini","%LookupMui%","mui",lookupMui
        Set:MuiPacks,"%MuiPacks%,%lookupMui%"
        Wend:
        End:
        End:
        
        Dialog:Popup,"Restoring ENGL Smart Windows build process, please wait...",green
      • Save the changes to the zim.cfg file

    5. Update the zim.cfg file to store selected information to ZISD

      The language information now needs to be stored to ZISD to ensure that the build process can access it within Windows.

      • Open the zim.cfg file in a text editor

      • Update the file to include the highlighted changes:

        ; Update the information in ZISD
        Zisd:Put,NetBiosName,%COMPUTERNAME%
        
        ; Update VendorDataENGL (sample)
        Set:VendorDataENGLSTRING,PutKeyPairStringValue("%VendorDataENGLSTRING%","Machine_Type","%machine_type%")
        Set:VendorDataENGLSTRING,PutKeyPairStringValue("%VendorDataENGLSTRING%","OS","%project_os%")
        Set:VendorDataENGLSTRING,PutKeyPairStringValue("%VendorDataENGLSTRING%","Project","%lookup_project%")
        ; Store language information to ZISD if required.
        If:Var,ask_lang,NE,""
        Set:VendorDataENGLSTRING,PutKeyPairStringValue("%VendorDataENGLSTRING%","lang","%Ask_lang%")
        Set:VendorDataENGLSTRING,PutKeyPairStringValue("%VendorDataENGLSTRING%","mui","%lookup_defaultMui%")
        Set:VendorDataENGLSTRING,PutKeyPairStringValue("%VendorDataENGLSTRING%","ForceMui","%Ask_ForceMui%")
        Set:VendorDataENGLSTRING,PutKeyPairStringValue("%VendorDataENGLSTRING%","SystemLocale","%lookup_SystemLocale%")
        Set:VendorDataENGLSTRING,PutKeyPairStringValue("%VendorDataENGLSTRING%","UserLocale","%lookup_UserLocale%")
        Set:VendorDataENGLSTRING,PutKeyPairStringValue("%VendorDataENGLSTRING%","InputLocale","%lookup_InputLocale%")
        Set:VendorDataENGLSTRING,PutKeyPairStringValue("%VendorDataENGLSTRING%","Geo","%lookup_Geo%")
        End:
        
        Set:MonitorStatus,"Started"
        Gosub:SendUpdateToMonitorServer
      • Save the changes to the zim.cfg file

    6. Update the zim.cfg file to restore selected MUI add-on image

      • Open the zim.cfg file in a text editor

      • Update the file to include the highlighted changes:

                ; BIOS Machines
                File:Run,"img %ImgRestoreCmd%os/%Project_OS%/%Base_Image%",verbose
                File:Run,"cat imglogr >> %_ZimDir%zim.log",verbose
                If:Var,_Error,EQ,"137"
                        ; Trying to restore GPT based image in to BIOS machine.
                        Dialog:Ask,"Warning!Image Restore Failed","img error:'Trying to restore GPT based image in to BIOS machine'\nThis is not supported.\n\nReturn to Menu","_Ok",Red
                        Menu:Return
                End:
                File:Run,"img %ImgRestoreCmd%projects/%Project_Image_Path%/hotfixes.zmg %Project_Partition%",verbose
                File:Run,"cat imglogr >> %_ZimDir%zim.log",verbose
                File:Run,"img %ImgRestoreCmd%projects/%Project_Image_Path%/%Project_Novcomp% %Project_Partition%",verbose
                File:Run,"cat imglogr >> %_ZimDir%zim.log",verbose
                File:Run,"img %ImgRestoreCmd%projects/%Project_Image_Path%/%Project_Ztoolkit% %Project_Partition%",verbose
                File:Run,"cat imglogr >> %_ZimDir%zim.log",verbose
                File:Run,"img %ImgRestoreCmd%drivers/%Project_Driver_OS%/%Drivers_Image% %Project_Partition%",verbose
                File:Run,"cat imglogr >> %_ZimDir%zim.log",verbose
        End:
        
        
        ; Restore MUI image file(if selected)
        If:Var,MuiPacks,NE,""
        ; Need to Restore each of the specified language pack files
        Set:MuiCount,TokenCount("%MuiPacks%", ",")
        Set:MuiIndex,"0"
        While:Var,MuiIndex,NE,"%MuiCount%"
        Set:MuiIndex,Math("+", 1)
        Set:MuiImage,Token("%MuiPacks%", ",", %MuiIndex%)
        File:Run,"img %ImgRestoreCmd%os/%Project_OS%/mui-%OSVersion%-%MuiImage%.zmg %Project_Partition%",verbose
        File:Run,"cat imglogr >> %_ZimDir%zim.log",verbose
        Wend:
        End:
        
        Pause:2
        Dialog:Popupclose
      • Save the changes to the zim.cfg file

    7. Update zimget.s to download the lang.ini file into the ZENworks imaging environment

      • Update the standard zimget.s to also retrieve the lang.ini file:
        ...
        
        tftp $PROXYADDR << _END_ > /dev/null
        verbose on
        bin
        get zimfiles/ldapsdk.tar $ZIMDIR/ldapsdk.tar
        get zimfiles/zim.tgz %_ZimDir%zim.tgz
        get zimfiles/engl.lic $ZIMDIR/engl.lic
        get zimfiles/zim.cfg $ZIMDIR/zim.cfg
        get zimfiles/images.ini $ZIMDIR/images.ini
        get zimfiles/projects.ini $ZIMDIR/projects.ini
        get zimfiles/lang.ini $ZIMDIR/lang.ini
        get zimfiles/zimrun.s $ZIMDIR/zimrun.s
        quit
        _END_
        ...
      • Save the changes to the zimget.s file

    8. Save the updated files on the server

      The updated zim.cfg, zimget.s and lang.ini files now need to be transferred to the tftp/zimfiles folder on the ZENworks server.

  3. Integrate updates into the build process

    The build process needs to be updated to install the MUI langage packs and if required force the display langauge to the appropriate language.

    Done Task
     
    1. Create MUI image files
     
    2. Configure the Language settings within the project
     
    3. Add a phase script to the project to install the MUI packs
     
    4. Create updated files for deployment
    1. Create MUI add-on image files

      The MUI files that were downloaded earlier need to be added to an image so that they can be deployed to the local machine by Zim.

      • Ensure the correct Language pack media has been downloaded for the base image that is being deployed.

         Make a note of the version number used in the base_image name from the projects.ini file.

      • Mount the ISO file that contains the Language pack information

        NOTE: Microsoft has changed the naming format of the language pack files with the Windows 10 1607 release.
         More information here: https://msdn.microsoft.com/en-gb/windows/hardware/commercialize/manufacture/desktop/where-is-lpcab .
         This TID will work with both filename formats.

        The files are either in a folder structure like: 
        \---langpacks
            +---ar-sa
            |       lp.cab
            |       
            +---bg-bg
            |       lp.cab
            |       
            +---cs-cz
            |       lp.cab
            |       
            +---da-dk
            \       lp.cab
         or 
        +---Windows Preinstallation Environment
        +---x64
        |   \---langpacks
        |           Microsoft-Windows-Client-Language-Interface-Pack_x64_af-za.cab
        |           Microsoft-Windows-Client-Language-Interface-Pack_x64_am-et.cab
        |           Microsoft-Windows-Client-Language-Interface-Pack_x64_as-in.cab
        |           Microsoft-Windows-Client-Language-Interface-Pack_x64_az-latn-az.cab
        |           Microsoft-Windows-Client-Language-Interface-Pack_x64_be-by.cab
        |           Microsoft-Windows-Client-Language-Interface-Pack_x64_bn-bd.cab
        |           Microsoft-Windows-Client-Language-Pack_x64_ar-sa.cab
        |           Microsoft-Windows-Client-Language-Pack_x64_bg-bg.cab
        |           Microsoft-Windows-Client-Language-Pack_x64_cs-cz.cab
        |           Microsoft-Windows-Client-Language-Pack_x64_da-dk.cab
        |           Microsoft-Windows-Client-Language-Pack_x64_de-de.cab
        |           
        \---x86
            \---langpacks
                    Microsoft-Windows-Client-Language-Interface-Pack_x86_af-za.cab
                    Microsoft-Windows-Client-Language-Interface-Pack_x86_am-et.cab
                    Microsoft-Windows-Client-Language-Interface-Pack_x86_as-in.cab
                    Microsoft-Windows-Client-Language-Interface-Pack_x86_az-latn-az.cab
                    Microsoft-Windows-Client-Language-Interface-Pack_x86_be-by.cab
                    Microsoft-Windows-Client-Language-Interface-Pack_x86_bn-bd.cab
                    Microsoft-Windows-Client-Language-Pack_x86_ar-sa.cab
                    Microsoft-Windows-Client-Language-Pack_x86_bg-bg.cab
                    Microsoft-Windows-Client-Language-Pack_x86_cs-cz.cab
                    Microsoft-Windows-Client-Language-Pack_x86_da-dk.cab
                    Microsoft-Windows-Client-Language-Pack_x86_de-de.cab
      • Make a note of the language code for each LP or LIP file - this can be identified from the file name, e.g.

        Microsoft-Windows-Client-Language-Interface-Pack_x64_zu-za.cab
        Microsoft-Windows-Client-Language-Pack_x64_de-de.cab
         or 
        \---langpacks
            +---ar-sa
            |       lp.cab
            |       
            +---bg-bg
            |       lp.cab
            |       
            +---cs-cz
            |       lp.cab
            |       
            \---da-dk
                   lp.cab
         This gives a language code of zu-ZA [Zulu (South Africa)] for the Language Interface Pack while the Language Pack has a language code of de-DE [German (Germany)]

        NOTE: The second part of the language code is normally displayed in uppercase


      • Create folder structure to be used to store MUI files under C:\ProgramData\ENGL\ImagingToolkit\Projects\MUI\<win10>-<edition>-<arch>\ folder structure.
        C:\ProgramData\ENGL\ImagingToolkit\Projects\MUI\Win10-edu-x64
             +---mui-10586-de-DE
             |   \---ztoolkit
             |       \---mui
             |           +---de-DE
             +---mui-10586-fr-FR
             |   \---ztoolkit
             |       \---mui
             |           +---fr-FR
             \---mui-10586-nl-NL
                 \---ztoolkit
                     \---mui
                         +---nl-NL
        NOTE: The version number 10586 is required to ensure that the correct MUI files are restored.


      • Copy appropriate files from the ISO into the file structure

        Langauge Pack files (Windows 10 - 1607 or newer) are shown in green

        C:\ProgramData\ENGL\ImagingToolkit\Projects\MUI\Win10-edu-x64
             +---mui-14393-de-DE
             |   \---ztoolkit
             |       \---mui
             |           \---de-DE
             |                   Microsoft-Windows-Client-Language-Pack_x64_fr-FR.cab
             +---mui-14393-fr-FR
             |   \---ztoolkit
             |       \---mui
             |           \---fr-FR
             |                   Microsoft-Windows-Client-Language-Pack_x64_fr-FR.cab
             \---mui-14393-nl-NL
                 \---ztoolkit
                     \---mui
                             \---nl-NL
                                 Microsoft-Windows-Client-Language-Pack_x64_nl-NL.cab
         While Langauge Pack files (Windows 10 - 1511 or earlier) will look like: 
        C:\ProgramData\ENGL\ImagingToolkit\Projects\MUI\Win10-edu-x64
             +---mui-10586-de-DE
             |   \---ztoolkit
             |       \---mui
             |           \---de-DE
             |                   lp.cab
             +---mui-10586-fr-FR
             |   \---ztoolkit
             |       \---mui
             |           \---fr-FR
             |                   lp.cab
             \---mui-10586-nl-NL
                 \---ztoolkit
                     \---mui
                         \---nl-NL
                                 lp.cab


      • Create ZENworks add-on images using this folder structure such that the image filenames are called mui-<language code> and partition 1 contains the structure under  mui-<language short code>

         You will need to use Image Explorer to do this. This will be installed on the ZENworks server or can be installed localy after downloading the appropriate media from the ZENworks Tools page : https://{ZENWORKS_SERVER}/zenworks-setup/?pageId=imaging

        e.g.

        Image images/tid-2016012-imgexp.png not found. [Image explorer]
      • Save the newly created zmg files to the server in the images\os\<win10>-<windows edition>-<arch>\ folder structure and name using the format mui-<Windows Version>-<Language Code>.zmg
        e.g. C:\Program Files (x86)\Novell\ZENworks\work\content-repo\images\os\win10-edu-x64\mui-10586-de-DE.zmg
    2. Configure the language settings within the project

      Language settings for the project are stored to ZISD by Zim when a project is deployed. The project needs to be updated to ensure that it uses this information.

      • Update project settings to use variables configured using Zim

        Select "Expert View" - "Windows" - "Localisation"

        Expand the System/User/Input locale options

        For each "Build Variable" entry populate the appropriate variable:

        Language Setting Build Variable
        System Locale %ENGL_SystemLocale%
        User Locale %ENGL_UserLocale%
        Input Locale %ENGL_InputLocale%
        Geographic ID %ENGL_Geo%

        e.g.

        Image images/tid-2016012-expertview.png not found. [Localisation settings]
      • Save the changes to the project

    3. Add a phase script to the project to install the MUI packs

      The build process requires a custom phase script to be added to the project. This script will check if there is a c:\ztoolkit\mui folder and if it exists will run lpksetup to install the language packs in the folder structure.  The script will also read in the language settings from ZISD and apply them to the machine.

      • Open notepad

      • Paste in the following Powershell script

        # Powershell script to install MUI language packs if folder structure has been found.
        
        # Create a reference to Ztoolkit Control
        $Utils = new-object -comobject "ENGL.Ztoolkit.Utils"
        $ZENworks = new-object -comobject "ENGL.Ztoolkit.ZENworks"
        
        if (Test-Path C:\ztoolkit\mui)
        {
        # The c:\ztoolkit\mui folder exists
        [void]$Utils.AppendLog("C:\ztoolkit\mui exists")
        [void]$Utils.AppendLog("Installing MUI Packs. This may take a while!")
        
        $process="lpksetup.exe"
        $arg = "/r /i * /p c:\ztoolkit\mui"
        $Utils.AppendLog("Using lpksetup to install Language packs found under c:\ztoolkit\mui")
        start-process $process -argumentList:$arg -wait
        $Utils.AppendLog("lpksetup has exited")
        
        # Now setup the display language settings
        
        # Read in MUI information from ZISD
        # Read in ZISD:VendorDataENGL
        $VendorDataENGLSTRING= $ZENworks.GetZisdAttributeValue("VendorDataENGL")
        
        # Read the values from VendorDataENGLSTRING that we need to set the language.
        $zisd_mui = $Utils.GetKeyPairStringValue($VendorDataENGLSTRING, "mui")
        $zisd_ForceMui = $Utils.GetKeyPairStringValue($VendorDataENGLSTRING, "ForceMui")
        
        $Utils.AppendLog("Zisd:MUI : $zisd_mui")
        
        # Set Culture
        $Utils.AppendLog("Set-Culture $zisd_mui")
        Set-Culture $zisd_mui
        
        #Set the system locale 
        $Utils.AppendLog("Set-WinSystemLocale $zisd_mui")
        Set-WinSystemLocale $zisd_mui
        
        # Set the Language List
        $Utils.AppendLog("Set-WinUserLanguageList $zisd_mui -force")
        Set-WinUserLanguageList $zisd_mui -force
        
        # Set Group Policy key to force the UI settings to apply
        # This will only be processed if $zisd_ForceMui is set to Yes.
        If($zisd_ForceMui -eq "Yes") 
        {
        
        [void]$Utils.appendlog("Configure Group Policy to set the PreferredUILanguage to $zisd_mui")
        $registryPath = "HKLM:\Software\Policies\Microsoft\MUI\Settings"
        $Name = "PreferredUILanguages"
        $value = $zisd_mui
        
        If(!(Test-Path $registryPath))
        {
        [void]$Utils.appendlog(" Registry key doesn't exist so we need to create it before writing to it.")
        New-Item -Path $registryPath -Force | Out-Null
        New-ItemProperty -Path $registryPath -Name $name -Value $value ` -PropertyType STRING -Force | Out-Null
        }
        Else
        {
        [void]$utils.appendlog("Registry key exists so set value")
        New-ItemProperty -Path $registryPath -Name $name -Value $value  -PropertyType STRING -Force | Out-Null 
        }
        
        }
        }
        Else
        {
        [void]$Utils.AppendLog("C:\ztoolkit\mui does NOT exist")
        }
        
        [void]$Utils.AppendLog("Phase1-after.ps1 has completed.")
      • Save the file to the file system as phase1-after.ps1 and make a note of the path for later

    4. Open Build Console and load the appropriate <project>.xml file

    5. Select the Expert View then navigate to Customisation : Custom Files

    6. Right click in the properties view then select Add

    7. The "Add Custom Files" dialog will open. Browse to the phase1-after.ps1 created earlier then select it

    8. Click Open to add the file to the Custom Files property view

  4. Create updated files for deployment

    The project has now been updated. In order to deploy the changes when a machine is built the deployment process (ztoolkit) image needs to be recreated.

    • Validate the project

    • Launch Deployment wizard and create the build process image (ztoolkit)

    • Update the ../content-repo/images/<project>/ folder with new ztoolkit image file.

  5. Test updated files

    The files have all been updated on the server. These now need to be tested to ensure that everything works as required.

    • PXE boot a test machine to the updated imaging environment.

    • Select the Restore menu

    • Select the appropriate Windows 10 project

    • Select the appropriate MUI options to be tested

    • Select OK to restore the project images

      The image files will restore and the machine will reboot

    • The machine will build successfully and when reviewed it will have the selected MUI Language Pack (and / or Language Interface Pack) installed. If the "Lock display language to selection" option is selected then language settings will be configured using group policy to enforce the specified language for all users.

  6. The resulting menu process will look like:

    Image images/tid-2016012-zim-lang.gif not found. [demo (animated gif)]


  7. If you have any problems or questions about the steps in this TID please contact the ENGL support team