我需要在 WIX 本地化文件 WIXUI_en-us.wxl 中使用变量。 我尝试像这样使用它:
<String Id="Message_SomeVersionAlreadyInstalled" Overridable="yes">A another version of product $(var.InstallationVersionForGUI) is already installed</String>
但这不起作用。当我声明财产并以这种方式使用它时:
<String Id="Message_SomeVersionAlreadyInstalled" Overridable="yes">A another version of product [InstallationVersionForGUI] is already installed</String
>
也不起作用。
我哪里错了?
感谢您的帮助和您的时间。
本地化字符串是在链接时处理的,因此您不能使用 $(var) 预处理器变量。只要使用本地化字符串的地方支持运行时格式化(例如,使用格式化字段类型),就支持使用 [property] 引用。
你的第二种方法应该可以正常工作。这与默认
.wxl
文件使用的方法相同。
例如,在您的
.wxl
文件中,您将声明您的字符串:
<String Id="Message_Foo">Foo blah blah [Property1]</String>
并在您的
.wxs
文件中声明该属性。如果您愿意,您可以声明该属性以匹配 WiX 变量(听起来您正在尝试这样做)
<Property Id="Property1">$(var.Property1)</Property>
预处理器变量
$(var.VariableName)
在链接时进行处理,因此理想情况下您可以使用在主 Product 元素上定义的 [PropertyName]
。
有时问题是属性尚未定义,例如在本地化文件上使用产品名称似乎不可能。
此解决方案的目的是仅在给出“超级产品”作为产品名称后键入产品名称:
进入本地化.wxl文件:
<String Id="Description" Overridable="yes">Description of !(wix.MyProductName)
to make it more interesting</String>
我有一个附加的配置文件 .wxi,我在其他文件中包含一些变量,例如,在这里我对值进行了硬编码,但现在它在变量定义上进行了硬编码,我使用给定的值:
<?xml version="1.0" encoding="utf-8"?>
<Include>
<!-- Define the product name preprocesor variable -->
<?define ProductName="!(wix.ProductNameDefVar)" ?>
<!-- From this point, can use the preprocesor var -->
<?define ProductName_x64="$(var.ProductName) (64bit)" ?>
<?define ProductName_x32="$(var.ProductName) (32bit)" ?>
<?define CompanyDirName = "My company name" ?>
</Include>
最后,没有插值本地化文本的本地化值的地方是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<!-- Include the config file with the preprocesor var -->
<?include $(sys.CURRENTDIR)\Config.wxi?>
<!-- Main product definition -->
<Product Id="$(var.ProductCode)"
Name="$(var.ProductName)"
Language="!(loc.Language)"
Version="$(var.BuildVersion)"
Manufacturer="!(loc.Company)"
UpgradeCode="$(var.UpgradeCode)">
<!-- Package details -->
<!-- Here, Description was not interpolating -->
<Package InstallerVersion="200"
Compressed="yes"
InstallScope="perMachine"
Platform="$(var.Platform)"
Manufacturer="!(loc.Company)"
Description="!(loc.Description)"
Keywords="!(loc.Keywords)"
Comments="!(loc.Comments)"
Languages="!(loc.Language)"
/>
[...]
我试图获取本地化文件以使用变量。看到这篇文章:
WiX(candle 的预处理器)中有不同层的变量 变量,Light 的 WixVariables/本地化变量/binder 变量和 MSI 的属性)。每个都有不同的语法并且是 不同时间评估:
Candle 的预处理器变量“$(var.VariableName)”被评估 当蜡烛运行时,可以从蜡烛的命令行和从 ” 的陈述。构建时环境 属性以及自定义变量也可以类似地访问 (将“var.”前缀更改为其他值)。
Light 可从命令行访问的变量是 WixVariables,并通过“!(wix.VariableName)”访问它们 句法。要从命令行访问变量,您需要 将您的字符串更改为:此版本准备于 !(wix.BuildMachine)
如果您需要将 BuildMachine 值作为 MSI 存在 安装时的属性(这是“[VariableName]”语法) 您需要将以下内容添加到 a 中的 wxs 文件之一 已链接的片段:
现在,环境变量 COMPUTERNAME 始终保存的名称 我过去构建过机器,您可以通过以下方式访问它: $(env.COMPUTERNAME).所以,你可以摆脱命令行添加 到 light.exe 并像这样更改你的 wxs 文件: