駒形電産

Omarchyの日本語対応を手伝いたい人のためのまとめを書いた。その中のUIの国際化について、僕が今やっていることをもう少し詳しく書いておく。

Omarchyの公式を含めたプラグインを日本語で使えるようにしたい。そのために、今はQuickshellでQt標準の翻訳機構を使えるようにする作業をしている。

OmarchyとQuickshell

Omarchy独自のソフトで翻訳対象になるのは、主にOmarchy Shell(Quickshell)ベースのアプリと、Bashスクリプトの2つ。それぞれに合った翻訳方法を考える必要がある。

Omarchyのバーや設定パネル・プラグインなどは、QtベースのQuickshellという仕組みで動いている。画面はQMLで書かれていてプラグインも同じ仕組みを使う。

さらに、Omarchyが提供するBashスクリプトにも確認メッセージなどがあるので、そちらの翻訳も考える必要がある。

DHHも、時計の一部だけを翻訳する前に、OS全体の包括的な翻訳方法が必要だと話している。

既に取り組んでいる人もいて、翻訳用の共通機能と言語パックを用意する案や、共通UI部品で既存の翻訳辞書を使う案がある。

僕も翻訳できるようにする方向には賛成で、その実行部分には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側の方式を相談していく。プラグインを作っている人や、他の言語の対応を進めている人とも一緒に考えていきたい。

Translation missing: ru.comments


Translation missing: ru.option