2010-09-02 8 views
6

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).¿Es posible localizar el EULA en WiX usando el archivo .wxl?

Todo el archivo de obras, excepto el EULA. Se define en .wxs archivo 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. Usando

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

no está funcionando, SICE archivos .wxl se utilizan durante el enlace y .wxs se compila delante de ellos, por lo que el compilador no puede encontrar !(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?

Respuesta

5

Hay otra manera de hacer esto, y aunque es un poco desordenado, es menos sucio que las dos soluciones que el OP ha mencionado. Y crédito donde se debe crédito, esta respuesta es casi 100% basada en esta publicación http://weblogs.sqlteam.com/mladenp/archive/2010/04/15/WiX-3-Tutorial-Custom-EULA-License-and-MSI-localization.aspx de Mladen Prajdić.

Lo siguiente se basa en WiX 3.5.

Crea una copia ligeramente modificada del cuadro de diálogo LicenseAgreementDlg e inclúyalo 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 el archivo principal fuente de WiX se agrega el siguiente código de "parche" el nuevo cuadro de diálogo en la secuenciación de diálogo en lugar de la 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 WixUI_InstallDir colección de diálogos: para otras colecciones, como WixUI_Mondo, probablemente tendrá que modificar lo anterior mirando la fuente.

Por último, en cada uno de sus archivos de localización de colocar una línea como la siguiente:

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

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

Y, por supuesto, se coloca el archivo de licencia localizada 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.

+0

no se puede hacer funcionar en WiX 3.7. ¿Se ha eliminado el soporte de localización del elemento de texto desde WiX 3.0? – ivan

+0

@ivan Está funcionando bien para mí con WiX 3.7. – RenniePet

+0

El usuario @kadorken, en una edición sugerida, señaló lo siguiente: "Asegúrese de colocar las directivas de publicación del parche DESPUÉS de su directiva UIRef ID =" WixUI_InstallDir "para que sean eficaces." – RenniePet

7

La mejor solución es la más simple, solo use la variable WixUILicenseRtf en la línea de comando al especificar su archivo .wxl.

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

Consulte User Interface Basics en WiX Wiki para obtener más información.

+0

¡Muchas gracias! Como dijiste; La mejor solución es la más simple! ¡Salvaste mi día! – Sander

1

Localización del EULA es muy simple. Agregue un ScrollableText Controle 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 cree un archivo de localización, por ejemplo para american english. 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 ScrollableText Control, en este caso se llama Licencia. Agregue la cadena rtf en bruto de su EULA como un CDATA elemento 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 la Cadena y CDATA Etiquetas.

Un elemento de cadena ejemplo localizada sigue:

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

Así que la clave para incluyendo múltiples de EULA es utilizar los datos RTF primas en los respectivos archivos de localización.

Cuestiones relacionadas