翻訳用ソースコードの記述

アプリケーションをローカライズできるように、QML と Qt C++ のソースコードを記述します:

C++アプリケーションを開発する場合は、「C++コードに関するその他の考慮事項」も参照してください。

翻訳対象の文字列をマークする

アプリケーションで翻訳が必要なテキストのほとんどは、単語や短いフレーズで構成されています。これらは通常、ウィンドウのタイトル、メニュー項目、ツールチップ、ボタン、チェックボックス、ラジオボタンのラベルとして表示されます。

Qtでは、各ウィンドウのフレーズを作成時に翻訳することで、翻訳のパフォーマンスコストを最小限に抑えています。ほとんどのアプリケーションでは、メインウィンドウは一度だけ作成されます。ダイアログは一度だけ作成され、必要に応じて表示されたり隠されたりします。最初の翻訳が行われると、翻訳されたウィンドウのランタイムオーバーヘッドはなくなります。作成され、破棄され、その後に作成されるウィンドウだけが、翻訳のパフォーマンス・コストを持つことになります。

実行時に言語を切り替えるアプリケーションを作成することもできますが、それには手間がかかり、実行時のパフォーマンスコストが発生します。

QML や C++ コードでは、ユーザーから見える UI テキストを翻訳するために翻訳関数を使用します。Qt では、翻訳可能な文字列のインデックスを、その文字列が関連付けられている翻訳コンテキストで作成します。同じ語句が複数のコンテキストに矛盾なく現れることがあります。ある文脈で同じフレーズが複数回出現する場合、そのフレーズは一度だけ翻訳され、その文脈内のすべてのフレーズに翻訳が適用されます。

QML: qsTr() を使う

QMLでは、.qmlファイルの中で、ユーザが目にする文字列を翻訳対象としてマークするために、以下の関数を使用することができます:

通常、qsTr() 関数を使います:

Text {
    id: txt1
    text: qsTr("Back")
}

このコードにより、翻訳ソース(TS)ファイル中のBackというキー項目が作成されます。実行時に、翻訳システムはキーワードBackを検索し、現在のシステムロケールに対応する翻訳値を取得します。結果はtext プロパティに返され、UIは現在のロケールに適切なBackの翻訳を表示します。翻訳が見つからない場合、qsTr() は元の文字列を返します。

翻訳コンテキストは、指定されたファイルに対して

pragma Translator: ChosenContext

または

pragma Translator: "Chosen::Context"

qsTranslate() で設定されたコンテキストはpragma Translator で設定されたコンテキストよりも優先されます。QMLのデフォルトでは、翻訳コンテキストはファイル名です。

C++:tr()を使う

C++では、tr ()関数を使用して、テキストを翻訳可能なものとしてマークし、翻訳されたテキストを表示します。翻訳コンテキストは、文字列が使用されているQObject のサブクラスの名前です。新しいQObject ベースのクラス用に翻訳コンテキストを定義するには、各新規クラス定義でQ_OBJECT マクロを使用します。

tr() が呼び出されると、QTranslator オブジェクトを使って翻訳可能な文字列を検索します。 オブジェクトは、「翻訳の有効化」で説明したように、アプリケーション・オブジェクトにインストールする必要があります。

例えば、LoginWidgetQWidget のサブクラスであるとします:

LoginWidget::LoginWidget()
{
    QLabel *label = new QLabel(tr("Password:"));
    ...
}

これは、ユーザが目にする文字列の99%を占めています。文字列リテラルを翻訳可能にする方法については、翻訳可能なデータ文字列をマークするを参照してください。

引用テキストがQObject サブクラスのメンバ関数にない場合は、適切なクラスのtr() 関数、またはQCoreApplication::translate() 関数を直接使用してください:

void some_global_function(LoginWidget *logwid)
{
    QLabel *label = new QLabel(
                LoginWidget::tr("Password:"), logwid);
}

void same_global_function(LoginWidget *logwid)
{
    QLabel *label = new QLabel(
                QCoreApplication::translate("LoginWidget", "Password:"), logwid);
}

注意: QT_NO_CAST_FROM_ASCII マクロを定義してアプリケーションをコンパイルし、const char * からQString への自動変換を無効にすると、ほとんどの場合、不足している文字列をキャッチできます。詳しくはQString::fromUtf8() とQString::fromLatin1() を参照してください。

文字列を連結する代わりにパラメータを使う

そのため、単語とデータを連結して文字列を作成しないでください。代わりに、% を使って文字列にパラメータを挿入します。

たとえば、After processing file %1, file %2 is next in line という文字列では、%1%2 が番号付きのパラメータです。実行時には、%1%2 が、それぞれ1番目と2番目のファイル名に置き換えられる。同じ番号のパラメータが翻訳にも現れる必要がありますが、必ずしも同じ順序である必要はありません。ドイツ語訳の文字列では、フレーズが逆になるかもしれない。例えば、Datei %2 wird bearbeitet, wenn Datei %1 fertig ist 。どちらの番号のパラメータも翻訳文に現れますが、順序は逆です。

QML: .arg()を使う

次のQMLスニペットは、%1%2 という2つの数字パラメータを持つ文字列です。これらのパラメータは.arg() 関数で挿入されます。

Text {
    text: qsTr("File %1 of %2").arg(counter).arg(total)
}

%1 は最初のパラメーターを指し、 は2番目のパラメーターを指すので、このコードは次のような出力を生成します:%2 ファイル2の3

C++:QString::arg()を使用する。

C++では、QString::arg ()関数を使用してパラメータを代入します:

void FileCopier::showProgress(int done, int total,
                              const QString &currentFile)
{
    label.setText(tr("%1 of %2 files copied.\nCopying: %3")
                  .arg(done)
                  .arg(total)
                  .arg(currentFile));
}

このコードは次のような出力を生成する:10ファイル中5ファイルがコピーされました。コピー:somefile.txt

複数形の処理

翻訳関数に追加の整数パラメータ(n)を渡して、翻訳可能な文字列の複数形(%n )に特別な表記を使うことができます。

n の値に応じて、翻訳関数はターゲット言語の正しい文法番号で、異なる翻訳を返します。また、%nn の値に置き換えられます。

例えば、%n message(s) saved という文字列の英語とフランス語の翻訳では、異なる複数形が必要です。

n翻訳なしフランス語英語
0"保存された0件のメッセージ""0 メッセージ保存""保存されたメッセージ0件"
1"1 メッセージ保存""1 メッセージ保存""1メッセージ保存"
2"2 メッセージ保存""2メッセージ 保存""2メッセージ保存"
37「37件のメッセージ保存"37件のメッセージ 保存""37通のメッセージが保存された"

このイディオムは、二重形など複数の複数形を持つターゲット言語でも機能する。さらに、このイディオムは、フランス語のように単数形を必要とする言語の場合、n == 0 を正しく処理します。

Qt Linguist とlrelease が複数形を含む文字列の翻訳に使用するルールの概要については、複数形の翻訳ルールを参照してください。

母国語で複数形を扱うには、その言語のTSファイルもロードしてください。複数形のエントリだけを含むTSファイルを作成するには、lupdate ツール-pluralonly コマンドラインオプションを使用します。

また、lconvert ツールの-pluralonly コマンドラインオプションを使用すると、既存の TS ファイルから複数形以外の形式をすべて削除できます。

QMLの例

次の QML コード・スニペットは、ソース・テキストを正しい複数形に変換し、%ntotal の値に置き換えます:

Text {
    text: qsTr("%n message(s) saved", "", total)
}

C++の例

次の C++ コード・スニペットは、%ncount() 関数が返す値に置き換えます:

int n = messages.count();
showMessage(tr("%n message(s) saved", "", n));

地域番号設定を使用

パラメータを指定する際に%L 修飾子を含めると、その番号は現在の地域設定に従ってローカライズされます。デフォルトのロケールが設定されている場合はそのロケールが、そうでない場合はシステム全体のロケールが変換に使われます。

QML: %Lを使う

例えば、次の QML スニペットでは、%L1 は現在選択されているロケール(地域)の数値書式規則に従って最初のパラメータを書式化します:

Text {
    text: qsTr("%L1").arg(total)
}

total4321.56 の場合、英語の地域設定(ロケール)では4,321.56 となり、ドイツの地域設定では4.321,56 となります。

C++:Lnを使用

C++ では、%Ln を使用して、n の地域化表現を生成することができます。 デフォルトのロケールを設定するには、QLocale::setDefault() を使用します。

日付、時刻、通貨の国際化

日付、時刻、通貨を、現地で好まれるフォーマットで表示します。

QML: QtQml関数を使う

QMLには、日付や時刻をフォーマットするための特別な文字列修飾子がありません。代わりに、現在のロケール(地理的な地域)を問い合わせ、Date のメソッドを使って文字列をフォーマットする必要があります。

Qt.locale() はロケールに関する情報を含む オブジェクトを返します。特に プロパティには、現在のロケールの言語と国が含まれています。この値をそのまま使用することもできますし、解析して現在のロケールに適した内容を決定することもできます。Locale Locale.name

次のスニペットは、Date() で現在の日付と時刻を取得し、それを現在のロケール用の文字列に変換します。そして、その日付文字列を%1 パラメータに挿入し、適切な翻訳を行います。

Text {
    text: qsTr("Date %1").arg(Date().toLocaleString(Qt.locale()))
}

通貨番号をローカライズするには、Number を使用します。この型には、数値をローカライズされた通貨文字列に変換するためのDate 型と同様の機能があります。

C++:QLocale クラスの使用

C++ では、QLocale::timeFormat() またはQLocale::toString(QTime) またはtoString(QDate) を使用します:

QLabel *label = new QLabel(this);
label->setText(tr("Date %1").arg(QLocale().toString(QDate::currentDate()));

翻訳可能なデータ文字列をマークする

_NoOp 関数(QML)と_NOOP マクロ(C++)を使用して、lupdate ツールによる抽出のために、翻訳可能な文字列リテラルをマークします。

QML: _NOOP 関数の使用

QMLでは、翻訳可能な文字列リテラルをマークするために以下の関数を使用します:

ユーザが再起動せずにシステムの言語を変更した場合、システムによっては、 配列やリストモデルなどのデータ構造内の文字列が自動的に更新されないことがあります。テキストがUIに表示されるときに強制的にリフレッシュするには、QT_TR_NOOP() 関数で文字列を宣言する必要があります。そして、オブジェクトを表示するために入力するときに、各テキストの翻訳を明示的に取得する必要があります。

例えば

ListModel {
    id: myListModel

    ListElement {
        //: Capital city of Finland
        name: QT_TR_NOOP("Helsinki")
    }
}

...

Text {
    text: qsTr(myListModel.get(0).name)
    // Get the translation of the name property in element 0
}

C++:NOOPマクロの使用

関数の外で完全に翻訳可能なテキストには、QT_TR_NOOP ()とQT_TRANSLATE_NOOP ()マクロを使用します。 ()と ()マクロは、コンテキストなしでテキストだけを展開します。

QT_TR_NOOP() の例:

QString FriendlyConversation::greeting(int type)
{
    static const char *greeting_strings[] = {
        QT_TR_NOOP("Hello"),
        QT_TR_NOOP("Goodbye")
    };
    return tr(greeting_strings[type]);
}

QT_TRANSLATE_NOOP() の例:

static const char *greeting_strings[] = {
    QT_TRANSLATE_NOOP("FriendlyConversation", "Hello"),
    QT_TRANSLATE_NOOP("FriendlyConversation", "Goodbye")
};

QString FriendlyConversation::greeting(int type)
{
    return tr(greeting_strings[type]);
}

QString global_greeting(int type)
{
    return QCoreApplication::translate("FriendlyConversation",
                                       greeting_strings[type]);
}

翻訳者のためのコメントの追加

翻訳可能としてマークした文字列の前に、その目的を明確にするためのコメントをソースコードに追加することができます。コメントは翻訳者に渡すTSファイルに含まれます。

注: TSファイルは、ソーステキストと翻訳済みテキストの場所を含むXMLファイルです。更新されたTSファイルはバイナリの翻訳ファイルに変換され、最終的なアプリケーションの一部として含まれます。

QML: //: と //~ を使う

次のコードスニペットでは、//: 行のテキストが翻訳者のメインコメントです。

//~ 行のテキストはオプションの追加情報です。テキストの最初の単語は、TSファイルのXML要素の追加識別子として使用されるので、最初の単語が文の一部でないことを確認してください。たとえば、コメントContext Not related to back-steppingは、TS ファイルでは<extra-Context>Not related to back-stepping に変換されます。

Text {
    id: txt1;
    // This UI string is only used here
    //: The back of the object, not the front
    //~ Context Not related to back-stepping
    text: qsTr("Back");
}

C++:コメント文字を使用する

C++でコメントを追加するには、コード内のtr() 呼び出しに、//: 形式のコメントを付けるか、コメントの最初と最後に印を付けます。

以下の例では、コメントは各呼び出しのコンテキストでtr() に渡される文字列に関連付けられています:

//: This name refers to a host name.
hostNameLabel->setText(tr("Name:"));

/*: This text refers to a C++ code example. */
QString example = tr("Example");

オプションのコメントを追加するには

//~ <field name> <field contents>

フィールド名は、ドメイン接頭辞(おそらく、そのフィールドがインスパイアされたファイル形式の従来のファイル拡張子)、ハイフン、アンダースコア区切りの実際のフィールド名で構成されるべきである。TSファイルに格納する場合、フィールド名は接頭辞extra- とともにXML要素名を形成する。フィールドの内容はXMLエスケープされますが、それ以外は要素の内容としてそのまま表示されます。各メッセージにユニークなフィールドをいくつでも追加できます。

//: This is a comment for the translator.
//= qtn_foo_bar
//~ loc-layout_id foo_dialog
//~ loc-blank False
//~ magic-stuff This might mean something magic.
QString text = MyMagicClass::tr("Sim sala bim.");

C++ では、等号を使用して一意の識別子を追加します:

//= <id>

トランスレータ・コメントにはキーワードTRANSLATORを使用できます。TRANSLATOR キーワードの直前に現れるメタデータは、TS ファイル全体に適用されます。

同一テキストの曖昧性解消

翻訳システムは、同じテキストを何度も翻訳する必要がないように、UIのテキスト文字列を一意のアイテムに統合します。しかし、あるテキストが別のテキストと同じように見えても、意味が異なる場合があります。例えば、英語ではbackは一歩後ろに下がるという意味と、物体の正面と反対側の部分を意味します。翻訳者が2つの翻訳を作成できるように、この2つの異なる意味を翻訳システムに伝える必要があります。

QML:qsTr()に曖昧さ除去機能を追加する

QMLでは、qsTr() 関数の2番目のパラメータとして、曖昧性解消文字列を追加します。

以下のコード・スニペットでは、IDnot front 、このBackテキストをバックステップのBackテキストと区別しています:

Text {
    id: txt1
    // This UI string is used only here
    //: The back of the object, not the front
    //~ Context Not related to back-stepping
    text: qsTr("Back", "not front")
}

C++:tr()に曖昧さ回避を追加する

C++では、tr ()の呼び出しに曖昧さ除去文字列を渡します。

以下のコード・スニペットでは、IDrecipient 、受信者の名前と送信者の名前を区別している:

MyWindow::MyWindow()
{
    QLabel *senderLabel = new QLabel(tr("Name:"));
    QLabel *recipientLabel = new QLabel(tr("Name:", "recipient"));
    ...

キーボードショートカットを翻訳可能にする

最も一般的な形として、キーボード・ショートカットは、あるアクションを実行するために押すキーの組み合わせを表します。standard shortcuts の場合、標準キーを使用して、各ショートカットに関連するプラットフォーム固有のキーシーケンスを要求します。

カスタム・ショートカットの場合は、Ctrl+Qや Alt+Fのような人間が読める文字列を使用します。異なる言語を話す人のために、適切なショートカットに翻訳することができます。

アプリケーションにキーボードショートカットをハードコーディングした場合、トランスレータはそれを上書きすることはできません。

メニュー項目やボタンのテキストでキーボードショートカットを使用する場合、ニーモニック文字(下線でマークされている)は、下線文字でAltまたはCtrlを押すと、メニュー項目をクリックしたりボタンを押したりするのと同じ動作が実行されることを示します。

例えば、アプリケーションはFile メニューのニモニック文字としてF をよく使います。従って、メニュー項目をクリックするか、Alt+Fを押してメニューを開くことができます。翻訳可能な文字列("File")にニーモニック文字を定義するには、その前にアンパサンドを付けます:"&File" 。その文字列の翻訳文にもアンパサンドをつけてください。

QMLの例

QMLでは

Menu {
    id: fileMenu
    title: qsTr("&File")

    MenuItem {
        objectName: "quitMenuItem"
        text: qsTr("E&xit")
        onTriggered: Qt.quit()
    }
}

C++:QKeySequenceクラスを使う

C++では、QActionQKeySequence オブジェクトを使って、アクションのトリガーとなるキーボードショートカットを指定します:

exitAct = new QAction(tr("E&xit"), this);
exitAct->setShortcuts(QKeySequence::Quit);

キーボードショートカットの翻訳は、QShortcut コンテキストに関連付けられます。

ロケールを使ってローカライズ機能を拡張する

ロケールを使ってローカライズ機能を拡張しましょう。

一般的に、画像のローカライズは避けましょう。ローカルなダジャレや引き伸ばされた比喩に頼るのではなく、グローバルに適切なアイコンを作りましょう。ただし、アラビア語やヘブライ語のロケールでは、左向きと右向きの矢印の画像を逆にしなければならないかもしれません。

ロケールはデフォルトのファイルセレクタの1つなので、システムロケールに応じてリソースとして配信する画像を変えて表示するためにファイルセレクションを使うことができます。

以下のQMLとC++のコード例では、アプリケーションリソースに以下のファイルを配信し、サブフォルダ名に言語コードと国コードを使用することを想定しています:

images
├── language-icon.png
├── +en_GB
│   └── language-icon.png
└── +fi_FI
    └── language-icon.png

QML: 画像ソースの設定

次のQMLコード例は、現在のロケールに従ってアイコンのソース画像を選択する方法を示しています:

icon.source: "qrc:/images/language-icon.png"

C++:QFileSelectorの使用

次の C++ コード スニペットは、QFileSelector を使用して、システム ロケールに従ってimages フォルダから言語アイコンを選択します:

const QFileSelector selector;
const QIcon languageIcon(selector.select(":/images/language-icon.png"));

翻訳を有効にする

TSファイル名には、ISO言語コードと国コードを含める必要があります:

  • languageは ISO-639言語コードを小文字で表します。
  • languageは小文字のISO-639言語コード、countryは大文字のISO-31662文字の国コードです。

たとえば、qml_de.ts はターゲット言語をドイツ語に設定し、qml_de_CH.ts はターゲット言語をドイツ語、ターゲット国をスイスに設定します。lrelease ツールはqml_de.qmqml_de_CH.qm という QM ファイルを生成し、システムロケールに応じてアプリケーションがロードします。

QML:QQmlApplicationEngineを使う

QML では、QQmlApplicationEngine を使って、メインの QML ファイルを含むディレクトリのi18n というサブディレクトリから翻訳ファイルを自動的に読み込みます。翻訳ファイル名にはqml_ という接頭辞が必要です。例えば、qml_en_US.qm

QJSEngine::uiLanguage またはQt.uiLanguage プロパティの値が変更されると、アプリケーションは翻訳を再読み込みします。

C++:QTranslator を使う

C++ では、TS ファイル名にはアプリケーション名を含める必要があります。例えば、app_de_DE.ts

通常、Qt C++ アプリケーションのmain() 関数は次のようになります:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QTranslator myappTranslator;
    if (myappTranslator.load(QLocale::system(), u"myapp"_s, u"_"_s, u":/i18n"_s))
        app.installTranslator(&myappTranslator);

    return app.exec();
}

翻訳対応アプリケーションの場合、QTranslator オブジェクトを作成し、load 実行時にユーザーの UI 表示ロケールに従って翻訳を行い、トランスレータオブジェクトをアプリケーションにインストールします。

動的な言語変更の準備

Qt Widgets と Qt Quick の両方は、Qt のイベントシステムを使用して、翻訳変更をクラスに通知します。

LanguageChange イベントは、 () 関数を使用して新しい翻訳をインストールしたときに通知されます。他のアプリケーションコンポーネントは、ウィジェットや タイプから派生した QML タイプに イベントをポストすることで、ウィジェットやQML タイプの更新を強制することができます。QCoreApplication::installTranslator Item LanguageChange

デフォルトでは、LanguageChange イベントはすべてのトップレベルウィンドウに伝搬され、そこから、Item から派生したウィジェットや QML タイプのツリー全体に伝搬されます。

QtウィジェットではchangeEvent をオーバーライドする

QWidget サブクラスのデフォルトのイベントハンドラはQEvent::LanguageChange イベントに応答し、必要に応じてchangeEvent() 関数を呼び出します。

インストールされているQTranslator オブジェクトの変更を Qt ウィジェットに認識させるには、ウィジェットのchangeEvent() 関数を再実装して、イベントがLanguageChange イベントであるかどうかをチェックし、tr() 関数を使用してウィジェットが表示するテキストを更新します。例えば

void MyWidget::changeEvent(QEvent *event)
{
    if (event->type() == QEvent::LanguageChange) {
        titleLabel->setText(tr("Document Title"));
        ...
        okPushButton->setText(tr("&OK"));
    } else
        QWidget::changeEvent(event);
}

Qt Widgets Designer UI ファイル (.ui) とuic を使用する場合、新しい翻訳ファイルを読み込んでui.retranslateUi(this) を直接呼び出すことができます:

void MyWidget::changeEvent(QEvent *event)
{
    if (event->type() == QEvent::LanguageChange) {
        ui.retranslateUi(this);
    } else
        QWidget::changeEvent(event);
}

他の変更イベントを渡すには、関数のデフォルト実装を呼び出します。

その他の変更イベントを渡すには、デフォルトの実装を呼び出します。LocaleChange イベントに応じてインストールされているトランスレータのリストが変更されたり、ユーザーが現在のアプリケーションの言語を変更できる UI が提供されたりします。

QML:Itemから派生した型のOverrideイベント

C++のカスタム型が登録されていないプレーンなQMLアプリケーションでは、QQmlApplicationEngineを使用するだけで、すべての翻訳バインディングの更新をトリガーすることができます。

しかし、QQuickItem から派生した型を登録し、そのプロパティの1つが翻訳されたテキストを公開している(あるいは、言語に依存している)場合は、event method をオーバーライドし、そのプロパティの変更シグナルを発信してください(バインド可能なプロパティの場合は、notify を呼び出してください)。例えば

class MyItem : public QQuickItem
{
    Q_OJBECT
    QML_ELEMENT

    Q_PROPERTY(QString greeting READ greeting NOTIFY greetingChanged)

public signals:
    void greetingChanged();
public:
    QString greeting() const
    {
        return tr("Hello World!");
    }

    bool event(QEvent *ev) override
    {
        if (ev->type() == QEvent::LanguageChange)
            emit greetingChanged();
        return QQuickItem::event(ev);
    }
};

これにより、そのプロパティが使用されているQMLのバインディングが再評価され、言語の変更が考慮されるようになります。

一般的な QObject 派生クラス:イベントフィルタの使用

クラスによっては、QWidgetQQuickItem から派生したものではありませんが、言語変更イベントを処理する必要があるかもしれません。そのような場合は、QCoreApplicationイベント・フィルターをインストールしてください。

class CustomObject : public QObject
{
    Q_OBJECT

public:
    QList<QQuickItem *> managedItems;

    CustomObject(QOject *parent = nullptr) : QObject(parent)
    {
        QCoreApplication::instance()->installEventFilter(this);
    }

    bool eventFilter(QObject *obj, QEvent *ev) override
    {
        if (obj == QCoreApplication::instance() && ev->type() == QEvent::LanguageChange) {
            for (auto item : std::as_const(managedItems))
                QCoreApplication::sendEvent(item, ev);
            // do any further work on reaction, e.g. emit changed signals
        }
        return false;
    }
};

これは、翻訳された文字列がクラスによって提供され、その文字列が後でユーザー・インタフェース(たとえば、カスタムitem model )に表示される場合、またはクラスがウィジェットやクイック・アイテムのコンテナとして動作し、したがってイベントをそれらに転送する責任がある場合に必要になることがあります。

C++ コードに関するその他の注意事項

以下のセクションでは、翻訳可能なアプリケーションで Qt C++ クラスと関数を使用する際の詳細について説明します:

すべてのユーザー可視テキストに QString を使用する

QString は内部的にUnicodeエンコーディングを使用しているため、使い慣れたテキスト処理操作を使用して世界中のすべての言語を透過的に処理できます。また、ユーザーにテキストを表示するすべての Qt 関数は、 オブジェクトをパラメータとして受け取るので、 から への変換オーバーヘッドはありません。QString char * QString

翻訳コンテキストの定義

QObject およびQObject の各サブクラスの翻訳コンテキストは、クラス名そのものです。QObject をサブクラス化する場合は、クラス定義のQ_OBJECT マクロを使用して、変換コンテキストをオーバーライドします。このマクロは、コンテキストをサブクラスの名前に設定します。

例えば、以下のクラス定義にはQ_OBJECT マクロが含まれており、MainWindow コンテキストを使用する新しいtr() 関数を実装しています:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();
    ...

クラス定義でQ_OBJECT を使用しない場合、コンテキストはベース・クラスから継承されます。たとえば、Qt のすべてのQObject ベースのクラスはコンテキストを提供するので、Q_OBJECT マクロなしで定義された新しいQWidget サブクラスは、そのtr() 関数を呼び出すと、QWidget コンテキストを使用します。

Qt 以外のクラスの翻訳

QObject を継承していないクラスや、Q_OBJECT マクロを使用していないクラスの文字列については、lupdate に特別な情報を提供する必要があります。非 Qt クラスに翻訳サポートを追加するには、Q_DECLARE_TR_FUNCTIONS() マクロを使用します。例えば

class MyClass
{
    Q_DECLARE_TR_FUNCTIONS(MyClass)

public:
    MyClass();
    ...
};

これにより、クラスに関連付けられた文字列を翻訳するために使用できるtr() 関数がクラスに提供され、lupdate がソースコード内で翻訳可能な文字列を検索できるようになります。

あるいは、lupdate と Qt Linguist が認識する特定のコンテキストでQCoreApplication::translate() 関数を呼び出すこともできます。

QObject サブクラスの外にあるテキストの翻訳

引用テキストがQObject サブクラスのメンバ関数内にない場合は、適切なクラスのtr() 関数か、QCoreApplication::translate() 関数を直接使用してください:

void some_global_function(LoginWidget *logwid)
{
    QLabel *label = new QLabel(
            LoginWidget::tr("Password:"), logwid);
}

void same_global_function(LoginWidget *logwid)
{
    QLabel *label = new QLabel(
            QCoreApplication::translate("LoginWidget", "Password:"),
            logwid);
}

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