如何在Django中获取当前语言?


Answers:


139

特别感兴趣的函数django.utils.translation.get_language()返回当前线程中使用的语言。请参阅文档


2
警告:如果暂时停用翻译(通过deactivate_all()或将None传递给override()),则返回None。在Django 1.8之前,停用翻译后,get_language()始终返回LANGUAGE_CODE。
Pieter'1

89

或者您也可以在您的意见中

要求。LANGUAGE_CODE

6
我投票赞成(出于某些原因,从-1开始)。请注意以下内容(来自docs.djangoproject.com/en/dev/topics/i18n/deployment/… “,其中包含静态(无中间件)翻译,该语言位于settings.LANGUAGE_CODE中,具有动态(中间件)翻译时,该语言位于request.LANGUAGE_CODE。”
亚历山大·马夸特

4
该链接已django.utils.translation.get_language()
消失

4
如果尚无请求,则无法在模型中尝试获取语言。我认为django.utils.translation.get_language()始终是更好的解决方案。
侯赛姆,2015年

如何在模板中获取当前语言?
azmeuk


37

小心用于获取语言的方法。取决于哪种方法,Django将使用不同的方式和信息来确定要使用的正确语言。

使用该django.utils.translation.get_language()函数时,它链接到线程语言。在Django 1.8之前,它总是settings.LANGUAGE_CODE在禁用翻译后返回 。如果要手动覆盖线程语言,可以使用override()activate()函数,该函数不是非常明确的命名,但是仍然有用:

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

如果您想让django检查路径和/或请求(语言cookie,...),这是很常见的,例如www.example.com/en/<somepath>vs www.example.com/fr/<somepath>,请使用django.utils.translation.get_language_from_request(request, check_path=False)。此外,它将始终返回在中设置的有效语言settings.LANGUAGES

我发现要通过Google在这个主题上找到这些差异并不容易,因此这里有进一步的参考。


请注意,它是django.utils.translation,不是翻译。提供的链接中存在拼写错误。在摘要中是正确的。
J0ANMM

4
django.utils.translation.get_language()和之间的差异+1 django.utils.translation.get_language_from_request(request, check_path)。如果考虑到,你应该使用后者check_path = True让你的模板将在得到渲染的语言。
的Ondrej Skalicka

7

只是要补充一点,如果您确实使用了django.utils.translation.get_language()该代码,则应记住,如果该代码段将被异步调用(例如,作为一个celery任务),则由于该方法在另一个线程中运行,因此该方法将不起作用。


2
显而易见的方法是将语言作为任务参数传递,然后使用translation.activate(language)设置语言
xyzman 2015年


0

您可以阅读系统的locale语言信息。


5
您的审核速度为-3,但我认为问题很模糊-“我的网络的当前语言”。猜测这意味着操作系统不是您的错。
mikemaccana 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.