# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
# special case skip regeneration
add_custom_target(ts-all)
set(repo_root_directory "${CMAKE_CURRENT_SOURCE_DIR}/../..")
set(en_ts_file_dir "${CMAKE_CURRENT_BINARY_DIR}/en_ts")
set(catalogs_file "${CMAKE_CURRENT_BINARY_DIR}/catalogs.json")
set(catalogs_file_content "")
# Converts a CMake list to a JSON array of strings.
function(qttranslations_list_to_json_array out_var list_var)
set(result "")
foreach(item IN LISTS ${list_var})
if(NOT "${result}" STREQUAL "")
string(APPEND result ", ")
endif()
string(APPEND result "\"${item}\"")
endforeach()
set("${out_var}" "[${result}]" PARENT_SCOPE)
endfunction()
# Create a rudimentary .ts file in ${en_ts_file_dir}.
function(generate_empty_ts_file file_name)
if(NOT EXISTS "${en_ts_file_dir}/${file_name}")
file(WRITE "${en_ts_file_dir}/${file_name}" "")
endif()
endfunction()
function(add_ts_target target input_file output_file)
add_custom_target(${target}
COMMAND ${QT_CMAKE_EXPORT_NAMESPACE}::lupdate -locations relative -no-ui-lines -no-sort "@${input_file}" -ts ${output_file}
)
endfunction()
function(add_ts_targets catalog)
cmake_parse_arguments(arg "" "" "DIRECTORIES;EXCLUDE;MODULES" ${ARGN})
generate_empty_ts_file("${catalog}_en.ts")
file(GLOB ts_files "${catalog}_*.ts")
set(languages)
foreach(file IN LISTS ts_files)
if(file MATCHES "([a-z][a-z](_[A-Z][A-Z])?).ts$")
list(APPEND languages ${CMAKE_MATCH_1})
endif()
endforeach()
set(repositories "")
set(file_list)
foreach(dir IN LISTS arg_DIRECTORIES)
if(dir MATCHES "/src$")
string(REGEX REPLACE "/src$" "" repository "${dir}")
list(APPEND repositories ${repository})
endif()
set(dir_path "${repo_root_directory}/${dir}")
if (NOT IS_DIRECTORY ${dir_path})
message(WARNING "Directory '${dir_path}' for ${catalog} does not exist. Skipping...")
continue()
endif()
file(GLOB_RECURSE catalog_files "${dir_path}/**")
list(APPEND file_list ${catalog_files})
endforeach()
if (NOT file_list)
message(WARNING "No source files located for ${catalog}, skipping target creation")
return()
endif()
# Extend the content of catalogs.json
if(NOT "${catalogs_file_content}" STREQUAL "")
string(APPEND catalogs_file_content ",\n")
endif()
string(APPEND catalogs_file_content " {
\"name\": \"${catalog}\"")
qttranslations_list_to_json_array(repositories_json repositories)
if(NOT "${repositories_json}" STREQUAL "[]")
string(APPEND catalogs_file_content ",
\"repositories\": ${repositories_json}")
endif()
qttranslations_list_to_json_array(modules_json arg_MODULES)
if(NOT "${modules_json}" STREQUAL "[]")
string(APPEND catalogs_file_content ",
\"modules\": ${modules_json}")
endif()
string(APPEND catalogs_file_content "\n }")
set(catalogs_file_content "${catalogs_file_content}" PARENT_SCOPE)
# Generate the list of source files
set(source_files_list_file "${CMAKE_CURRENT_BINARY_DIR}/${catalog}_file_list.txt")
set(inclusion_regex "\\.h$|\\.cpp$|\\.hpp$|\\.cxx$|\\.cc$|\\.mm$|\\.qml$|\\.ui$")
list(FILTER file_list INCLUDE REGEX "${inclusion_regex}")
list(FILTER file_list EXCLUDE REGEX /doc/snippets/)
if (arg_EXCLUDE)
list(FILTER file_list EXCLUDE REGEX ${arg_EXCLUDE})
endif()
list(JOIN file_list "\n" file_list_string)
file(GENERATE
OUTPUT "${source_files_list_file}"
CONTENT "${file_list_string}"
)
add_custom_target(ts-${catalog}-all)
add_dependencies(ts-all ts-${catalog}-all)
foreach(lang IN LISTS languages)
set(lang_target_name ts-${catalog}-${lang})
add_ts_target(${lang_target_name}
${source_files_list_file}
"${CMAKE_CURRENT_SOURCE_DIR}/${catalog}_${lang}.ts"
)
add_dependencies(ts-${catalog}-all ${lang_target_name})
if(NOT TARGET ts-${lang})
add_custom_target(ts-${lang})
endif()
add_dependencies(ts-${lang} ${lang_target_name})
endforeach()
add_ts_target(ts-${catalog}-untranslated
${source_files_list_file}
"${CMAKE_CURRENT_SOURCE_DIR}/${catalog}_untranslated.ts"
)
add_dependencies(ts-${catalog}-all ts-${catalog}-untranslated)
endfunction()
# Create the English "translation" for "qt".
generate_empty_ts_file("qt_en.ts")
# Create TS targets
add_ts_targets(qtbase
DIRECTORIES
qtbase/src
qtactiveqt/src # just 4 strings from QAxSelect
qtimageformats/src # just 10 error messages from tga reader. uses bad context.
)
add_ts_targets(qtdeclarative DIRECTORIES qtdeclarative/src
EXCLUDE declarative/src/quickcontrols/designer)
add_ts_targets(qtmultimedia DIRECTORIES qtmultimedia/src)
#add_ts_targets(qtsvg DIRECTORIES qtsvg/src) # empty
#add_ts_targets(qtwebkit DIRECTORIES qtwebkit) # messages from test browser only
#add_ts_targets(qt3d DIRECTIORIES qt3d/src) # empty except one dubious error message
add_ts_targets(qtconnectivity DIRECTORIES qtconnectivity/src)
#add_ts_targets(qtdocgallery DIRECTORIES qtdocgallery/src) # dead module
#add_ts_targets(qtfeedback DIRECTORIES qtfeedback/src) # empty
#add_ts_targets(qtjsondb DIRECTORIES qtjsondb/src) # dead module, just 3 error messages
add_ts_targets(qtlocation DIRECTORIES qtlocation/src)
#add_ts_targets(qtpim DIRECTORIES qtpim/src) # not released with qt
#add_ts_targets(qtsensors DIRECTORIES qtsensors/src) # empty
#add_ts_targets(qtsystems DIRECTORIES qtsystems/src) # not released with qt
add_ts_targets(qtwebsockets DIRECTORIES qtwebsockets/src)
add_ts_targets(qtserialport DIRECTORIES qtserialport/src)
add_ts_targets(qtwebengine DIRECTORIES qtwebengine/src)
add_ts_targets(designer DIRECTORIES qttools/src/designer
qttools/src/shared/deviceskin
qttools/src/shared/findwidget
qttools/src/shared/fontpanel
qttools/src/shared/qtgradienteditor
qttools/src/shared/qtpropertybrowser
qttools/src/shared/qttoolbardialog
MODULES Designer)
add_ts_targets(linguist DIRECTORIES qttools/src/linguist/linguist)
add_ts_targets(assistant DIRECTORIES qttools/src/assistant/assistant
qttools/src/shared/fontpanel) # add qcollectiongenerator here as well?
add_ts_targets(qt_help DIRECTORIES qttools/src/assistant/help
MODULES Help)
#add_ts_targets(qmlscene DIRECTORIES qtdeclarative/tools/qmlscene) # almost empty due to missing tr()
# Write the catalogs.json file. No add_ts_targets calls beyond this point!
string(PREPEND catalogs_file_content "[\n")
string(APPEND catalogs_file_content "\n]\n")
file(WRITE "${catalogs_file}" "${catalogs_file_content}")
# Create check target
add_custom_target(check-ts
COMMAND perl check-ts.pl
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
add_dependencies(check-ts ts-all)
# Update and install qm command
add_custom_target(updateqm ALL)
file(GLOB ts_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.ts")
file(GLOB en_ts_files "${en_ts_file_dir}/*.ts")
list(APPEND ts_files ${en_ts_files})
if(QT_WILL_INSTALL)
set(qm_output_dir "${QT_BUILD_DIR}/${INSTALL_TRANSLATIONSDIR}")
else()
set(qm_output_dir "${QT_BUILD_INTERNALS_RELOCATABLE_INSTALL_PREFIX}/${INSTALL_TRANSLATIONSDIR}")
endif()
set_source_files_properties(${ts_files} PROPERTIES OUTPUT_LOCATION "${qm_output_dir}")
qt_add_lrelease(updateqm
TS_FILES ${ts_files}
NO_GLOBAL_TARGET
QM_FILES_OUTPUT_VARIABLE qm_files
OPTIONS "-silent")
qt_install(FILES ${qm_files} DESTINATION "${INSTALL_TRANSLATIONSDIR}")
qt_path_join(catalogs_file_install_dir ${QT_INSTALL_DIR} ${INSTALL_TRANSLATIONSDIR})
qt_copy_or_install(FILES ${catalogs_file} DESTINATION "${catalogs_file_install_dir}")
# Custom target to add modified ts files to git
add_custom_target(stage-ts
COMMAND ${CMAKE_COMMAND} -DLCONVERT_BIN="$" -P ${CMAKE_CURRENT_SOURCE_DIR}/git-stage-script.cmake
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMAND_EXPAND_LISTS
)