Navigation

Related Articles

Back to Latest Articles

Djangoの国際化(i18n)で多言語化(前半)


press
Djangoの国際化(i18n)で多言語化(前半)

Djangoの国際化(i18n)で多言語化(前半)

Djangoの国際化(i18n)で日本語と英語の多言語化サイトを構築します。

コードはGitHubリポジトリにあげています。

開発環境

Python 3.8.0
Django 3.0.7

.
├── app
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
├── multilingualization
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── templates
    └── index.html

ソースコード

multilingualization/settings.py

...
import os

from django.utils.translation import ugettext_lazy as _
...

...
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',  # ここを追加
    'django.middleware.common.CommonMiddleware',
    ...
]
...

...
LANGUAGE_CODE = 'ja'

USE_I18N = True
...

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

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

from django.utils.translation import ugettext_lazy as _
モジュールをインポート(ugettext_lazy)は_と省略名でインポートするのが慣例

django.middleware.locale.LocaleMiddleware
を追加(注:django.middleware.common.CommonMiddlewareの上に追記してください)

LANGUAGE_CODE = 'ja'
言語を日本語に設定

USE_I18N = True
デフォルトはTrueになっています

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

使用する言語を追加

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

翻訳ファイルを保存するディレクトリを指定

multilingualization/urls.py

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

from app.views import index

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

prefix_default_language=False
URLにprefixがない場合はsettings.pyで指定されたデフォルトの言語(LANGUAGE_CODE = ‘ja’)になります

app/views.py

from django.shortcuts import render
from django.utils.translation import gettext as _
from django.utils.translation import get_language


def index(request):
    language_code = get_language()
    display_text = _('国際化')
    context = {'display_text': display_text, 'language_code': language_code}

    return render(request, 'index.html', context)

from django.utils.translation import gettext as _
インポートしたモジュール(gettext)は_と省略名にするのが慣例

from django.utils.translation import get_language
使用している言語を取得するためのモジュールをインポート

language_code = get_language()
使用している言語を取得

display_text = _('国際化')
翻訳したい文章を_(”)の中に入れます

context = {'display_text': display_text, 'language_code': language_code}
return render(request, 'index.html', context)
値をcontextにまとめてテンプレートに値を渡す

templates/index.html

{% load i18n %}
<!DOCTYPE html>
<html lang="{{ language_code }}">
<head>
    <meta charset="UTF-8">
    <title>{{ display_text }}</title>
</head>
<body>
<p>{% trans 'ハロー・ワールド' %}</p>
<p>{{ display_text }}</p>
</body>
</html>

{% load i18n %}
国際化するテンプレートファイルの上部に記載

<html lang="{{ language_code }}">
views.pyから受け取ったlang属性を設定

{{ display_text }}
views.pyで代入された文字(「国際化」)

{% trans 'ハロー・ワールド' %}
翻訳させたい文字はtransタグで囲む

後半から翻訳ファイルを編集していきます。


当ブログは群馬県でPython / Djangoを中心にウェブアプリケーションを開発している株式会社ファントムが運営しています。

株式会社ファントムへのお問い合わせ




Show Comments (0)

Comments

Related Articles

Django

That port is already in use.が表示された時の対処法

Djangoでrunserverコマンドを使って開発用サーバーを起動した時にError: That port is already in use.が表示された時の対処法です。 Error: That port is al […]

Posted on by press
Django

ReportLabで既存のPDFに文字を上書きする

テンプレート用の既存PDFの上から文字を上書きしてダウンロードする方法です。 attachmentをつけるとリンクを押したら即ダウンロードが始まります。

Posted on by press