创建本地化的 Windows Installer 和引导程序:第 3 部分






4.60/5 (3投票s)
本系列文章是使用一些实际需求构建可本地化 Windows Installer & Bootstrapper 的完整端到端解决方案。
- 第 1 部分:介绍 & 设置
- 第 2 部分:定义条件
- 第 3 部分:本地化
- 第 4 部分:提供先决条件
引言
在第 1 部分和 2 部分中,我们使用 Wix 以 MSI 文件的形式创建了一个 Windows Installer。在实际应用中,安装程序通常需要本地化,在本部分中,我们将介绍一种将安装程序本地化为第二种语言的解决方案;在本例中为意大利语。
严格来说,Windows Installer 不支持多种语言,并且在任何给定时间只能存储一组字符串。然而,它提供了一个可以通过转换实现本地化的机制。转换是一个增量 MST
文件,可以包含在主 MSI 包内或外。通过将转换文件提供给 Windows Installer,在安装开始之前,MSI 内容将在运行时被 MST 文件中的匹配内容替换,这非常适合本地化。
我们的本地化解决方案包括以下步骤:
- 使 Wix 源文件可本地化
- 生成 MSI 文件的意大利语版本
- 创建 MST 转换文件
- 将转换文件嵌入到原始 MSI 中
本地化 Wix
Wix 包含本地化所需的所有工具,我们正在使用的 WixUI
库已经为提供的 UI 对话框提供了现成的翻译。本地化创作功能允许我们将可本地化字符串移至单独的 Wix 翻译文件中,然后由 LIGHT 在生成 MSI 时进行替换。这最终将使以后生成转换文件更加容易。
在提供的解决方案中,所有自定义字符串都已移至外部本地化文件中,并使用相关的区域代码进行命名。然后,在主源文件中使用 !(loc.VariableName)
语法引用这些文件。本地化文件中的 WixLocalization
元素必须包含正确的 Culture
和 Codepage
属性值,这样本地化版本才能与不同的字符集正确运行。我们还添加了语言 LCID
作为翻译字符串,以便我们可以在主项目中将语言代码作为变量引用并覆盖产品语言属性。
最终的本地化文件看起来像这样:
<WixLocalization Culture="en-GB"
xmlns="http://schemas.microsoft.com/wix/2006/localization" Codepage='1252'>
<String Id='LANG' Overridable="yes">1033</String>
<String Id="Windows7Required" Overridable="yes">
This application only runs on Windows 7.</String>
...
</WixLocalization>
主源代码如下引用这些本地化字符串:
<Condition Message='!(loc.Windows7Required)'>
<![CDATA[VersionNT = 601 AND WindowsBuild > 7100]]>
</Condition>
一旦字符串被重构到本地化文件中,我们就可以继续将其翻译成多种语言。为每种新语言创建一个本地化文件集,并相应地设置区域代码属性。
创建本地化 MSI
LIGHT 提供了一些方便的功能,可以让我们创建 MSI 的本地化版本。首先,该实用程序接受多个包含不同区域代码的翻译文件。然而,输出文件将只包含一组翻译字符串。那么这如何工作呢?
诀窍在于 cultures
参数,它接受一个按优先级排序的区域代码列表。从左到右,LIGHT 将在提供的翻译中查找每个字符串的第一个匹配区域代码。这允许我们在翻译集中构建回退机制。
请注意,WixVariables 无法引用本地化翻译变量,因此要替换服务条款协议的路径,我们必须修改解决方案,使其通过命令行传递。然后,我们可以为每个本地化安装程序传递对不同协议文件的引用。
因此,通过实现此技术,我们可以像这样创建安装程序的意大利语版本:
light.exe -o bin\Release\Setup.msi
-ext WixNetFxExtension.dll
-ext WixUIExtension.dll
-cultures:"it-IT,en-GB"
-dWixUILicenseRtf=Binary\EULA_it-IT.rtf
Main.wixobj
Component.wixobj
-loc it-IT.wxl
-loc en-GB.wxl
上面的示例将查找意大利语翻译,对于找不到的任何字符串,它将回退到英语。注意,WXL
文件的命名对链接器无关紧要。
创建转换
现在我们有了 MSI 的英语和意大利语版本,我们可以生成转换文件。转换文件将包含两个文件之间的差异集。在这种情况下,它将仅包含意大利语翻译和一个新的协议文件。
Wix TORCH 工具用于如下创建转换 MST
文件:
torch.exe setup.msi it-IT\setup.msi -o it-IT.mst
生成的 it-IT.mst 文件比原始文件小,并且包含可以应用于原始 MSI 文件以本地化安装程序的转换。它可以与 MSI 文件一起部署,但在我们的例子中,我们希望嵌入转换文件,以便创建一个单一的 MSI 以便轻松部署。
在这里,我们可以利用 Windows Installer 一个未记录且不受支持的功能,该功能允许我们根据用户的区域设置自动检测安装程序的语言。通过将转换文件命名为相应的 LCID
,Windows Installer 将在运行时自动应用该转换。
用于将 MST 嵌入为特定名称的工具是从 Microsoft Windows 软件开发工具包 中获取的一个脚本。它如下使用,其中 1040
是意大利语 LCID
:
cscript.exe WiSubStg.vbs setup.msi it-IT.mst 1040
嵌入后,可以通过命令行显式应用转换以启动安装程序的意大利语版本。
msiexec /i setup.msi TRANSFORMS=":1040"
注意 TRANSFORMS=":1040"
语法(带冒号)应用于嵌入式转换,而 TRANSFORMS="it-IT.mst"
(不带冒号)将应用外部转换文件。
要测试自动语言检测功能,请通过打开控制面板并导航到区域设置来更改区域设置。在定义日期和时间格式的第一个对话框中,从语言选择器中选择意大利。应用设置,然后启动不带参数的 MSI。此时您应该会看到安装程序的意大利语版本。
摘要
在本系列的这一部分中,我们通过利用 Wix 工具并利用 Windows Installer 的一些未记录的功能,讨论了本地化安装程序。我们的安装程序几乎完成了。在 第 4 部分 中,我将展示如何创建安装程序的引导程序,该程序将检测并安装任何必需的组件。
历史
- 2010年8月22日:初始发布