是否可以将变量传递到WIX本地化文件



我需要在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)"
             />
[...]

最新更新