django支持多语言
Django支持多语言切换
下面介绍下如何使网站或APP国际化,让其支持多种语言 。
效果

1、创建locale文件夹
先在项目根目录下创建一个名为locale的文件夹,这个文件夹是用来存放django.po和django.mo编译过的翻译文件。下面是我的项目文件夹示例:

2、settings.py中配置
首先配置中间件,添加LocaleMiddleware,放在SessionMiddleware后面,CommonMiddleware前面,
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.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',
]
配置支持多语言:
from django.utils.translation import ugettext_lazy as _
LANGUAGE_CODE = 'zh-hans' # 默认使用中国时区
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
LANGUAGES = (
('en', _('English')),
('zh-hans', _('Simplified Chinese')),
)
# 用于存放django.po和django.mo编译过的翻译文件
LOCALE_PATHS = (os.path.join(BASE_DIR, 'locale'),)
3、设置urls.py
在项目中的路由配置urls.py中设置i18n多语言路由。
from django.conf.urls.i18n import i18n_patterns
from django.contrib import admin
from django.urls import path, re_path, include
from django.views.static import serve
from mallSystem import settings
urlpatterns = [
path('i18n/', include('django.conf.urls.i18n')),
]
urlpatterns += i18n_patterns(
path('admin/', admin.site.urls),
path("", include("mall.urls")),
re_path(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATICFILES_DIRS}),
)
注:i18n是国际化(Internationalization)的缩写。i 和 n 之间有 18 个字母,简称 i18n,。l10n是本地化(localization)的缩写。l 和 n 之间有 10 个字母,简称 l10n。
4、访问admin
现在就可以通过不同的语言来访问后台管理网站了,
中文:http://127.0.0.1:8001/zh-hans/admin/login/

英文:http://127.0.0.1:8001/en/admin/login/

5、翻译py、html中的字符串
在py文件中使用函数ugettext_lazy 。
在html中使用标签{% trans “string” %}或{% blocktrans%} {%endblocktrans %} ,需在文件开头加入{% load i18n %} 表示使用多语言。
下面是翻译的一个示例。通过访问url来得到不同语言的html。
apps/mall/urls.py
from django.urls import path
from mall import views
urlpatterns = [
path("", views.index, name="index"), # 首页
]
apps/mall/views.py
from django.shortcuts import render
from django.utils.translation import ugettext_lazy as _
def index(request):
context = {'msg': _("这是一个有趣的购物网站,你可以在这里购买都衣服、手提包、鞋子等等")}
return render(request, 'index.html', context)
templates/index.html
<!DOCTYPE html>
{% load static %}
{% load i18n %}
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description"
content="Quickly get a project started with any of our examples ranging from using parts of the framework to custom components and layouts.">
<title>{% trans "购物网站" %}</title>
<link rel="canonical" href="https://getbootstrap.com/docs/4.5/examples/">
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<style>
body {
overflow-x: hidden; /* Prevent scroll on narrow devices */
font-family: 'Inter', Arial, sans-serif;
background: #F6F8FF;
padding-top: 56px;
}
.form-control{
margin-right: 10px;
}
</style>
</head>
<body>
{#多语言切换下拉框#}
<nav class="navbar navbar-expand-md fixed-top navbar-light box-shadow bg-white">
<div class="container">
<a class="navbar-brand align-items-md-center" href="index.html">{% trans "Django多语言切换" %}</a>
<form class="form-inline ml-3-md" action="{% url 'set_language' %}" method="post">
{% csrf_token %}
<div class="input-group">
<select name="language" class="form-control">
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected{% endif %}>
{{ language.name_local }}
</option>
{% endfor %}
</select>
<div class="input-group-append">
<button type="submit" class="btn btn-inline btn-sm bg-success">
{% trans "Select" %}
</button>
</div>
</div>
</form>
</div>
</nav>
{% block content %}
<div class="py-4 px-3 bg-light">
<div class="container">
{% get_current_language as LANGUAGE_CODE %}
<h4>{% trans '当前语言' %}: <b>{{ LANGUAGE_CODE }}</b></h4>
<p><small>{% trans "这是一个购物网站" %}</small></p>
<hr/>
<p>{% blocktrans %} {{ msg }} {% endblocktrans %}</p>
</div>
</div>
{% endblock %}
<footer class="bd-footer bg-light">
<div class="container pt-3 pb-2 px-3 px-md-2">
<ul class="bd-footer-links list-unstyled text-muted list-inline pb-2">
<li class="list-inline-item">
<small>© {% trans '开发者 LDC' %}</small>
</li>
<li class="list-inline-item">
<small>{% trans '联系方式: 微信 1257309054' %}</small>
</li>
</ul>
</div>
</footer>
<script src="https://lib.baomitu.com/jquery/3.5.0/jquery.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
</body>
</html>
可以通过get_current_language获取当前语言。
6、生成po、mo翻译文件
如果是windows系统,需要先下载gettext,
下载方式一:官网
下载方式二:关注公众号“轻松学编程”,回复gettext即可。
下载gettext后解压缩到C盘, C:\Program Files (x86)\gettext,复制C:\Program Files (x86)\gettext\bin路径加入到系统PATH的环境变量(在控制面板>系统>高级>环境变量中添加)
在项目根目录中打开cmd窗口,激活虚拟环境,然后运行以下命令生成po文件:
# 生成中文的po文件
python manage.py makemessages -l zh_HANS
# 生成英文的po文件
python manage.py makemessages -l en

如果生成成功,那么在locale文件夹中可以看到以下文件:

翻译好每一个msgstr后,就需要生成mo文件,命令为:
python manage.py compilemessages
然后打开浏览器,输入http://127.0.0.1:8001/zh-hans/,就可以看到中文html,

输入http://127.0.0.1:8001/en/就可以看到英文的html了,当然也可以通过下拉框来进行切换。

后记
【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。
也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!
公众号


关注我,我们一起成长~~
django支持多语言的更多相关文章
- Django之模板语言
一.模板语言介绍 模板语言渲染的整个过程其实就是将html转换成函数,并为该函数提供全局变量,然后执行该函数 二.模板语言的语法 模板中也有自己的语言,该语言可以实现数据展示 # 业务请求处理做的页面 ...
- Django的模板语言
Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} 变量名由字母数字和下划线组成. ...
- django 更新 模板语言
Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Django的模板语言中按此语法使用:{{ 变量名 ...
- Django---MTV和MVC的了解,Django的模版语言变量和逻辑,常见的模板语言过滤器,自定义过滤器,CSRF了解,Django的母版(继承extends,块block,组件include,静态文件的加载load static),自定义simple_tag和inclusion_tag
Django---MTV和MVC的了解,Django的模版语言变量和逻辑,常见的模板语言过滤器,自定义过滤器,CSRF了解,Django的母版(继承extends,块block,组件include,静 ...
- django的多语言国际化
介绍 Django 支持国际化,多语言.Django的国际化是默认开启的,如果您不需要国际化支持,那么您可以在您的设置文件中设置 USE_I18N = False,那么Django会进行一些优化,不加 ...
- 第四篇Django之模板语言
Django之模板语言 一 模板的执行 模板的创建过程,对于模板,其实就是读取模板(其中嵌套着模板的标签),然后将Model中获取的数据插入到模板中,最后将信息返回给用户 def current_da ...
- Win10 UWP 开发系列:使用多语言工具包让应用支持多语言
之前我在一篇blog中写过如何使用多语言工具包,见http://www.cnblogs.com/yanxiaodi/p/3800767.html 在WinEcos社区也发布过一篇详细的文章介绍多语言工 ...
- XE3随笔21:系统默认语言与系统支持的语言列表
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
- 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】
最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...
随机推荐
- java.lang.illegalArgumentException异常
今天在使用spring3.2的时候,配置好注解开发后,运行出现异常 java.lang.illegalArgumentException 经查为 JRE 版本域spring3.2不兼容所致, 将项目J ...
- Go-简介
Go简介 Google开发,新的具有面向接口.函数式编程.并发编程特点的编译性强类型通用编程语言 Go核心 1. 接口 2. 并发编程 3. 函数 Go-接口 package main import ...
- 在KEIL下查看单片机编程内存使用情况
原文链接:https://blog.csdn.net/D_azzle/article/details/83410141 截至到目前为止,本人接触单片机也有将近一年的时间.这一年以来也接触过了很具代表性 ...
- three.js学习5_渲染器
THREE.WebGLRenderer WebGL Render 用WebGL渲染出你精心制作的场景 介绍 在之前的介绍中, 已经介绍过场景, 相机, 光源, 有了这些后, 就可以形成一个可观的三维展 ...
- Office远程代码执行漏洞(CVE-2017-11882)
POC: https://github.com/Ridter/CVE-2017-11882/ 一.简单的生成弹计算器的doc文件. 网上看到的改进过的POC,我们直接拿来用,命令如下: #python ...
- PADS Layout VX.2.3 灌铜之后只显示灌铜外框,没有显示整块铜皮
操作系统:Windows 10 x64 工具1:PADS Layout VX.2.3 使用Copper Pour功能,画了一个灌铜区,并分配了网络. Tools > Pour Manager,打 ...
- RHSA-2017:2679-重要: 内核 安全更新(需要重启、存在EXP、代码执行)
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...
- 左叶子之和(sum-of-left-leaves)
LeetCode题目--左叶子之和(sum-of-left-leaves) 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 ...
- SpringBoot整合Mybatis 编译失败:找不到符号 程序包不存在
问题描述:jpa不好用,转用mybatis,配置多数据源 但是配置后无法编译mvn clean install dao层这些报错,找不到entity的包 问题解决:罪魁祸首:热部署的部分 ...
- 多测师讲解python _函数中变量_高级讲师肖sir
定义的函数内部的变量名如果是第一次出现, 且在=符号前,那么就可以认为是 被定义为局部变量.在这种情况下,不论全局变量中是否用到该变量名,函数中 使用的都是局部变量.例如: num=100 #全局变量 ...