示例打印任务

更新后期版本翻译。

示例打印任务是允许用户选择打印设置的应用示例。它有两个版本:英语和葡萄牙语。

我们包含了一个翻译文件,trollprint_pt.ts,其中包含一些针对此示例的葡萄牙语翻译。

我们将考虑相同应用程序的两个版本:Troll Print 1.0 和 1.1。我们将学习在后续版本中重用为一次发布创建的翻译。(在本教程中,您需要编辑一些源文件。最好是将所有文件复制到新的临时目录中,并在那里工作。)

有关翻译 Qt 应用程序更多信息,请参阅Qt Linguist 用户手册

逐行分析

PrintPanel 类定义在 printpanel.h 中。

class PrintPanel : public QWidget
{
    Q_OBJECT

PrintPanel 是一个 QWidget。它需要 Q_OBJECT 宏以便 tr() 正确工作。

实现文件为 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("启用")tr("禁用") 出现。由于 "启用" 和 "禁用" 都出现在相同的上下文中,Qt Linguist 只会显示每种发生一次的实例,并且将使用它不显示的重复实例的相同翻译。虽然这可以节省时间,但在一些语言中,例如葡萄牙语,第二个出现需要单独的翻译。我们将很快看到如何使 Qt Linguist 能够分别显示所有实例以进行单独的翻译。

MainWindow 的头文件 mainwindow.h 中没有惊喜。在实现中,mainwindow.cpp,我们有一些用户可见的源文本,必须将其标记为要翻译。

    setWindowTitle(tr("Troll Print %1").arg("1.0"));

我们必须翻译窗口标题。

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() 的两个参数形式用于键盘加速器 "Ctrl+Q",因为第二个参数是翻译者能用来表明该加速器将执行什么功能的唯一线索。

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

main.cpp 中的 main() 函数与 箭头板 示例中的函数相同。特别是,它根据当前区域设置选择翻译文件。

用英语和葡萄牙语运行 Troll Print 1.0

我们将使用提供的 trollprint_pt.ts 文件中的翻译。

LANG 环境变量设置为 pt,然后运行 trollprint。您应该仍然看到英语版本。现在运行 lrelease,例如 lrelease trollprint.pro,然后再次运行示例。现在您应该看到葡萄牙语版(Troll Imprimir 1.0)

虽然翻译出现了,但实际上是错误的。在好的葡萄牙语中,“Enabled”的第二次出现应该是“Ativadas”,而不是“Ativado”,而“Disabled”的第二次翻译的结尾也应该相应改变。

如果您使用Qt Linguist打开trollprint_pt.ts,您会看到翻译源文件中只有一个“Enabled”和“Disabled”的实例,尽管源代码中各有两个。这是因为Qt Linguist尝试通过使用重复的源文本的相同翻译来最小化翻译者的工作量。在这种情况下,如果相同的翻译是错误的,程序员必须区分重复出现的情况。这可以通过使用tr()的两参数形式轻松实现。

我们可以轻松地确定哪些文件必须改变,因为翻译者的“上下文”实际上是必须更改文本的类的名称。在这种情况下,文件是printpanel.cpp,这里有四行需要更改。在第一对单选按钮适当的tr()调用中添加第二个参数“two-sided”。

twoSidedEnabledRadio = new QRadioButton(tr("Enabled", "two-sided"));
twoSidedDisabledRadio = new QRadioButton(tr("Disabled", "two-sided"));

并在适当的tr()调用中为第二对单选按钮添加第二个参数“colors”。

colorsEnabledRadio = new QRadioButton(tr("Enabled", "colors"), colors);
colorsDisabledRadio = new QRadioButton(tr("Disabled", "colors"), colors);

现在重新编译,运行lupdate并使用Qt Linguist打开trollprint_pt.ts。现在您应该看到两个更改。

首先,翻译源文件现在包含三个“Enabled”,“Disabled”对。第一对被标记为“(obs.)”,表示它们已经废弃。这是因为这些文本出现在已经被带有两个参数的新调用替换的tr()调用中。第二对有“two-sided”作为它们的注释,第三对有“colors”作为它们的注释。注释显示在Qt Linguist源文字和注释区域。

其次,翻译文本“_ativado”和“_desativado”已自动用作新“Enabled”和“Disabled”文本的翻译,再次以最小化翻译者的工作。当然,在这个例子中,这些对于每个词的第二次出现都是不正确的,但它们提供了一个良好的起点。

将第二个“_ativado”改为“_ativadas”,将第二个“_desativado”改为“_desativadas”,然后保存并退出。运行lrelease以获得最新的二进制trollprint_pt.qm文件,并运行Troll Print(或者更确切地说,Troll Imprimir)。

tr()调用的第二个参数(在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。当您浏览源文本列表时,应该可以看到注释在源文字和注释区域中。

有时,特别是在大型程序中,翻译者可能很难找到他们的翻译,并检查它们是否正确。提供良好导航信息的注释可以帮助他们节省时间。

/*
   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行的注释。
  • 文字处理:在printpanel.cpp中将"2-sided"替换为"Two-sided"。
  • mainwindow.cpp中所有出现的地方将"1.0"替换为"1.1"。
  • 将版权年份更新为1999-2000在mainwindow.cpp中。

当然,在实际应用中,版本号和版权年份会是常数或#define。

完成后,运行lupdate,然后在Qt Linguist中打开trollprint_pt.ts。以下项目特别重要

  • 打印面板
    • 2-sided - 标记为"(obs.)",已过时
    • <b>TROLL PRINT</b> - 无标记,即未翻译
    • Two-sided - 无标记,即未翻译。

为了便于修订,您可以使用tr("Troll Print %1").arg("1.0")或类似的方式来替换tr("Troll Print 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 Qt公司有限公司。本文档中的文档贡献是各自所有者的版权。本文档的提供是在自由软件基金会发布的GNU自由文档许可版本1.3的条款下许可的。Qt和相应的标志是芬兰及其它国家的The Qt Company有限公司的商标。所有其他商标均为其所有者所有。