django 进行国际化及在后台进行中英文切换
項(xiàng)目的部署地為: 中國大陸與美國東海岸, 兩個地區(qū)的服務(wù)器數(shù)據(jù)不進(jìn)行同步, 中國地區(qū)的服務(wù)器頁面展示中文, 美國地區(qū)的服務(wù)器頁面展示成英文, 項(xiàng)目后臺使用python編程語言進(jìn)行開發(fā), 并結(jié)合django框架進(jìn)行版本迭代.
這里對項(xiàng)目的國際化進(jìn)行配置說明:
?
一.在配置文件settings.py中:
1) 開啟國際化功能
# 語言, 先設(shè)置成中文 LANGUAGE_CODE = 'zh-hans' # 1.8版本之后的language code設(shè)置不同, 1.8之前是LANGUAGE_CODE = 'zh-CN' # LANGUAGE_CODE = 'en'# 時區(qū) TIME_ZONE = 'Asia/Shanghai' # TIME_ZONE = 'UTC'# Internationalization # https://docs.djangoproject.com/en/2.1/topics/i18n/ # 開啟國際化 USE_I18N = True# 開啟本地化 USE_L10N = TrueUSE_TZ = TrueLANGUAGES = (('en', 'English'),('zh-hans', '中文簡體'), )# 翻譯文件所在目錄, 與 manage.py 文件在同級目錄下 LOCALE_PATHS = (os.path.join(BASE_DIR, 'locale'), )2) 添加進(jìn)行國際化的中間件
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware',# 這就是新添加進(jìn)來的中間件, 注意位置: 需要放置在 SessionMiddleware 中間件后面'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware', ]3) 添加i18n上下文渲染器
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [os.path.join(BASE_DIR, 'templates')],'APP_DIRS': True,'OPTIONS': {'context_processors': [# 新添加進(jìn)來的上下文渲染器, 不知是否是本人配置不當(dāng), 如果將該渲染器放置在其他位置, 無法進(jìn)行語言切換'django.template.context_processors.i18n','django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},}, ]?
二.在項(xiàng)目的路由文件 urls.py中, 添加路由:
# 如果需要支持在頁面自由選擇語言進(jìn)行切換, 必須添加該路由, 獲取語言翻譯文件 url(r'^i18n/', include('django.conf.urls.i18n')),?
三.在模板文件中開啟國際化
<!DOCTYPE html>{% load i18n %}在需要進(jìn)行國際化的模板中開啟國際化功能: 在文件的開頭添加: {% load i18n %}, 也可以放置在 <!DOCTYPE html> 后面
?
四.添加需要進(jìn)行國際化的字符串
1) 在視圖中調(diào)用模板, 通過變量賦值渲染模板( 或者直接返回json數(shù)據(jù)給前臺, 由前臺通過js或者其他模塊進(jìn)行翻譯):
在views.py中:
from django.utils.translation import gettext_lazy as _...if user.is_active:# _("已激活") 標(biāo)示對該字符串進(jìn)行國際化context = {"text": _("已激活"),"domain": domain}# 進(jìn)行模板渲染,響應(yīng)用戶請求.如果前后分離,可以直接返回json數(shù)據(jù)給前端,由前端在js中進(jìn)行國際化return render(request, "./users/active_account.html", context)如果是模板渲染, 在相應(yīng)的模板文件 acitveacitve_account.html 中:
<body><h2>{%trans "你好!" %}</h2><h2>{{ text }}</h2><img src="{{ domain }}/static/images/qcat2.jpeg" alt=""> </body>直接將變量渲染到模板中即可, 由模板調(diào)用翻譯文件進(jìn)行翻譯.
如果需要進(jìn)行國際化的字符串可以直接寫死在模板中, 也可以直接在模板中使用下面的方式進(jìn)行國際化:
{%trans "需要翻譯的字符串" %} , 如上面的代碼中所示.
?
五.生成翻譯文件(先在manage.py的同級目錄下創(chuàng)建 locale目錄)
python manage.py makemessages -l en會在locale目錄下生成 po 翻譯文件, 文件自動列出需要進(jìn)行翻譯的字符串, 如:
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-04-17 03:06+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"#: apps/users/models.py:25 msgid "郵箱地址" msgstr ""#: apps/users/views.py:748 msgid "已激活" msgstr ""#: templates/users/active_account.html:10 msgid "你好!" msgstr ""msgid : 需要進(jìn)行國際化的字符串
msgstr: 將翻譯好的字符串, 填充進(jìn)去即可,如:
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-04-17 03:06+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"msgid "郵箱地址" msgstr "email"#: apps/users/views.py:748 msgid "已激活" msgstr "You have successfully activated the account, do not need to activete it again, thank you!"#: templates/users/active_account.html:10 msgid "你好!" msgstr "hello"編譯po文件, 在locale所在目錄下執(zhí)行下面的命令:
python manage.py compilemessages到這里, 國際化的配置基本完成, 可以通過修改下面的配置項(xiàng),進(jìn)行平臺語言展示的設(shè)置
# 中文 # LANGUAGE_CODE = 'zh-hans' # 1.8版本之后的language code設(shè)置不同, 1.8之前是LANGUAGE_CODE = 'zh-CN' # 英文, 按照這里的步驟進(jìn)行設(shè)置, 默認(rèn)語言必須設(shè)置成英文, 否則中英文翻譯會失效 LANGUAGE_CODE = 'en'# 時區(qū) TIME_ZONE = 'Asia/Shanghai' # TIME_ZONE = 'UTC'如下所示
中文:
你好! 已激活英文:
hello You have successfully activated the account, do not need to activete it again, thank you!如果需要在頁面中讓用戶自行選擇進(jìn)行語言切換, 還需要進(jìn)行額外的配置, 詳情可以去查看官方文檔
?
六.如果前臺是APP,語言切換時,因?yàn)榍昂笈_的語言環(huán)境需要保持一直,所以我這里采取了一種不是太優(yōu)雅的的辦法: 封裝一個接口, 當(dāng)用戶進(jìn)行國際化切換時,由APP請求一下該接口, 告知后臺該用戶選擇了那種語言, 接口代碼如下所示:
@api_view(["POST"]) def set_lang(request):"""用戶在app進(jìn)行語言切換時, 請求一下該接口:param request::return:"""language = request.data.get("language", "en")if language == "zh-hans":request.session['_language'] = "zh-hans"else:request.session['_language'] = "en"return Response({"msg": "Ok"}, status=status.HTTP_200_OK)當(dāng)用戶請求其他接口時,就可以通過request請求對象獲取到用戶當(dāng)前是選擇的那種語言(即使不進(jìn)行登錄也可以獲取到):
language = request.LANGUAGE_CODE?
總結(jié)
以上是生活随笔為你收集整理的django 进行国际化及在后台进行中英文切换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模电学习笔记(十二)——跨阻放大器
- 下一篇: javaEE防盗版-class文件加密思