多くの国や地域で利用されるサービスをDjangoで実装した場合、その地域の言語を指定する事で自動的に翻訳されるシステムが欲しくなると思います。djangoには便利な翻訳機能が存在するのでその機能を使ってみようと思います。
環境
- mac os x 10.9.5
- python 2.7.11
- django 1.9
- mysql 5.6.19
- pip 1.5.6
Django環境をclone
こちらで準備した
djangoでの最小構成のwebサイト環境を利用します。
https://github.com/yu-sa/my_site
からDjangoをcloneしてきます。
# 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-toolesをインストール
django-admin-toolesを利用して翻訳リストを作成するのでinstall
pip install django-admin-tools
翻訳対応
指定の階層にlocaleフォルダを作成
my_site
└─my_site
└─locale
settingsにlocalフォルダのpathを設定
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はEnglishです。日本語の場合ja。
# django-admin.py makemessages -l en
processing locale en
django.poの中には現在ページで表示されている「TOPページ」と「ハローワールド」の文字があります。
この2つの文字列の翻訳文字を入れてあげます。
#: 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内のbodyに自分が何の言語を表示させたいかを選択できる
formを設置します。
………
<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>
………
form側で設定している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
my_siteリポジトリのブランチi18に今回実装したソースコードをアップしておきました。
興味がありましたら、是非cloneしてみて下さい。