我使用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()),答案指向一个有趣的方向。但这很棘手,我老实说有点过头了。
你能想到另一种实现这个目标的方法吗?也许是一个现有的插件?