Trollの印刷例
今後のリリースに向けた翻訳の更新。
Troll Printは、ユーザーがプリンタ設定を選択できるサンプルアプリケーションです。英語版とポルトガル語版の2つのバージョンがあります。

このサンプル用のポルトガル語訳をいくつか含む翻訳ファイル `trollprint_pt.ts` を同梱しています。
ここでは、同じアプリケーションの2つのリリース、Troll Print 1.0と1.1について検討します。あるリリース用に作成された翻訳を、次のリリースで再利用する方法について学びます。(このチュートリアルでは、いくつかのソースファイルを編集する必要があります。すべてのファイルを新しい一時ディレクトリにコピーし、そこで作業を行うのがおそらく最善でしょう。)
Qt アプリケーションの翻訳に関する詳細については、『Qt Linguist マニュアル』を参照してください。
行ごとの解説
PrintPanel クラスは、printpanel.h に定義されています。
class PrintPanel : public QWidget
{
Q_OBJECTPrintPanel は `QWidget` です。tr() が正しく動作するには、Q_OBJECT マクロが必要です。
実装ファイルは `printpanel.cpp` です。
PrintPanel::PrintPanel(QWidget *parent)
: QWidget(parent)
{
/*
QLabel *label = new QLabel(tr("<b>TROLL PRINT</b>"));
label->setAlignment(Qt::AlignCenter);
*/Troll Print 1.0 では、コードの一部がコメントアウトされています。Troll Print 1.1 に向けて、後でこれらのコメントを解除することになります。
twoSidedGroupBox = new QGroupBox(tr("2-sided"));
twoSidedEnabledRadio = new QRadioButton(tr("Enabled"));
twoSidedDisabledRadio = new QRadioButton(tr("Disabled"));
twoSidedDisabledRadio->setChecked(true);
colorsGroupBox = new QGroupBox(tr("Colors"));
colorsEnabledRadio = new QRadioButton(tr("Enabled"));
colorsDisabledRadio = new QRadioButton(tr("Disabled"));PrintPanel 内でtr("Enabled") とtr("Disabled") がそれぞれ 2 回ずつ出現している点に注意してください。同じ文脈に「Enabled」と「Disabled」の両方が現れるため Qt Linguist は、それぞれ1箇所のみを表示し、表示されない重複部分には同じ翻訳を使用します。これは時間の節約になる便利な機能ですが、ポルトガル語などの一部の言語では、2つ目の箇所には別の翻訳が必要です。 Qt Linguist すべての出現箇所を表示させ、個別に翻訳できるようにする方法を後ほど見ていきます。
MainWindow のヘッダーファイル(mainwindow.h )には、特に驚くような点はありません。実装ファイル(mainwindow.cpp )には、翻訳対象としてマークする必要がある、ユーザーに表示されるソーステキストがいくつかあります。
setWindowTitle(tr("Troll Print %1").arg(version));ウィンドウのタイトルを翻訳する必要があります。
void MainWindow::createActions()
{
exitAct = new QAction(tr("E&xit"), this);
exitAct->setShortcut(tr("Ctrl+Q", "Quit"));
connect(exitAct, &QAction::triggered, this, &MainWindow::close);
aboutAct = new QAction(tr("&About"), this);
aboutAct->setShortcut(Qt::Key_F1);
connect(aboutAct, &QAction::triggered, this, &MainWindow::about);
aboutQtAct = new QAction(tr("About &Qt"), this);
connect(aboutQtAct, &QAction::triggered, qApp, &QApplication::aboutQt);
}
void MainWindow::createMenus()
{
QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(exitAct);
menuBar()->addSeparator();
QMenu *helpMenu = menuBar()->addMenu(tr("&Help"));
helpMenu->addAction(aboutAct);
helpMenu->addAction(aboutQtAct);
}また、アクションやメニューも翻訳する必要があります。なお、tr() の2引数形式はキーボードショートカット「Ctrl+Q」に使用されています。これは、2番目の引数が、そのショートカットがどの関数を実行するかを翻訳者が判断するための唯一の手がかりとなるためです。
QTranslator translator;
if (translator.load(locale, u"trollprint"_s, u"_"_s))
app.installTranslator(&translator);main.cpp にあるmain() 関数は、Arrow Padの例にあるものと同じです。具体的には、現在のロケールに基づいて翻訳ファイルを選択します。
Troll Print 1.0 を英語とポルトガル語で実行する
提供されているtrollprint_pt.ts ファイル内の翻訳を使用します。
LANG 環境変数をpt に設定し、trollprint を実行してください。まだ英語版が表示されるはずです。次に、lrelease (例:lrelease trollprint.pro )を実行してから、サンプルを再度実行してください。これでポルトガル語版(Troll Imprimir 1.0)が表示されるはずです:

翻訳は正しく表示されているように見えますが、実際には誤りです。正しいポルトガル語では、2番目に現れる「Enabled」は「Ativadas」であるべきで、「Ativado」ではありません。また、「Disabled」の2番目の翻訳の語尾も同様に変更する必要があります。
trollprint_pt.ts を Qt Linguistでxml-ph-0000@deepl.internalを開くと、ソースコードには「Enabled」と「Disabled」がそれぞれ2回ずつあるにもかかわらず、翻訳ソースファイル内ではそれぞれ1回しか出現していないことがわかります。これは、 Qt Linguist は、重複するソーステキストに対して同じ翻訳を使用することで、翻訳者の作業を最小限に抑えようとするからです。このような場合、同一の翻訳が誤っているときは、プログラマーが重複する箇所を区別する必要があります。これは、tr() の2引数形式を使用することで簡単に実現できます。
どのファイルを変更すべきかは簡単に特定できます。というのも、翻訳者の「コンテキスト」は、実際には変更が必要なテキストが含まれるクラスのクラス名そのものだからです。この場合、変更すべきファイルはprintpanel.cpp であり、変更すべき行は4行あります。最初のラジオボタンのペアに対応するtr() の呼び出しに、2番目の引数「two-sided」を追加し、
twoSidedEnabledRadio = new QRadioButton(tr("Enabled", "two-sided"));
twoSidedDisabledRadio = new QRadioButton(tr("Disabled", "two-sided"));また、2番目のラジオボタンのペアに対応するtr() の呼び出し箇所に、2番目の引数「colors」を追加してください:
colorsEnabledRadio = new QRadioButton(tr("Enabled", "colors"), colors);
colorsDisabledRadio = new QRadioButton(tr("Disabled", "colors"), colors);次に、再コンパイルを行い、lupdate を実行し、以下のコマンドでtrollprint_pt.ts を開いてください: Qt Linguistでxml-ph-0001@deepl.internalを開いてください。これで2つの変更点が見られるはずです。
まず、翻訳ソースファイルに「Enabled」「Disabled」のペアが3つ含まれるようになりました。最初のペアには「(obs.)」というマークが付いており、これはそれらが廃止されたことを意味します。これは、これらのテキストが、2つの引数を持つ新しい呼び出しに置き換えられたtr() の呼び出しに含まれていたためです。 2番目のペアには「two-sided」というコメントが、3番目のペアには「colors」というコメントが付いています。これらのコメントは、Source text and comments の領域に表示されます Qt Linguistに表示されます。
次に、翻訳テキスト「Ativado」と「Desativado」が、新しいテキスト「Enabled」および「Disabled」の翻訳として自動的に使用されています。これもまた、翻訳者の作業を最小限に抑えるためです。もちろん、この場合、各単語の2回目の出現箇所ではこれらは正しくありませんが、良い出発点となります。
2番目の「Ativado」を「Ativadas」に、2番目の「Desativado」を「Desativadas」に変更し、保存して終了します。lrelease を実行して最新のバイナリtrollprint_pt.qm ファイルを取得し、Troll Print(正確にはTroll Imprimir)を実行します。

tr() の2番目の引数は、 Qt Linguist、同じ文脈(クラス)内で出現する同一のソーステキストを区別するために使用されます。これらは、翻訳者に手がかりを与えるためにも他の場面で有用であり、Ctrl キーのショートカットの場合、そのショートカットが実行する機能を翻訳者に伝える唯一の手段となります。
翻訳者を支援するもう一つの方法は、翻訳すべきソーステキストが含まれているアプリケーションの特定の部分へどのように移動するかという情報を提供することです。これにより、翻訳者が翻訳文が表示される文脈を把握しやすくなり、翻訳箇所を見つけたりテストしたりするのにも役立ちます。これは、ソースコード内でTRANSLATOR コメントを使用することで実現できます:
/*
TRANSLATOR MainWindow
In this application the whole application is a MainWindow.
Choose Help|About from the menu bar to see some text
belonging to MainWindow.
...
*/いくつかのソースファイル、特にダイアログクラスに、ダイアログに到達するために必要なナビゲーション手順を記述したこれらのコメントを追加してみてください。また、サンプルファイルに追加することもできます。例えば、mainwindow.cpp やprintpanel.cpp といったファイルが適しています。lupdate を実行し、その後 Qt Linguist を起動し、trollprint_pt.ts を読み込んでください。ソーステキストのリストを閲覧すると、Source text and comments エリアにコメントが表示されるはずです。
特に大規模なプログラムの場合、翻訳者が自分の翻訳箇所を見つけたり、それが正しいかを確認したりするのが難しいことがあります。ナビゲーションに役立つ情報を提供するコメントがあれば、翻訳者の時間を節約できます:
/*
TRANSLATOR ZClientErrorDialog
Choose Client|Edit to reach the Client Edit dialog, then choose
Client Specification from the drop down list at the top and pick
client Bartel Leendert van der Waerden. Now check the Profile
checkbox and then click the Start Processing button. You should
now see a pop up window with the text "Error: Name too long!".
This window is a ZClientErrorDialog.
*/Troll Print 1.1
それでは、Troll Print のリリース 1.1 を準備しましょう。お好みのテキストエディタを起動し、以下の手順に従ってください:
printpanel.cppファイル内で、「<b>TROLL PRINT</b>」というテキストを含むQLabel を生成する2行のコメントを解除してください。- 表現の修正:
printpanel.cpp内の「2-sided」を「Two-sided」に置き換えてください。 mainwindow.cpp内の「1.0」をすべて「1.1」に置き換えてください。mainwindow.cpp内の著作権年を 1999-2000 に更新する。
(もちろん、実際のアプリケーションでは、バージョン番号や著作権の年は定数や #define で定義されるでしょう。)
完了したら、lupdate を実行し、trollprint_pt.ts を Qt Linguistでxml-ph-0001@deepl.internalを開きます。以下の項目が特に注目すべき点です:
PrintPanel- 2-sided - 「(obs.)」とマークされており、廃止済み
- <b>TROLL PRINT</b> — マークなし、つまり未翻訳
- 両面印刷 - マークなし、つまり翻訳されていない。
修正を容易にするため、tr("Troll Print 1.0") の代わりに tr("Troll Print %1").arg("1.0") などを使用すると、リリースごとに文字列を更新する手間を省くことができます。
MainWindow 内の翻訳を確認し、これらを「完了」としてマークしてください。 "<b>TROLL PRINT</b>" を "<b>TROLL IMPRIMIR</b>" と翻訳してください。「Two-sided」を翻訳する際は、Guess Again ボタンを押して「Two-sided」を翻訳しますが、「2」を「Dois」に変更してください。
保存して終了し、lrelease を実行してください。ポルトガル語版は次のようになるはずです:

「Ajuda|Sobre 」(Help|About )を選択して、バージョン情報ボックスを表示してください。
Ajuda|Sobre Qt (Help|About Qt )を選択すると、英語のダイアログが表示されます。おっと! Qt自体も翻訳する必要があります。詳細については、「Qtによる国際化」を参照してください。
次に、LANG=en を設定して、元の英語版を表示します:

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