【Django | 开发】 (国际化项目&支持多语言)

【Django | 开发】 (国际化项目&支持多语言)

🤵‍♂️ 个人主页: @计算机魔术师 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。

🌐 推荐一款找工作神器网站: ​​牛客网🎉🎉|笔试题库|面试经验|实习招聘内推 ​​​ 还没账户的小伙伴 ​​​速速点击链接跳转牛客网登录注册​​ 开始刷爆题库,速速通关面试吧🙋‍♂️

该文章收录专栏 ✨—【Django | 项目开发】从入门到上线 专栏—✨

@[toc]

一、国际化项目介绍

【Django | 开发】 (国际化项目&支持多语言)

【Django | 开发】 (国际化项目&支持多语言)

这个翻译不是浏览器翻译的,Django也不会帮你翻译。这个需要你自己事先手动翻译好,存放在专门翻译文件中,Django只是事后调用而已。

二、实现步骤

2.1 为翻译字符串添加钩子

1) py文件

将需要翻译的字符串统一使用​ ​gettext_lazy​​​或​ ​gettext​​包裹

from django.utils.translation import gettext_lazy as _class Candidate(models.Model):    # * 基础信息 (对于整形数值一定要定义null=true,因为如果没有赋值,数据库会声明不能为null    user_id = models.IntegerField(verbose_name=_('应聘者ID'), blank=True, null=True)    username = models.CharField(max_length=135, verbose_name=_('姓名'))    city = models.CharField(max_length=135, verbose_name=_('城市'), blank=True)    phone = models.CharField(max_length=135, verbose_name=_('手机号码'))    email = models.EmailField(max_length=135, verbose_name=_('邮箱'), blank=True)    gender = models.CharField(max_length=135, verbose_name=_('性别'), blank=True)    apply_position = models.CharField(max_length=135, verbose_name=_('应聘职位'), blank=True)    born_address = models.CharField(max_length=135, verbose_name=_('生源地'), blank=True)    candidate_remark = models.CharField(max_length=135, blank=True, verbose_name=_('候选人信息备注'))

2)HTML文件

导入​ ​i18n​​​,为需要翻译的代码添加代码​ ​{% translate %}​​​ 或者​ ​{% blocktranslate %}​​( 用于存在变量翻译

{% load i18n %}
<div class="">
<h6 class="uppercase font-semibold mb-4 flex justify-center md:justify-start">
{% translate "Useful links" %}
h6>
<p class="mb-4">
<a href="#!" class="text-gray-600">{% translate "Pricing" %}a>
p>
<p class="mb-4">
<a href="#!" class="text-gray-600">{% translate "Settings" %}a>
p>
<p class="mb-4">
<a href="#!" class="text-gray-600">{% translate "Orders" %}a>
p>
<p>
<a href="#!" class="text-gray-600">{% translate "Help" %}a>

-----------------------------------------------------------------------------------------------
<-- 块翻译 -->
{% blocktranslate with job_name=job.job_name job_city=job.job_place %}
<h2>岗位名称:{{ job_name }}h2>
<div>
div>
<div>
城市: {{ job_city }}
div>
{% endblock %}

如果在翻译中存在二级变量或者三级变量在渲染时需要提前保存

2.2 生成本地化翻译资源文件

  1. 在settings加入如下
默认语言LANGUAGE_CODE = 'zh-hans'from django.utils.translation import gettext_lazy as _LANGUAGES = [    ('en', _('English')),    ('zh-hans', _('Simplified Chinese')),]# 用于存放django.po和django.mo编译过的翻译文件PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__name__)))LOCALE_PATHS = (    os.path.join(PROJECT_ROOT, 'locale'),)
  1. 在项目根目录下生成​ &#x200B;locale&#x200B;​目录,用于保存翻译消息文件(.po和.mo格式的)
  2. 在终端输入

( 大坑插入由于在&#x200B;<strong>gettext</strong>&#x200B;版本低于&#x200B;<strong>0.15</strong>&#x200B;, 报错:​ &#x200B;Make sure you have GNU gettext tools 0.15 or newer installed.&#x200B;​​,我花了一整天时间处理😑,由于支持window系统以及配置网上的方法都比较旧,最后还是​ &#x200B;stackoverflow&#x200B;​香😎,直接在 网址&#x200B;<strong>https://mlocati.github.io/articles/gettext-iconv-windows.html</strong>&#x200B;下载&#x200B;<strong>static 64</strong>&#x200B;文件,将其​ &#x200B;bin&#x200B;​文件 配置到系统环境变量即可!!

django-admin makemessages -l zh_Hans -l en
  • 生成对应文件

  • 我们需要在对应的文件中,给这些 需要翻译的键添加值(​ &#x200B;msgid &#xFF08;message id&#xFF09;&#x200B;​​是键,​ &#x200B;msstr(message str)&#x200B;​是值。

  • &#x200B;en&#x200B;​ 文件

( 这里的​ &#x200B;en&#x200B;​ 是之前所设置的名字,需要与setting中语言 配置元组中第一个数据一样,此时我们需要都将中文翻译成英文, 注意!!不进行翻译会默认使用其他语言!,例如在中文广州市翻译中翻译成了英文!

【Django | 开发】 (国际化项目&支持多语言)

【Django | 开发】 (国际化项目&支持多语言)
msgid "工作经验"msgstr "work-experience"#: .\jobs\models.py:65msgid "项目经历"msgstr "product-experience"#: .\jobs\models.py:75 .\jobs\models.py:76msgid "简历"msgstr "resume"#: .\jobs\views.py:60msgid "job does not exist"msgstr "工作不存在"#: .\recruitment\urls.py:34msgid "霍格沃兹学院"msgstr "Hogwarts"#: .\recruitment\urls.py:36 .\templates\base.html:9msgid "霍格沃兹招聘信息网"msgstr "Hogwarts job list"
  • zh_Hans 文件则翻译为中文
msgstr "忘记密码?"#: .\templates\account\login.html:71msgid "Log In"msgstr "登 录"#: .\templates\account\login.html:75msgid "Don't have an account?"msgstr "还没有账户?"#: .\templates\account\login.html:75msgid "Register here."msgstr "点击注册"#: .\templates\account\logout.html:9 .\templates\account\logout.html:12#: .\templates\account\logout.html:21msgid "Sign Out"msgstr "注销"#: .\templates\account\logout.html:14msgid "Are you sure you want to sign out?"msgstr "你确定要注销吗"
  1. 编译为二进制文件
django-admin compliemessages

【Django | 开发】 (国际化项目&支持多语言)

三、配置settings文件

  1. 添加路径映射
path('i18n/', include('django.conf.urls.i18n')),
  1. 在​ &#x200B;settings&#x200B;​添加国家化的配置
默认语言LANGUAGE_CODE = 'en-us'# 设置I18n和L10N为TrueUSE_I18N = TrueUSE_L10N = Truefrom django.utils.translation import gettext_lazy as _LANGUAGES = [    # 第一个是对应语言,第二个是字符串表达    ('en', _('English')),    ('zh-hans', _('Simplified Chinese')),]# 用于存放django.po和django.mo编译过的翻译文件LOCALE_PATHS = (    os.path.join(BASE_DIR, 'locale'),)
  • *效果

你可以看到中文已经被翻译成了自译的英语。

[En]

You can see that Chinese has been translated into self-translated English.

【Django | 开发】 (国际化项目&支持多语言)
  1. 配置本地化中间件

&#x200B;LocaleMiddleware&#x200B;​​这个中间件。它的位置也很重要,应于​ &#x200B;SessionMiddleware&#x200B;​​之后,​ &#x200B;CommonMiddleware&#x200B;​之前。(通用中间件前,改中间件主要用于一些简单处理)

MIDDLEWARE = [    'interview.performance.performance_logger_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',]

四、让用户自己选择语言

1) 通过表单修改语言版本

添加下拉框选择语言,在​ &#x200B;base.html&#x200B;​根模板下修改如下

{#  set language  #}
<form method="POST" action="{% url "set_language" %}">
{% csrf_token %}
<input type="hidden" name="next" value="{{ redirect_to }}"/>
<select name="language">
{# 得到当前语言#}
{% get_current_language as LANGUAGE_CODE %}
{# 可用语言就是setting文件配置的元组 #}
{% 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 }} {{ language.code }}
option>
{% endfor %}
select>
{% trans "The current language:" %} {{ LANGUAGE_CODE }}
<button type="submit">{% trans "Switch" %}button>
form>
  • 我还想美化他的样式和​ &#x200B;django&#x6587;&#x6863;&#x200B;​一样

【Django | 开发】 (国际化项目&支持多语言)
  • 实现代码如下(使用的样式是​ &#x200B;tailwind&#x200B;​)
{#  set language  #}
<div class="fixed bottom-0 right-0 mb-3 xl:w-96">
<form method="POST" action="{% url "set_language" %}" class="my-2 p-1 flex rounded svelte-1l8159u">
{% csrf_token %}
<input type="hidden" name="next" value="{{ redirect_to }}"/>

<select name="language" class="form-select form-select-sm
appearance-none
block
w-full
px-2
py-1
text-sm
font-normal
text-gray-700
bg-white bg-clip-padding bg-no-repeat
border border-solid border-gray-300
rounded
transition
ease-in-out
m-0
focus:text-gray-700 focus:bg-blue focus:border-blue-600 focus:outline-none">
{# 得到当前语言#}
{% get_current_language as LANGUAGE_CODE %}
{# 可用语言就是setting文件配置的元组 #}
{% 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 %}>
{% trans "The current language:" %} {{ language.name_local }} {{ language.code }}
option>
{% endfor %}
select>
<button type="submit" class="inline-block px-4 py-1.5 bg-blue-600 text-white font-medium text-xs leading-tight uppercase rounded shadow-md hover:bg-blue-700 hover:shadow-lg focus:bg-blue-700 focus:shadow-lg focus:outline-none focus:ring-0 active:bg-blue-800 active:shadow-lg transition duration-150 ease-in-out">{% trans "Switch" %}button>
form>
div>
  • 效果

2)通过对应链接修改

其实​ &#x200B;django&#x5B98;&#x65B9;&#x6587;&#x6863;&#x200B;​的国家化项目中也是这么干的

【Django | 开发】 (国际化项目&支持多语言)

这里需要添加​ &#x200B;&#x8DEF;&#x7531;url&#x200B;​​ ​ &#x200B;i18n_patterns&#x200B;

from django.contrib import adminfrom django.urls import path, includefrom django.conf.urls.i18n import i18n_patternsurlpatterns = [    path('i18n/', include('django.conf.urls.i18n')),]urlpatterns += i18n_patterns(    path('admin/', admin.site.urls),    path('', include('myapp.urls')),)

这样在不同路径下,就会切换语言,但是目前是需要全部项目的路由都要修改,不知道如何配置才不需要😂(参考文章: ​​大江狗​​​ | ​​刘江的博客​​)

小结

  • *Django如何识别用什么语言呢?

django查询语言是 先从&#x200B;<strong>url</strong>&#x200B;找,然后再从&#x200B;<strong>cookie</strong>&#x200B;里面找,再从浏览器&#x200B;<strong>header</strong>&#x200B;里面找,如果都没有的话则 使用系统默认语言&#x200B;<strong>LANGUAGE_CODE</strong>&#x200B;

  • *Django如何切换语言?

在切换语言from表单中,我们所提交的表单路径​ &#x200B;set_language&#x200B;​​ 是我们所导入​ &#x200B;i18n url &#x200B;​路径所提供的, 提交的&#x200B;<strong>language.code</strong>&#x200B;能够对应到我们所设置的语言就能切换语言。

【Django | 开发】 (国际化项目&支持多语言)
🤞在这里,如果你有任何问题,🤞🎩欢迎博客作者的私信。哦,博主们会尽力为你答疑解惑的!如果🎩🥳对你有帮助,那么你的赞扬就是对博客作者最大的支持!🥳<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>🤞 is here, if you have any questions, 🤞 🎩 welcome private messages from bloggers. Oh, bloggers will try their best to answer questions for you! If 🎩 🥳 is helpful to you, your praise is the greatest support for bloggers! 🥳</font>*</details>

Original: https://blog.51cto.com/u_15691039/5634541
Author: 计算机魔术师
Title: 【Django | 开发】 (国际化项目&支持多语言)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/500256/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java dataframe agg_DataFrame对象groupby.agg方法总结

    源自官方实例 DataFrame数据: df = pd.DataFrame({‘A’: [1, 1, 2, 2], … ‘B&#82…

    Python 2023年8月22日
    0115
  • pandas mysql insert_python – Pandas将数据插入MySQL

    我认为你的代码应该是这样的 import pandas as pd from pandas.io import sql from sqlalchemy import create_…

    Python 2023年8月8日
    0101
  • pandas经典练习题

    pandas是Python的一个非常强大的数据分析库,它提供了高性能易用的数据类型,以及大量能使人们快速地处理数据的函数与方法。pandas的核心数据结构有两种,即一维数组的Ser…

    Python 2023年8月6日
    0112
  • python merge、concat合并数据集的实例讲解

    数据规整化:合并、清理、过滤 pandas和python标准库提供了一整套高级、灵活的、高效的核心函数和算法将数据规整化为你想要的形式! 本篇博客主要介绍: 合并数据集:.merg…

    Python 2023年8月6日
    085
  • pytest自动化测试框架基础篇

    1.什么是单元测试框架 单元测试框架是在自动化测试或者白盒测试中对软件的最小单元(函数,方法)进行测试的框架。 2.单元测试框架分类 python:unittest、pytest …

    Python 2023年9月9日
    060
  • django 整合 vue

    安装 vue 安装 node.js , 官网地址: https://nodejs.org/zh-cn/download/ 使用 npm 淘宝镜像 3 . 使用 cnpm 下载 vu…

    Python 2023年6月10日
    0111
  • 五、空气质量分析与结果展示

    五、空气质量分析与结果展示 5.1 实验背景 近年来随着城市化和工业化的发展,城市空气质量越来越差,从中央到地方各级政府对城市空气质量也越发重视。并对全国各个城市的空气质量进行了长…

    Python 2023年9月3日
    061
  • Python数据分析 ——Matplotlib数据可视化

    ⭐Matplotlib使用和Matlab中绘图方法类似,如果使用过Matlab会更容易理解一些。🌈 目录 1.前言 2.Matplotlib概念 3.Matplotlib.pypl…

    Python 2023年8月23日
    088
  • pandas基础入门之数据修改与基本运算

    *直接赋值, 直接赋值的话,只是复制的元数据(行列索引),但是元素还是存储在相同内存位置 对元素进行修改会影响另外一个。 import pandas as pd import nu…

    Python 2023年8月7日
    0116
  • Linux 创建Django项目并部署

    一、安装Django 1.使用pip安装django pip3 install django 进入python3查看 cd /usr/local/python3/bin 检查是否安…

    Python 2023年8月5日
    0125
  • pytest学习(五)- @pytest.fixture和 conftest 使用

    前言 定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要用test_开头,跟用例区分开。用例才是tes…

    Python 2023年9月12日
    0115
  • 使用Yolov7遇到的一些问题的解决方法

    1.CUDA内存不足 我在使用yolov7中遇到了一些问题,通过查询相关的资料和网站将其一个一个解决了。首先遇到的第一个问题就是cuda的内存不足,报错内容如下所示: Runtim…

    Python 2023年9月28日
    0245
  • cmd中运行python程序出现自暂停

    编写了一个python程序,里面写了个死循环,但是在windows的cmd里运行的时候,时不时地程序自己就暂停了,敲回车或空格它才继续运行 解决: 需要在cmd顶部右击属性,然后将…

    Python 2023年6月10日
    0220
  • Python爬虫之scrapy框架环境安装

    文章目录 前言 一. scrapy框架环境安装 二. 创建一个scrapy工程 前言 为什么要学习scrapy框架? 框架是一个集成了很多功能,并且具有很强通用性的一个项目模板。 …

    Python 2023年10月1日
    0103
  • 算法 | 详解斐波那契数列问题

    本篇是学习了《趣学算法(第2版)》 第一章之后总结的。 上一篇讲到了等比数列求和问题,求(S_n = 1 + 2 + 2^2 + 2^3 + … + 2^{63}= ?…

    Python 2023年10月18日
    068
  • Python知识:实用程序模块基础——OS模块

    Python中的OS模块提供了与操作系统交互的功能。 OS属于Python的标准实用程序模块。该模块提供了一种使用操作系统相关功能的可移植方式。 _os_和 _os.path_模块…

    Python 2023年9月21日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球