2011-09-14 73 views
2

试图制作一个多语言安装程序 - 该过程通常工作,但似乎无法安装本地化文件。MST为什么不包含具有不同内容的文件

每个本地化安装程序都可以独立运行并安装本地化文件,如eula.pdf。

我希望,我只是缺少变换生成步骤的标志(或者使用了错误的工具?)

过程由有一群为每种语言安装1开始。

要构建每个安装程序,我们使用-b "folder"-loc "folder"选项指定每个语言,其中包含一些替代文件内容,如licence.pdf。

进行本地化的文件有一个共同的源名称

<File Id='License.pdf' Name='eula.pdf' Source='License(EULA).pdf' KeyPath='yes'/> 
<WixVariable Id="WixUILicenseRtf" Value="License.rtf" /> 

例如是

en-US/License(EULA).pdf 
en-US/License.rtf 
en-US/Product.wxl 
fr-FR/License(EULA).pdf 
fr-FR/License.rtf 
fr-FR/Product.wxl 

也有一些文件,如文件夹binary.dll和binary.exe未本地化并且对所有msi都一样 - 不要期望在MST中看到它们。

该过程中的下一步是在基本语言(英语)和其他每种语言之间创建一个MST差异。使用Window SDK中的Windows\v7.1\Bin\MsiTran.exe

对于内容更改,MST看起来有点小。

使用Windows\v7.1\Samples\sysmgmt\msi\scripts\wisubstg.vbs

除英语之外的语言安装合并所有MST文件到一个单一的安装程序将显示整个安装程序UI包括许可证为被本地化的RTF版本,但在磁盘上的EULA.pdf是永远是基础英语。

使用Ant-DOTNET任务运行构建(如果它有差别) 微星建设任务

<wix mode="light" target="${outlocation}\${lang.folder}\my.msi" wixHome="${wixhome}"> 
     <lightArg line="-b &quot;${location}&quot;"/> <!-- provide the location of the signable binaries --> 
     <lightArg line="-b &quot;${msiwixsource}\Localisation\${lang.folder}&quot;"/> <!-- provide the location of the localisation --> 
     <lightArg line="-sice:ICE57"/> 
     <lightArg line="-cultures:${lang.culture}"/> 
     <lightArg line="-loc &quot;${msiwixsource}\Localisation\${lang.folder}\Product.wxl&quot;"/> 
     <lightArg line="-ext &quot;${wixhome}\WixUtilExtension.dll&quot;"/> 
     <lightArg line="-ext &quot;${wixhome}\WixUIExtension.dll&quot;"/> 
     <lightArg line="-ext &quot;${wixhome}\WixFirewallExtension.dll&quot;"/> 
     <lightArg line="-ext &quot;${wixhome}\WixNetFxExtension.dll&quot;"/> 
     <sources dir="${msiwixobjects}"> 
      <include name="*.wixobj"/> 
     </sources> 
     <moresources dir="${msiwixsource}\Localisation\${lang.folder}"> 
      <include name="*"/> 
     </moresources> 
     <moresources dir="${location}"> 
      <include name="binary.dll,binary.exe"/> 
     </moresources> 
    </wix> 

变换任务

<exec executable="${windowsSDKBin}"> 
     <arg value="-g"/> 
     <arg value="${outlocation}\en-US\my.msi"/> 
     <arg value="${outlocation}\${lang.folder}\my.msi"/> 
     <arg value="${outlocation}\${lang.folder}\my.mst"/> 
    </exec> 

的重新包装任务

<exec executable="cscript"> 
     <arg value="${windowsSDKMsi}"/> 
     <arg value="${outlocation}\my.msi"/> 
     <arg value="${outlocation}\${lang.folder}\my.mst"/> 
     <arg value="${lang.id}"/> 
    </exec> 

Product/@ Language =“!(loc.Lang)”在Product.wxl中指定 英文基地我们列出所有1033,1028,1029,1031,1036,1040,1041,1043,1045,1046,2052,3082其他语言只是具体的如1036 fr-FR

回答

2

好吧,所以经过几天的搜索,我找到了一篇文章,描述了这个问题。 How To Localize the Setup GUI and Deliver Localized Files Using a MST

问题在于MST不包括'_Streams'表格元素,这是CAB文件的存储位置。

你可以从你那去几个方面 -

1)使多个文件&组件条目与条件包含基于语言或文化

这意味着改变你的WXS,如果你想在不同的语言更改支持哪些语言。

<Component Directory="INSTALLDIR" Id='EULADoc' Guid='***'> 
    <Condition><![CDATA[(ProductLanguage = "1033")]]></Condition> 
    <File Id='License.pdf' Name='!(loc.EULA)' Source='en-US\License(EULA).pdf' KeyPath='yes'/> 
</Component> 
<Component Directory="INSTALLDIR" Id='EULADoc' Guid='***'> 
    <Condition><![CDATA[(ProductLanguage = "1046")]]></Condition> 
    <File Id='License.pdf' Name='!(loc.EULA)' Source='pt-BR\License(EULA).pdf' KeyPath='yes'/> 
</Component> 
... add a new block each time you add a language, changes to files have to be duplicated for every block. 

这又意味着重新编译而不是重新链接wxl。您仍然需要重新包装mst文件。

2)手动调整局部MSI

作为每How To Localize the Setup GUI and Deliver Localized Files Using a MST

3)自动分割局部项放入一个单独的CAB具有局部名

比相反重新编译这个然后重新链接和用于管理CAB文件额外的工艺。 额外的过程,以 - *提取的CAB文件(s)一起生成mst,
*然后当合并mst还添加cab文件。

添加具有本地化名称额外的媒体 - 我使用的是郎ID,因为它是方便

<Media Id="2" Cabinet="localised_!(loc.LANG).cab" EmbedCab="yes" /> 

更改本地化的文件/组件来自于新媒体

<Component Directory="INSTALLDIR" Id='EULADoc' Guid='***' DiskId='2'> 
    <File Id='License.pdf' Name='!(loc.EULA)' Source='License(EULA).pdf' KeyPath='yes'/> 
</Component> 

当使用MSITran.exe生成转换时,还使用MsiDb.Exe 导出本地化CAB文件当使用WiSubStg.vbs将转换合并到基本MSI时,还将CAB文件添加到_Streams使用WiStram.vbs

我已经与选项3 我希望别人认为这很有用。 注:

  • 我就不写了ANT的很多可以随意
  • 我们建立一个无符号的测试和发布签名版本提供建议,以便需要调整输入/输出位置找到二进制文件和msi。

和ant构建看起来如下所示。

<taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="buildjars"/> 
<taskdef name="for" classname="net.sf.antcontrib.logic.ForTask" classpathref="buildjars"/> 
<taskdef name="wix" classname="org.apache.ant.dotnet.wix.WixTask" classpathref="buildjars"/> 

<property name="wixhome" value="C:\Program Files (x86)\Windows Installer XML v3.5\bin"/> 

<property name="binarieslocation" value="build"/> 
<property name="msiwixsource" value="install"/> 
<property name="msiwixobjects" value="${msiwixsource}\obj\x64\Release"/> 
<!-- <dirname property="windowsSDK" file="C:\Program Files\Microsoft SDKs\Windows\v7.1\"/> Ant doesn't like path segments with . --> 
<property name="windowsSDKBin" location="C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\MsiTran.exe"/> 
<property name="windowsSDKCab" location="C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\MsiDb.Exe"/> 
<property name="windowsSDKMsiStorage" location="C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\sysmgmt\msi\scripts\WiSubStg.vbs"/> 
<property name="windowsSDKMsiStream" location="C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\sysmgmt\msi\scripts\WiStream.vbs"/> 
<property name="windowsSDKMsiLanguages" location="C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\sysmgmt\msi\scripts\WiLangId.vbs"/> 

<property name="cultureBase" value="en-US:en-US:1033"/> 
<property name="cultures" value="pt-BR:pt-BR:1046,cs-CZ:en-US:1029"/> 

<target name="installer"> 
    <echo>Building ${culture} msi using binaries in "${location}"...</echo> 
    <propertyregex property="lang.folder" input="${culture}" regexp="(.*):(.*):(.*)" select="\1"/> 
    <propertyregex property="lang.culture" input="${culture}" regexp="(.*):(.*):(.*)" select="\2"/> 

<wix mode="light" target="${outlocation}\${lang.folder}\my.msi" wixHome="${wixhome}"> 
    <lightArg line="-b &quot;${location}&quot;"/> <!-- provide the location of the signable binaries --> 
    <lightArg line="-b &quot;${msiwixsource}\Localisation\${lang.folder}&quot;"/> <!-- provide the location of the localisation --> 
    <lightArg line="-sice:ICE57"/> 
    <lightArg line="-cultures:${lang.culture}"/> 
    <lightArg line="-loc &quot;${msiwixsource}\Localisation\${lang.folder}\Product.wxl&quot;"/> 
    <lightArg line="-ext &quot;${wixhome}\WixUtilExtension.dll&quot;"/> 
    <lightArg line="-ext &quot;${wixhome}\WixUIExtension.dll&quot;"/> 
    <sources dir="${msiwixobjects}"> 
     <include name="*.wixobj"/> 
    </sources> 
    <moresources dir="${msiwixsource}\Localisation\${lang.folder}"> 
     <include name="*"/> 
    </moresources> 
    <moresources dir="${location}"> 
     <include name="binary.dll,binary.exe"/> 
    </moresources> 
</wix> 

</target> 

<target name="checkTransform" depends="installer"> 
    <uptodate property="transform.notRequired" targetfile="${outlocation}\${culture}\my.mst" > 
     <srcfiles dir= "${outlocation}\en-US\" includes="my.msi"/> 
     <srcfiles dir= "${outlocation}\${lang.culture}\" includes="my.msi"/> 
    </uptodate> 
</target> 

<target name="transform" depends="checkTransform" unless="transform.notRequired"> 
    <echo>Building ${culture} mst ...</echo> 
    <propertyregex property="lang.folder" input="${culture}" regexp="(.*):(.*):(.*)" select="\1"/> 
    <propertyregex property="lang.id" input="${culture}" regexp="(.*):(.*):(.*)" select="\3"/> 

    <!-- Generate the mst 'diff' file - this does not include exporting the language specific cab file to match --> 
    <exec executable="${windowsSDKBin}"> 
     <arg value="-g"/> 
     <arg value="${outlocation}\en-US\my.msi"/> 
     <arg value="${outlocation}\${lang.folder}\my.msi"/> 
     <arg value="${outlocation}\${lang.folder}\my.mst"/> 
    </exec> 

    <!-- Exporting the language specific cab file to match --> 
    <delete file="localised_${lang.id}.cab" /> 
    <delete file="${outlocation}\${lang.folder}\localised_${lang.id}.cab" /> 
    <exec executable="${windowsSDKCab}"> 
     <arg value="-d"/> 
     <arg value="${outlocation}\${lang.folder}\my.msi"/> 
     <arg value="-x"/> 
     <arg value="localised_${lang.id}.cab"/> 
    </exec> 
    <move file="localised_${lang.id}.cab" tofile="${outlocation}\${lang.folder}\localised_${lang.id}.cab"/> 
</target> 

<!-- Target to build MSIs using unsigned binaries --> 
<target name="MSIs"> 
    <!-- we always need english as it is the base multilingual --> 
    <antcall target="installer"> 
     <param name="culture" value="${cultureBase}" /> 
     <param name="location" value="${location}" /> 
     <param name="outlocation" value="${outlocation}" /> 
    </antcall> 
    <!-- build the different cultures and make transforms 
    parallel="true" sometimes fails--> 
    <for list="${cultures}" param="culture" > 
     <sequential> 
     <antcall target="transform"> 
      <param name="culture" value="@{culture}" /> 
      <param name="location" value="${location}" /> 
      <param name="outlocation" value="${outlocation}" /> 
     </antcall> 
     </sequential> 
    </for> 
</target> 

<!-- depends="transform" --> 
<target name="transformRepack" > 
    <echo>Packing ${culture} mst into multilingual installer...</echo> 
    <propertyregex property="lang.folder" input="${culture}" regexp="(.*):(.*):(.*)" select="\1"/> 
    <propertyregex property="lang.id" input="${culture}" regexp="(.*):(.*):(.*)" select="\3"/> 

    <exec executable="cscript"> 
     <arg value="${windowsSDKMsiStream}"/> 
     <arg value="${outlocation}\my.msi"/> 
     <arg value="${outlocation}\${lang.folder}\localised_${lang.id}.cab"/> 
     <arg value="localised_${lang.id}.cab"/> 
    </exec> 
    <exec executable="cscript"> 
     <arg value="${windowsSDKMsiStorage}"/> 
     <arg value="${outlocation}\my.msi"/> 
     <arg value="${outlocation}\${lang.folder}\my.mst"/> 
     <arg value="${lang.id}"/> 
    </exec> 
</target> 

<target name="MSIMulti" depends="MSIs"> 
    <echo>Making multilingual installer...</echo> 

    <copy file="${outlocation}\en-US\my.msi" todir="${outlocation}"/> 

    <for list="${cultures}" param="culture"> 
     <sequential> 
     <antcall target="transformRepack"> 
      <param name="culture" value="@{culture}" /> 
      <param name="location" value="${location}" /> 
      <param name="outlocation" value="${outlocation}" /> 
     </antcall> 
     </sequential> 
    </for> 
    <!-- report what was packed --> 
    <propertyregex property="lang.ids" input="${cultures}" regexp="([^:,]*):([^:]*):([^,]*)" replace="\3" global="true" defaultvalue="failed"/> 
    <echo/> 
    <echo>Multilingual installer should include transform language ids </echo> 
    <echo>${lang.ids}</echo> 
    <echo>Multilingual installer reports transform language ids...</echo> 
    <exec executable="cscript"> 
     <arg value="${windowsSDKMsiStorage}"/> 
     <arg value="${outlocation}\my.msi"/> 
    </exec> 
    <exec executable="cscript"> 
     <arg value="${windowsSDKMsiLanguages}"/> 
     <arg value="${outlocation}\my.msi"/> 
     <arg value="Package"/> 
     <arg value="1033,${lang.ids}"/> 
    </exec> 
</target> 

<target name="UnsignedMSIMulti" > 
    <antcall target="MSIMulti"> 
     <param name="location" value="${binarieslocation}" /> 
     <param name="outlocation" value="${binarieslocation}" /> 
    </antcall> 
</target> 
相关问题