diff options
-rw-r--r-- | CMakeLists.txt | 4 | ||||
-rw-r--r-- | cmake/QtCreatorAPI.cmake | 53 | ||||
-rw-r--r-- | share/qtcreator/CMakeLists.txt | 2 | ||||
-rw-r--r-- | share/qtcreator/translations/CMakeLists.txt | 214 | ||||
-rw-r--r-- | share/qtcreator/translations/extract-customwizards.py | 67 | ||||
-rw-r--r-- | share/qtcreator/translations/extract-externaltools.py | 64 | ||||
-rw-r--r-- | share/qtcreator/translations/extract-jsonwizards.py | 81 | ||||
-rw-r--r-- | share/qtcreator/translations/extract-snippets.py | 65 | ||||
-rw-r--r-- | src/plugins/helloworld/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/plugins/qmldesigner/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/plugins/studiowelcome/CMakeLists.txt | 2 |
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 ) |