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

35
Django的国际化功能非常好(基于gettext,LocaleMiddleware),但是如何正确地翻译模型名称和管理页面的属性呢?我在文档中没有找到相关内容。

我希望将“Выберите заказ для изменения”替换为“Выберите order для изменения”。请注意,'order'未翻译。

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

在Django源代码中使用Grep搜索我找到:

$ 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
抱歉打扰,请问在更新了 .po 文件后,您是否运行了 ./manage.py makemessages 命令来更新 .mo 文件? - Steve Jalim
1
makemessages仅更新po文件。我想你的意思是django-admin compilemessages-感谢你的提示!我认为,因为Python是一种动态语言,与C相反,翻译文件没有编译。不幸的是,我的解决方案仍然无法运行,提供了混合翻译(语言在一个句子中混合)。对于模型名称,项目的LANGUAGE_CODE设置被使用。其余消息的语言由用户代理('Accept-Languages')确定。我将尝试使用延迟翻译,并告诉您是否有效。 - geekQ
4个回答

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文档并填补这个空白!


2
我正在使用ugettext_lazy,但不幸的是它对我不起作用。 - Никита Конин
3
我已经做了这一切,但仍然无法使模型名称和字段被翻译。 - M. Dhaouadi
1
我遇到了与@M.Dhaouadi相同的问题。我已经尝试了所有方法,但是仍然无法将模型名称和字段翻译。 - root
2
如果从“makemessages”语言环境文件中删除“#,fuzzy”字符串,则对我有效!我认为Django尝试优化一些翻译单词,我们需要手动检查它。 - break1
这很漂亮!我爱你。 - Juan Diego Ramirez
@break1 是对的。我也移除了 #, fuzzy,然后模型标签成功地被翻译了。 - Super Kai - Kazuya Ito

2

1

我也无法翻译 Django Admin 中的模型标签,因为在 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"

...

所以,我从django.po中删除了#, fuzzy,如下所示,然后我就可以在Django管理界面中翻译模型标签了。*你可以查看我的问题我的答案来详细解释:
# "django.po"

...

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

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

...

此外,fuzzy文档中如下所述:
引用: 模糊 该标志可以由msgmerge程序生成,也可以由翻译人员自己插入。它表示msgstr字符串可能不是一个正确的翻译(了)。只有翻译人员才能判断是否需要进一步修改翻译,或者是否可以接受原样。一旦对翻译满意,她就会删除这个模糊属性。当msgmerge程序仅通过模糊搜索合并msgid和msgstr条目时,它会插入此属性。请参见模糊条目。

0

我同时使用ugettext和带有双下划线__ugettext_lazy。因此,makemessages管理命令只收集了前者。

为了收集___,我们可以要求gettext工具收集不止默认包含在_( )中的字符串。为此,我们需要重写makemessages命令:https://docs.djangoproject.com/en/dev/topics/i18n/translation/#customizing-the-makemessages-command

# myapp/management/commands/makemessages.py
from django.core.management.commands import makemessages

class Command(makemessages.Command):
    self.stdout.write("----> Using our custom makemessages command to collect both _ and double __")
    xgettext_options = makemessages.Command.xgettext_options + ['--keyword=__']  # <-- added __

我的管理界面中的模型现在终于完全翻译完成了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接