2012-12-05 65 views
3

當我讀到GettextICU MessageFormat時,兩者都被描述爲反對本地化的方法。將Gettext和ICU MessageFormat結合使用是個好主意嗎?

但我認爲,兩者的結合將是一個有趣的想法:使用MessageFormat進行格式設置,使用Gettext根據語言選擇合適的模板。沿線:

setlocale(LC_ALL, lang) 
output = MessageFormat(lang, gettext("There is {number 1} Foo in bar."), [1]) 

這種方法是否有明顯的(或不是那麼明顯)的缺點?我是否缺少MessageFormat的核心部分,關於如何選擇已翻譯的模板?

回答

2

你的方法明顯的問題是如何處理複數形式。儘管ICU內置了對CLDR's plural rules的支持,但它並不像gettext所使用的那樣容易和靈活。
基本上,在gettext中,譯員可以根據需要添加任意數量的複數形式,並由.po文件頭中的選擇規則進行管理。它比使用CLDR規則更靈活和更正確(這可能不正確,取決於CLDR版本)。

+0

我在你的字符串中有多個參數的情況下質疑斷言:'X猴子(s)剝Y香蕉(s)'。這正是這種情況,當Gettext結果在'if' /'else'地獄,而MessageFormat可能提供一個單一的解決方案:http://pastebin.com/yBf6AR8M – Boldewyn

+1

@Boldewyn:嗯,使用MessageFormat和ICU是,這些規則是完全不可讀的。更糟的是,大多數翻譯人員並不熟悉他們,解釋它的工作原理並不容易。也沒有可能修改複數規則(他們給出),而你可以用Gettext來完成。最後但並非最不重要的一點,你提到的情況是一個很好的例子。不僅僅是因爲複數形式,而且還因爲語法情況的困難問題。通常有寫信息的方法來避免這種情況。 –

+1

謝謝你的回答!我要求一個目的。基本上,我現在的基於Gettext的代碼看起來就像這樣:https://github.com/Boldewyn/Codepoints.net/blob/master/codepoints.net/views/codepoint/info.php,這一切都很好本地化。 (甚至不可能用任何非英語的語言進行本地化。)我正在尋找一種方法來解決*在本地化工具中,例如通過利用MessageFormat的選擇機制。我也很想嘗試Mozilla的新L20n方法,但目前沒有PHP實現。 (順便說一下,我是一個巨大的Gettext粉絲。) – Boldewyn

相關問題