【问题标题】:Django - multiple pluralization in admin modelDjango - 管理模型中的多重复数
【发布时间】:2013-03-04 20:34:12
【问题描述】:

我用谷歌搜索了很长时间,但没有任何结果。我是 Django 的初学者,所以我不知道它的所有功能。但是这个问题对客户来说非常重要:-(你能帮帮我吗?

所以,我定义了这个模型:

from django.utils.translation import ugettext_lazy as _

class Product(Model):
    #translation for model and set db table name
    class Meta:
        verbose_name = _('product')
        verbose_name_plural = _('products')
        ...

现在,由于捷克语,我需要将这些写在管理员列表中:

  • 0 výrobků
  • 1 个视频
  • 2-4 výrobky
  • 5- výrobků

在其他任何地方,我都成功地使用了ungettext。但是,我不知道如何在 Meta 中计数。我发现这是抽象的(但似乎没用):

class Model(DjangoModel):

    class Meta:
        abstract = True

    def get_description(self):
        return ungettext(self.verbose_name, self.verbose_name_plural, self.count) % \
                   {'count':self.count, 'name':self.name}

来源来自django internationalization: counter is not available when marking strings for pluralization

也许,最后可以显示语言定义(尝试从 msgid 添加/删除 %s):

msgid "%s product"
msgid_plural "%s products"
msgstr[0] "%s 1 výrobek"
msgstr[1] "%s 2 výrobky"
msgstr[2] "%s 5 výrobků"

如果您需要更多信息来提问,我一定会提供。

非常感谢您。

更新
请确保我在 .po 文件中使用以下内容:

"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"

再一次,除了管理员模型,它在其他任何地方都可以工作。问题不是一般如何运行多重复数,而是如何更改管理中的任何内容(例如新的抽象模型等)以在那里运行它......

【问题讨论】:

    标签: python django python-2.7 django-1.5


    【解决方案1】:

    你需要放入你的 .po 文件:

    "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
    

    然后,在您的模板中,您使用复数形式传递一个有效的计数器。 Gettext 拥有所需的所有信息:

    • 它知道有多少复数形式
    • 它知道如何计算数字的复数
    • Django 将 msg_id 传递给复数和一个计数器

    【讨论】:

    • 嘿,我写道,我在其他任何地方都成功地使用了它,只是在管理模型中它不起作用。我确实更新了帖子,以确保每个人都会看到我在 .po 文件中有此文本。
    【解决方案2】:

    深入了解 Django 源代码后,如果不覆盖许多功能,这是不可能在管理用例中实现的。

    【讨论】: