本地化应用程序

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

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

您甚至可以在同一应用程序中具有 QML 和 C++ 源文件的用户界面字符串。系统将创建一个单独的组合翻译文件,且字符串可从 QML 和 C++ 代码中访问。

本地化国际化应用程序

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

要启用 lupdatelrelease 生成 TS 和 QM 文件,更新应用程序项目文件以指定包含要翻译文本的源文件。

在 TS 文件名中使用 ISO 语言和国家代码来确定运行时加载的语言。有关更多信息,请参阅 启用翻译

lupdate 工具从您的应用程序中提取用户界面字符串。它默认期望所有源代码使用 UTF-8 进行编码。有关更多信息,请参阅 编码

使用 CMake

qt_add_translations 命令添加到 CMakeLists.txt 文件中,以创建更新 TS 文件并将其转换为 QM 文件的目标。

使用 qmake

当使用 qmake 时,设置一个条件语句以隐藏从 .pro 文件中的 SOURCESHEADERS 条目中列出的编译器所看到的 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 CoreQt GUIQt 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-Busqtbase
Qt Designerdesigner
Qt GUIqtbase
Qt帮助qt_help
Qt Linguistlinguist
Qt位置qtlocation
Qt多媒体qtmultimedia
Qt网络qtbase
Qt NFCqtconnectivity
Qt打印支持qtbase
Qt Qmlqtdeclarative
Qt Quickqtdeclarative
Qt Quick控件qtdeclarative
Qt Quick窗口小部件qtdeclarative
Qt串行端口qtserialport
Qt SQLqtbase
Qt小部件qtbase
Qt WebSocketqtsockets
Qt WebEngineqtwebengine

示例:基本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公司商标。商标。所有其他商标均为各自所有者的财产。