qt_add_translations
Add targets to update and transform Qt Linguist .ts files into .qm files.
The command is defined in the LinguistTools
component of the Qt6
package. Load the package with:
find_package(Qt6 REQUIRED COMPONENTS LinguistTools)
This command was introduced in Qt 6.2.
Synopsis
Since 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] [TS_FILES_OUTPUT_VARIABLE variable-name] # since 6.8 [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])
Since Qt 6.2 (deprecated):
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 ...])
If versionless commands are disabled, use qt6_add_translations()
instead. It supports the same set of arguments as this command.
Warning: Calling qt_add_translations
in a directory scope different than the target directory scope requires at least CMake version 3.18.
Description
Creates targets for updating Qt Linguist .ts
files and for transforming them into .qm
files. This function is a convenience wrapper around qt_add_lupdate and qt_add_lrelease and aims to offer the most common usage of both functions with one call.
The parameter TARGETS
specifies a list of targets that intend to load the generated .qm
files at run time. If there's only one such target, you may directly pass the target's name as the first argument.
The parameter SOURCE_TARGETS
specifies a list of executable or library targets that contain sources with translatable strings. From the sources of these targets, .ts
files will be created.
If SOURCE_TARGETS
is not given, targets are automatically gathered by calling qt_collect_translation_source_targets at the end of the directory scope of PROJECT_SOURCE_DIR
. This functionality requires CMake 3.19 or newer. This functionality can be turned off with the argument IMMEDIATE_CALL
.
This function will create the target update_translations
that scans all source files with lupdate
and creates and updates the .ts
files.
This function will create the target release_translations
that generates the .qm
files from the .ts
files. This target is built by default.
The .ts
files may be specified with the argument TS_FILES
, but it's more convenient to let qt_add_translations
figure out the file paths automatically. See Automatic Determination of .ts File Paths for details.
Sources and Include Directories
With SOURCES
you can explicitly specify additional source files that contain translatable strings.
You can use INCLUDE_DIRECTORIES
to explicitly specify include directories for those source files.
Automatic Determination of .ts File Paths
The paths of the .ts
files that are used as input for qt_add_translations
can be automatically determined if QT_I18N_TRANSLATED_LANGUAGES has been set. This variable can be conveniently set with qt_standard_project_setup.
The following project setup is usually enough:
project(myproject) cmake_minimum_required(VERSION 3.19) find_package(Qt6 COMPONENTS Core LinguistTools) qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES de fr) add_subdirectory(libs) add_subdirectory(apps) qt_add_translations(TARGETS myapp)
This will create the files myproject_de.ts
and myproject_fr.ts
in the project's source directory.
By default, the .ts
files are created in CMAKE_CURRENT_SOURCE_DIR
. You can change the location by passing a different directory with the TS_FILE_DIR
argument.
By default, the .ts
file names are constructed from PROJECT_NAME
. You can specify a different base name with the TS_FILE_BASE
argument.
Note: TS_FILE_DIR
and TS_FILE_BASE
have no effect for explicitly specified .ts
files.
Since Qt 6.8, you can specify the TS_FILES_OUTPUT_VARIABLE
argument to store the automatically determined .ts
file paths in a variable.
Plural Forms
QT_I18N_SOURCE_LANGUAGE specifies the language in which the source code strings are written. For handling plural forms correctly, create an additional .ts
file for that language that only contains translatable strings for plural forms. See Handle Plural Forms for details.
With PLURALS_TS_FILE
you can specify the .ts
file for the source language. This file will only contain plural forms.
A plurals-only .ts
is automatically generated unless the option NO_GENERATE_PLURALS_TS_FILE
is specified.
For example,
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)
creates the full translation file myapp_de.ts
and the plurals-only file myapp_en.ts
.
If you need a full translation of the source language, add it to QT_I18N_TRANSLATED_LANGUAGES
For example,
project(myapp) qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES en de) qt_add_executable(myapp ...) ... qt_add_translations(myapp)
creates the full translation files
myapp_en.ts
myapp_de.ts
Options
You can specify the name of the custom target that calls lupdate with the LUPDATE_TARGET
option. Likewise, LRELEASE_TARGET
controls the name of the custom target that drives the call to lrelease
.
You can set additional options for lupdate and lrelease with LUPDATE_OPTIONS
and LRELEASE_OPTIONS
. You can find possible options in the lupdate options and lrelease options.
For example, to use ID based translations, you need to pass LRELEASE_OPTIONS -idbased
to qt_add_translations
.
By default, the .qm
files will be placed in the current build directory (CMAKE_CURRENT_BINARY_DIR
). To change this, you can set OUTPUT_LOCATION
as a property of the source .ts
file.
For example, with the following code, the .qm
files are generated in a translations
directory below the current build directory.
set_source_files_properties(app_en.ts app_de.ts PROPERTIES OUTPUT_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/translations")
Embedding Generated .qm Files in Resources
By default, the generated .qm
files are embedded in a Qt resource that will be linked into the targets passed with TARGETS
. The files in the resource are accessible under the resource prefix "/i18n"
.
You can set the resource prefix with RESOURCE_PREFIX
.
In a static Qt build, when a resource target is created, additional targets can be created. You can instruct qt_add_translations
to store these targets in a variable, by passing OUTPUT_TARGETS <variable-name>
.
If OUTPUT_TARGETS
is used, either IMMEDIATE_CALL
or SOURCE_TARGETS
must be specified.
The automatic resource embedding can be turned off by giving the QM_FILES_OUTPUT_VARIABLE
option, followed by the name of a variable in which the command should store the list of generated .qm
files.
qt_add_translations
before Qt 6.7
Before Qt 6.7, this command accepted only one target as the first argument. This target was used for both, extracting translatable sources and embedding .qm
files.
Since Qt 6.7, the target in the first argument is not used for source extraction anymore.
Examples
Add a German and a French translation to the target frogger
using qt_add_translations
:
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)
This will create the .ts
files frogger_de.ts
and frogger_fr.ts
in the source directory. lupdate sees the source files of all targets that are eligible for translation, according to the rules of qt_collect_translation_source_targets.
The .qm
files that are created from the .ts
files are embedded in the frogger_game
target under the resource prefix "i18n"
.
The qt_add_translations
call in the above example is roughly equivalent to the following:
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}" )
Excluding directories, targets, and sources
You can exclude targets and directories from the automatic collection of source targets. The following excludes the target helper_lib
and everything under the tests
directory. See the directory property QT_EXCLUDE_FROM_TRANSLATION and the target property 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)
In the following example, we exclude source files that are part of the frogger_game
target using the QT_EXCLUDE_SOURCES_FROM_TRANSLATION target property:
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/*" )
Explicit specification of source targets
If you don't want to use the automatic collection of source targets you can specify the source targets explicitly:
qt_add_translations(frogger_game SOURCE_TARGETS frogger_game )
Custom resource prefix
Now, let's embed the .qm
files in frogger_game
and frogger_level_editor
and set a custom resource prefix.
qt_add_translations( TARGETS frogger_game frogger_level_editor RESOURCE_PREFIX "/translations" )
Installing .qm files
Instead of embedding the .qm
files we can install them as regular files:
qt_add_translations( TARGETS frogger_game frogger_level_editor QM_FILES_OUTPUT_VARIABLE qm_files ) install(FILES ${qm_files} DESTINATION "translations")
Influencing the names of the .ts files
Place the .ts
files in a translations
directory and change the base name to frogger_i18n
:
qt_standard_project_setup(I18N_TRANSLATED_LANGUAGES de fr) ... qt_add_translations(frogger TS_FILE_BASE froggo TS_FILE_DIR translations )
This creates the following files
translations/froggo_de.ts
translations/froggo_fr.ts
You can also specify the paths explicitly:
qt_add_translations(frogger TS_FILES translations/froggo_de.ts translations/froggo_fr.ts )