django内置了国际化与本地化模块i18n和l10n
要完成多语言支持只要使用这两个模块就可以了
首先要在settings
中进行设置
from django.utils.translation import gettext_lazy as _
# 开启i18n和l10n功能
USE_I18N = True
USE_L10N = True
# 设置默认语言
LANGUAGE_CODE = 'zh-hans'
# 设置需要支持的语言种类
LANGUAGES = (
('zh-hans', _('中文简体')),
('en', _('English')),
('ja', _('日本語'))
)
# 设置翻译文件的存放路径
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
MIDDLEWARE = [
# 中间件列表里加入LocaleMiddleware
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
]
这里使用了gettext_lazy
方法,它的作用是标记需要翻译的字符串,在应用运行时根据当前语言替换成翻译后的字符串。
django翻译模块是底层依赖于GNU.gettext
项目的,gettext
在linuX中是集成的,而windows平台则需要自己安装。
然后在url中加入i18n模块的路由设置
from django.conf.urls.i18n import i18n_patterns
urlpatterns = [
path('i18n/', include('django.conf.urls.i18n')),
]
urlpatterns += i18n_patterns(
# 原本 url
)
这样一来原本的url就由https://xlivevil.com/index/
变成了https://xlivevil.com/zh-hans/index/
。只要改变中间的/zh-hans/
就能进入相应的语言页面。
接下来就在页面里加入可视化的语言切换入口,在模板base.html
中加一个表单,向i18n/setlang
发送POST
请求
<form name="langform" id="langform" method='post'>{% csrf_token %}
<select id="language" name="language" onchange="selectlang(this)">
<option value="1">{% trans "Languages" %}</option>
{% for lang in LANGUAGES %}
<option value="{{ lang.0 }}" > {{ lang.1 }}</option>
{% endfor %}
</select>
</form>
<script>
function selectlang(obj) {
str="/i18n/setlang/";
langform = document.getElementById('langform');
langform.method = "POST";
langform.action = str;
langform.submit();
}
</script>
到此为止,我们网站的多语言系统的框架就建好了。各个页面都有了不语言的版本和切换选项,但是我们还没有对页面里的字符进行翻译。
首先,需要翻译的字符要标记出来。
在python
文件中使用一般使用django.utils.translation
中的gettext_lazy
from django.utils.translation import gettext_lazy as _
_(`原本的字符串`)
而django模板中则使用trans
和blocktrans
标签
{# 先导入i18n模块 #}
{% load i18n %}
{% trans"文本" %}
{% blocktrans %}
文本块
{% endblocktrans %}
需要翻译的文本被标记出来后
运行django命令python manage.py makemessages
,django就会调用gettext
收集所有需翻译文本在设定的LOCALE_PATHS
中生成各个语言对应的LC_MESSAGES,进入.po
文件,就能看到所有需翻译的文本
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-09 12:47+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"
#: .\users\templates\account\email.html:10
msgid "E-mail Addresses"
msgstr "电子邮箱地址"
接下来就是翻译的工作了,在msgstr中填入msgid对应的翻译文本。
等翻译完成后,再执行python manage.py compliemessages
生成.mo
文件。就大功告成了,重新启动就能看到多语言的效果了
暂无评论