2008-09-11 41 views
10

前陣子我在讀關於「Re-using Strings in Scripted Content」的W3C的文章,其中包含國際上一些有用的建議,但它給我的印象相左iwth的DRY(不要重複自己)原則消除重複的代碼。不要重複自己VS國際

採取他們的例子,我們可能有一些像這樣的代碼...

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原則的重構應該通過簡單實現功能來實現平衡,因爲它是必需的,而不是像這裏那樣難。

回答

16

我會盡量在語言資源中保留完整的句子。如你所說,你可能需要在不同的環境中使用不同的詞語。但更大的問題是,不同語言的句子順序可能會有所不同。所以從單詞構建字符串可能會導致問題。

只是存儲

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

在每種語言的語言資源。這裏的重複不是一個維護頭痛,而是試圖找出應用程序中所有單個單詞將彈出的位置。

+0

通過使用[i18next](http://i18next.com/pages/doc_features.html#nesting)的嵌套的功能我嘗試重新使用的詞彙,例如:`$ t(打印機)已經打開,所以我在一個地方有打印機這個詞。 – jamuhl 2012-10-22 11:29:25

0

我會建議在文本值中使用CMS而不是硬編碼來覆蓋本地化。

2

我Mendelt Siebenga同意時,他說你應該讓整個句子或詞組在您的語言資源文件。語法上的差異總是會阻止您跨語言進行單個詞替換。與第一個示例相比,這仍會導致重複代碼少,因爲您只需檢查對象類型及其狀態,然後從語言資源中打印相應的消息。

1

我想這取決於你打算實現的語言水平。

試圖通過減少碼重複,與這些真正的語言字符串交易,你只是暴露自己的語法和不同語言的結構邏輯的一個整體的其他層。在生成代碼時會涉及大量工作,這些代碼仍然保留了語言的原始結構,同時最大限度地減少了重複。

你必須決定哪一種方法更適合特定的問題;重複自己的代碼,或者試圖成爲所有交易的傑克的代碼,並且適應無數語言規則(無疑是維護的噩夢)。

當然,你也可以取得一箇中間路線,並儘量減少你的代碼repitition但放棄滿意的語法口才。以Ultima Online爲例,當它被本地化時,先前讀到「一堆329金幣」的字符串變成了「一堆金幣:329」。不是很好,但是一個相當合理的解決方案,可以輕鬆實現本地化。

2

我們儘量不要通過程序操作來創建消息字符串,因爲loc。團隊無法看到他們。

祿。團隊實際上更喜歡單獨但幾乎重複的消息 但是他們會接受參數化消息。

例如「%(appliance)%是%(on_or_off)%」。

這些參數可能會失效,但至少它在祿團隊工作時以及不會時更明顯。

6

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 

另見http://www.mihai-nita.net/article.php?artID=20060430a