🌐

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です。
Qt Linguistで編集
編集後に保存をして、再度lreleaseを実行します。

lrelease i18n/lobsta_ja.ts

これで作業は完了です。
実際にプラグインを動かしてみて翻訳されているか見てみましょう。
翻訳後のダイアログ
上記までの対応のコミットはaeb0c4になります。

Georepublic Tech Blog

Discussion