本页内容

箭头键盘示例

理解Qt Linguist 上下文概念并使用两种或多种语言。

英文版“Arrow Pad”的屏幕截图

我们将使用法语和荷兰语两种翻译,尽管应用程序中可使用的翻译数量实际上没有限制。

使用 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 。它应生成两个内容相同的消息文件:arrowpad_fr.ts 和arrowpad_nl.ts 。这些文件将包含所有通过tr() 调用标记为待翻译的源文本及其上下文。

使用 qmake 时,必须手动运行lupdate :

lupdate arrowpad.pro

使用 CMake 时,请构建update_translations 目标以运行lupdate :

cmake --build . --target update_translations

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

逐行解析

在arrowpad.h 中,我们定义了ArrowPad 子类,它是QWidget 的子类。在上图截图中,带有四个按钮的中央控件是一个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() ,因为这些标签是用户可见的文本。

英文版“Arrow Pad”的屏幕截图

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() ,一次用于操作,一次用于快捷键。

请注意使用tr() 来支持其他语言中的不同键位。“Ctrl+Q”是英语中“Quit”的不错选择,但荷兰语翻译者可能希望使用“Ctrl+A”(对应Afsluiten),而德语翻译者则可能使用“Strg+E”(对应Beenden)。 在为Ctrl 快捷键使用tr() 时,应采用双参数形式,其中第二个参数描述该快捷键所执行的函数。

我们的main() 函数按惯例在main.cpp 中定义。

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

我们根据当前的区域设置来选择要使用的翻译。例如,可以通过设置LANG 环境变量来影响QLocale::system()。请注意,在.qm 消息文件(以及TS文件)中采用包含区域设置的命名约定,可以轻松地根据区域设置选择翻译文件。

如果所选区域设置没有对应的 QM 消息文件,则将使用原始源文本,且不会引发错误。

翻译为法语和荷兰语

我们将首先将示例应用程序翻译成法语。请在 Qt Linguistarrowpad_fr.ts 。您应看到七个源文本(“&Up”、“&Left”等)被分组到两个上下文中(“ArrowPad”和“MainWindow”)。

现在,请输入以下翻译:

  • ArrowPad
    • &Up - &Haut
    • &Left - &Gauche
    • &Right - &Droite
    • &Down - &Bas
  • MainWindow
    • E&xit - &退出
    • Ctrl+Q - Ctrl+Q
    • &文件 - &文件

“Done & Next ”按钮将该翻译标记为已完成,并转到下一段源文本。在输入每段翻译后,使用其快捷键(参见“翻译”菜单栏)会更快捷。

保存文件,并使用arrowpad_nl.ts 对荷兰语部分进行同样的操作:

  • ArrowPad
    • &Up - &Omhoog
    • &Left - &Links
    • &Right - &Rechts
    • &Down - Omlaa&g
  • MainWindow
    • E&xit - &退出
    • Ctrl+Q - Ctrl+A
    • 文件 - &文件

我们需要将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 系统中,以下两个命令中的任意一个都应有效:

export LANG=fr
setenv LANG fr

在 Windows 或 Mac 上,请将显示语言设置为法语。

运行程序后,您现在应能看到法语版本:

法语版“Arrow Pad”的截图

尝试对荷兰语进行同样的操作(在 Unix 中使用LANG=nl )。此时应显示荷兰语版本:

荷兰语版“箭头键盘”的截图

练习

将其中一项翻译标记为 Qt Linguist 中标记为“未完成”,即取消勾选“完成”复选框;运行lupdate ,接着运行lrelease ,最后运行示例程序。此更改产生了什么影响?

将LANG=fr_CA 设置为“法语(加拿大)”,并再次运行示例程序。解释为什么结果与LANG=fr 时相同。

修改荷兰语翻译中的一个快捷键,以消除&Bestand和&Boven 之间的冲突。

示例项目 @ code.qt.io

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