Django 多语言支持

一、开启多语言支持

1. 配置中间件

在我使用的 Django 1.11.6 中,默认没有加入 i18n 中间件,所以需要我们手动加入相关中间件。

你需要将 django.middleware.locale.LocaleMiddleware 加入 MIDDLEWARE_CLASSES 中。由于 locale 依赖 session,应将它放在 SessionMiddleware 之后;同时,CommonMiddleware 需要在语言激活后处理对应的 URL,因此 LocaleMiddleware 应放在 CommonMiddleware 之前。

LocaleMiddleware 会根据请求中的语言信息激活当前语言。它必须放在 SessionMiddleware 之后、CommonMiddleware 之前:前者用于读取会话中的语言偏好, 后者需要在语言已经激活后处理国际化 URL。

1
2
3
4
5
6
7
8
9
MIDDLEWARE_CLASSES = (
    ...
   'django.contrib.sessions.middleware.SessionMiddleware',
   ...
   'django.middleware.locale.LocaleMiddleware',
   ...
   'django.middleware.common.CommonMiddleware',
   ...
)

2. 确认 I18N 相关配置为 True

settings.py 的底部,你可以看到下面这些配置,请确保相关开关的值为 True

其中,USE_I18N 开启 Django 的翻译机制,USE_L10N 开启本地化格式, USE_TZ 启用时区支持。LANGUAGE_CODETIME_ZONE 是默认语言与默认时区, 可以根据项目实际部署地区进行调整。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

3. 设置 locale 路径

settings.py 中加入如下代码:

1
2
3
LOCALE_PATHS = (
    'locale',
)

这表示翻译文件统一放在项目或应用的 locale 目录中。目录不存在时可以手动创建, 后续执行 makemessages 会在其中生成对应语言的 LC_MESSAGES 文件。

二、在 views 中引入 ugettext

在 views.py 中加入如下代码

1
from django.utils.translation import ugettext as _

将所有需要翻译的文字传入 _() 函数。

例如:

1
menu_text = _("Menu")

带变量的文字也可以使用命名占位符进行处理。

例如:

1
output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}

三、在模板中引入 i18n

如果希望在模板中使用多语言,可以按如下方式操作。

首先,在需要启用多语言的模板顶部加入:

然后在对应位置使用 trans 标签获取翻译文本,例如:

1
{% trans "Menu" %}

四、生成多语言模板文件

在命令行中进入应用目录,执行如下命令:

1
django-admin makemessages -l zh-CN

执行命令后,Django 会扫描 Python、模板等文件中的待翻译字符串, 并在 locale/zh-CN/LC_MESSAGES/ 下生成 django.po.po 是可读的翻译源文件, 其中的 msgid 是原文,msgstr 用于填写译文。

打开 django.po,即可看到需要翻译的内容。

中文(简体)的 language code 为 zh-hans

五、使用 Poedit 编辑多语言文件

也可以使用 Poedit 打开 .po 文件进行编辑。

点击要翻译的条目,在下方的编辑框中进行输入。 在编辑框的右侧,还有机器翻译的内容,可以供我们参考。

Poedit 保存完成后通常会自动生成 .mo 编译文件;如果没有生成,可以在命令行中执行:

1
django-admin compilemessages

这样即可生成对应的编译文件。

使用 Hugo 构建
主题 StackJimmy 设计