こんにちは!
AXLBIT株式会社の@yangです。
今回は、Django 3.0以降で多言語対応開発する方法についてお話しします。
多言語対応は、ユーザーが異なる言語でコンテンツを表示できるようにする重要な要素です。この記事では、Djangoの多言語対応を実現する方法を説明いたします。
言語設定の有効化
デフォルトの言語と利用できる言語のリストを定義するために、まずsettings.pyファイル内で以下例のように言語設定を有効にします。
from django.utils.translation import gettext_lazy as _
LANGUAGE_CODE = 'ja' # デフォルトの言語設定
LANGUAGES = [
('ja', _('Japanese')),
('en', _('English')),
# 他の言語を追加
]
多言語の設定を完了した後、次にコード内で多言語対応したい箇所で翻訳のコードを書き込みます。
対応する箇所のファイルタイプによって、コードの書き方は少々違いがあります。
テンプレートの多言語対応
テンプレート内のテキストを多言語対応する必要がある場合、つまりHTMLファイルで多言語対応する場合、{% trans %} テンプレートタグを使用してテキストを翻訳します。
{% load i18n %}
<h1>{% trans "Multilingual Sample" %}</h1>
<p>{% trans "This is a sample code for multilingual support." %}</p>
Pythonコードの多言語対応
多言語対応は、Pythonコード内でも活用できます、以下の例のようにdjango.utils.translationには翻訳用の関数を用意しております。
# models.py
from django.db import models
from django.utils.translation import ugettext
from django.utils.translation import ugettext_lazy as _
SAMPLE_DATA = [
{'key': 'sample', 'text': ugettext('Sample')},
]
class Sample(models.Model):
sample = models.CharField(_('Sample'), max_length=50)
ここでugettextとugettext_lazyの二つの関数を利用しました、両者の違いは以下です。
ugettext_lazy
- テンプレートやモデルのフィールドといった遅延評価が必要なコンテキストで使用されます。
- 文字列を翻訳せず、文字列そのものをラップし、テンプレートがレンダリングされる際やモデルのデータがクエリされる際に翻訳を遅延させます。これにより、適切な言語が選択され、ユーザーに表示されるまで待つことができます。
ugettext
- 翻訳を即座に評価する関数です。文字列を翻訳し、その結果を返します。
- 主にPythonコード内で使用され、静的なテキストやメッセージを翻訳するのに適しています。
JavaScriptコードの多言語対応
多言語対応は、JavaScriptコード内でも活用できます。
var text = gettext('Sample Text');
翻訳メッセージの設定
アプリケーション内のテキストを翻訳可能にするために、翻訳メッセージを設定します。以下コマンドを実行します。
python manage.py makemessages -l ja
python manage.py makemessages -l en
これで/local/ja/と/local/en/がそれぞれ作成されます。
しかしこれだけでJSファイルの中の翻訳が追加されません、そのために以下コマンドを実行します。
django-admin.py makemessages -d djangojs -l ja
django-admin.py makemessages -d djangojs -l en
これでpublicの下に/local/ja/と/local/en/がそれぞれ作成されます。
以上コマンドで作成した.poファイルを編集し、翻訳後の文言を入れた後、以下コマンドを実行します。
python manage.py compilemessages
これで.poファイルから.moファイルが作成されて、翻訳メッセージとして利用できます。
言語切り替えの実装
ユーザーが言語を切り替えられるように、テンプレートに言語切り替え機能を実装します。
<!-- templates/base.html -->
{% load i18n %}
<div id="language-switcher">
<a href="?language=ja" class="{% if request.LANGUAGE_CODE == 'ja' %}active{% endif %}">日本語</a>
<a href="?language=en" class="{% if request.LANGUAGE_CODE == 'en' %}active{% endif %}">English</a>
<!-- 他の言語を追加 -->
</div>
ここでactiveクラスに対して、CSSなどを編集すると、スタイル違いやクリックできないようにすることなどで、現行の言語と表記できます。
まとめ
Djangoを使用して多言語対応のウェブアプリケーションを構築する方法を詳しく説明しました。多言語対応は、ユーザーエクスペリエンスを向上させるために不可欠な要素です。この記事がお役に立てれば幸いです。