Comment puis-je obtenir la langue actuelle dans Django?

93

Comment puis-je obtenir la langue actuelle dans le fil de discussion actuel dans un modèle ou dans l'administrateur?

diegueus9
la source
5
Soyez précis s'il vous plait. «La langue de mon site Web» - voulez-vous dire la requête Web, le serveur Web ou quoi?
mikemaccana

Réponses:

139

Les fonctions particulièrement intéressantes sont celles django.utils.translation.get_language()qui retournent la langue utilisée dans le thread actuel. Consultez la documentation .

micha480
la source
2
Attention: renvoie None si les traductions sont temporairement désactivées (par deactivate_all () ou quand None est passé à override ()). Avant Django 1.8, get_language () renvoyait toujours LANGUAGE_CODE lorsque les traductions étaient désactivées.
Pieter
89

Ou vous pouvez également obtenir cela dans vos vues

request.LANGUAGE_CODE
Ignas Butėnas
la source
6
J'ai voté à la hausse (de -1 pour une raison quelconque). Notez ce qui suit (de docs.djangoproject.com/en/dev/topics/i18n/deployment/… "avec traduction statique (sans middleware), la langue est dans settings.LANGUAGE_CODE, tandis qu'avec la traduction dynamique (middleware), elle est en request.LANGUAGE_CODE. "
Alexander Marquardt
4
Ce lien est mort et je ne vois aucune raison de ne pas utiliser la solution acceptée documentée ci-dessus:django.utils.translation.get_language()
qris
4
essayer d'obtenir la langue dans des modèles par exemple ne serait pas possible s'il n'y a pas encore de demande. Je pense que django.utils.translation.get_language()c'est toujours une meilleure solution.
Hussam
Qu'en est-il pour obtenir la langue actuelle dans un modèle?
azmeuk
2
@azmeuk cela pourrait être utile pour vous docs.djangoproject.com/en/dev/topics/i18n/translation/…
Ignas Butėnas
37

Faites attention à la méthode que vous utilisez pour obtenir la langue . En fonction de la méthode, Django utilisera différentes méthodes et informations pour déterminer la bonne langue à utiliser.

Lors de l'utilisation de la django.utils.translation.get_language()fonction, elle est liée au langage du fil . Avant Django 1.8, il revenait toujours settings.LANGUAGE_CODElorsque les traductions étaient désactivées. Si vous souhaitez remplacer manuellement le langage du thread, vous pouvez utiliser les fonctions override()ou activate(), qui ne sont pas nommées très explicitement, mais qui restent utiles:

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 vous voulez que django vérifie le chemin et / ou la requête (cookie de langue, ...) , ce qui est beaucoup plus courant par exemple www.example.com/en/<somepath>vs www.example.com/fr/<somepath>, utilisez django.utils.translation.get_language_from_request(request, check_path=False). En outre, il renverra toujours une langue valide définie danssettings.LANGUAGES

J'ai trouvé qu'il n'était pas très facile de trouver ces différences via Google à ce sujet, alors les voici pour référence ultérieure.

Achedeuzot
la source
Notez que ce n'est django.utils.translationpas des traductions. Il y a une faute d'orthographe dans le lien fourni. Dans l'extrait de code, c'est correct.
J0ANMM
4
+1 pour la différence entre django.utils.translation.get_language()et django.utils.translation.get_language_from_request(request, check_path). Si en vue, vous devriez utiliser ce dernier avec check_path = Truepour obtenir la langue dans laquelle votre modèle sera rendu.
Ondrej Skalicka
7

Juste pour ajouter que si vous utilisez, django.utils.translation.get_language()vous devez garder à l'esprit que si cette section de code est appelée de manière asynchrone (par exemple en tant que tâche de céleri), cette approche ne fonctionnera pas car elle s'exécute dans un thread différent.

Stefan Magnuson
la source
2
L'approche évidente ici serait de passer la langue comme paramètre de tâche, puis de définir la langue avec translation.activate (language)
xyzman
1

vous pouvez utiliser ceci

from django.utils import  translation
translation.get_language()
Sarath Ak
la source
Déjà répondu par micha480. Votre réponse n'ajoute aucune valeur.
Samuel Dauzon
0

Vous pouvez lire le système localepour obtenir des informations sur la langue.

avouer
la source
5
Vous êtes modéré à -3, mais je pense que la question est vague - "la langue actuelle de mon site Web". Ce n'est pas votre faute de deviner que cela signifie OS.
mikemaccana