本页内容

qt_add_lrelease

添加目标,用于将Qt Linguist 的.ts文件转换为.qm文件。

该命令定义在Qt6 包的LinguistTools 组件中。使用以下命令加载该包:

find_package(Qt6 REQUIRED COMPONENTS LinguistTools)

该命令于 Qt 6.2 中引入。

语法

自 6.7 起:

qt_add_lrelease(TS_FILES file1.ts [file2.ts ...]
                [LRELEASE_TARGET target-name]
                [EXCLUDE_FROM_ALL]
                [NO_GLOBAL_TARGET]
                [QM_OUTPUT_DIRECTORY directory]             # since 6.9
                [QM_FILES_OUTPUT_VARIABLE variable-name]
                [MERGE_QT_TRANSLATIONS]
                [QT_TRANSLATION_CATALOGS catalog1 [catalog2 ...]]
                [OPTIONS ...])

自 6.2 起(已弃用):

qt_add_lrelease(target TS_FILES file1.ts [file2.ts ...]
                [NO_TARGET_DEPENDENCY]
                [NO_GLOBAL_TARGET]
                [QM_FILES_OUTPUT_VARIABLE variable-name]
                [OPTIONS ...])

如果禁用了无版本号的命令,请改用 `qt6_add_lrelease() `。它支持与该命令相同的参数集。

警告:若 在与目标目录作用域不同的目录作用域中调用 `qt_add_lrelease `,则需要至少 CMake 3.18 版本。

描述

创建一个自定义命令,用于使用lrelease 将.ts 文件转换为.qm 文件。

该自定义命令的执行由一个默认构建的自定义目标驱动。该自定义目标的名称默认为${PROJECT_NAME}_lrelease 。后续对qt_add_lrelease 的调用将生成目标名称,并在末尾附加递增的数字。可通过LRELEASE_TARGET 选项指定自定义目标名称。

必须通过参数TS_FILES 指定.ts 文件。

该函数旨在与qt_add_lupdate() 配合使用。另请参阅便捷封装函数qt_add_translations()。

选项

您可以设置在调用lrelease 时应传递的额外OPTIONS 。可在lrelease 文档中查阅可用选项。

生成的 .qm 文件的位置

默认情况下,.qm 文件将放置在当前构建目录(CMAKE_CURRENT_BINARY_DIR )中。从Qt 6.9开始,您可以使用QM_OUTPUT_DIRECTORY 参数将.qm 文件生成到其他目录中。相对路径被视为位于CMAKE_CURRENT_BINARY_DIR 之下。

例如,使用以下代码,.qm 文件将生成在当前构建目录下的translations 目录中。

qt_add_lrelease(
    TS_FILES myapp_en.ts myapp_de.ts
    QM_OUTPUT_DIRECTORY translations
)

若需更精细的控制,您可以通过在相应的.ts 文件中设置源文件属性OUTPUT_LOCATION 来指定单个.qm 文件的输出目录。此操作必须在调用qt_add_lrelease 之前完成。

OUTPUT_LOCATION 源文件属性将覆盖通过QM_OUTPUT_DIRECTORY 传递的目录。

例如,使用以下代码时,.qm 文件将生成在当前构建目录下的translations 目录中。

set_source_files_properties(app_en.ts app_de.ts
    PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/translations")
qt_add_lrelease(TS_FILES myapp_en.ts myapp_de.ts)

处理生成的 .qm 文件

若要进一步处理生成的.qm 文件(例如创建安装规则),qt_add_lrelease 可将.qm 文件的路径存储在变量中。为此,请向该函数传递QM_FILES_OUTPUT_VARIABLE <variable-name> 。

默认构建

默认情况下,该命令会创建一个自定义目标并将其添加到默认构建目标中。这可确保在构建项目时,.qm 文件始终保持最新状态。可通过EXCLUDE_FROM_ALL 参数关闭此行为。在此情况下,用户必须手动构建${PROJECT_NAME}_lrelease 目标。

伞形目标

除了目标${target}_lrelease 之外,还会创建一个伞形目标release_translations 。该目标将构建所有通过qt_add_lrelease 创建的${target}_lrelease 目标。

若要阻止此行为,请将NO_GLOBAL_TARGET 传递给qt_add_lrelease 。

可以通过在调用qt_add_lrelease 之前设置变量QT_GLOBAL_LRELEASE_TARGET 来覆盖该目标的名称。

合并 Qt 提供的翻译

从 Qt 6.9 开始,您可以将 Qt 提供的翻译合并到应用程序专用的.qm 文件中。要实现这一点,请向qt_add_translations 传递MERGE_QT_TRANSLATIONS 选项。这将确定属于项目所用模块的 Qt 翻译目录,并将其合并到由lrelease 生成的.qm 文件中。

Qt 翻译目录由在调用qt_add_translations 的CMakeLists.txt 作用域内对find_package 的调用所确定。例如,以下代码序列将把目录qtbase 和qtmultimedia 合并到您的.qm 文件中:

find_package(Qt6 COMPONENTS MultimediaWidgets)
...
qt_add_lrelease(
    TS_FILES myapp_de.ts myapp_fi.ts
    MERGE_QT_TRANSLATIONS
)

若要显式指定目录,请使用QT_TRANSLATION_CATALOGS 参数:

qt_add_lrelease(
    TS_FILES myapp_de.ts myapp_fi.ts
    MERGE_QT_TRANSLATIONS
    QT_TRANSLATION_CATALOGS qtbase qtmultimedia
)

如果您的项目支持一种 Qt 未提供自身翻译的语言,则在 configure 阶段会发出警告。您可以通过将 CMake 变量QT_NO_MISSING_CATALOG_LANGUAGE_WARNING 设置为ON 来抑制此警告。

已弃用的命令签名

旧版本的 `qt_add_lrelease ` 将目标作为第一个参数。虽然这种写法仍然有效,但已被弃用。

示例

添加目标myapp_lrelease 和release_translations ,用于将给定的.ts 文件转换为.qm 文件。此外,安装生成的.qm 文件。目标myapp_lrelease 默认会被构建。

project(myapp)
...
qt_add_lrelease(
    TS_FILES myapp_de.ts myapp_fr.ts
    QM_FILES_OUTPUT_VARIABLE qm_files
)
install(FILES ${qm_files} DESTINATION "translations")

您可以通过传入LRELEASE_TARGET 参数来指定创建的目标名称:

qt_add_lrelease(
    LRELEASE_TARGET create_myapp_qm_files
    TS_FILES myapp_de.ts myapp_fr.ts
    QM_FILES_OUTPUT_VARIABLE qm_files
)

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