web-dev-qa-db-fra.com

Comment obtenir la langue actuelle dans Django?

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

77
diegueus9

Les fonctions particulièrement intéressantes sont Django.utils.translation.get_language() qui retourne la langue utilisée dans le thread courant. Voir documentation .

119
micha480

Ou vous pouvez également obtenir cela dans vos vues

request.LANGUAGE_CODE
79
Ignas Butėnas

Faites attention à la méthode que vous utilisez pour obtenir la langue . Selon la méthode, Django utilisera différentes manières et informations pour déterminer la bonne langue à utiliser.

Lorsque vous utilisez la fonction Django.utils.translation.get_language(), elle est liée à la langue du thread . Avant Django 1.8, il renvoyait toujours settings.LANGUAGE_CODE Lorsque les traductions étaient désactivées. Si vous souhaitez remplacer manuellement la langue du thread, vous pouvez utiliser la fonction override() ou activate() fonctions, qui n'est pas très explicitement nommé, mais bien, toujours utile:

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 demande (cookie de langue, ...) , 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) . De plus, il renverra toujours une langue valide définie dans settings.LANGUAGES

Je n'ai pas trouvé très facile de trouver ces différences via Google à ce sujet, alors voici pour plus de référence.

31
achedeuzot

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

7
Stefan Magnuson

vous pouvez l'utiliser

from Django.utils import  translation
translation.get_language()
1
Sarath Ak