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

gee*_*ekQ 26 django gettext internationalization django-admin

Django的国际化非常好(基于gettext,LocaleMiddleware),但是翻译模型名称和管理页面属性的正确方法是什么?我在文档中没有找到任何相关内容:

我想要"Выберитезаказдляизменения"而不是"Выберитеorderдляизменения".请注意,"订单"未翻译.

首先,我定义了一个USE_I18N = True在settings.py中激活的模型,运行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))
Run Code Online (Sandbox Code Playgroud)

所以verbose_name元属性似乎在这里发挥了一些作用.试图用它:

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

现在更新的po文件包含msgid 'order'可以翻译的文件.所以我把翻译放进去.不幸的是,运行管理页面会显示"Выберитеorderдляизменения"的相同组合.

我目前正在使用Django 1.1.1.有人可以指点我的相关文件吗?因为谷歌不能.;-)同时我将深入研究django源代码......

gee*_*ekQ 38

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')
Run Code Online (Sandbox Code Playgroud)

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

无论哪种方式,我们都应该增强Django文档并填补空白!

  • 将ugettext更改为ugettext_lazy为我工作.非常感谢你! (2认同)
  • 我正在使用 ugettext_lazy,但不幸的是它对我不起作用。 (2认同)
  • 我已经完成了所有这些,但仍然无法获得要翻译的模型名称和字段 (2认同)
  • 如果从“makemessages”语言环境文件生成中删除“#,模糊”字符串 - 这对我有用!我认为 Django 尝试优化翻译中的一些单词,我们需要手动检查。 (2认同)