summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt4
-rw-r--r--cmake/QtCreatorAPI.cmake53
-rw-r--r--share/qtcreator/CMakeLists.txt2
-rw-r--r--share/qtcreator/translations/CMakeLists.txt214
-rw-r--r--share/qtcreator/translations/extract-customwizards.py67
-rw-r--r--share/qtcreator/translations/extract-externaltools.py64
-rw-r--r--share/qtcreator/translations/extract-jsonwizards.py81
-rw-r--r--share/qtcreator/translations/extract-snippets.py65
-rw-r--r--src/plugins/helloworld/CMakeLists.txt1
-rw-r--r--src/plugins/qmldesigner/CMakeLists.txt2
-rw-r--r--src/plugins/studiowelcome/CMakeLists.txt2
11 files changed, 548 insertions, 7 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 41278e8d93..c047ca59d5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -35,8 +35,8 @@ if (WITH_TESTS)
endif()
find_package(Qt5
- COMPONENTS Concurrent Core Network PrintSupport Qml Quick QuickWidgets
- Sql Widgets ${_TEST_QT_COMPONENT}
+ COMPONENTS Concurrent Core LinguistTools Network PrintSupport Qml Quick
+ QuickWidgets Sql Widgets ${_TEST_QT_COMPONENT}
REQUIRED
)
diff --git a/cmake/QtCreatorAPI.cmake b/cmake/QtCreatorAPI.cmake
index 1613455fc6..db98b9751c 100644
--- a/cmake/QtCreatorAPI.cmake
+++ b/cmake/QtCreatorAPI.cmake
@@ -94,6 +94,22 @@ set(__QTC_TESTS "" CACHE INTERNAL "*** Internal ***")
# Internal functions
#
+function(append_extra_translations target_name)
+ if(NOT ARGN)
+ return()
+ endif()
+
+ if(TARGET "${target_name}")
+ get_target_property(_input "${target_name}" QT_EXTRA_TRANSLATIONS)
+ if (_input)
+ set(_output "${_input}" "${ARGN}")
+ else()
+ set(_output "${ARGN}")
+ endif()
+ set_target_properties("${target_name}" PROPERTIES QT_EXTRA_TRANSLATIONS "${_output}")
+ endif()
+endfunction()
+
function(update_cached_list name value)
set(_tmp_list "${${name}}")
list(APPEND _tmp_list "${value}")
@@ -321,8 +337,8 @@ endfunction()
#
function(add_qtc_library name)
- cmake_parse_arguments(_arg "STATIC;OBJECT" ""
- "DEFINES;DEPENDS;INCLUDES;PUBLIC_DEFINES;PUBLIC_DEPENDS;PUBLIC_INCLUDES;SOURCES;EXPLICIT_MOC;SKIP_AUTOMOC;PROPERTIES" ${ARGN}
+ cmake_parse_arguments(_arg "STATIC;OBJECT;SKIP_TRANSLATION" ""
+ "DEFINES;DEPENDS;EXTRA_TRANSLATIONS;INCLUDES;PUBLIC_DEFINES;PUBLIC_DEPENDS;PUBLIC_INCLUDES;SOURCES;EXPLICIT_MOC;SKIP_AUTOMOC;PROPERTIES" ${ARGN}
)
if (${_arg_UNPARSED_ARGUMENTS})
@@ -384,6 +400,11 @@ function(add_qtc_library name)
set_property(SOURCE ${file} PROPERTY SKIP_AUTOMOC ON)
endforeach()
+ set(skip_translation OFF)
+ if (_arg_SKIP_TRANSLATION)
+ set(skip_translation ON)
+ endif()
+
qtc_output_binary_dir(_output_binary_dir)
set_target_properties(${name} PROPERTIES
SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}"
@@ -426,13 +447,15 @@ function(add_qtc_library name)
COMPONENT Devel EXCLUDE_FROM_ALL
)
endif()
+
+ append_extra_translations("${name}" "${_arg_EXTRA_TRANSLATIONS}")
endfunction(add_qtc_library)
function(add_qtc_plugin target_name)
cmake_parse_arguments(_arg
- "EXPERIMENTAL;SKIP_DEBUG_CMAKE_FILE_CHECK;SKIP_INSTALL;INTERNAL_ONLY"
+ "EXPERIMENTAL;SKIP_DEBUG_CMAKE_FILE_CHECK;SKIP_INSTALL;INTERNAL_ONLY;SKIP_TRANSLATION"
"VERSION;COMPAT_VERSION;PLUGIN_JSON_IN;PLUGIN_PATH;PLUGIN_NAME;OUTPUT_NAME"
- "CONDITION;DEPENDS;PUBLIC_DEPENDS;DEFINES;PUBLIC_DEFINES;INCLUDES;PUBLIC_INCLUDES;PLUGIN_DEPENDS;PLUGIN_RECOMMENDS;SOURCES;EXPLICIT_MOC"
+ "CONDITION;DEPENDS;EXTRA_TRANSLATIONS;PUBLIC_DEPENDS;DEFINES;PUBLIC_DEFINES;INCLUDES;PUBLIC_INCLUDES;PLUGIN_DEPENDS;PLUGIN_RECOMMENDS;SOURCES;EXPLICIT_MOC"
${ARGN}
)
@@ -585,6 +608,11 @@ function(add_qtc_plugin target_name)
set(plugin_dir "${_arg_PLUGIN_PATH}")
endif()
+ set(skip_translation OFF)
+ if (_arg_SKIP_TRANSLATION)
+ set(skip_translation ON)
+ endif()
+
qtc_output_binary_dir(_output_binary_dir)
set_target_properties(${target_name} PROPERTIES
SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}"
@@ -598,8 +626,10 @@ function(add_qtc_plugin target_name)
ARCHIVE_OUTPUT_DIRECTORY "${_output_binary_dir}/${plugin_dir}"
RUNTIME_OUTPUT_DIRECTORY "${_output_binary_dir}/${plugin_dir}"
OUTPUT_NAME "${name}"
+ QT_SKIP_TRANSLATION "${skip_translation}"
${_arg_PROPERTIES}
)
+ append_extra_translations("${target_name}" "${_arg_EXTRA_TRANSLATIONS}")
enable_pch(${target_name})
foreach(file IN LISTS _arg_EXPLICIT_MOC)
@@ -693,7 +723,9 @@ function(extend_qtc_plugin target_name)
endfunction()
function(add_qtc_executable name)
- cmake_parse_arguments(_arg "SKIP_INSTALL" "DESTINATION" "DEFINES;DEPENDS;INCLUDES;SOURCES;PROPERTIES" ${ARGN})
+ cmake_parse_arguments(_arg "SKIP_INSTALL;SKIP_TRANSLATION"
+ "DESTINATION"
+ "DEFINES;DEPENDS;EXTRA_TRANSLATIONS;INCLUDES;SOURCES;PROPERTIES" ${ARGN})
if ($_arg_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "add_qtc_executable had unparsed arguments!")
@@ -736,13 +768,21 @@ function(add_qtc_executable name)
target_include_directories("${name}" PRIVATE "${CMAKE_BINARY_DIR}/src" ${_arg_INCLUDES})
target_compile_definitions("${name}" PRIVATE ${_arg_DEFINES} ${TEST_DEFINES} ${DEFAULT_DEFINES})
target_link_libraries("${name}" PRIVATE ${_arg_DEPENDS} ${_TEST_DEPENDS})
+
+ set(skip_translation OFF)
+ if (_arg_SKIP_TRANSLATION)
+ set(skip_translation ON)
+ endif()
+
qtc_output_binary_dir(_output_binary_dir)
set_target_properties("${name}" PROPERTIES
BUILD_RPATH "${_RPATH_BASE}/${_RELATIVE_LIB_PATH}"
INSTALL_RPATH "${_RPATH_BASE}/${_RELATIVE_LIB_PATH}"
RUNTIME_OUTPUT_DIRECTORY "${_output_binary_dir}/${_DESTINATION}"
+ QT_SKIP_TRANSLATION "${skip_translation}"
${_arg_PROPERTIES}
)
+ append_extra_translations("${name}" "${_arg_EXTRA_TRANSLATIONS}")
enable_pch(${name})
if (NOT _arg_SKIP_INSTALL)
@@ -790,6 +830,9 @@ function(add_qtc_test name)
add_test(NAME ${name} COMMAND ${name})
fix_test_environment(${name})
endif()
+
+ # Never translate tests:
+ set_tests_properties(${name} PROPERTIES QT_SKIP_TRANSLATION ON)
endfunction()
function(finalize_qtc_gtest test_name)
diff --git a/share/qtcreator/CMakeLists.txt b/share/qtcreator/CMakeLists.txt
index 211a08521d..63393293c1 100644
--- a/share/qtcreator/CMakeLists.txt
+++ b/share/qtcreator/CMakeLists.txt
@@ -21,3 +21,5 @@ install(
FILES indexer_preincludes/qglobal.h indexer_preincludes/windows.h
DESTINATION "${IDE_DATA_PATH}/indexer_preincludes"
)
+
+add_subdirectory(translations)
diff --git a/share/qtcreator/translations/CMakeLists.txt b/share/qtcreator/translations/CMakeLists.txt
new file mode 100644
index 0000000000..dfa5da1238
--- /dev/null
+++ b/share/qtcreator/translations/CMakeLists.txt
@@ -0,0 +1,214 @@
+set(languages cs da de fr ja pl ru sl uk zh_CN zh_TW)
+set(bad_languages hu) # Fix these before including them in languages!
+
+find_package(PythonInterp)
+
+set(json_wizards_h "")
+set(custom_wizards_h "")
+set(externaltools_h "")
+set(snippets_h "")
+
+if (NOT PYTHONINTERP_FOUND OR NOT PYTHON_VERSION_STRING VERSION_GREATER_EQUAL "3.0.0")
+ message(WARNING "No python3 interpreter found, skipping extraction of data from XML and JSON files.\n *** Please pass -DPYTHON_EXECUTABLE=/path/to/python3 to cmake.")
+else()
+ set(json_wizards_h "${CMAKE_CURRENT_BINARY_DIR}/jsonwizards_tr.h")
+ add_custom_command(OUTPUT "${json_wizards_h}"
+ COMMAND "${PYTHON_EXECUTABLE}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/extract-jsonwizards.py"
+ "${PROJECT_SOURCE_DIR}/share/qtcreator/templates/wizards" "${json_wizards_h}"
+ COMMENT Generate translation data from JSON wizards
+ VERBATIM)
+
+ set(custom_wizards_h "${CMAKE_CURRENT_BINARY_DIR}/customwizards_tr.h")
+ add_custom_command(OUTPUT "${custom_wizards_h}"
+ COMMAND "${PYTHON_EXECUTABLE}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/extract-customwizards.py"
+ "${PROJECT_SOURCE_DIR}/share/qtcreator/templates/wizards" "${custom_wizards_h}"
+ COMMENT Generate translation data from XML wizards
+ VERBATIM)
+
+ set(externaltools_h "${CMAKE_CURRENT_BINARY_DIR}/externaltools_tr.h")
+ add_custom_command(OUTPUT "${externaltools_h}"
+ COMMAND "${PYTHON_EXECUTABLE}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/extract-externaltools.py"
+ "${PROJECT_SOURCE_DIR}/src/share/qtcreator/externaltools" "${externaltools_h}"
+ COMMENT Generate translation data from external tools definitions
+ VERBATIM)
+
+ set(snippets_h "${CMAKE_CURRENT_BINARY_DIR}/snippets_tr.h")
+ add_custom_command(OUTPUT "${snippets_h}"
+ COMMAND "${PYTHON_EXECUTABLE}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/extract-snippets.py"
+ "${PROJECT_SOURCE_DIR}/share/qtcreator/snippets" "${snippets_h}"
+ COMMENT Generate translation data from snippets definitions
+ VERBATIM)
+endif()
+
+function(_extract_ts_data_from_targets outprefix)
+ set(_sources "")
+ set(_includes "")
+
+ set(_targets "${ARGN}")
+ list(REMOVE_DUPLICATES _targets)
+
+ foreach(t IN ITEMS ${_targets})
+ if (TARGET "${t}")
+ get_target_property(_skip_translation "${t}" QT_SKIP_TRANSLATION)
+ get_target_property(_source_dir "${t}" SOURCE_DIR)
+ get_target_property(_interface_include_dirs "${t}" INTERFACE_INCLUDE_DIRECTORIES)
+ get_target_property(_include_dirs "${t}" INCLUDE_DIRECTORIES)
+ get_target_property(_source_files "${t}" SOURCES)
+ get_target_property(_extra_translations "${t}" QT_EXTRA_TRANSLATIONS)
+
+ if (NOT _skip_translation)
+ if(_include_dirs)
+ list(APPEND _includes ${_include_dirs})
+ endif()
+
+ if(_interface_include_dirs)
+ list(APPEND _interface_includes ${_include_dirs})
+ endif()
+
+ set(_target_sources "")
+ if(_source_files)
+ list(APPEND _target_sources ${_source_files})
+ endif()
+ if(_extra_translations)
+ list(APPEND _target_sources ${_extra_translations})
+ endif()
+ foreach(s IN ITEMS ${_target_sources})
+ get_filename_component(_abs_source "${s}" ABSOLUTE BASE_DIR "${_source_dir}")
+ list(APPEND _sources "${_abs_source}")
+ endforeach()
+ endif()
+ endif()
+ endforeach()
+
+ set("${outprefix}_sources" "${_sources}" PARENT_SCOPE)
+ set("${outprefix}_includes" "${_includes}" PARENT_SCOPE)
+endfunction()
+
+function(_create_ts_custom_target name)
+ cmake_parse_arguments(_arg "" "FILE_PREFIX;TS_TARGET_PREFIX" "LANGUAGES;SOURCES;INCLUDES" ${ARGN})
+ if (_arg_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR "Invalid parameters to _create_ts_custom_target: ${_arg_UNPARSED_ARGUMENTS}.")
+ endif()
+
+ if (NOT _arg_TS_TARGET_PREFIX)
+ set(_arg_TS_TARGET_PREFIX "ts_")
+ endif()
+
+ set(ts_languages ${_arg_LANGUAGES})
+ if (NOT ts_languages)
+ set(ts_languages "${name}")
+ endif()
+
+ foreach(l IN ITEMS ${ts_languages})
+ list(APPEND ts_files "${CMAKE_CURRENT_SOURCE_DIR}/${_arg_FILE_PREFIX}_${l}.ts")
+ endforeach()
+
+ set(_sources "${_arg_SOURCES}")
+ list(SORT _sources)
+
+ set(_includes "${_arg_INCLUDES}")
+
+ list(REMOVE_DUPLICATES _sources)
+ list(REMOVE_DUPLICATES _includes)
+
+ list(REMOVE_ITEM _sources "")
+ list(REMOVE_ITEM _includes "")
+
+ set(_prepended_includes)
+ foreach(include IN LISTS _includes)
+ list(APPEND _prepended_includes "-I${include}")
+ endforeach()
+ set(_includes "${_prepended_includes}")
+
+ string(REPLACE ";" "\n" _sources_str "${_sources}")
+ string(REPLACE ";" "\n" _includes_str "${_includes}")
+
+ set(ts_file_list "${CMAKE_CURRENT_BINARY_DIR}/ts_${name}.lst")
+ file(WRITE "${ts_file_list}" "${_sources_str}\n${_includes_str}\n")
+
+ add_custom_target("${_arg_TS_TARGET_PREFIX}${name}"
+ COMMAND Qt5::lupdate -locations relative -no-ui-lines -no-sort "@${ts_file_list}" -ts ${ts_files}
+ WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+ COMMENT "Generate .ts files"
+ DEPENDS ${_sources}
+ VERBATIM)
+endfunction()
+
+function(add_translation_targets file_prefix)
+ if (NOT TARGET Qt5::lrelease)
+ # No Qt translation tools were found: Skip this directory
+ message(WARNING "No Qt translation tools found, skipping translation targets. Add find_package(Qt5 COMPONENTS LinguistTools) to CMake to enable.")
+ return()
+ endif()
+
+ cmake_parse_arguments(_arg ""
+ "OUTPUT_DIRECTORY;INSTALL_DESTINATION;TS_TARGET_PREFIX;QM_TARGET_PREFIX;ALL_QM_TARGET"
+ "LANGUAGES;TARGETS;SOURCES;INCLUDES" ${ARGN})
+ if (_arg_UNPARSED_ARGUMENTS)
+ message(FATAL_ERROR "Invalid parameters to add_translation_targets: ${_arg_UNPARSED_ARGUMENTS}.")
+ endif()
+
+ if (NOT _arg_TS_TARGET_PREFIX)
+ set(_arg_TS_TARGET_PREFIX "ts_")
+ endif()
+
+ if (NOT _arg_QM_TARGET_PREFIX)
+ set(_arg_QM_TARGET_PREFIX "generate_qm_file_")
+ endif()
+
+ if (NOT _arg_ALL_QM_TARGET)
+ set(_arg_ALL_QM_TARGET "generate_qm_files")
+ endif()
+
+ if (NOT _arg_OUTPUT_DIRECTORY)
+ set(_arg_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
+ endif()
+
+ if (NOT _arg_INSTALL_DESTINATION)
+ message(FATAL_ERROR "Please provide a INSTALL_DESTINATION to add_translation_targets")
+ endif()
+
+ _extract_ts_data_from_targets(_to_process "${_arg_TARGETS}")
+
+ _create_ts_custom_target(untranslated
+ FILE_PREFIX "${file_prefix}" TS_TARGET_PREFIX "${_arg_TS_TARGET_PREFIX}"
+ SOURCES ${_to_process_sources} ${_arg_SOURCES} INCLUDES ${_to_process_includes} ${_arg_INCLUDES})
+
+ if (NOT TARGET "${_arg_ALL_QM_TARGET}")
+ add_custom_target("${_arg_ALL_QM_TARGET}" ALL COMMENT "Generate .qm-files")
+ endif()
+
+ foreach(l IN ITEMS ${_arg_LANGUAGES})
+ set(_ts_file "${CMAKE_CURRENT_SOURCE_DIR}/${file_prefix}_${l}.ts")
+ set(_qm_file "${_arg_OUTPUT_DIRECTORY}/${file_prefix}_${l}.qm")
+
+ _create_ts_custom_target("${l}" FILE_PREFIX "${file_prefix}" TS_TARGET_PREFIX "${_arg_TS_TARGET_PREFIX}"
+ SOURCES ${_to_process_sources} ${_arg_SOURCES} INCLUDES ${_to_process_includes} ${_arg_INCLUDES})
+
+ add_custom_command(OUTPUT "${_qm_file}"
+ COMMAND Qt5::lrelease "${_ts_file}" -qm "${_qm_file}"
+ MAIN_DEPENDENCY "${_ts_file}"
+ WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+ COMMENT "Generate .qm file"
+ VERBATIM)
+ add_custom_target("${_arg_QM_TARGET_PREFIX}${l}" DEPENDS "${_qm_file}")
+ install(FILES "${_qm_file}" DESTINATION ${_arg_INSTALL_DESTINATION})
+
+ add_dependencies("${_arg_ALL_QM_TARGET}" "${_arg_QM_TARGET_PREFIX}${l}")
+ endforeach()
+
+ _create_ts_custom_target(all LANGUAGES ${_arg_LANGUAGES} FILE_PREFIX "${file_prefix}"
+ SOURCES ${_to_process_sources} ${_arg_SOURCES} INCLUDES ${_to_process_includes} ${_arg_INCLUDES})
+endfunction()
+
+### collect targets to include in documentation:
+add_translation_targets(qtcreator
+ LANGUAGES ${languages}
+ OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${IDE_DATA_PATH}/translations"
+ INSTALL_DESTINATION "${IDE_DATA_PATH}/translations"
+ TARGETS "${__QTC_LIBRARIES}" "${__QTC_PLUGINS}"
+ SOURCES "${json_wizards_h}" "${custom_wizards_h}" "${externaltools_h}" "${snippets_h}")
diff --git a/share/qtcreator/translations/extract-customwizards.py b/share/qtcreator/translations/extract-customwizards.py
new file mode 100644
index 0000000000..14b7ddcf33
--- /dev/null
+++ b/share/qtcreator/translations/extract-customwizards.py
@@ -0,0 +1,67 @@
+#!/usr/bin/python
+############################################################################
+#
+# Copyright (C) 2019 The Qt Company Ltd.
+# Contact: https://www.qt.io/licensing/
+#
+# This file is part of Qt Creator.
+#
+# Commercial License Usage
+# Licensees holding valid commercial Qt licenses may use this file in
+# accordance with the commercial license agreement provided with the
+# Software or, alternatively, in accordance with the terms contained in
+# a written agreement between you and The Qt Company. For licensing terms
+# and conditions see https://www.qt.io/terms-conditions. For further
+# information use the contact form at https://www.qt.io/contact-us.
+#
+# GNU General Public License Usage
+# Alternatively, this file may be used under the terms of the GNU
+# General Public License version 3 as published by the Free Software
+# Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+# included in the packaging of this file. Please review the following
+# information to ensure the GNU General Public License requirements will
+# be met: https://www.gnu.org/licenses/gpl-3.0.html.
+#
+############################################################################
+
+import os
+import sys
+import xml.etree.ElementTree as ET
+
+if len(sys.argv) != 3:
+ print("Please provide a top level directory to scan and a file to write into.")
+ sys.exit(1)
+
+top_dir = sys.argv[1]
+target_file = sys.argv[2]
+
+
+def fix_value(value):
+ value = value.replace('\"', '\\\"')
+ value = value.replace('\n', '\\\n')
+ return value
+
+
+def parse_file(file_path):
+ root = ET.parse(file_path).getroot()
+ result = ''
+
+ for i in ['.//description', './/displayname', './/displaycategory',
+ './/fieldpagetitle', './/fielddescription',
+ './/comboentrytext',
+ './/message']:
+ for e in root.findall(i):
+ result += 'QT_TRANSLATE_NOOP("ProjectExplorer::CustomWizard", "{}"); // {}\n'.format(fix_value(e.text), file_path)
+
+ return result
+
+result = ''
+
+# traverse root directory, and list directories as dirs and files as files
+for root, _, files in os.walk(top_dir):
+ for file in files:
+ if file == "wizard.xml":
+ result += parse_file(os.path.join(root, file))
+
+with open(target_file, 'w') as header_file:
+ header_file.write(result)
diff --git a/share/qtcreator/translations/extract-externaltools.py b/share/qtcreator/translations/extract-externaltools.py
new file mode 100644
index 0000000000..ad4d19a844
--- /dev/null
+++ b/share/qtcreator/translations/extract-externaltools.py
@@ -0,0 +1,64 @@
+#!/usr/bin/python
+############################################################################
+#
+# Copyright (C) 2019 The Qt Company Ltd.
+# Contact: https://www.qt.io/licensing/
+#
+# This file is part of Qt Creator.
+#
+# Commercial License Usage
+# Licensees holding valid commercial Qt licenses may use this file in
+# accordance with the commercial license agreement provided with the
+# Software or, alternatively, in accordance with the terms contained in
+# a written agreement between you and The Qt Company. For licensing terms
+# and conditions see https://www.qt.io/terms-conditions. For further
+# information use the contact form at https://www.qt.io/contact-us.
+#
+# GNU General Public License Usage
+# Alternatively, this file may be used under the terms of the GNU
+# General Public License version 3 as published by the Free Software
+# Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+# included in the packaging of this file. Please review the following
+# information to ensure the GNU General Public License requirements will
+# be met: https://www.gnu.org/licenses/gpl-3.0.html.
+#
+############################################################################
+
+import os
+import sys
+import xml.etree.ElementTree as ET
+
+if len(sys.argv) != 3:
+ print("Please provide a top level directory to scan and a file to write into.")
+ sys.exit(1)
+
+top_dir = sys.argv[1]
+target_file = sys.argv[2]
+
+
+def fix_value(value):
+ value = value.replace('\"', '\\\"')
+ value = value.replace('\n', '\\\n')
+ return value
+
+
+def parse_file(file_path):
+ root = ET.parse(file_path).getroot()
+ result = ''
+
+ for i in ['.//description', './/displayname', './/category']:
+ for e in root.findall(i):
+ result += 'QT_TRANSLATE_NOOP("Core::Internal::ExternalTool", "{}"); // {}\n'.format(fix_value(e.text), file_path)
+
+ return result
+
+result = ''
+
+# traverse root directory, and list directories as dirs and files as files
+for root, _, files in os.walk(top_dir):
+ for file in files:
+ if file.endswith('.xml'):
+ result += parse_file(os.path.join(root, file))
+
+with open(target_file, 'w') as header_file:
+ header_file.write(result)
diff --git a/share/qtcreator/translations/extract-jsonwizards.py b/share/qtcreator/translations/extract-jsonwizards.py
new file mode 100644
index 0000000000..8242481131
--- /dev/null
+++ b/share/qtcreator/translations/extract-jsonwizards.py
@@ -0,0 +1,81 @@
+#!/usr/bin/python
+############################################################################
+#
+# Copyright (C) 2019 The Qt Company Ltd.
+# Contact: https://www.qt.io/licensing/
+#
+# This file is part of Qt Creator.
+#
+# Commercial License Usage
+# Licensees holding valid commercial Qt licenses may use this file in
+# accordance with the commercial license agreement provided with the
+# Software or, alternatively, in accordance with the terms contained in
+# a written agreement between you and The Qt Company. For licensing terms
+# and conditions see https://www.qt.io/terms-conditions. For further
+# information use the contact form at https://www.qt.io/contact-us.
+#
+# GNU General Public License Usage
+# Alternatively, this file may be used under the terms of the GNU
+# General Public License version 3 as published by the Free Software
+# Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+# included in the packaging of this file. Please review the following
+# information to ensure the GNU General Public License requirements will
+# be met: https://www.gnu.org/licenses/gpl-3.0.html.
+#
+############################################################################
+
+import os
+import sys
+import json
+
+if len(sys.argv) != 3:
+ print("Please provide a top level directory to scan and a file to write into.")
+ sys.exit(1)
+
+top_dir = sys.argv[1]
+target_file = sys.argv[2]
+
+
+def recursive_iter(obj, key=''):
+ if isinstance(obj, dict):
+ for k in sorted(obj.keys()):
+ yield from recursive_iter(obj[k], k)
+ elif isinstance(obj, tuple):
+ for item in obj:
+ yield from recursive_iter(item, '')
+ elif isinstance(obj, list):
+ for item in obj:
+ yield from recursive_iter(item, '')
+ else:
+ yield key, obj
+
+
+def fix_value(value):
+ value = value.replace('\"', '\\\"')
+ value = value.replace('\n', '\\\n')
+ return value
+
+
+def parse_file(file_path):
+ root = ''
+ result = ''
+
+ with open(file_path) as f:
+ root = json.load(f)
+
+ for key, value in recursive_iter(root):
+ if key.startswith('tr'):
+ result += 'QT_TRANSLATE_NOOP("ProjectExplorer::JsonWizard", "{}"); // {}\n'.format(fix_value(value), file_path)
+
+ return result
+
+result = '// This file is autogenerated\n'
+
+# traverse root directory, and list directories as dirs and files as files
+for root, _, files in os.walk(top_dir):
+ for file in files:
+ if file == "wizard.json":
+ result += parse_file(os.path.join(root, file))
+
+with open(target_file, 'w') as header_file:
+ header_file.write(result)
diff --git a/share/qtcreator/translations/extract-snippets.py b/share/qtcreator/translations/extract-snippets.py
new file mode 100644
index 0000000000..2c393024a6
--- /dev/null
+++ b/share/qtcreator/translations/extract-snippets.py
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+############################################################################
+#
+# Copyright (C) 2019 The Qt Company Ltd.
+# Contact: https://www.qt.io/licensing/
+#
+# This file is part of Qt Creator.
+#
+# Commercial License Usage
+# Licensees holding valid commercial Qt licenses may use this file in
+# accordance with the commercial license agreement provided with the
+# Software or, alternatively, in accordance with the terms contained in
+# a written agreement between you and The Qt Company. For licensing terms
+# and conditions see https://www.qt.io/terms-conditions. For further
+# information use the contact form at https://www.qt.io/contact-us.
+#
+# GNU General Public License Usage
+# Alternatively, this file may be used under the terms of the GNU
+# General Public License version 3 as published by the Free Software
+# Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+# included in the packaging of this file. Please review the following
+# information to ensure the GNU General Public License requirements will
+# be met: https://www.gnu.org/licenses/gpl-3.0.html.
+#
+############################################################################
+
+import os
+import sys
+import xml.etree.ElementTree as ET
+
+if len(sys.argv) != 3:
+ print("Please provide a top level directory to scan and a file to write into.")
+ sys.exit(1)
+
+top_dir = sys.argv[1]
+target_file = sys.argv[2]
+
+
+def fix_value(value):
+ value = value.replace('\"', '\\\"')
+ value = value.replace('\n', '\\\n')
+ return value
+
+
+def parse_file(file_path):
+ root = ET.parse(file_path).getroot()
+ result = ''
+
+ for e in root.findall('snippet'):
+ if 'complement' in e.attrib:
+ result += 'QT_TRANSLATE_NOOP3("TextEditor::Internal::Snippets", "{}", "group:\'{}\' trigger:\'{}\'"); // {}\n' \
+ .format(fix_value(e.attrib['complement']), e.attrib['group'], e.attrib['trigger'], file_path)
+
+ return result
+
+result = ''
+
+# traverse root directory, and list directories as dirs and files as files
+for root, _, files in os.walk(top_dir):
+ for file in files:
+ if file.endswith('.xml'):
+ result += parse_file(os.path.join(root, file))
+
+with open(target_file, 'w') as header_file:
+ header_file.write(result)
diff --git a/src/plugins/helloworld/CMakeLists.txt b/src/plugins/helloworld/CMakeLists.txt
index 6b9c5df88d..e14fbba2c8 100644
--- a/src/plugins/helloworld/CMakeLists.txt
+++ b/src/plugins/helloworld/CMakeLists.txt
@@ -1,4 +1,5 @@
add_qtc_plugin(HelloWorld
+ SKIP_TRANSLATION
PLUGIN_DEPENDS Core
SOURCES
helloworldplugin.cpp helloworldplugin.h
diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt
index 9b136f89c0..99b82116bf 100644
--- a/src/plugins/qmldesigner/CMakeLists.txt
+++ b/src/plugins/qmldesigner/CMakeLists.txt
@@ -28,6 +28,8 @@ add_qtc_plugin(QmlDesigner
components/propertyeditor/propertyeditorvalue.h
components/connectioneditor/connectionviewwidget.h
SKIP_DEBUG_CMAKE_FILE_CHECK
+ EXTRA_TRANSLATIONS
+ "${PROJECT_SOURCE_DIR}/share/qtcreator/qmldesigner"
)
set(QmlDesignerPluginInstallPrefix "${IDE_PLUGIN_PATH}/qmldesigner")
diff --git a/src/plugins/studiowelcome/CMakeLists.txt b/src/plugins/studiowelcome/CMakeLists.txt
index 30e5cc62af..217e5f7de4 100644
--- a/src/plugins/studiowelcome/CMakeLists.txt
+++ b/src/plugins/studiowelcome/CMakeLists.txt
@@ -7,4 +7,6 @@ add_qtc_plugin(StudioWelcome
studiowelcome_global.h
studiowelcome.qrc
"${PROJECT_SOURCE_DIR}/src/share/3rdparty/studiofonts/studiofonts.qrc"
+ EXTRA_TRANSLATIONS
+ qml
)