在我们的代码中,我们将单词“Photo”标记为单数翻译。在代码中的不同位置,我们在复数翻译“照片”/“照片”中有这个词,谎言:
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] ""
“Photo”没有msgid,导致“Photo”根本没有翻译,因为实际的翻译字符串不存在 - 除非在* n * gettext中使用,但不是在{%trans'照片'%}。
我在这里做错了吗?它是Django的错误吗?
答案 0 :(得分:7)
这不是Django中的错误 - 您试图在两个不同的地方以两种不同的方式翻译术语“照片”。曾经作为一个普通的(数字不可知的)术语,一次作为一个数字感知术语。无法在PO文件中表示该文件,该文件只能有一个带有msgid“Photo”的条目。
(请注意,在您的情况下,“照片”的处理方式不同,因为就gettext而言,它仅作为简单术语翻译一次。)
多种形式在不同语言中可能会有很大不同,在这种情况下,您不应该只是尝试本地化单个名词“Photo”。相反,你应该使用每种语言的单数和复数形式本地化术语“x Photo(s)”。
(在英语中,那将是“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],但gettext应该在为该语言生成PO文件时为您处理。