qt_add_translations

添加目标以更新并将 Qt Linguist .ts 文件转换为 .qm 文件。

此命令在 Qt6 包的 LinguistTools 组件中定义。通过以下命令加载包:

find_package(Qt6 REQUIRED COMPONENTS LinguistTools)

此命令自 Qt 6.2 开始引入。

摘要

自 Qt 6.7 以来

qt_add_translations([target]
                    [TARGETS target1 [target2...]]
                    [SOURCE_TARGETS target1 [target2...]]
                    [TS_FILE_BASE name]
                    [TS_FILE_DIR directory]
                    [TS_FILES file1.ts [file2.ts ...]]
                    [PLURALS_TS_FILE file.ts]
                    [NO_GENERATE_PLURALS_TS_FILE]
                    [RESOURCE_PREFIX prefix]
                    [OUTPUT_TARGETS variable-name]
                    [QM_FILES_OUTPUT_VARIABLE variable-name]
                    [SOURCES source1.cpp [sources2.cpp ...]]
                    [INCLUDE_DIRECTORIES directory1 [directory2 ...]]
                    [LUPDATE_TARGET target-name]
                    [LUPDATE_OPTIONS ...]
                    [LRELEASE_TARGET target-name]
                    [LRELEASE_OPTIONS ...]
                    [IMMEDIATE_CALL])

自 Qt 6.2(已弃用)

qt_add_translations(target TS_FILES file1.ts [file2.ts ...]
                    [RESOURCE_PREFIX prefix]
                    [OUTPUT_TARGETS variable-name]
                    [QM_FILES_OUTPUT_VARIABLE variable-name]
                    [SOURCES source1.cpp [sources2.cpp ...]]
                    [INCLUDE_DIRECTORIES directory1 [directory2 ...]]
                    [LUPDATE_OPTIONS ...]
                    [LRELEASE_OPTIONS ...])

如果禁用了 无版本命令,则请使用 qt6_add_translations()。它支持与该命令相同的参数集。

警告:在不同于目标目录作用域的目录作用域中调用 qt_add_translations 需要 CMake 版本 3.18 或更高版本。

描述

创建用于更新 Qt Linguist .ts 文件的目标,以及将这些文件转换为 .qm 文件的目标。此函数是 qt_add_lupdateqt_add_lrelease 的便利包装函数,旨在通过一个调用提供这两个函数的最常见用法。

参数 TARGETS 指定一个目标列表,这些目标旨在运行时加载生成的 .qm 文件。如果有这样的目标只有一个,您可以直接将目标的名称作为第一个参数传递。

参数 SOURCE_TARGETS 指定包含可翻译字符串的源的可执行文件或库目标列表。从这些目标的源中,将创建 .ts 文件。

如果没有指定 SOURCE_TARGETS,则目标将自动通过在 PROJECT_SOURCE_DIR 的目录作用域结束时调用 qt_collect_translation_source_targets 来收集。此功能需要 CMake 3.19 或更高版本。可以通过 IMMEDIATE_CALL 参数关闭此功能。

此函数将创建名为 update_translations 的目标,该目标会扫描所有源文件以 lupdate,并创建和更新 .ts 文件。

此函数将创建名为 release_translations 的目标,该目标从 .ts 文件生成 .qm 文件。默认情况下,此目标是可构建的。

您可以使用 TS_FILES 参数指定 .ts 文件,但更方便的是让 qt_add_translations 自动确定文件路径。有关详细信息,请参阅 自动确定 .ts 文件路径

源和包含目录

使用 SOURCES 您可以显式指定包含可翻译字符串的附加源文件。

您可以使用 INCLUDE_DIRECTORIES 显式指定这些源文件的包含目录。

自动确定 .ts 文件路径

当设置了 QT_I18N_TRANSLATED_LANGUAGES 时,可以作为 qt_add_translations 输入的 .ts 文件路径可以自动确定。这个变量可以通过 qt_standard_project_setup 方便地设置。

以下项目设置通常就足够了

project(myproject)
cmake_minimum_required(VERSION 3.19)
qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES de fr)

add_subdirectory(libs)
add_subdirectory(apps)

qt_add_translations(TARGETS myapp)

这将创建项目源目录中的 myproject_de.tsmyproject_fr.ts 文件。

默认情况下,.ts 文件创建在 CMAKE_CURRENT_SOURCE_DIR。您可以通过传递不同的目录来通过 TS_FILE_DIR 参数更改位置。

默认情况下,.ts 文件名是由 PROJECT_NAME 搭建的。您可以通过 TS_FILE_BASE 参数指定不同的基本名称。

复数形式

QT_I18N_SOURCE_LANGUAGE 指定了源代码字符串编写的语言。为了正确处理复数形式,为该语言创建一个额外的仅包含复数形式翻译字符串的 .ts 文件。有关详细信息,请参阅 处理复数形式

使用 PLURALS_TS_FILE,您可以指定源语言的 .ts 文件。此文件将仅包含复数形式。

除非指定了选项 NO_GENERATE_PLURALS_TS_FILE,否则将自动生成仅包含复数的 .ts 文件。

例如,

project(myapp)
qt_standard_project_setup(
    I18N_SOURCE_LANGUAGE en         # optional - this is the default
    I18N_TRANSLATED_LANGUAGES de
)
qt_add_executable(myapp ...)
...
qt_add_translations(myapp)

创建了完整的翻译文件 myapp_de.ts 和仅包含复数形式的文件 myapp_en.ts

如果您需要源语言的完整翻译,将其添加到 QT_I18N_TRANSLATED_LANGUAGES

例如,

project(myapp)
qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES en de)
qt_add_executable(myapp ...)
...
qt_add_translations(myapp)

创建了完整的翻译文件

  • myapp_en.ts
  • myapp_de.ts

选项

您可以使用 LUPDATE_TARGET 选项指定调用 lupdate 的自定义目标名称。类似地,LRELEASE_TARGET 控制了驱动调用 lrelease 的自定义目标名称。

您可以使用 LUPDATE_OPTIONSLRELEASE_OPTIONSlupdatelrelease 设置额外选项。您可以在 lupdate 选项lrelease 选项 中找到可能选项。

例如,为了使用 基于 ID 的翻译,您需要将 LRELEASE_OPTIONS -idbased 传递给 qt_add_translations

默认情况下,.qm 文件将放置在当前构建目录中(CMAKE_CURRENT_BINARY_DIR)。要更改此设置,您可以将 OUTPUT_LOCATION 设置为源 .ts 文件的属性。

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

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

将生成的 .qm 文件嵌入到资源中

默认情况下,生成的 .qm 文件嵌入到一个 Qt 资源中,该资源将被链接到用 TARGETS 传递的目标。资源中的文件可以通过资源前缀 "/i18n" 访问。

您可以使用 RESOURCE_PREFIX 设置资源前缀。

在静态 Qt 构建中,当创建资源目标时,可以创建额外的目标。您可以使用 qt_add_translations 指示将这些目标存储在一个变量中,通过传递 OUTPUT_TARGETS <variable-name>

如果使用 OUTPUT_TARGETS,必须指定 IMMEDIATE_CALLSOURCE_TARGETS 之一。

可以通过提供 QM_FILES_OUTPUT_VARIABLE 选项来关闭自动资源嵌入,随后跟上命令应存储生成的 .qm 文件列表的变量名。

qt_add_translations 在 Qt 6.7 之前

在 Qt 6.7 之前,此命令仅接受一个目标作为第一个参数。该目标用于提取可翻译源代码和嵌入 .qm 文件。

自 Qt 6.7 以来,第一参数中的目标不再用于源提取。

示例

使用 qt_add_translations 为目标 frogger 添加德语和法语翻译

cmake_minimum_required(VERSION 3.28)
project(frogger)
find_package(Qt6 COMPONENTS OpenGLWidgets)
qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES de fr)

# The CMake files in the 'src' subdirectory create
# the targets 'frogger_game' and 'frogger_level_editor'.
add_subdirectory(src)

# Add translations to the 'frogger_game' target.
qt_add_translations(frogger_game)

这将在源目录中创建 .ts 文件 frogger_de.tsfrogger_fr.tslupdate 根据规则提取所有合格目标的源文件,这些规则由 qt_collect_translation_source_targets 确定。

.ts 文件生成的 .qm 文件将在资源前缀 "i18n" 下嵌入到 frogger_game 目标中。

上面的示例中 qt_add_translations 调用大致等价于以下

qt_collect_translation_source_targets(i18n_targets)
qt_add_lupdate(
    SOURCE_TARGETS ${i18n_targets}
    TS_FILES frogger_de.ts frogger_fr.ts)
qt_add_lrelease(
    TS_FILES frogger_de.ts frogger_fr.ts
    QM_FILES_OUTPUT_VARIABLE qm_files)
qt_add_resources(frogger_game "translations"
    PREFIX "/i18n"
    BASE "${CMAKE_CURRENT_BINARY_DIR}"
    FILES "${qm_files}"
)

排除目录、目标和源代码

您可以从自动搜集源目标的操作中排除目标和目录。以下示例排除了目标 helper_libtests 目录下的所有内容。有关更多信息,请参阅 目录属性 QT_EXCLUDE_FROM_TRANSLATION目标属性 QT_EXCLUDE_FROM_TRANSLATION

# <project_root>/CMakeLists.txt
qt_add_translations(frogger_game)
# <project_root>/src/helper_lib/CMakeLists.txt
qt_add_library(helper_lib STATIC helpers.cpp)
set_property(TARGET helper_lib PROPERTY QT_EXCLUDE_FROM_TRANSLATION ON)
# <project_root>/tests/CMakeLists.txt
add_subdirectory(behavior_tests)
add_subdirectory(physics_tests)
set_directory_properties(PROPERTIES QT_EXCLUDE_FROM_TRANSLATION ON)

以下示例中,我们使用 QT_EXCLUDE_SOURCES_FROM_TRANSLATION 目标属性排除了 frogger_game 目标中的源文件

qt_add_executable(frogger_game
    main.cpp
    3rdparty/jumpsim.cpp
    3rdparty/frogmath.cpp
)
set_property(TARGET frogger_game
    PROPERTY QT_EXCLUDE_SOURCES_FROM_TRANSLATION "3rdparty/*"
)

显式指定源目标

如果您不想使用自动搜集源目标,可以显式指定源目标

qt_add_translations(frogger_game
    SOURCE_TARGETS frogger_game
)

自定义资源前缀

现在,让我们将 .qm 文件嵌入到 frogger_gamefrogger_level_editor 中,并设置一个自定义资源前缀。

qt_add_translations(
    TARGETS frogger_game frogger_level_editor
    RESOURCE_PREFIX "/translations"
)

安装 .qm 文件

我们不仅可以嵌入 .qm 文件,还可以将它们作为常规文件安装。

qt_add_translations(
    TARGETS frogger_game frogger_level_editor
    QM_FILES_OUTPUT_VARIABLE qm_files
)
install(FILES ${qm_files} DESTINATION "translations")

影响 .ts 文件名称

.ts 文件放置在 translations 目录中,并将基本名称更改为 frogger_i18n

qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES de fr)
...
qt_add_translations(frogger
    TS_FILE_BASE froggo
    TS_FILE_DIR translations
)

这将创建以下文件

  • translations/froggo_de.ts
  • translations/froggo_fr.ts

您也可以显式指定路径

qt_add_translations(frogger
    TS_FILES translations/froggo_de.ts translations/froggo_fr.ts
)

© 2024 Qt公司有限公司。此处包含的文档贡献属于其各自的版权所有者。所提供的文档根据自由软件基金会发布的GNU自由文档许可协议版本1.3进行许可。Qt及其相关标志是芬兰以及全世界其他国家的Qt公司有限公司的商标。所有其他商标均为各自所有者的财产。