本页内容

应用程序本地化

应用程序本地化的步骤包括:创建可翻译的应用程序、准备翻译、翻译字符串,以及为发布的应用程序创建运行时翻译文件。

Qt Quick QML 和 Qt C++ 应用程序使用相同的底层本地化系统:lupdate 、lrelease ,以及它们生成的翻译源 (TS) 文件和 QM 文件。正如《Qt Linguist 手册》中所述,您可以对 QML 和 C++ 代码使用相同的工具。

您甚至可以在同一个应用程序中,同时在 QML 和 C++ 源文件中定义用户界面字符串。系统将生成一个合并的翻译文件,QML 和 C++ 代码均可访问其中的字符串。

要对国际化应用程序进行本地化:

在 Qt 项目文件中指定翻译源

要使lupdate 和lrelease 能够生成TS和QM文件,请更新应用程序项目文件,以指定包含待翻译文本的源文件。

在 TS 文件名中使用 ISO 语言和国家/地区代码,以确定运行时要加载的语言。有关详细信息,请参阅“启用翻译”。

lupdate 工具会从您的应用程序中提取用户界面字符串。该工具默认要求所有源代码均采用 UTF-8 编码。有关详细信息,请参阅“编码”。

使用 CMake

通过加载Qt6LinguistTools 软件包,即可使用 Qt 的 CMake 国际化命令。

cmake_minimum_required(VERSION 3.16)
project(myproject)
find_package(Qt6 COMPONENTS Core LinguistTools)

通过在qt_standard_project_setup() 中使用I18N_TRANSLATED_LANGUAGES 参数来声明支持的语言。

# Declare that the project will have a German and a French translation.
qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES de fr)

源代码中假定包含可翻译的英文字符串。您可以通过qt_standard_project_setup 参数I18N_SOURCE_LANGUAGE 来调整源代码中字符串的语言。

在需要于运行时加载.qm 文件的目标上调用qt_add_translations()命令。

qt_add_translations(myapplication)

如果这些文件尚不存在,该操作将创建myproject_de.ts 和myproject_fr.ts 文件。有关这些文件名的构成方式,请参阅《.ts 文件路径的自动确定》。

该命令还会生成myproject_en.ts ,这是一个仅包含复数形式的翻译文件。有关详细信息,请参阅“处理复数形式”。可以通过NO_GENERATE_PLURALS_TS_FILE 参数禁用仅包含复数形式的文件的生成。

项目中所有目标的源文件均被视为生成.ts 文件的输入。有关如何收集项目中的目标以及如何排除目标和单个源文件,请参阅qt_add_translations()参考文档。

使用 qmake

使用 qmake 时,请设置一个条件语句,将您在 .pro 文件的SOURCES 或HEADERS 条目中列出的 QML 源文件从编译器中隐藏起来。

SOURCES 变量专用于 C++ 源文件。若在此处列出 QML 或 JavaScript 源文件,编译器会将其作为 C++ 文件进行构建。作为一种解决方法,您可以使用lupdate_only{...} 条件语句,这样lupdate 工具就能识别 .qml 文件,而 C++ 编译器则会忽略它们。

例如,以下 .pro 文件片段指定了应用程序中的两个 .qml 文件。

lupdate_only{
SOURCES = main.qml \
          MainPage.qml
}

您还可以使用通配符匹配来指定 .qml 源文件。由于搜索不会递归进行,因此您需要指定每个包含 UI 字符串源文件的目录:

lupdate_only{
SOURCES = *.qml \
          *.js \
          content/*.qml \
          content/*.js
}

部署翻译

部署.qm 文件最简单的方法是将其嵌入到Qt资源中。CMake命令qt_add_translations()会自动处理此操作。.qm 文件可通过资源前缀":/i18n" 访问。

# Automatically embed generated .qm files.
qt_add_translations(myapplication)

此外,.qm 文件也可部署到文件系统中的某个目录下。对于规模较大且不希望将所有可用翻译都保存在内存中的应用程序而言,这种方式更为合适。 向qt_add_translations() 传递QM_FILES_OUTPUT_VARIABLE 参数。该命令会将生成的.qm 文件列表存储在指定的变量中。对该列表中的文件名使用 CMake 的常规安装命令。

# Do not embed generated .qm files.
qt_add_translations(myapplication
    QM_FILES_OUTPUT_VARIABLE qm_files
)

# Install generated .qm files.
install(FILES ${qm_files} DESTINATION translations)

将应用程序所需的.qm 文件放置在能够被使用QTranslator 的加载器代码找到的位置。通常,您需要指定一个相对于QCoreApplication::applicationDirPath()的相对路径。

除了应用程序的 QM 文件外,您还需要部署应用程序中使用的 Qt 模块的 QM 文件,除非这些模块已安装在系统上。

QM 文件按模块划分,并且有一个所谓的元目录文件,其中包含所有模块的 QM 文件。不过,您只需部署应用程序中实际使用的模块对应的 QM 文件即可。

您可以在部署步骤中使用lconvert 工具,将所需的QM文件拼接成一个与元目录文件匹配的文件。例如,要为使用 Qt Core, Qt GUI和 Qt Quick 模块的应用程序创建德语翻译文件,请运行:

lconvert -o installation_folder/qt_de.qm qtbase_de.qm qtdeclarative_de.qm

使用 Qt 模块翻译

Qt 模块包含数千条字符串,这些字符串也需要翻译成您的目标语言。您可以在qttranslations存储库中找到许多 TS 文件。在开始翻译 Qt 之前,请阅读维基页面《将 Qt 翻译成其他语言》。

查找 Qt 翻译文件

您可以使用 `QLibraryInfo::path()` 来查找应用程序所使用的 Qt 模块的翻译文件。通过向该函数传递 `QLibraryInfo::TranslationsPath `,您可以在运行时获取翻译文件的路径。

可用目录

Qt 翻译目录位于qttranslations 存储库中。

警告:Qt 翻译由 Qt 社区贡献,且不作任何保证。翻译内容可能存在缺失、过时或完全错误的情况,甚至可能带有恶意。建议您对所发布的任何翻译内容进行审核。

在 Qt 4 中,每个语言环境都有一个庞大且单一的.qm 文件。例如,文件qt_de.qm 包含所有库的德语翻译。

qt_ 元目录包含 Qt 4 中qt_ 目录里那些仍然存在的 Qt 翻译。创建该目录是为了方便将应用程序从 Qt 4 移植到 Qt 5。 该元目录依赖于某些可能缺失的翻译,因为这些翻译属于非必要或已弃用的模块,这可能会导致翻译加载失败。如果您在应用程序中使用了 Qt 5 或更高版本中的新模块,即使您使用了该元目录,也必须指定这些模块的目录名称。

下表列出了 Qt 中各模块和工具可用的翻译目录。

Qt 模块或工具目录
Qt Bluetoothqtconnectivity
Qt Concurrentqtbase
Qt Coreqtbase
Qt D-Busqtbase
Qt Widgets Designerdesigner
Qt GUIqtbase
Qt Helpqt_help
Qt Linguistlinguist
Qt Locationqtlocation
Qt Multimediaqtmultimedia
Qt Networkqtbase
Qt NFCqtconnectivity
Qt Print Supportqtbase
Qt Qmlqtdeclarative
Qt Quickqtdeclarative
Qt Quick Controlsqtdeclarative
Qt Quick 控件qtdeclarative
Qt Serial Portqtserialport
Qt SQLqtbase
Qt Widgetsqtbase
Qt WebSocketsqtwebsockets
Qt WebEngineqtwebengine

示例:必备的 Qt 模块

例如,要查找关键 Qt 模块(如Qt Core 、Qt GUI 、Qt Network 和Qt Widgets )的翻译,请在main() 函数中添加以下代码:

    QTranslator qtTranslator;
    if (qtTranslator.load(QLocale::system(), u"qtbase"_s, u"_"_s,
                          QLibraryInfo::path(QLibraryInfo::TranslationsPath))) {
        app.installTranslator(&qtTranslator);
    }

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