アローパッドの例

Qt Linguist コンテキストの概念を理解し、2つ以上の言語を使う。

ここではフランス語とオランダ語の2つの翻訳を使用しますが、アプリケーションで使用できる翻訳の数に制限はありません。

qmakeを使用する場合、arrowpad.pro

HEADERS      = arrowpad.h \
               mainwindow.h
SOURCES      = arrowpad.cpp \
               main.cpp \
               mainwindow.cpp

TRANSLATIONS = arrowpad_fr.ts \
               arrowpad_nl.ts

CMakeを使用する場合、CMakeLists.txt の該当行は次のとおりです:

find_package(Qt6 REQUIRED COMPONENTS LinguistTools)

qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES fr nl)

qt6_add_translations(arrowpad
    QM_FILES_OUTPUT_VARIABLE qm_files)
install(FILES ${qm_files} DESTINATION ${INSTALL_EXAMPLEDIR})

lupdate を実行してください。これは、2つの同じメッセージファイルarrowpad_fr.tsarrowpad_nl.ts を生成するはずです。これらのファイルには、tr() 呼び出しで翻訳用にマークされたすべてのソーステキストとそのコンテキストが含まれます。

qmake を使う場合は、lupdate を手動で実行する必要があります:

lupdate arrowpad.pro

CMake を使用する場合は、lupdate を実行するためにupdate_translations ターゲットをビルドします:

cmake --build . --target update_translations

Qt アプリケーションの翻訳の詳細については、Qt Linguist マニュアルを参照してください。

行ごとのチュートリアル

arrowpad.h では、QWidget のサブクラスであるArrowPad サブクラスを定義しています。上のスクリーンショットでは、4つのボタンがある中央のウィジェットがArrowPad です。

class ArrowPad : public QWidget
{
    Q_OBJECT

lupdate を実行すると、ソース・テキストが抽出されるだけでなく、コンテキストにグループ化されます。コンテキストとは、ソース・テキストが表示されるクラスの名前です。したがって、この例では、"ArrowPad" がコンテキストです。これは、ArrowPad クラスのテキストのコンテキストです。Q_OBJECT マクロはArrowPadtr(x) をこのように定義します:

qApp->translate("ArrowPad", x)

各ソース・テキストがどのクラスに出現するかを知ることで、以下のことが可能になります。 Qt Linguist例えば、ダイアログ内のすべてのテキストは、ダイアログのクラス名のコンテキストを持ち、一緒に表示されます。テキストがどのようなコンテキストで表示されるかは、そのテキストがどのように翻訳されるべきかに影響する可能性があるため、これは翻訳者にとって有益な情報を提供します。翻訳によってはキーボードアクセラレータを変更する必要があり、特定のコンテキスト(クラス)のすべてのソーステキストがグループ化されていることで、翻訳者は競合を起こさずにアクセラレータの変更を簡単に行うことができます。

arrowpad.cpp では、ArrowPad クラスを実装しています。

    upButton = new QPushButton(tr("&Up"));
    downButton = new QPushButton(tr("&Down"));
    leftButton = new QPushButton(tr("&Left"));
    rightButton = new QPushButton(tr("&Right"));

ラベルはユーザーから見えるテキストなので、各ボタンのラベルに対してArrowPad::tr() を呼び出します。

class MainWindow : public QMainWindow
{
    Q_OBJECT

上のスクリーンショットでは、ウィンドウ全体がMainWindow 。これはmainwindow.h ヘッダーファイルで定義されています。ここでも、Q_OBJECT を使い、MainWindow のコンテキストになるようにしています。 Qt Linguist.

    arrowPad = new ArrowPad;

MainWindow,mainwindow.cpp の実装では、ArrowPad クラスのインスタンスを作成します。

    exitAct = new QAction(tr("E&xit"), this);
    exitAct->setShortcut(QKeySequence(tr("Ctrl+Q", "Quit")));
    connect(exitAct, &QAction::triggered, this, &MainWindow::close);

また、MainWindow::tr() を2回呼び出します。1回はアクションのため、もう1回はショートカットのためです。

他の言語の異なるキーをサポートするためにtr() 。英語のQuitには "Ctrl+Q "が適しているが、オランダ語の翻訳者は "Ctrl+A"(Afsluiten)、ドイツ語の翻訳者は "Strg+E"(Beenden)を使いたいかもしれない。Ctrl のキー・アクセラレータにtr() を使用する場合、2つの引数形式を使用し、2つ目の引数にアクセラレータが実行する機能を記述します。

我々のmain() 関数は通常通りmain.cpp で定義されている。

    QTranslator translator;
    if (translator.load(locale, u"arrowpad"_s, u"_"_s))
        app.installTranslator(&translator);

現在のロケールに応じて、使用する翻訳を選択します。QLocale::system() は、例えばLANG 環境変数を設定することで影響を受ける。.qm (およびTSファイル)のロケールを組み込んだ命名規則を使用することで、ロケールに応じて翻訳ファイルを選択することが簡単に実装できることに注意してください。

選択されたロケールに対応するQMメッセージファイルがない場合は、オリジナルの原文が使用され、エラーは発生しません。

フランス語とオランダ語への翻訳

まずはサンプルアプリケーションをフランス語に翻訳してみましょう。まず Qt Linguistarrowpad_fr.tsつのコンテキスト("ArrowPad "と "MainWindow")にグループ化された7つのソーステキスト("&Up"、"&Left "など)が得られます。

次に、以下の翻訳を入力します:

  • ArrowPad
    • 上 - &Haut
    • 左 - &Gauche
    • 右 - &Droite
    • 下 - &Bas
  • MainWindow
    • E&Exit - &Quitter
    • Ctrl+Q - Ctrl+Q
    • ファイル - &Fichier

Done & Next ボタンを押すと、翻訳が完了したことになり、次の原文に進みます。各翻訳を入力した後、このショートカット(翻訳メニューバーを参照)を使用すると、より速く翻訳できます。

ファイルを保存して、arrowpad_nl.ts でオランダ語を翻訳するときも同じようにします:

  • ArrowPad
    • 上 - オムホグ
    • 左 - リンク
    • 右 - &Rechts
    • 下 - Omlaa&g
  • MainWindow
    • E&Exit - &Afsluiten
    • Ctrl+Q - Ctrl+A
    • ファイル - &Bestand

tt1_fr.tstt1_nl.ts の翻訳ソースファイルを QM ファイルに変換する必要があります。以前のように Qt LinguistFile|Release しかし、コマンドラインツールlrelease を使えば、アプリケーションのすべてのQMファイルが確実に作成されます。 Qt Linguist.

タイプ

lrelease arrowpad.pro

とタイプする。

cmake --build . --target release_translations

これでarrowpad_fr.qmarrowpad_nl.qm の両方が作成されます。

arrowpad_fr.qm を使用するには、システム言語をフランス語に変更してください。Unixの場合、以下の2つのコマンドのどちらかが動作するはずです:

export LANG=fr
setenv LANG fr

WindowsまたはMacでは、表示言語をフランス語に設定してください。

プログラムを実行すると、フランス語版が表示されるはずです:

同じことをオランダ語でも試してください(UnixではLANG=nl )。オランダ語版が表示されるはずです:

練習問題

の中にある翻訳のひとつに印を付けてください。 Qt Linguistlupdate を実行し、次にlrelease を実行し、次に例題を実行します。この変更はどのような効果がありましたか?

LANG=fr_CA (カナダ仏語)を設定し、例題のプログラムを再度実行してください。結果がLANG=fr と同じである理由を説明してください。

オランダ語訳のアクセラレータの1つを変更して、&Bestand&Boven の間の衝突をなくしてください。

プロジェクト例 @ code.qt.io

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