Django3 多言語対応 URL言語切り替え

Django3 多言語対応 URL言語切り替え

DjangoプロジェクトとDjangoアプリケーションの作成

環境

Python 3.8.0
Django 3.1.6

Djangoのインストール

pip install django

Djangoプロジェクトの作成

django-admin startproject DjangoProject

下記のようにDjangoプロジェクトのファイルが作成される

DjangoProject
├── DjangoProject
│   ├── init.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

Djangoアプリケーションの作成

python manage.py startapp DjangoApp

下記のようにDjangoアプリケーションのファイルが作成される

DjangoProject
├── DjangoApp
│   ├── init.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── init.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── DjangoProject
│   ├── init.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

設定

settings.py

importの追加

import os
from django.utils.translation import gettext_lazy as _

MIDDLEWARE

'django.contrib.sessions.middleware.SessionMiddleware''django.middleware.common.CommonMiddleware'の間に‘django.middleware.locale.LocaleMiddleware’を記述する必要がある。
キャッシュ関連ミドルウェアを使う場合は、キャッシュの後に読み込ませる為にCommonMiddlewareの前に設定を記述する必要がある。

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

LANGUAGE_CODEに設定されている言語は、ユーザー言語がわからない場合に使用される言語なので、多言語を取り扱う’django.middleware.locale.LocaleMiddleware’が設定されていない場合にはLANGUAGE_CODEで設定されている言語が使用される。

TEMPLATES

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'DjangoApp' / 'templates'],  # ここにtemplateのディレクトリを設定
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

LANGUAGE_CODE

デフォルト言語の指定

LANGUAGE_CODE = 'ja'

LANGUAGES

言語指定配列の設定

LANGUAGES = [
    ('en', _('English')),
    ('ja', _('Japanese')),
]

LOCALE_PATHS

localeディレクトリの位置を指定。

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

翻訳ファイルディレクトリの作成

manage.pyのあるディレクトリにてlocaleディレクトリを作成

[DjangoProject]
     ├── [DjangoApp]
     │   ├── init.py
     │   ├── admin.py
     │   ├── apps.py
     │   ├── migrations
     │   │   └── init.py
     │   ├── models.py
     │   ├── tests.py
     │   └── views.py
     ├── manage.py
     ├──[locale]

index.htmlの作成

templatesディレクトリを作成し、templatesディレクトリ直下にindex.htmlを作成する

[DjangoProject]
     ├── [DjangoApp]
     │   ├── init.py
     │   ├── admin.py
     │   ├── apps.py
     │   ├── migrations
     │   │        └── init.py
     │   ├── models.py
     │   ├── templates
     │   │        └── index.html
     │   ├── tests.py
     │   └── views.py
     ├── manage.py
     ├──[locale]
{% load i18n %}
<html>
<head>
</head>
<body>
<p>{% trans 'これはぺんです。' %}</p>
</body>
</html>

views.pyの編集

from django.shortcuts import render
from django.http import HttpRequest, HttpResponse


# Create your views here.
def index(request: HttpRequest) -> HttpResponse:
    return render(request, 'index.html', {})

urls.pyの編集

from django.contrib import admin
from django.urls import path
from django.conf.urls.i18n import i18n_patterns 
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
]

urlpatterns += i18n_patterns(
        path('', views.index, name='index'),
)

翻訳ファイル作成

django-admin makemessages -l [作成言語] -e [翻訳対象ファイル拡張子]

.htmlのファイルを対象に翻訳ファイルを作成する場合には、Djangoプロジェクトのディレクトリにてあるディレクトリにて下記のコマンドを実行

日本語翻訳ファイルを作成

django-admin makemessages -l ja -e html

localeディレクトリの直下に下記のようにjaディレクトリとその中にLC_MESSAGESディレクトリ、そしてdjango.poのファイルが作成される。

     ├──[locale]
     │         ├── [ja]
     │         │      ├── [LC_MESSAGES]
     │         │                 ├── django.po

英語翻訳ファイルを作成

django-admin makemessages -l en -e html

localeディレクトリの直下に下記のようにenディレクトリとその中にLC_MESSAGESディレクトリ、そしてdjango.poのファイルが作成される。

     ├──[locale]
     │         ├── [en]
     │         │      ├── [LC_MESSAGES]
     │         │                 ├── django.po

翻訳ファイルの編集

locale/en/LC_MESSAGES/django.poの編集

django.poファイルにindex.htmlの翻訳対象であるmsgid”これはぺんです。”のmsgstrに”this is a pen.”と書き込む。

#: DjangoApp/templates/index.html:6
msgid "これはぺんです。"
msgstr "this is a pen."

翻訳ファイルのコンパイル

django-admin.py compilemessages

各言語のLC_MESSAGESディレクトリ内にdjango.moファイルが作成される。

     ├──[locale]
     │         ├── [ja]
     │         │      ├── [LC_MESSAGES]
     │         │                 ├── django.mo
     │         │                 ├── django.po
     │         ├── [en]
     │         │      ├── [LC_MESSAGES]
     │         │                 ├── django.mo
     │         │                 ├── django.po

動作確認

Djangoプロジェクトの実行

python manage.py runserver 0:8000

WEBブラウザからのアクセス(英語)

http://localhost:8000/en/

WEBブラウザからのアクセス(日本語)

http://localhost:8000/ja/

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です