如何在 Wix 和 DTF 中本地化自定义操作的错误消息?

How to localize Error Messages for a Custom Action in wix and DTF?

我在 DTF 中编写了一个自定义操作,并希望为其生成本地化的错误消息。到目前为止,我已经通过以下方式解决了这个问题: 自定义操作包括一个方法,该方法显示已在字符串 table 中定义的消息,如下所示:

public static string getError(Session session, short errorNo)
    {
        Database db = session.Database;
        string errorMessage = (string)db.ExecuteScalar("SELECT `Message` FROM `Error` WHERE `Error` = {0}", errorNo);
        db.Close();
        return errorMessage;
    }

要使用此错误消息,必须在 UI 元素下创建一个 Error 元素,如下所示:

<UI>
  <Error Id="42042">!(loc.Error42042)</Error>
</UI>

然后可以将实际错误消息存储在本地化变量 Error42042 中,如下所示:

<String Id="Error42042">My localized Error Message.</String>

这种方法虽然有一个严重的局限性,但效果很好:它不会替换字符串中的属性。所以字符串

<String Id="Error42043">[MY_PROPERTY] is broken</String>

将逐字显示为 [MY_PROPERTY] is broken

我是否需要扩展我的 getError 方法以手动替换属性(即借助正则表达式或其他一些文本替换技术)?

wix 源代码中是否有我可以用于 属性 替换的预定义函数?

这是完全错误的方法吗?

我见过

形式的字符串
<String Id="Error2227">Param: [2]. Invalid param "[3]" in action: [4].</String>

在其他安装包中。能够像这样给字符串table传递参数也是解决这个问题的可行方法,但是我一直没有想出如何给字符串table传递参数。你知道怎么做吗?

感谢 PhilDW I have found the DTF solution and it is amazingly simple. Using the Session.Format method, which is a DTF wrapper around MsiFormatRecord 的评论,我们可以简单地替换本地化字符串中的属性。基于上面的示例,getError 方法必须扩展为以下内容:

public static string getError(Session session, short errorNo)
    {
        Database db = session.Database;
        string errorMessage = (string)db.ExecuteScalar("SELECT `Message` FROM `Error` WHERE `Error` = {0}", errorNo);
        db.Close();
        errorMessage = session.Format(errorMessage);
        return errorMessage;
    }

现在,可以使用 Formatted 语法替换本地化字符串中的属性,如下所示:

<String Id="Error42043">{[MY_PROPERTY]} is broken</String>