この記事の内容
自作C++アプリケーションをQt Linguistによって英語・日本語両対応にした方法を紹介します。
Qt Quickについての記述はありません。
筆者は趣味でQtを使っている個人開発者です。出来る限り間違いなどがないよう検証や調査を行った上で記事にしていますが、誤りやわかりにくい点などを見つけられましたら、お気軽にコメントやTwitterにてご指摘頂けると嬉しいです。
周辺知識
Qt
マルチプラットフォームアプリケーション開発のためのフレームワークです。基本的にはC++ですが、PythonからQtを使えるpyqtというものもかなり人気があります。
その他、CSS likeなUI表現とJavaScriptによるロジック記述によるUI開発を行う仕組み(=Qt Quick)等を持ちます。
Qt Linguistとは
Qtアプリケーションを翻訳するための仕組みです。
アプリケーション側に多少の手を加える必要はありますが、アプリケーション上に表示する文字列を手軽に翻訳することが可能です。
Qt Linguistによる多言語化の手順
概要
以下にQtアプリケーション国際化の概要図を示します。緑色の矢印・文字部分が、今回主に解説する範囲です。
翻訳の流れを以下箇条書きにします。
- アプリケーションを開発する。
-
.pro
ファイルにtsファイルについて記述する -
cpp
ファイルのアプリケーション初期化部分に、翻訳用の数行のコードを記述する - 翻訳したい文字列は
tr()
で囲む
-
-
lupdate
コマンドで、tsファイルを生成する - Qt Linguistを使って、翻訳作業を行う(tsファイルへの追記)
-
lrelease
コマンドで、qmファイルを生成する
「日本語(ja)」「フランス語(fr)」の翻訳を作る場合を想定して、具体的な手順、詳細について以下で見ていきます。
アプリケーションを開発
プロジェクトファイルの設定
lupdate
が生成するtsファイルの種類と場所を指定するため、*.pro
ファイルに、以下の行を追加します。
TRANSLATIONS = \
translate/qcss_ja.ts \
translate/qcss_fr.ts
qcss_
にあたる部分は、なんでも構いません。アプリケーション名からとるとよいでしょう。
実は.ts
という拡張子もなんでも良いのですが、慣例として.ts
というファイル名がとられることが多いようです。
また、ファイル構成をきれいにするために、tsファイルの配置先をtranslate/
フォルダ以下にしていますが、これもどこでもOKです。
翻訳用の数行のコードを初期化部分に記述する
アプリケーションのすみずみまで翻訳するために、QApplication::installTranslator()
を用います。
ここで注意が必要なのは、translator.load()
する対象の指定方法です。
日本語ならtranslate/qcss_ja
、フランス語ならtranslate/qcss_fr
というように、拡張子部分は付けずに指定するようにしましょう。
// main.cpp
#include <QApplication>
#include <QTranslator>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// translate --->
QTranslator translator;
translator.load("translate/qcss_ja"); // 日本語の場合
// translator.load("translate/qcss_fr"); // フランス語の場合はこうする
a.installTranslator(&translator);
// <---
MainWindow w;
w.initialize();
w.show();
return a.exec();
}
ちなみに、この例ではload
する対象をtranslate/qcss_ja
のように固定しているため、このままでは言語切替にビルドが必要になってしまいます。
ですが、起動時に一度だけ設定ファイルから読み込むようにするなら、再ビルドの必要はなくダイナミックに言語切替が可能です。
筆者のアプリケーションのこのあたりを見て頂けるとわかりやすいかと思います。
起動中に言語切替を行いたい場合、やや複雑になります。言語切替のイベントをキャッチする等すればできなくはないようですが、どうしても必要なわけではないのであれば、無難に再起動しましょう。
多言語化したい文字列をtr()で囲む
他言語に翻訳したい文字列は、すべてtr()
で囲みます。lupdate
は、tr()
を目印にして文字列を集めます。
tr()の内容は、かならず文字列リテラルになるようにしましょう。
つまり、以下の例のようにしてください。
// NGな例
QString title = "cat message";
QString contents = "nya-";
QMessageBox::info(this, tr(title), tr(contents)); // NG!
// OKな例
QString title = tr("cat message"); // OK!
QString contents = tr("nya-"); // OK!
QMessageBox::info(this, title, contents);
フォームエディタで作った画面 … 何もしなくてOK
lupdate
は、*.ui
ファイルに含まれる文字列を自動的に翻訳対象としてみなします。
*.ui
ファイルの文字列をわざわざtr()
で囲んだりする必要はありません。
QObjectの外で翻訳したい:Q_DECLARE_TR_FUNCTIONS
tr()
はQObject
のメンバであるため、そのままではQObject
を継承しないクラスでは使えません。
でも安心してください。そんなクラスでも、ヘッダに以下のように追記するだけで、tr()
を使った要翻訳指定を行うことができます。
#include <QtCore> // <--- ヘッダ追加
class ScreenShotSaver
{
Q_DECLARE_TR_FUNCTIONS(MyClass) // <--- このマクロ
public:
ScreenShotSaver();
static void save(QPixmap pixmap);
private:
static bool checkSaveOk(QString filepath);
};
(参考) QCoreApplication Class | Qt Core
翻訳作業
実際にlupdate
, Linguist
, lrelease
を使って翻訳作業を行っていきます。
これらはコマンドを叩くほか、Qt Creator GUI上で以下のメニュー階層から起動することもできます。
(補足) ほんとうはここにQt Linguistが並ぶはずなのですが、筆者の環境ではそのようになっていません…
その場合、Qtのbinフォルダにあるlinguist.exe
から起動しましょう。
アプリケーション中の文字列の抽出
[ツール]→[外部]→[Linguist]→[lupdate]でlupdate
を実行できます。
「全体メッセージ」ペイン(Alt+6で開きます)に実行結果が表示されます。
translate/フォルダに、qcss_ja.ts
とqcss_fr.ts
が生成されていれば成功です。
Qt Linguistによるtsファイルの翻訳
Qt Linguistを起動します。[ファイル]→[開く]で、生成したtsファイルを開きます。すると、このような画面となります。
非常に直感的でわかりやすいですね。これはフォームクラス(*.ui
)の翻訳画面なので、対応する画面のモックが表示されています。翻訳対象がフォームをもたないクラスの場合、対象部分のソースコードが表示されます。
文脈を加味して翻訳が行えるのは非常に便利ですね。
「日本語 訳」の部分に翻訳を記入し、チェックマークを押すと翻訳完了となり、次のフレーズに移動します。
翻訳の必要がない場合は、そのままチェックマークを押しましょう。
これをtsファイルの数だけ繰り返せば、翻訳作業は完了です。
翻訳のリリース
[ツール]→[外部]→[Linguist]→[lrelease]でtsファイルからqmファイルへの変換が行えます。
翻訳作業後、これを忘れないようにしましょう。
これで翻訳作業は完了です。言語を切り替えて遊んでみましょう。
追加・修正への対応
lupdateは自動マージ機能付き
画面に追加項目が発生した場合や、文言の変更が発生した場合、lupdate
を再度行います。
「これまで翻訳したtsファイルが上書きされてしまうのでは?」と心配になるかもしれませんが、問題ありません。
追加された文言はちゃんと追加されますし、変更されたものについては、変更前の文言も併せて掲載されます。
Linguistで開くと、以下のようにわかりやすく未翻訳部分が表示されます。
開発作業→lupdate
→Linguistで翻訳→lrelease
というサイクルをまわしていくことで、つねに翻訳を最新に保つことができます。
tr()で囲むという手間はありますが、周辺ツールが充実しているため、そのあとはカンタンです。是非挑戦してみてください。
アプリケーションの紹介
ブログに挿入するスクリーンショットを作成するためのC++アプリです。
すべて一旦英語で作成し、後からQt Linguistの仕組みを用いて日本語・英語両対応アプリケーションにしました。よければ参考にどうぞ。
英語
日本語
コード
GitHub上のリポジトリにて公開しています。