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>