テキストIDベースの翻訳

テキストID翻訳メカニズムは、国際化とローカライゼーションのための工業的な強力なシステムです。アプリケーション内の各テキストには一意な識別子(テキストID)があり、ソースコード内でテキストの代わりに使用します。これにより、大量の翻訳済みテキストの管理が非常に簡単になります。

注意: 1つのアプリケーションでは、プレーンテキストベースの関数だけ、またはテキストIDベースの関数だけを使用する必要があります。混在させると、翻訳するテキストが不完全になってしまいます。

テキストIDによる国際化

プレーンテキストの代わりにテキストIDを使う場合、アプリケーションを国際化する一般的な方法は同じですが、詳細は少し異なります:

  1. テキストIDベースの翻訳システムの関数とマクロは、プレーンテキストシステムとは異なります。qsTr()の代わりにqsTrId() 関数を、QT_TR_NOOP()の代わりにQT_TRID_NOOP() マクロを、QT_TR_N_NOOP())の代わりにQT_TRID_N_NOOP() マクロを使用します。
  2. テキストIDをプレーン・テキスト文字列ではなく、ユーザー・インターフェース文字列として使用する。例えばqsTrId("id-back-not-front")
  3. コンテキスト・パラメータをテキストIDで指定することはできないので、同じスペルで異なる意味を持つ単語は、別々のテキストIDを必要とする。例えば、qsTrId("id-back-backstep") は、バックステップBackid-back-not-front Back を区別します。
  4. 開発ビルドのユーザーインターフェイスに表示されるエンジニアリング英語のテキストは、//% のコメントで示されます。これを含めないと、ユーザー・インターフェイスにテキストIDが表示されます。これは、パラメータを含むテキストがある場合に特に重要です。//% のコメントには、文字列内のパラメータ・インジケータを含める必要があります。例えば//% "Number of files: %1"
  5. 翻訳者に追加情報を提供する//: のコメントは、プレーンテキストシステムではオプションです。しかし、テキストIDベースのシステムでは、この追加情報が不可欠になります。なぜなら、この追加情報がなければ、テキストIDしかなく、翻訳者は、さらなる文脈がなければ、そこから賢明な翻訳をすることができないかもしれないからです。長い説明的なテキストIDを使用して、コメントを使用しないこともできますが、コメントの方が理解しやすいことがよくあります。

以下のコード・スニペットは、テキストIDベースとプレーンテキストベースの翻訳を比較したものです:

テキストIDベースプレーンテキストベース
Text {
    id: backTxt;
    //: The back of the object, not the front
    //% "Back"
    //~ Context Not related to back-stepping
    text: qsTrId("id-back-not-front");
}
Text {
    id: backTxt;
    //: The back of the object, not the front
    //~ Context Not related to back-stepping
    text: qsTr("Back","Not front")
}

テキストIDを使ったローカライズ

テキストIDを使ったローカライズは、プレーンテキストの場合とほぼ同じプロセスをたどります。

lupdateツールを使って、翻訳を追加するTSファイルを生成します。翻訳ファイルのソース値はプレーンテキストではなくテキストIDになるため、翻訳が正確であることを保証するために、説明的なテキストIDか、適切な追加コメント、またはその両方が必要になります。

上記のテキストIDベースのユーザーインターフェイステキストの例では、.tsファイルに次のような内容が含まれます:

<message id="id-back-not-front">
    <source>Back</source>
    <extracomment>The back of the object, not the front</extracomment>
    <translation type="unfinished"></translation>
    <extra-Context>Not related to back-stepping</extra-Context>
</message>

lreleaseを使用する場合、翻訳されたテキストのキーがプレーンテキストではなく、テキストIDに基づいていることを指定する必要があります。qsTr() を使ってコード内で翻訳可能な文字列としてマークした場合、id 属性は設定されず、lrelease はそれらを無視します。

しかし、与えられたテキストに対して利用可能な翻訳がない場合(一般的に開発後期までそうです)、ユーザーインターフェイスには適切なテキストではなくテキストIDが表示されます。アプリケーションをテストにより使いやすくするために、lreleaseエンジニアリング英語のソーステキスト(//% のコメントから)を翻訳済みテキストとして使用し、感嘆符(!)のような何らかのインジケータでマークすることで、まだ翻訳されていないテキストを確認できるようにすることができます。

CMakeの設定

CMakeでビルドするとき、.tsファイルには接頭辞qml_ 。例えば、qml_en.ts 。CMakeLists.txt ファイルにqt_add_translations関数を追加し、*.ts ファイルをTS_FILES の値としてリストし、RESOURCE_PREFIX の値をプロジェクトの main.qml ファイルの URI に /i18n を続けて設定し、LRELEASE_OPTIONS の値を-idbased に設定します:

qt_add_translations(${CMAKE_PROJECT_NAME}
    TS_FILES i18n/qml_de_DE.ts i18n/qml_en_US.ts
    RESOURCE_PREFIX Main/i18n
    LRELEASE_OPTIONS -idbased
)

qmakeでの高度な使用

多数のロケールを対象とするプロジェクトでは、.pro ファイルから TRANSLATIONS 情報を削除し、代わりに別のスクリプトで翻訳を管理することができます。このスクリプトはlreleaselupdate を必要なターゲットごとに呼び出すことができます。

更新は次のようにスクリプト化できます:

lupdate -recursive <project-dir> -ts <project-dir>/i18n/myapp-text_en_GB.ts
lupdate -recursive <project-dir> -ts <project-dir>/i18n/myapp-text_en_US.ts
...

最終的な.qmファイルの生成は、次のようにスクリプト化できます:

lrelease -idbased <project-dir>/i18n/myapp-text_en_GB.ts
lrelease -idbased <project-dir>/i18n/myapp-text_en_US.ts
...

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。