如何制作内容类型外键i18n?

时间:2012-01-17 09:25:39

标签: django django-contenttypes django-nani

我正在使用Django开发一个多语言应用程序。 一部分是使用ContentType API选择某种类型。

如文档中所述,ContentType对象名称是从verbose_name中提取的。

在我的情况下,verbose_name是使用xgettext_lazy翻译的,但由于它在syncdb期间在数据库中被复制,因此没有ContentType的翻译,verbose_name未被翻译。

我希望能够改变外键在表单中的显示方式。

你知道我该怎么做吗?

干杯,

Natim

2 个答案:

答案 0 :(得分:0)

你需要使用ugettext_lazy而不是ugettext,它不是存储在数据库中,而是存在于某些.po文件中。例如:

from django.utils.translation import ugettext_lazy as _

class Event(models.Model):
    ...

    class Meta:
        verbose_name = _(u'Event')
        verbose_name_plural = _(u'Events')

对于在导入时加载的代码块,您需要使用ugettext_lazy,对于那些在执行时加载的代码块,您需要ugettext。一旦你有了,你只需要做一个“python manage.py makemessages”和“python manage.py compilemessages”

答案 1 :(得分:0)

最后,我找到了解决方案:

def content_type_choices(**kwargs):
    content_types = []
    for content_type in ContentType.objects.filter(**kwargs):
        content_types.append((content_type.pk, content_type.model_class()._meta.verbose_name))

    return content_types

LIMIT_CHOICES_TO = {'model__startswith': 'pageapp_'}

class PageWAForm(forms.ModelForm):
    app_page_type = forms.ModelChoiceField(queryset=ContentType.objects.filter(**LIMIT_CHOICES_TO), 
                                           empty_label=None)

    def __init__(self, *args, **kwargs):
        super(PageWAForm, self).__init__(*args, **kwargs)
        self.fields['app_page_type'].choices = content_type_choices(**LIMIT_CHOICES_TO)