矢印パッドの例

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 Manualを参照してください。

行ごとのチュートリアル

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

class ArrowPad : public QWidget
{
    Q_OBJECT

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

qApp->translate("ArrowPad", x)

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

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 ヘッダーファイルで定義されています。MainWindowQt Linguist のコンテキストになるように、ここでもQ_OBJECT を使います。

    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 Linguist を arrowpad_fr.ts で起動してください。7つの原文("&Up"、"&Left "など)が2つのコンテキスト("ArrowPad "と "MainWindow")にグループ化されているはずです。

では、以下の翻訳を入力してください:

  • 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 Linguistを使うこともできますが、コマンドラインツールlrelease を使うことで、Qt LinguistからQMファイルを個別に読み込んだり、File|Release したりする手間を省くことができます

タイプ

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 Linguistの翻訳の1つを、"done "チェックボックスのチェックを外して、"not done "としてマークしてください。lupdate 、次にlrelease 、次に例題を実行してください。この変更はどんな効果がありましたか?

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

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

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

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