テキストIDベースの翻訳
テキストID翻訳メカニズムは、国際化とローカライゼーションのための工業的な強力なシステムです。アプリケーション内の各テキストには一意な識別子(テキストID)があり、ソースコード内でテキストの代わりに使用します。これにより、大量の翻訳テキストの管理が非常に簡単になります。
テキストIDによる国際化
プレーンテキストの代わりにテキストIDを使用する場合、アプリケーションを国際化する一般的な方法は同じですが、詳細は少し異なります:
- テキストIDベースの翻訳システムの関数とマクロは、プレーンテキストシステムとは異なります。qsTr()の代わりにqsTrId()関数を、QT_TR_NOOP()の代わりにQT_TRID_NOOP()マクロを、QT_TR_N_NOOP()の代わりにQT_TRID_N_NOOP()マクロを使用します。)
- テキストIDは、プレーン・テキスト文字列ではなく、ユーザー・インター フェース文字列として使用する。例えば
qsTrId("id-back-not-front")
- コンテキスト・パラメータをテキストIDで指定することはできないため、同じスペルで異なる意味を持つ単語は、別々のテキストIDが必要になります。例えば、
qsTrId("id-back-backstep")
は、バックステップBackとid-back-not-front
Back を区別する。 - コンテキスト名はテキストIDベースの翻訳では許可されないので、Qt Linguist はコンテキスト名なしでファイルのIDをリストします。
- 開発ビルドのユーザーインターフェイスに表示されるエンジニアリング英語のテキストは、
//%
のコメントで示されます。これを含めないと、テキストIDがユーザーインターフェイスに表示されます。これは、パラメータを含むテキストがある場合に特に重要です。//%
のコメントには、文字列内のパラメータ・インジケータを含める必要があります。例えば//% "Number of files: %1"
- 翻訳者に追加情報を提供する
//:
のコメントは、プレーンテキストシステムではオプションです。しかし、テキスト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>
与えられたテキストに対して利用可能な翻訳がない場合(一般的に開発の後半までそうです)、テキストIDは、適切なテキストではなく、ユーザーインターフェイスに表示されます。アプリケーションをテストのためにもっと使いやすくするために、lrelease
、エンジニアリングの英語のソーステキスト(//%
のコメントから)を翻訳されたテキストとして使用し、感嘆符(!)のような何らかのインジケータでマークすることで、まだ翻訳されていないテキストを見ることができます。
IDベースの翻訳をグループ化する
各IDベースの翻訳にラベルを割り当てて、大きなプロジェクトのIDベースのエントリを小さなグループに整理することができます。ID ベースのエントリにラベルを割り当てるには、//@
に C++ などのラベル名を指定するコメントを追加します:
//% "Open file" //@ FileOperations qtTrId("msg.open");
またはQMLの場合:
//% "Open file" //@ FileOperations qsTrId("msg.open");
でTSファイルを開くと Qt LinguistでTSファイルを開くと、同じラベルを持つIDベースの項目は、コンテキストごとにグループ化されるテキストベースの項目と同様に、一緒にグループ化されます。ラベルのない項目は<unnamed label>
の下に表示されます。
注意: ラベル名は、検索や一意性には影響しない:IDはグローバルに一意であり、ラベルを参照することなく、qtTrId("msgid")
。ラベルタグは、トランスレータのナビゲーションを改善するためだけに使用され、実行時の動作を変更することはありません。
CMakeの設定
CMakeでビルドする場合、.tsファイルには接頭辞qml_
。たとえば、qml_en.ts
。CMakeLists.txt ファイルにqt_add_translations関数を追加し、*.ts ファイルをTS_FILES
の値としてリストし、RESOURCE_PREFIX の値をプロジェクトの main.qml ファイルの URI に /i18n を続けて設定します:
qt_add_translations(${CMAKE_PROJECT_NAME} TS_FILES i18n/qml_de_DE.ts i18n/qml_en_US.ts RESOURCE_PREFIX Main/i18n )
qmakeでの高度な使用
多数のロケールを対象とするプロジェクトでは、.pro ファイルから TRANSLATIONS 情報を削除し、代わりに別のスクリプトで翻訳を管理することができます。このスクリプトはlrelease
とlupdate
を必要なターゲットごとに呼び出すことができます。
更新は次のようにスクリプト化できます:
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 <project-dir>/i18n/myapp-text_en_GB.ts lrelease <project-dir>/i18n/myapp-text_en_US.ts ...
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.