トロールの印刷例

後のリリース用に翻訳を更新しています。

Troll Printは、ユーザーがプリンタの設定を選択できるサンプルアプリケーションです。2つのバージョンがあります:英語とポルトガル語の2種類があります。

翻訳ファイル(trollprint_pt.ts )には、この例のポルトガル語の翻訳が含まれています。

同じアプリケーションの2つのリリースを検討します:Troll Print 1.0と1.1です。1つのリリースで作成した翻訳を後続のリリースで再利用する方法を学びます。(このチュートリアルでは、いくつかのソースファイルを編集する必要があります。すべてのファイルを新しいテンポラリディレクトリにコピーし、そこから作業するのがベストでしょう)。

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

行ごとのチュートリアル

PrintPanel クラスはprintpanel.h で定義されています。

class PrintPanel : public QWidget
{
    Q_OBJECT

PrintPanel は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);
}

また、アクションとメニューも翻訳する必要があります。キーボード・アクセラレータ "Ctrl+Q "には、tr() の2つの引数形式が使用されていることに注意してください。2つ目の引数が、そのアクセラレータがどのような機能を実行するかを示す唯一の手がかりとなるためです。

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

main.cppmain() 関数は、アローパッドの例のものと同じです。特に、現在のロケールに基づいて翻訳ファイルを選択します。

Troll Print 1.0を英語とポルトガル語で実行する

提供されているtrollprint_pt.ts ファイルの翻訳を使用します。

環境変数LANGpt に設定し、trollprint を実行します。英語版が表示されるはずです。次にlrelease 、例えばlrelease trollprint.pro を実行し、もう一度サンプルを実行してください。今度はポルトガル語版(Troll Imprimir 1.0)が表示されるはずです:

翻訳が正しく表示されていますが、実際には間違っています。正しいポルトガル語では、"Enabled "の2番目の訳は "Ativado "ではなく、"Ativadas "であるべきで、"Disabled "の2番目の訳の語尾も同様に変更する必要があります。

Qt Linguistを使って trollprint_pt.ts を開くと、ソースコードには "Enabled "と "Disabled "がそれぞれ2つずつあるにもかかわらず、翻訳ソースファイルには "Enabled "と "Disabled "が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.tsQt Linguist で開いてください。これで2つの変化が見られるはずです。

まず、翻訳ソースファイルには3つの"Enabled", "Disabled "のペアが含まれています。最初のペアは"(obs.) "と表示され、時代遅れであることを示しています。これは、これらのテキストがtr() 、2つの引数を持つ新しい呼び出しに置き換えられたためです。2つ目のペアは「two-sided」、3つ目のペアは「colors」である。コメントはQt Linguistの Source text and comments

2つ目は、翻訳者の作業を最小限にするために、"Ativado "と "Desativado "という翻訳テキストが、新しい "Enabled "と "Disabled "テキストの翻訳として自動的に使われていることです。もちろん、この場合、各単語の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.cppprintpanel.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.
*/

トロールプリント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に更新。

(もちろん、実際のアプリケーションでは、バージョン番号と著作権年はconstまたは#definesになる)。

終了したら、lupdate を実行し、trollprint_pt.tsQt Linguist で開いてください。以下の項目は特に興味深いものです:

  • 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 を設定してください:

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

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