Можно ли передать переменную в файл локализации 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)"
             />
[...]
Другие вопросы по тегам