diff --git a/.gitignore b/.gitignore index 21d239c..8437de6 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ *.la *.lai *.so +*.so.* *.dll *.dylib @@ -28,13 +29,12 @@ ui_*.h *.jsc Makefile* *build-* +*.qm +*.prl # Qt unit tests target_wrapper.* -# Qt qm files -translations/*.qm - # QtCreator *.autosave @@ -44,13 +44,22 @@ translations/*.qm # QtCreator CMake CMakeLists.txt.user* -build -# Debian dpkg-buildpackage +# QtCreator 4.8< compilation database +compile_commands.json + +# QtCreator local machine specific files for imported projects +*creator.user* + +*_qmlcache.qrc + +# debian debian/*.debhelper* debian/files debian/*.substvars debian/spark-store -.vscode/* -src/spark-store +# Others +build +obj-* +.vscode diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..6f049df --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,43 @@ +cmake_minimum_required(VERSION 3.12) + +project(spark-store) + +if(NOT DEFINED VERSION) + set(VERSION 4.0.0) +endif() +add_compile_definitions(APP_VERSION="${VERSION}") + +execute_process( + COMMAND git symbolic-ref --short -q HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE BRANCH +) +string(STRIP "${BRANCH}" BRANCH) +add_compile_definitions(APP_BRANCH="${BRANCH}") + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(AUTOMOC_COMPILER_PREDEFINES ON) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall") +if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "sw_64") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mieee") +endif () +if (NOT ${CMAKE_BUILD_TYPE} MATCHES "Debug") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") +endif () + +add_compile_definitions(QT_MESSAGELOGCONTEXT) + +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX /usr) +endif() + +include(GNUInstallDirs) + +add_subdirectory(src) +add_subdirectory(translations) diff --git a/README.zh.md b/README.zh.md index d542c6c..b4a2d46 100644 --- a/README.zh.md +++ b/README.zh.md @@ -2,7 +2,9 @@ [](https://gitee.com/spark-store-project/spark-store/stargazers) [](https://gitee.com/spark-store-project/spark-store/members) https://gitee.com/spark-store-project/spark-store/ + https://gitcode.com/spark-store-project/spark-store/ + https://github.com/spark-store-project/spark-store/ ## 简介 diff --git a/debian/changelog b/debian/changelog index 7729633..b30f3e4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,32 +1,41 @@ +spark-store (4.2.14) stable; urgency=medium + + * Adapt to Qt6 and Dtk6 + + -- zty199 <46324746+zty199@users.noreply.github.com> Thu, 21 Jun 2024 01:50:40 +0800 + + spark-store (4.2.13) stable; urgency=medium -* 未经测试文案修改 -* 龙芯平台并入主线 -* 修复:更新过程中中断无法再次启动更新检查 -* 调整:提高超时时长,适应较差的网络环境 + * 未经测试文案修改 + * 龙芯平台并入主线 + * 修复:更新过程中中断无法再次启动更新检查 + * 调整:提高超时时长,适应较差的网络环境 - -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 + + spark-store (4.2.12.1) stable; urgency=medium - * 修复:龙芯自动--no-sandbox - + * 修复:龙芯自动 --no-sandbox + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 + spark-store (4.2.12) stable; urgency=medium * 修复:飞腾部分设备上白屏的问题 * 修复:下载开始时长时等待(降低链接超时时长) - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 + spark-store (4.2.11) stable; urgency=medium * 修复:判断是否安装状态错误 * 修改:部分组件重构提升清晰度 * 修复:v23下部分应用图标失效 - - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 @@ -36,7 +45,7 @@ spark-store (4.2.10) stable; urgency=medium * 修复:发行版统计信息 * 修复:Gitee反馈链接错误 * 修复:ACE下无法安装,支持ACE下软件更新 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 @@ -47,24 +56,27 @@ spark-store (4.2.9) stable; urgency=medium * 修复:容器内无限等待 * 新增:高分屏截图支持 * 新增:更新界面支持显示软件名称 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 + spark-store (4.2.8.1) stable; urgency=medium * 修复:A2D应用释放无效的Desktop到桌面上 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 + spark-store (4.2.8) stable; urgency=medium * 修复:在aptss上锁时支持等待释放锁而不是直接报错退出 * 调整:下载安装按钮文案修改 * 优化 KDE 深色模式支持实现方式 * 新增:ssinstall现在会自动创建desktop文件 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 + spark-store (4.2.7.3) stable; urgency=medium * 修复:aptss现在会正确地透传错误码而不是exit 0 @@ -73,18 +85,16 @@ spark-store (4.2.7.3) stable; urgency=medium * 修复:在终端中打开的icon过大导致无法投稿到UOS * 修复:v23下编译出错 * 薪怎:支持崩溃日志收集系统 - - -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 spark-store (4.2.7.2) stable; urgency=medium * 新增:内置在终端打开功能 * 调整:散列验证更改为使用sha512 - - -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 spark-store (4.2.7.1) stable; urgency=medium @@ -93,7 +103,7 @@ spark-store (4.2.7.1) stable; urgency=medium * 新增:在aptss的特定操作时添加了提示 * 新增:在aptss提示加粗 * 调整:ssinstall验证支持使用cdn.d.获取 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 @@ -102,7 +112,7 @@ spark-store (4.2.7) stable; urgency=medium * 修复:更新星火商店后禁止更新提醒的配置失效 * 新增:支持在设置中关闭平台不兼容提示 * 调整:更改了下载量统计的方式,减少漏数 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 @@ -112,49 +122,49 @@ spark-store (4.2.6.6) stable; urgency=medium * 修复:dpkg阻塞出现漏掉的安装失败,现在在安装后检测是否安装 * 修复:UOS专业版上安装成功仍然显示失败的问题:方式:忽略E:等消息,仅检查脚本报错 * 调整:卸载应用时采用autopurge以一并卸载依赖 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 spark-store (4.2.6.5) stable; urgency=medium * 调整:ssaudit安装结束时会提示安装结束 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 spark-store (4.2.6.4) stable; urgency=medium * 修复:关于页面的入口过时 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 spark-store (4.2.6.3) stable; urgency=medium * 修复:部分下载统计线路失效 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 spark-store (4.2.6.2) stable; urgency=medium * 新增:支持arm架构搜索 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 spark-store (4.2.6.1) stable; urgency=medium * 修复:mint下更新检测不正常 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 spark-store (4.2.6) stable; urgency=medium * 修复:截图加载失败时点击闪退 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 @@ -162,7 +172,7 @@ spark-store (4.2.5.1) stable; urgency=medium * 调整:重写了spark-dstore-patch,速度提升,尤其对机械硬盘下 * 调整:优化了aptss源文件同步策略 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 @@ -171,7 +181,7 @@ spark-store (4.2.5) stable; urgency=medium * 修复:ssinstall在文件不存在时仍然报安装成功 * 修复:删除不再需要的依赖:libc6-dev * 在aarch64架构安装时也启用32位支持 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 @@ -180,7 +190,7 @@ spark-store (4.2.4) stable; urgency=medium * 修复:ssinstall校验失败的时候仍然提示安装成功 * 新增:ssinstall可以自动刷新ssupdate以防止仓库更新中导致的安装校验失败 * 修复:在不受支持的平台安装应用时弹出提示不正确 - + -- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800 diff --git a/debian/control b/debian/control index 3c3d1e6..9afebcd 100644 --- a/debian/control +++ b/debian/control @@ -3,48 +3,31 @@ Maintainer: shenmo <shenmo@spark-app.store> Section: utils Priority: optional Build-Depends: - debhelper (>= 9), + cmake, + debhelper (>= 11), pkg-config, - qtchooser (>= 55-gc9562a1-1~) | qt5-default, - qtbase5-dev, - libqt5core5a, - libqt5gui5, - libqt5widgets5, - libqt5network5, - libqt5concurrent5, - libdtkcore-dev(>=5.0), - libdtkgui-dev(>=5.0), - libdtkwidget-dev(>=5.0), - libqt5svg5-dev, - qttools5-private-dev, - qtwebengine5-dev, - qtwayland5, - qtwayland5-dev-tools, - gcc, - g++ + qtchooser (>= 55-gc9562a1-1~), + qt6-base-dev, + qt6-svg-dev, + qt6-tools-dev, + qt6-webengine-dev, + libdtkcommon-dev, + libdtk6core-dev, + libdtk6gui-dev, + libdtk6widget-dev Standards-Version: 4.0.0 Homepage: https://www.spark-app.store/ Package: spark-store Architecture: any Provides: spark-store-console-in-container -Depends:${shlibs:Depends}, ${misc:Depends}, - libqt5core5a, - libqt5gui5, - libqt5widgets5, - libqt5network5, - libqt5concurrent5, - qtwayland5, - libdtkcore5, - libdtkgui5, - libdtkwidget5, +Depends: ${shlibs:Depends}, ${misc:Depends}, + dde-qt6integration, curl, openssl, - dde-qt5integration, aria2, gnupg, zenity, - policykit-1, libnotify-bin, desktop-file-utils, dpkg-dev diff --git a/debian/rules b/debian/rules index fc38dd1..9eeded9 100755 --- a/debian/rules +++ b/debian/rules @@ -1,9 +1,14 @@ #!/usr/bin/make -f -export QT_SELECT = qt5 -export DEB_BUILD_MAINT_OPTIONS = hardening=+all include /usr/share/dpkg/default.mk +export QT_SELECT = qt6 +export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +DEB_CFLAGS ?= $(shell dpkg-buildflags --get CFLAGS) +DEB_CPPFLAGS ?= $(shell dpkg-buildflags --get CPPFLAGS) +DEB_CXXFLAGS ?= $(shell dpkg-buildflags --get CXXFLAGS) + DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH) DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) @@ -16,24 +21,14 @@ SOURCE_DATE_EPOCH := $(shell date +%s) %: dh $@ --parallel -override_dh_auto_clean: - rm -rf $(CURDIR)/build-$(DEB_HOST_MULTIARCH) - override_dh_auto_configure: - mkdir -p $(CURDIR)/build-$(DEB_HOST_MULTIARCH) + dh_auto_configure -- \ + -DVERSION=$(DEB_VERSION_UPSTREAM) \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_C_FLAGS="$(DEB_CFLAGS) $(DEB_CPPFLAGS)" \ + -DCMAKE_CXX_FLAGS="$(DEB_CXXFLAGS) $(DEB_CPPFLAGS)" - qmake BUILD_VERSION=$(DEB_VERSION_UPSTREAM) spark-store-project.pro \ - -spec linux-g++ CONFIG+=force_debug_info \ - -o $(CURDIR)/build-$(DEB_HOST_MULTIARCH)/ - -override_dh_auto_build: - make -C $(CURDIR)/build-$(DEB_HOST_MULTIARCH) -j$(JOBS) - -override_dh_auto_install: - make -C $(CURDIR)/build-$(DEB_HOST_MULTIARCH) install \ - INSTALL_ROOT=$(CURDIR)/debian/spark-store - -# Ignore the dpkg-shlibdeps: warning (it uses none of the library's symbols) -# Qt Mutidedia lib will ref to network libraray. +#Ignore the dpkg-shlibdeps: warning (it uses none of the library's symbols) +#Qt Mutidedia lib will ref to network libraray. override_dh_shlibdeps: dh_shlibdeps --dpkg-shlibdeps-params=--warnings=0 diff --git a/debian/spark-store.postinst b/debian/spark-store.postinst index 9298834..882486b 100755 --- a/debian/spark-store.postinst +++ b/debian/spark-store.postinst @@ -2,7 +2,6 @@ case "$1" in configure) - case `arch` in x86_64) echo "Enabling i386 arch..." @@ -12,7 +11,8 @@ case "$1" in aarch64) echo "Will not enable armhf since 4271" ;; - loongarch64) + + loongarch64) echo "Nope we DO NOT WANT ABI1 now" dpkg --remove-architecture loongarch64 ;; @@ -42,7 +42,7 @@ case "$1" in ln -s -f /opt/durapps/spark-store/bin/aptss /usr/bin/aptss - # Create symbol links for SSINSTALL + # Create symbol links for SSINSTALL ln -s -f /opt/durapps/spark-store/bin/auto-install-policy/store.spark-app.ssinstall.policy /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy # Install key @@ -52,11 +52,9 @@ case "$1" in cp -f /tmp/spark-store-install/spark-store.asc.gpg /etc/apt/trusted.gpg.d/spark-store.gpg - # Start upgrade detect service systemctl daemon-reload - systemctl enable spark-update-notifier - systemctl start spark-update-notifier + systemctl enable spark-update-notifier --now || true # Update certain caches @@ -73,7 +71,6 @@ case "$1" in ;; triggered) - spark-dstore-patch - + spark-dstore-patch ;; esac diff --git a/debian/spark-store.preinst b/debian/spark-store.preinst index 1eae804..51de70c 100755 --- a/debian/spark-store.preinst +++ b/debian/spark-store.preinst @@ -1,4 +1,5 @@ #!/bin/bash + #检测网络链接畅通 function network-check() { @@ -23,6 +24,5 @@ function network-check() } - #network-check -echo "不再检测网络" \ No newline at end of file +#echo "不再检测网络" diff --git a/debian/spark-store.prerm b/debian/spark-store.prerm index f266bb6..7a0a61b 100755 --- a/debian/spark-store.prerm +++ b/debian/spark-store.prerm @@ -12,6 +12,7 @@ function notify-send() } if [ "$1" = "remove" -o "$1" = "purge" ] ; then + echo "$1" echo "卸载操作,进行配置清理" @@ -32,20 +33,16 @@ if [ "$1" = "remove" -o "$1" = "purge" ] ; then # Remove residual symbol links to stop upgrade detect rm -f /etc/xdg/autostart/spark-update-notifier.desktop # Remove config files -for username in `ls /home` - do - echo /home/$username - if [ -d /home/$username/.config/spark-union/spark-store ] - then - rm -rf /home/$username/.config/spark-union/spark-store - fi - done + for username in `ls /home`; do + echo /home/$username + if [ -d /home/$username/.config/spark-union/spark-store ]; then + rm -rf /home/$username/.config/spark-union/spark-store + fi + done # Shutdown services - systemctl stop spark-update-notifier - # Stop update detect service - systemctl disable spark-update-notifier + systemctl disable spark-update-notifier --now || true # Clean the auto install polkit file if exist rm -f /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy @@ -53,13 +50,13 @@ for username in `ls /home` # Remove gpg key file rm -f /etc/apt/trusted.gpg.d/spark-store.gpg apt-key del '9D9A A859 F750 24B1 A1EC E16E 0E41 D354 A29A 440C' + else - + if [ ! -z "`pidof spark-store`" ] ; then echo "关闭已有 spark-store.." notify-send "正在升级星火商店" "请在升级结束后重启星火商店" -i spark-store killall spark-store fi + fi - - diff --git a/pkg/usr/lib/systemd/system/spark-update-notifier.service b/pkg/lib/systemd/system/spark-update-notifier.service similarity index 100% rename from pkg/usr/lib/systemd/system/spark-update-notifier.service rename to pkg/lib/systemd/system/spark-update-notifier.service diff --git a/pkg/usr/share/icons/hicolor/scalable/apps/open-me-in-terminal.png b/pkg/usr/share/icons/hicolor/512x512/apps/open-me-in-terminal.png similarity index 100% rename from pkg/usr/share/icons/hicolor/scalable/apps/open-me-in-terminal.png rename to pkg/usr/share/icons/hicolor/512x512/apps/open-me-in-terminal.png diff --git a/spark-store-project.pro b/spark-store-project.pro index 8cd67ff..2a0be4c 100644 --- a/spark-store-project.pro +++ b/spark-store-project.pro @@ -8,10 +8,9 @@ TARGET = spark-store TEMPLATE = subdirs #CONFIG += ordered -CONFIG += wayland-compositor SUBDIRS += \ - src/spark-store.pro + src/$${TARGET}.pro # https://wiki.debian.org/Hardening QMAKE_CFLAGS *= $(shell dpkg-buildflags --get CFLAGS) @@ -27,32 +26,31 @@ CONFIG(release, debug | release) { # Rules for deployment tool.files += tool/* -tool.path = /opt/durapps/$${TARGET}/bin +tool.path = /opt/durapps/$${TARGET}/bin/ qm.files += translations/*.qm -qm.path = /usr/share/spark-store/translations +qm.path = /usr/share/$${TARGET}/translations/ #preferences.files += pkg/etc/apt/preferences.d/sparkstore -#preferences.path = /etc/apt/preferences.d +#preferences.path = /etc/apt/preferences.d/ #sourceslist.files += pkg/etc/apt/sources.list.d/sparkstore.list -#sourceslist.path = /etc/apt/sources.list.d +#sourceslist.path = /etc/apt/sources.list.d/ bash_completion.files += pkg/usr/share/bash-completion/completions/aptss -bash_completion.path = /usr/share/bash-completion/completions +bash_completion.path = /usr/share/bash-completion/completions/ desktop.files += pkg/usr/share/applications/*.desktop -desktop.path = /usr/share/applications +desktop.path = /usr/share/applications/ service.files += pkg/usr/lib/systemd/system/spark-update-notifier.service -service.path = /usr/lib/systemd/system/ +service.path = /lib/systemd/system/ polkit-1.files += pkg/usr/share/polkit-1/actions/store.spark-app.ss-do-upgrade-worker.policy polkit-1.path = /usr/share/polkit-1/actions/ -icon.files += pkg/usr/share/icons/hicolor/scalable/apps/*.svg -icon.files += pkg/usr/share/icons/hicolor/scalable/apps/*.png -icon.path = /usr/share/icons/hicolor/scalable/apps +icon.files += pkg/usr/share/icons +icon.path = /usr/share/ ssinstall-transhell.files += pkg/usr/share/ssinstall/transhell ssinstall-transhell.path = /usr/share/ssinstall/ @@ -61,7 +59,7 @@ aptss-transhell.files += pkg/usr/share/aptss/transhell aptss-transhell.path = /usr/share/aptss/ tmp.files += pkg/tmp/spark-store-install/feedback.sh -tmp.path = /tmp/spark-store-install +tmp.path = /tmp/spark-store-install/ INSTALLS += \ tool \ @@ -75,4 +73,3 @@ INSTALLS += \ service \ bash_completion \ polkit-1 -# 暂时不添加 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..a1d7a1d --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,40 @@ +find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Concurrent Network Svg WebEngineWidgets) +find_package(Dtk6 REQUIRED COMPONENTS Core Gui Widget) + +include(src.cmake) + +add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES} ${QRC_FILE}) + +target_include_directories(${PROJECT_NAME} PUBLIC + Qt6::Core + Qt6::Gui + Qt6::Widgets + Qt6::Concurrent + Qt6::Network + Qt6::Svg + Qt6::WebEngineWidgets + Dtk6::Core + Dtk6::Gui + Dtk6::Widget +) + +target_link_libraries(${PROJECT_NAME} PRIVATE + Qt6::Core + Qt6::Gui + Qt6::Widgets + Qt6::Concurrent + Qt6::Network + Qt6::Svg + Qt6::WebEngineWidgets + Dtk6::Core + Dtk6::Gui + Dtk6::Widget +) + +install(TARGETS ${PROJECT_NAME} DESTINATION /opt/durapps/${PROJECT_NAME}/bin) + +install(DIRECTORY ${CMAKE_SOURCE_DIR}/tool/ DESTINATION /opt/durapps/${PROJECT_NAME}/bin USE_SOURCE_PERMISSIONS) +install(DIRECTORY ${CMAKE_SOURCE_DIR}/pkg/${CMAKE_INSTALL_SYSCONFDIR}/aptss DESTINATION ${CMAKE_INSTALL_SYSCONFDIR} USE_SOURCE_PERMISSIONS) +install(DIRECTORY ${CMAKE_SOURCE_DIR}/pkg/lib/ DESTINATION /lib USE_SOURCE_PERMISSIONS) +install(DIRECTORY ${CMAKE_SOURCE_DIR}/pkg/tmp/ DESTINATION /tmp USE_SOURCE_PERMISSIONS) +install(DIRECTORY ${CMAKE_SOURCE_DIR}/pkg/usr/ DESTINATION ${CMAKE_INSTALL_PREFIX} USE_SOURCE_PERMISSIONS) diff --git a/src/application.cpp b/src/application.cpp index 46c56a9..28ec098 100644 --- a/src/application.cpp +++ b/src/application.cpp @@ -25,7 +25,6 @@ Application::Application(int &argc, char **argv) if (!DPlatformWindowHandle::pluginVersion().isEmpty()) { setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true); } - setAttribute(Qt::AA_UseHighDpiPixmaps); setQuitOnLastWindowClosed(false); // 启用托盘图标时,关闭窗口程序仍然运行 diff --git a/src/main.cpp b/src/main.cpp index b40cfe8..1046bcd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,7 +12,6 @@ #include <execinfo.h> #include <DSysInfo> -#include <DApplicationSettings> #include <DWidgetUtil> #include <QDate> @@ -146,13 +145,10 @@ int main(int argc, char *argv[]) // 浏览器开启 GPU 支持 // qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-features=UseModernMediaControls"); // qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-web-security"); -#ifdef __sw_64__ +#if defined (__sw_64__) || defined (__loongarch__) qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--no-sandbox"); #endif -#ifdef __loongarch__ - qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--no-sandbox"); -#endif /** * NOTE: https://zhuanlan.zhihu.com/p/550285855 * 避免 wayland 环境下从 QtWebEngine 后退回到 QWidget 时黑屏闪烁 @@ -162,15 +158,6 @@ int main(int argc, char *argv[]) DApplication::setAttribute(Qt::AA_UseSoftwareOpenGL); } - - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - // 开启 Hidpi 支持 - qDebug() << "Enable HiDPI Support."; - DApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - DApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); -#endif - // 强制使用 DTK 平台插件 QVector<char *> fakeArgs(argc + 2); fakeArgs[0] = argv[0]; @@ -192,8 +179,6 @@ int main(int argc, char *argv[]) return -1; } - DApplicationSettings settings; // 定义 DApplicationSettings,自动保存主题设置 - MainWindow w; a.setMainWindow(&w); // 设置应用程序主窗口,用于初始化关于对话框 // 让打开时界面显示在正中 diff --git a/src/pages/settingspage.cpp b/src/pages/settingspage.cpp index 16cf2c9..367d094 100644 --- a/src/pages/settingspage.cpp +++ b/src/pages/settingspage.cpp @@ -134,7 +134,7 @@ void SettingsPage::on_pushButton_updateServer_clicked() ui->comboBox_server->setCurrentIndex(0); }); } -void SettingsPage::on_comboBox_server_currentIndexChanged(const QString &arg1) +void SettingsPage::on_comboBox_server_currentTextChanged(const QString &arg1) { SparkAPI::setServerUrl(arg1); // 服务器信息更新 qDebug() << arg1; diff --git a/src/pages/settingspage.h b/src/pages/settingspage.h index d1e9267..6a82a65 100644 --- a/src/pages/settingspage.h +++ b/src/pages/settingspage.h @@ -22,7 +22,7 @@ public: private slots: void on_pushButton_updateServer_clicked(); - void on_comboBox_server_currentIndexChanged(const QString &arg1); + void on_comboBox_server_currentTextChanged(const QString &arg1); void on_pushButton_updateApt_clicked(); diff --git a/src/src.cmake b/src/src.cmake new file mode 100644 index 0000000..89b47da --- /dev/null +++ b/src/src.cmake @@ -0,0 +1,18 @@ +include_directories(backend) +include_directories(dbus) +include_directories(pages) +include_directories(utils) +include_directories(widgets) + +# https://cmake.org/cmake/help/v3.12/command/file.html#glob-recurse +file(GLOB_RECURSE HEADERS CONFIGURE_DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/*.h" + "${CMAKE_CURRENT_SOURCE_DIR}/*.hpp" +) + +file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS + "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/*.ui" +) + +qt6_add_resources(QRC_FILE ${CMAKE_CURRENT_SOURCE_DIR}/assets/assets.qrc) diff --git a/src/utils/httprequest.cpp b/src/utils/httprequest.cpp index b64e095..8baf92a 100644 --- a/src/utils/httprequest.cpp +++ b/src/utils/httprequest.cpp @@ -41,8 +41,7 @@ QString HttpRequest::postRequest(QString url, QString jsondata) QEventLoop eventLoop; connect(naManager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit())); eventLoop.exec(); - QTextCodec *codec = QTextCodec::codecForName("utf8"); - QString strReply = codec->toUnicode(reply->readAll()); + QString strReply(reply->readAll()); reply->deleteLater(); return strReply; } diff --git a/src/utils/httprequest.h b/src/utils/httprequest.h index e6ad7f1..c55bc52 100644 --- a/src/utils/httprequest.h +++ b/src/utils/httprequest.h @@ -6,7 +6,6 @@ #include <QNetworkReply> #include <QNetworkRequest> #include <QEventLoop> -#include <QTextCodec> class HttpRequest : public QObject { Q_OBJECT diff --git a/src/widgets/big_image.cpp b/src/widgets/big_image.cpp index 5620518..e3bcf98 100644 --- a/src/widgets/big_image.cpp +++ b/src/widgets/big_image.cpp @@ -17,7 +17,7 @@ big_image::big_image(DBlurEffectWidget *parent) : DBlurEffectWidget(parent), QHBoxLayout *layout = new QHBoxLayout; setLayout(layout); layout->addWidget(m_image); - layout->setMargin(0); + layout->setContentsMargins(0, 0, 0, 0); // Make sure the image has a parent so that it will be freed. m_image->setParent(this); diff --git a/src/widgets/common/downloaditem.cpp b/src/widgets/common/downloaditem.cpp index 5b39962..07f5a45 100644 --- a/src/widgets/common/downloaditem.cpp +++ b/src/widgets/common/downloaditem.cpp @@ -158,7 +158,7 @@ void DownloadItem::on_pushButton_3_clicked() output_w->setMinimumHeight(600); output_w->setAttribute(Qt::WA_TranslucentBackground); output_w->setTitle(ui->label->text()); - output_w->layout()->setMargin(20); + output_w->layout()->setContentsMargins(20, 20, 20, 20); output_w->layout()->addWidget(textbrowser); output_w->show(); } @@ -198,7 +198,7 @@ void DownloadItem::slotAsyncInstall(int t) for (int i = 0; i < everyOut.size(); i++) { tempOutput = everyOut[i]; - if (everyOut[i].left(2) == tempOutput.contains("OMG-IT-GOES-WRONG")) + if (tempOutput.contains("OMG-IT-GOES-WRONG")) { haveError = true; } diff --git a/tool/spark-dstore-patch b/tool/spark-dstore-patch index e0292ab..125eaad 100755 --- a/tool/spark-dstore-patch +++ b/tool/spark-dstore-patch @@ -1,9 +1,5 @@ #!/bin/bash - - - - enumAppInfoList() { appInfoList=() apps="/opt/apps" @@ -13,6 +9,7 @@ enumAppInfoList() { done echo "${appInfoList[@]}" } + linkDir() { ensureTargetDir() { targetFile=$1 @@ -26,17 +23,14 @@ linkDir() { targetDir=$(dirname "$target") find "$source" -type f | while read sourceFile; do targetFile="$targetDir/${sourceFile#$sourceDir/}" - - ensureTargetDir "$targetFile" - sourceFile=$(realpath --relative-to="$(dirname $targetFile)" "$sourceFile" ) - if [ ! -e ${targetFile} ];then - ln -sv "$sourceFile" "$targetFile" + sourceFile=$(realpath --relative-to="$(dirname $targetFile)" "$sourceFile" ) + if [ ! -e ${targetFile} ];then + ln -sv "$sourceFile" "$targetFile" fi done } - linkApp() { appID=$1 appEntriesDir="/opt/apps/$appID/entries" @@ -63,33 +57,29 @@ linkApp() { done } -function exec_uos_package_link(){ - -for app in $(enumAppInfoList); do - linkApp "$app" & - -done -wait +function exec_uos_package_link() { + for app in $(enumAppInfoList); do + linkApp "$app" & + done + wait } function exec_v23_icon_link(){ -# Fix v23 broken icon -if [ ! -d "/usr/share/icons/hicolor/scalable/apps" ];then -mkdir -p /usr/share/icons/hicolor/scalable/apps -fi + # Fix v23 broken icon + if [ ! -d "/usr/share/icons/hicolor/scalable/apps" ]; then + mkdir -p /usr/share/icons/hicolor/scalable/apps + fi -for icon_root_icon_path in $(ls /usr/share/icons/*.png /usr/share/icons/*.svg 2>/dev/null) -do -target_icon_path=/usr/share/icons/hicolor/scalable/apps/$(basename ${icon_root_icon_path}) -if [ ! -e ${target_icon_path} ];then -ln -sv $(realpath --relative-to=/usr/share/icons/hicolor/scalable/apps ${icon_root_icon_path}) /usr/share/icons/hicolor/scalable/apps -fi -done + for icon_root_icon_path in $(ls /usr/share/icons/*.png /usr/share/icons/*.svg /usr/share/icons/*.xpm 2>/dev/null); do + target_icon_path=/usr/share/icons/hicolor/scalable/apps/$(basename ${icon_root_icon_path}) + if [ ! -e ${target_icon_path} ]; then + ln -sv $(realpath --relative-to=/usr/share/icons/hicolor/scalable/apps ${icon_root_icon_path}) /usr/share/icons/hicolor/scalable/apps + fi + done } function exec_link_clean(){ -# remove broken links in /usr/share - + # remove broken links in /usr/share find /usr/share/applications -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null & find /usr/share/icons -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null & find /usr/share/mime/packages -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null & @@ -103,24 +93,22 @@ function exec_link_clean(){ find /usr/share/polkit-1/actions -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null & find /usr/share/fonts -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null & find /etc/fonts/conf.d -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null & - - } -function exec_uos_package_update(){ + +function exec_uos_package_update() { update-icon-caches /usr/share/icons/* > /dev/null 2>&1 & update-desktop-database -q > /dev/null 2>&1 & update-mime-database -V /usr/share/mime > /dev/null 2>&1 & glib-compile-schemas /usr/share/glib-2.0/schemas/ > /dev/null 2>&1 & - } ######################################################################################### echo "----------------Running Spark DStore Patch----------------" -if [ ! -e /usr/bin/deepin-app-store-tool ];then -# execute linkApp function for each app and print output -exec_uos_package_link - +if [ ! -e /usr/bin/deepin-app-store-tool ]; then + # execute linkApp function for each app and print output + exec_uos_package_link fi + exec_v23_icon_link exec_link_clean wait diff --git a/translations/CMakeLists.txt b/translations/CMakeLists.txt new file mode 100644 index 0000000..789bfe6 --- /dev/null +++ b/translations/CMakeLists.txt @@ -0,0 +1,19 @@ +# Have to disable cleaning for this folder because cmake deletes .ts files upon clean +# Not sure what else wont clean up / dirty workaround of Qt bug +# @ref https://bugreports.qt.io/browse/QTBUG-41736 +# @ref https://stackoverflow.com/a/24245615/1917249 +set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM TRUE) + +find_package(Qt6 REQUIRED COMPONENTS LinguistTools) + +# Update ts files and release qm files only in Release build +file(GLOB TS_FILES "*.ts") +if (NOT ${CMAKE_BUILD_TYPE} MATCHES "Debug") + set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}) + qt6_create_translation(QM_FILES ${CMAKE_SOURCE_DIR}/src ${TS_FILES} OPTIONS -no-obsolete) + # https://stackoverflow.com/questions/70665191/cmake-does-not-generate-ts-files + add_custom_target(${PROJECT_NAME}_translations DEPENDS ${TS_FILES} ${QM_FILES}) + add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}_translations) +endif () + +install(FILES ${QM_FILES} DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/translations) diff --git a/translations/spark-store_en.ts b/translations/spark-store_en.ts index 25c2b00..5e07a46 100644 --- a/translations/spark-store_en.ts +++ b/translations/spark-store_en.ts @@ -269,12 +269,12 @@ <context> <name>DAboutDialog</name> <message> - <location filename="../src/application.cpp" line="142"/> + <location filename="../src/application.cpp" line="141"/> <source>Version: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/application.cpp" line="152"/> + <location filename="../src/application.cpp" line="151"/> <source>%1 is released under %2</source> <translation type="unfinished"></translation> </message> @@ -515,19 +515,19 @@ <context> <name>QObject</name> <message> + <location filename="../src/application.cpp" line="35"/> <location filename="../src/application.cpp" line="36"/> - <location filename="../src/application.cpp" line="37"/> <location filename="../src/mainwindow-dtk.cpp" line="126"/> <source>Spark Store</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/application.cpp" line="41"/> + <location filename="../src/application.cpp" line="40"/> <source><span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></source> <translation type="unfinished"></translation> </message> <message> - <location filename="../src/application.cpp" line="149"/> + <location filename="../src/application.cpp" line="148"/> <source>Spark Project</source> <translation type="unfinished"></translation> </message> diff --git a/translations/spark-store_es.ts b/translations/spark-store_es.ts index dabbd20..60a2585 100644 --- a/translations/spark-store_es.ts +++ b/translations/spark-store_es.ts @@ -236,22 +236,6 @@ <source>The current application does not support or tested on current platform, there may be problems</source> <translation type="unfinished"></translation> </message> - <message> - <source>The current application does not support deepin, there may be problems</source> - <translation type="vanished">La aplicación actual no admite deepin, puede haber problemas</translation> - </message> - <message> - <source>The current application does not support UOS, there may be problems</source> - <translation type="vanished">La aplicación actual no admite uos, puede haber problemas</translation> - </message> - <message> - <source>The current application does not support Ubuntu, there may be problems</source> - <translation type="vanished">La aplicación actual no admite ubuntu, puede haber problemas</translation> - </message> - <message> - <source>The current application does not support current platform, there may be problems</source> - <translation type="vanished">La aplicación actual no admite la Plataforma actual, puede haber problemas</translation> - </message> <message> <location filename="../src/pages/appintopage.cpp" line="521"/> <location filename="../src/pages/appintopage.cpp" line="536"/> @@ -285,12 +269,12 @@ <context> <name>DAboutDialog</name> <message> - <location filename="../src/application.cpp" line="142"/> + <location filename="../src/application.cpp" line="141"/> <source>Version: %1</source> <translation>Versión %1</translation> </message> <message> - <location filename="../src/application.cpp" line="152"/> + <location filename="../src/application.cpp" line="151"/> <source>%1 is released under %2</source> <translation>%1 publicado bajo %2</translation> </message> @@ -531,19 +515,19 @@ <context> <name>QObject</name> <message> + <location filename="../src/application.cpp" line="35"/> <location filename="../src/application.cpp" line="36"/> - <location filename="../src/application.cpp" line="37"/> <location filename="../src/mainwindow-dtk.cpp" line="126"/> <source>Spark Store</source> <translation>SPARK Store</translation> </message> <message> - <location filename="../src/application.cpp" line="41"/> + <location filename="../src/application.cpp" line="40"/> <source><span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></source> <translation><span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></translation> </message> <message> - <location filename="../src/application.cpp" line="149"/> + <location filename="../src/application.cpp" line="148"/> <source>Spark Project</source> <translation>Proyecto spark</translation> </message> diff --git a/translations/spark-store_fr.ts b/translations/spark-store_fr.ts index 178e7da..a537f56 100644 --- a/translations/spark-store_fr.ts +++ b/translations/spark-store_fr.ts @@ -236,22 +236,6 @@ <source>The current application does not support or tested on current platform, there may be problems</source> <translation type="unfinished"></translation> </message> - <message> - <source>The current application does not support deepin, there may be problems</source> - <translation type="vanished">L'application actuelle ne supporte pas deepin, il peut y avoir un problème</translation> - </message> - <message> - <source>The current application does not support UOS, there may be problems</source> - <translation type="vanished">L'application actuelle ne prend pas en charge uos, il peut y avoir un problème</translation> - </message> - <message> - <source>The current application does not support Ubuntu, there may be problems</source> - <translation type="vanished">L'application actuelle ne supporte pas Ubuntu, il peut y avoir un problème</translation> - </message> - <message> - <source>The current application does not support current platform, there may be problems</source> - <translation type="vanished">L'application actuelle ne prend pas en charge la plate - forme actuelle, il peut y avoir un problème</translation> - </message> <message> <location filename="../src/pages/appintopage.cpp" line="521"/> <location filename="../src/pages/appintopage.cpp" line="536"/> @@ -285,12 +269,12 @@ <context> <name>DAboutDialog</name> <message> - <location filename="../src/application.cpp" line="142"/> + <location filename="../src/application.cpp" line="141"/> <source>Version: %1</source> <translation>Version: %1</translation> </message> <message> - <location filename="../src/application.cpp" line="152"/> + <location filename="../src/application.cpp" line="151"/> <source>%1 is released under %2</source> <translation>%1 publié sous %2</translation> </message> @@ -531,19 +515,19 @@ <context> <name>QObject</name> <message> + <location filename="../src/application.cpp" line="35"/> <location filename="../src/application.cpp" line="36"/> - <location filename="../src/application.cpp" line="37"/> <location filename="../src/mainwindow-dtk.cpp" line="126"/> <source>Spark Store</source> <translation>Le Spark store</translation> </message> <message> - <location filename="../src/application.cpp" line="41"/> + <location filename="../src/application.cpp" line="40"/> <source><span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></source> <translation><span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></translation> </message> <message> - <location filename="../src/application.cpp" line="149"/> + <location filename="../src/application.cpp" line="148"/> <source>Spark Project</source> <translation>Le projet Spark</translation> </message> diff --git a/translations/spark-store_zh_CN.ts b/translations/spark-store_zh_CN.ts index ee827de..4b35f9b 100644 --- a/translations/spark-store_zh_CN.ts +++ b/translations/spark-store_zh_CN.ts @@ -236,22 +236,6 @@ <source>The current application does not support or tested on current platform, there may be problems</source> <translation>当前应用不支持或未在您的平台上测试过,安装后可能会出现问题</translation> </message> - <message> - <source>The current application does not support deepin, there may be problems</source> - <translation type="vanished">当前应用不支持deepin,安装后可能会出现问题</translation> - </message> - <message> - <source>The current application does not support UOS, there may be problems</source> - <translation type="vanished">当前应用不支持UOS,安装后可能会出现问题</translation> - </message> - <message> - <source>The current application does not support Ubuntu, there may be problems</source> - <translation type="vanished">当前应用不支持Ubuntu,安装后可能会出现问题</translation> - </message> - <message> - <source>The current application does not support current platform, there may be problems</source> - <translation type="vanished">当前应用不支持平台,安装后可能会出现问题</translation> - </message> <message> <location filename="../src/pages/appintopage.cpp" line="521"/> <location filename="../src/pages/appintopage.cpp" line="536"/> @@ -285,12 +269,12 @@ <context> <name>DAboutDialog</name> <message> - <location filename="../src/application.cpp" line="142"/> + <location filename="../src/application.cpp" line="141"/> <source>Version: %1</source> <translation>版本:%1</translation> </message> <message> - <location filename="../src/application.cpp" line="152"/> + <location filename="../src/application.cpp" line="151"/> <source>%1 is released under %2</source> <translation>%1遵循%2协议发布</translation> </message> @@ -531,19 +515,19 @@ <context> <name>QObject</name> <message> + <location filename="../src/application.cpp" line="35"/> <location filename="../src/application.cpp" line="36"/> - <location filename="../src/application.cpp" line="37"/> <location filename="../src/mainwindow-dtk.cpp" line="126"/> <source>Spark Store</source> <translation>星火应用商店</translation> </message> <message> - <location filename="../src/application.cpp" line="41"/> + <location filename="../src/application.cpp" line="40"/> <source><span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></source> <translation><span style=' font-size:10pt;font-weight:60;'>一款由社区提供的应用商店</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>星火计划开发者</span></translation> </message> <message> - <location filename="../src/application.cpp" line="149"/> + <location filename="../src/application.cpp" line="148"/> <source>Spark Project</source> <translation>星火计划</translation> </message> diff --git a/translations/spark-store_zh_TW.ts b/translations/spark-store_zh_TW.ts index a1b3e80..8c564c2 100644 --- a/translations/spark-store_zh_TW.ts +++ b/translations/spark-store_zh_TW.ts @@ -269,12 +269,12 @@ <context> <name>DAboutDialog</name> <message> - <location filename="../src/application.cpp" line="142"/> + <location filename="../src/application.cpp" line="141"/> <source>Version: %1</source> <translation>版本:%1</translation> </message> <message> - <location filename="../src/application.cpp" line="152"/> + <location filename="../src/application.cpp" line="151"/> <source>%1 is released under %2</source> <translation>%1遵循%2协议发布</translation> </message> @@ -515,19 +515,19 @@ <context> <name>QObject</name> <message> + <location filename="../src/application.cpp" line="35"/> <location filename="../src/application.cpp" line="36"/> - <location filename="../src/application.cpp" line="37"/> <location filename="../src/mainwindow-dtk.cpp" line="126"/> <source>Spark Store</source> <translation>星火应用商店</translation> </message> <message> - <location filename="../src/application.cpp" line="41"/> + <location filename="../src/application.cpp" line="40"/> <source><span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></source> <translation><span style=' font-size:10pt;font-weight:60;'>一款由社区提供的应用商店</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>星火计划开发者</span></translation> </message> <message> - <location filename="../src/application.cpp" line="149"/> + <location filename="../src/application.cpp" line="148"/> <source>Spark Project</source> <translation>星火计划</translation> </message>