Подтвердить что ты не робот

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

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

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

Сначала я определил модель, активированную 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))

Таким образом, мета-свойство verbose_name, похоже, играет определенную роль здесь. Пытался использовать его:

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...

4b9b3361

Ответ 1

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

  • запустите django-admin compilemessages, например. как часть вашей сборки обработать. Спасибо stevejalim!
  • применить django ugettext_lazy() к именам моделей (Meta class и verbose_name) Атрибут
  • (поле модели verbose_name) также может быть переведен с помощью ugettext_lazy()
  • используйте ленивый перевод в метаданных модели, иначе перевод происходит при загрузке классов моделей и настроек ваших пользователей, особенно настройки браузера, не будут учитываться.
  • Я использую некоторые области определения имен атрибутов, например. разделение имени модели и имена атрибутов с помощью трубы. Это же соглашение используется в рубиново-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 и заполнить пробел!