django 进行语言的国际化及在后台进行中英文切换
项目的部署地为: 中国大陆与美国东海岸, 两个地区的服务器数据不进行同步, 中国地区的服务器页面展示中文, 美国地区的服务器页面展示成英文, 项目后台使用python编程语言进行开发, 并结合django框架进行版本迭代.
这里对项目的国际化进行配置说明:
一.在配置文件settings.py中:
1) 开启国际化功能
# 语言, 先设置成中文
LANGUAGE_CODE = 'zh-hans' # 1.8版本之后的language code设置不同, 1.8之前是LANGUAGE_CODE = 'zh-CN'
# LANGUAGE_CODE = 'en'
# 时区
TIME_ZONE = 'Asia/Shanghai'
# TIME_ZONE = 'UTC'
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/
# 开启国际化
USE_I18N = True
# 开启本地化
USE_L10N = True
USE_TZ = True
LANGUAGES = (
('en', 'English'),
('zh-hans', '中文简体'),
)
# 翻译文件所在目录, 与 manage.py 文件在同级目录下
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
2) 添加进行国际化的中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# 这就是新添加进来的中间件, 注意位置: 需要放置在 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': [
# 新添加进来的上下文渲染器, 不知是否是本人配置不当, 如果将该渲染器放置在其他位置, 无法进行语言切换
'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',
],
},
},
]
二.在项目的路由文件 urls.py中, 添加路由:
# 如果需要支持在页面自由选择语言进行切换, 必须添加该路由, 获取语言翻译文件
url(r'^i18n/', include('django.conf.urls.i18n')),
三.在模板文件中开启国际化
<!DOCTYPE html>
{% load i18n %}
在需要进行国际化的模板中开启国际化功能: 在文件的开头添加: {% load i18n %}, 也可以放置在 <!DOCTYPE html> 后面
四.添加需要进行国际化的字符串
1) 在视图中调用模板, 通过变量赋值渲染模板( 或者直接返回json数据给前台, 由前台通过js或者其他模块进行翻译):
在views.py中:
from django.utils.translation import gettext_lazy as _
...
if user.is_active:
# _("已激活") 标示对该字符串进行国际化翻译, 如果是前后端分离,使用 gettext_lazy() 进行国际化翻译以后, 就可以转换成json数据向前台返回了
context = {"text": _("已激活"),"domain": domain}
# 进行模板渲染,响应用户请求.如果前后分离,可以直接返回json数据给前端,由前端在js中进行国际化
return render(request, "./users/active_account.html", context)
如果是模板渲染, 在相应的模板文件 acitveacitve_account.html 中:
<body>
<h2>{%trans "你好!" %}</h2>
<h2>{{ text }}</h2>
<img src="{{ domain }}/static/images/qcat2.jpeg" alt="">
</body>
直接将变量渲染到模板中即可, 由模板调用翻译文件进行翻译.
如果需要进行国际化的字符串可以直接写死在模板中, 也可以直接在模板中使用下面的方式进行国际化:
{%trans "需要翻译的字符串" %} , 如上面的代码中所示.
五.生成翻译文件(先在manage.py的同级目录下创建 locale目录)
python manage.py makemessages -l en
会在locale目录下生成 po 翻译文件, 文件自动列出需要进行翻译的字符串, 如:
# 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 : 需要进行国际化的字符串
msgstr: 将翻译好的字符串, 填充进去即可,如:
# 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所在目录下执行下面的命令:
python manage.py compilemessages
到这里, 国际化的配置基本完成, 可以通过修改下面的配置项,进行平台语言展示的设置
# 中文
# LANGUAGE_CODE = 'zh-hans' # 1.8版本之后的language code设置不同, 1.8之前是LANGUAGE_CODE = 'zh-CN'
# 英文
LANGUAGE_CODE = 'en' # 按照这里的步骤,默认语言需要设置成英文,中英文翻译才会生效
# 时区
TIME_ZONE = 'Asia/Shanghai'
# TIME_ZONE = 'UTC'
如下所示
中文:
你好!
已激活
英文:
hello
You have successfully activated the account, do not need to activete it again, thank you!
如果需要在页面中让用户自行选择进行语言切换, 还需要进行额外的配置, 详情可以去查看官方文档
六.如果前台是APP,语言切换时,因为前后台的语言环境需要保持一直,所以我这里采取了一种不是太优雅的的办法: 封装一个接口, 当用户进行国际化切换时,由APP请求一下该接口, 告知后台该用户选择了那种语言, 接口代码如下所示:
@api_view(["POST"])
def set_lang(request):
"""
用户在app进行语言切换时, 请求一下该接口
: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)
当用户请求其他接口时,就可以通过request请求对象获取到用户当前是选择的那种语言(即使不进行登录也可以获取到):
language = request.LANGUAGE_CODE
django 进行语言的国际化及在后台进行中英文切换的更多相关文章
- Django模版语言 格式化显示 后台datatime()时间
Django模版语言 格式化显示 后台datatime()时间 场景描述:
- Django 模版语言详解
一.简介 模版是纯文本文件.它可以产生任何基于文本的的格式(HTML,XML,CSV等等). 模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签. 例: {% extends "b ...
- Django模板语言初识
一.Django框架简介 1.MVC框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控 ...
- Django模板语言相关内容 Djan
Django模板语言相关内容 Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...
- Django——模板语言相关内容
Django模板语言相关内容 Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...
- Django模板语言与视图(view)
常用语法 {{ }}和{% %} 变量相关的用{{}} , 逻辑相关的用{% %} 变量 在Django的模板语言中按此语法使用:{{ 变量名 }}. 当模版引擎遇到一个变量,它将计算这个变量,然后 ...
- Django模板语言(一)
1,Django模板语言 1.1>基础语法:1.1.1,变量相关:{{ 变量名 }},1.1.2,逻辑相关{% ... %} 在Django模板语言中按此语法使用:{{ 变量名 }},当模板引擎 ...
- Django模板语言的学习
1.模板系统 1.语法 1.变量相关 {{ name}} ,{{ name|length}}, {{ name |default:"默认值"}} 2.逻辑相关 1.if判断 {% ...
- 6月15日 python学习总结 Django模板语言相关内容
Django模板语言相关内容 Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...
随机推荐
- [转帖]【ZOOKEEPER系列】Paxos、Raft、ZAB
[ZOOKEEPER系列]Paxos.Raft.ZAB 2018-07-11 12:09:49 wangzy-nice 阅读数 2428更多 分类专栏: zookeeper 版权声明:本文为博主原 ...
- 精通react之react-router4源码分析(100代码实现router功能)
1.react-router4 是一个 react 组件 通过和 location / histroy 结合,来显示页面不同URL对应显示不同的组件 其中包含了三种路由.hash / boswer 等 ...
- golang中,map作为函数参数是如何传递的
当你声明一个map的时候: m := make(map[int]int) 编译器会调用 runtime.makemap: // makemap implements a Go map creation ...
- MongoDB的安装,mongod和mongo的区别
一. mongoDB安装路径 安装路径(最新4.0.11):https://www.mongodb.com/download-center/community?jmp=nav 建议另外找路径下载,外网 ...
- PHP的序列化、对象、反射、异常与错误
1. 怎么理解php里面的序列化与反序列化? 序列化是将对象转换为字节流.反序列化就是将流转换为对象. 这两个过程结合起来,可以轻松地存储和传输数据,在网络中可以做到跨平台.快速传输. 两种序列化方式 ...
- 2019 人民网java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.人民网等公司offer,岗位是Java后端开发,因为发展原因最终选择去了人民网,入职一年时间了,之前面试了很多 ...
- Java知识回顾 (14)网络编程
本资料来自于runoob,略有修改. 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细 ...
- kafka汇总
Kafka 1. kafka概念 kafka是一个高吞吐亮的.分布式.基于发布/订阅(也就是一对多)的消息系统,最初由Linkedln公司开发的,使用Scala语言编写的,目前是Apache的开源项目 ...
- [Props] vue组件间的传值及校验
基本用法 Prop的基本用法很简单,只需要在子组件的Vue实例中定义该属性并把值设为目标属性的数组即可 Vue.component('child', { ... // 接收message props: ...
- JavaScript之原型、函数、实例
JavaScript 函数语法 函数就是包裹在花括号中的代码块,前面使用了关键词 function: function functionname() { // 执行代码 } 当调用该函数时,会执 ...