我需要在WIX本地化文件WIXUI_en-us.wxl中使用变量。我试着这样使用它:
<String Id="Message_SomeVersionAlreadyInstalled" Overridable="yes">A another version of product $(var.InstallationVersionForGUI) is already installed</String>
但是它不起作用。当我声明property并这样使用它时:
<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>
我试图让本地化文件使用变量。看到这篇文章:
在WiX (candle)的预处理器中有不同层次的变量变量,Light的WixVariables/本地化变量/绑定器变量和MSI的属性)。每个都有不同的语法和是在不同时间求值:
Candle的预处理器变量"$(var.VariableName)"被求值当蜡烛运行时,可以从蜡烛的命令行和"语句。Buildtime环境属性和自定义变量也可以以类似的方式访问(将"var."前缀更改为其他值)。
Light的变量可以从命令行访问WixVariables,通过"!(wix.VariableName)"访问它们语法。要从命令行访问变量,您需要将字符串更改为:此构建是在此基础上准备的! (wix.BuildMachine)
如果您需要将BuildMachine值作为MSI存在属性(即"[VariableName]"语法)您需要将以下内容添加到一个WXS文件中已经链接在:
中的片段现在,环境变量COMPUTERNAME始终保存的是我过去的构建机器,你可以这样访问它:美元(env.COMPUTERNAME)。因此,您可以摆脱命令行添加将您的WXS文件更改为:
预处理器变量$(var.VariableName)
是在链接时处理的,所以理想情况下你会使用[PropertyName]
,它将被定义在主Product元素上。
问题有时是属性尚未定义,例如在本地化文件中使用产品名似乎是不可能的。
这个解决方案的目的是只在给定的情况下输入产品名称& 超级产品&;如产品名称:
- 如果通过visual studio扩展运行:
- 项目属性->构建→定义变量->"MyProductName =超级product"(没有引号)
- 如果从cmd或其他地方运行:
- 在Light.exe上添加-d"MyProductName=Super product"
到localization .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)"
/>
[...]