R – Can’t switch language environment in Django

djangointernationalization

I have file locale/es/LC_MESSAGES/django.mo (and .po), ran makemessages and compilemessages. Definitely all messages are translated

in settings.py have:

USE_I18N = True
LANGUAGE_CODE = 'es'

Still django stubbornly takes strings from the english .po file… Why can that be?

There must be some gotcha… Thanks.

EDIT this appears to be the case only when LocaleMiddleware is active.

Best Answer

According to the django docs

http://docs.djangoproject.com/en/dev/topics/i18n/#id2

LocaleMiddleware tries to determine the user's language preference by following this algorithm:

* First, it looks for a django_language key in the current user's session.

* Failing that, it looks for a cookie. 

[...]

*Failing that, it looks at the Accept-Language HTTP header. This header is sent by your browser and tells the server which language(s) you prefer, in order by priority. Django > tries each language in the header  until it finds one with available translations.

* Failing that, it uses the global LANGUAGE_CODE setting.

If you only need one language, 'es', you can disable the middleware. If you really need LocaleMiddleware active, try this recipe to override the headers from the client's browser http://www.djangosnippets.org/snippets/218/:

enter code here

class ForceDefaultLanguageMiddleware(object):
    """
    Ignore Accept-Language HTTP headers

    This will force the I18N machinery to always choose settings.LANGUAGE_CODE
    as the default initial language, unless another one is set via sessions or cookies

    Should be installed *before* any middleware that checks    request.META['HTTP_ACCEPT_LANGUAGE'],
    namely django.middleware.locale.LocaleMiddleware
    """
    def process_request(self, request):
        if request.META.has_key('HTTP_ACCEPT_LANGUAGE'):
            del request.META['HTTP_ACCEPT_LANGUAGE']
Related Topic