6

在 .NET 之前,我们有自己的短语本地化系统,并且我们构建了一种将注释嵌套在格式字符串中的方式,例如:“{0:price}”。随着岁月的流逝,我发现我越来越想念它。

似乎没有一种方法可以在 .NET 中像这样在原位记录格式化字符串:

string.Format("{0//numerator} / {1//denominator} = {2//ratio}"
              ,somevar
              ,anothervar
              ,yetanothervar);

这在本地化/短语学中特别有用,其中插入点被重新排序,而无需更改代码:

string.Format("Dividing {1//denominator} into {0//numerator} gives {2//ratio}"
              ,somevar
              ,anothervar
              ,yetanothervar);

当术语在维护/本地化等中重新排列时,任何人都有任何技巧来记录这些内容以避免错误?

注释很重要的原因是,对于本地化和配置,通常字符串不在带有变量的代码中——我在资源文件、app.config 和数据库中都有它们。

在实际示例中,子类化控件公开了 PhraseID 属性(控件映射到从表单生成的 XML 文件中的 ID,并且表单控件被即时翻译),因此子类化表单执行以下操作:

// Handle the phrases without insertion points - this is in the base class
foreach (Control in this.Controls) {
    IXLatable ixl = (IXLatable) Control;
    ixl.Text = GetPhrase(ixl.PhraseID);
}

// in the individual form classes, they override the behavior for complex displays:
lnkPublish.Text = string.Format(GetPhrase(lnkPublish.PhraseID), filename, foldername, userid);

字典包含默认和本地化字符串,例如:

phraseid, language code, phrase
1,en,"{0//filename} published to {1//foldername} by {2//userid}"
1,pl,"{2//userid} ublishedpay ethay ilefay {0//filename} otay {1//foldername}"

如果在默认短语中提供了注释,那么翻译者(从未看过源代码)将索引错误的可能性要小得多。非本地化的演讲者更容易解决翻译资源中的问题。

4

2 回答 2

4

您可以查看Phil Haack 的 NamedFormat extension,它允许您使用类似的格式

NamedFormat("{{{foo}}}", new {foo = 123})
于 2009-09-22T18:27:44.297 回答
2

在您的示例中,将变量命名为有意义的东西,将具有与注释相同的影响。

于 2009-09-22T18:23:44.047 回答