¿Cómo puedo obtener el idioma actual en Django?

93

¿Cómo puedo obtener el idioma actual en el hilo actual en un modelo o en el administrador?

diegueus9
fuente
5
Por favor sea especifico. 'El idioma de mi web': ¿te refieres a la solicitud web, el servidor web o qué?
mikemaccana

Respuestas:

139

Las funciones de particular interés son las django.utils.translation.get_language()que devuelven el lenguaje utilizado en el hilo actual. Ver documentación .

micha480
fuente
2
Advertencia: Devuelve None si las traducciones están desactivadas temporalmente (por deactivate_all () o cuando se pasa None a override ()). Antes de Django 1.8, get_language () siempre devolvía LANGUAGE_CODE cuando las traducciones estaban desactivadas.
Pieter
89

O también puede obtener esto en sus vistas

request.LANGUAGE_CODE
Ignas Butėnas
fuente
6
Voté esto a favor (de -1 por alguna razón). Tenga en cuenta lo siguiente (de docs.djangoproject.com/en/dev/topics/i18n/deployment/… "con traducción estática (sin middleware), el idioma está en settings.LANGUAGE_CODE, mientras que con traducción dinámica (middleware), está en request.LANGUAGE_CODE. "
Alexander Marquardt
4
Ese vínculo está muerto, y no veo ninguna razón para no usar la solución aceptada documentado anteriormente:django.utils.translation.get_language()
QRIS
4
intentar obtener el idioma en, por ejemplo, modelos no sería posible si aún no hay una solicitud. Creo que django.utils.translation.get_language()siempre es una mejor solución.
Hussam
¿Qué tal obtener el idioma actual en una plantilla?
azmeuk
2
@azmeuk, esto podría ser útil para usted docs.djangoproject.com/en/dev/topics/i18n/translation/…
Ignas Butėnas
37

Tenga cuidado con el método que utiliza para obtener el idioma . Dependiendo de qué método, Django usará diferentes formas e información para determinar el idioma correcto a usar.

Al usar la django.utils.translation.get_language()función, está vinculada al idioma del hilo . Antes de Django 1.8, siempre regresaba settings.LANGUAGE_CODEcuando las traducciones estaban deshabilitadas. Si desea anular manualmente el lenguaje del hilo, puede usar las funciones override()o activate(), que no tienen un nombre muy explícito, pero bueno, siguen siendo útiles:

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

Si desea que django verifique la ruta y / o la solicitud (cookie de idioma, ...) , que es mucho más común, por ejemplo , www.example.com/en/<somepath>vs www.example.com/fr/<somepath>, use django.utils.translation.get_language_from_request(request, check_path=False). Además, siempre devolverá un idioma válido establecido ensettings.LANGUAGES

No me resultó muy fácil encontrar estas diferencias a través de Google sobre este tema, así que aquí está para mayor referencia.

achedeuzot
fuente
Tenga en cuenta que lo es django.utils.translation, no traducciones. Hay un error ortográfico en el enlace proporcionado. En el fragmento es correcto.
J0ANMM
4
+1 para la diferencia entre django.utils.translation.get_language()y django.utils.translation.get_language_from_request(request, check_path). Si está a la vista, debe usar este último con check_path = Truepara obtener el idioma en el que se renderizará su plantilla.
Ondrej Skalicka
7

Solo para agregar que, si lo usa django.utils.translation.get_language(), debe tener en cuenta que si esa sección de código se llamará de forma asincrónica (por ejemplo, como una tarea de apio), entonces este enfoque no funcionará debido a que se ejecuta en un hilo diferente.

Stefan Magnuson
fuente
2
El enfoque obvio aquí sería pasar el idioma como parámetro de tarea y luego establecer el idioma con translation.activate (idioma)
xyzman
1

puedes usar esto

from django.utils import  translation
translation.get_language()
Sarath Ak
fuente
Ya respondido por micha480. Tu respuesta no agrega ningún valor.
Samuel Dauzon
0

Puede leer el sistema localepara obtener información sobre el idioma.

advait
fuente
5
Estás moderado a -3, pero creo que la pregunta es vaga: "el idioma actual de mi web". No es culpa tuya por adivinar que esto significa SO.
mikemaccana