Интернационализация Django для страниц администратора - перевод названия модели и атрибутов - PullRequest
26 голосов
/ 30 мая 2010

Интернационализация Django очень хорошая (на основе gettext, 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. Может ли кто-нибудь указать мне соответствующую документацию? Потому что гуглить не могу. ;-) А пока я углублюсь в исходный код django ...

1 Ответ

38 голосов
/ 31 мая 2010

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

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

...