如何做Django模型字段的翻译?

时间:2011-12-17 05:17:38

标签: django django-models

我正在将django网站翻译成6种语言。这是我第一次翻译。

这是一个电子商务网站。如何翻译模型的字段?例如:当我尝试{% trans cat.name %}ugettext(cat.name)

时,实际位于数据库中的类别名称并未写入po文件

6 个答案:

答案 0 :(得分:4)

您需要https://github.com/geomin/django-lingua

之类的内容

答案 1 :(得分:1)

使用verbose_name

class Book(models.Model):
    title = models.CharField(verbose_name=_('Title'),max_length=50)

    class Meta:
       verbose_name = _('Book')
       verbose_name_plural = _('Books')

现在,当您提取翻译时,您将BookTitleBooks作为可翻译的字符串。

答案 2 :(得分:1)

from django.utils.translation import ugettext as _
class Book(models.Model):
    title = models.CharField(_('title'),max_length=50)

你也可以这样做。 标题将成为可转换的字符串

答案 3 :(得分:0)

所有答案中缺少的是应该使用哪种类型的gettext。原来,您需要使用gettext_lazy,这是我的工作代码

from django.utils.translation import gettext_lazy as _

class UnitCategory(models.Model):
    id = models.AutoField(verbose_name=_('Category ID'), primary_key=True)
    type = models.CharField(verbose_name=_(
        'Category Type'), max_length=30, blank=False)

    class Meta:
        verbose_name = _('Unit Category')
        verbose_name_plural = _('Unit Categories')

    def get_absolute_url(self):
        return reverse('core:units_categories_update', args=[self.id])

答案 4 :(得分:0)

尽管这个项目很老,但它似乎是使用最频繁且维护最完善的解决方案:

https://github.com/deschler/django-modeltranslation/

https://django-modeltranslation.readthedocs.io/en/latest/

答案 5 :(得分:0)

选项A:

实际上很简单。假设您不想继续检查您的语言环境文件(或依赖于诸如Rosetta的第三方编辑)可能很乏味,那么您可以简单地动态转换所有模型字段。 一种实现方法是通过应用程序:django-parler,它允许您利用其TranslatableModel,TranslatedFields类。 ----有关更多信息,请参见《 Django 3 by Example:第9章》(非常详尽)。

选项B

如果您的选择受选择限制( IT HAPPENS )...并且您的模型字段依赖于预定选择的列表,则可以像以下那样简单地进行选择翻译:

在models.py

from django.utils.translation import gettext_lazy as _     
class Products(models.Model):
  class ProductName(models.TextChoices):
  RAD = 'RD', _('Radio')
  TEL = 'TV', _('Television')

details: [https://docs.djangoproject.com/en/3.1/ref/models/fields/][1]

或者如果您使用枚举

在enums.py

from django.utils.translation import gettext_lazy as _
@unique
class StudentChoice(Enum):
  rad = _('Radio')
  tel = _('Television')

定义选择后,您只需遵循框架的国际化/本地化建议。