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

时间:2010-05-30 12:51:45

标签: django internationalization django-admin gettext

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源代码......

2 个答案:

答案 0 :(得分:36)

Django文档中未提及的重要事项:

  • 运行django-admin compilemessages,例如作为构建的一部分 处理。谢谢stevejalim!
  • 将django的ugettext_lazy()应用于模型名称(Meta类和verbose_name
  • 属性(模型字段verbose_name)名称也可以使用ugettext_lazy()
  • 进行翻译
  • 在模型元数据中使用延迟翻译,否则翻译 在加载模型类和用户设置时发生, 特别是浏览器设置,不会被考虑在内
  • 我对属性名称使用了一些作用域,例如:分离模型名称 和管道的属性名称。使用相同的约定 红宝石的getText。背景:翻译了'title'或'name'等属性名称 根据上下文,大多数语言都有所不同。例 '书|标题' - >德语中的“标题”或“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文档并填补空白!

答案 1 :(得分:1)

请参见https://automationpanda.com/2018/04/21/django-admin-translations/ 它的作者在展示如何逐步掌握所有django翻译功能方面做得非常出色。对我而言,这比正式文档要好得多。