2012-10-25 29 views
2

在我們的代碼中,我們有單詞「Photo」標記爲單數翻譯。在代碼中的不同位置,我們有多元化的翻譯「照片」 /「照片」這個詞,liek這樣:Django翻譯複數和單數形式的單詞的奇怪行爲

1 {% trans 'Photo' %} 
2 {% trans 'Photos' %} 

{{ x }} {% blocktrans count counter=x %}Photo{% plural %}Photos{% endblocktrans %} 

可能的話,我們必須用我們的計數器變量x 裏面的翻譯字符串。但是,我無法在文檔中找到有關此要求的任何內容。總之,我們的代碼,所有我們在PO文件得到的是:

msgid "Photos" 
msgstr "" 

msgid "Photo" 
msgid_plural "Photos" 
msgstr[0] "" 
msgstr[1] "" 

沒有MSGID爲「照片」,導致「照片」沒有被翻譯可言,因爲實際的翻譯字符串不存在 - 用於* n * gettext,但不在{%trans'照片'%}中。

我在這裏做錯了什麼?它是一個Django錯誤嗎?

回答

6

這不是Django中的錯誤 - 您試圖在兩個不同的地方以兩種不同的方式來翻譯術語「照片」。曾經是一個普通的(數量不可知的)術語,曾經是一個數字意識的術語。無法在PO文件中表示該文件,該文件只能有一個帶有「Photo」的條目。

(請注意,「照片」在你的情況不同的處理,因爲只要gettext的而言,它只是一次翻譯,作爲一個普通的術語。)

複數形式可以是跨語言有很大不同,在這種情況下,您不應該試圖將單個名詞「照片」本地化。相反,您應該在每種語言中爲單數和複數情況本地化術語「x照片」。

(在英文中,這將是「1張照片」和「{x}照片」,但在其他語言中,您可能多於或少於兩個,而數字本身甚至可能不會在「照片」,這就是爲什麼你必須本地化整個學期)

在你的模板,那麼,你應該有:

{% blocktrans count counter=x %}{{ count }} Photo{% plural %}{{ count }} Photos{% endblocktrans %} 

那麼你的PO文件應包含這樣的臺詞:

msgid "%(count)s Photo" 
msgid_plural "%(count)s Photos" 
msgstr[0] "" 
msgstr[1] "" 

和您可以爲每種語言本地化msgstr[0](單數大小寫)和msgstr[1](複數大小寫)。有些語言需要的不僅僅是[0]和[1],但是當它爲該語言生成PO文件時,gettext應該爲您處理。

+0

感謝您的解釋! :)我剛剛意識到,在我們的中文版本中,數字放在對象後面。 –