アローパッドの例
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.ts
とarrowpad_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
マクロはArrowPad
のtr(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.ts
とtt1_nl.ts
の翻訳ソースファイルを QM ファイルに変換する必要があります。以前のように Qt LinguistFile|Release しかし、コマンドラインツールlrelease
を使えば、アプリケーションのすべてのQMファイルが確実に作成されます。 Qt Linguist.
タイプ
lrelease arrowpad.pro
とタイプする。
cmake --build . --target release_translations
これでarrowpad_fr.qm
とarrowpad_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 の間の衝突をなくしてください。
© 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.