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模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...
随机推荐
- C++ 智能指针 shared_ptr 分析
引文: C++对指针的管理提供了两种解决问题的思路: 1.不允许多个对象管理一个指针 2.允许多个对象管理一个指针,但仅当管理这个指针的最后一个对象析构时才调用delete ps:这两种思路的共同点就 ...
- DatabaseGeneratedOption
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 添加时 获取值 自增 默认值,,后期无法修改如:Id(AUTO_INCREMENT, ...
- Python之虚拟环境virtualenv、pipreqs生成项目依赖第三方包
virtualenv简介 含义: virtual:虚拟,env:environment环境的简写,所以virtualenv就是虚拟环境,顾名思义,就是虚拟出来的一个新环境,比如我们使用的虚拟机.doc ...
- 【LEETCODE】63、数组分类,hard级别,题目:85、4、84
package y2019.Algorithm.array.hard; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.arr ...
- elasticsearch内存不断增长问题
经过一段时间运行,es的索引已经达到数十G以上.es采用mmap的方式将索引文件映射到内存中,随着检索的次数增加,越来越多的数据被操作系统读入到内存中.这部分内存位于系统中,但是又不归es管理,也就是 ...
- mongoDB对没有字段的记录新增字段
db.getCollection('ClassRecordOneDetail').updateMany({'synState':{'$exists':false}},{'$set':{'synStat ...
- Visual Studio 使用 Parallel Builds Monitor 插件迅速找出编译速度慢的瓶颈,优化编译速度
原文:Visual Studio 使用 Parallel Builds Monitor 插件迅速找出编译速度慢的瓶颈,优化编译速度 嫌项目编译太慢?不一定是 Visual Studio 的问题,有可能 ...
- JavaScript字符串转数值
JavaScript字符串转数值:方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数 js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成 ...
- Ubuntu中使用sanp一键安装安装Notepad ++
很少有文本编辑器像Notepad ++一样流行得到广大用户的喜爱,Notepad ++是一个免费的开源代码编辑器,专为Windows构建,用C ++编写.以其小巧的应用程序大小和出色的性能而闻名,但缺 ...
- iOS 13-Sign In with Apple
最近了解了iOS 13新增功能之Sign In with Apple,Sign In with Apple是跨平台的,可以支持iOS.macOS.watchOS.tvOS.JS.本文主要内容为Sign ...