diff --git a/cmake/Modules/FindQtTranslations.cmake b/cmake/Modules/FindQtTranslations.cmake new file mode 100644 index 000000000..4a5b0b99d --- /dev/null +++ b/cmake/Modules/FindQtTranslations.cmake @@ -0,0 +1,25 @@ +# Return Qt translations files as list of paths +# It will return .qm files of qt/qtbase that aren't stub files. +# Requires that Qt has been found first because it depends on qmake being available + +function(qbt_get_qt_translations qt_translations) + get_target_property(QT_QMAKE_EXECUTABLE Qt::qmake IMPORTED_LOCATION) + execute_process(COMMAND "${QT_QMAKE_EXECUTABLE}" -query QT_INSTALL_TRANSLATIONS + OUTPUT_VARIABLE QT_TRANSLATIONS_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) + + FILE(GLOB QT_TEMP_TRANSLATIONS CONFIGURE_DEPENDS + "${QT_TRANSLATIONS_DIR}/qt_??.qm" + "${QT_TRANSLATIONS_DIR}/qt_??_??.qm" + "${QT_TRANSLATIONS_DIR}/qtbase_??.qm" + "${QT_TRANSLATIONS_DIR}/qtbase_??_??.qm") + + foreach(TRANSLATION ${QT_TEMP_TRANSLATIONS}) + FILE(SIZE "${TRANSLATION}" translation_size) + # Consider files less than 10KB as stub translations + if (translation_size GREATER_EQUAL 10240) + list(APPEND QT_FINAL_TRANSLATIONS "${TRANSLATION}") + endif() + endforeach() + + SET(${qt_translations} ${QT_FINAL_TRANSLATIONS} PARENT_SCOPE) +endfunction() diff --git a/dist/qt-translations/qt_fa.qm b/dist/qt-translations/qt_fa.qm deleted file mode 100644 index 15ef2b548..000000000 Binary files a/dist/qt-translations/qt_fa.qm and /dev/null differ diff --git a/dist/qt-translations/qt_gl.qm b/dist/qt-translations/qt_gl.qm deleted file mode 100644 index 52557340c..000000000 Binary files a/dist/qt-translations/qt_gl.qm and /dev/null differ diff --git a/dist/qt-translations/qt_lt.qm b/dist/qt-translations/qt_lt.qm deleted file mode 100644 index e9c36fe44..000000000 Binary files a/dist/qt-translations/qt_lt.qm and /dev/null differ diff --git a/dist/qt-translations/qt_pt.qm b/dist/qt-translations/qt_pt.qm deleted file mode 100644 index 03353ea8d..000000000 Binary files a/dist/qt-translations/qt_pt.qm and /dev/null differ diff --git a/dist/qt-translations/qt_sl.qm b/dist/qt-translations/qt_sl.qm deleted file mode 100644 index bc2073b64..000000000 Binary files a/dist/qt-translations/qt_sl.qm and /dev/null differ diff --git a/dist/qt-translations/qt_sv.qm b/dist/qt-translations/qt_sv.qm deleted file mode 100644 index 294ae141c..000000000 Binary files a/dist/qt-translations/qt_sv.qm and /dev/null differ diff --git a/dist/qt-translations/qt_zh_CN.qm b/dist/qt-translations/qt_zh_CN.qm deleted file mode 100644 index 77ff14416..000000000 Binary files a/dist/qt-translations/qt_zh_CN.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_ar.qm b/dist/qt-translations/qtbase_ar.qm deleted file mode 100644 index 32861b810..000000000 Binary files a/dist/qt-translations/qtbase_ar.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_bg.qm b/dist/qt-translations/qtbase_bg.qm deleted file mode 100644 index faeb1676d..000000000 Binary files a/dist/qt-translations/qtbase_bg.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_ca.qm b/dist/qt-translations/qtbase_ca.qm deleted file mode 100644 index 20b751d42..000000000 Binary files a/dist/qt-translations/qtbase_ca.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_cs.qm b/dist/qt-translations/qtbase_cs.qm deleted file mode 100644 index 459ef2664..000000000 Binary files a/dist/qt-translations/qtbase_cs.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_da.qm b/dist/qt-translations/qtbase_da.qm deleted file mode 100644 index 4ede24b42..000000000 Binary files a/dist/qt-translations/qtbase_da.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_de.qm b/dist/qt-translations/qtbase_de.qm deleted file mode 100644 index 4a4c988e0..000000000 Binary files a/dist/qt-translations/qtbase_de.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_es.qm b/dist/qt-translations/qtbase_es.qm deleted file mode 100644 index 1a131578b..000000000 Binary files a/dist/qt-translations/qtbase_es.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_fi.qm b/dist/qt-translations/qtbase_fi.qm deleted file mode 100644 index 934aecdd3..000000000 Binary files a/dist/qt-translations/qtbase_fi.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_fr.qm b/dist/qt-translations/qtbase_fr.qm deleted file mode 100644 index 009fb5a42..000000000 Binary files a/dist/qt-translations/qtbase_fr.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_gd.qm b/dist/qt-translations/qtbase_gd.qm deleted file mode 100644 index 3fe3841cc..000000000 Binary files a/dist/qt-translations/qtbase_gd.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_he.qm b/dist/qt-translations/qtbase_he.qm deleted file mode 100644 index 95ed0c705..000000000 Binary files a/dist/qt-translations/qtbase_he.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_hu.qm b/dist/qt-translations/qtbase_hu.qm deleted file mode 100644 index e4920a630..000000000 Binary files a/dist/qt-translations/qtbase_hu.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_it.qm b/dist/qt-translations/qtbase_it.qm deleted file mode 100644 index a0205781c..000000000 Binary files a/dist/qt-translations/qtbase_it.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_ja.qm b/dist/qt-translations/qtbase_ja.qm deleted file mode 100644 index 9cf6069ea..000000000 Binary files a/dist/qt-translations/qtbase_ja.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_ko.qm b/dist/qt-translations/qtbase_ko.qm deleted file mode 100644 index 20e4661cb..000000000 Binary files a/dist/qt-translations/qtbase_ko.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_lv.qm b/dist/qt-translations/qtbase_lv.qm deleted file mode 100644 index f88a761f4..000000000 Binary files a/dist/qt-translations/qtbase_lv.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_pl.qm b/dist/qt-translations/qtbase_pl.qm deleted file mode 100644 index 28d4d8fe5..000000000 Binary files a/dist/qt-translations/qtbase_pl.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_ru.qm b/dist/qt-translations/qtbase_ru.qm deleted file mode 100644 index c1a22864d..000000000 Binary files a/dist/qt-translations/qtbase_ru.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_sk.qm b/dist/qt-translations/qtbase_sk.qm deleted file mode 100644 index 55a377e93..000000000 Binary files a/dist/qt-translations/qtbase_sk.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_tr.qm b/dist/qt-translations/qtbase_tr.qm deleted file mode 100644 index 3d289bb4f..000000000 Binary files a/dist/qt-translations/qtbase_tr.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_uk.qm b/dist/qt-translations/qtbase_uk.qm deleted file mode 100644 index 21a303891..000000000 Binary files a/dist/qt-translations/qtbase_uk.qm and /dev/null differ diff --git a/dist/qt-translations/qtbase_zh_TW.qm b/dist/qt-translations/qtbase_zh_TW.qm deleted file mode 100644 index 62052980f..000000000 Binary files a/dist/qt-translations/qtbase_zh_TW.qm and /dev/null differ diff --git a/dist/windows/README.txt b/dist/windows/README.txt index e9f82c383..0021bf683 100644 --- a/dist/windows/README.txt +++ b/dist/windows/README.txt @@ -38,10 +38,12 @@ installer-translations translations qt_ar.qm ... - (all the .qm files found in the 'translations' folder of your Qt install. Those files differ between Qt4 and Qt5. - If you want to distribute Qt4 translations it is better to use the ones found in this repo under the path "dist/qt-translations". - They contain extra languages not distributed via the official qt4 sources. - Don't forget to edit the filelist in installer.nsi + uninstaller.nsi to include all your .qm files.) + (All the .qm files found in the 'translations' folder of your Qt install. Those files differ between Qt5 and Qt6. + You will need the files that conform to this globbing expression 'qt_??.qm qt_??_??.qm qtbase_??.qm qtbase_??_??.qm'. + Some of those files will be stubs. Filter any file that is smaller than 10KB in size. + Alternatively you can use the 'gather_qt_translations.py' script found in the same folder as this file. + Run it with '--help' to see its usage. + **YOU MUST** edit the list of .qm files in the 'installer.nsi' to match whatever files are in the 'translations' subfolder.) qt_zh_TW.qm installer.nsi license.txt diff --git a/dist/windows/gather_qt_translations.py b/dist/windows/gather_qt_translations.py new file mode 100644 index 000000000..2b97c1a6c --- /dev/null +++ b/dist/windows/gather_qt_translations.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 + +import argparse +import glob +import os +import shutil +import sys +from typing import List + +def isNotStub(path: str) -> bool: + return (os.path.getsize(path) >= (10 * 1024)) + +def main() -> int: + parser = argparse.ArgumentParser(description='Gather valid Qt translations for NSIS packaging.') + parser.add_argument("qt_translations_folder", help="Qt's translations folder") + parser.add_argument("nsis_packaging_folder", help="NSIS packaging translations folder") + args = parser.parse_args() + + tmp_translations: List[str] = glob.glob(f'{args.qt_translations_folder}/qt_??.qm') + tmp_translations += glob.glob(f'{args.qt_translations_folder}/qt_??_??.qm') + tmp_translations += glob.glob(f'{args.qt_translations_folder}/qtbase_??.qm') + tmp_translations += glob.glob(f'{args.qt_translations_folder}qtbase_??_??.qm') + + filtered = filter(isNotStub, tmp_translations) + for file in filtered: + shutil.copy2(file, args.nsis_packaging_folder) + + return 0 + +if __name__ == '__main__': + sys.exit(main()) diff --git a/macxconf.pri b/macxconf.pri index b12e34e39..43f02ba8b 100644 --- a/macxconf.pri +++ b/macxconf.pri @@ -7,13 +7,31 @@ else { include(conf.pri) } -QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.14 +# Custom function +# Return Qt translations files as list of paths +# It will return .qm files of qt/qtbase that aren't stub files. +defineReplace(qbt_get_qt_translations) { + # The $$[] syntax queries qmake properties + TMP_TRANSLATIONS = $$files($$[QT_INSTALL_TRANSLATIONS]/qt_??.qm) + TMP_TRANSLATIONS += $$files($$[QT_INSTALL_TRANSLATIONS]/qt_??_??.qm) + TMP_TRANSLATIONS += $$files($$[QT_INSTALL_TRANSLATIONS]/qtbase_??.qm) + TMP_TRANSLATIONS += $$files($$[QT_INSTALL_TRANSLATIONS]/qtbase_??_??.qm) + + # Consider files less than 10KB as stub translations + for (TRANSLATION, TMP_TRANSLATIONS) { + TRANSLATION_SIZE = $$system("stat -f%z $${TRANSLATION}", true, EXIT_STATUS) + equals(EXIT_STATUS, 0):!lessThan(TRANSLATION_SIZE, 10240): FINAL_TRANSLATIONS += $${TRANSLATION} + } + + return($$FINAL_TRANSLATIONS) +} + +QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.15 DEFINES += _DARWIN_FEATURE_64_BIT_INODE LIBS += -framework Carbon -framework IOKit -framework AppKit -QT_LANG_PATH = ../dist/qt-translations DIST_PATH = ../dist/mac document_icon.path = Contents/Resources @@ -25,15 +43,7 @@ qt_conf.files = $$DIST_PATH/qt.conf QMAKE_BUNDLE_DATA += qt_conf qt_translations.path = Contents/translations -qt_translations.files = $$files($$QT_LANG_PATH/qtbase_*.qm) -qt_translations.files += \ - $$QT_LANG_PATH/qt_fa.qm \ - $$QT_LANG_PATH/qt_gl.qm \ - $$QT_LANG_PATH/qt_lt.qm \ - $$QT_LANG_PATH/qt_pt.qm \ - $$QT_LANG_PATH/qt_sl.qm \ - $$QT_LANG_PATH/qt_sv.qm \ - $$QT_LANG_PATH/qt_zh_CN.qm +qt_translations.files = $$qbt_get_qt_translations() QMAKE_BUNDLE_DATA += qt_translations ICON = $$DIST_PATH/qbittorrent_mac.icns diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 036e5d999..93e5ea4e9 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -16,11 +16,6 @@ if (WEBUI) "${qBittorrent_BINARY_DIR}/src/webui/www/translations/webui_translations.qrc" COPYONLY) endif() -FILE(GLOB QT_TRANSLATIONS "${qBittorrent_SOURCE_DIR}/dist/qt-translations/qtbase_*.qm") -foreach(EXTRA_TRANSLATION IN ITEMS "fa" "gl" "lt" "pt" "sl" "sv" "zh_CN") - list(APPEND QT_TRANSLATIONS "${qBittorrent_SOURCE_DIR}/dist/qt-translations/qt_${EXTRA_TRANSLATION}.qm") -endforeach() - # Executable target configuration # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- @@ -65,16 +60,17 @@ endif() # Additional platform specific configuration # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- -set_source_files_properties(${QT_TRANSLATIONS} PROPERTIES MACOSX_PACKAGE_LOCATION translations) -set_source_files_properties( - "${qBittorrent_SOURCE_DIR}/dist/mac/qt.conf" - "${qBittorrent_SOURCE_DIR}/dist/mac/qBitTorrentDocument.icns" - "${qBittorrent_SOURCE_DIR}/dist/mac/qbittorrent_mac.icns" - PROPERTIES - MACOSX_PACKAGE_LOCATION Resources -) - if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") + include(FindQtTranslations) + qbt_get_qt_translations(QT_TRANSLATIONS) + set_source_files_properties(${QT_TRANSLATIONS} PROPERTIES MACOSX_PACKAGE_LOCATION translations) + set_source_files_properties( + "${qBittorrent_SOURCE_DIR}/dist/mac/qt.conf" + "${qBittorrent_SOURCE_DIR}/dist/mac/qBitTorrentDocument.icns" + "${qBittorrent_SOURCE_DIR}/dist/mac/qbittorrent_mac.icns" + PROPERTIES + MACOSX_PACKAGE_LOCATION Resources + ) # provide variables for substitution in dist/mac/Info.plist get_target_property(EXECUTABLE_NAME qbt_app OUTPUT_NAME) # This variable name should be changed once qmake is no longer used. Refer to the discussion in PR #14813