2017-04-09 101 views
0

我有一些模型是这样的:Django的翻译选择领域

class Payment(models.Model): 
    class Status(IntEnum): 
     open = 0 
     balance = 2 
     closed = 1 
    status = models.IntegerField(choices=enum_to_choices(Status), default=0, verbose_name=_("Status")) 

我使用一个枚举来表示我的选择,并在我的应用程序的其它部分使用它们。我将这些以元组的选择字段使用下面的代码:

from django.utils.translation import ugettext_lazy as _ 
def enum_to_choices(enum): 
    x = tuple([(x.value, _(x.name.replace("_", " "))) for x in enum]) 
    return x 

代码的转换部分的工作,我可以使用这些字段作为选择,但翻译不工作,这不是” t出现在我的翻译文件中。 如果我使用静态字符串如"open"将参数更改为uggettext_lazy,它确实显示出来。

这是怎么回事?

回答

0

在我看来,这与makemessages命令有关,该命令由于某种原因而与非静态字符串发生冲突。

我不能在阐述为什么,但这里是你如何解决这个问题:

你确实有在翻译文件手动创建的字符串 (django.po):

#: .\polls\models.py:enum_to_choices 

msgid "open" 
msgstr "ouvert" 

msgid "closed" 
msgstr "fermé" 

msgid "balance" 
msgstr "solde" 

别忘了django-admin compilemessages,并且翻译后的字符串应该会出现!
这并不理想,特别是对于长枚举,但总比没有好。

如果有人知道这里的makemessages内部工作(和xgettext程序,它使用),并有一个解释,请让我们知道^^


其他解决方案:请使用推荐选择结构

另一种解决方案,如果您不一定需要选择在枚举中,则使用选项结构as shown in the documentation

from django.utils.translation import ugettext_lazy as _ 

class Payment(models.Model): 
    OPEN = 0 
    CLOSED = 1 
    BALANCE = 2 
    STATUS_CHOICES = (
     (OPEN, _('open')), 
     (CLOSED, _('closed')), 
     (BALANCE, _('balance')), 
    ) 
    status = models.IntegerField(choices=STATUS_CHOICES, default=OPEN, verbose_name=_("Status")) 

然后在django-admin makemessages字符串将被添加到翻译文件。

你可以很容易得到一个选择的价值,就像使用一个枚举:

from .models import Payment 
new_payment = Payment.objects.create(status=Payment.OPEN)