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

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


person geekQ    schedule 30.05.2010    source источник
comment
Извините за вопрос, но после обновления файла .po вы запускали ./manage.py makemessages для обновления файла .mo?   -  person Steve Jalim    schedule 30.05.2010
comment
makemessages обновляет только файлы po. Я думаю, вы имеете в виду django-admin compilemessages - спасибо за подсказку! Я думал, что, поскольку python является динамическим языком, файлы перевода не компилируются, в отличие от C. К сожалению, мое решение по-прежнему не работает, обеспечивая смешанный перевод (языки смешаны в одном предложении). Для имени модели используется настройка проекта LANGUAGE_CODE. Язык оставшегося сообщения определяется агентом пользователя ("Accept-Languages"). Я поэкспериментирую с ленивым переводом и скажу, работает ли он.   -  person geekQ    schedule 31.05.2010


Ответы (2)


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

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

person geekQ    schedule 31.05.2010
comment
Я использую ugettext_lazy, но, к сожалению, он у меня не работает. - person Никита Конин; 15.03.2017
comment
Я сделал все это, но все еще не могу перевести имена и поля моделей. - person M. Dhaouadi; 05.08.2017
comment
Я столкнулся с той же проблемой, что и @M. Дхауади. Я сделал все это, но все еще не могу перевести имена и поля моделей. - person root; 21.01.2020

См. https://automationpanda.com/2018/04/21/django-admin-translations/ Автор проделал отличную работу, показав, как шаг за шагом освоить все функции перевода django. Для меня это намного лучше, чем официальная документация.

person Loaderon    schedule 25.04.2020