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

问题描述 投票:28回答:2

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

django internationalization django-admin gettext
2个回答
39
投票

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.