このページでは

テキストIDベースの翻訳

テキストID翻訳メカニズムは、国際化とローカライゼーションのための産業強度のシステムです。アプリケーション内の各テキストには一意な識別子(テキスト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ベースの翻訳では許可されないので、Qt Linguist はコンテキスト名なしでファイルのIDをリストします。
  5. 開発ビルドのユーザーインターフェイスに表示されるエンジニアリング英語のテキストは、//% のコメントで示されます。これを含めないと、テキストIDがユーザーインターフェイスに表示されます。これは、パラメータを含むテキストがある場合に特に重要です。//% のコメントには、文字列内のパラメータ・インジケータを含める必要があります。例えば//% "Number of files: %1"
  6. 翻訳者に追加情報を提供する//: のコメントは、プレーンテキストシステムではオプションです。しかし、テキスト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") 。ラベルタグは、トランスレータのナビゲーションを改善するためだけに使用され、実行時の動作を変更することはありません。

ラベルの自動生成

ラベル名を手動で指定する代わりに、プレースホルダを使用して、コード構造に基づいてラベルを自動生成することができます:

  • //@ <context> - 完全なコンテキストを自動的に使用する(namespace::class)
  • //@ <class> - 自動的にクラス名のみを使用する (ネームスペースを使用しない)
  • //@ <file> - ソース・ファイル名を自動的に使用する
プレースホルダーの組み合わせ

プレースホルダーをカスタム・テキストと組み合わせることで、より説明的なラベルを作成できます:

  • //@ <file>:<class> - ファイル名とクラスを組み合わせます:filehandler.cpp:FileHandler
  • //@ <context>_customSuffix - サフィックスを追加します:MyApp::FileHandler_customSuffix
  • //@ module_<file>_<class>-label - カスタム接頭辞と接尾辞module_filehandler.cpp_FileHandler-label
  • //@ <context>:<file> - ファイルとのコンテキスト:MyApp::FileHandler:filehandler.cpp

例えば、C++の場合:

namespace MyApp {
class FileHandler : QObject {
    Q_OBJECT
    void open() {
        //% "Open file"
        //@ <context>
        qtTrId("msg.open"); // Label: MyApp::FileHandler

        //% "Save file"
        //@ <class>
        qtTrId("msg.save"); // Label: FileHandler

        //% "Export"
        //@ <file>
        qtTrId("msg.export"); // Label: filehandler.cpp
    }
};
}

またはQML:

Item {
    id: myComponent
    Component.onCompleted: {
        //% "Loading"
        //@ <context>
        qsTrId("msg.loading") // Label: <component-name>

        //% "Ready"
        //@ <file>
        qsTrId("msg.ready") // Label: main.qml

        //% "Initialized"
        //@ <file>:<context>-state
        qsTrId("msg.init") // Label: main.qml:<component-name>-state
    }
}

自動ラベルは、多数のファイルにまたがるラベル名を手作業で管理するのが面倒な大規模プロジェクトで特に役立ちます。自動ラベルは、コード構造に基づいた一貫性のあるグループ化を保証し、翻訳者に翻訳がどこで使用されるかを示すヒントを与えます。

注意 :C++のコードで<class> をクラスの外で使用すると、警告が表示され、生成されるラベルには<unnamed> が使用されます。

注意: QMLのコンポーネントはクラスではないので、<class> をQMLで使用すると警告が発生し、<unnamed> が使用されます。コンポーネント名を取得するには<context> を、QML ファイル名を取得するには<file> を使用してください。

注: オートラベルはIDベースの翻訳(qtTrId,qsTrId )でのみ機能します。テキストベースの翻訳 (tr,qsTr) でオートラベルを使用すると警告が発生し、ラベルは無視されます。

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 情報を削除し、代わりに別のスクリプトで翻訳を管理することができます。このスクリプトは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 <project-dir>/i18n/myapp-text_en_GB.ts
lrelease <project-dir>/i18n/myapp-text_en_US.ts
...

© 2026 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.