2013-08-07 56 views
1

我讀過GNU Gettext manual about Translating plural forms,看看它的例子:爲什麼在gettext轉換文件中必須使用msgid_plural?

#, c-format 
msgid "One file removed" 
msgid_plural "%d files removed" 
msgstr[0] "%d slika je uklonjena" 
msgstr[1] "%d datoteke uklonjenih" 
msgstr[2] "%d slika uklonjenih" 

爲什麼從MSGID msgid_plural不同,不在於打敗有翻譯瞭解複數形式的目的是什麼?

我認爲我可以做這樣的事情(英文):

#, c-format 
msgid "X geese" 
msgstr[0] "%d goose" 
msgstr[1] "%d geese" 

#, c-format 
msgid "sentence_about_geese_at_the_lake" 
msgstr[0] "There is one goose at the lake." 
msgstr[1] "There are %d geese at the lake." 

(只使用一個MSGID)。在我的代碼

然後,我會碰到這樣的:

<?php echo $this->translate('X geese', $numberA); ?> 
<?php echo $this->translate('sentence_about_geese_at_the_lake', $numberB); ?> 

如果$ numberA是3,它會說: 「3個鵝。」

如果$ numberB爲0,則下一行將會顯示「湖中有0只鵝」。

(因爲對於英語,規則是(N!= 1),所以複數用於任何數量的比等於1 0或更大)。

對於我來說,爲同一個短語集合指定2個msgids似乎是多餘的。

感謝您的幫助!

回答

4

一個後面的gettext的想法是,msgid從源文件解壓縮以創建POT文件,這些文件被用作基礎對存儲在文件PO翻譯,後來編譯爲MO文件。如果找不到合適的翻譯,也使用A msgid

A msgid不是用戶不可讀的「關鍵」這是一個可以在程序中使用的真實詞組。所以當你的代碼請求翻譯爲複數(僞這裏):

ngettext("One file removed", "%d files removed", file_count) 

...這兩個字符串將使用)來提取源代碼信息;這些信息將作爲翻譯人員的指南b)當沒有找到適合當前語言環境的翻譯時作爲默認字符串。

這就是爲什麼複數字符串有兩個msgid:顯示它們是如何在源程序中定義的(對於翻譯人員)並用作默認(當不存在翻譯時)。

在其他定位系統,像Android String ResourcesRails YAML files,它就像你想象 - 相當於一個msgid是一個單一的「鑰匙」即使是複數,但後來真正的短語沒有在源代碼中使用,並即使對於原始語言,定義翻譯也是兩步操作。

相關問題