Qtアプリケーションの翻訳
プログラムの中に表示される文字列を別の言語に翻訳する必要があるとき、いちいちコードを書き直すのは手間がかかる上に人間である以上見落とす部分も出てきてしまいます。
そこでQtではアプリケーションを多言語化するための仕組みが用意されています。
翻訳の準備
翻訳をするには初めにソースファイルから翻訳ファイルを読み込む必要があります。以下のソースファイルを見てください。
#include <QApplication> #include <QtGui> int main(int argc, char ** argv) { QApplication app(argc, argv); QTranslator translator; translator.load("trans_ja"); //trans_ja.qmというファイルのファイル名のみを渡す。 app.installTranslator(&translator); //QTranslatorクラスを適用 //メインウインドウ QMainWindow window; QGridLayout* grid = new QGridLayout; QLabel* label1 = new QLabel(QObject::tr("this is label")); QLabel* label2 = new QLabel(QObject::tr("hello")); grid->addWidget(label1); grid->addWidget(label2); window.setLayout(grid); window.show(); return app.exec(); }
まずラベルなどの文字列を定義するときにQObjectクラスのtr関数を呼び出しています。これは翻訳する文字列を抜き出すときに必要なので翻訳する文字列はすべてこの関数に渡す必要があります。
次に翻訳を行うためにQTranslatorクラスを利用しています。QTranslatorのload関数にqmファイルという翻訳元と翻訳先の文字列を記憶したファイルを渡し、その後、installTranslator関数でアプリケーションの翻訳を実行しています。
これで翻訳の準備は完了です。
翻訳の手順
では、どのようにqmファイルを作り、翻訳を実行するかという手順を次に示します。
- lupdateコマンドを使い、プロジェクトファイルからtsファイルを作成する。
> lupdate -pro example.pro -ts trans_ja.ts
example.proがプロジェクトファイル、trans_ja.tsが翻訳元と翻訳先の言語についての情報について書かれたファイルです。ここでは英語を日本語に翻訳します。
ちなみにもしすでに翻訳済みのtsファイルがある場合はその翻訳情報は引き継がれます。
- linguistを起動する。
> linguist trans_ja.ts
先ほど作ったtrans_ja.tsをlinguistというツールで開きます。linguistが起動したらそれを使って翻訳元の言語(英語)を翻訳先の言語(日本語)に訳していきます。翻訳が完了したら保存を押してtsファイルを上書きします。
- lreleaseでqmファイルを生成する。
> lrelease trans.ts -qm trans_ja.qm
lreleaseコマンドでtsファイルをプログラムが実際に読み込むqmファイルに変換します。このqmファイルをプログラムの起動するディレクトリと同じ場所に置きます。
- ソースファイルをコンパイルする。
上手くいけばプログラム中の英語が訳した日本語に変わっています。
補足 : load関数について
QTranslatorのload関数にqmファイル名を渡せると書きましたが、パス名を指定したり言語名を指定して翻訳をロードすることも出来ます。
例えばアプリケーションのすぐ下にtranslationsというディレクトリを作りそこからqmファイルを読み込みたければ
translator.load("trans_ja", "translations");
とすればOKです。
もしいちいち言語コード(jaなど)をつけたくなければシステムの国コードから読み込みすることもできます。
translator.load(QLocale::system(), "tr", "_", "translations");
この場合、もし言語コードが[jp]ならtranslationsディレクトリ直下のtr_ja.qmというファイルが読み込まれます。