Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 3932442
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 19, 20262026-05-19T23:27:33+00:00 2026-05-19T23:27:33+00:00

My installer, created wth WiX is localized via .wxl files. It is possible in

  • 0

My installer, created wth WiX is localized via .wxl files. It is possible in WiX to specify multiple cultures and light.exe will be called multiple times, creating an installer for each language (this is available while building installer from Visual Studio).

All works file except for EULA. It is defined in .wxs file via

<WixVariable Id='WixUILicenseRtf' Value='en.rtf' />

And i don’t know a good way to change this value from .wxl localization file. Using

<WixVariable Id='WixUILicenseRtf' Value='!(loc.EulaFile)' />
<String Id='EulaFile'>en.rtf</String>

Is not working, sice .wxl files are used at link-time and .wxs is compiled before them, so compiler can’t find !(loc.EulaFile). Searching forums i have found two workarounds. First is to create a custom license dialog for each language – it seems to work, but it’s a very hard way and bloat source code a lot. Second way is to drop Visual Studio / Votive build and to call light.exe multiple times, specifying different license file each time via -d command-line key.

Is it any way to solve this problem and use localized EULA files so project can be built in VisualStudio + Voltive without a need to copy-paste lots of dialogs? Localizing installers is a very common problem, so maybe some solution exist that i don’t know about?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-19T23:27:33+00:00Added an answer on May 19, 2026 at 11:27 pm

    There is another way to do this, and although it is a bit messy it is less messy than the two workarounds the OP has mentioned. And credit where credit is due, this answer is almost 100% based on this post http://weblogs.sqlteam.com/mladenp/archive/2010/04/15/WiX-3-Tutorial-Custom-EULA-License-and-MSI-localization.aspx by Mladen Prajdić.

    The following is based on WiX 3.5.

    You create a slightly modified copy of the LicenseAgreementDlg dialog and include it in your project.

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
        Copyright (c) Microsoft Corporation.  All rights reserved.
    
        The use and distribution terms for this software are covered by the
        Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
        which can be found in the file CPL.TXT at the root of this distribution.
        By using this software in any fashion, you are agreeing to be bound by
        the terms of this license.
    
        You must not remove this notice, or any other, from this software.
    -->
    
    <!-- This is a modified version of LicenseAgreementDlg to support selection of localized versions of 
         the license file. It is very much based on this article: 
         http://sqlserverpedia.com/blog/sql-server-bloggers/wix-3-tutorial-custom-eula-license-and-msi-localization/  -->
    
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
        <Fragment>
            <UI>
                <Dialog Id="LicenseAgreementKludge" Width="370" Height="270" Title="!(loc.LicenseAgreementDlg_Title)">
                    <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.LicenseAgreementDlgBannerBitmap)" />
                    <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
                    <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
                    <Control Id="Description" Type="Text" X="25" Y="23" Width="340" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.LicenseAgreementDlgDescription)" />
                    <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.LicenseAgreementDlgTitle)" />
                    <Control Id="LicenseAcceptedCheckBox" Type="CheckBox" X="20" Y="207" Width="330" Height="18" CheckBoxValue="1" Property="LicenseAcceptedKludge" Text="!(loc.LicenseAgreementDlgLicenseAcceptedCheckBox)" />
                    <Control Id="Print" Type="PushButton" X="112" Y="243" Width="56" Height="17" Text="!(loc.WixUIPrint)">
                        <Publish Event="DoAction" Value="WixUIPrintEula">1</Publish>
                    </Control>
                    <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
                    <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
                        <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">!(wix.WixUICostingPopupOptOut) OR CostingComplete = 1</Publish>
                        <Condition Action="disable"><![CDATA[LicenseAcceptedKludge <> "1"]]></Condition>
                        <Condition Action="enable">LicenseAcceptedKludge = "1"</Condition>
                    </Control>
                    <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
                        <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
                    </Control>
                    <Control Id="LicenseText" Type="ScrollableText" X="20" Y="60" Width="330" Height="140" Sunken="yes" TabSkip="no">
                        <Text SourceFile="$(var.ProjectDir)\!(loc.LicenseRtf)" />  <!-- this value has been modified -->
                    </Control>
                </Dialog>
            </UI>
        </Fragment>
    </Wix>
    

    In your main WiX source file you add the following code to “patch” your new dialog into the dialog sequencing instead of the original one:

      <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementKludge">1</Publish>
      <Publish Dialog="LicenseAgreementKludge" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
      <Publish Dialog="LicenseAgreementKludge" Control="Next" Event="NewDialog" Value="InstallDirDlg">LicenseAcceptedKludge = "1"</Publish>
      <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementKludge">1</Publish>
    

    Note that this is based on using the WixUI_InstallDir dialog collection – for other collections, such as WixUI_Mondo, you will probably have to modify the above by looking at the source.

    Finally, in each of your localization files you place one line like this:

    <String Id="LicenseRtf">en-us\MerliniaSMSGatewayLicense.en-us.rtf</String>
    
    <String Id="LicenseRtf">da-dk\MerliniaSMSGatewayLicense.da-dk.rtf</String>
    

    And, of course, you place the localized license file as indicated. I’m placing the license files (and localization files) in subfolders, but this is not necessary.

    Like I said, it’s a bit messy, but it does work.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I created an installer (via WiX) that, as part of the installation, installs a
I created installer via NSIS. c:\program files\myapp is default folder for my application. But
I have an application installer created with Inno Setup that deploys multiple binaries and
I created a windows Installer MSI package that installs assembly binaries (exe) with their
I have created a wix installer project which is working fine. It installs my
We have a product installer created with Wix, containing a program package ( V1
I created an installer using WiX. One thing the installer does is sets an
We have an installer created using WIX. As part of this install we would
I have created installer which needs to delete some files and folder if they
I've created an installer .exe for my app and made it available for download.

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.