【问题标题】:Weird behavior of Django translation of one word in plural and singular formDjango 以复数和单数形式翻译一个单词的奇怪行为
【发布时间】:2012-10-16 04:32:28
【问题描述】:

在我们的代码中,我们将单词“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 的错误吗?

【问题讨论】:

    标签: django internationalization translation pluralize


    【解决方案1】:

    这不是 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 文件时,它应该会为您处理好这些。

    【讨论】:

    • 感谢您的解释!! :) 我刚刚意识到在我们的中文版本中,数字放在对象后面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多