djangoのi18nやってみた

色々djangoi18nチュートリアル見たけど何が必要なのか一貫してなかったからやってみた。

環境

設定とか

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が効いてないとき、

f:id:b1u3:20181103200132p:plain

f:id:b1u3:20181103200358p:plain

翻訳前の文字列がそのまま出る。 効いてる時、

f:id:b1u3:20181103200448p:plain

f:id:b1u3:20181103200543p:plain

こんな感じになる