Django's internationalization is very nice (gettext based, LocaleMiddleware), but what is the proper way to translate the model name and the attributes for admin pages? I did not find anything about this in the documentation:
- http://docs.djangoproject.com/en/dev/topics/i18n/internationalization/
- http://www.djangobook.com/en/2.0/chapter19/
I would like to have "Выберите заказ для изменения" instead of "Выберите order для изменения". Note, the 'order' is not translated.
First, I defined a model, activated USE_I18N = True
in settings.py, run django-admin makemessages -l ru
. No entries are created by default for model names and attributes.
Grepping in the Django source code I found:
$ 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))
So the verbose_name
meta property seems to play some role here. Tried to use it:
class Order(models.Model):
subject = models.CharField(max_length=150)
description = models.TextField()
class Meta:
verbose_name = _('order')
Now the updated po
file contains msgid 'order'
that can be translated. So I put the translation in. Unfortunately running the admin pages show the same mix of "Выберите order для изменения".
I'm currently using Django 1.1.1. Could somebody point me to the relevant documentation? Because google can not. ;-) In the mean time I'll dig deeper into the django source code...
Important things not mentioned in the Django documentation:
django-admin compilemessages
, e.g. as a part of your build process. Thanks stevejalim!ugettext_lazy()
to model names (Meta
class andverbose_name
)verbose_name
) names can also be translated withugettext_lazy()
Example using above principles:
Or is there a better way to translate the model and admin pages?
Either way we should enhance the Django documentation and fill the gap!