スポンサードリンク



こんにちは。sinyです。

この記事ではPyCon US 2020 Onlineで発表されたDjangoの言語翻訳に関する情報をベースにノウハウをまとめました。

セッション動画は英語ですがYotubeで公開されています。

 

※記載間違いなどありましたらご指摘いただけると幸いです。

Djangoにおける言語翻訳

Djangoでは翻訳フレームワークを使って簡単に翻訳機能を実装することができます。

翻訳機能の実装手順は以下の通りです。

 

  1. アプリケーション設定
  2. ルーティング設定
  3.  翻訳用の文字列を作る
  4. 言語ファイルをコンパイルする

 

この中で3番目の翻訳用の文字列を作成する部分が一番大変な部分です。
その理由は、アプリケーション内のすべての表示可能な文字列を翻訳対象としてマーキングする必要があるためです。

トークンまたは文字列という用語は、アプリケーションで翻訳されるテキストの文字列を指します。
この記事内で扱っている翻訳という用語は、ある言語から別の言語へ文字列のマッピングを意味しています。

まとめると以下の通りです。

i18n とl10nについて

ここで、i18n とl10nについて補足しておきます。

i18nは多言語化対応(Internationalization)で、l10nは地域にあわせて最適化(Localization)するというイメージで理解しておけばよいと思います。

ちなみに、M17Nというのがありますが、これは Mulitilingalizationでソフトウェアを複数の言語を同時に扱えるようにすることです。

例えば、Webブラウザーやエディターなどがその例で、複数の言語が混在したコンテンツも扱えるようにしたものです。

なお、Djangoの翻訳機能実装手順において、InternationalizationとLocalizationは以下のような関係になっています。

internationalization
  1. 翻訳のためのアプリケーション設定
  2. 翻訳のためのルーティング設定
  3. 翻訳用の文字列を作る
Localization

4.言語ファイルをコンパイルする

 

internationalizationはdjangoフレームワークがツールとして処理してくれる部分です。

Djangoの翻訳機能の実装手順

以下の4つの詳細手順について解説します。

    1. アプリケーション設定
    2. ルーティング設定
    3.  翻訳用の文字列を作る
    4. 言語ファイルをコンパイルする

    アプリケーションの設定

     

    ここではsettings.pyに各種必要な設定を行っていきます。

    MIDDLEWAREの設定

     

    settings.pyのMIDDLEWARE'django.middleware.locale.LocaleMiddleware'を追加します。
    この設定は必須ではありませんが、言語設定を自動で検出してくれるため非常に便利です。

     

    なお、LocaleMiddlewareは以下の順で言語設定をチェックします。

    LocaleMiddlewareの言語チェック順序
    1. URL language prefix
    2. Language cookie(LANGUAGE_COOKIE_NAME)
    3. Requestの中のlanguage http headerを参照する。
    4. 上記3つが見つからない場合language code(LANGUAGE_CODE)を参照。

    LocaleMiddlewareの順番は非常に重要なので以下の点に注意しましょう。

     
    • session middlewareの後にLocaleMiddlewareを設定する必要がある。
       →Localemiddelwaresessionを利用するため。

    • LocalemiddlewareCommon.middlewareの前に設定する必要がある。
      LocalemiddelwareURL prefixesを利用するため。

    LANGUAGE_CODEの設定

     

    次にsettings.pyのLANGUAGE_CODEを設定します。
    LANGUAGE_CODEではDjangoのデフォルト言語を設定します。

    ここでは以下の通り日本語に設定しておきます。

     

    翻訳とロケールの日付フォーマットの指定

     

    次に翻訳とロケールの日付フォーマットの指定を行います。
    通常であれば以下の通りTrueになっています。

     

    なお、翻訳機能を利用する必要がない場合は上記パラメータを双方ともFalseすると多少パフォーマンスの向上に寄与するとのことです。

    LANGUAGESの設定

     

    次にLANGUAGESパラメータの設定です。
    このパラメータを指定することで翻訳に使われる言語を限定することができます。
    以下は、英語と日本語だけに限定する場合の設定です。

     

    LOCALE_PATHSの設定

     

    次に言語ファイルのディレクトリパスの設定をLOCALE_PATHSで行います。
    このパラメータを設定しない場合、各アプリケーションのlocaleディレクトリを参照しにいきます。

    以下は、BASE_DIR(Djangoプロジェクト直下)にlocaleフォルダを定義しています。

     

    以上でsettings.py上の設定は完了です。

     

    ルーティング設定

    language prefixesは、ページをURLに直接ロードするために必要な言語を示すことができます。
    以下、具体例で説明します。

    一番上のURLは、ページのリソースパスに接頭辞として英語の言語コード(/en/)が付いていますが、これはページを英語でロードします。
    2つ目のURLは簡体字中国語をロードします。
    3つ目は言語prefixがないのでデフォルト言語(今回のケースでは日本語)がロードされます。

    prefix_default_language=Falseにすることでprefixが与えられない場合にデフォルトの言語設定が利用されるようになります。
    ルートのurls.pyに以下のような設定を追加します。

     

     

    翻訳用の文字列を作成する

    翻訳させたい文章は個別に指定(マーキング)する必要があります。
    マーキングはDjangoのテンプレートやmodel.py等で設定することができます。

    Djangoモデルでマーキングする場合

     

    モデル(models.py)上ではhelp_textやverbose_name等を対象にマーキングすることができます。

    モデルでマーキングするには以下のコードでgettext_lazyメソッドをインポートします。

    慣例で、インポートしたgettet_lazyにはエイリアスとしてアンダースコア「_」を使うようです。

     モデルのようなケースではgettext_lazyメソッドを使わないと正常に機能せずエラーになるようです。

     

    マーキングのやり方ですが、翻訳したい部分を_(****)のように指定します。

    以下は家計簿アプリモデル定義でのマーキング例です。

     

    ビュー等でマーキングする場合

     

    モデル以外でもview.py等でマーキングの設定ができますが、この場合はgettext_lazyの代わりにgettextメソッドを利用します。

    以下はビュー内でマーキングした場合のサンプルコードです。

     

    テンプレートでマーキングする場合

     

    テンプレートファイル(html)でマーキングする場合は、テンプレートタグtransを使います。

    htmlファイルの冒頭で{% load i18n %}を記載し、翻訳させたい箇所をtransタグで指定します。

    例えば以下のような感じでtransタグを指定します。

     

    メッセージファイルの作成

    翻訳対象へのマーキング設定が完了したら以下のコマンドを実行してメッセージファイルを作成します。

    python manage.py makemessages -l <ロケール名>

    日本語の翻訳ファイルを作成する場合は以下のコードを実行します。
    このコマンドを実行するとマーキング対象になっている情報(modes.py, views.py, テンプレートファイル等)をすべてチェックしてメッセージファイルを生成してくれます。

     

     言語コードとロケール名は異なる場合があるので注意が必要です。
    例えば、簡体字中国語を使用:言語コードは「zh-hans」ですが、ロケール名は「zh_Hans」です。

    コマンドを実行すると以下のディレクトリに.poファイルが生成されます。

    <プロジェクト>/locale/ja/LC_MESSAGES/django.po

    ちなみに、既にpoファイルが存在する場合は、新規で追加、修正したマーキング情報が反映されます。

    翻訳設定を行う

     

    先ほど生成された.poファイルを開いて、具体的な翻訳内容を定義していきます。

    今回生成された.poファイルは以下のようになります。

     

    msgstrの部分に翻訳対象の文字列を設定していきます。

    今回は英語を日本語に翻訳させる前提なので以下のように設定しました。

     

     

    言語ファイルをコンパイルする

     

    翻訳の設定が完了したら以下のコマンドを実行して言語ファイルをコンパイルします。

     

    コンパイルすると.poファイルを.moファイルにコンバートしてDjangoが使えるようにしてくれます。

    なお、言語ファイルは、他の静的ファイル(.html、css、js、pngなど)と同様に扱う必要があります。

    以上で翻訳の設定は完了です。

     

    URLによって言語を切り替える

     

    アクセスするURLを変えるだけで言語を切り替えることができます。
    今回のケースだと以下のように言語を切り替えることができます。

    ①Prefixを指定しない場合 →デフォルトの言語(日本語)で表示される。
     
     http://127.0.0.1:8000/kakeibo/kakeibo_list/

    ①明示的にPrefixを指定する場合

    http://127.0.0.1:8000/ja/kakeibo/kakeibo_list/

    http://127.0.0.1:8000/en/kakeibo/kakeibo_list/

    adminサイトに言語スイッチボタンを追加する

     

    以下のようにadminサイトの右上に言語切り替えボタンのアイコンを表示させます。

    まず、<project>/<app>/templatetags/i18n_switcher.pyファイルを新規作成して以下のコードを記載します。

     

    adminサイト上に言語切り替え用ボタンを表示させたいので、カスタマイズしたadminテンプレートファイルを用意してadminテンプレートを上書きします。

    具体的には、<project>/templates/admin/base_site.htmlを新規作成して以下のコードを記載します。

     

    ※settings.pyのTEMPALTESで'DIRS': [os.path.join(BASE_DIR, 'templates')]を設定している前提

    また以下のCSSファイルを用意しておきます。

    static/css/custom_admin.css

     

    static/images/配下に以下のような言語切り替え用のPNGファイルを用意しておきます。

     

    http://127.0.0.1:8000/adminにアクセスすると以下のように言語切り替えボタンが表示され、ボタンを押すと言語が切り替わるようになります。

     

    ボタンを押した際にエラーが発生する場合は、urls.pyで設定したprefix_default_languageの値をFalseに変更してみてください。

     

    言語切り替え用メニューの表示

     

    言語切り替えメニューの表示については以下のNaritoさんの記事をほぼそのまま活用させていただきました。

    まず、プロジェクト直下のurls.pyに以下の通り設定を追加します。

     

    一覧表示画面のテンプレートファイルに以下のコードを追記します。

     

    以上で設定完了です。

    一覧表示画面を更新すると以下のように画面右側に言語切り替え用のプルダウンメニューが表示されます。

    参考にしたサイト

     

     

     

    以上、「Djangoで言語翻訳機能を実装する方法」でした。

     

     

    おすすめの記事