QML(Qt)でマルチランゲージに対応する

Qt Quickアプリケーションで多言語対応する方法です。
基本方針としてまず英語で作って日本語や他の言語に対応します。

WindowsやAndroidのアプリはリソースとして名前をつけて文字列を登録するという感じですが、Qtの場合は単純な文字列置換です。


/// サンプルを実行したときのスクリーンショット ///
英語や他の言語のとき
 

日本語のとき
 


/// 作業の流れ ///
 1.準備(Qt Creatorの設定)(1回だけ)
 2.C++(main.cpp)コードをいじって多言語対応できるようにする(プロジェクトごとに1回)
 3.多言語対応する文字列(変換対象)をマーキングする
 4.変換対象をピックアップしたtsファイルを作成する
 5.tsファイルの中身を編集して英語と日本語を結びつける
 6.最終形態のqmファイルを吐き出す




/// ファイル・フォルダ構成 ///
今回使用するファイルとフォルダの構成を最初に示します。
これを頭にいれてまた自分のプロジェクトの時は名称を置き換えてください。

サンプルは、「MultiLang」という名前のプロジェクトで作成しています。
 MultiLang\main.cpp
 MultiLang\qml\MultiLang\main.qml
 MultiLang\qml\MultiLang\TextEx.qml
 MultiLang\qml\MultiLang\i18n\qml_ja.ts // lupdateで作成する
 MultiLang\qml\MultiLang\i18n\qml_ja.qm // Linguistで作成する



/// 準備 ///
Qt Creatorの外部ツール設定してQt quickアプリ用の設定を追加します。
以下のメニューを選択します。
 [ツール]→[外部]→[構成...]

カテゴリ「Linguist」の下に2つ追加します。
スクリーンショットを参考に設定してください。

1つめ
 名称:翻訳を更新QML用 (lupdate)
 説明:プログラムコードと ts ファイルを同期します
 実行ファイル:%{CurrentProject:QT_INSTALL_BINS}\lupdate
 引数:. -ts i18n\qml_ja.ts -locations relative (最初にドットがあります)
 作業ディレクトリ:%{CurrentDocument:Path}
 

2つめ
 名称:翻訳を編集 (Linguist)
 説明:Linguistを起動します
 実行ファイル:%{CurrentProject:QT_INSTALL_BINS}\linguist.exe
 引数:なし
 作業ディレクトリ:%{CurrentDocument:Path}
 



/// C++(main.cpp)の修正 ///
「QTranslator」クラスを使用して「QApplication」クラスへ言語ファイルを読みこませます。
「QTranslator::load」するときのパスにだけ注意してください。
もともとqmlを読み込むコードが下にあるのでその内容のコピーで良いと思います。
// main.cpp

#include <QtGui/QApplication>
#include <QTranslator>  // 追加
#include <QLocale>      // 追加
#include "qmlapplicationviewer.h"

Q_DECL_EXPORT int main(int argc, char *argv[])
{
    QScopedPointer<QApplication> app(createApplication(argc, argv));
    QScopedPointer<QmlApplicationViewer> viewer(QmlApplicationViewer::create());

    // ここから
    QTranslator translator;
    translator.load(QLatin1String("qml_" )+QLocale::system().name()
           , QLatin1String("qml/MultiLang/i18n"));
    app->installTranslator(&translator);
    // ここまで

    viewer->setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
    viewer->setMainQmlFile(QLatin1String("qml/MultiLang/main.qml"));
    viewer->showExpanded();

    return app->exec();
}



/// 変換対象をマーキング ///
文字列を「qsTr("")」で設定します。
以下のような感じです。
qmlファイルが複数になる場合がほとんどだと思うのでその場合を想定しています。
なので2つ目の「TextEx.qml」には余り意味が無いです。

メインのqmlファイル
import QtQuick 1.0

Rectangle {
    width: 360
    height: 360
    Text {
        // 切り替え単位で文字列をqsTrでかこう
        text: qsTr("Hello World") + " " + qsTr("-geso")
        anchors.centerIn: parent
    }
    TextEx {
    }
}

別qmlファイル
// TextEx.qml

import QtQuick 1.0

Text {
    anchors.bottom: parent.bottom
    anchors.horizontalCenter: parent.horizontalCenter
    text: qsTr("special element")
}



/// lupdateの使い方 ///
qmlファイル内の対象文字列をピックアップしてtsファイルを作成します。

メインになるqmlファイルを開いた状態でQt Creatorで以下のメニューを選択します。
 [ツール]→[外部]→[Linguist]→[翻訳を更新QML用 (lupdate)]

全体メッセージに以下のような出力がでます。
エラーがでたり「Found X」のX=0になっていると設定が失敗してます。

注意!
・パスの設定の関係でメインのqmlファイルを開いてる時しか使えないです。
・多言語対応と言いつつ実は日本語への対応しかできない手順になってます。
 既にわかっていると思いますが、tsファイルの名前が「qml_ja.ts」になっています。
 実際は「qml_<langコード>.ts」で好きな言語に対応できます。

実行例
'C:/QtSDK/Desktop/Qt/4.7.4/mingw/bin/lupdate.exe' が終了しました
外部ツール 'C:/QtSDK/Desktop/Qt/4.7.4/mingw/bin/lupdate.exe' . -ts i18n\qml_ja.ts -locations relative を開始しています
Scanning directory '.'...
Updating 'i18n/qml_ja.ts'...
Found 3 source text(s) (0 new and 3 already existing)



/// Qt Linguistの使い方 ///
tsファイルの中身を編集して英語と日本語を結びつけます。
GUIのあるアプリケーションで簡単に編集できます。
編集後に最終形態のqmファイルを出力します。

以下のメニューを選択してツールを起動します。
 [ツール]→[外部]→[Linguist]→[翻訳を編集 (Linguist)]

起動したら目的のtsファイルを開きます。
一番左のペインにqmlが並びます。
次のペインにqmlに含まれる文字列が並びます。
下のペインで変換後の他の言語の文字列を入力します。
すべての「?」がなくなればOKです。
 

編集して1つOKにしたところ。
赤丸印のボタンを押すと確定できます。
 

すべて緑のチェックマークになったらOKです。
 
この状態になったら、以下のメニューを選択します。
 [ファイル]→[Release]
最終型のqmファイルが出力されます。



ここまで来ればあとは実行するのみ!



/// 参考情報 ///
・概要の説明
 QML Internationalization
・QMLでマルチランゲージにするときのサンプル
 Internationalization Example
・tsファイルを編集するツールの説明
 Qt Linguist Manual: Translators
・C++コードに追加するべき事など
 Qt Linguist Manual: Programmers
・言語ファイルの読込みのサンプル(gitにある何かのソース)
 読み込んでる部分
 呼び出してるところ