django的多语言支持

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模板中则使用transblocktrans标签

{# 先导入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文件。就大功告成了,重新启动就能看到多语言的效果了


发表评论


暂无评论

Top