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

问题描述 投票:0回答:4

我需要在 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
>

也不起作用。

我哪里错了?

感谢您的帮助和您的时间。

user-interface variables localization wix wix3.5
4个回答
19
投票

本地化字符串是在链接时处理的,因此您不能使用 $(var) 预处理器变量。只要使用本地化字符串的地方支持运行时格式化(例如,使用格式化字段类型),就支持使用 [property] 引用。


16
投票

你的第二种方法应该可以正常工作。这与默认

.wxl
文件使用的方法相同。

例如,在您的

.wxl
文件中,您将声明您的字符串:

<String Id="Message_Foo">Foo blah blah [Property1]</String>

并在您的

.wxs
文件中声明该属性。如果您愿意,您可以声明该属性以匹配 WiX 变量(听起来您正在尝试这样做)

<Property Id="Property1">$(var.Property1)</Property>

1
投票

预处理器变量

$(var.VariableName)
在链接时进行处理,因此理想情况下您可以使用在主 Product 元素上定义的
[PropertyName]

有时问题是属性尚未定义,例如在本地化文件上使用产品名称似乎不可能。

此解决方案的目的是仅在给出“超级产品”作为产品名称后键入产品名称:

  • 如果通过 Visual Studio 扩展运行:
    • 项目属性 -> 构建 -> 定义变量 -> “MyProductName=超级产品”(无引号)
  • 如果从 cmd 或其他地方运行:
    • 在 Light.exe 上,添加 -d"MyProductName=超级产品"

进入本地化.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)"
             />
[...]

1
投票

我试图获取本地化文件以使用变量。看到这篇文章

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 文件:

© www.soinside.com 2019 - 2024. All rights reserved.