Django管理页面国际化 - 翻译模型名称和属性

35 投票
4 回答
22981 浏览
提问于 2025-04-15 23:20

Django的国际化功能非常不错(基于gettext和LocaleMiddleware),但我想知道在管理页面上,如何正确翻译模型名称和属性呢?我在文档中没有找到相关的信息:

我希望能看到“Выберите заказ для изменения”,而不是“Выберите order для изменения”。注意,'order'没有被翻译。

首先,我定义了一个模型,在settings.py中激活了 USE_I18N = True,然后运行了 django-admin makemessages -l ru。但是默认情况下,模型名称和属性没有生成任何条目。

我在Django的源代码中查找时发现:

$ ack "Select %s to change"
contrib/admin/views/main.py
70:        self.title = (self.is_popup and ugettext('Select %s') % force_unicode(self.opts.verbose_name) or ugettext('Select %s to change') % force_unicode(self.opts.verbose_name))

所以 verbose_name 这个元属性似乎在这里起到了一些作用。我尝试使用它:

class Order(models.Model):
    subject = models.CharField(max_length=150)
    description = models.TextField()
    class Meta:
        verbose_name = _('order')

现在更新后的 po 文件中包含了 msgid 'order',可以进行翻译。所以我把翻译加上了。不幸的是,运行管理页面时仍然显示“Выберите order для изменения”。

我现在使用的是Django 1.1.1。有人能指引我找到相关的文档吗?因为谷歌找不到。;-)与此同时,我会更深入地研究Django的源代码……

4 个回答

1

我在Django管理后台也遇到了无法翻译模型标签的问题,因为在django.po文件中有#, fuzzy,如下所示:

# "django.po"

...

#: .\my_app1\models.py:12
#, fuzzy # <- Here
msgid "person"
msgstr "personne"

#: .\my_app1\models.py:13
#, fuzzy # <- Here
msgid "persons"
msgstr "personnes"

...

所以,我把#, fuzzydjango.po中去掉,像下面这样,然后我就能在Django管理后台翻译模型标签了。*你可以查看我的问题我的回答,里面详细解释了这个过程:

# "django.po"

...

#: .\my_app1\models.py:12
msgid "person"
msgstr "personne"

#: .\my_app1\models.py:13
msgid "persons"
msgstr "personnes"

...

另外,fuzzy文档中有解释,如下所示:

fuzzy

这个标记可以由msgmerge程序生成,也可以由翻译者自己插入。它表示msgstr字符串可能不再是正确的翻译。只有翻译者才能判断这个翻译是否需要进一步修改,或者现在的翻译是否可以接受。一旦对翻译满意,翻译者就会去掉这个fuzzy属性。msgmerge程序在进行模糊搜索后合并msgid和msgstr条目时会插入这个标记。请参见模糊条目。

2

可以去看看这个链接:https://automationpanda.com/2018/04/21/django-admin-translations/。这个作者写得非常好,详细介绍了如何一步一步掌握Django的翻译功能。对我来说,比官方文档要好得多。

49

在Django文档中没有提到的一些重要事项:

  • 运行 django-admin compilemessages,比如作为你构建过程的一部分。感谢stevejalim的提醒!
  • 在模型名称上应用Django的 ugettext_lazy()(在 Meta 类和 verbose_name 中)
  • 模型字段的 verbose_name 也可以用 ugettext_lazy() 来翻译
  • 在你的模型元数据中使用懒翻译,否则翻译会在加载模型类时进行,这样用户的设置,特别是浏览器的设置,就不会被考虑进去了
  • 我会为属性名称使用一些命名规则,比如用竖线分隔模型名称和属性名称。这个规则在ruby-gettext中也有使用。背景是:像'title'或'name'这样的属性名称在大多数语言中根据上下文翻译会有所不同。例如 'Book|title' 在德语中会翻译为'Titel'或'Buchtitel',但'Chapter|title'会翻译为'Überschrift'。

使用上述原则的示例:

from django.utils.translation import ugettext_lazy as _
class Order(models.Model):
    subject = models.CharField(max_length=150, verbose_name = _('Order|subject'))
    description = models.TextField(            verbose_name = _('Order|description'))
    class Meta:
        verbose_name = _('order')
        verbose_name_plural = _('orders')

或者有没有更好的方法来翻译模型和管理页面?

无论如何,我们应该增强Django文档,填补这个空白!

撰写回答