创建本地化的WIX 3.6引导程序。

16

我在一年多前使用Visual Studio 2010创建了一个WIX项目。它会生成一个MSI文件和一个引导程序setup.exe文件,实际上,它会为英语和法语这两种语言分别生成这一对文件。现在我正在将这个项目与我们的TFS CI构建集成。但我无法让CI构建生成bootstrapper setup.exe文件。

我们最近将所有构建服务器上的Wix升级到了Wix 3.6 RC。因此,我想尝试使用Burn而不是使用旧的引导程序样式。我在解决方案中添加了一个新的引导程序项目。引导程序项目包括一个简单的bundle.wxs,仅加载由我的旧MSI项目生成的MSI文件。但是,当我尝试构建时,出现以下错误:

 

error LGHT0103: 系统找不到文件'C:\Tf\Advantage\Dev\Solution\Configuration\LaunchPad.Wix\bin\Release\fr-fr\LaunchPad.msi;C:\Tf\Advantage\Dev\Solution\Configuration\LaunchPad.Wix\bin\Release\en-us\LaunchPad.msi'。

我的bundle中的package引用如下:

<MsiPackage Id="MyApplication" SourceFile="$(var.LaunchPad.Wix.TargetPath)" />

LaunchPad.Wix是Wix MSI项目的名称。如果我将LaunchPad.Wix项目更改为仅构建一种语言,则可以正常工作。看起来启动程序项目类型似乎不支持为多种语言构建安装文件。这是真的吗?您有任何解决方法吗?

编辑

经过进一步的调查,我想知道启动程序项目是否支持本地化。我尝试将我的Wix MSI项目设置为仅创建fr-fr。我的启动程序项目创建的setup.exe是英文的。当我编辑启动程序项目的项目属性时,“要构建的区域设置”字段被锁定并为空白。我该如何构建非英语启动程序?这可行吗?


这个CodePlex项目中有一个引导程序本地化示例 - 带源代码: https://classicwixburntheme.codeplex.com/ - Morten Frederiksen
2个回答

23

这里有几个要点:

  1. 如果您使用多个Culture,那么在MSBuild之外的某些东西中使用TargetPath时,您将无法使用单个文件名。正如您发现的那样,TargetPath是已构建的本地化文件的列表。但是,如果您限定了.msi包的输出语言,则可以使用TargetPath:<MsiPackage SourceFile="$(var.TestMsi.en-US.TargetPath)" Id="MsiEnUs" />

  2. 如果您想创建一个可安装en-US和fr-FR的引导程序,则需要在其自己的MsiPackage元素中分别列出每个.msi包。

  3. 如果您想创建两个引导程序,一个en-US和一个fr-FR,则需要分别调用bootstrapper .wixproj两次,每种语言一次。引导程序不支持Cultures“技巧”--从单个MSBuild调用产生两个输出是有问题的(请注意TargetPath问题)。

如果您正在使用WixStandardBootstrapperApplication,则它会根据用户UI语言自动尝试本地化UI,然后回退到系统UI语言,最后回退到英语。它会在以LCID命名的目录中查找本地化字符串,因此您需要像这样传输负载:

<Payload Name="1033\thm.wxl" SourceFile="..." />
<Payload Name="1036\thm.wxl" SourceFile="..." />

很遗憾,WixStandardBootstrapperApplication 字符串目前只提供 en-US 版本。这就是为什么 fr-FR 引导程序显示英文界面的原因。你需要对 WiX 源文件 HyperlinkTheme.wxl 或 RtfTheme.wxl 进行本地化(取决于你使用哪个主题)。这两个文件都在 src\ext\BalExtension\wixstdba\Resources 中。


我们的en-US和fr-FR安装包除了WIX UI字符串外完全相同。我刚刚注意到burn安装程序根本不显示MSI UI。有没有办法让burn引导程序使用我的MSI UI而不是burn UI?如果可以,我可以创建两个项目-一个用于每个MSI(en-US和fr-FR)。听起来我的另一个选择是单个引导程序。我将在burn中创建UI(包括en-US和fr-FR翻译)。根据用户的操作系统语言设置,Burn将显示正确的翻译。这听起来对吗? - Matt Varblow
好的。如果本地化引导程序,您只需要一个 .msi 文件。或者您可以更进一步,将代码移动到一个 .msi 文件中,将本地化资源移动到每种语言的一个 .msi 文件中。如果只有两种语言,这样做不会节省太多空间,但我曾经参与过发布十几种语言的产品,这样做可以节省空间并简化修补程序,因为通常只修补代码而不是资源。 - Bob Arnson
我想创建一个引导程序,可以安装en-US/fr-FR/ko-KO/th-TH/ar-SA/el-GR,并自动检测当前系统语言,然后将UI字符串翻译成系统语言。我该如何实现?在引导程序中有一个标签,WixStandardBootstrapperApplication/@LocalizationFile属性,需要手动选择,如何根据系统语言自动选择它? - George Varghese

4

很好,它像Bob Arnson所说的那样有效。

但是您必须注意有效载荷的名称和SourceFile。

<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
      <Payload Name="2052\thm.wxl" SourceFile="2052\thm.wxl" />
</BootstrapperApplicationRef>

如果您更改名称为另一个名称,则启动程序将无法本地化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接