使用Wix进行MSI安装程序本地化的斗争

使用Wix进行MSI安装程序本地化的斗争,wix,windows-installer,Wix,Windows Installer,我正在尝试设置使用Wix开发的MSI安装程序以支持多语言UI,因此我创建了Strings\u en-us.wxl文件以包含以下内容: <?xml version="1.0" encoding="utf-8"?> <WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization"> <String Id="Language">1033</

我正在尝试设置使用Wix开发的MSI安装程序以支持多语言UI,因此我创建了
Strings\u en-us.wxl
文件以包含以下内容:

<?xml version="1.0" encoding="utf-8"?>
<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization">
  <String Id="Language">1033</String>
  <String Id="Codepage">1252</String>
  <String Id="DowngradeErrorMessage">A newer version of [ProductName] is already installed.</String>
</WixLocalization>
我立即得到一个错误:

错误CNDL0276:代码页'!(loc.Codepage)“”不是有效的窗口 代码页。请检查您的应用程序中的Product/@Codepage属性值 源文件


那么,我做错了什么呢?

从没有任何答复来看,我会得出结论,这是不可能的

我不确定这是微软的错还是Wix解析器中的遗漏?唯一的方法是将代码页码硬编码到.wxs文件本身,这非常不方便,因为在为不同语言重新编译时,必须将其切换到适当的代码页码。除此之外,现在到底是谁在使用代码页

另外,为了一劳永逸地解决这个问题,我试着这样做(就像从一开始就应该这样做):

它已编译,但生成的MSI文件的UI如下所示:)

扩展元素具有一个属性
@Codepage
,该属性覆盖指定的
产品/@Codepage
。从链接页面:

结果数据库的代码页整数值或web名称。您还可以指定-1,它将不会重置数据库代码页


同样相关的是,如果问题中没有直接提到,那么本地化字符串在最终MSI中会出现在两个不同的位置:摘要信息流和安装程序数据库中。有关更多信息,请参阅。SIS的代码页由属性
Package/@SummaryCodepage
指定,您可以在该属性中使用
!(loc)
变量。

我在这方面没有经验,但。。。Windows Installer使用代码页获取摘要信息和字符串。它们有不同的用法和限制。您不能将任何Unicode代码页ID放入Product/@codepage中。这些链接可能有助于:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="$(var.ProduceCode)"
           Name="TestSetupProject1"
           Version="$(var.Version)"
           Language="!(loc.Language)" 
           Codepage="!(loc.Codepage)"
           Manufacturer="$(var.CompanyName)" 
           UpgradeCode="$(var.UpgradeCode)">
Codepage="UTF-8"