Django:多次选择模型的字段并翻译它们

时间:2017-12-15 10:43:11

标签: python django django-models django-i18n

我使用Django's i18n mechanisms翻译多种语言的应用程序(Django 1.11)。

情况

我有一个带有Field takings选择的模型:

from django.utils.translation import ugettext_lazy as _

class Offer(models.Model):
    WEEK = 'week'
    MONTH = 'month'
    YEAR = 'year'
    DURATION_CHOICES = (
        (WEEK, _('week'),
        (MONTH, _('month'),
        (YEAR, _('year'),
    )
    duration = models.CharField(choices=DURATION_CHOICES, max_length=5, blank=True, null=True, \
        verbose_name=_("offer's duration"), help_text=_("Duration for which an offer, once subscribed, stays valid")

如果我想在模板中显示此字段:

{{ counter }} remaining {{ offer.get_duration_display}}{{ counter|pluralize}}

其中counter是一个整数,offer是一个Offer对象。这里效果很好,因为('周','月','年')的复数形式是('周','月','年'),相同的单词带's'结尾。

问题

现在让我们说我想将我的应用翻译成法语。 这很棘手,因为相应的翻译是('semaine','moi s ','année'),他们的复数形式是('semaines','moi s ','années'):'月'的翻译以单数和复数形式相同

所以我想做的是在持续时间字段中为每个选项定义自定义复数形式。

果然,我可以使用if语句,但这不优雅也不实用。所以我试图找到一个DRY解决方案。

我尝试了什么

您可以轻松地为模型名称提供复数形式  使用verbose_name_plural,但我找不到任何字段或选项。

所以我尝试使用ungettext_lazy function,如下所示:

修改:所以,它出现一个must not choose a custom name other than _ for gettext and consorts

from django.utils.translation import ungettext_lazy as _

class Offer(models.Model):
    WEEK = 'week'
    MONTH = 'month'
    YEAR = 'year'
    DURATION_CHOICES = (
        (WEEK, _('week', 'weeks')),
        (MONTH, _('month', 'months')),
        (YEAR, _('year', 'years')),
    )

django-admin makemessages -l fr会在* .po文件中输出这些字符串,但它不起作用:在英语中,get_duration_display()返回一个空字符串。

无论如何,我不知道如何使用它,因为你无法将参数传递给get_FOO_display函数......

问题

有没有办法做到这一点? (无需在我的视图或模板中使用条件语句)。

我是否必须覆盖现有功能或编写新功能?

我发现了这个问题(Django: override get_FOO_display()),答案指向一个有趣的方向。但这很棘手,我老实说有点过头了。

你能想到另一种实现这个目标的方法吗?也许是一个现有的插件?

0 个答案:

没有答案