前段时间我正在阅读关于'Re-using Strings in Scripted Content'的W3C文章,其中包含一些关于国际化的有用建议,但这让我感到不安,因为DRY(不要重复自己)消除重复的原则代码。
举个例子,我们可能会有这样的代码......
print "The printer is ";
if (printer.working) {
print "on.\n";
} else {
print "off.\n";
}
print "The stapler is ";
if (stapler.working) {
print "on.\n";
} else {
print "off.\n";
}
我的直觉就是大致消除重复......
report-state(printer, "printer");
report-state(stapler, "stapler");
function report-state(name, object) {
print "The "+name+" is ";
if (object.working) {
print "on\n";
} else {
print "off\n";
}
}
...但如果我们需要将其本地化为西班牙语,那么这样做会导致代码出现问题,因为在这两种情况下,“on”这个词显然不同。
所以,我想我的问题是,其他开发人员如何平衡DRY原则与其代码的国际化?
我的一部分想要争辩说,国际化是极端编程“you arent gonna need it”情况之一。然而,另一方面,考虑到DRY原则的重构应该通过使其易于实现所需的功能来平衡这一点,而不是像在此那样更难。
答案 0 :(得分:16)
我会尝试在语言资源中保留完整的句子。正如你所说,在不同的背景下你可能需要不同的词。但更大的问题是句子的顺序在不同的语言中可能会有所不同。因此,从单词构建字符串可能会导致问题。
只需存储
The printer is on
The printer is off
The stapler is on
The stapler is off
在每种语言的语言资源中。这里的重复不是一个维护问题,而是试图找出应用程序中弹出所有单个单词的位置。
答案 1 :(得分:7)
100%同意Mendelt。
这不仅是一个维护问题,也可能是一个语言问题。 在所有拉丁语言中,主题的性别,数量和案例都会影响其他元素。 罗马尼亚语的例子
The printer is on: Imprimanta este pornită // feminine
The printer is off: Imprimanta este oprită
The stapler is on: Perforatorul este pornit // masculine
The stapler is off: Perforatorul este oprit
答案 2 :(得分:2)
我同意Mendelt Siebenga的说法,他说你应该在你的语言资源文件中保留完整的句子或短语。语法上的差异总是会阻止你跨语言进行单个单词替换。与第一个示例相比,这仍然会导致重复性较低的代码,因为您只需要检查对象类型及其状态,然后从语言资源中打印相应的消息。
答案 3 :(得分:2)
我们尽量不通过程序操作来创建消息字符串,因为loc。团队看不到他们。
loc。团队实际上更喜欢单独但几乎重复的消息 但是他们会接受参数化的消息。
例如,“%(设备)%是%(on_or_off)%。”
参数可以分解,但至少对于本地团队来说,当它工作时和不工作时都会更明显。
答案 4 :(得分:1)
我认为这取决于您希望达到的语言质量水平。
通过尝试最小化处理这些真实语言字符串的代码的重复,您只是将自己暴露给不同语言的语法和结构中的另一层逻辑。在编写代码时会涉及大量工作,这仍然保留了语言的原始结构,同时最大限度地减少了重复。
您必须决定哪种方法更适合某个特定问题;重复自己的代码,或者试图成为所有行业杰克的代码,并适应无数的语言规则(毫无疑问是维护噩梦)。
当然,你可以打中间立场,尽量减少你的代码重复,但放弃令人满意的语法口才。以Ultima Online为例 - 当它被本地化时,之前读作“一堆329金币”的字符串变成了“一堆金币:329”。不是很好,但是一个相当合理的解决方案很容易实现本地化。
答案 5 :(得分:0)
我建议在文本值中使用CMS而不是硬编码来覆盖本地化。