【问题标题】:Creating localized WIX 3.6 bootstrappers.创建本地化的 WIX 3.6 引导程序。
【发布时间】:2012-06-28 18:16:32
【问题描述】:

一年多前,我在 Visual Studio 2010 中创建了一个 WIX 项目。它会创建一个 MSI 文件和一个引导程序 setup.exe。实际上,它为两种语言(英语和法语)创建了这对文件。我刚刚将此项目集成到我们的 TFS CI 构建中。我无法让 CI 构建生成引导程序 setup.exe 文件。

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

错误 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'。

我在捆绑包中的包引用如下所示:

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

LaunchPad.Wix 是 Wix MSI 项目的名称。如果我将 LaunchPad.Wix 项目更改为仅构建一种语言,那么它可以正常工作。在我看来,引导程序项目类型只是不支持为多种语言构建设置文件。这是真的?有什么解决方法的建议吗?

编辑

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

【问题讨论】:

标签: visual-studio-2010 localization wix wix3.6 burn


【解决方案1】:

这里发生了几件事:

  1. 如果您使用多个区域性,则不能在 MSBuild 之外需要单个文件名的内容中使用 TargetPath。如您所见,TargetPath 是已构建的本地化文件的列表。但是,如果您限定 .msi 包的输出语言,则可以使用 TargetPath:&lt;MsiPackage SourceFile="$(var.TestMsi.en-US.TargetPath)" Id="MsiEnUs" /&gt;

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

    李>
  3. 如果要创建两个引导程序,一个 en-US 和一个 fr-FR,则需要调用引导程序 .wixproj 两次,每种语言一次。引导程序不支持文化“技巧”——从一次 MSBuild 调用产生两个输出是有问题的(见证 TargetPath 问题)。

如果您使用的是 WixStandardBootstrapperApplication,它会自动尝试根据用户 UI 语言对 UI 进行本地化,然后回退到系统 UI 语言,最后回退到英语。它在以 LCID 命名的目录中查找本地化字符串,因此您将拥有如下所示的有效负载:

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

不幸的是,WixStandardBootstrapperApplication 字符串目前仅适用于 en-US。这就是为什么 fr-FR 引导程序以英语显示 UI。您需要本地化 WiX 源文件 HyperlinkTheme.wxl 或 RtfTheme.wxl(取决于您使用的主题)。这两个文件都在 src\ext\BalExtension\wixstdba\Resources 中。

【讨论】:

  • 我们的 en-US 和 fr-FR 安装包是相同的,除了 WIX UI 字符串。我刚刚注意到刻录安装程序根本没有显示 MSI UI。有没有办法让烧录引导程序使用我的 MSI 的 UI 而不是烧录 UI?如果是这样,我可以创建两个项目 - 每个 MSI(en-US 和 fr-FR)一个。听起来我的另一个选择是单个引导程序。我会在刻录中创建 UI(带有 en-US 和 fr-FR 翻译)。 Burn 将根据用户的操作系统语言设置显示正确的翻译。听起来对吗?
  • 对。如果您本地化引导程序,您将只需要一个 .msi。或者您可以更进一步,将代码移动到一个 .msi 并将本地化资源移动到每种语言的一个 .msi。仅使用两种语言不会为您节省太多,但我已经开发过提供十几种语言的产品,它节省了空间并简化了修补程序,因为您通常修补代码而不是资源。
  • 我想创建一个可以安装 en-US/fr-FR/ko-KO/th-TH/ar-SA/el-GR 的引导程序,它会自动检测当前系统语言,然后将 UI 字符串翻译成系统语言。我怎样才能实现它? bootstrapper中有一个标签,WixStandardBootstrapperApplication/@LocalizationFile属性,需要手动选择,如何根据系统语言自动选择?
【解决方案2】:

很好。正如 Bob Arnson 所说的那样。

但是一定要注意payload的名字和SourceFile。

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

如果您将名称更改为另一个名称。引导程序不会被本地化。

【讨论】:

    猜你喜欢
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多