我如何在django中获得当前语言?

die*_*us9 81 python django internationalization

如何在模型或管理员中的当前线程中获取当前语言?

小智 124

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

  • 警告:如果翻译被暂时停用(通过deactivate_all() 或当None 传递给override()),则*返回None。在 Django 1.8 之前,当翻译被停用时,get_language() 总是返回 LANGUAGE_CODE。* (2认同)

Ign*_*nas 82

或者你也可以在你的观点中得到这个

request.LANGUAGE_CODE

  • 我投了这个(从某种原因从-1).请注意以下内容(来自http://docs.djangoproject.com/en/dev/topics/i18n/deployment/#how-django-discovers-language-preference"与静态(无中间件)翻译,语言在设置中.LANGUAGE_CODE,在动态(中间件)翻译时,它在request.LANGUAGE_CODE中." (5认同)
  • 这个链接已经死了,我认为没有理由不使用上面提供的文档化的解决方案:`django.utils.translation.get_language()` (3认同)
  • 如果还没有请求,那么试图在例如模型中获取语言是不可能的.我认为```django.utils.translation.get_language()```总是一个更好的解决方案. (3认同)
  • @azmeuk这可能对你有用https://docs.djangoproject.com/en/dev/topics/i18n/translation/#switching-language-in-templates (2认同)

ach*_*zot 35

请注意用于获取语言的方法.根据哪种方法,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
Run Code Online (Sandbox Code Playgroud)

如果你想让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

我发现通过谷歌找到关于这个主题的这些差异并不是很容易,所以这里有待进一步参考.

  • +1表示`django.utils.translation.get_language()`和`django.utils.translation.get_language_from_request(request,check_path)`之间的区别.如果在视图中,您应该使用后者和`check_path = True`来获取模板将呈现的语言. (4认同)

Ste*_*son 7

只是要补充一点,如果你确实使用django.utils.translation.get_language()那么你应该记住,如果这段代码将被异步调用(例如作为芹菜任务),那么这种方法将因为它在不同的线程中运行而无法工作.

  • 这里显而易见的方法是将语言作为任务参数传递,然后使用translation.activate(语言)设置语言 (2认同)

Fli*_*imm 5

您可以在 Django 模板语言中使用这些模板标签:

{% 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 }}
Run Code Online (Sandbox Code Playgroud)