Django管理页面国际化 - 翻译模型名称和属性
Django的国际化功能非常不错(基于gettext和LocaleMiddleware),但我想知道在管理页面上,如何正确翻译模型名称和属性呢?我在文档中没有找到相关的信息:
- http://docs.djangoproject.com/en/dev/topics/i18n/internationalization/
- http://www.djangobook.com/en/2.0/chapter19/
我希望能看到“Выберите заказ для изменения”,而不是“Выберите 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 个回答
我在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"
...
所以,我把#, fuzzy
从django.po
中去掉,像下面这样,然后我就能在Django管理后台翻译模型标签了。*你可以查看我的问题和我的回答,里面详细解释了这个过程:
# "django.po"
...
#: .\my_app1\models.py:12
msgid "person"
msgstr "personne"
#: .\my_app1\models.py:13
msgid "persons"
msgstr "personnes"
...
fuzzy
这个标记可以由msgmerge程序生成,也可以由翻译者自己插入。它表示msgstr字符串可能不再是正确的翻译。只有翻译者才能判断这个翻译是否需要进一步修改,或者现在的翻译是否可以接受。一旦对翻译满意,翻译者就会去掉这个fuzzy属性。msgmerge程序在进行模糊搜索后合并msgid和msgstr条目时会插入这个标记。请参见模糊条目。
可以去看看这个链接:https://automationpanda.com/2018/04/21/django-admin-translations/。这个作者写得非常好,详细介绍了如何一步一步掌握Django的翻译功能。对我来说,比官方文档要好得多。
在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文档,填补这个空白!