I have a template with this:
{% trans "Log out" %}
This is translated automatically by Django to Spanish as Terminar sesión. However I would like to translate it as Cerrar sesión.
I have tried to add this literal to the .po file, however I get an error saying this literal is duplicated when I compile the messages.
Is there a way to change/override default Django translations?
Thanks.
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."), ... ]
makemessages
, compilemessages
) - makemessages will add added django standard messages in your application .po file, find them and translate, run compilemessages to update .mo fileThe 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).
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.
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
msgid "Recent actions"
msgstr "Last actions"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With