用Django进行国际化开发
如果在许多国家和地区使用Django来实施服务,我认为会希望有一个系统,可以根据地区的语言进行自动翻译。因为Django有一个方便的翻译功能,所以我打算尝试使用该功能。
环境
-
- mac os x 10.9.5
-
- python 2.7.11
-
- django 1.9
-
- mysql 5.6.19
- pip 1.5.6
克隆Django环境
我们将使用在这里准备的Django的最简单配置的网站环境。
从https://github.com/yu-sa/my_site上克隆Django。
# git clone https://github.com/yu-sa/my_site.git
# cd my_site
構建動作環境
# pip install virtualenvwrapper
# mkvirtualenv --python=/path/to/python/2.7.11/bin/python i18n
# pip install django==1.9
# pip install mysql-python
# mysql -u root
> CREATE DATABASE my_site;
> exit
# python manage.py migrate
执行ranserver
# python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
April 08, 2016 - 17:46:13
Django version 1.9, using settings 'my_site.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
访问 http://127.0.0.1:8000/views/,会显示如下图所示的页面。

目前,页面标题和页面正文都是日语。
让我们首先将其自动转换为英语。
安装django-admin-tools
使用django-admin-tools来创建翻译列表,需先安装。
pip install django-admin-tools
翻译支持
在指定的目录下创建一个locale文件夹。
my_site
└─my_site
└─locale
请将local文件夹的路径设置到settings中。
在MIDDLEWARE_CLASSES中添加”django.middleware.locale.LocaleMiddleware”。
请确保将其添加到正确的位置,如下所示,请小心操作。
# locale
LOCALE_PATHS = (
os.path.join(FILE_DIR, 'locale'),
)
…………
MIDDLEWARE_CLASSES = [
………,
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
………,
]
创建翻译所需的消息文件(django.po)
创建指定语言的翻译消息文件,使用-l选项。
en代表英语。对于日语,使用ja。
# django-admin.py makemessages -l en
processing locale en
在django.po文件中,包含了当前页面上显示的”TOP页面”和”Hello World”的文字。我将为这两个字符串提供翻译文字。
#: my_site/views/index.py:13
msgid "TOPページ"
msgstr "Top Page"
#: my_site/views/index.py:14
msgid "ハローワールド"
msgstr "Hello world"
接下来,我们将编译此消息文件并创建django.mo。
# django-admin.py compilemessages
可以在HTML的元素中添加一个表单,让用户可以选择希望显示的语言。
………
<span>
<form action="{% url 'set_language' %}" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}" {% if request.LANGUAGE_CODE == language.code %}selected{% endif%}>{{ language.name_local }} ({{ language.code }})</option>
{% endfor %}
</select>
<input type="submit" value="Go" />
</form>
</span>
………
注册在表单一侧设置的URL。
from django.conf.urls import url, include
from .index import IndexView
urlpatterns = [
url(r'^$', IndexView.as_view(), name='api-index'),
url(r'^i18n/', include('django.conf.urls.i18n')),
]

关于翻译功能的说明
首先,翻译的流程如下:
翻訳したい言語のメッセージファイルを作成
↓
メッセージファイル内のメッセージに翻訳内容を記入
↓
メッセージファイルをコンパイル
↓
翻訳テンプレートタグを設定して任意で設定した言語に文言を翻訳
-
- 翻訳したい言語のメッセージファイルを作成
-
- makemessagesコマンドをつかってdjango.poファイルを作成します。
-
- メッセージファイル内のメッセージに翻訳内容を記入
-
- django.poファイル内の翻訳文言一覧を翻訳する。
-
- メッセージファイルをコンパイル
-
- compilemessagesコマンドでコンパイル。django.moファイルを作成
-
- 翻訳テンプレートタグを設定して任意で設定した言語に文言を翻訳。
-
- 事前にgithubのテンプレートには仕込んでいたのですが、テンプレート側に仕込んである
-
- {% trans %}テンプレートタグに翻訳文言を指定するとその文言をdjango側で自動的に翻訳してくれます。
-
- また、上記でindex.htmlに設定したformで自分が翻訳させたい言語の情報をdjango側でsessionに設定する事が出来ます。
- ただ、翻訳ファイルを作成しないと翻訳は行われないので、翻訳させたい言語がある場合makemessagesコマンドで再度作成してみて下さい。
GitHub – 中文 – Git库
我已经将本次实现的源代码上传到名为i18的my_site存储库的分支中。如果你有兴趣,请务必克隆下来查看。