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

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;
    }


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

<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>


在其他安装包中。能够像这样将参数传递给String表也是解决此问题的一种可行方法,但是我还没有弄清楚如何将参数传递给String表。你知道怎么做吗?

最佳答案

感谢PhilDW的评论,我找到了DTF解决方案,它非常简单。使用Session.Format方法(是MsiFormatRecord周围的DTF包装器),可以简单地替换本地化字符串中的属性。在以上示例的基础上,必须将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>

09-25 18:07
查看更多