djangoのi18nやってみた
色々djangoのi18nチュートリアル見たけど何が必要なのか一貫してなかったからやってみた。
環境
設定とか
l10ni18n ├── l10ni18n │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py └── testapp ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ ├── __init__.py ├── models.py ├── templates │ └── testapp │ └── base.html ├── tests.py ├── urls.py └── views.py
こんな感じのディレクトリ構成になっている。manage.pyがあることからl10ni18nがプロジェクトディレクトリであることがわかる。
base.htmlとviews.py
<html> <head> <title>I10N I18N</title> </head> <body> {% get_current_language as lang %} <p>{{ lang }}</p> <p>{% trans msg %}</p> </body> </html>
from django.shortcuts import render from django.utils.translation import gettext as _ def my_view(req): msg = _('Test') return render(req, 'testapp/base.html',{'msg':msg})
views.pyではgettextで翻訳文字をマークしてる。
で、このあと、testapp内に空のディレクトリを作る。
% mkdir testapp/locale % ./manage.py makemessages -l en % ./manage.py makemessages -l ja
これで、.poがlocaleフォルダ内にできる。 .poファイルを編集して、翻訳後の文字を設定する。 その後、コンパイルする
% ./manage.py compilemessages
すると.moが.poと同じディレクトリ内にできる。
settings.pyには、LocaleMiddlewareを追加。
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ... from django.utils.translation import gettext_lazy as _ LANGUAGES = ( ('en', _('English')), ('ja', _('Japanese')), )
それとLANGUAGESも追加する。これ以外だったら、LANGUAGE_CODEのものが返されるらしい。これで試して見た。 まず、i18nが効いてないとき、
翻訳前の文字列がそのまま出る。 効いてる時、
こんな感じになる