如何在Django中翻译模型字段?

8
我正在将django网站翻译成6种语言。这是我第一次进行翻译工作。
网站是一个电子商务网站。我该如何翻译模型的字段?例如:类别名称实际上在数据库中,并且当我尝试使用{% trans cat.name %}ugettext(cat.name)时,它没有被写入po文件。

1
好问题。这里有一个类似的问题:https://dev59.com/bHI-5IYBdhLWcg3wFkSO,它指向了一个可能解决您问题的Django应用程序。 - Yuji 'Tomita' Tomita
7个回答

4

Use 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

这将翻译列和表名,而不是列中的实际值。 - Henrik Hjalmarsson

3

这个项目已经停止了。 - David Schumann
看起来 django-lingua 的作者正在为 django-modeltranslation 做贡献,而且这个项目非常活跃。 - Mr. B.

2
从django.utils.translation中导入ugettext as _ 
class Book(models.Model):
    title = models.CharField(_('标题'),max_length=50)

你也可以这样做。 title将成为可翻译的字符串。


@mossplix 使用 verbose_name = _('title') 更加简洁。 - Carlos Henrique Cano

2

所有答案中缺少的是您应该使用哪种类型的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])

0

还有一个受欢迎的项目叫做django-parler。我觉得它有点过于复杂,但绝对值得一看。

P.S. 支持Django 4,但最新更新是在2021年11月。


0

0

选项A:

实际上很简单。假设您不想继续查看本地文件(或依赖于像Rosetta这样的第三方编辑),这可能会很繁琐,您可以简单地动态翻译所有模型字段。 一种方法是通过应用程序:django-parler,它允许您利用其TranslatableModel、TranslatedFields类。 ----更多信息可以在书籍Django 3 by Example: Chapter 9中找到(非常详尽)。

选项B

如果您的选择受到选择的限制(这种情况确实存在)...并且您的模型字段依赖于预先确定的选择列表,则可以简单地使选择可翻译,如下所示:

在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')

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接