Можно ли локализовать EULA в WiX с помощью файла.wxl?
Мой установщик, созданный с помощью 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 без необходимости копировать и вставлять множество диалогов? Локализация установщиков - очень распространенная проблема, поэтому, возможно, существует какое-то решение, о котором я не знаю?
5 ответов
Есть еще один способ сделать это, и хотя он немного грязный, он менее грязный, чем два обходных пути, о которых упоминал OP. И кредит, где кредит должен, этот ответ почти 100% на основе этого сообщения http://weblogs.sqlteam.com/mladenp/archive/2010/04/15/WiX-3-Tutorial-Custom-EULA-License-and-MSI-localization.aspx Младен Прайдич.
Следующее основано на 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>
И, конечно же, вы размещаете локализованный файл лицензии, как указано. Я помещаю файлы лицензий (и файлы локализации) в подпапки, но это не обязательно.
Как я уже сказал, это немного грязно, но это работает.
Лучшее решение самое простое, просто используйте WixUILicenseRtf
переменная в командной строке при указании вашего .wxl
файл.
light -loc setup_fr-FR.wxl -dWixUILicenseRtf=EULA_fr-FR.rtf ...
См. Основы пользовательского интерфейса на WiX Wiki для получения дополнительной информации.
Локализация 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 вашего лицензионного соглашения в качестве элемента CDATA строки локализации.
Чтобы получить необработанные данные, создайте файл RTF с WordPad, например. Откройте этот файл RTF с помощью блокнота и скопируйте его содержимое. Вставьте это содержимое в элемент CDATA элемента String локализации. Обязательно пропустите все пробелы между тегами 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>
Таким образом, ключом к включению нескольких лицензионных соглашений является использование необработанных данных RTF в соответствующих файлах локализации.
Чтобы добавить к ответу Noman_1, вы можете использовать функцию пакетной сборки Visual Studio, чтобы уменьшить беспорядок и проблему дополнительных кликов. На мой взгляд, это самое простое и подходящее решение, поскольку лицензия по логике должна указываться во время сборки.
Перейдите в диспетчер конфигурации решения, в строке проекта установщика создайте новую конфигурацию для каждой локализации, которую вы хотите использовать, например, как показано ниже:
Теперь на странице свойств проекта установщика / Сборка для каждой созданной конфигурации установите единую культуру в «Культуры для сборки» и установите другое значение в поле «Определить переменные» для каждой культуры:
Например, для es-ES:
WixUILicenseRtf=.\Assets\license-es-ES.rtf
Для en-US:
WixUILicenseRtf=.\Assets\license-en-US.rtf
... так далее
Чтобы собрать установщики:
Для каждой культуры:
- Зайдите в диспетчер конфигурации,
- Выберите культуру конфигурации для установщика, примите
- Строить
Плюсы:
- Нет необходимости иметь дело с настраиваемыми действиями, настраиваемыми диалогами или консольными командами
- Настроить нужно только один раз. Заставить его работать - задача механика
Минусы:
- Требуется несколько дополнительных кликов для каждой сборки
- Беспорядок с более чем тремя культурами