Override default Django translations

The easiest way is to collect the .po file found in the django.contrib.admin locale folder and re-compiling it (you can use POEdit for doing so).

You could also override the django.contrib.admin templates by putting them in your projects templates folder (for example: yourproject/templates/admin/change_form.html) then running makemessages from the project root (although this is no longer supported for django 1.4 alpha if i'm correct)

edit: Robert Lujo's answer is the clean method


Based on Robert Lujo answer, his alternative is totally working. And IMO simpler (keep the overriden locales in a special .po file only). Here are the steps:

  • Add an extra path to the LOCALE_PATHS Django settings.

    • LOCALE_PATHS = (
      # the default one, where the makemessages command will generate the files os.path.join(BASE_DIR, 'myproject', 'locale'),
      # our new, extended locale dir
      os.path.join(BASE_DIR, 'myproject', 'locale_extra'), )

  • find the original Django (or 3rd party) string to be translated

    • ex.: "recent actions" for the Django admin 'recent actions' block
  • Add the new .po file "myproject/locale_extra/en/LC_MESSAGES/django.po" with the alternative translation :
    • msgid "Recent actions"
      msgstr "Last actions"

  • Compile your messages as usual

This is what worked for me:

  • create a file in your app folder which will hold django messages for which translations need to be overridden, e.g. django_standard_messages.py

  • in django lib folder or in django.po files find the message (string) that needs to be overridden, e.g. django.forms/fields.py has message _(u"This field is required.") which we want to translate to german differently

  • in django_standard_messages.py add all such messages like this:

# coding: utf-8
_ = lambda s: s
django_standard_messages_to_override = [
_("This field is required."),
...
]
  • Translate the file (makemessages, compilemessages) - makemessages will add added django standard messages in your application .po file, find them and translate, run compilemessages to update .mo file
  • tryout

The logic behind: (I think ;) ) - when ugettext function searches translation for one message (string), there are several .po/.mo files that needs to be searched through. The first match is used. So, if our local app .po/.mo is first in that order, our translations will override all other (e.g. django default).

Alternative

When you need to translate all or most of django default messages, the other possibility (which I didn't tried) is to copy default django .po file in our locale or some other special folder, and fix translations and register the folder (if new) in LOCALE_PATHS django settings file as first entry in the list.

The logic behind: is the very similar as noted in previous section.