12

不久前,我正在阅读关于“在脚本内容中重用字​​符串”的 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 原则和他们的代码国际化?

我的一部分想争辩说,国际化是那些极端编程“<a href="http://www.extremeprogramming.org/rules/early.html" rel="noreferrer">你不需要它”的情况之一。然而,另一方面,考虑到 DRY 原则的重构应该通过使其易于实现所需的功能来平衡这一点,而不是像这里那样更难。

4

6 回答 6

16

我会尝试在语言资源中保留完整的句子。正如您所说,您可能需要在不同的上下文中使用不同的单词。但更大的问题是不同语言的句子顺序可能不同。因此,从单词中构建字符串可能会导致问题。

只是存储

The printer is on
The printer is off
The stapler is on
The stapler is off

在每种语言的语言资源中。与试图找出所有单个单词将在您的应用程序中弹出的位置相比,这里的重复与其说是令人头疼的维护问题。

于 2008-09-11T14:02:44.453 回答
7

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

于 2008-09-19T16:48:33.137 回答
2

我同意 Mendelt Siebenga 的观点,他说你应该在你的语言资源文件中保留整个句子或短语。语法上的差异总是会阻止您跨语言进行单个单词替换。与第一个示例相比,这仍然会导致更少的重复代码,因为您只需要检查对象类型及其状态,然后从语言资源中打印适当的消息。

于 2008-09-11T14:12:39.670 回答
2

我们尽量不通过程序操作来创建消息字符串,因为 loc. 团队看不到他们。

地点。团队实际上更喜欢单独但几乎重复的消息。但是,它们将接受参数化消息。

例如,“%(appliance)% 是 %(on_or_off)%。”

参数可能会崩溃,但至少对于 loc 团队来说,它什么时候可以工作,什么时候不可以更明显。

于 2008-09-13T22:14:59.823 回答
1

我想这取决于您要达到的语言质量水平。

通过尽量减少处理这些真实语言字符串的代码重复,您只是将自己暴露于不同语言的语法和结构中的另一层逻辑。生成代码将涉及大量工作,这些代码仍然保留语言的原始结构,同时最大限度地减少重复。

您必须决定哪种方法更适合解决特定问题;重复自己的代码,或试图成为多面手并适应无数语言规则的代码(无疑是维护的噩梦)。

当然,您可以采取中间立场,尽量减少代码重复,但放弃令人满意的语法口才。以 Ultima Online 为例——当它被本地化时,一个以前写着“一堆 329 个金币”的字符串变成了“一堆金币:329”。不是很好,但是一个相当合理的解决方案,很容易本地化。

于 2008-09-11T14:18:29.237 回答
0

我建议使用 CMS 而不是在文本值中硬编码来涵盖本地化。

于 2008-09-11T13:59:17.377 回答