Интернационализация Django для администраторских страниц - переводит имя модели и атрибуты

Интернационализация Django очень хороша (gettext базирующийся, LocaleMiddleware), но что надлежащий путь состоит в том, чтобы перевести имя модели и атрибуты для администраторских страниц? Я ничего не нашел об этом в документации:

Я хотел бы иметь "Выберите заказ для изменения" вместо "Выберите для изменения порядка". Отметьте, 'порядок' не переводится.

Во-первых, я определил модель, активированную USE_I18N = True в settings.py, выполненном django-admin makemessages -l ru. Никакие записи не создаются по умолчанию для имен модели и атрибутов.

Grepping в исходном коде 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 свойство meta, кажется, играет некоторую роль здесь. Попробованный для использования его:

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

Теперь обновленный po файл содержит msgid 'order' это может быть переведено. Таким образом, я вставил перевод. К сожалению, выполнение администраторских страниц показывает то же соединение "Выберите для изменения порядка".

Я в настоящее время использую Django 1.1.1. Кто-то мог указать на меня на соответствующую документацию? Поскольку Google не может.;-) Тем временем я вырою глубже в django исходный код...

26
задан geekQ 30 May 2010 в 12:51
поделиться

1 ответ

Важные вещи, не упомянутые в документации Django:

  • запустите django-admin compilemessages, например, как часть вашего процесса сборки процесса. Спасибо stevejalim!
  • примените 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 и заполнить этот пробел!

38
ответ дан 28 November 2019 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: