Django的国际化非常好(基于gettext,LocaleMiddleware),但是翻译模型名称和管理页面属性的正确方法是什么?我在文档中没有找到任何相关内容:
我想要“Выберитезаказдляизменения”而不是“Выберите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源代码......
答案 0 :(得分:36)
Django文档中未提及的重要事项:
django-admin compilemessages
,例如作为构建的一部分
处理。谢谢stevejalim!ugettext_lazy()
应用于模型名称(Meta
类和verbose_name
)verbose_name
)名称也可以使用ugettext_lazy()
使用上述原则的例子:
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文档并填补空白!
答案 1 :(得分:1)
请参见https://automationpanda.com/2018/04/21/django-admin-translations/ 它的作者在展示如何逐步掌握所有django翻译功能方面做得非常出色。对我而言,这比正式文档要好得多。