【PySide】ソフト文字列をQTranslatorで翻訳・多言語化する手順を解説!

アプリ・ソフトをPySideで開発する時。

  • グローバルなソフトを作りたい、
  • 日本語以外の多言語に翻訳したい、
  • 最低限 英語だけにも対応したい

そういう時はQTranslatorを使います。
ただその手順が思いのほかに難しかったです。

そこでここでは 英語 => 日本語 のように、
PySideソフトを多言語化する手順を解説します。

※ 開発にはPySide6を使用

1.pythonコード内で翻訳文字列をtr()で囲む

翻訳文字列を tr() で囲みます。

▼ QObject.tr()について

PySide6.QtCore.QObject.tr(sourceText[, disambiguation=None[, n=-1]])

PARAMETERS
- sourceText - str
- disambiguation - str
- n - int

RETURN TYPE
str

引用元 : https://doc.qt.io/qtforpython-6/PySide6/QtCore/QObject.html?highlight=qobject#PySide6.QtCore.PySide6.QtCore.QObject.tr

リファレンスでの言及はこれだけ。

第1引数が翻訳対象の文字列です。また翻訳言語に対応するものがなかった場合に返されるデフォルトの値でもあります。このデフォルトは英語(en)にするのが無難。
日本語だとデフォでja_JPになっちゃいます。

▼ 実際には次のようなコードで翻訳する

上記のようにpythonコード内で QObject.tr("Select a image file") と文字列を囲んでいくだけです。ひたすら翻訳対象を tr() していってください。

2.lupdateコマンドからtsファイルを生成

次にpyコードからtsファイルを作ります。

これはバイナリのqmファイルの材料みたいなもの

その生成に使うのが pyside6-lupdateコマンド です。

▼ 例えば次のようにコマンド実行

▼ 生成されたapp.ja_JP.tsの中身

ご覧の通り普通のXMLファイルです。

3.linguistを使ってtsファイルの文字列翻訳

そしたら次にLinguistを使っての翻訳作業

GUIを使って翻訳できるので、この部分は楽です。

▼ 生成したtsファイルをLinguistをコマンドから起動

▼ GUIが起動したら翻訳していけばOK

Linguistを起動してtsファイルを翻訳している様子。翻訳作業はGUIからできるので楽だと思う

翻訳が終わったらtsファイルを一旦保存します。

4.lreleaseを使って .ts → .qm に変換する

そして翻訳が終わったらqmファイルとして保存します。

※ このqmはバイナリ形式

それにはlreleaseコマンドというもので変換可能です。

▼ 例えば以下のように変換する

場所は pyside6-lrelease を実行した場所に translations という名前のフォルダを作り、そこに app.ja_JP.qm のファイル名で保存しました。

このqmファイルは命名規則を決めておくべきです。

ここでは上記のように名前を付けました。

qmファイル名 : app.ja_JP.qm

何でもいいですが、次の独自ルールにしてます。

  • app.py の翻訳なら接頭辞は app にする
  • 名前・言語コードはドット(.)で区切る
  • 拡張子は必ず .qm にすること

後述するようにqmファイル読み込みは少し厄介です。

だから独自でも何でも命名規則を決めておくのがグッド

ここでは以上のようにして命名しました。

5.QTranslatorからqmファイルを読んで翻訳

いよいよ翻訳作業も大詰め

翻訳をQTranslatorから行ってみます。

▼ 次のようなpythonコードで試してみた

▼ 上手くいけばソフト文字列が翻訳される

画像は日本語に翻訳したファイル選択ダイアログの例。手順を踏んでいけば多言語化は簡単

引っかかるのはQTranslator.loadでの読み込み

各引数は次のような意味を持ってます。

  • 第1引数はロケール
    ここではシステム固有のロケール(QLocale.system())を使う。このロケールは日本語だったら ja__JP であることがほとんど(値は QLocale.system().name() から確認できる)
  • 第2引数はqmファイルの名前
    例えば app.ja_JP.qm だったら 'app' という値を指定する。ファイルパスは含める必要はないし、含めてはいけない。
  • 第3引数は区切り文字
    例えば app.ja_JP.qm だったら '.' という値を指定する。つまりqmファイルの名前と言語コード(ja_JP)を隔てる区切り文字を指定するってこと
  • 第4引数はqmファイルの場所
    実際にqmファイルがあるディレクトリパスを指定する。ただしディレクトリ区切り文字にはバックスラッシュ(\)ではなくスラッシュ(/)を使うこと。特にWindowsでは注意!

これだけ押さえておけば大丈夫

もし翻訳されないなら変換手順が間違ってます。

確実に手順を踏んでいけば翻訳も簡単

以上、PySideでのアプリ文字列翻訳でした。

色々ステップが多いから少し大変かもしれない。

でも確実に手順を踏んでいけば簡単です。ではまた