本地化应用程序
本地化应用程序的步骤包括创建可翻译的应用程序、为翻译做准备、翻译字符串和为发布的应用程序创建运行时翻译文件。
Qt Quick 和 Qt C++ 应用程序使用相同的底层本地化系统:lupdate
、lrelease
以及它们生成的翻译源(TS)文件和 QM 文件。您可以使用与 QML 和 C++ 代码相同的工具,如 Qt Linguist 手册 所述。
您甚至可以在同一应用程序中具有 QML 和 C++ 源文件的用户界面字符串。系统将创建一个单独的组合翻译文件,且字符串可从 QML 和 C++ 代码中访问。
本地化国际化应用程序
在 Qt 项目文件中指定翻译源
要启用 lupdate
和 lrelease
生成 TS 和 QM 文件,更新应用程序项目文件以指定包含要翻译文本的源文件。
在 TS 文件名中使用 ISO 语言和国家代码来确定运行时加载的语言。有关更多信息,请参阅 启用翻译。
lupdate
工具从您的应用程序中提取用户界面字符串。它默认期望所有源代码使用 UTF-8 进行编码。有关更多信息,请参阅 编码。
使用 CMake
将 qt_add_translations 命令添加到 CMakeLists.txt
文件中,以创建更新 TS 文件并将其转换为 QM 文件的目标。
使用 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
文件放置在一个位置,以便使用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蓝牙 | qtconnectivity |
Qt并发 | qtbase |
Qt核心 | qtbase |
Qt D-Bus | qtbase |
Qt Designer | designer |
Qt GUI | qtbase |
Qt帮助 | qt_help |
Qt Linguist | linguist |
Qt位置 | qtlocation |
Qt多媒体 | qtmultimedia |
Qt网络 | qtbase |
Qt NFC | qtconnectivity |
Qt打印支持 | qtbase |
Qt Qml | qtdeclarative |
Qt Quick | qtdeclarative |
Qt Quick控件 | qtdeclarative |
Qt Quick窗口小部件 | qtdeclarative |
Qt串行端口 | qtserialport |
Qt SQL | qtbase |
Qt小部件 | qtbase |
Qt WebSocket | qtsockets |
Qt WebEngine | qtwebengine |
示例:基本Qt模块
例如,为了定位基本Qt模块的翻译,如Qt核心、Qt GUI、Qt网络和Qt小部件,请在main()
函数中添加以下代码
QTranslator qtTranslator; if (qtTranslator.load(QLocale::system(), u"qtbase"_s, u"_"_s, QLibraryInfo::path(QLibraryInfo::TranslationsPath))) { app.installTranslator(&qtTranslator); }
© 2024 Qt公司有限。包含在此处的文档贡献均为各自所有者的版权。在此提供的文档根据由自由软件基金会发布的GNU自由文档许可协议第1.3版的条款进行许可。Qt及其相应标志是芬兰和/或其他国家的Qt公司商标。商标。所有其他商标均为各自所有者的财产。