用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/,会显示如下图所示的页面。

スクリーンショット 2016-04-08 14.50.54.png

目前,页面标题和页面正文都是日语。
让我们首先将其自动转换为英语。

安装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')),
]
スクリーンショット 2016-04-11 10.40.19.png

关于翻译功能的说明

首先,翻译的流程如下:

翻訳したい言語のメッセージファイルを作成
↓
メッセージファイル内のメッセージに翻訳内容を記入
↓
メッセージファイルをコンパイル
↓
翻訳テンプレートタグを設定して任意で設定した言語に文言を翻訳
    • 翻訳したい言語のメッセージファイルを作成

 

    • makemessagesコマンドをつかってdjango.poファイルを作成します。

 

    • メッセージファイル内のメッセージに翻訳内容を記入

 

    • django.poファイル内の翻訳文言一覧を翻訳する。

 

    • メッセージファイルをコンパイル

 

    • compilemessagesコマンドでコンパイル。django.moファイルを作成

 

    • 翻訳テンプレートタグを設定して任意で設定した言語に文言を翻訳。

 

    • 事前にgithubのテンプレートには仕込んでいたのですが、テンプレート側に仕込んである

 

    • {% trans %}テンプレートタグに翻訳文言を指定するとその文言をdjango側で自動的に翻訳してくれます。

 

    • また、上記でindex.htmlに設定したformで自分が翻訳させたい言語の情報をdjango側でsessionに設定する事が出来ます。

 

    ただ、翻訳ファイルを作成しないと翻訳は行われないので、翻訳させたい言語がある場合makemessagesコマンドで再度作成してみて下さい。

GitHub – 中文 – Git库

我已经将本次实现的源代码上传到名为i18的my_site存储库的分支中。如果你有兴趣,请务必克隆下来查看。

bannerAds