How can I get the current language in Django?

PythonDjangoInternationalization

Python Problem Overview


How can I get the current language in the current thread in a model or in the admin?

Python Solutions


Solution 1 - Python

Functions of particular interest are django.utils.translation.get_language() which returns the language used in the current thread. See documentation.

Solution 2 - Python

Or you can also get this in your views

request.LANGUAGE_CODE

Solution 3 - Python

Be careful of the method you use to get the language. Depending on which method, Django will use different ways and informations to determine the right language to use.

When using the django.utils.translation.get_language() function, it's linked to the thread language. Before Django 1.8, it always returned settings.LANGUAGE_CODE when translations were disabled. If you want to manually override the thread language, you can use the override() or activate() functions, which is not very explicitly named, but well, still useful:

from django.utils import translation

with translation.override('fr'):
    print(_("Hello")) # <= will be translated inside the with block

translation.activate('fr') # <= will change the language for the whole thread.
# You then have to manually "restore" the language with another activate()
translation.activate('en') # <= change languages manually

If you want django to check the path and/or request (language cookie, ...), which is a lot more common e.g. www.example.com/en/<somepath> vs www.example.com/fr/<somepath>, use django.utils.translation.get_language_from_request(request, check_path=False). Also, it will always return a valid language set in settings.LANGUAGES

I found it not very easy to find these differences through Google about this subject so here it is for further reference.

Solution 4 - Python

Just to add that if you do use django.utils.translation.get_language() then you should bear in mind that if that section of code will be called asynchronously (e.g. as a celery task) then this approach won't work due to it running in a different thread.

Solution 5 - Python

You can use these template tags in Django's templating language:

{% load i18n %}

{% get_current_language as LANGUAGE_CODE %}

Current language code: {{ LANGUAGE_CODE }}<br>

{% get_current_language_bidi as LANGUAGE_BIDI %}

{% if LANGUAGE_BIDI %}RTL <br>{% endif %}

{% get_language_info for LANGUAGE_CODE as lang %}

Language code: {{ lang.code }}<br>
Name of language: {{ lang.name_local }}<br>
Name in English: {{ lang.name }}<br>
Bi-directional: {{ lang.bidi }}
Name in the active language: {{ lang.name_translated }}

Solution 6 - Python

You can read the system's locale for language information.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiondiegueus9View Question on Stackoverflow
Solution 1 - Pythonmicha480View Answer on Stackoverflow
Solution 2 - PythonIgnas ButėnasView Answer on Stackoverflow
Solution 3 - PythonachedeuzotView Answer on Stackoverflow
Solution 4 - PythonStefan MagnusonView Answer on Stackoverflow
Solution 5 - PythonFlimmView Answer on Stackoverflow
Solution 6 - PythonadvaitView Answer on Stackoverflow