【Django】如何设置支持多语种网站,中文/英文网站

首先,需要明确一点:我们要实现的中英对照翻译,这个翻译不是浏览器翻译的,也不是Django帮你翻译。这个需要你自己事先手动翻译好,存放在专门翻译文件中,Django只是事后调用而已。

第一步 新建项目后,修改settings.py

假如创建的项目叫xiangmu,创建的app叫wangzhan, 然后在xiangmu目录下新建locale文件夹,用于保存翻译消息文件(.po和.mo格式的文件)。修改配置文件settings.py:

# 引入模块
from django.utils.translation import ugettext_lazy as _# 引入app
INSTALLED_APPS = [...'wangzhan',
]# 引入语言中间件,(注意位置,不要变)
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.locale.LocaleMiddleware',  # 语言插件'django.middleware.common.CommonMiddleware',...
]# 默认语言为英文
LANGUAGE_CODE = 'en-us'# 设置I18n和L10N为True
USE_I18N = True
USE_L10N = True # 指定支持语言。这里为了简化只支持简体中文和英文
LANGUAGES = (('en', _('English')),('zh-hans', _('Simplified Chinese')),
)# 用于存放django.po和django.mo编译过的翻译文件
PROJECT_ROOT = os.path.dirname(os.path.realpath(__name__))
LOCALE_PATHS = (os.path.join(PROJECT_ROOT, 'locale'),
)

特别说明:
1、使用ugettext_lazy这个方法的作用是在.py文件文件中标记需要翻译的字符串,对其进行惰性参照存储,而不是对字符串进行真正的翻译。

2,、在models.py和views.py文件中,定义字段时,会用到ugettext_lazy,来指定标记需要翻译的字符串。

3、在模板html文件中,并不能直接使用ugettext_lazy这个方法,而是使用

# 开头先要引入i18n
{% load i18n %}# 该标签标记定义需要翻译的字符“string”
{% trans "string" %}# 该标签标记定义需要翻译的变量
{% blocktrans%} {%endblocktrans %}

小知识:

  • 这两个标签也不是对字符串进行真正的翻译,只是标记而已。
  • i18n是国际化(Internationalization)的缩写。i 和 n 之间有 18 个字母,简称 I18N。
  • l10n是本地化(localization)的缩写。l 和 n 之间有 10 个字母,简称 L10N。

第二步 修改项目的urls.py, 增加国际化i18n的支持

这里的urls.py是项目下的,而不是app下urls.py)。
i18n_patterns的作用:让每个url前面自动加上所选语言的代码,比如/en/, /zh-hans/ 等

# 项目下的urls.pyfrom django.contrib import admin
from django.urls import path, include
from django.conf.urls.i18n import i18n_patternsurlpatterns = [path('i18n/', include('django.conf.urls.i18n')),
]urlpatterns += i18n_patterns(path('admin/', admin.site.urls),path('', include('wangzhan.urls')),
)
# app(wangzhan)下的urls.pyfrom django.contrib import admin
from django.urls import path
from . import viewsapp_name = 'wangzhan'
urlpatterns = [path('', views.index, name='index'),
]

此时,可以通过访问Django自带的admin,来检验语言国际化设置是否成功:
分别访问http://127.0.0.1:8000/en/admin/http://127.0.0.1:8000/zh-hans/admin/

第三步 修改视图文件views.py

在视图中我们使用ugettext_lazy方法标记了一个需要翻译的字符串"Welcome to China"。

from django.shortcuts import render
# 进入ugettext_lazy方法
from django.utils.translation import ugettext_lazy as _# Create your views here.
def index(request):context = {'msg': _("Welcome to China")}   # 定义要翻译的字符return render(request, 'wangzhan/index.html', context)

第四步 在index.html调用标签

<!DOCTYPE html>
{% load static %}
{% load i18n %}
<html lang="en">
<head>
...
...
...# 用于语言的选择切换 (必须是POST请求)
<form class="form-inline ml-3-md" action="{% url 'set_language' %}" method="post">   # 变量set_language = /i18n/setlang/{% csrf_token %}<div class="input-group"><input name="next" type="hidden" value="{{ redirect_to }}" /><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-warning">{% trans "Select" %}</button></div></div></form>
...
...
...# 
{% block content %}
<div class="py-4 px-3 bg-light"><div class="container">{% get_current_language as LANGUAGE_CODE %}<h4>{% trans 'Current language code' %}: {{ LANGUAGE_CODE }}</h4><p><small>{% trans "Welcome to our page" %}</small></p><hr/><p>{% blocktrans %} {{ msg }} {% endblocktrans %}</p></div>
</div>
{% endblock %}
  • {% load i18n %}以后,你可以使用get_current_language标签获得当前语言。
  • 模板中使用{% trans “string” %},string是需要翻译的文本。
  • {% blocktrans%} {%endblocktrans %}标签来标记了两个需要翻译的字符串,
    一个是模板中已存在的,一个是视图函数传递过来的变量。

更多用法:

#普通用法
{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}#增加过滤器
{% blocktrans with amount=article.price %}
That will cost $ {{ amount }}.
{% endblocktrans %}
{% blocktrans with myvar=value|filter %}
This will have {{ myvar }} inside.
{% endblocktrans %}#多个过滤器
{% blocktrans with book_t=book|title author_t=author|title %}
This is {{ book_t }} by {{ author_t }}
{% endblocktrans %}#注意:其他bolck tags (例如 {% for %} or {% if %}) 不允许在 blocktrans tag内部.

此时,启动测试服务器,应该能看到页面已经能正确显示。但是当你切换不同语言时,页面显示的内容还是一样的,这是因为我们还没对那些字符串进行翻译啊

第五步 生成.po和.mo编译消息文件

1、在\xiangmu\locale\zh_HANS\LC_MESSAGES目录下,生成.po文件
# django-admin makemessages -l 语言简写
django-admin makemessages -l zh_Hans    # 简体中文
django-admin makemessages -l zh_Hant    # 繁体中文
django-admin makemessages -l ko-kr      # 韩文
django-admin makemessages -l ja         # 日文 
# 等等(以此类推....)

在这里插入图片描述

注意:
在JavaScript多语言这里遇到个坑,js的翻译不管是中文还是英文,都是显示英文翻译。原因是编译的时候,应该用 zh_Hans 而不是zh_hans 或者zh_cn等等

然后,翻译对应字段的.po文件,翻译指定的字符如下:

msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-02-02 13:22+0800\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=1; plural=0;\n"#: .\wangzhan\templates\wangzhan\index.html:45
msgid "Select"
msgstr "选择"     #: .\wangzhan\templates\wangzhan\index.html:58
msgid "Current language code"
msgstr "当前语言代码"#: .\wangzhan\templates\wangzhan\index.html:59
msgid "Welcome to our page"
msgstr "欢迎访问我们的页面"#: .\wangzhan\templates\wangzhan\index.html:61
#, python-format
msgid " %(msg)s "
msgstr ""#: .\wangzhan\views.py:10
msgid "Welcome to China"
msgstr "欢迎来到中国北京"

自己手动翻译对应字符后,然后才可以进行下一步的编译!

2、在\xiangmu\locale\zh_HANS\LC_MESSAGES目录下,生成.mo文件
# 该命令生成一个django.mo的文件
python manage.py compilemessages

在这里插入图片描述

这个就是Django最后需要调用的翻译文件,里面包含了翻译过后的字符串列表。

重新启动服务器,就可以看到语言切换的效果了

重要提醒:

提醒(1)、windows系统下使用makemessages和compilemessages命令时会出现错误。

这是因为windows缺少基于GNU的gettext模块。安装方式如下:

  1. 下载相应版本,或者在我的分享资源下载gettext模块,
    安装或解压缩到C盘或D盘, 比如C:\Program Files (x86)\gettext

  2. 把gettex下的bin地址,比如C:\Program Files (x86)\gettext\bin加入到系统PATH的环境变量
    (在控制面板>系统>高级>环境变量中添加)。

  3. 如果pycharm的terminal中运行两个命令有问题,请直接在windows的cmd窗口运行。

  4. 对于Linux系统如果缺少可以使用sudo apt-get install gettext安装。

提醒(2)、多语言国际化的时候渲染模板的方法要用render(request,’xxxxx.html’,{}),而不是render_to_response(’xxxx.html’,{})方法

提醒(3),使用 --extension 或 -e 选项指定文件扩展名来检测

django-admin.py makemessages -l de -e txt# 用逗号和(或)使用-e 或--extension来分隔多项扩展名:
django-admin.py makemessages -l de -e html,txt -e xml

当创建JavaScript翻译目录时,你需要使用特殊的Django域:not -e js

更详细的说明,跳转官方文档查看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[职场] 英语面试自我介绍 #微信#笔记#媒体

英语面试自我介绍 英语面试自我介绍1 I am very happy to introduce myself here.I was born in Liaoning Province.I graduated from Nankai University and majored in International Trade.I like music and reaing books,especially economical books.It is my honor to ap…

测试人员的自我修养

QAS:是负责检查和评估软件产品质量的专业人员&#xff0c;他们通过执行一系列测试来确保软件产品的功能、性能和安全性符合设计要求。 当产品上线后&#xff0c;有 bug&#xff1a; “测试为什么没有测试发现这个问题&#xff1f;肯定是测试的责任&#xff01;” 当产品上线…

LabVIEW CVT离合器性能测试

介绍了CVT&#xff08;连续变速器&#xff09;离合器的性能测试的一个应用。完成了一个基于LabVIEW软件平台开发的CVT离合器检测与控制系统&#xff0c;通过高效、准确的测试方法&#xff0c;确保离合器性能达到最优。 系统采用先进的硬件配合LabVIEW软件&#xff0c;实现了对…

C语言在Visual Studio 2010环境下使用<regex.h>正则表达式函数库

在Visual Studio 2010环境下&#xff0c;如果C语言想要使用<regex.h>头文件进行正则表达式匹配&#xff0c;则需要pcre3.dll这个动态链接库&#xff0c;可以去网上下载。 下载的网址是&#xff1a;Pcre for Windowspcre {whatisit}https://gnuwin32.sourceforge.net/pac…

[Python] scikit-learn中数据集模块介绍和使用案例

sklearn.datasets模块介绍 在scikit-learn中&#xff0c;可以使用sklearn.datasets模块中的函数来构建数据集。这个模块提供了用于加载和生成数据集的函数。 API Reference — scikit-learn 1.4.0 documentation 以下是一些常用的sklearn.datasets模块中的函数 load_iris() …

回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于OOA-LSSVM鱼鹰算法优化最小二乘支持向量机的数据多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于OOA-LSSVM鱼鹰算法…

Python||五城P.M.2.5数据分析与可视化_使用华夫图分析各个城市的情况(下)

目录 沈阳市的空气质量 华夫图 柱状图 总结 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成都市&#xff0c;使用华夫图和柱状图分析各个城市的情况 沈阳市的空气质量 华夫图 import numpy as np import pandas as pd import matplotlib.pyplot as plt …

TorchVision的使用方法、更改默认路径

TorchVision的使用 1. 转换和增强图像 torchvision.transforms.v2 参数作用Resize将输入调整为给定大小RandomShortestSize随机调整输入的大小RandomResize随机调整输入的大小RandomCrop在随机位置裁剪输入RandomResizedCrop裁剪输入的随机部分并将其调整为给定大小RandomIoU…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-11-playwright操作iframe-上篇

1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了&#xff0c;因为前边的窗口切换就为这种网页处理提供了思路&#xff0c;另一个原因就是虽然iframe很强大&#xff0c;但是现在很少有网站用它了。但是还是有小伙伴或者童鞋们私下问这个问题&#xff0c;那么宏哥就…

【后端开发】正向代理与反向代理

正向代理 正向代理&#xff08;forward proxy&#xff09;&#xff1a;是一个位于客户端和目标服务器之间的服务器(代理服务器)&#xff0c;为了从目标服务器取得内容&#xff0c;客户端向代理服务器发送一个请求并指定目标&#xff0c;然后代理服务器向目标服务器转交请求并将…

BUUCTF-Real-[ThinkPHP]2-Rce1

任意代码执行漏洞 ThinkPHP 2.x版本中&#xff0c;使用preg_replace的/e模式匹配路由&#xff1a; $res preg_replace((\w).$depr.([^.$depr.\/])e, $var[\\\1\]"\\2";, implode($depr,$paths)); 导致用户的输入参数被插入双引号中执行&#xff0c;造成任意代码执行…

Open CASCADE学习|拓扑变换

目录 平移变换 旋转变换 组合变换 通用变换 平移变换 TopoDS_Shape out;gp_Trsf theTransformation;gp_Vec theVectorOfTranslation(0., 0.125 / 2, 0.);theTransformation.SetTranslation(theVectorOfTranslation);BRepBuilderAPI_Transform myBRepTransformation(out, th…

Leetcode刷题笔记题解(C++):36. 有效的数独

思路一&#xff1a;暴力破解&#xff0c;两个二维数组记录行、列对应的数字出现的次数&#xff0c;比如rows[i][index]表示的数字index在i行出现的次数&#xff0c;三维数组记录每个块中对应数字出现的次数&#xff0c;比如boxes[i/3][j/3][index]表示的数字index在[i/3][j/3]个…

校园墙表白墙系统uniapp微信小程序

配置文件 (自动编号、配置参数名称、配置参数值)&#xff1b; 前端开发:vue 语言&#xff1a;javapythonnodejsphp均支持 运行软件:idea/eclipse/vscode/pycharm/wamp均支持 框架支持:Ssm/django/flask/thinkphp/springboot/springcloud均支持 数据库 mysql 数据库工具&#x…

定时器 Timer(超详细模拟实现)

目录 一、定时器 1.定时器概述 2.Java标准库提供的定时器类 3.定时器代码样例 二、实现 1.实现思路 2.代码实现 2.1纯享版 2.2注释版 3.代码解析(超详细) 3.1描述类MyTimerTask ①构造&#xff1a;MyTimerTask&#xff08;Runnable runnable, long delay&#xff…

如何使用本地私有NuGet服务器

写在前面 上一篇介绍了如何在本地搭建一个NuGet服务器&#xff0c; 本文将介绍如何使用本地私有NuGet服务器。 操作步骤 1.新建一个.Net类库项目 2.打包类库 操作后会生成一个.nupkg文件&#xff0c;当然也可以用dotnet pack命令来执行打包。 3.推送至本地NuGet服务器 打开命…

《计算机网络简易速速上手小册》第6章:网络性能优化(2024 最新版)

文章目录 6.1 带宽管理与 QoS - 让你的网络不再拥堵6.1.1 基础知识6.1.2 重点案例&#xff1a;提高远程办公的视频会议质量实现步骤环境准备Python 脚本示例注意事项 6.1.3 拓展案例1&#xff1a;智能家居系统的网络优化实现思路Python 脚本示例 6.1.4 拓展案例2&#xff1a;提…

计算机网络_1.5 计算机网络的性能指标

1.5 计算机网络的性能指标 一、总览二、常用的八个计算机网络性能指标1、速率&#xff08;1&#xff09;数据量&#xff08;2&#xff09;速率&#xff08;3&#xff09;数据量与速率中K、M、G、T的数值辨析&#xff08;4&#xff09;【练习1】计算发送数据块的所需时间 2、带宽…

Unity引擎学习笔记之【角色动画器操作】

角色动画Character Animation 一、使用方法 1. 添加一个静态的角色模型&#xff0c;并确保这个角色模型绑定了Avatar 2. 创建一个动画器控制器 Animator Controller 3. 将动画器控制器拖动添加到Player的Animator控制器上 4. 双击即可打开控制器 5. 将带有动画的预设&#xf…

docker下nacos(1.2.0)的持久化

一、创建数据库 运行以下代码自动创建数据库和表 CREATE DATABASE IF NOT EXISTS nacos_config /*!40100 DEFAULT CHARACTER SET utf8 */; USE nacos_config;SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for config_…