2017-04-09 103 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)