🐶

Pythonの多言語対応【i18n】【スニペット有り】

2023/06/07に公開

はじめに

Python の多言語対応についての備忘録。ライブラリをいくつか比較検討したので、そのことについても記述する。

比較表

ライブラリ 更新頻度 使い勝手 備考
python-i18n ×
i18nice
gettext - × 標準ライブラリ

python-i18n

一番はじめに検討したライブラリ。使い勝手は良さそうだったが、メンテナンスはだいぶ前にやめてしまった様子。ただ、フォークしている人がおり、そちらでメンテされていたりするので、基本的な使い勝手としてはファンがいる。

i18nice

python-i18n をフォークしてたライブラリ。頻度が高いわけではないが、他のライブラリに比べると見た感じはメンテを最もやっている。使い勝手は python-i18n と同じ。

gettext

標準ライブラリ。コンパイルみたいなことが必要みたいなので、翻訳ファイルの更新が面倒。

i18nice のスニペット

ライブラリのインストール

基本的には yaml を使うので、以下のようにインストールする。

pip install i18nice[YAML]

使用方法

以下のようなフォルダ構成とします。

/
├─/i18n
│  ├─message.ja.yml
│  └─message.en.yml
└─main.py

yml ファイルにはそれぞれ以下のように記述する。「hello_name」にあるように、引数指定ができる。t 関数にて指定された引数を渡すと、置き換えられて出力される。

message.ja.yml
ja:
  hello: こんにちは
  heelo_name: "こんにちは %{name}"
message.en.yml
en:
  hello: Hello
  heelo_name: "Hello %{name}"
main.py
import i18n

i18n.load_path.append('./i18n') # 翻訳ファイルのパスを追加。実行フォルダから見た相対パスを指定

print(i18n.t('message.hello', local="ja")) # jaを指定 こんにちは
print(i18n.t('message.hello', local="en")) # enを指定 Hello
print(i18n.t('message.hello_name', locale='ja', name='John Doe')) # jaを指定 こんにちは John Doe
print(i18n.t('message.hello_name', locale='en', name='John Doe')) # enを指定 Hello John Doe

もちろん、初期化時に言語指定することもできる。

main.py
import i18n

i18n.load_path.append('./i18n')
i18n.set('locale', 'ja') # 初期化時に指定
print(i18n.t('message.hello')) # こんにちは

おわりに

i18nice が一番使い勝手が良さそうだったので、今後はこちらを使っていこうと思う。
python で多言語対応みたいなことが必要になるタイミングはそれほど無いと思うが、分かってると手札が増えていい。
こういう時、フロントエンドやっててよかったなと思う。

参考

Discussion