Django支持多语言开发—i18n

Django 国际化简介

国际化 -- Internationalization,i 和 n 之间有 18 个字母,简称 I18N
本地化 -- localization, l 和 n 之间有 10 个字母,简称 L10N

国际化意味着 Web 产品有适用于任何地方的潜力,针对程序开发人员本地化则是指使一个国际化的程序为了在某个特定地区使用而进行实际翻译的过程,针对翻译人员而言。

Django 的开发和维护者对 Django 框架本身进行了完全国际化,我们可以在 ./Python2.5/site-packages/django/conf/locale/ 找到相关的语言文件。Django 国际化的本质就是开发者对需要翻译的字符串进行标记,并对字符串进行相应的翻译。当用户访问该 Web 时,Django 内部框架根据用户使用偏好进行 Web 呈现。Django 国际化使用的翻译模块是使用 Python 自带的 gettext标准模块。通过一个到 GNU gettext 消息目录库的接口,这个模块为 Python 程序提供了国际化 (I18N) 和本地化 (L10N)。

安装配置gettext

window下载两个zip文件
网站链接:https://download.gnome.org/binaries/win32/dependencies/
gettext-runtime-0.17.zip:https://iso.mirrors.ustc.edu.cn/gnome/binaries/win32/dependencies/gettext-runtime-0.17.zip
gettext-tools-0.17.zip https://iso.mirrors.ustc.edu.cn/gnome/binaries/win32/dependencies/gettext-tools-0.17.zip

下载完这两个压缩文件后,将其解压到同一个文件夹中(可能会存在文件冲突,合并即可),博主安装目录
在这里插入图片描述
添加到环境变量中控制面板>系统>高级>环境变量,在系统变量列表中,点击path,点击新建,把D:\gettext\bin添加进去。
cmd中输入gettext --version ,回车
在这里插入图片描述

一个小的案例

搭建django项目和创建app就不细讲了,我们直接如何实现多语言开始

创建locale目录

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

settings中的配置

首先配置中间件,添加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'),)

设置url

在项目中的路由配置urls.py中设置i18n多语言路由。

from django.contrib import admin

from django.urls import path, re_path, include

urlpatterns = [
    path('i18n/', include('django.conf.urls.i18n')),
    path('language/', views.index),  #这里创建一个language app
]

注:i18n是国际化(Internationalization)的缩写。i 和 n 之间有 18 个字母,简称 i18n,。l10n是本地化(localization)的缩写。l 和 n 之间有 10 个字母,简称 l10n。

视图和模板

language/views

from django.shortcuts import render
from django.utils.translation import gettext_lazy as _


def index(request):
    context = {
    
    'msg': _("good info")}
    return render(request, 'language/index.html', context)

html

{% load i18n %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<header><h1>{% translate 'this is a title' %}</h1></header>
<div style="flex: 1; align-content:center;">
    <form action="{% url 'set_language' %}" method="post"
          style="margin-block-end: 0em;">{% csrf_token %}
        <input name="next" type="hidden" value="{
     
     { redirect_to }}">
        <select name="language">
            {% 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 }} ({
   
   { language.code }})
                </option>
            {% endfor %}
        </select>

        <input type="submit"
               value={% translate "Switch" %} style="font-size:12;height:20px">
    </form>
</div>
<nav>
    <ul>
        <li>{% translate 'home' %}</li>
        <li>{% translate 'detail' %}</li>
        <li>{% translate 'about' %}</li>
        <li>{% translate 'more' %}</li>
    </ul>
</nav>
<div>
    {
   
   { msg }}
</div>
</body>
</html>

生成po、mo翻译文件

这里需要执行两条命令

# 生成中文的po文件
python manage.py makemessages -l zh_HANS    
# 生成英文的po文件
python manage.py makemessages -l en
# 翻译完成后 生成mo文件
python manage.py compilemessages

在这里插入图片描述
在这里插入图片描述

总结

以上就是一个小的案例,更多关于国际化和本地化请查看官网,https://docs.djangoproject.com/en/3.1/topics/i18n/

猜你喜欢

转载自blog.csdn.net/qq_36581961/article/details/112737766