2020/06/25

FastAPIベースのアプリを多言語化対応しました

pythonfastapi

概要

FastAPIベースのWebアプリ(Rest API)をpython-i18nを使って多言語化しました。

実装内容

install

% poetry add python-i18n

config

  • main.py
import i18n

i18n.load_path.append("path/to/locales_dir")
i18n.set("file_format", "json")
i18n.set("locale", "ja")
i18n.set("fallback", "ja")
i18n.set("skip_locale_root_data", True)

リソースの定義

  • locales ディレクトリを作って、その中に日本語と英語の定義ファイルを作成します。
    • locales/message.ja.json
    • locales/message.en.json
  • このように定義すると "message" という namespace でjsonファイル内に定義されたものが呼び出せるようになります。
  • "skip_locale_root_data"True に設定しているので、messsage.en.json の top の property が “en” でなくてもよくなります。

message.ja.json

{
  "complete": "完了しました"
}

message.en.json

{
  "complete": "completed successfully"
}

api側での利用

  • リソースファイルに定義されたものを呼び出す際は、i18n.t("{namespace}.{key}") で呼び出すことができます。
    • 先ほど、"message" という namespace の中に "complete" という key でメッセージを登録していたので、 "message.complete" で呼び出すことができます。
import i18n
from fastapi import APIRouter, Header

router = APIRouter()


@router.get("/hoge")
def hoge(accept_language: str = Header("ja")):
    # 実際には fastapi の Depends を使って、正しいロケールを取得するようにします
    message = i18n.t("message.complete", locale=accept_language) # "完了しました" or "completed successfully"
    return {"message": message}

以上です。