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
Be careful of the method you use to get the language. Depending on which method, Django will use different ways and informations to determine the right language to use.
When using the django.utils.translation.get_language() function, it's linked to the thread language. Before Django 1.8, it always returned settings.LANGUAGE_CODE when translations were disabled. If you want to manually override the thread language, you can use the override() or activate() functions, which is not very explicitly named, but well, still useful:
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
If you want django to check the path and/or request (language cookie, ...), which is a lot more common e.g. www.example.com/en/<somepath> vs www.example.com/fr/<somepath>, use django.utils.translation.get_language_from_request(request, check_path=False). Also, it will always return a valid language set in settings.LANGUAGES
I found it not very easy to find these differences through Google about this subject so here it is for further reference.
Just to add that if you do use django.utils.translation.get_language() then you should bear in mind that if that section of code will be called asynchronously (e.g. as a celery task) then this approach won't work due to it running in a different thread.
{% 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 }}
{% 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 }}
# "views.py"
from django.shortcuts import render
from django.utils.translation import get_language
def test(request):
print(request.LANGUAGE_CODE) # en
print(get_language()) # en
return render(request, 'index.html')
And, you can get the current language with LANGUAGE_CODE and get_current_language in Django Templates as shown below. *get_current_language needs to load i18n:
发布评论
评论(7)
特别感兴趣的函数是 django.utils.translation.get_language() ,它返回当前线程中使用的语言。请参阅文档。
Functions of particular interest are
django.utils.translation.get_language()
which returns the language used in the current thread. See documentation.或者您也可以在您的视图中获取此内容
Or you can also get this in your views
注意获取语言的方法。根据哪种方法,Django 将使用不同的方式和信息来确定要使用的正确语言。
当使用
django.utils.translation.get_language()
函数时,它链接到线程语言。在 Django 1.8 之前,当翻译被禁用时,它总是返回settings.LANGUAGE_CODE
。如果你想手动覆盖线程语言,你可以使用override()或activate()函数,它们的名字不是很明确,但是仍然有用:如果您希望 django 检查路径和/或请求(语言 cookie,...),这更常见,例如
www.example.com/en/
与www.example.com/fr/
相比,使用django.utils.translation.get_language_from_request(request, check_path=False)
。此外,它总是会返回在settings.LANGUAGES
中设置的有效语言。我发现通过 Google 找到有关此主题的这些差异并不容易,因此这里供进一步参考。
Be careful of the method you use to get the language. Depending on which method, Django will use different ways and informations to determine the right language to use.
When using the
django.utils.translation.get_language()
function, it's linked to the thread language. Before Django 1.8, it always returnedsettings.LANGUAGE_CODE
when translations were disabled. If you want to manually override the thread language, you can use theoverride()
oractivate()
functions, which is not very explicitly named, but well, still useful:If you want django to check the path and/or request (language cookie, ...), which is a lot more common e.g.
www.example.com/en/<somepath>
vswww.example.com/fr/<somepath>
, usedjango.utils.translation.get_language_from_request(request, check_path=False)
. Also, it will always return a valid language set insettings.LANGUAGES
I found it not very easy to find these differences through Google about this subject so here it is for further reference.
只是补充一点,如果您确实使用 django.utils.translation.get_language() 那么您应该记住,如果该部分代码将被异步调用(例如作为 celery 任务),那么这种方法由于它在不同的线程中运行,因此无法工作。
Just to add that if you do use
django.utils.translation.get_language()
then you should bear in mind that if that section of code will be called asynchronously (e.g. as a celery task) then this approach won't work due to it running in a different thread.您可以在 Django 模板语言中使用这些模板标签 :
You can use these template tags in Django's templating language:
您可以使用 LANGUAGE_CODE 和 get_language() 如下所示:
并且,您可以使用
LANGUAGE_CODE
和 get_current_language 如下所示。 *get_current_language
需要加载 i18n:You can get the current language with LANGUAGE_CODE and get_language() in Django Views as shown below:
And, you can get the current language with
LANGUAGE_CODE
and get_current_language in Django Templates as shown below. *get_current_language
needs to load i18n:您可以阅读系统的
locale
以获取语言信息。You can read the system's
locale
for language information.