Django 多语言支持

一、开启多语言支持

1. 配置中间件

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

你需要将’django.middleware.locale.LocaleMiddleware’,加入 middleware_classes 中,同时,由于 locale 依赖于 session ,将其放在 SessionMiddleware后,同时由于 CommonMiddleware 需要一个语言来激活对应的 URL 显示,所以你需要将 django.middleware.locale.LocaleMiddleware 放在 CommonMiddleware 之前,就像下面这样。

middleware

middleware

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

settings

settings

 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 中加入如下的代码

path

path

1
2
3
LOCALE_PATHS = (
    'locale',
)

这表明我们的 locale 文件默认会放在 app 目录中的 locale 目录下

二、在 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}

三、在模板中引入 uggettext

如果你希望在模板中引入多语言,可以通过如下方法来使用

首先,需要在要引入多语言页面的顶部加入 {% load i18n %}

在对应的位置使用 trans 方法来获取文字,比如

1
{% trans "Menu" %}

四、生成多语言模板文件

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

1
django-admin makemessages -l zh-CN

command

command

这样就会默认在当前应用的 locale 目录下,为我们生成对应的配置文件

file

file

我们打开 django.po ,就能看到其中需要翻译的内容了。

中文的 language code 为 zh-hans

五、使用 PoEdit 来编辑多语言文件

我们也可以使用 Poedit 来打开我们的 .po 文件,然后进行编辑

img

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

PoEdito 在编辑完成,保存后,会自动生成 .mo 编译文件,如果没有生成,你可以在命令行中生成。

1
django-admin compilemessages

这样,就可以生成对应的编译文件了。