QGIS Pluginのi18n対応をする
QGISのPluginではQtの仕組みを使ってi18n対応をすることができます。
今回は筆者が作成しているqgis-lobstaをi18n対応していきます。
前提条件
- macOSのQGIS 3.42を対象とします。LinuxなどではQt5の標準のツールなどが使えるはずです。
翻訳ファイルの作成
まず、lobsta.pro
ファイルを作成します。
SOURCES += lobsta.py \
login_dialog.py
FORMS += ui/login_dialog.ui
TRANSLATIONS = ./i18n/lobsta_ja.ts
次に i18n
ディレクトリを作成します。
mkdir i18n
次に、pylupdate5
を実行するのですが、macOSではエラーとなります。
pylupdate5
の中身を見てみましょう。
#!/bin/sh
exec '`dirname $0`/python3.9' -m PyQt5.pylupdate_main ${1+"$@"}
単純に PyQt5.pylupdate_main
を呼び出しているだけなので、同じことをして上げましょう。
/Applications/QGIS.app/Contents/MacOS/bin/python3.9 -m PyQt5.pylupdate_main lobsta.pro
無事、i18n/lobsta_ja.ts
が作成されました。
一旦翻訳はせずに続いて.pm
ファイルを作成しましょう。.pm
ファイルはQtが実際に読み込む翻訳ファイルとなります。
.pm
ファイルの作成にはlrelease
というコマンドを使いますが、何故かmacOSのQGISには入っていないため、qt
を別途インストールします。
brew install qt
rehash
これでlrelease
が使えるようになったので、.pm
ファイルへ変換を行います。
lrelease i18n/lobsta_ja.ts
これで、無事i18n/lobsta_ja.pm
が作成されました。
QGISプラグインをi18n対応する
続いて行う作業はQGISプラグイン自体をi18n対応するためのコードを仕込む事です。
今回はlobsta.py
に設定を入れます。
import os
from qgis.core import Qgis
from qgis.PyQt.QtCore import QCoreApplication, QSettings, QTranslator
from qgis.gui import QgisInterface
from qgis.PyQt.QtWidgets import QAction
from .login_dialog import LoginDialog
from .ui import IconLobsta
from typing import List, Optional
from logic.key_management import fetch_auth_config
class Lobsta:
"""QGIS lobsta plugin main class."""
def __init__(self, iface: QgisInterface):
self.iface = iface
self.plugin_dir = os.path.dirname(__file__)
locale = QSettings().value("locale/userLocale")[0:2]
locale_path = os.path.join(
self.plugin_dir, "i18n", f"lobsta_{locale}.qm"
)
if os.path.exists(locale_path):
self.translator = QTranslator()
self.translator.load(locale_path)
QCoreApplication.installTranslator(self.translator)
# 省略
def tr(self, message: str) -> str:
return QCoreApplication.translate("Lobsta", message)
なお、ここでself.tr
を実装しているのはこのクラスは翻訳のための実装が無いためです。
QDialog
などを継承しているclassはself.tr
が実装されているため、実装は不要です。
プログラムの翻訳対象を追加する
ui/login_dialog.ui
に対する翻訳対象は作成されましたが、プログラム側でもi18n対応をする必要があります。
これはself.tr
を呼び出している部分を抽出することで翻訳が可能となります。
以下のように実装をします。
def initGui(self) -> None:
action = QAction(IconLobsta, self.tr("Login"), self.iface.mainWindow())
action.triggered.connect(self.check_login)
self.iface.addToolBarIcon(action)
self.iface.addPluginToMenu(self.tr("&Lobsta"), action)
self.actions.append(action)
これで再度pylupdate
を実行すればOKです。
Qt Linguistで翻訳をする
最後に翻訳を実施します。.ts
ファイルを開いて編集しても良いのですが、QtではLinguist
という翻訳アプリを使って翻訳することができます。
Homebrewでqtをインストールした場合、/opt/homebrew/bin/Linguist
に配置されるので、普通に起動しましょう。
Linguist
起動してからtsファイルを選択して開きます。
初期画面ではソーステキストの部分が隠れてしまう可能性があるので、少し拡大しましょう。
以下のように編集できればOKです。
編集後に保存をして、再度lrelease
を実行します。
lrelease i18n/lobsta_ja.ts
これで作業は完了です。
実際にプラグインを動かしてみて翻訳されているか見てみましょう。
上記までの対応のコミットはaeb0c4になります。
Discussion