LoginSignup
26
19

More than 5 years have passed since last update.

djangoで国際化

Posted at

多くの国や地域で利用されるサービスを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/
にアクセスすると下図のようなページが表示されます。

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

この時点では、ページタイトルもページ本文も日本語です。
これを一旦英語に自動変換するように修正して行きましょう。

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」を追加。
追加する位置も下記の通りにしないと行けないので気をつけて下さい。

settings.py
# 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つの文字列の翻訳文字を入れてあげます。

django.po
#: 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を設置します。

index.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>
………

form側で設定しているurlを登録

my_site/views/urls.py
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

my_siteリポジトリのブランチi18に今回実装したソースコードをアップしておきました。
興味がありましたら、是非cloneしてみて下さい。

26
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
19