tutorial - ¿Es posible localizar el EULA en WiX usando el archivo.wxl?
wix visual studio 2015 (3)
Hay otra forma de hacerlo, y aunque es un poco desordenado, es menos desordenado que las dos soluciones que ha mencionado el OP. Y crédito por el crédito, esta respuesta se basa casi en un 100% en esta publicación http://weblogs.sqlteam.com/mladenp/archive/2010/04/15/WiX-3-Tutorial-Custom-EULA-License-and -MSI-localization.aspx por Mladen Prajdić.
Lo siguiente está basado en WiX 3.5.
Crea una copia ligeramente modificada del cuadro de diálogo LicenseAgreementDlg y lo incluye en su proyecto.
<?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>
En su archivo fuente principal de WiX, agregue el siguiente código para "parchar" su nuevo diálogo en la secuencia de diálogo en lugar del original:
<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>
Tenga en cuenta que esto se basa en el uso de la colección de diálogos WixUI_InstallDir; para otras colecciones, como WixUI_Mondo, probablemente tendrá que modificar lo anterior al buscar en la fuente.
Finalmente, en cada uno de sus archivos de localización, coloca una línea como esta:
<String Id="LicenseRtf">en-us/MerliniaSMSGatewayLicense.en-us.rtf</String>
<String Id="LicenseRtf">da-dk/MerliniaSMSGatewayLicense.da-dk.rtf</String>
Y, por supuesto, coloca el archivo de licencia localizado como se indica. Estoy colocando los archivos de licencia (y los archivos de localización) en subcarpetas, pero esto no es necesario.
Como dije, es un poco complicado, pero funciona.
Mi instalador, creado con WiX se localiza a través de archivos .wxl. Es posible en WiX especificar varias culturas y se llamará a light.exe varias veces, creando un instalador para cada idioma (esto está disponible mientras se construye el instalador desde Visual Studio).
Todos los archivos de trabajo a excepción de EULA. Se define en el archivo .wxs a través de
<WixVariable Id=''WixUILicenseRtf'' Value=''en.rtf'' />
Y no sé una buena manera de cambiar este valor del archivo de localización .wxl. Utilizando
<WixVariable Id=''WixUILicenseRtf'' Value=''!(loc.EulaFile)'' />
<String Id=''EulaFile''>en.rtf</String>
No funciona, los archivos sice .wxl se usan en tiempo de enlace y .wxs se compila antes que ellos, por lo que el compilador no puede encontrarlos !(loc.EulaFile)
. Buscando foros, he encontrado dos soluciones. Lo primero es crear un cuadro de diálogo de licencia personalizado para cada idioma, parece funcionar, pero es una forma muy difícil y el código fuente de bloating es mucho. La segunda forma es soltar la construcción de Visual Studio / Votive y llamar a light.exe varias veces, especificando diferentes archivos de licencia cada vez mediante la tecla de línea de comandos -d.
¿Hay alguna manera de resolver este problema y usar archivos EULA localizados para que el proyecto se pueda construir en VisualStudio + Voltive sin necesidad de copiar y pegar muchos diálogos? Localizar instaladores es un problema muy común, entonces ¿existe alguna solución que no sepa?
La mejor solución es la más simple, solo use la variable WixUILicenseRtf
en la línea de comando cuando especifique su archivo .wxl
.
light -loc setup_fr-FR.wxl -dWixUILicenseRtf=EULA_fr-FR.rtf ...
Consulte los Fundamentos de la interfaz de usuario en WiX Wiki para obtener más información.
Localizar el EULA es muy simple. Agregue un control de texto desplazable a uno de sus cuadros de diálogo. Haga referencia a una cadena de localización en el elemento de texto del control ScrollableText.
<Control Id="LicenseText" Type="ScrollableText" X="20" Y="60" Width="330" Height="140" Sunken="yes" TabSkip="no">
<Text>!(loc.License)</Text>
</Control>
Luego crea un archivo de localización, por ejemplo para inglés americano. Denomine el archivo en-US.wxl. Cree un elemento de cadena de localización en el archivo de localización que utiliza el identificador al que se hace referencia en el elemento de texto del control ScrollableText , en este caso se llama licencia. Agregue la cadena rtf sin formato de su EULA como un elemento CDATA de la cadena de localización.
Para obtener los datos brutos, cree un archivo rtf con un wordpad, por ejemplo. Abra ese archivo rtf con el bloc de notas y copie su contenido. Pegue ese contenido en el elemento CDATA del elemento Cadena de localización. Asegúrese de omitir todos los espacios en blanco entre las etiquetas String y CDATA .
Un ejemplo de elemento de cadena localizado siguiente:
<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>
Por lo tanto, la clave para incluir múltiples EULA es utilizar los datos rtf en bruto en los respectivos archivos de localización.