Omarchyの日本語対応を手伝いたい人のためのまとめを書いた。その中のUIの国際化について、僕が今やっていることをもう少し詳しく書いておく。
Omarchyの公式を含めたプラグインを日本語で使えるようにしたい。そのために、今はQuickshellでQt標準の翻訳機構を使えるようにする作業をしている。
OmarchyとQuickshell
Omarchy独自のソフトで翻訳対象になるのは、主にOmarchy Shell(Quickshell)ベースのアプリと、Bashスクリプトの2つ。それぞれに合った翻訳方法を考える必要がある。
Omarchyのバーや設定パネル・プラグインなどは、QtベースのQuickshellという仕組みで動いている。画面はQMLで書かれていてプラグインも同じ仕組みを使う。
さらに、Omarchyが提供するBashスクリプトにも確認メッセージなどがあるので、そちらの翻訳も考える必要がある。
DHHも、時計の一部だけを翻訳する前に、OS全体の包括的な翻訳方法が必要だと話している。
既に取り組んでいる人もいて、翻訳用の共通機能と言語パックを用意する案や、共通UI部品で既存の翻訳辞書を使う案がある。
- PR #8765: Proposal for a localization framework: Add the I18n translation primitive:QMLとBash向けの翻訳機能を用意し、言語パックをプラグインとして扱う案。
- PR #10083: Runtime i18n: self-translating Ui kit with system gettext catalogs as the default source:共通UI部品で翻訳し、GTKなどの既存の辞書を利用する案。
僕も翻訳できるようにする方向には賛成で、その実行部分にはQtが持っている機能を使えないかなと思って調べ始めた。
Qtの翻訳機構
Qtには、もともとUIを翻訳するための仕組みがある。QMLなら、例えばこんな感じで翻訳対象の文字列を書く。
Text {
text: qsTr("Save")
}
この文字列を翻訳用のファイルに抽出し、日本語の訳を入れて、実行時に読む.qmというファイルにする。翻訳を編集するQt Linguistというツールもある。
英語話者にはわかりづらいかもだけど、複数形だけをとっても数字の1桁目だけによって変わる言語とかいろんあパターンがあり、かなり複雑な処理が必要。独自実装は避けてQtの機能を使いたい。
ただ、調べた時点のQuickshellには、翻訳ファイルを読み込むための機能が足りなかった。qsTr()は書けるが、対応する翻訳を読み込ませる標準の入口がない。同じことを求めているIssueも既にあったので、Omarchyで必要としていることをコメントした。
PoCからQuickshellへのPR
まず、外部のC++モジュールからQtのQTranslatorを使って翻訳ファイルを読み込み、画面を再翻訳するPoCを作った。
既存の日本語の翻訳ファイルを使い、Quickshell本体を変更せずに、表示が&Closeから閉じる(&C)へ変わるところまで確認できた。
動くことはわかった。ただ、この方法だとOmarchy側でC++モジュールをビルドして配布し、Qtの更新との互換性も面倒を見ることになる。翻訳ファイルを読み込むためだけに、その保守を抱えるのはちょっと重い。
そこで、Quickshell本体で読み込めるようにするPRを作った。
このPRでは、ルートのQMLファイルの隣にあるi18n/から、qml_ja.qmなどの翻訳ファイルを読む。言語を変えたら、読み込む翻訳を入れ替えて画面にも反映する。QtのQQmlApplicationEngineが持つ仕組みに合わせたものだ。
この機能がQuickshellにあれば、同じ問題を抱えている別のシェルでも使える。Omarchyの日本語対応から始めた作業だけど、Quickshellを使う人にも役立つ形にできるといいなと思う。
Omarchy側でこれからやること
Quickshellで翻訳を読めるようになった後も、Omarchy側には作業がある。表示する文字列を翻訳対象にし、カタログを用意し、言語の選び方やプラグインの翻訳の管理方法を決める必要がある。
Bashスクリプトのメッセージも対象になる。こちらはgettextを使う方向で、QML側のQtの仕組みと組み合わせられないか相談している。
まずはQt標準の翻訳機構を使うための入口を整えて、その上でOmarchy側の方式を相談していく。プラグインを作っている人や、他の言語の対応を進めている人とも一緒に考えていきたい。