diff options
-rw-r--r-- | packaging-tools/create_installer.py | 8 | ||||
-rw-r--r-- | packaging-tools/update_component_translations.py | 150 | ||||
-rwxr-xr-x | packaging-tools/update_component_translations.sh | 122 |
3 files changed, 154 insertions, 126 deletions
diff --git a/packaging-tools/create_installer.py b/packaging-tools/create_installer.py index 194971c5c..d89243375 100644 --- a/packaging-tools/create_installer.py +++ b/packaging-tools/create_installer.py @@ -69,6 +69,7 @@ from runner import run_cmd from sdkcomponent import IfwPayloadItem, IfwSdkComponent, parse_ifw_sdk_comp from sign_installer import recursive_sign_notarize from threadedwork import ThreadedWork +from update_component_translations import lrelease log = init_logger(__name__, debug_mode=False) @@ -686,11 +687,10 @@ def create_target_components(task: QtInstallerTaskType) -> None: # Copy Meta data metadata_content_source_root = os.path.join(sdk_comp.pkg_template_folder, "meta") copy_tree(metadata_content_source_root, str(sdk_comp.meta_dir_dest)) - if os.path.isfile(os.path.join(task.script_root_dir, "lrelease")): + lrelease_tool = Path(task.script_root_dir, "lrelease") + if lrelease_tool.is_file(): # create translation binaries if translation source files exist for component - update_script = os.path.join(task.script_root_dir, "update_component_translations.sh") - lrelease_tool = os.path.join(task.script_root_dir, "lrelease") - run_cmd(cmd=[update_script, "-r", lrelease_tool, str(dest_base)]) + lrelease(lrelease_tool, dest_base) # add files into tag substitution task.directories_for_substitutions.append(str(sdk_comp.meta_dir_dest)) # handle archives diff --git a/packaging-tools/update_component_translations.py b/packaging-tools/update_component_translations.py new file mode 100644 index 000000000..489615e49 --- /dev/null +++ b/packaging-tools/update_component_translations.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +############################################################################# +# +# Copyright (C) 2023 The Qt Company Ltd. +# Contact: https://www.qt.io/licensing/ +# +# This file is part of the release tools of the Qt Toolkit. +# +# $QT_BEGIN_LICENSE:GPL-EXCEPT$ +# 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. +# +# $QT_END_LICENSE$ +# +############################################################################# + +"""Update component translations""" + +import argparse +import sys +from pathlib import Path + +from bldinstallercommon import locate_paths +from logging_util import init_logger +from runner import run_cmd + +log = init_logger(__name__, debug_mode=False) + + +def usage() -> None: + """Log usage""" + log.info("Usage: $0 [OPTION]... [PKG_DIR]") + log.info("Performs linguist operations for component translations.") + log.info("This script takes only one positional argument [PKG_DIR] which") + log.info("is a path for the package templates directory to work in.") + log.info(" -u <path to lupdate> Updates source strings in existing TS files") + log.info(" -r <path to lrelease> Produces QM files out of TS files") + + +def lupdate(lupdate_path: Path, pkg_root: Path) -> None: + """ + Updates source strings in existing TS files + + Args: + lupdate_path: Path to lupdate tool + pkg_root: Path for the package templates directory containing TS files + """ + ts_files = locate_paths(pkg_root, ["*.ts"]) + for ts_file in ts_files: + ts_file_path = Path(ts_file).resolve() + ts_file_dir = ts_file_path.parent + log.info("lupdate: %s", str(ts_file_path)) + cmd = [str(lupdate_path), "-locations", "none", "-no-ui-lines", "-no-sort", "-no-obsolete"] + cmd += [str(ts_file_dir), "-ts", ts_file_path.name] + run_cmd(cmd=cmd, cwd=ts_file_dir) + log.info("lupdate: Done") + + +def lrelease(lrelease_path: Path, pkg_root: Path) -> None: + """ + Produces QM files out of TS files + + Args: + lrelease_path: Path to lrelease tool + pkg_root: Path for the package templates directory containing TS files + """ + ts_files = locate_paths(pkg_root, ["*.ts"]) + for ts_file in ts_files: + ts_file_path = Path(ts_file).resolve() + ts_file_dir = ts_file_path.parent + locale = ts_file_path.stem + log.info("lrelease: %s", str(ts_file_path)) + if locale in ("ko", "zh", "untranslated"): + continue + run_cmd(cmd=[str(lrelease_path), str(ts_file_path)], cwd=ts_file_dir) + package_xml = ts_file_dir / "package.xml" + package_xml_contents = package_xml.read_text(encoding="utf-8") + if locale + ".qm" in package_xml_contents: + log.info("Translation file '%s.qm' already defined in package.xml", locale) + else: + lines = package_xml_contents.splitlines() + if "Translations" in package_xml_contents: # check if already contains <Translations> + for line in lines: + if "</Package>" in line: + lines.remove(line) # remove lines containing </Package> + if "</Translations>" in line: + lines.remove(line) # remove lines containing </Translations> + else: + for line in lines: + if "</Package>" in line: + lines.remove(line) # remove lines containing </Package> + lines.append(" <Translations>") # append <Translations> tag + lines.append(" <Translation>${locale}.qm</Translation>") + lines.append(" </Translations>") + lines.append("</Package>") + package_xml.unlink() + with package_xml.open("w", encoding="utf-8") as new_file: + for line in lines: + new_file.write(line) + log.info("lrelease: Done") + + +def main() -> None: + """Main""" + parser = argparse.ArgumentParser( + prog="Performs linguist operations for component translations.", add_help=True + ) + parser.add_argument( + "-u", dest="lupdate_path", type=Path, required=False, help="Path to lupdate" + ) + parser.add_argument( + "-r", dest="lrelease_path", type=Path, required=False, help="Path to lrelease" + ) + parser.add_argument( + dest="pkg_dir", type=Path, help="Path to package templates directory" + ) + args = parser.parse_args(sys.argv[1:]) + if args.pkg_dir is None or (args.lupdate_path is None and args.lrelease_path is None): + usage() + raise SystemExit(1) + try: + pkg_root = args.pkg_dir.resolve(strict=True) + except OSError as err: + log.error("The specified package templates directory doesn't exist: %s", str(args.pkg_dir)) + raise SystemExit(1) from err + if args.lupdate_path is not None: + lupdate_path = args.lupdate_path.resolve(strict=True) + lupdate(lupdate_path, pkg_root) + if args.lrelease_path is not None: + lrelease_path = args.lrelease_path.resolve(strict=True) + lrelease(lrelease_path, pkg_root) + + +if __name__ == "__main__": + main() diff --git a/packaging-tools/update_component_translations.sh b/packaging-tools/update_component_translations.sh deleted file mode 100755 index cb672cc1b..000000000 --- a/packaging-tools/update_component_translations.sh +++ /dev/null @@ -1,122 +0,0 @@ -#! /bin/bash -############################################################################# -## -## Copyright (C) 2021 The Qt Company Ltd. -## Contact: https://www.qt.io/licensing/ -## -## This file is part of the FOO module of the Qt Toolkit. -## -## $QT_BEGIN_LICENSE:GPL-EXCEPT$ -## 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. -## -## $QT_END_LICENSE$ -## -############################################################################# - -set -o errexit -set -o nounset -set -o pipefail - -pkgroot="" -lupdate="" -lrelease="" - -usage() { - echo "Usage: $0 [OPTION]... [PKG_DIR]" - echo "Performs linguist operations for component translations." - echo - echo "This script takes only one positional argument [PKG_DIR] which" - echo "is a path for the package templates directory to work in." - echo - echo " -u <path to lupdate> Updates source strings in existing TS files" - echo " -r <path to lrelease> Produces QM files out of TS files" - echo -} - -update() { - find "$pkgroot" -name "*.ts" | while read fname; - do - filepath="${fname%/*}/" - cd "$filepath" - "$lupdate" -locations none -no-ui-lines -no-sort -no-obsolete "$filepath" -ts "$fname" - done - echo "Done" -} - -release() { - find "$pkgroot" -name "*.ts" | while read fname; - do - filepath="${fname%/*}/" - cd "$filepath" - locale="$(basename $fname .ts)" - if [ $locale == "ko" -o $locale == "zh" -o $locale == "untranslated" ]; then - continue - fi - "$lrelease" "$fname" - if grep -q ${locale}.qm package.xml; then - echo "Translation file ${locale}.qm already defined in package.xml" - else - if grep -q Translations package.xml; then - sed -i '0,/<\/Package>/{//d}' package.xml - sed -i '0,/<\/Translations>/{//d}' package.xml - else - sed -i '0,/<\/Package>/{//d}' package.xml - cat <<EOT >> package.xml - <Translations> -EOT - fi - cat <<EOT >> package.xml - <Translation>${locale}.qm</Translation> - </Translations> -</Package> -EOT - fi - done - echo "Done" -} - -while getopts hu:r: flag -do - case "$flag" in - h) usage && exit 0;; - u) lupdate="$OPTARG";; - r) lrelease="$OPTARG";; - esac -done - -shift $((OPTIND - 1)) -if [ "$#" -gt 0 ]; then - pkgroot="$1" -fi - -if [ -z "$pkgroot" ]; then - usage - exit 1 -else - pkgroot=$(realpath "$pkgroot") -fi - -if [ "$lupdate" ]; then - lupdate=$(realpath "$lupdate") - update -elif [ "$lrelease" ]; then - lrelease=$(realpath "$lrelease") - release -else - usage - exit 1 -fi |