Можно ли передать переменную в файл локализации WIX?
Мне нужно использовать переменную в файле локализации 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
>
тоже не работает.
Где я был не прав?
Спасибо за помощь и ваше время.
4 ответа
Строки локализации обрабатываются во время компоновки, поэтому вы не можете использовать переменные препроцессора $(var). Поддерживается использование ссылки [property], если место, где используется строка локализации, поддерживает форматирование во время выполнения (например, с использованием типа поля Formatted).
Ваш второй метод должен работать просто отлично. Это тот же метод, который используется по умолчанию .wxl
файлы.
Например, в вашем .wxl
файл, который вы бы объявили своей строкой:
<String Id="Message_Foo">Foo blah blah [Property1]</String>
И в твоем .wxs
файл, вы объявляете собственность. Если вы хотите, вы можете объявить свойство в соответствии с переменной WiX (что, как вам кажется, вы пытаетесь сделать)
<Property Id="Property1">$(var.Property1)</Property>
Я пытался получить файл локализации для использования переменных. Наткнулся на этот пост:
В WiX есть разные слои переменных (переменные препроцессора свечи, переменные Light WixVariables/ переменные локализации / переменные связующего и свойства MSI). Каждый из них имеет разный синтаксис и оценивается в разное время:
Переменные препроцессора свечи "$(var.VariableName)" оцениваются при запуске свечи и могут быть установлены из командной строки свечи и из операторов "". Свойства среды сборки, а также пользовательские переменные также могут быть доступны аналогично (изменяя префикс "var." На другие значения).
Переменные Light, доступные из командной строки, являются WixVariables, и доступ к ним осуществляется через синтаксис "!(Wix.VariableName)". Чтобы получить доступ к вашей переменной из командной строки, вам нужно изменить строку на: Эта сборка была подготовлена! (Wix.BuildMachine)
Если вам вместо этого нужно, чтобы значение BuildMachine существовало как свойство MSI во время установки (это синтаксис "[VariableName]"), вам необходимо добавить следующее в один из ваших файлов wxs во фрагменте, который уже связан в:
Теперь переменная окружения COMPUTERNAME всегда содержала имя моих машин сборки в прошлом, и вы можете получить к нему доступ таким образом: $(env.COMPUTERNAME). Таким образом, вы можете избавиться от дополнения командной строки для light.exe и изменить свой файл wxs следующим образом:
Переменные препроцессора$(var.VariableName)
обрабатываются во время компоновки, поэтому в идеале вы должны использовать[PropertyName]
который будет определен в основном элементе Product.
Иногда проблема заключается в том, что свойство еще не определено, например, использование имени продукта в файле локализации кажется невозможным.
Это решение было сделано с целью ввести название продукта только после того, как в качестве названия продукта было указано « Суперпродукт »:
- В случае запуска через расширение Visual Studio:
- Свойства проекта -> Сборка -> Определить переменные -> "MyProductName=Super product" (без кавычек)
- В случае запуска из cmd или другого места:
- В Light.exe добавьте -d"MyProductName=Super product"
В файл локализации .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)"
/>
[...]