Internationalization Don';不要重复自己与国际化的较量
不久前,我正在阅读W3C关于“”的文章,其中包含了一些关于国际化的有用建议,但我觉得这与消除重复代码的枯燥(不要重复)原则不一致 以他们为例,我们可能会有这样的代码Internationalization Don';不要重复自己与国际化的较量,internationalization,Internationalization,不久前,我正在阅读W3C关于“”的文章,其中包含了一些关于国际化的有用建议,但我觉得这与消除重复代码的枯燥(不要重复)原则不一致 以他们为例,我们可能会有这样的代码 print "The printer is "; if (printer.working) { print "on.\n"; } else { print "off.\n"; } print "The stapler is "; if (stapler.working) { print "on.\n"; }
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”一词在这两种情况下显然是不同的
所以,我想我的问题是,其他开发人员是如何平衡干式原则和代码国际化的
我有一部分想说,国际化是一种极端的编程“情况”。然而,另一方面,考虑到干式原则的重构应该通过使其易于实现所需的功能来平衡这一点,不像这里那样难。我建议在文本值中使用CMS而不是硬编码来覆盖本地化。我会尽量在语言资源中保留完整的句子。正如你所说,在不同的语境中,你可能需要不同的词语。但更大的问题是,不同语言的句子顺序可能不同。因此,从单词中构建字符串可能会导致问题 只是储存
The printer is on
The printer is off
The stapler is on
The stapler is off
在每种语言的语言资源中。这里的重复与其说是维护方面的头痛,不如说是试图找出应用程序中所有单个单词的弹出位置。我同意Mendelt Siebenga的说法,他说你应该在语言资源文件中保留完整的句子或短语。语法上的差异总是会妨碍你跨语言替换单个单词。这仍然会导致比第一个示例更少的重复代码,因为您只需要检查对象类型及其状态,然后从语言资源打印适当的消息。我认为这取决于您希望达到的语言质量级别 通过尽量减少处理这些真实语言字符串的代码的重复,您将自己暴露在不同语言的语法和结构中的另一层逻辑中。在生成代码时需要做大量的工作,这些代码仍然保留语言的原始结构,同时尽量减少重复 你必须决定哪种方法更适合解决某个问题;重复自身的代码,或试图成为各行各业的高手并适应无数语言规则的代码(无疑是维护的噩梦)
当然,你可以找到一个折衷点,尽量减少代码重复,但放弃令人满意的语法口才。以Ultima Online为例,当它被本地化时,一个先前读为“一堆329金币”的字符串变成了类似“一堆329金币”的东西。不太好,但这是一个相当合理的解决方案,易于本地化。我们尽量不通过程序操纵创建消息字符串,因为loc。球队看不到他们 loc。团队实际上更喜欢单独但几乎重复的消息。 但是,它们将接受参数化消息 例如,“%(设备)%为%(打开或关闭)%”
这些参数可能会出现故障,但至少loc团队更清楚地知道它何时起作用,何时不起作用。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
另请参见通过使用的嵌套功能,我尝试重用术语表,例如:打开了$t(打印机)
,因此我将术语打印机放在了一个位置。