应用程序本地化
本地化应用程序的步骤包括创建可翻译的应用程序、准备翻译、翻译字符串以及为发布的应用程序创建运行时翻译文件。
Qt Quick Qt C++ 和 Qt C++ 应用程序使用相同的底层本地化系统: 以及它们生成的翻译源 (TS) 文件和 QM 文件。如lupdate
lrelease
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 资源。qt_add_translationsCMake 命令会自动完成这项工作。.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 翻译成其他语言的 wiki 页面。
查找 Qt 翻译
您可以使用QLibraryInfo::path() 查找应用程序使用的 Qt 模块的翻译。您可以在运行时通过QLibraryInfo::TranslationsPath 请求翻译的路径。
可用目录
Qt 翻译目录位于qttranslations
代码库中。
警告: Qt 翻译由 Qt 社区贡献,不提供任何保证。翻译可能存在缺失、过时或完全错误,甚至可能是恶意的。建议您对所发送的任何翻译进行审核。
在 Qt XML 4 中,每个语言都有一个大的、单一的.qm
文件。例如,文件qt_de.qm
包含所有库的德语翻译。
qt_
元目录包含 Qt 4 中qt_
目录中仍然存在的 Qt 翻译。创建该目录是为了使应用程序从 Qt 4 移植到 Qt 5 更加容易。元目录依赖于可能不存在的翻译,因为它们属于不必要或已废弃的模块,这可能导致翻译加载失败。如果在应用程序中使用 Qt 5 或更高版本中的新模块,即使使用元目录,也必须指定这些模块的目录名称。
下表列出了 Qt 模块和工具的可用翻译目录。
Qt 模块或工具 | 目录 |
---|---|
Qt Bluetooth | qtconnectivity |
Qt Concurrent | qtbase |
Qt Core | qtbase |
Qt D-Bus | qtbase |
Qt Widgets 设计器 | designer |
Qt GUI | qtbase |
Qt Help | qt_help |
Qt Linguist | linguist |
Qt Location | qtlocation |
Qt Multimedia | qtmultimedia |
Qt Network | qtbase |
Qt NFC | qtconnectivity |
Qt Print Support | qtbase |
Qt Qml | qtdeclarative |
Qt Quick | qtdeclarative |
Qt Quick Controls | qtdeclarative |
Qt Quick 小工具 | qtdeclarative |
Qt Serial Port | qtserialport |
Qt SQL | qtbase |
Qt Widgets | qtbase |
Qt WebSockets | qtsockets |
Qt WebEngine | qtwebengine |
示例:基本 Qt 模块
例如,要查找Qt Core,Qt GUI,Qt Network 和Qt Widgets 等基本 Qt 模块的翻译,请在main()
函数中添加以下代码:
QTranslator qtTranslator; if (qtTranslator.load(QLocale::system(), u"qtbase"_s, u"_"_s, QLibraryInfo::path(QLibraryInfo::TranslationsPath))) { app.installTranslator(&qtTranslator); }
© 2025 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.