不要重复自己vs国际化
前一段时间,我在阅读有关"在脚本内容中重新使用字符串"的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原则与代码国际化之间取得平衡?
我的一部分希望证明,国际化是我们不希望使用这种极端编程的情况之一。另一方面,考虑到DRY原理进行重构,可以通过轻松实现所需功能(而不是在此难度下实现)来平衡这一点。
解决方案
回答
我建议我们在文本值中使用CMS而不是硬编码来覆盖本地化。
回答
我会尝试在语言资源中保留完整的句子。正如我们所说的,我们可能需要在不同的上下文中使用不同的单词。但是更大的问题是,不同语言的句子顺序可能会有所不同。因此,用单词构建字符串可能会引起问题。
只是存储
The printer is on The printer is off The stapler is on The stapler is off
在每种语言的语言资源中。与试图弄清楚所有单个单词将在应用程序中弹出的位置相比,这里的重复操作不会造成维护上的麻烦。
回答
我同意Mendelt Siebenga的看法,他说我们应该将整个句子或者短语保留在语言资源文件中。语法上的差异将始终使我们无法跨语言进行单个单词替换。与第一个示例相比,这将导致重复代码更少,因为我们只需要检查对象类型及其状态,然后从语言资源中打印适当的消息即可。
回答
我想这取决于我们要达到的语言质量水平。
通过尝试最小化处理这些真实语言字符串的代码的重复,我们只是将自己暴露在不同语言的语法和结构的另一层逻辑中。在编写代码时将涉及大量工作,这些代码仍保留了语言的原始结构,同时最大程度减少了重复。
我们必须确定哪种方法更适合解决特定问题。重复出现的代码,或者试图成为千篇一律的代码,并适应无数种语言规则的代码(无疑是维护的噩梦)。
当然,我们可以采取中间立场,最大程度地减少代码的重复性,但要放弃令人满意的语法口才。以本地化的Ultima Online为例,以前读为"一堆329金币"的字符串变成了"一堆金币:329"。并不是很好,但是是一个相当合理的解决方案,可以很容易地进行本地化。
回答
我们尽量不要通过程序操作来创建消息字符串,因为loc。团队看不到他们。
位置。团队实际上更喜欢单独但几乎重复的消息。
但是,它们将接受参数化的消息。
例如,"%(电器)%为%(on_or_off)%"。
这些参数可以分解,但是至少对于loc团队更有效和何时无效。
回答
100%同意孟德尔。
这不仅是维护问题,而且还可能是语言问题。
在所有拉丁语言中,主题的性别,数量和情况都会影响其他要素。
罗马尼亚文示例
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
另请参阅http://www.mihai-nita.net/article.php?artID=20060430a