3

在我们的代码中,我们将单词“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] ""

“照片”没有 msgid,导致根本不翻译“照片”,因为实际的翻译字符串不存在 - 除非在 * n *gettext 中使用,但在 {% trans 'Photo' %} 中不存在。

我在这里做错了吗?它是一个 Django 错误吗?

4

1 回答 1

7

这不是 Django 中的错误——您试图在两个不同的地方以两种不同的方式翻译术语“照片”。一次是一个普通的(与数字无关的)术语,一次是一个数字感知术语。没有办法在 PO 文件中表示它,它只能有一个带有 msgid "Photo" 的条目。

(请注意,在您的情况下,“照片”的处理方式不同,因为就 gettext 而言,它只翻译一次,作为一个简单的术语。)

复数形式在不同语言中可能有很大不同,在这种情况下,您不应该只尝试本地化单个名词“照片”。相反,您应该将术语“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 文件时,它应该为您处理好这些。

于 2012-10-25T23:26:08.297 回答