Django 多言語機能 (i18n) の設定(日本語と英語のケース)

i18n_patterns を使用して、URL に言語コードを含めるようにします。

Djangoの構成は下記の通りです。

$ mkdir /example
$ cd /example
$ django-admin startproject mysite
$ cd mysite
$ python manage.py startapp myapp

Django の setting.py(/example/mysite/mysite/setting.py)に下記の設定を入れます。

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',
]

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)

from django.utils.translation import ugettext_lazy as _
LANGUAGES = [
    ('en', _('English')),
    ('ja', _('Japanese')),
]

USE_I18N = True

urls.py (/example/mysite/myapp/urls.py)に下記の設定を入れます。

from django.contrib import admin
from django.urls import include,path

from django.conf.urls.i18n import i18n_patterns

urlpatterns = i18n_patterns(
    path('admin/', admin.site.urls),
    path('myapp', include('myapp.urls')),
    prefix_default_language=False
)

プロジェクト mysite に localeディレクトリを作成

$ cd /example/mysite
$ mkdir myapp/locale

makemessages コマンドで日本語と英語の翻訳をファイルを作成します。

$ python manage.py makemessages -l ja
$ python manage.py makemessages -l en

下記ファイルが生成されます。

  • /example/mysite/mayapp/locale/ja/LC_MESSAGES/django.po
  • /example/mysite/mayapp/locale/en/LC_MESSAGES/django.po

poファイルの中身は下記のようになります。

myapp/model.py のclass Metaのカラムに「tel = models.CharField(_(‘tel’), max_length=15)」を指定しておくと、下記のように該当ファイル:行数、msgid、msgstrが自動生成されました。

#: myapp/models.py:43
msgid "tel"
msgstr ""

msgstrは自動生成された段階では空文字なので、ここに日本語と英語それぞれ表示したい内容を追記します。

poファイルの編集が終ったら、django.po ファイルをコンパイルして django.mo ファイルを作成します。moファイルはpoファイルと同じ階層に作成されます。

$ python manage.py compilemessages

templatesの中で、 i18n をloadして、htmlファイルに trans を指定することで多言語対応ができます。

{% load i18n %}
{% trans 'tel' %}

英語を表示したい場合は、URLのドメインの後ろに「/en/」を挿入してください。