Можно ли локализовать EULA в WiX с помощью файла .wxl? - PullRequest
6 голосов
/ 02 сентября 2010

Мой установщик, созданный с помощью WiX, локализован с помощью файлов .wxl. В WiX можно указать несколько культур, и light.exe будет вызываться несколько раз, создавая установщик для каждого языка (это доступно при сборке установщика из Visual Studio).

Все файлы работ, за исключением EULA. Это определяется в файле .wxs через

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

И я не знаю хорошего способа изменить это значение из файла локализации .wxl. Использование

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

не работает, sice-файлы .wxl используются во время компоновки, и .wxs компилируется перед ними, поэтому компилятор не может найти !(loc.EulaFile). При поиске на форумах я нашел два обходных пути. Во-первых, это создание настраиваемого диалогового окна лицензий для каждого языка - кажется, оно работает, но это очень сложный способ и много раздувает исходный код. Второй способ - сбросить сборку Visual Studio / Votive и несколько раз вызвать light.exe, указав каждый раз новый файл лицензии с помощью ключа командной строки -d.

Можно ли как-то решить эту проблему и использовать локализованные файлы EULA, чтобы проект мог быть встроен в VisualStudio + Voltive без необходимости копировать и вставлять множество диалогов? Локализация установщиков - очень распространенная проблема, поэтому, возможно, существует какое-то решение, о котором я не знаю?

Ответы [ 3 ]

7 голосов
/ 10 февраля 2011

Лучшее решение - самое простое, просто используйте переменную WixUILicenseRtf в командной строке при указании файла .wxl.

light -loc setup_fr-FR.wxl -dWixUILicenseRtf=EULA_fr-FR.rtf ...

См. Основы пользовательского интерфейса на WiX Wikiдля получения дополнительной информации.

6 голосов
/ 09 февраля 2011

Есть еще один способ сделать это, и хотя он немного грязный, он менее грязный, чем два обходных пути, о которых упоминал ОП.И кредит, где кредит должен, этот ответ почти 100% на основе этого сообщения http://weblogs.sqlteam.com/mladenp/archive/2010/04/15/WiX-3-Tutorial-Custom-EULA-License-and-MSI-localization.aspx Младен Prajdić.

Следующее основано на WiX 3.5.

Вы создаетеслегка измененную копию диалога LicenseAgreementDlg и включите его в свой проект.

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

В свой основной исходный файл WiX вы добавляете следующий код, чтобы «вставить» ваш новый диалог в последовательность диалога вместо исходного.:

  <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>

Обратите внимание, что это основано на использовании диалоговой коллекции WixUI_InstallDir - для других коллекций, таких как WixUI_Mondo, вам, вероятно, придется изменить вышеприведенное, посмотрев на источник.

Наконец, в каждом из ваших файлов локализации вы помещаете одну строку, например, такую:

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

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

И, конечно, вы помещаете локализованный файл лицензии, как указано.Я помещаю файлы лицензий (и файлы локализации) в подпапки, но в этом нет необходимости.

Как я уже сказал, это немного грязно, но работает.

1 голос
/ 21 марта 2013

Локализация EULA очень проста.Добавьте элемент управления ScrollableText в один из ваших диалогов.Ссылка на строку локализации в текстовом элементе элемента управления ScrollableText.

<Control Id="LicenseText" Type="ScrollableText" X="20" Y="60" Width="330" Height="140" Sunken="yes" TabSkip="no">
  <Text>!(loc.License)</Text>
</Control>

Далее создайте файл локализации, скажем для американского английского.Назовите файл en-US.wxl.Создайте элемент локализации String в файле локализации, который использует идентификатор, указанный в элементе Text элемента управления ScrollableText , в данном случае он называется License.Добавьте необработанную строку rtf вашего EULA в качестве CDATA элемента строки локализации.

Чтобы получить необработанные данные, создайте файл rtf с помощью wordpad, например,Откройте этот файл RTF с помощью блокнота и скопируйте его содержимое.Вставьте это содержимое в элемент CDATA элемента String локализации.Обязательно пропустите все пробелы между строкой и CDATA Теги.

Ниже приведен пример локализованного элемента String:

<String Id="License"><![CDATA[{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang7\f0\fs22 American EULA.}]]></String>

Таким образом, ключом к включению нескольких EULA является использование необработанных данных rtf в соответствующих файлах локализации.

...