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

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

文章目录

一、国际化项目介绍

图片.png

图片.png

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

二、实现步骤

2.1 为翻译字符串添加钩子

1) py文件

将需要翻译的字符串统一使用gettext_lazygettext包裹

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. 在项目根目录下生成locale目录,用于保存翻译消息文件(.po和.mo格式的)
  2. 在终端输入

( 大坑插入

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

django-admin makemessages -l zh_Hans -l en
  • 生成对应文件图片.png
  1. 我们需要在对应的文件中,给这些需要翻译的键添加值 ( msgid (message id)是键,msstr(message str)是值。
  • en 文件

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

图片.png

图片.png

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

图片.png

三、配置settings文件

  1. 添加路径映射
  path('i18n/', include('django.conf.urls.i18n')),
  1. settings添加国家化的配置
# 默认语言
LANGUAGE_CODE = 'en-us'
# 设置I18n和L10N为True
USE_I18N = True
USE_L10N = True
from 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'),
)
  • 效果

可以看到中文都翻译成了自己翻译的英文

图片.png

  1. 配置本地化中间件

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

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) 通过表单修改语言版本

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

{#  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>
  • 我还想美化他的样式和django文档一样

图片.png

  • 实现代码如下(使用的样式是tailwind)
{#  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>
  • 效果72.gif

2)通过对应链接修改

其实django官方文档的国家化项目中也是这么干的

图片.png

这里需要添加路由urli18n_patterns

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

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

小结

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

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

  • Django如何切换语言?

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

图片.png

🤞到这里,如果还有什么疑问🤞
    🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
      🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳



相关文章
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
162 45
|
23天前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
|
2月前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
80 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
1月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
55 2
|
3月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
140 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
3月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
119 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
3月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
105 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
3月前
|
Linux Python
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
解决django项目报错很离谱的报错之RuntimeError: populate() isn't reentrant
|
3月前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
66 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
4月前
|
C++ Python
Django视图函数VS类视图:如何选择最适合你的开发方式?
【8月更文挑战第31天】本文对比了Django中的函数视图和类视图。函数视图直接处理HTTP请求和响应,灵活且易于维护,适用于简单业务逻辑;类视图基于Python类,提供更丰富的功能和更高的灵活性,适合处理复杂业务逻辑。选择哪种视图取决于具体需求,合理使用两者可帮助你构建高效且易维护的Django应用。
82 0