What's the correct way to set up Django translation?

django, django-i18n, django-modeltranslation, python, translation

Solution

Add `LOCALE_PATHS` to `settings.py` and set it as below:

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)

Note that `LOCALE_PATHS` must be a tuple (look at the comma at the end of the path).

Now based on `LOCALE_PATHS`, the `locale` folder should be in the root of your project.

And be sure that you run the commands `django-admin.py makemessages -l de` and `django-admin.py compilemessages` from the root of your project.

djPrj
  |
  +---> djPrj
  |
  +---> djApp
  |
  +---> locale
  |
  +---> templates

Also rearrange your `MIDDLEWARE_CLASSES` to be `LocaleMiddleware` after `SessionMiddleware` and before `CommonMiddleware` as mentioned here:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

Restart your service (`python manage.py runserver`) and check again.

Just to ensure that your localization is applied to your Django admin page with the default `django.mo` file of Django, do the following test:

First in main `urls.py` of project replace `patterns` with `i18n_patterns`:

from django.conf.urls.i18n import i18n_patterns

urlpatterns = i18n_patterns('',
    url(r'^admin/', include(admin.site.urls)),
    # ...
)

Now go to the admin page with a `de` prefix, like: `http://127.0.0.1:8000/de/admin/` And the admin page should be shown in German.

OK, are you able to see the admin page of Django in German?

Also check your view with the `de` prefix too.

According to your project code, some sentences are not in `trans` blocks. Put them as:

{% trans "your sentence" %}

Also you must use `ugettext_lazy` instead of `ugettext` in your code for views and models (Read here and here.)

Replace this:

from django.utils.translation import ugettext as _ 

with:

from django.utils.translation import ugettext_lazy as _

And now everything will work.

Problem

I've got an issue with translations not working on Django 1.6. I've added this to my `settings.py`: ``` LANGUAGE_CODE = 'en-us' ugettext = lambda s: s LANGUAGES = ( ('en', ugettext('English')), ('de', ugettext('German')), ) ``` Also added middlewares: ``` MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) ``` As well as to my *.py files whenever I'm using a string which shall be l10nd: ``` from django.utils.translation import ugettext_lazy as _ ``` My templates start with: ``` {% extends "base.html" %} {% load i18n %} ``` And inside the template, I used the `trans` placeholder. E.g. ``` <h1>{% trans "Register a tank" %}</h1> ``` I have provided translations in `locale/de/LC_MESSAGES/django.po`: ``` msgid "Register a tank" msgstr "Einen neuen Tank anmelden" ``` My browser is set to request German content first: Browser settings What did I miss? P.S. The project I'm currently fuzzy around is hosted on GitHub: https://github.com/frlan/blankspot

Original source

Related problems