Compare commits

...

151 Commits

Author SHA1 Message Date
1a04f43ccd update LICENSE.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-28 15:09:35 +00:00
2e47603fae update LICENSE.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-28 15:05:59 +00:00
8d25857d9c 4212--文案 2024-04-28 22:49:47 +08:00
2eec99069e !265 adjust: remove easter egg
Merge pull request !265 from shenmo/N/A
2024-04-28 03:41:59 +00:00
f19685e610 adjust: remove easter egg 2024-04-28 03:41:46 +00:00
zty199
19d5a7e37d fix: missing semicolon after setting --max-tries
add missing semicolon after setting --max-tries in downloadworker.cpp

Log: add missing semicolon after setting --max-tries in downloadworker.cpp
2024-04-28 10:45:31 +08:00
29bfa5cb83 update src/backend/downloadworker.cpp.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-27 16:20:52 +00:00
55f6df0083 fix:编译日期错误
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-27 15:37:02 +00:00
ee6e0a4d26 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-27 10:38:11 +00:00
deb57647a4 sync: aria2 option change
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-27 10:36:04 +00:00
87845a3e43 update tool/spark-dstore-patch.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-27 05:57:55 +00:00
0392e109c4 ok i just delete all the arm content to try
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-25 17:40:32 +00:00
041044e560 retry fix
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-25 17:31:59 +00:00
d3e3d624a8 fix: spell err
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-25 17:23:59 +00:00
130e9a1c4a Fix: Phytium can not use gles
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-25 17:19:52 +00:00
034e65682f try to fix white-screen
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-25 16:55:56 +00:00
b107faf4b6 tips 2024-04-25 18:37:25 +08:00
35afb783f0 adjust: disable notify not compatible 2024-04-25 18:28:09 +08:00
00f436abf2 tips
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-17 07:10:40 +00:00
89cc386232 sync 2024-04-10 22:22:42 +08:00
5b81eb6423 adjust: disable installed check as it is broken 2024-04-10 16:29:17 +08:00
4721bbd4f2 fix-dpkg 2024-04-10 16:15:05 +08:00
a86ef64352 first test 2024-04-10 16:04:23 +08:00
4165bea193 remove hjhk 2024-04-10 11:45:23 +08:00
94943dd438 add: package verify 2024-04-10 11:35:13 +08:00
f9c90865ba 除魔行动:去除deepinos域名验证 2024-04-10 11:18:09 +08:00
3086078dea 完成修复,可交付 2024-04-09 23:27:11 +08:00
aa18506db6 adjust: change url to localhost 2024-04-09 23:05:40 +08:00
94a5c3c8af adjust: disable data feedback in hjhk 2024-04-09 23:02:11 +08:00
f515c0ab08 adjust: disable os detect in hjhk 2024-04-09 22:54:11 +08:00
c9e77022b1 完成shell改造 2024-04-09 12:16:19 +08:00
4d9e3addde 定制版去除散列验证,更改aptss上游链接 2024-04-09 12:10:16 +08:00
65c6ee3d61 del: docs 2024-04-09 11:51:36 +08:00
609a301ecc update 2024-04-09 11:39:22 +08:00
f0a8b141b4 fix: no usr bin 2024-04-09 11:33:27 +08:00
4d35438bf0 update debian/spark-store.postinst.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-04-07 11:57:34 +00:00
4863850195 !255 更新readme文件。
Merge pull request !255 from 花雨落逝/dev
2024-04-01 10:35:24 +00:00
花雨落逝
d379f2ad63 update README.zh.md.
Signed-off-by: 花雨落逝 <12135927+hylshi@user.noreply.gitee.com>
2024-03-31 07:14:01 +00:00
0ac0f97688 修改: debian/changelog 2024-03-29 23:07:01 +08:00
zty199
6c606806a1 fix: 修复软件包安装状态判断异常问题
check-is-installed 脚本判断软件包是否安装,仅根据执行结果返回;原始逻辑根据返回错误输出进行判断,错误输出为空会造成误判

Log: 修改 QProcess 执行结果判断逻辑,根据 QProcess::exitCode 和 QProcess::exitStatus 判断
2024-03-29 22:13:35 +08:00
363c38cb8f update tool/aptss.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-03-26 09:16:02 +00:00
c039fd52a7 fix:卸载后仍显示可重新安装 2024-03-25 11:29:13 +08:00
83540e1c55 update src/pages/appintopage.cpp.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-03-25 03:27:13 +00:00
b54c797ce5 update README.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-03-24 05:30:25 +00:00
f60d125920 update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-03-24 05:29:25 +00:00
fa00f9aaf7 update tool/aptss.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-03-22 03:55:22 +00:00
76808cc2f5 update tool/ssinstall.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-03-22 03:53:24 +00:00
eaa335cc04 修改: src/pages/applistpage.cpp
修改:     tool/ss-feedback/sender-d
2024-03-22 02:11:32 +08:00
6768058358 fix: loongarch bad applist 2024-03-22 00:34:42 +08:00
09c2d41118 Merge remote-tracking branch 'refs/remotes/origin/dev' into dev 2024-03-21 17:34:33 +08:00
c9e7ef20ec 修改: src/backend/sparkapi.cpp 2024-03-21 17:34:22 +08:00
6e55244776 update tool/aptss.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2024-03-21 08:40:09 +00:00
b7e2571789 准备修改aptss以支持loongarch 2024-03-21 15:56:55 +08:00
zty199
e9a52da098 fix: 修改 treeland 环境判断条件
修改读取的环境变量名称为 DDE_CURRENT_COMPOSITOR,避免后续修改造成的不兼容问题

Log: 修改 treeland 环境判断条件;去除 dwayland 平台插件调用
2024-02-03 20:25:51 +08:00
37057306bb !254 cmake-patch: 更新补丁用于处理 v4.2.10 时期的变动构建与全量更新
Merge pull request !254 from 麻本法/auto-2067698-dev-59460c87
2024-02-03 01:51:54 +00:00
fe3a2b2e3b * 修复:ACE下无法安装,支持ACE下软件更新 2024-01-11 23:28:55 +08:00
zty199
0c4f5dacca fix: 修复退出时崩溃问题
AppIntoPage 析构函数中使用 free 释放 rawHeaders 指针存在问题

Log: 使用 QByteArray 全局变量存储 User-Agent 字符串,无需使用指针,避免析构问题
2023-12-30 00:41:06 +08:00
zty199
62e23facfb fix: 修复使用 TreeLand 混合器时启动崩溃问题
适配麒麟 CPU Wayland 环境时,强制设置环境变量 QT_WAYLAND_SHELL_INTEGRATION 为 kwayland-shell,在 TreeLand 混合器下崩溃

Log: 添加环境变量判断,DDE_CURRENT_COMPOSITER=TreeLand 或 DESKTOP_SESSION=treeland 时不执行上述设置环境变量操作
2023-12-30 00:17:01 +08:00
a9264b8cb9 d. 允许
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-12-12 11:20:44 +00:00
78f81e0498 若安装失败,尝试一次aptss update 2023-12-12 12:21:20 +08:00
c055e9bbb4 update tool/spark-dstore-patch.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-12-11 15:28:02 +00:00
080cd44229 update tool/spark-dstore-patch.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-12-11 15:15:23 +00:00
52f42447b4 update tool/spark-dstore-patch.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-12-11 14:32:04 +00:00
5947d7124e provides 2023-12-11 17:07:57 +08:00
f8d4f2f51a update debian/control.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-12-11 08:41:10 +00:00
3c923f33b3 changelog 2023-12-11 16:35:57 +08:00
6b27c5d7b1 Fix: Unable to install when installed in ACE 2023-12-11 16:34:28 +08:00
78810b1a22 fix: New issue link
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-12-11 08:28:58 +00:00
0bc0d13036 !251 修复ARM64的渲染问题
* fixup! update debian/changelog.
* fix: ARM64设备渲染
2023-12-09 14:22:11 +00:00
406e4d5400 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-12-06 14:57:30 +00:00
60daeae2f5 update tool/ssinstall.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-12-06 14:56:35 +00:00
08d9c12793 now chmod +x
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-12-06 14:55:47 +00:00
7d81ba5be7 now chmod +x
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-12-06 14:55:27 +00:00
6df9804f02 fixup! enhance: 微小的改进 2023-12-03 11:10:16 +08:00
a93dd6ec6f enhance: 更改介绍条款 2023-11-29 16:51:24 +08:00
6b83cc48a9 enhance: 微小的改进 2023-11-29 16:16:23 +08:00
9ebc6eb3d3 fix: bad link CN
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-11-28 09:44:51 +00:00
d47fdea23f fix: bad link
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-11-28 09:44:25 +00:00
8b4ae51459 enhance: 更新文档 2023-11-28 12:18:10 +08:00
6563221947 enahnce: 更新 LICENSE 2023-11-28 12:10:18 +08:00
7ac6cb4072 fix: 修复数据回传接口 2023-11-26 12:55:55 +08:00
6b154c3aad update tool/spark-dstore-patch.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-11-25 03:10:00 +00:00
fa3270e401 修复:无法正确获取更新名 2023-11-15 21:25:07 +08:00
63e6b0e6f6 更新过程中提示更改 2023-11-15 17:53:55 +08:00
c2daaad86c 新增:更新界面支持显示软件名称 2023-11-15 17:47:26 +08:00
c5d3dadbbb !248 对应用信息下的截图预览优化 - 高分屏版
* feat: 应用信息截图预览优化高分屏显示(#I8FLJ1)
2023-11-13 13:16:48 +00:00
397d941f2f Feat: support ACE 2023-11-12 22:12:35 +08:00
0f7b79f49e update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-11-09 10:07:44 +00:00
1d7fb7b0d0 update README.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-11-09 10:07:23 +00:00
73e4bb1685 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-11-07 08:54:54 +00:00
7f23300b9e !247 fix: 软件详情图片排序调整为服务器排序,而不是按加载顺序排序
Merge pull request !247 from Cloud/fix/image-order
2023-11-07 08:54:04 +00:00
Cloud
99bdb1f958 fix: 软件详情图片排序调整为服务器排序,而不是按加载顺序排序 2023-11-07 16:01:48 +08:00
3ffaaee174 !246 fix: build error on Deepin V23
Merge pull request !246 from Cloud/fix/v23-build
2023-11-07 06:14:03 +00:00
Cloud
9c977dfc5d fix: build error on Deepin V23
fix build error on Deepin V23
check search edit width
2023-11-06 14:52:45 +08:00
2efd9dc170 修复:A2D应用释放无效的Desktop到桌面上 2023-11-02 22:39:45 +08:00
321e6b3dfe update tool/ssaudit.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-10-31 15:08:58 +00:00
9f1f21c2b6 update tool/ssinstall.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-10-31 15:08:36 +00:00
5136984343 我真蠢,真的 2023-10-31 22:31:30 +08:00
a8d82480e7 我真蠢 2023-10-31 22:30:40 +08:00
efac507fed 修复校验失败 2023-10-31 22:29:10 +08:00
22532e0436 修复安装失效 2023-10-31 22:25:46 +08:00
4de6b167da feat: ssaudit功能同步
feat: 修复翻译问题和缺fi
2023-10-31 22:17:52 +08:00
7bde95a65c feat: aptss支持等待解锁而不是直接退出
feat: 支持自动创建desktop文件
2023-10-31 22:07:21 +08:00
9a47b5515c update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-10-29 08:00:19 +00:00
0db7fad640 !241 chore: 优化 KDE 深色模式支持实现方式
* chore: 优化 KDE 深色模式支持实现方式
2023-10-28 12:15:45 +00:00
1a98dae4f8 Merge branch 'darkmodeenhanced' into dev 2023-10-26 12:21:22 +08:00
5cb1cff0ca feat: 使用dbus支持kde的暗色模式 2023-10-26 12:15:51 +08:00
8d4874d553 feat: 使用dbus支持kde的暗色模式 2023-10-24 23:40:09 +08:00
c00d62c010 feat: 匿名数据搜集 2023-10-24 15:36:26 +08:00
831bef8233 enhance: 同步文档更改到英文 2023-10-22 17:19:35 +08:00
20e1763929 update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-10-22 07:11:52 +00:00
35218a917b update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-10-22 07:11:23 +00:00
e5a2fd2d94 update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-10-22 07:10:54 +00:00
6946f20d64 update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-10-22 07:09:59 +00:00
3f9200bf01 update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-10-22 07:03:39 +00:00
b2fc80215d enhance: 文档改进 2023-10-22 10:56:33 +08:00
74d4cc05d9 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-10-10 08:40:55 +00:00
zty199
a7d86d9120 i18n: 更新部分文案及翻译文件
修改详情页“下载”按钮为“下载并安装”;修正部分文案中错误使用全角标点符号导致翻译文件中无法正常显示;修正部分文案翻译错误;尝试补充 QWebEngineView 右键菜单项翻译

Log: 修改详情页“下载”按钮为“下载并安装”;修正部分文案及翻译;补充 QWebEngineView 部分右键菜单项翻译
2023-10-10 16:30:00 +08:00
fb21620880 !240 enhace: 加强崩溃日志信息
Merge pull request !240 from Pluto/dev
2023-09-22 10:09:51 +00:00
985e7d829e enhance: 更新文档 2023-09-21 20:14:16 +08:00
5ceb8d78cb fixup! enhance: 更详细的日志 2023-09-21 19:59:47 +08:00
dfce427891 enhance: 更详细的日志 2023-09-21 19:55:28 +08:00
c72885ff55 update dtk-build-release-tag-20220425.yml 2023-09-17 00:47:45 +00:00
beba54925c update pipeline-dtk-build-aarch64.yml 2023-09-17 00:43:22 +00:00
aba67f19b4 update pipeline-dtk-build-aarch64.yml 2023-09-17 00:41:12 +00:00
9708db56d6 fix ci
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-17 00:37:26 +00:00
1ee5b412b8 try fix ci
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-17 00:36:54 +00:00
a14613018b update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-17 00:33:27 +00:00
086c490bb7 update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-17 00:32:44 +00:00
3db4cd8a62 update README.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-17 00:29:11 +00:00
104f8b798f !237 优化下载错误和规范程序代码
Merge pull request !237 from Pluto/dev
2023-09-17 00:25:47 +00:00
5ede18a8d3 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-17 00:24:53 +00:00
375a520a14 enhance: 完善日志内容 2023-09-16 21:11:53 +08:00
d41364c063 Merge branch 'dev' of gitee.com:uniartisan2018/spark-store into dev 2023-09-16 20:27:58 +08:00
a6cd981a51 enhance: 打印崩溃堆栈 2023-09-16 20:26:58 +08:00
9660eaafd3 update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-16 12:17:05 +00:00
1cc9d3bdd6 update README.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-16 12:16:08 +00:00
6790283ace changelog fix v23 2023-09-16 19:55:20 +08:00
735e99d891 Merge branch 'dev' of gitee.com:uniartisan2018/spark-store into dev 2023-09-16 19:49:19 +08:00
9b4dae382d fixup: 修复编译错误 2023-09-16 19:49:07 +08:00
c1ccf51258 fixup! Enhance: 规范性提升 2023-09-16 19:47:54 +08:00
61a28b1d73 changelog 2023-09-16 19:13:43 +08:00
2a5e1280f9 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-16 10:39:59 +00:00
72d1374503 Merge branch 'dev' of gitee.com:uniartisan2018/spark-store into dev 2023-09-16 18:33:36 +08:00
c791ad4afb fixup! bugfix: 修复CPU占用高、修复下载失败等问题 2023-09-16 18:33:19 +08:00
1037330324 update src/backend/downloadworker.cpp.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-16 10:31:25 +00:00
7acd2edbcc fix: 修正错误消息 2023-09-16 18:28:30 +08:00
8392fbb64e bugfix: 修复CPU占用高、修复下载失败等问题 2023-09-16 18:22:15 +08:00
24dbed8864 Enhance: 规范性提升 2023-09-16 18:21:45 +08:00
4330abdf0b update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-14 06:22:25 +00:00
72d8bf883b update tool/aptss.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-14 06:21:20 +00:00
77 changed files with 4254 additions and 3063 deletions

2
.gitignore vendored
View File

@@ -15,6 +15,7 @@ object_script.*.Debug
*_plugin_import.cpp
/.qmake.cache
/.qmake.stash
.qtc_clangd/*
*.pro.user
*.pro.user.*
*.qbs.user
@@ -53,3 +54,4 @@ debian/*.substvars
debian/spark-store
.vscode/*
src/spark-store

View File

@@ -2,7 +2,7 @@ version: '1.0'
name: dtk-build-release-tag-20220425
displayName: dtk-build-release-tag
triggers:
trigger: auto
trigger: manual
push:
tags:
prefix:

View File

@@ -25,10 +25,12 @@ stages:
- apt update
- export DEBIAN_FRONTEND=noninteractive
- echo "安装wget qemu-user-static"
- apt install wget qemu-user-static xz-utils -y
- apt install git wget qemu-user-static xz-utils binfmt-support -y
- mkdir ../spark-store-git
- mv * ../spark-store-git
- wget https://code.gitlink.org.cn/shenmo7192/debian-container-aarch64/raw/branch/master/DEBIANARM.tar.xz
- git clone https://gitlink.org.cn/shenmo7192/debian-container-aarch64.git
- mv debian-container-aarch64/DEBIANARM.tar.xz .
- rm -rf debian-container-aarch64
- tar -xf DEBIANARM.tar.xz
- mkdir -p DEBIAN/root/build-spark
- mv ../spark-store-git DEBIAN/root/build-spark/spark-store

View File

@@ -1,328 +0,0 @@
#### 说明
当前服务器线路列表(项目中包含):
```
https://d.store.deepinos.org.cn/
https://store.deepinos.org.cn/
```
# 星火应用商店文档
# 目录结构
几个目录结构
```
/
/icons 图标文件夹
/tags 首页图标
/tras 多语言翻译
```
主要的文件分析
```js
spark-store.pro Qt工程配置文件
ssinstall 调用包安装器的脚本
icons.qrc 图标资源文件
main.cpp 入口文件
widget.h widget.cpp widget.ui 主要窗口控件
downloadlist.h downloadlist.cpp downloadlist.ui 单个软件的下载安装展示控件
progressload.h progressload.cpp 网页加载显示 得在deepin上编译运行才能搞清楚
workerthreads.h workerthreads.cpp 应用信息加载线程
image_show.h image_show.cpp 应用页面截图预览控件
big_image.h big_image.cpp 大图查看控件
```
# 使用的开源库及第三方工具
* GDebi 一个 Ubuntu 软件中心的轻量级替代品 https://linux.cn/article-4982-1.html
* libnotify 系统通知 https://developer.gnome.org/libnotify/unstable/
# 源码分析
## 应用的组成部分
左侧应用分类菜单
主窗口的下拉菜单
应用列表页面
应用详情页面
应用首页,有几个链接跳转
商店设置页面
下载列表页面
## 应用初始化,及主控件加载
初始化 `DApplication` 进入事件循环。
设置关于我们弹窗 `DAboutDialog`
主控件 Widget 根据不同屏幕大小自适应。
首页打开webview页面如果传入了`spk://`参数,会打开应用详情页。
```cpp
// main.cpp
QString arg1=argv[1];
if(arg1.left(6)=="spk://"){
w.openUrl(QUrl(argv[1]));
}
// widget.cpp
void Widget::openUrl(QUrl u)
{
QString app=serverUrl + "store"+u.path()+"/app.json";
ui->webEngineView->setUrl(app); // 会触发 webEngineView 的
}
```
## Tags处理方式
**Tags处理方式**
```cpp
// widget.cpp
QString tags=json["Tags"].toString(); //Read the Tags
QStringList tagList=tags.split(";");
for (int i=0;i<tagList.size();i++) {
if(tagList[i]=="community")
ui->tag_community->show();//Tags icon shows like this
if(tagList[i]=="ubuntu")
ui->tag_ubuntu->show();
if(tagList[i]=="deepin")
ui->tag_deepin->show();
if(tagList[i]=="uos")
ui->tag_uos->show();
if(tagList[i]=="dtk5")
ui->tag_dtk5->show();
if(tagList[i]=="dwine2")
ui->tag_dwine2->show();
if(tagList[i]=="dwine5")
ui->tag_dwine5->show();
if(tagList[i]=="a2d")
ui->tag_a2d->show();
}
```
**Widget 初始化**
```cpp
void Widget::initConfig()
{
...
// 读取服务器URL并初始化菜单项的链接
QSettings readConfig(QDir::homePath()+"/.config/spark-store/config.ini",QSettings::IniFormat);
if(readConfig.value("server/choose").toString()!=""){
ui->comboBox_server->setCurrentText(readConfig.value("server/choose").toString());
appinfoLoadThread.setServer(serverUrl=readConfig.value("server/choose").toString());
}else {
appinfoLoadThread.setServer(serverUrl="http://sucdn.jerrywang.top/"); // 默认URL
}
configCanSave=true; // 防止触发保存配置信号
menuUrl[0]=serverUrl + "store/#/"; // 首页
// 下面是各个应用分类页面直接加载的webview的
// 每个连接对应一个左侧的菜单项,在构造函数用连接到 chooseLeftMenu 槽函数
menuUrl[1]=serverUrl + "store/#/network";
...
menuUrl[12]=serverUrl + "store/#/others";
...
ui->webfoot->hide();
//初始化首页
ui->webEngineView->setUrl(menuUrl[0]);
}
/**
* 菜单切换逻辑
*
*/
void Widget::chooseLeftMenu(int index)
{
nowMenu=index;
updateUI();
left_list[index]->setStyleSheet("color:#FFFFFF;background-color:"+main_color.name()+";border-radius:8;border:0px");
// index <=12 加载某个分类的应用列表的webviejw
// index == 13 加载下载列表页面
if(index<=12){
if(themeIsDark){
darkurl = URL
ui->webEngineView->setUrl(darkurl);
}else {
ui->webEngineView->setUrl(menuUrl[index]);
}
ui->stackedWidget->setCurrentIndex(0);
}else if (index==13) {
ui->stackedWidget->setCurrentIndex(1);
}
}
```
## 应用下载安装卸载分析
**应用详情页面加载**
```cpp
/**
* 加载单个应用的信息
*/
void Widget::on_webEngineView_urlChanged(const QUrl &arg1)
{
//分析出服务器中的分类名称
...
//如果是app.json就打开详情页
if(arg1.path().right(8)=="app.json"){
...
// 读取相应的应用信息
appinfoLoadThread.requestInterruption();
appinfoLoadThread.wait(100);
appinfoLoadThread.setUrl(arg1);
appinfoLoadThread.start();
}
}
// 设置详情页的APP信息
SpkAppInfoLoaderThread::requestSetAppInformation() -> Widget::sltAppinfoDetails()
// 设置详情页的APP图标
SpkAppInfoLoaderThread::finishedIconLoad() -> Widget::sltAppinfoIcon()
// 设置详情页的APP截图
SpkAppInfoLoaderThread::finishedScreenshotLoad() -> Widget::sltAppinfoScreenshot()
// 下载APP详情信息线程
void SpkAppInfoLoaderThread::run()
{
QProcess get_json;
get_json.start("curl -o app.json " + targetUrl.toString());
QFile app_json("app.json");
app.json
}
```
**应用下载**
Widget::on_pushButton_download_clicked() 是点击下载的安装方法。
最终使用的是 `QNetwrokAccessManager` 进行GET请求获取数据写入文件。
```cpp
void Widget::on_pushButton_download_clicked()
{
if(!isBusy){
file = new QFile(fileName);
...
nowDownload+=1;
startRequest(urList.at(nowDownload-1)); // 进行链接请求
}
}
void Widget::startRequest(QUrl url)
{
reply = manager->get(QNetworkRequest(url));
// 请求响应完成,关闭文件,清理下载队列
connect(reply,SIGNAL(finished()),this,SLOT(httpFinished()));
// 接收应用下载数据
connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead()));
// 更新应用下载进度
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateDataReadProgress(qint64,qint64)));
}
```
使用 QSettings 来读取配置,更换服务源
```cpp
void Widget::on_comboBox_server_currentIndexChanged(const QString &arg1)
{
appinfoLoadThread.setServer(arg1); // 服务器信息更新
if(configCanSave){
ui->label_setting1->show();
QSettings *setConfig=new QSettings(QDir::homePath()+"/.config/spark-store/config.ini",QSettings::IniFormat);
setConfig->setValue("server/choose",arg1);
}
}
```
使用 `QProcess` 来调用各种小文件下载、包安装卸载的命令。
**应用安装**
```cpp
void Widget::httpFinished() // 完成下载
{
...
download_list[nowDownload-1].readyInstall();
download_list[nowDownload-1].free=true;
if(nowDownload<allDownload){ // 如果有排队则下载下一个
...
}
}
void downloadlist::readyInstall()
{
...
ui->pushButton_install->setEnabled(true);
ui->pushButton_install->show();
ui->pushButton_2->hide();
Widget::sendNotification(tr("Finished downloading %1, awaiting to install").arg(ui->label->text()), 5000,
"/tmp/spark-store/icon_"+QString::number(num).toUtf8()+".png");
}
void downloadlist::on_pushButton_install_clicked()
{
//弹出菜单
menu_install->exec(cursor().pos());
}
downloadlist menu_install
downloadlist::install()
gdebi, dpkg, deepin-deb-installer
void downloadlist::install(int t)
{
QtConcurrent::run([=](){
QProcess installer;
installer.start("pkexec gdebi -n /tmp/spark-store/"+ui->label_filename->text().toUtf8());
installer.start("pkexec ssinstall /tmp/spark-store/"+ui->label_filename->text().toUtf8());
installer.start("deepin-deb-installer /tmp/spark-store/"+ui->label_filename->text().toUtf8());
});
}
```
**应用卸载**
```cpp
void Widget::on_pushButton_uninstall_clicked()
{
QtConcurrent::run([=](){
uninstall.start("pkexec apt purge -y "+pkgName);
});
}
```
**仓库源更新**
```cpp
// 更新源列表
void Widget::on_pushButton_updateServer_clicked()
{
QtConcurrent::run([=](){
...
QFile::remove(QDir::homePath().toUtf8()+"/.config/spark-store/server.list");
system("curl -o "+QDir::homePath().toUtf8()+"/.config/spark-store/server.list http://dcstore.shenmo.tech/store/server.list");
server.open(QDir::homePath().toUtf8()+"/.config/spark-store/server.list",std::ios::in);
...
while (getline(server,lineTmp)) {
ui->comboBox_server->addItem(QString::fromStdString(lineTmp));
}
});
}
// 更新星火商店apt源
void Widget::on_pushButton_updateApt_clicked()
{
QtConcurrent::run([=](){
comboBox_server /tmp/spark-store/sparkstore.list
bash脚本 sparkstore.list /etc/apt/sources.list.d/
使QProcess pkexec update.sh
}):
}
```
## 发送系统通知
```cpp
#include <libnotify/notify.h>
static NotifyNotification *_notify = nullptr; // 初始化
notify_init(tr("Spark\\ Store").toLocal8Bit()); // 构造函数初始化
notify_uninit(); // 析构函数调用
void Widget::sendNotification(const QString &message, const int msTimeout, const QString &icon)
{
if(_notify == nullptr)
{
_notify = notify_notification_new(tr("Spark\\ Store").toLocal8Bit(), message.toLocal8Bit(), icon.toLocal8Bit());
notify_notification_set_timeout(_notify, msTimeout);
}
else
notify_notification_update(_notify, tr("Spark\\ Store").toLocal8Bit(), message.toLocal8Bit(), icon.toLocal8Bit());
notify_notification_show(_notify, nullptr);
}
```

20
LICENSE
View File

@@ -6,9 +6,15 @@
1. 对本仓库下的所有文件生效:本许可证适用于本仓库(或项目)下的所有文件。任何使用、修改或再发布本软件的个人或组织都必须遵守本许可证。
2. 版权声明和许可证文件:您不得移除、隐藏或更改本软件中包含的原作者的版权声明和许可证文件。保留原作者的权益信息对于维护开源软件生态系统至关重要。
3. 版本标注:如果您对本软件做出修改并再发布,您必须在醒目位置标注此版本并非星火社区官方提供。这样可以避免误导使用者认为该软件为星火社区官方提供的版本。
3. 版本标注: 如果您对本软件做出修改并再发布,您必须在醒目位置标注此版本并非星火社区官方提供。这样可以避免误导使用者认为该软件为星火社区官方提供的版本。此软件仅授权用于个人非盈利用途,任何将其用于商业目的或在盈利性组织中使用的行为均需事先获得星火社区的书面许可。
4. 商标使用您不得在再发布版本中使用“星火应用商店”、“Spark Store”或星火应用商店的Logo等可能误导使用者此软件由星火社区官方提供的信息。
5. 其他条款:除上述约定外,您应遵守 GPL v3 的所有其他条款和要求
5. 服务条款:您使用星火商店软件的行为将被视为您同意星火在不侵犯您隐私的前提下搜集版本、日志等信息,以便于星火社区更好地为您提供服务
6. 仓库版权条款:为了更好的提供持续性服务,星火仅对个人用户免费开放服务仓库,如您或您的组织需要提供商业服务或者您的组织为盈利性组织,请联系星火社区获取商业授权。
7. 禁止恶意行为和批量爬取: 用户或组织在使用本软件时,严禁进行任何形式的恶意行为,包括但不限于恶意攻击、滥用、破坏、批量爬取软件仓库等。恶意行为的定义由星火社区自行判断,违反者将被追究法律责任。
8. 分发与再分发权利: 星火社区保留对其制作的软件包的分发权利。未经明确授权,禁止任何个人或组织将星火社区软件包用于商业目的或在未获得星火社区许可的情况下进行再分发。此条款旨在确保开源精神的同时,维护星火社区的知识产权。
9. 商业应用限制:您不得使用本软件的代码开发商业应用,也不得在商业应用中使用本软件的代码,除非获得星火社区和火穗(沈阳)计算机软件开发有限公司的书面许可。
10. 其他条款:除上述约定外,若您使用了星火商店的主程序或其部分代码,您应遵守 GPL v3 的所有其他条款和要求。若本协议条款的内容与GPL V3中的内容不同的以本协议条款为准
11. 其他约定:本许可以简体中文版本为最准确释义
GPLV3许可证的完整文本可以在以下链接找到https://www.gnu.org/licenses/gpl-3.0.html
@@ -22,8 +28,14 @@ This software is free software; you can modify and redistribute it under the ter
1. Applicability to all files in this repository: This license applies to all files in this repository (or project). Any individuals or organizations that use, modify, or redistribute this software must comply with this license.
2. Copyright notice and license files: You must not remove, hide, or modify the copyright notice and license files of the original authors included in this software. Preserving the rights information of the original authors is essential for maintaining the open-source software ecosystem.
3. Version annotation: If you modify this software and redistribute it, you must prominently annotate that this version is not provided by the Spark community officially. This is to avoid misleading users into believing that the software is provided by the official Spark community.
3. Version annotation: If you modify and redistribute this software, you must mark in a prominent position that this version is not officially provided by the Spark community. This avoids misleading users into thinking that the software is an official version provided by the Spark community. This software is licensed for personal, non-profit use only, and any use of it for commercial purposes or in for-profit organizations requires the prior written permission of the Spark Community.
4. Trademark usage: You are not allowed to use terms such as "Spark App Store," "Spark Store," or the logo of Spark App Store in redistributed versions, as they may mislead users into believing that the software is provided by the official Spark community.
5. Additional terms: Apart from the above provisions, you must comply with all other terms and requirements of GPL v3.
5. Terms of Service: Your use of the software of Spark Store will be deemed as your consent to collect version, log and other information on the premise of not violating your privacy, so as to facilitate the Spark community to provide you with better services.
6. Warehouse copyright terms: In order to better provide continuous services, Spark is only free for individual users to open the service warehouse, if you or your organization needs to provide commercial services or your organization is a for-profit organization, please contact Spark community to obtain commercial authorization.
7. Prohibited malicious behavior and mass crawling: Users or organizations are strictly prohibited to engage in any form of malicious behavior when using the software, including but not limited to malicious attacks, abuse, destruction, and mass crawling of software warehouses. The definition of malicious behavior is judged by the Spark community, and violators will be held legally responsible.
8. Distribution and redistribution rights: Spark Community reserves the right to distribute the software packages it produces. Any person or organization is prohibited from using the Spark Community software package for commercial purposes or redistributing it without the express authorization of the Spark Community. This clause is intended to ensure the spirit of open source while safeguarding the intellectual property rights of the Spark community.
9. Business Application Restriction: You are not permitted to utilize the code of this software for developing commercial applications, nor are you allowed to integrate the code of this software into commercial applications without obtaining written consent from both the Spark Community and Flamescion (Shenyang) Computer Software Development Co., Ltd.
10. Other Terms: In addition to the above provisions, if you use the main program or any part of the code of Spark Store, you must comply with all other terms and requirements of GPL v3. In case of any inconsistency between the terms of this agreement and those of GPL v3, the terms of this agreement shall prevail.
11. Additional Agreements: This license shall be interpreted most accurately in its Simplified Chinese version.
You can find the full text of GPLV3 license at: https://www.gnu.org/licenses/gpl-3.0.html

View File

@@ -1,83 +0,0 @@
# Spark App Store
[![star](https://gitee.com/deepin-community-store/spark-store/badge/star.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/stargazers) [![fork](https://gitee.com/deepin-community-store/spark-store/badge/fork.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/members)
## You are informed that the aarch64 support is EXPERIMENTAL and there is NO GUARANTEE that this branch will be supported in the future
Spark Store aims to collect Linux apps for the convieniece of Linux new comers
The collecting process needs everyone's help
We set up this APP Store and collect APPs/tools that everyone need widely. Also we pack Windows apps with wine.
All packages will be shared in our repository for users to get freely.
Distrobution supportedDeepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(May stop support in the future ; UniontechOS Home 21
*About OpenKylin and deepin 23*
The adaptation work is scheduled after their official release.
You can track our Issue resoving progress here https://gitee.com/deepin-community-store/spark-store/board
We hope people who see here can also join our teamdevelopment help or submit applications are welcomed
If you want to submit an APP to share with othersPlease [Click here](https://upload.deepinos.org/index)
## 🙌 A simple start
If you simply want to install the Spark Store,just enter the [Release] page, find the version you want and install.
If you are using Debian11/Ubuntu 20.04, you will need extra dependency package. Available [here](https://zunyun01.store.deepinos.org.cn/spark-store-dependencies-kylin.zip)
---
#### Compile and developement
For Deepin V20/UOS 21/ Debian 11
```shell
sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot qtwayland5 qtwayland5-dev-tools dde-qt5wayland-plugin libqt5svg5*
```
Ubuntu 22.04
```shell
sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev qtwayland5 qtwayland5-dev-tools libqt5svg5*
```
Then
```shell
git clone https://gitee.com/deepin-community-store/spark-store.git
cd spark-store
dpkg-buildpackage -j
```
Or:
```shell
git clone https://gitee.com/deepin-community-store/spark-store.git
cd spark-store
./build_and_install.sh
```
## EULA
This is our [EULA](https://genshin-impact.fandom.com/wiki/Eula)
## 🚀 Coorperation
We use Gitee as our code hosting platform. Please click here to contact us.
https://gitee.com/deepin-community-store/spark-store
### Forum
https://www.deepinos.org/
#### QQ Group
https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/

View File

@@ -1,79 +0,0 @@
# 星火应用商店
[![star](https://gitee.com/deepin-community-store/spark-store/badge/star.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/stargazers) [![fork](https://gitee.com/deepin-community-store/spark-store/badge/fork.svg?theme=gvp)](https://gitee.com/deepin-community-store/spark-store/members)
## 请注意aarch64的支持是实验性的并未确认持续支持
众所周知国内的Linux应用比较少wine应用难以获取优质工具分散在民间各大论坛无法形成合力难以改善生态
生态构建需要的不是某一方的单打独斗,而是人人行动起来,汇聚星火,产生燎原之势
我们创建了这个应用商店广泛收录大家需要的软件包搜集优质小工具主动适配wine应用存放到储存库供大家获取
我们支持Deepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(将会逐渐停止支持) ; UOS Home 21
## 关于协作:分支相关的文档见 [这里](https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo)
*关于OpenKylin和deepin 23*
支持计划将会在对应系统发布正式版之后开始评估和执行
希望看到这里的人也可以加入我们的队伍开发或者投递应用都很欢迎共同构建Linux应用生态
在这里追踪我们的Issue处理情况 https://gitee.com/deepin-community-store/spark-store/board
如果有想要提交的软件包,请 [在这里投稿](https://upload.deepinos.org/index)
## 🙌 简单的开始
如果想安装 `星火应用商店` ,请打开右侧的 [Release] 页面,找到最新版本,并选择适用于当前系统的安装包下载。
如果你在使用 `Debian 11/Ubuntu 20.04`,你需要额外下载[依赖补充包](https://zunyun01.store.deepinos.org.cn/spark-store-dependencies-kylin.zip)
---
#### 编译安装
Deepin V20/UOS 21 系统下, 安装依赖
```shell
sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot qtwayland5 qtwayland5-dev-tools dde-qt5wayland-plugin libqt5svg5*
```
Ubuntu 22.04 系统下, 安装依赖
```shell
sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev qtwayland5 qtwayland5-dev-tools libqt5svg5*
```
然后
```shell
git clone https://gitee.com/deepin-community-store/spark-store.git
cd spark-store
dpkg-buildpackage -j
```
或者: 编译并安装
```shell
git clone https://gitee.com/deepin-community-store/spark-store.git
cd spark-store
./build_and_install.sh
```
## EULA
这里是我们的[EULA](https://mzh.moegirl.org.cn/%E4%BC%98%E8%8F%88%C2%B7%E5%8A%B3%E4%BC%A6%E6%96%AF)
## 🚀 协作
非常感谢有兴趣的开发者或爱好者参与 `星火应用商店` 项目,分享你的见解与思路。
### 论坛
https://www.deepinos.org/
#### QQ群
https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/

62
debian/changelog vendored
View File

@@ -1,3 +1,65 @@
spark-store (4.2.12~chocolate) stable; urgency=medium
* 修复:飞腾部分设备上白屏的问题
* 修复:下载开始时长时等待(降低链接超时时长)
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.11~in-ace-release) stable; urgency=medium
* 修复:判断是否安装状态错误
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.10) stable; urgency=medium
* 修复:部分发行版上无法启动自动创建的桌面图标
* 修复:发行版统计信息
* 修复Gitee反馈链接错误
* 修复ACE下无法安装,支持ACE下软件更新
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.9) stable; urgency=medium
* 修复:软件详情图片排序调整为服务器排序,而不是按加载顺序排序
* 修复: build error on Deepin V23
* 修复:容器内无限等待
* 新增:高分屏截图支持
* 新增:更新界面支持显示软件名称
-- 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
* 修复下载时如果卡0%(无法下载metalink),会在超时后报错中断而不是一直傻等
* 修复排队下载时CPU占满单核的bug https://gitee.com/deepin-community-store/spark-store/issues/I7B91V
* 修复在终端中打开的icon过大导致无法投稿到UOS
* 修复v23下编译出错
* 薪怎:支持崩溃日志收集系统
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.7.2) stable; urgency=medium
* 新增:内置在终端打开功能

4
debian/control vendored
View File

@@ -5,7 +5,8 @@ Priority: optional
Build-Depends:
debhelper (>= 9),
pkg-config,
qtchooser (>= 55-gc9562a1-1~),
qtchooser (>= 55-gc9562a1-1~) | qt5-default,
qtbase5-dev,
libqt5core5a,
libqt5gui5,
libqt5widgets5,
@@ -26,6 +27,7 @@ Homepage: https://www.spark-app.store/
Package: spark-store
Architecture: any
Provides: spark-store-console-in-container
Depends:${shlibs:Depends}, ${misc:Depends},
libqt5core5a,
libqt5gui5,

17
debian/rules vendored
View File

@@ -7,6 +7,9 @@ include /usr/share/dpkg/default.mk
DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
# Use realtime timestamp instead of the latest entry in debian/changelog
SOURCE_DATE_EPOCH := $(shell date +%s)
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE = 1
@@ -14,25 +17,23 @@ DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
dh $@ --parallel
override_dh_auto_clean:
rm -rf $(CURDIR)/build
rm -rf $(CURDIR)/build-$(DEB_HOST_MULTIARCH)
override_dh_auto_configure:
mkdir -p $(CURDIR)/build
mkdir -p $(CURDIR)/build-$(DEB_HOST_MULTIARCH)
qmake BUILD_VERSION=$(DEB_VERSION_UPSTREAM) spark-store-project.pro \
-spec linux-g++ CONFIG+=qtquickcompiler \
-o $(CURDIR)/build/
-spec linux-g++ CONFIG+=force_debug_info \
-o $(CURDIR)/build-$(DEB_HOST_MULTIARCH)/
override_dh_auto_build:
make MAKEFLAGS="$(MAKEFLAGS)" -C $(CURDIR)/build
make -C $(CURDIR)/build-$(DEB_HOST_MULTIARCH) -j$(JOBS)
override_dh_auto_install:
make -C $(CURDIR)/build 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.
override_dh_shlibdeps:
dh_shlibdeps --dpkg-shlibdeps-params=--warnings=0

View File

@@ -12,6 +12,10 @@ case "$1" in
aarch64)
echo "Will not enable armhf since 4271"
;;
loongarch64)
echo "Enabling ABI1(OldWorld) arch..."
dpkg --add-architecture loongarch64
;;
*)
echo "Unknown architecture, skip enable 32-bit arch"
@@ -30,6 +34,8 @@ case "$1" in
ln -s -f /opt/durapps/spark-store/bin/spark-store /usr/local/bin/spark-store
ln -s -f /opt/durapps/spark-store/bin/ssinstall /usr/local/bin/ssinstall
ln -s -f /opt/durapps/spark-store/bin/ssaudit /usr/local/bin/ssaudit
ln -s -f /opt/durapps/spark-store/bin/ssinstall /usr/bin/ssinstall
ln -s -f /opt/durapps/spark-store/bin/ssaudit /usr/bin/ssaudit
ln -s -f /opt/durapps/spark-store/bin/spark-dstore-patch /usr/local/bin/spark-dstore-patch
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/local/bin/ss-apt-fast

View File

@@ -16,12 +16,14 @@ if [ "$1" = "remove" -o "$1" = "purge" ] ; then
echo "卸载操作,进行配置清理"
# Remove residual symbol links
rm -f /usr/local/bin/spark-store
rm -f /usr/local/bin/ssinstall
rm -f /usr/local/bin/ssaudit
rm -f /usr/local/bin/spark-dstore-patch
rm -f /usr/local/bin/ss-apt-fast
rm -f /usr/bin/aptss
unlink /usr/local/bin/spark-store
unlink /usr/local/bin/ssinstall
unlink /usr/local/bin/ssaudit
unlink /usr/bin/ssinstall
unlink /usr/bin/ssaudit
unlink /usr/local/bin/spark-dstore-patch
unlink /usr/local/bin/ss-apt-fast
unlink /usr/bin/aptss
rm -rf /etc/aptss/
rm -rf /var/lib/aptss/

File diff suppressed because it is too large Load Diff

View File

@@ -4,8 +4,8 @@ Type=Application
Categories=System;
Exec=spark-store %u
Icon=spark-store
Name=Spark Store
Name[zh_CN]=星火应用商店
Name=Spark Store(NAU)
Name[zh_CN]=星火应用商店(海军航空大学版)
Keywords=appstore;
Terminal=false
StartupNotify=true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 89 KiB

View File

@@ -2,6 +2,8 @@
#include "mainwindow-dtk.h"
#include "utils/utils.h"
#include <QDir>
#include <QJsonArray>
#include <DPlatformWindowHandle>
#include <DLog>
#include <DGuiApplicationHelper>
@@ -12,6 +14,7 @@
#include <QSettings>
#include <QStandardPaths>
#include <QTranslator>
DCORE_USE_NAMESPACE
@@ -33,13 +36,13 @@ Application::Application(int &argc, char **argv)
setApplicationDisplayName(QObject::tr("Spark Store")); // 设置窗口显示标题 (Wayland 下会显示 Qt 原生标题栏)
setProductName(QObject::tr("Spark Store"));
setProductIcon(QIcon::fromTheme("spark-store"));
setApplicationHomePage("https://gitee.com/deepin-community-store");
setApplicationHomePage("https://www.spark-app.store");
setApplicationDescription(
QObject::tr(
"<span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/>"
"<span style=' font-size:10pt;font-weight:60;'>Professional application distribution solution</span><br/>"
"<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
"<span style=' font-size:12pt;'>Spark developers</span>"));
setApplicationLicense(" <a href='https://gitee.com/deepin-community-store/spark-store/blob/Flamescion/LICENSE'>GPLv3</a> ");
"<span style=' font-size:12pt;'>Flamescion (Shenyang) Computer Software Development Co., Ltd.</span>"));
setApplicationLicense(" <a href='https://gitee.com/spark-store-project/spark-store/blob/Flamescion/LICENSE'>Spark Opensource License</a> ");
// 检查 ~/.config/spark-union/spark-store 文件夹是否存在
checkAppConfigLocation();
@@ -91,7 +94,7 @@ void Application::setBuildDateTime(const QString &buildDateTime)
qDebug() << "Spark Store has been updated!";
config.setValue("build/version", QString(APP_VERSION));
config.setValue("build/branch",QString(APP_BRANCH));
config.setValue("build/branch", QString(APP_BRANCH));
config.setValue("build/time", buildDateTime);
config.sync();
}
@@ -156,6 +159,17 @@ void Application::initAboutDialog()
dialog->hide();
}
void Application::loadTranslator()
{
DApplication::loadTranslator();
if (QLocale::system().language() == QLocale::Chinese) {
QTranslator *webengineTranslator = new QTranslator(this);
webengineTranslator->load(QLocale(QLocale::Chinese), "qtwebengine", "_", ":/translations");
installTranslator(webengineTranslator);
}
}
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
/**
* @brief Application::initFeatureDisplayDialog 初始化版本特性对话框

View File

@@ -30,6 +30,8 @@ private:
void initFeatureDisplayDialog();
#endif
void loadTranslator();
private:
QJsonObject m_featuresJsonObj;

View File

@@ -62,5 +62,6 @@
<file>tags/uos-authorize.svg</file>
<file>tags/uos-small.png</file>
<file>tags/uos.svg</file>
<file>translations/qtwebengine_zh.qm</file>
</qresource>
</RCC>

Binary file not shown.

View File

@@ -0,0 +1,305 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN" sourcelanguage="es">
<context>
<name>QWebEnginePage</name>
<message>
<source>Cut</source>
<translation></translation>
</message>
<message>
<source>Back</source>
<translation>退</translation>
</message>
<message>
<source>Copy</source>
<translation></translation>
</message>
<message>
<source>Redo</source>
<translation></translation>
</message>
<message>
<source>Stop</source>
<translation></translation>
</message>
<message>
<source>Undo</source>
<translation></translation>
</message>
<message>
<source>&amp;Back</source>
<translation>&amp;退</translation>
</message>
<message>
<source>Paste</source>
<translation></translation>
</message>
<message>
<source>Copy Image URL</source>
<translation></translation>
</message>
<message>
<source>Open Link in This Window</source>
<translation></translation>
</message>
<message>
<source>Toggle Mute</source>
<translation></translation>
</message>
<message>
<source>Inspect Element</source>
<translation></translation>
</message>
<message>
<source>Toggle Media Controls</source>
<translation></translation>
</message>
<message>
<source>Reload</source>
<translation></translation>
</message>
<message>
<source>Copy Link URL</source>
<translation></translation>
</message>
<message>
<source>Exit Full Screen Mode</source>
<translation>退</translation>
</message>
<message>
<source>Paste and Match Style</source>
<translation>Pegar y coincidir estilo</translation>
</message>
<message>
<source>Follow Link</source>
<translation>Seguir vínculo</translation>
</message>
<message>
<source>Open Link in New Tab</source>
<translation></translation>
</message>
<message>
<source>Reload and Bypass Cache</source>
<translation></translation>
</message>
<message>
<source>Select folder to upload</source>
<translation>Seleccionar una carpeta para subir</translation>
</message>
<message>
<source>Save Image</source>
<translation></translation>
</message>
<message>
<source>Save Media</source>
<translation></translation>
</message>
<message>
<source>Toggle Looping</source>
<translation></translation>
</message>
<message>
<source>Close Page</source>
<translation></translation>
</message>
<message>
<source>Toggle Play/Pause</source>
<translation>/</translation>
</message>
<message>
<source>Copy Image</source>
<translation></translation>
</message>
<message>
<source>&amp;Reload</source>
<translation>&amp;</translation>
</message>
<message>
<source>Select All</source>
<translation></translation>
</message>
<message>
<source>Save Link</source>
<translation>Guardar enlace</translation>
</message>
<message>
<source>Copy Media URL</source>
<translation></translation>
</message>
<message>
<source>Forward</source>
<translation></translation>
</message>
<message>
<source>&amp;Forward</source>
<translation>&amp;</translation>
</message>
<message>
<source>Open Link in New Window</source>
<translation></translation>
</message>
<message>
<source>Are you sure you want to leave this page?</source>
<translation></translation>
</message>
</context>
<context>
<name>QQuickWebEngineView</name>
<message>
<source>Back</source>
<translation>退</translation>
</message>
<message>
<source>Copy</source>
<translation></translation>
</message>
<message>
<source>Copy Image URL</source>
<translation></translation>
</message>
<message>
<source>Toggle Mute</source>
<translation></translation>
</message>
<message>
<source>Inspect Element</source>
<translation></translation>
</message>
<message>
<source>Toggle Media Controls</source>
<translation></translation>
</message>
<message>
<source>Reload</source>
<translation></translation>
</message>
<message>
<source>Copy Link URL</source>
<translation></translation>
</message>
<message>
<source>Exit Full Screen Mode</source>
<translation>退</translation>
</message>
<message>
<source>Follow Link</source>
<translation></translation>
</message>
<message>
<source>Save Image</source>
<translation></translation>
</message>
<message>
<source>Save Media</source>
<translation></translation>
</message>
<message>
<source>Toggle Looping</source>
<translation></translation>
</message>
<message>
<source>Toggle Play/Pause</source>
<translation>/</translation>
</message>
<message>
<source>Copy Image</source>
<translation></translation>
</message>
<message>
<source>Save Link</source>
<translation></translation>
</message>
<message>
<source>Copy Media URL</source>
<translation></translation>
</message>
<message>
<source>Forward</source>
<translation></translation>
</message>
</context>
<context>
<name>QtWebEngineCore</name>
<message>
<source>Javascript Alert - %1</source>
<translation>Javascript - %1</translation>
</message>
<message>
<source>Javascript Confirm - %1</source>
<translation>Javascript - %1</translation>
</message>
<message>
<source>Javascript Prompt - %1</source>
<translation>Javascript - %1</translation>
</message>
<message>
<source>Are you sure you want to leave this page?</source>
<translation></translation>
</message>
</context>
<context>
<name>QtWebEnginePlugin</name>
<message>
<source>Cannot create a separate instance of WebEngineDownloadItem</source>
<translation> WebEngineDownloadItem </translation>
</message>
<message>
<source>Cannot create separate instance of WebEngineLoadRequest</source>
<translation> WebEngineLoadRequest </translation>
</message>
<message>
<source>Cannot create a separate instance of WebEngineSettings</source>
<translation> WebEngineSettings </translation>
</message>
<message>
<source>Cannot create separate instance of WebEngineNavigationRequest</source>
<translation> WebEngineNavigationRequest </translation>
</message>
<message>
<source>Cannot create separate instance of WebEngineNewViewRequest</source>
<translation> WebEngineNewViewRequest </translation>
</message>
<message>
<source>Cannot create separate instance of WebEngineCertificateError</source>
<translation> WebEngineCertificateError </translation>
</message>
<message>
<source>Cannot create a separate instance of FullScreenRequest</source>
<translation> FullScreenRequest </translation>
</message>
<message>
<source>Cannot create a separate instance of NavigationHistory</source>
<translation> NavigationHistory </translation>
</message>
</context>
<context>
<name>QtWebEngineExperimentalPlugin</name>
<message>
<source>Cannot create a separate instance of WebEngineViewExperimental</source>
<translation> WebEngineViewExperimental </translation>
</message>
<message>
<source>Cannot create a separate instance of WebEngineViewport</source>
<translation> WebEngineViewport </translation>
</message>
</context>
<context>
<name>UIDelegatesManager</name>
<message>
<source>Enter username and password for &quot;%1&quot; at %2://%3</source>
<translation> %2://%3 的“%1”输入用户名和密码</translation>
</message>
<message>
<source>Connect to proxy &quot;%1&quot; using:</source>
<translation>使%1</translation>
</message>
</context>
<context>
<name>QtWebEngineTestSupportPlugin</name>
<message>
<source>Cannot create a separate instance of WebEngineErrorPage</source>
<translation> WebEngineErrorPage </translation>
</message>
</context>
</TS>

View File

@@ -0,0 +1,85 @@
#include "DataCollectorAndUploader.h"
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QStandardPaths>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QSettings>
#include <QProcess>
#include <QDebug>
DataCollectorAndUploader::DataCollectorAndUploader(QObject *parent) : QObject(parent)
{
}
void DataCollectorAndUploader::collectAndUploadData()
{
collectData();
}
void DataCollectorAndUploader::collectData()
{
QString distributor_id;
QString release;
QString architecture;
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
QString version = config.value("build/version").toString();
QString uuid = config.value("info/uuid").toString();
// Execute lsb_release --all and capture the output
QProcess lsbProcess;
lsbProcess.start("lsb_release", QStringList() << "--all");
lsbProcess.waitForFinished();
QString lsbOutput = lsbProcess.readAllStandardOutput();
QStringList lines = lsbOutput.split('\n');
for (const QString &line : lines) {
if (line.contains("Distributor ID:")) {
distributor_id = line.split(":").last().trimmed();
} else if (line.contains("Release:")) {
release = line.split(":").last().trimmed();
}
}
// Execute uname -m to get the architecture
QProcess unameProcess;
unameProcess.start("uname", QStringList() << "-m");
unameProcess.waitForFinished();
architecture = unameProcess.readAllStandardOutput().trimmed();
// Create a JSON object
QJsonObject json;
json.insert("Distributor ID", distributor_id);
json.insert("Release", release);
json.insert("Architecture", architecture);
json.insert("Store_Version", version);
json.insert("UUID", uuid);
// // Convert to byte array
// QJsonDocument doc(json);
// QByteArray jsonData = doc.toJson();
// // Initialize a network request
// QNetworkAccessManager *manager = new QNetworkAccessManager(this);
// QUrl url("https://status.deepinos.org.cn/upload");
// QNetworkRequest request(url);
// request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
// // Send the POST request
// QNetworkReply *reply = manager->post(request, jsonData);
// connect(reply, &QNetworkReply::finished, [=]() {
// if (reply->error() == QNetworkReply::NoError) {
// emit uploadSuccessful();
// } else {
// emit uploadFailed(reply->errorString());
// }
// reply->deleteLater();
// });
}

View File

@@ -0,0 +1,21 @@
#ifndef DATACOLLECTORANDUPLOADER_H
#define DATACOLLECTORANDUPLOADER_H
#include <QObject>
class DataCollectorAndUploader : public QObject
{
Q_OBJECT
public:
explicit DataCollectorAndUploader(QObject *parent = nullptr);
void collectAndUploadData();
signals:
void uploadSuccessful();
void uploadFailed(QString errorString);
private:
void collectData();
};
#endif // DATACOLLECTORANDUPLOADER_H

147
src/backend/ThemeChecker.cpp Executable file
View File

@@ -0,0 +1,147 @@
#include "ThemeChecker.h"
#include <QDBusConnection>
#include <QDebug>
Q_GLOBAL_STATIC(ThemeChecker, m_instance)
constexpr char kFreedesktopPortalServiceName[] = "org.freedesktop.portal.Desktop";
constexpr char kFreedesktopPortalServicePath[] = "/org/freedesktop/portal/desktop";
constexpr char kFreedesktopPortalSettingsInterface[] = "org.freedesktop.portal.Settings";
ThemeChecker::ThemeChecker(QObject *parent)
: QObject(parent)
, m_paletteType(Dtk::Gui::DGuiApplicationHelper::instance()->paletteType())
{
m_interface = new QDBusInterface(kFreedesktopPortalServiceName,
kFreedesktopPortalServicePath,
kFreedesktopPortalSettingsInterface,
QDBusConnection::sessionBus(),
this);
initThemeType();
initConnections();
}
ThemeChecker *ThemeChecker::instance()
{
return m_instance;
}
bool ThemeChecker::useDarkTheme()
{
if (m_paletteType == Dtk::Gui::DGuiApplicationHelper::ColorType::UnknownType) {
return m_themeType == Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType;
} else {
return m_paletteType == Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType;
}
}
void ThemeChecker::initThemeType()
{
QVariantList args { "org.freedesktop.appearance", "color-scheme" };
QDBusMessage msg = m_interface->callWithArgumentList(QDBus::Block, "Read", args);
if (msg.type() != QDBusMessage::MessageType::ReplyMessage || msg.arguments().size() < 1) {
qWarning().noquote() << "Init color-scheme from D-Bus failed:" << msg.errorName() << msg.errorMessage();
m_themeType = Dtk::Gui::DGuiApplicationHelper::toColorType(Dtk::Gui::DGuiApplicationHelper::fetchPalette(Dtk::Gui::DGuiApplicationHelper::instance()->applicationTheme()));
return;
}
quint32 colorScheme = qvariant_cast<QDBusVariant>(qvariant_cast<QDBusVariant>(msg.arguments().first()).variant()).variant().toUInt();
switch (colorScheme) {
case 1:
m_themeType = Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType;
break;
case 2:
m_themeType = Dtk::Gui::DGuiApplicationHelper::ColorType::LightType;
break;
default:
qInfo().noquote() << QString("color-scheme: %1, fetching themeType according to QPalette::Window").arg(colorScheme);
m_themeType = Dtk::Gui::DGuiApplicationHelper::toColorType(Dtk::Gui::DGuiApplicationHelper::fetchPalette(Dtk::Gui::DGuiApplicationHelper::instance()->applicationTheme()));
break;
}
if (m_paletteType == Dtk::Gui::DGuiApplicationHelper::ColorType::UnknownType) {
Dtk::Gui::DGuiApplicationHelper::instance()->setApplicationPalette(Dtk::Gui::DGuiApplicationHelper::standardPalette(m_themeType));
}
}
void ThemeChecker::initConnections()
{
QDBusConnection::sessionBus().connect(kFreedesktopPortalServiceName,
kFreedesktopPortalServicePath,
kFreedesktopPortalSettingsInterface,
"SettingChanged",
this,
SLOT(slotSettingChanged(const QString &, const QString &, const QDBusVariant &)));
connect(Dtk::Gui::DGuiApplicationHelper::instance()->applicationTheme(), &Dtk::Gui::DPlatformTheme::themeNameChanged, this, &ThemeChecker::slotThemeNameChanged);
connect(Dtk::Gui::DGuiApplicationHelper::instance(), &Dtk::Gui::DGuiApplicationHelper::paletteTypeChanged, this, &ThemeChecker::slotPaletteTypeChanged);
}
void ThemeChecker::slotSettingChanged(const QString &_namespace, const QString &key, const QDBusVariant &variant)
{
if (_namespace != "org.freedesktop.appearance" || key != "color-scheme") {
return;
}
Dtk::Gui::DGuiApplicationHelper::ColorType colorType = Dtk::Gui::DGuiApplicationHelper::ColorType::UnknownType;
quint32 colorScheme = variant.variant().toUInt();
switch (colorScheme) {
case 1:
colorType = Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType;
break;
case 2:
colorType = Dtk::Gui::DGuiApplicationHelper::ColorType::LightType;
break;
default:
qInfo().noquote() << QString("color-scheme: %1, fetching themeType according to QPalette::Window").arg(colorScheme);
colorType = Dtk::Gui::DGuiApplicationHelper::toColorType(Dtk::Gui::DGuiApplicationHelper::fetchPalette(Dtk::Gui::DGuiApplicationHelper::instance()->applicationTheme()));
break;
}
if (m_paletteType != Dtk::Gui::DGuiApplicationHelper::ColorType::UnknownType) {
m_themeType = colorType;
return;
}
if (m_themeType != colorType) {
Dtk::Gui::DGuiApplicationHelper::instance()->setApplicationPalette(Dtk::Gui::DGuiApplicationHelper::standardPalette(colorType));
emit themeChanged(colorType == Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType);
m_themeType = colorType;
}
}
void ThemeChecker::slotThemeNameChanged(const QByteArray &theme)
{
Dtk::Gui::DGuiApplicationHelper::ColorType themeType = Dtk::Gui::DGuiApplicationHelper::ColorType::LightType;
if (theme.endsWith("dark")) {
themeType = Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType;
}
if (m_paletteType != Dtk::Gui::DGuiApplicationHelper::ColorType::UnknownType) {
m_themeType = themeType;
return;
}
if (m_themeType != themeType) {
Dtk::Gui::DGuiApplicationHelper::instance()->setApplicationPalette(Dtk::Gui::DGuiApplicationHelper::standardPalette(themeType));
emit themeChanged(themeType == Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType);
m_themeType = themeType;
}
}
void ThemeChecker::slotPaletteTypeChanged(Dtk::Gui::DGuiApplicationHelper::ColorType paletteType)
{
m_paletteType = paletteType;
if (m_paletteType != Dtk::Gui::DGuiApplicationHelper::ColorType::UnknownType) {
Dtk::Gui::DGuiApplicationHelper::instance()->setApplicationPalette(Dtk::Gui::DGuiApplicationHelper::standardPalette(m_paletteType));
emit themeChanged(m_paletteType == Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType);
return;
}
Dtk::Gui::DGuiApplicationHelper::instance()->setApplicationPalette(Dtk::Gui::DGuiApplicationHelper::standardPalette(m_themeType));
emit themeChanged(m_themeType == Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType);
}

40
src/backend/ThemeChecker.h Executable file
View File

@@ -0,0 +1,40 @@
#ifndef THEMECHECKER_H
#define THEMECHECKER_H
#include <QObject>
#include <QDBusVariant>
#include <QDBusInterface>
#include <DPlatformTheme>
#include <DGuiApplicationHelper>
class ThemeChecker : public QObject
{
Q_OBJECT
public:
explicit ThemeChecker(QObject *parent = nullptr);
static ThemeChecker *instance();
bool useDarkTheme();
private:
void initThemeType();
void initConnections();
signals:
void themeChanged(bool isDark);
private slots:
void slotSettingChanged(const QString &_namespace, const QString &key, const QDBusVariant &variant);
void slotThemeNameChanged(const QByteArray &theme);
void slotPaletteTypeChanged(Dtk::Gui::DGuiApplicationHelper::ColorType paletteType);
private:
QDBusInterface *m_interface = nullptr;
Dtk::Gui::DGuiApplicationHelper::ColorType m_paletteType;
Dtk::Gui::DGuiApplicationHelper::ColorType m_themeType;
};
#endif // THEMECHECKER_H

View File

@@ -5,13 +5,16 @@
#include <QtConcurrent>
#include <QStandardPaths>
#define DEFAULTURL "127.0.0.1"
#define MAXWAITTIME 200000
DownloadController::DownloadController(QObject *parent)
{
Q_UNUSED(parent)
// 初始化默认域名
domains.clear();
domains.append("d.store.deepinos.org.cn");
domains.append(DEFAULTURL);
/*
domains = {
@@ -37,7 +40,8 @@ bool checkMeatlink(QString metaUrl)
{
metaStatus.remove();
}
system("curl -I -s --connect-timeout 5 " + metaUrl.toUtf8() + " -w %{http_code} |tail -n1 > /tmp/spark-store/metaStatus.txt");
QString cmd = QString("curl -I -s --connect-timeout 5 %1 -w %{http_code} |tail -n1 > /tmp/spark-store/metaStatus.txt").arg(metaUrl);
system(cmd.toUtf8().data());
if (metaStatus.open(QFile::ReadOnly) && QString(metaStatus.readAll()).toUtf8() == "200")
{
metaStatus.remove();
@@ -68,9 +72,13 @@ void gennerateDomain(QVector<QString> &domains)
}
if (domains.size() == 0)
{
domains.append("d.store.deepinos.org.cn");
domains.append(DEFAULTURL);
}
}
else
{
domains.append(DEFAULTURL);
}
}
/**
@@ -102,34 +110,38 @@ void DownloadController::startDownload(const QString &url)
// qDebug() << domains << domains.size();
}
QString aria2Command = "-d";
QString aria2Urls = "";
QString aria2Verbose = "--summary-interval=1";
QString aria2SizePerThreads = "--min-split-size=1M";
QString aria2NoConfig = "--no-conf";
QString aria2NoSeeds = "--seed-time=0";
QString aria2Command = "-d"; //下载目录
QString aria2Urls = ""; //下载地址
QString aria2Verbose = "--summary-interval=1"; //显示下载速度
QString aria2SizePerThreads = "--min-split-size=1M"; //最小分片大小
QString aria2NoConfig = "--no-conf"; //不使用配置文件
QString aria2NoSeeds = "--seed-time=0"; //不做种
QStringList command;
QString downloadDir = "/tmp/spark-store/";
QString aria2ConnectionPerServer = "--max-connection-per-server=1";
QString aria2ConnectionMax = "--max-concurrent-downloads=16";
QString aria2DNSCommand = "--async-dns-server=119.29.29.29,223.5.5.5";
QString downloadDir = "/tmp/spark-store/"; //下载目录
QString aria2ConnectionPerServer = "--max-connection-per-server=1"; //每个服务器最大连接数
QString aria2ConnectionMax = "--max-concurrent-downloads=16"; //最大同时下载数
QString aria2ConnectionTimeout = "--connect-timeout=5"; // 5 秒服务器连接超时
QString aria2MaxRetry = "--max-tries=1"; //设置最大重试次数
if (useMetalink)
if (useMetalink) //如果是metalink
{
command.append(metaUrl.toUtf8());
}
else
{
for (int i = 0; i < domains.size(); i++)
for (int i = 0; i < domains.size(); i++) //遍历域名
{
command.append(replaceDomain(url, domains.at(i)).replace("+","%2B").toUtf8()); //对+进行转译避免oss出错
}
}
qint64 downloadSizeRecord = 0;
QString speedInfo = "";
QString percentInfo = "";
qint64 downloadSizeRecord = 0; //下载大小记录
qint8 failDownloadTimes = 0; // 记录重试次数
const qint8 maxRetryTimes = 3; //最大重试次数
QString speedInfo = ""; //显示下载速度
QString percentInfo = ""; //显示下载进度
command.append(aria2Command.toUtf8());
command.append(downloadDir.toUtf8());
command.append(aria2Verbose.toUtf8());
@@ -137,7 +149,9 @@ void DownloadController::startDownload(const QString &url)
command.append(aria2SizePerThreads.toUtf8());
command.append(aria2ConnectionPerServer.toUtf8());
command.append(aria2ConnectionMax.toUtf8());
command.append(aria2DNSCommand.toUtf8());
command.append(aria2ConnectionTimeout.toUtf8());
command.append(aria2MaxRetry.toUtf8());
if (useMetalink)
{
command.append(aria2NoSeeds.toUtf8());
@@ -152,11 +166,30 @@ void DownloadController::startDownload(const QString &url)
cmd.start();
cmd.waitForStarted(-1); //等待启动完成
// Timer
QTimer *timeoutTimer = new QTimer(this);
timeoutTimer->setSingleShot(true); // 单次触发
connect(timeoutTimer, &QTimer::timeout, [&]() {
if (failDownloadTimes < maxRetryTimes) {
qDebug() << "Download timeout, restarting...";
// 重新启动下载任务的代码
restartDownload(cmd, command); // 调用重新启动下载任务的函数
failDownloadTimes += 1;
timeoutTimer->start(MAXWAITTIME); // 重新启动定时器
} else{
emit errorOccur(tr("Download Failed, please retry :(")); // 下载失败
downloadSuccess = false;
cmd.close();
cmd.terminate(); // 终止当前的下载进程
cmd.waitForFinished(); // 等待进程结束
}
});
connect(&cmd, &QProcess::readyReadStandardOutput, [&]()
{
timeoutTimer->start(MAXWAITTIME); // 重置超时计时器15秒超时
//通过读取输出计算下载速度
QString message = cmd.readAllStandardOutput().data();
// qDebug() << message;
message = message.replace(" ", "");
QStringList list;
qint64 downloadSize = 0;
@@ -179,10 +212,10 @@ void DownloadController::startDownload(const QString &url)
speedInfo = message.mid(speedPlace1 + 3, speedPlace2 - speedPlace1 - 3);
speedInfo += "/s";
}
// qDebug() << percentInfo << speedInfo;
if (downloadSize >= downloadSizeRecord)
{
downloadSizeRecord = downloadSize;
timeoutTimer->stop(); // 如果有进度,停止超时计时器
}
if (percentInfo == "OK")
{
@@ -244,6 +277,15 @@ void DownloadController::stopDownload()
pidNumber = -1;
}
void DownloadController::restartDownload(QProcess &cmd, const QStringList &command)
{
cmd.terminate(); // 终止当前的下载进程
cmd.waitForFinished(); // 等待进程结束
cmd.setArguments(command); // 重新设置参数
cmd.start(); // 重新启动下载
cmd.waitForStarted(-1); // 等待启动完成
}
qint64 DownloadController::getFileSize(const QString &url)
{
// 已经无需使用 qtnetwork 再获取 filesize完全交给 aria2 来计算进度。 为保证兼容性,故保留此函数。

View File

@@ -3,6 +3,7 @@
#include <QObject>
#include <QVector>
#include <QProcess>
class DownloadController : public QObject
{
@@ -14,6 +15,7 @@ public:
void setFilename(QString filename);
void startDownload(const QString &url);
void stopDownload();
void restartDownload(QProcess &cmd, const QStringList &command);
qint64 getFileSize(const QString& url);
QString replaceDomain(const QString& url, const QString domain);

View File

@@ -10,6 +10,8 @@ QString SparkAPI::serverUrl = "";
#elif __aarch64__
QString SparkAPI::serverUrlDir = "aarch64-store";
#elif __loongarch__
QString SparkAPI::serverUrlDir = "loong64-store";
#endif
SparkAPI::SparkAPI(QObject *parent) : QObject(parent)

View File

@@ -2,6 +2,15 @@
#include "mainwindow-dtk.h"
#include "utils/utils.h"
#include <signal.h>
#include <execinfo.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fstream>
#include <execinfo.h>
#include <DSysInfo>
#include <DApplicationSettings>
#include <DWidgetUtil>
@@ -13,15 +22,101 @@
#include <QStandardPaths>
#include <QSurfaceFormat>
#include <backend/DataCollectorAndUploader.h>
DCORE_USE_NAMESPACE
DWIDGET_USE_NAMESPACE
static QString buildDateTime;
void gatherInfo(FILE *fp, std::ofstream& logFile, const char* description) {
if (fp) {
char buffer[512];
logFile << description << ":\n";
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
buffer[strcspn(buffer, "\n")] = 0;
logFile << buffer << "\n";
}
pclose(fp);
} else {
logFile << "Failed to gather " << description << " info.\n";
}
}
void crashHandler(int sig) {
void *array[50];
size_t size = backtrace(array, 50);
if (size == 0) {
perror("backtrace");
exit(1);
}
time_t t = time(NULL);
struct tm tm = *localtime(&t);
char filename[128];
snprintf(filename, sizeof(filename), "/tmp/spark_store_crash_log_%04d%02d%02d_%02d%02d%02d.txt",
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
std::ofstream logFile(filename, std::ios::out);
if (!logFile.is_open()) {
perror("ofstream");
exit(1);
}
logFile << "Please send this log to the developer. QQ Group: 872690351\n";
logFile << "Gitee: https://gitee.com/spark-store-project/spark-store/issues\n";
logFile << "Gihub: https://github.com/spark-store-project/spark-store/issues\n";
logFile << "Build Date and Time: " << buildDateTime.toStdString() << "\n";
gatherInfo(popen("cat ~/.config/spark-union/spark-store/config.ini", "r"), logFile, "User Config File");
// Collecting System Information
gatherInfo(popen("LANG=en_US.UTF-8 uname -m", "r"), logFile, "CPU Architecture");
gatherInfo(popen("LANG=en_US.UTF-8 lsb_release -a", "r"), logFile, "Distribution info");
gatherInfo(popen("LANG=en_US.UTF-8 lscpu", "r"), logFile, "All CPU Info");
gatherInfo(popen("LANG=en_US.UTF-8 free -h | grep Mem | awk '{print $2}'", "r"), logFile, "Memory Size");
logFile << "Error: signal " << sig << ":\n";
for (size_t i = 0; i < size; i++) {
char **strings = backtrace_symbols(&array[i], 1);
if (strings != NULL && strings[0] != NULL) {
logFile << strings[0] << "\n";
} else {
logFile << "Failed to get symbol.\n";
}
free(strings);
}
logFile.close();
char openCmd[256];
snprintf(openCmd, sizeof(openCmd), "xdg-open %s", filename);
if (system(openCmd) == -1) {
perror("system");
}
fprintf(stderr, "Error: signal %d:\n", sig);
backtrace_symbols_fd(array, size, STDERR_FILENO);
exit(1);
}
int main(int argc, char *argv[])
{
// 崩溃处理
signal(SIGSEGV, crashHandler); // 注册SIGSEGV处理函数
// Get build time
static const QDate buildDate = QLocale(QLocale::English).toDate(QString(__DATE__).replace(" ", " 0"), "MMM dd yyyy");
static const QTime buildTime = QTime::fromString(__TIME__, "hh:mm:ss");
static const QString buildDateTime = buildDate.toString("yyyy.MM.dd") + "-" + buildTime.toString("hh:mm:ss");
buildDateTime = buildDate.toString("yyyy.MM.dd") + "-" + buildTime.toString("hh:mm:ss");
// NOTE: 提前设置组织名称和应用名称,避免配置文件位置错误
DApplication::setOrganizationName("spark-union");
@@ -31,84 +126,47 @@ int main(int argc, char *argv[])
// 初始化 config.ini 配置文件
Utils::initConfig();
// 回传版本信息,不涉及个人隐私
DataCollectorAndUploader uploader;
QObject::connect(&uploader, &DataCollectorAndUploader::uploadSuccessful, [](){
qDebug() << "Data uploaded successfully";
});
QObject::connect(&uploader, &DataCollectorAndUploader::uploadFailed, [](QString error){
qDebug() << "Upload failed with error: " << error;
});
uploader.collectAndUploadData();
// Set display backend
Utils::setQPAPlatform();
// 龙芯机器配置,使得 DApplication 能正确加载 QTWEBENGINE
// 龙芯机器配置,使得 DApplication 能正确加载 QtWebEngine
qputenv("DTK_FORCE_RASTER_WIDGETS", "FALSE");
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-features=UseModernMediaControls");
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-web-security");
// 浏览器开启 GPU 支持
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-features=UseModernMediaControls");
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-web-security");
#ifdef __sw_64__
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--no-sandbox");
#elif __aarch64__
if (!Utils::isWayland()) {
QString env = QString::fromUtf8(qgetenv("QTWEBENGINE_CHROMIUM_FLAGS"));
env = env.trimmed();
/**
* NOTE: 参考帮助手册代码对于部分ARM CPU 设备,
* --disable-gpu 保证 X11 环境下网页正常显示
* --single-process 避免 X11 环境下 QtWebEngine 崩溃(可选)
*/
env += " --disable-gpu";
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", env.trimmed().toUtf8());
QSurfaceFormat format;
format.setRenderableType(QSurfaceFormat::OpenGLES);
QSurfaceFormat::setDefaultFormat(format);
/**
* NOTE: https://zhuanlan.zhihu.com/p/550285855
* 避免 X11 环境下从 QtWebEngine 后退回到 QWidget 时黑屏闪烁
*/
qputenv("QMLSCENE_DEVICE", "softwarecontext");
DApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
}
#endif
/**
* FIXME: 对于麒麟 CPU 设备,调用 QtWebEngine 会导致客户端崩溃;
* 暂时不对 CPU 进行判断,对 wayland 环境下统一处理
* NOTE: https://zhuanlan.zhihu.com/p/550285855
* 避免 wayland 环境下从 QtWebEngine 后退回到 QWidget 时黑屏闪烁
*/
if (Utils::isWayland()) {
QString env = QString::fromUtf8(qgetenv("QTWEBENGINE_CHROMIUM_FLAGS"));
env = env.trimmed();
/**
* NOTE: 参考帮助手册代码,对于麒麟 CPU 设备,
* --disable-gpu 保证 wayland 环境下网页正常显示
* --single-process 避免 wayland 环境下 QtWebEngine 崩溃(可选)
*/
env += " --disable-gpu";
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", env.trimmed().toUtf8());
/**
* NOTE: 参考帮助手册代码,对于麒麟 CPU 设备,
* 避免 wayland 环境下 QtWebEngine 崩溃
*/
qputenv("QT_WAYLAND_SHELL_INTEGRATION", "kwayland-shell");
QSurfaceFormat format;
format.setRenderableType(QSurfaceFormat::OpenGLES);
QSurfaceFormat::setDefaultFormat(format);
/**
* NOTE: https://zhuanlan.zhihu.com/p/550285855
* 避免 wayland 环境下从 QtWebEngine 后退回到 QWidget 时黑屏闪烁
*/
qputenv("QMLSCENE_DEVICE", "softwarecontext");
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);
}
// 开启 Hidpi 支持
qDebug() << "Enable HiDPI Support.";
DApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
DApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
#endif
// 强制使用 DTK 平台插件

115
src/mainwindow-dtk.cpp Normal file → Executable file
View File

@@ -16,6 +16,8 @@
#include <QtConcurrent>
#include <unistd.h>
#include <backend/ThemeChecker.h>
#define AppPageApplist 0
#define AppPageSearchlist 1
#define AppPageAppdetail 2
@@ -23,7 +25,7 @@
#define WaylandSearchCenter 1
#define OtherSearchCenter 2
#define RightSearchSpace 1
#define UploadServerUrl "https://upload.deepinos.org/"
#define UploadServerUrl "https://upload.deepinos.org.cn/"
MainWindow::MainWindow(QWidget *parent)
: BaseWidgetOpacity(parent)
@@ -39,8 +41,6 @@ MainWindow::MainWindow(QWidget *parent)
initTmpDir();
ui->appintopage->setDownloadWidget(downloadlistwidget);
emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
}
MainWindow::~MainWindow()
@@ -133,13 +133,14 @@ void MainWindow::initUI()
updateUi(0);
initTrayIcon();
refreshTheme(ThemeChecker::instance()->useDarkTheme());
}
void MainWindow::initTitleBar()
{
ui->titlebar->setIcon(QIcon::fromTheme("spark-store"));
ui->titlebar->setBackgroundTransparent(true);
// ui->titlebar->setSwitchThemeMenuVisible(false); // 去除 dtk 标题栏主题切换菜单
// 初始化标题栏控件
DLabel *title = new DLabel(ui->titlebar);
@@ -149,6 +150,8 @@ void MainWindow::initTitleBar()
searchEdit = new DSearchEdit(ui->titlebar);
searchEdit->setPlaceholderText(tr("Search or enter spk://"));
searchEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
searchEdit->lineEdit()->setFixedWidth(350);
downloadButton = new ProgressButton(ui->titlebar);
downloadButton->setDownloadListWidget(downloadlistwidget);
@@ -191,8 +194,8 @@ void MainWindow::initTitleBarMenu()
QMenu *menu = new QMenu(ui->titlebar);
menu->addAction(setting);
menu->addAction(upgrade);
menu->addAction(actionSubmission);
menu->addAction(actionSubmissionWithClient);
//menu->addAction(actionSubmission);
//menu->addAction(actionSubmissionWithClient);
ui->titlebar->setMenu(menu);
@@ -267,57 +270,61 @@ void MainWindow::initTrayIcon()
trayIcon->show();
}
void MainWindow::refreshTheme(bool isDarkMode)
{
// 使用isDarkMode变量来判断是否是深色模式
if (isDarkMode) {
//深色模式
setMaskColor(QColor("#2a2b2b"));
backButton->setIcon(QIcon(":/icon/dark/back.svg"));
downloadButton->setIcon(":/icon/dark/download.svg");
downloadButton->setBackgroundColor(QColor("#444444"));
downloadButton->setColor(QColor("#66CCFF"));
ui->pushButton_14->setIcon(QIcon(":/icon/dark/update.svg"));
for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) {
ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/dark/leftbutton_" + QString::number(i) + ".svg"));
if (QLocale::system().name() == "zh_CN") {
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\
QPushButton:hover{background-color:#7a7a7a;border:0px;border-radius:8px;}\
QPushButton:checked{background-color:#6e6e6e;border:0px;border-radius:8px;}");
} else {
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;text-align: left; padding-left: 15px;}\
QPushButton:hover{background-color:#7a7a7a;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\
QPushButton:checked{background-color:#6e6e6e;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}");
}
}
} else {
//亮色模式
setMaskColor(QColor("#f3f7f8"));
backButton->setIcon(QIcon(":/icon/light/back.svg"));
downloadButton->setBackgroundColor(QColor("#e3e4e4"));
downloadButton->setColor(QColor("#66CCFF"));
downloadButton->setIcon(":/icon/light/download.svg");
ui->pushButton_14->setIcon(QIcon(":/icon/light/update.svg"));
for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) {
ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/light/leftbutton_" + QString::number(i) + ".svg"));
if (QLocale::system().name() == "zh_CN") {
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\
QPushButton:hover{background-color:#eAeAeA;border:0px;border-radius:8px;}\
QPushButton:checked{background-color:#dddddd;border:0px;border-radius:8px;}");
} else {
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;text-align: left; padding-left: 15px;}\
QPushButton:hover{background-color:#eAeAeA;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\
QPushButton:checked{background-color:#dddddd;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}");
}
}
}
ui->pushButton_14->setStyleSheet(ui->pushButton_4->styleSheet());
ui->applistpage->setTheme(isDarkMode);
ui->applistpage_1->setTheme(isDarkMode);
ui->appintopage->setTheme(isDarkMode);
ui->settingspage->setTheme(isDarkMode);
}
void MainWindow::initConnections()
{
// 主题切换
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType)
{
if (themeType == DGuiApplicationHelper::DarkType) {
//深色模式
setMaskColor(QColor("#2a2b2b"));
backButton->setIcon(QIcon(":/icon/dark/back.svg"));
downloadButton->setIcon(":/icon/dark/download.svg");
downloadButton->setBackgroundColor(QColor("#444444"));
downloadButton->setColor(QColor("#66CCFF"));
ui->pushButton_14->setIcon(QIcon(":/icon/dark/update.svg"));
for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) {
ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/dark/leftbutton_" + QString::number(i) + ".svg"));
if (QLocale::system().name() == "zh_CN") {
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\
QPushButton:hover{background-color:#7a7a7a;border:0px;border-radius:8px;}\
QPushButton:checked{background-color:#6e6e6e;border:0px;border-radius:8px;}");
} else {
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;text-align: left; padding-left: 15px;}\
QPushButton:hover{background-color:#7a7a7a;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\
QPushButton:checked{background-color:#6e6e6e;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}");
}
}
} else {
//亮色模式
setMaskColor(QColor("#f3f7f8"));
backButton->setIcon(QIcon(":/icon/light/back.svg"));
downloadButton->setBackgroundColor(QColor("#e3e4e4"));
downloadButton->setColor(QColor("#66CCFF"));
downloadButton->setIcon(":/icon/light/download.svg");
ui->pushButton_14->setIcon(QIcon(":/icon/light/update.svg"));
for (int i = 0; i < ui->buttonGroup->buttons().size(); i++) {
ui->buttonGroup->buttons()[i]->setIcon(QIcon(":/icon/light/leftbutton_" + QString::number(i) + ".svg"));
if (QLocale::system().name() == "zh_CN") {
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;}\
QPushButton:hover{background-color:#eAeAeA;border:0px;border-radius:8px;}\
QPushButton:checked{background-color:#dddddd;border:0px;border-radius:8px;}");
} else {
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{background-color:transparent;text-align: left; padding-left: 15px;}\
QPushButton:hover{background-color:#eAeAeA;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}\
QPushButton:checked{background-color:#dddddd;border:0px;border-radius:8px;text-align: left; padding-left: 15px;}");
}
}
}
ui->pushButton_14->setStyleSheet(ui->pushButton_4->styleSheet());
ui->applistpage->setTheme(themeType == DGuiApplicationHelper::DarkType);
ui->applistpage_1->setTheme(themeType == DGuiApplicationHelper::DarkType);
ui->appintopage->setTheme(themeType == DGuiApplicationHelper::DarkType);
ui->settingspage->setTheme(themeType == DGuiApplicationHelper::DarkType); });
connect(ThemeChecker::instance(), &ThemeChecker::themeChanged, this, &MainWindow::refreshTheme);
// appintopage按下下载按钮时标题栏下载列表按钮抖动
connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]()

1
src/mainwindow-dtk.h Normal file → Executable file
View File

@@ -30,6 +30,7 @@ public:
void openUrl(const QString &url);
bool isCloseWindowAnimation();
Q_INVOKABLE void refreshTheme(bool isDarkMode);
protected:
void closeEvent(QCloseEvent *event) override;

View File

@@ -13,6 +13,7 @@
#include <QFile>
#include <DSysInfo>
#include <QAtomicInt>
AppIntoPage::AppIntoPage(QWidget *parent)
: QWidget(parent)
@@ -21,6 +22,7 @@ AppIntoPage::AppIntoPage(QWidget *parent)
{
initUI();
initConnections();
m_userAgent = QString("Mozilla/5.0 Spark-Store/" + QString(APP_VERSION) + " (Linux; " + QSysInfo::prettyProductName().toUtf8() + ";)").toLatin1();
}
AppIntoPage::~AppIntoPage()
@@ -53,29 +55,38 @@ void AppIntoPage::openUrl(const QUrl &url)
ui->label_2->setText(info["More"].toString());
// 显示 tags
QStringList taglist = info["Tags"].toString().split(";", QString::SkipEmptyParts);
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
QStringList taglist = info["Tags"].toString().split(";", Qt::SkipEmptyParts);
#else
QStringList taglist = info["Tags"].toString().split(";", QString::SkipEmptyParts);
#endif
setAppinfoTags(taglist);
// 获取图标
QNetworkRequest request;
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
// 获取图标和截图
QString pkgUrlBase = api->getImgServerUrl() + SparkAPI::getArchDir() + url.path();
qDebug() << "Icon URL: " << pkgUrlBase + "/icon.png";
request.setUrl(QUrl(pkgUrlBase + "/icon.png"));
request.setRawHeader("User-Agent", "Mozilla/5.0");
request.setRawHeader("Content-Type", "charset='utf-8'");
manager->get(request);
QObject::connect(manager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply)
{
QByteArray jpegData = reply->readAll();
iconpixmap.loadFromData(jpegData);
iconpixmap.scaled(210, 200, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
ui->icon->setPixmap(iconpixmap);
ui->icon->setScaledContents(true);
// 创建网络请求管理器
QNetworkAccessManager *iconManager = new QNetworkAccessManager(this);
manager->deleteLater(); });
// 获取图标
QNetworkRequest iconRequest;
iconRequest.setUrl(QUrl(pkgUrlBase + "/icon.png"));
iconRequest.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent);
iconRequest.setHeader(QNetworkRequest::ContentTypeHeader, "charset='utf-8'");
iconManager->get(iconRequest);
QObject::connect(iconManager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply)
{
QByteArray jpegData = reply->readAll();
iconpixmap.loadFromData(jpegData);
iconpixmap = iconpixmap.scaled(210, 200, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
ui->icon->setPixmap(iconpixmap);
ui->icon->setScaledContents(true);
iconManager->deleteLater();
reply->deleteLater();
});
// 获取截图
for (int i = 0; i < 5 /* 魔法数字,最多五个截图 */; i++)
{
@@ -83,8 +94,8 @@ void AppIntoPage::openUrl(const QUrl &url)
QNetworkRequest request;
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
request.setUrl(QUrl(imgUrl));
request.setRawHeader("User-Agent", "Mozilla/5.0");
request.setRawHeader("Content-Type", "charset='utf-8'");
request.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent);
request.setHeader(QNetworkRequest::ContentTypeHeader, "charset='utf-8'");
manager->get(request);
QObject::connect(manager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply)
{
@@ -98,15 +109,16 @@ void AppIntoPage::openUrl(const QUrl &url)
// img->setScaledContents(true);
QListWidgetItem *pItem = new QListWidgetItem();
pItem->setSizeHint(QSize(280, 200));
ui->listWidget->addItem(pItem);
ui->listWidget->insertItem(i, pItem);
ui->listWidget->setItemWidget(pItem, img);
qDebug() << imgUrl;
}
manager->deleteLater();
manager->deleteLater();
});
}
// Check UOS
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
if (config.contains("UOS/EnableDeveloperMode") && !config.value("UOS/EnableDeveloperMode").toBool()){
@@ -121,24 +133,28 @@ void AppIntoPage::openUrl(const QUrl &url)
bool isInstalled;
bool isUpdated;
QString packagename = info["Pkgname"].toString();
isInstall.start("dpkg", QStringList() << "-s" << info["Pkgname"].toString());
isInstall.start("host-spawn", QStringList() << "/opt/durapps/spark-store/bin/store-helper/check-is-installed" << info["Pkgname"].toString());
qDebug() << info["Pkgname"].toString();
isInstall.waitForFinished(180 * 1000); // 默认超时 3 分钟
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
if (error == 0)
int exitCode = isInstall.exitCode();
QProcess::ExitStatus exitStatus = isInstall.exitStatus();
isInstall.close();
if (exitCode == 0 && exitStatus == QProcess::NormalExit)
{
isInstalled = true;
QProcess isUpdate;
isUpdate.start("dpkg-query", QStringList() << "--showformat='${Version}'"
isUpdate.start("host-spawn", QStringList() << "dpkg-query" << "--showformat='${Version}'"
<< "--show" << info["Pkgname"].toString());
isUpdate.waitForFinished(180 * 1000); // 默认超时 3 分钟
QString localVersion = isUpdate.readAllStandardOutput();
localVersion.replace("'", "");
isUpdate.start("dpkg", QStringList() << "--compare-versions" << localVersion << "ge" << info["Version"].toString());
isUpdate.start("host-spawn", QStringList() << "dpkg" << "--compare-versions" << localVersion << "ge" << info["Version"].toString());
isUpdate.waitForFinished(180 * 1000); // 默认超时 3 分钟
if (!isUpdate.exitCode())
if (isUpdate.exitCode() == 0 && isUpdate.exitStatus() == QProcess::NormalExit)
{
isUpdated = true;
}
@@ -146,6 +162,7 @@ void AppIntoPage::openUrl(const QUrl &url)
{
isUpdated = false;
}
isUpdate.close();
}
else
{
@@ -172,7 +189,7 @@ void AppIntoPage::openUrl(const QUrl &url)
}
else
{
ui->downloadButton->setText(tr("Download"));
ui->downloadButton->setText(tr("Download and Install"));
ui->downloadButton->setEnabled(true);
ui->downloadButton->show();
}
@@ -310,7 +327,7 @@ void AppIntoPage::isDownloading(const QUrl &url)
if (item->download == 2)
{
ui->downloadButton->setEnabled(true);
ui->downloadButton->setText(tr("Download"));
ui->downloadButton->setText(tr("Download and Install"));
}
if (item->download == 1)
{
@@ -325,10 +342,27 @@ void AppIntoPage::isDownloading(const QUrl &url)
}
if (item->download == 3)
{
ui->downloadButton->setEnabled(true);
ui->downloadButton->setText(tr("Reinstall"));
ui->downloadButton->show();
ui->pushButton_3->show();
QString packageName = info["Pkgname"].toString();
QProcess process;
process.start("/opt/durapps/spark-store/bin/store-helper/check-is-installed", {packageName});
process.waitForFinished(-1);
int exitCode = process.exitCode();
QProcess::ExitStatus exitStatus = process.exitStatus();
process.close();
if (exitCode == 0 && exitStatus == QProcess::NormalExit)
{
ui->downloadButton->setEnabled(true);
ui->downloadButton->setText(tr("Reinstall"));
ui->downloadButton->show();
ui->pushButton_3->show();
}
else
{
ui->downloadButton->setEnabled(true);
ui->downloadButton->setText(tr("Download and Install"));
}
}
}
@@ -376,7 +410,7 @@ void AppIntoPage::setAppinfoTags(const QStringList &tagList)
ui->tag_a2d->show();
}
}
notifyUserUnsupportedTags(ubuntuSupport, deepinSupport, uosSupport);
//notifyUserUnsupportedTags(ubuntuSupport, deepinSupport, uosSupport);
}
void AppIntoPage::notifyUserUnsupportedTags(bool ubuntuSupport, bool deepinSupport, bool uosSupport)
@@ -471,24 +505,26 @@ void AppIntoPage::on_pushButton_3_clicked()
ui->pushButton_3->setEnabled(false);
QProcess uninstall;
uninstall.start("pkexec", QStringList() << "apt" << "autopurge" << "-y" << info["Pkgname"].toString().toLower());
uninstall.start("host-spawn", QStringList() << "pkexec" << "apt" << "autopurge" << "-y" << info["Pkgname"].toString().toLower());
uninstall.waitForFinished(-1);
uninstall.close();
QProcess check;
check.start("dpkg", QStringList() << "-s" << info["Pkgname"].toString().toLower());
check.waitForFinished(10*1000);
check.start("host-spawn", QStringList() << "dpkg" << "-s" << info["Pkgname"].toString().toLower());
check.waitForFinished(-1);
if (check.readAllStandardOutput().isEmpty())
if (check.exitCode() != 0 || check.exitStatus() != QProcess::NormalExit)
{
ui->downloadButton->setText(tr("Download"));
ui->downloadButton->setText(tr("Download and Install"));
ui->pushButton_3->hide();
updatesEnabled();
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Uninstall succeeded"));
}
ui->downloadButton->setEnabled(true);
ui->pushButton_3->setEnabled(true);
check.close();
});
}
@@ -502,16 +538,8 @@ void AppIntoPage::on_shareButton_clicked()
void AppIntoPage::on_updateButton_clicked()
{
QString feedbackSpk = "spk://store/chat/store.spark-app.feedback";
QFileInfo actionSubmissionClientStatus("/opt/durapps/store.spark-app.feedback");
if (actionSubmissionClientStatus.exists() && actionSubmissionClientStatus.isDir())
{
qDebug() << "反馈器存在";
QProcess::startDetached("sh", QStringList() << "/opt/durapps/store.spark-app.feedback/launch.sh");
}
else
{
qDebug() << "反馈器不存在,跳转页面";
openUrl(feedbackSpk);
}
QProcess::startDetached("host-spawn", QStringList() << "zenity" << "--info" << "--text=请点击左侧的Spk分享链接以向您所在部门的IT反馈" << "--width=200");
}

View File

@@ -49,6 +49,8 @@ private:
QJsonObject info;
QPixmap iconpixmap;
QUrl spk;
QByteArray m_userAgent;
};
#endif // APPINTOPAGE_H

View File

@@ -241,7 +241,7 @@
</sizepolicy>
</property>
<property name="text">
<string>Download</string>
<string>Download and Install</string>
</property>
</widget>
</item>

View File

@@ -1,108 +1,105 @@
#include "applistpage.h"
#include "ui_applistpage.h"
AppListPage::AppListPage(QWidget *parent) : QWidget(parent),
ui(new Ui::AppListPage)
{
ui->setupUi(this);
ui->webEngineView->page()->setBackgroundColor(Qt::transparent);
}
void AppListPage::setTheme(bool dark)
{
isDark = dark;
if (dark)
{
this->setStyleSheet("#frame{background-color: #252525;border-radius:14px;border:1px solid rgb(64, 64, 64);}");
}
else
{
// 亮色模式
this->setStyleSheet("#frame{background-color: #ffffff;border-radius:14px;border:1px solid rgb(229,229,229);}");
}
if (isSearch)
{
getSearchList(nowType);
}
else
{
getAppList(nowType);
}
}
void AppListPage::getAppList(QString type)
{
isSearch = false;
nowType = type;
SparkAPI *api = new SparkAPI(this);
QString url;
QString theme;
if (isDark)
{
theme = "theme=dark";
}
else
{
theme = "theme=light";
}
if (type == "")
{
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/?" + theme + "&" + "arch=x86";
#ifdef __aarch64__
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/?" + theme + "&" + "arch=aarch64";
#endif
}
else
{
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/applist?type=" + type + "&" + theme + "&" + "arch=x86";
#ifdef __aarch64__
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/applist?type=" + type + "&" + theme + "&" + "arch=aarch64";
#endif
}
ui->webEngineView->setUrl(url);
delete api;
}
void AppListPage::getSearchList(const QString &keyword)
{
isSearch = true;
nowType = keyword;
SparkAPI *api = new SparkAPI(this);
QString url;
QString theme;
if (isDark)
{
theme = "theme=dark";
}
else
{
theme = "theme=light";
}
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/search?keywords=" + QUrl::toPercentEncoding(keyword) + "&" + theme + "&" + "arch=x86";
#ifdef __aarch64__
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/search?keywords=" + QUrl::toPercentEncoding(keyword) + "&" + theme + "&" + "arch=aarch64";
#endif
ui->webEngineView->setUrl(url);
delete api;
}
AppListPage::~AppListPage()
{
delete ui;
}
void AppListPage::on_webEngineView_urlChanged(const QUrl &arg1)
{
if (arg1.path().right(8) == "app.json")
{
QString url = arg1.toString();
url = url.mid(url.indexOf("/" + SparkAPI::getArchDir() + "/"));
url = "spk:/" + url;
url = url.mid(0, url.indexOf("/app.json"));
qDebug() << "程序跳转链接地址:" << url;
ui->webEngineView->back();
emit clicked(url);
}
}
#include "applistpage.h"
#include "ui_applistpage.h"
#define BUILD_URL(theme, arch) \
api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/" + (type.isEmpty() ? "?" : "applist?type=" + type + "&") + theme + "&arch=" + arch
AppListPage::AppListPage(QWidget *parent) : QWidget(parent),
ui(new Ui::AppListPage)
{
ui->setupUi(this);
ui->webEngineView->page()->setBackgroundColor(Qt::transparent);
}
void AppListPage::setTheme(bool dark)
{
isDark = dark;
if (dark)
{
this->setStyleSheet("#frame{background-color: #252525;border-radius:14px;border:1px solid rgb(64, 64, 64);}");
}
else
{
// 亮色模式
this->setStyleSheet("#frame{background-color: #ffffff;border-radius:14px;border:1px solid rgb(229,229,229);}");
}
if (isSearch)
{
getSearchList(nowType);
}
else
{
getAppList(nowType);
}
}
void AppListPage::getAppList(QString type)
{
isSearch = false;
nowType = type;
SparkAPI *api = new SparkAPI(this);
QString url;
QString theme;
if (isDark)
{
theme = "theme=dark";
}
else
{
theme = "theme=light";
}
#ifdef __aarch64__
url = BUILD_URL(theme, "aarch64");
#elif __loongarch__
url = BUILD_URL(theme, "loong64");
#else
url = BUILD_URL(theme, "x86");
#endif
ui->webEngineView->setUrl(url);
delete api;
}
void AppListPage::getSearchList(const QString &keyword)
{
isSearch = true;
nowType = keyword;
SparkAPI *api = new SparkAPI(this);
QString url;
QString theme;
if (isDark)
{
theme = "theme=dark";
}
else
{
theme = "theme=light";
}
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/search?keywords=" + QUrl::toPercentEncoding(keyword) + "&" + theme + "&" + "arch=x86";
#ifdef __aarch64__
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/search?keywords=" + QUrl::toPercentEncoding(keyword) + "&" + theme + "&" + "arch=aarch64";
#elif __loongarch__
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/search?keywords=" + QUrl::toPercentEncoding(keyword) + "&" + theme + "&" + "arch=loong64";
#endif
ui->webEngineView->setUrl(url);
delete api;
}
AppListPage::~AppListPage()
{
delete ui;
}
void AppListPage::on_webEngineView_urlChanged(const QUrl &arg1)
{
if (arg1.path().right(8) == "app.json")
{
QString url = arg1.toString();
url = url.mid(url.indexOf("/" + SparkAPI::getArchDir() + "/"));
url = "spk:/" + url;
url = url.mid(0, url.indexOf("/app.json"));
qDebug() << "程序跳转链接地址:" << url;
ui->webEngineView->back();
emit clicked(url);
}
}

View File

@@ -8,8 +8,8 @@
#include <QDebug>
#define TMP_PATH "/tmp/spark-store"
#define DEFAULT_SERVER_URL "https://cdn.d.store.deepinos.org.cn/"
#define DEFAULT_CHECK_DOMAIN "deepinos"
#define DEFAULT_SERVER_URL "http://127.0.0.1:8000/"
bool SettingsPage::needUncompatibleNotification = true;
bool SettingsPage::isdownload = false;
@@ -57,10 +57,7 @@ void SettingsPage::readServerList()
// 创建 QTextStream 对象
QTextStream textStream(&file);
if (!textStream.readAll().contains(DEFAULT_CHECK_DOMAIN)) // 校验配置文件有效性
{
return;
}
textStream.seek(0); // 回到开头
QString lineData = textStream.readLine(); // 读取文件的第一行
ui->comboBox_server->addItem(lineData);

View File

@@ -70,10 +70,10 @@
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>743</width>
<height>950</height>
<x>-58</x>
<y>-204</y>
<width>738</width>
<height>746</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_23">
@@ -356,8 +356,7 @@
<item>
<widget class="QLabel" name="label_10">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;We are &lt;span style=&quot; font-weight:600;&quot;&gt;NOT&lt;/span&gt; the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &amp;quot;Spark Store&amp;quot;! &amp;quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. &lt;/p&gt;&lt;p&gt;We don't make a profit from this, all developers and maintainers don't get paid, and we rely on the community's donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. &lt;/p&gt;&lt;p&gt;Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. &lt;/p&gt;&lt;p&gt;If any part of the store infringes your rights, please tell us &lt;a href=&quot;mailto:jifengshenmo@outlook.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;jifengshenmo@outlook.com&lt;/span&gt;&lt;/a&gt; we will remove the infringing content as soon as possible. &lt;/p&gt;&lt;p&gt;If you'd like to get involved with us too, whether you're involved in development, design, pitching or submitting work, we welcome you to join us. &lt;/p&gt;
&lt;p&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;&lt;br/&gt;&lt;/span&gt;Our contact method can be found at &lt;a href=&quot;https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;Here&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to this entity and its subsidiaries.&lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>

View File

@@ -34,6 +34,8 @@ CONFIG += c++11 link_pkgconfig
PKGCONFIG += dtkcore dtkgui dtkwidget
SOURCES += \
backend/DataCollectorAndUploader.cpp \
backend/ThemeChecker.cpp \
backend/downloadworker.cpp \
backend/image_show.cpp \
backend/sparkapi.cpp \
@@ -58,6 +60,8 @@ SOURCES += \
mainwindow-dtk.cpp
HEADERS += \
backend/DataCollectorAndUploader.h \
backend/ThemeChecker.h \
backend/downloadworker.h \
backend/image_show.h \
backend/sparkapi.h \
@@ -93,6 +97,7 @@ RESOURCES += \
TRANSLATIONS += \
../translations/spark-store_en.ts \
../translations/spark-store_es.ts \
../translations/spark-store_fr.ts \
../translations/spark-store_zh_CN.ts \
../translations/spark-store_zh_TW.ts

View File

@@ -1,14 +1,21 @@
#include "httprequest.h"
HttpRequest::HttpRequest()
HttpRequest::HttpRequest(QObject *parent):QObject(parent)
{
QString headers = "Mozilla/5.0 Spark-Store/"+ QString(APP_VERSION)+" (Linux; "+QSysInfo::prettyProductName().toUtf8()+");";
QByteArray ba = headers.toLatin1();
rawHeaders = strdup(ba.data());
}
// 在析构函数中释放 rawHeaders 的内存
HttpRequest::~HttpRequest()
{
free(rawHeaders);
}
void HttpRequest::getRequest(QNetworkRequest request)
{
QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
request.setRawHeader("User-Agent", "Mozilla/5.0");
request.setRawHeader("User-Agent", rawHeaders);
request.setRawHeader("Content-Type", "charset='utf-8'");
request.setRawHeader("Content-Type", "application/json");
@@ -26,6 +33,7 @@ QString HttpRequest::postRequest(QString url, QString jsondata)
QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
QUrl strUrl = url.replace("+", "%2B");
request.setUrl(strUrl);
request.setRawHeader("User-Agent", rawHeaders);
request.setRawHeader("Content-Type", "charset='utf-8'");
request.setRawHeader("Content-Type", "application/json");

View File

@@ -10,8 +10,11 @@
class HttpRequest : public QObject
{
Q_OBJECT
private:
char* rawHeaders;
public:
HttpRequest();
HttpRequest(QObject *parent = nullptr);
~HttpRequest();
void getRequest(QNetworkRequest request);

View File

@@ -8,6 +8,7 @@
#include <QSettings>
#include <QStandardPaths>
#include <QFile>
#include <QUuid>
#include <QJsonDocument>
#define UOSDeveloperModeFile "/var/lib/deepin/developer-mode/enabled"
@@ -72,6 +73,36 @@ bool Utils::isWayland()
return isWayland;
}
/**
* @brief 判断是否使用 TreeLand 混合器
* @return bool true: 使用 TreeLand 混合器 false: 非 TreeLand 混合器
*/
bool Utils::isTreeLand()
{
bool isTreeLand = false;
if (qgetenv("DDE_CURRENT_COMPOSITOR").toLower() == "treeland") {
isTreeLand = true;
}
return isTreeLand;
}
bool Utils::isPhytium()
{
bool isPhytium = false;
QProcess process;
process.start("lscpu");
process.waitForFinished();
QString output = process.readAllStandardOutput();
if (output.contains(QLatin1String("Phytium")))
{
isPhytium = true;
}
return isPhytium;
}
/**
* @brief Utils::initConfig 初始化 config.ini 配置文件,去除废弃字段
*/
@@ -96,6 +127,11 @@ void Utils::initConfig()
{
config.setValue("runtime/useWayland", useWayland);
}
// check uuid
if (!config.contains("info/uuid")){
config.setValue("info/uuid", initUUID());
}
config.sync(); // 写入更改至 config.ini并同步最新内容
checkUOSDeveloperMode(); // Check UOS developer mode
@@ -126,6 +162,14 @@ bool Utils::isUOS()
return isUOS;
}
/**
* @brief Utils::initUUID 生成 UUID
*/
QString Utils::initUUID(){
QUuid uuid = QUuid::createUuid();
return uuid.toString();
}
/**
* @brief Utils::setQPAPlatform Set display backend
*/
@@ -140,14 +184,18 @@ void Utils::setQPAPlatform()
qDebug() << "System Wayland enabled:" << isWayland << "Spark Wayland enabled:" << useWayland;
if (isWayland && useWayland && !(Dtk::Core::DSysInfo::isDeepin() || isDDE))
/**
* NOTE: https://github.com/linuxdeepin/developer-center/issues/7217#issuecomment-1922653903
* DDE Wayland has been deprecated, so using wayland plugin only
*/
if (isWayland && useWayland /*&& !(Dtk::Core::DSysInfo::isDeepin() || isDDE)*/)
{
qputenv("QT_QPA_PLATFORM", "wayland");
}
else if (isWayland && useWayland && (Dtk::Core::DSysInfo::isDeepin() && isDDE))
{
qputenv("QT_QPA_PLATFORM", "dwayland");
}
// else if (isWayland && useWayland && (Dtk::Core::DSysInfo::isDeepin() && isDDE))
// {
// qputenv("QT_QPA_PLATFORM", "dwayland");
// }
else
{
qputenv("QT_QPA_PLATFORM", "dxcb");

View File

@@ -10,8 +10,11 @@ public:
static void sendNotification(const QString &icon, const QString &title, const QString &body);
static bool isDDE();
static bool isWayland();
static bool isTreeLand();
static void initConfig();
static bool isUOS();
static bool isPhytium();
static QString initUUID();
static void setQPAPlatform();
static void checkUOSDeveloperMode();
static QJsonObject parseFeatureJsonFile();

View File

@@ -1,6 +1,8 @@
#include "big_image.h"
#include "qapplication.h"
#include <QHBoxLayout>
#include <QScreen>
#include <QtConcurrent>
big_image::big_image(DBlurEffectWidget *parent) : DBlurEffectWidget(parent),
@@ -17,13 +19,16 @@ big_image::big_image(DBlurEffectWidget *parent) : DBlurEffectWidget(parent),
layout->addWidget(m_image);
layout->setMargin(0);
// m_image->setParent(this);
// Make sure the image has a parent so that it will be freed.
m_image->setParent(this);
// m_image->setMaximumSize(1360,768);
m_image->setAlignment(Qt::AlignCenter);
}
void big_image::setimage(QPixmap image)
{
QScreen *screen = QApplication::primaryScreen();
image.setDevicePixelRatio(screen->devicePixelRatio());
m_image->setPixmap(image);
}

View File

@@ -175,7 +175,7 @@ void DownloadItem::slotAsyncInstall(int t)
switch (t)
{
case 0:
installer.start("pkexec", QStringList() << "ssinstall"
installer.start("host-spawn", QStringList() << "pkexec" << "/usr/local/bin/ssinstall"
<< "/tmp/spark-store/" + ui->label_filename->text().toUtf8() << "--delete-after-install");
break;
case 1:
@@ -209,7 +209,7 @@ void DownloadItem::slotAsyncInstall(int t)
}
QProcess isInstall;
isInstall.start("dpkg", QStringList() << "-s" << pkgName);
isInstall.start("host-spawn", QStringList() << "dpkg" << "-s" << pkgName);
isInstall.waitForFinished(180 * 1000); // 默认超时 3 分钟
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
if (error == 0 && !haveError)
@@ -234,9 +234,9 @@ void DownloadItem::slotAsyncInstall(int t)
if (notRoot)
{
Utils::sendNotification("spark-store", tr("Spark Store"), tr("dpkg progress had been abortedplease check the install info or try to reinstall."));
ui->label_2->setText(tr("dpkg progress had been abortedplease check the install info or try to reinstall."));
ui->label_2->setToolTip(tr("dpkg progress had been abortedplease check the install info or try to reinstall."));
Utils::sendNotification("spark-store", tr("Spark Store"), tr("dpkg progress had been aborted, please check the install info or try to reinstall."));
ui->label_2->setText(tr("dpkg progress had been aborted, please check the install info or try to reinstall."));
ui->label_2->setToolTip(tr("dpkg progress had been aborted, please check the install info or try to reinstall."));
ui->pushButton_install->show();
ui->pushButton_3->hide();
}

View File

@@ -7,20 +7,7 @@
WebEnginePage::WebEnginePage(QObject *parent)
: QWebEnginePage(parent)
{
QLocale ql;
switch (ql.language())
{
case QLocale::Chinese:
{
// 系统语言是中文,获取网页为中文 @momen @uniartisan
QWebEngineProfile *profile = QWebEngineProfile::defaultProfile();
qDebug() << profile->httpAcceptLanguage();
profile->setHttpAcceptLanguage("zh-CN,zh;q=0.8,en;q=0.6");
}
break;
default:
break;
}
initHttpAcceptLanguage();
}
WebEnginePage::~WebEnginePage()
@@ -47,6 +34,18 @@ QWebEnginePage *WebEnginePage::createWindow(QWebEnginePage::WebWindowType type)
return page;
}
void WebEnginePage::initHttpAcceptLanguage()
{
switch (QLocale::system().language()) {
case QLocale::Chinese: {
// 系统语言是中文,获取网页为中文 @momen @uniartisan
profile()->setHttpAcceptLanguage("zh-CN,zh;q=0.8,en;q=0.6");
} break;
default:
break;
}
}
void WebEnginePage::slotUrlChanged(const QUrl &url)
{
if (m_currentUrl == url)

View File

@@ -16,6 +16,9 @@ public:
protected:
QWebEnginePage *createWindow(WebWindowType type) override;
private:
void initHttpAcceptLanguage();
private slots:
void slotUrlChanged(const QUrl &url);

View File

@@ -1,8 +1,6 @@
#include "webengineview.h"
#include "webenginepage.h"
#include <QDesktopServices>
WebEngineView::WebEngineView(QWidget *parent)
: QWebEngineView(parent)
{

View File

@@ -169,6 +169,7 @@ void DownloadListWidget::httpFinished() // 完成下载
{
while (downloaditemlist[nowDownload - 1]->readyInstall() == -1) // 安装当前应用堵塞安装后面的下载suspend
{
QThread::msleep(500); // 休眠500ms减少CPU负担
continue;
}
downloaditemlist[nowDownload - 1]->free = true;
@@ -179,17 +180,15 @@ void DownloadListWidget::httpFinished() // 完成下载
// 如果有排队则下载下一个
qDebug() << "Download: 切换下一个下载...";
nowDownload += 1;
while (downloaditemlist[nowDownload - 1]->close)
while (nowDownload <= allDownload && downloaditemlist[nowDownload - 1]->close)
{
nowDownload += 1;
if (nowDownload >= allDownload)
{
nowDownload = allDownload;
return;
}
}
QString fileName = downloaditemlist[nowDownload - 1]->getName();
startRequest(urList.at(nowDownload - 1), fileName);
if (nowDownload <= allDownload)
{
QString fileName = downloaditemlist[nowDownload - 1]->getName();
startRequest(urList.at(nowDownload - 1), fileName);
}
}
});
}
@@ -236,19 +235,23 @@ void DownloadListWidget::on_pushButton_clicked()
void DownloadListWidget::slotInstallFinished(bool success)
{
// NOTE: 仅在安装成功后判断是否需要退出后台
if (success) {
toDownload -= 1; // 安装完以后减少待安装数目
qDebug() << "Download: 还没有下载的数目:" << toDownload;
if (!success) {
qDebug() << "Download: install failed";
return;
}
if (toDownload == 0)
if (toDownload > 0) {
toDownload -= 1;
qDebug() << "Download: toDownload" << toDownload;
}
if (toDownload == 0) {
Application *app = qobject_cast<Application *>(qApp);
MainWindow *mainWindow = app->mainWindow();
if (mainWindow->isCloseWindowAnimation() == true)
{
Application *app = qobject_cast<Application *>(qApp);
MainWindow *mainWindow = app->mainWindow();
if (mainWindow->isCloseWindowAnimation() == true)
{
qDebug() << "Download: 后台安装结束,退出程序";
qApp->quit();
}
qDebug() << "Download: 后台安装结束,退出程序";
qApp->quit();
}
}
}

5
tips.md Normal file
View File

@@ -0,0 +1,5 @@
编译后出包装到ACE里从chocolate拿deb组合包
记得替换127.0.0.1
外部后端在chocolate里

View File

@@ -1,169 +0,0 @@
###################################################################
# CONFIGURATION OPTIONS
###################################################################
# Every item has a default value besides MIRRORS (which is unset).
# Use aptitude, apt-get, or apt?
# Note that apt-get is used as a fallback for outputting the
# package URI list for e.g. aptitude, which can't do this
# Optionally add the FULLPATH to apt-get or apt-rpm or aptitude
# e.g. /usr/bin/aptitude
#
# Default: apt-get
#
_APTMGR=apt-get
if [ -x "$(command -v apt)" ]; then
_APTMGR=apt
fi
if grep -Eqi "linuxmint" /etc/os-release;then
_APTMGR=apt-get
fi
if [ -x "$(command -v oyo)" ]; then
_APTMGR=/usr/bin/apt
fi
####
#
# UOS sources auth config
#
#
if grep -Eqi "UnionTech" /etc/issue || grep -Eq "UnionTech" /etc/*-release;then
AUTH_UOS_USER="uos-https://license.chinauos.com-apt"
AUTH_UOS_PASSWD="`cat /etc/apt/auth.conf.d/uos.conf | grep home-packages.chinauos.com`"
AUTH_UOS_PASSWD=`echo ${AUTH_UOS_PASSWD#*password }`
fi
##### UOS自动读取账号密码以实现使用aptss来加速下载
# Enable DOWNLOADBEFORE to suppress apt-fast confirmation dialog and download
# packages directly.
#
# Default: dialog enabled
#
DOWNLOADBEFORE=true
# Choose mirror list to speed up downloads from same archive. To select some
# mirrors take a look at your distribution's archive mirror lists.
# Debian: http://www.debian.org/mirror/list
# Ubuntu: https://launchpad.net/ubuntu/+archivemirrors
#
# It is required to add mirrors in the sources.list to this array as well, so
# apt-fast can destinguish between different distributions.
#
# Examples:
#
# Different distributions (as in operating systems):
#
# sources.list:
# deb http://deb.debian.org/debian/ unstable main non-free contrib
# deb http://de.archive.ubuntu.com/ubuntu/ bionic main universe
#
# apt-fast.conf:
# MIRRORS=( 'http://deb.debian.org/debian','http://ftp.debian.org/debian,http://ftp2.de.debian.org/debian,http://ftp.de.debian.org/debian,ftp://ftp.uni-kl.de/debian'
# 'http://archive.ubuntu.com/ubuntu,http://de.archive.ubuntu.com/ubuntu,http://ftp.halifax.rwth-aachen.de/ubuntu,http://ftp.uni-kl.de/pub/linux/ubuntu,http://mirror.informatik.uni-mannheim.de/pub/linux/distributions/ubuntu/' )
#
#
# Single distribution:
#
# sources.list:
# deb http://fr.archive.ubuntu.com/ubuntu/ bionic main
# deb http://fr.archive.ubuntu.com/ubuntu/ artful main
#
# apt-fast.conf:
# MIRRORS=( 'http://fr.archive.ubuntu.com/ubuntu,http://bouyguestelecom.ubuntu.lafibre.info/ubuntu,http://mirror.ovh.net/ubuntu,http://ubuntu-archive.mirrors.proxad.net/ubuntu' )
#
# Default: disabled
#
MIRRORS=( 'https://d.store.deepinos.org.cn/,https://zunyun01.store.deepinos.org.cn/,https://mirrors.sdu.edu.cn/spark-store-repository/,http://cdn.dl.uniartisan.com:9000/deepinos/,https://d1.store.deepinos.org.cn/,https://d2.store.deepinos.org.cn/,https://d3.store.deepinos.org.cn/,https://d4.store.deepinos.org.cn/,https://d5.store.deepinos.org.cn/' )
# Maximum number of connections
# You can use this value in _DOWNLOADER command. Escape with ${}: ${_MAXNUM}
#
# Default: 5
#
_MAXNUM=16
# Maximum number of connections per server
# Default: 10
#
_MAXCONPERSRV=1
# Split size i.e. size of each piece
# Possible Values: 1M-1024M
#
_MINSPLITSZ=1M
# Piece selection algorithm to use
# Available values are: default, inorder, geom
# default: selects piece so that it reduces the number of establishing connection, reasonable for most cases
# inorder: selects pieces in sequential order starting from first piece
# geom: selects piece which has minimum index like inorder, but it exponentially increasingly keeps space from previously selected pieces
#
_PIECEALGO=default
# Downloadmanager listfile
# You can use this value in _DOWNLOADER command. Escape with ${}: ${DLLIST}
#
# Default: /tmp/apt-fast.list
#
DLLIST='/tmp/apt-fast.list'
# Download command to use. Temporary download list is designed for aria2. But
# you can choose another download command or download manager. It has to
# support following input file syntax (\t is tab character):
#
# # Comment
# MIRROR1\tMIRROR2\tMIRROR3...
# out=FILENAME1
# MIRROR1\tMIRROR2\tMIRROR3...
# out=FILENAME2
# ...
#
# Examples:
# aria2c with a proxy (set username, proxy, ip and password!)
# _DOWNLOADER='aria2c --no-conf -c -j ${_MAXNUM} -x ${_MAXCONPERSRV} -s ${_SPLITCON} --min-split-size=${_MINSPLITSZ} --stream-piece-selector=${_PIECEALGO} --http-proxy=http://username:password@proxy_ip:proxy_port -i ${DLLIST}'
#
# Default: _DOWNLOADER='aria2c --no-conf -c -j ${_MAXNUM} -x ${_MAXCONPERSRV} -s ${_SPLITCON} --min-split-size=${_MINSPLITSZ} --stream-piece-selector=${_PIECEALGO} -i ${DLLIST} --connect-timeout=600 --timeout=600 -m0'
#
_DOWNLOADER='aria2c --no-conf -c -j ${_MAXNUM} -x ${_MAXCONPERSRV} --min-split-size=${_MINSPLITSZ} --stream-piece-selector=${_PIECEALGO} -i ${DLLIST} --connect-timeout=600 --timeout=600 -m0 --http-user ${AUTH_UOS_USER} --http-passwd ${AUTH_UOS_PASSWD}'
# Download temp folder for Downloadmanager
# example /tmp/apt-fast. Standard is /var/cache/apt-fast
#
# Default: /var/cache/apt/apt-fast
#
DLDIR='/var/cache/apt/apt-fast'
# APT archives cache directory
#
# Default /var/cache/apt/archives
# (APT configuration items Dir::Cache and Dir::Cache::archives)
#
APTCACHE='/var/cache/apt/archives'
# apt-fast colors
# Colors are disabled when not using a terminal.
#
# Default colors are:
# cGreen='\e[0;32m'
# cRed='\e[0;31m'
# cBlue='\e[0;34m'
# endColor='\e[0m'

View File

@@ -1,14 +0,0 @@
Debug::RunScripts true;
Dir::Cache::archives "/var/cache/apt/archives";
Dir::Cache "/var/lib/aptss/";
Dir::Etc::SourceParts "/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/";
Dir::State::lists "/var/lib/aptss/lists/";
APT::Get::Fix-Broken true;
APT::Get::List-Cleanup="0";
#clear APT::Update::Post-Invoke-Success;
#clear DPkg::Post-Invoke;
#clear DPkg::Pre-Install-Pkgs;

View File

@@ -1,666 +0,0 @@
#!/bin/bash
#
# apt-fast v1.9
# Use this just like aptitude or apt-get for faster package downloading.
#
# Copyright: 2008-2012 Matt Parnell, http://www.mattparnell.com
# Improvements, maintenance, revisions - 2012, 2017-2018 Dominique Lasserre
#
# You may distribute this file under the terms of the GNU General
# Public License as published by the Free Software Foundation; either
# version 3 of the License, or (at your option) any later version.
#
[ -n "$DEBUG" ] && set -xv
# Print colored messages.
# Usage: msg "message text" "message type" "optional: err"
# Message types are 'normal', 'hint' or 'warning'. Warnings and messages with a
# third argument are piped to stderr.
msg(){
msg_options=()
case "$2" in
normal) beginColor="$cGreen";;
hint) beginColor="$cBlue";;
warning) beginColor="$cRed";;
question) beginColor="$cRed"; msg_options=(-n);;
*) beginColor= ;;
esac
if [ -z "$3" ] && [ "$2" != "warning" ]; then
echo -e "${msg_options[@]}" "${aptfast_prefix}${beginColor}$1${endColor}"
else
echo -e "${msg_options[@]}" "${aptfast_prefix}${beginColor}$1${endColor}" >&2
fi
}
# Search for known options and decide if root privileges are needed.
root=1 # default value: we need root privileges
option=
for argument in "$@"; do
case "$argument" in
upgrade | full-upgrade | install | dist-upgrade | build-dep)
option="install"
;;
clean | autoclean)
option="clean"
;;
download)
option="download"
root=0
;;
source)
option="source"
root=0
;;
changelog)
root=0
;;
esac
done
# To handle priority of options correctly (environment over config file vars)
# we need to preserve all interesting env variables. As this wouldn't be
# difficult enough we have to preserve complete env vars (especially if value
# ist set (even empty) or not) when changing context (sudo)...
# Set a 'random' string to all unset variables.
TMP_RANDOM="13979853562951413"
TMP_LCK_FILE="${LCK_FILE-${TMP_RANDOM}}"
TMP_DOWNLOADBEFORE="${DOWNLOADBEFORE-${TMP_RANDOM}}"
TMP__APTMGR="${_APTMGR-${TMP_RANDOM}}"
TMP_APTCACHE="${APTCACHE-${TMP_RANDOM}}"
TMP_DLDIR="${DLDIR-${TMP_RANDOM}}"
TMP_DLLIST="${DLLIST-${TMP_RANDOM}}"
TMP_LISTDIR="${LISTDIR-${TMP_RANDOM}}"
TMP__MAXNUM="${MAXNUM-${TMP_RANDOM}}"
TMP__MAXCONPERSRV="${MAXCONPERSRV-${TMP_RANDOM}}"
TMP__SPLITCON="${SPLITCON-${TMP_RANDOM}}"
TMP__MINSPLITSZ=${MINSPLITSZ-${TMP_RANDOM}}
TMP__PIECEALGO=${PIECEALGO-${TMP_RANDOM}}
TMP_aptfast_prefix="${aptfast_prefix-${TMP_RANDOM}}"
TMP_APT_FAST_TIMEOUT="${APT_FAST_TIMEOUT-${TMP_RANDOM}}"
TMP_VERBOSE_OUTPUT="${VERBOSE_OUTPUT-${TMP_RANDOM}}"
TMP_ftp_proxy="${ftp_proxy-${TMP_RANDOM}}"
TMP_http_proxy="${http_proxy-${TMP_RANDOM}}"
TMP_https_proxy="${https_proxy-${TMP_RANDOM}}"
# Check for proper privileges.
# Call explicitly with environment variables to get them into root conext.
if [ "$root" = 1 ] && [ "$UID" != 0 ]; then
exec sudo DEBUG="$DEBUG" \
LCK_FILE="$TMP_LCK_FILE" \
DOWNLOADBEFORE="$TMP_DOWNLOADBEFORE" \
_APTMGR="$TMP__APTMGR" \
APTCACHE="$TMP_APTCACHE" \
DLDIR="$TMP_DLDIR" \
DLLIST="$TMP_DLLIST" \
LISTDIR="$TMP_LISTDIR" \
_MAXNUM="$TMP__MAXNUM" \
_MAXCONPERSRV="$TMP__MAXCONPERSRV" \
_SPLITCON="$TMP__SPLITCON" \
_MINSPLITSZ="$TMP__MINSPLITSZ" \
_PIECEALGO="$TMP__PIECEALGO" \
aptfast_prefix="$TMP_aptfast_prefix" \
APT_FAST_TIMEOUT="$TMP_APT_FAST_TIMEOUT" \
VERBOSE_OUTPUT="$TMP_VERBOSE_OUTPUT" \
ftp_proxy="$TMP_ftp_proxy" \
http_proxy="$TMP_http_proxy" \
https_proxy="$TMP_https_proxy" \
"$0" "$@"
fi
# Define lockfile.
# Use /tmp as directory because everybody (not only root) has to have write
# permissions.
# We need lock for non-root commands too, because we only have one download
# list file.
LCK_FILE="/tmp/apt-fast"
LCK_FD=99
# Set default package manager, APT cache, temporary download dir,
# temporary download list file, and maximal parallel downloads
_APTMGR=apt-get
eval "$(apt-config shell APTCACHE Dir::Cache::archives/d)"
# Check if APT config option Dir::Cache::archives::apt-fast-partial is set.
eval "$(apt-config shell apt_fast_partial Dir::Cache::archives::apt-fast-partial/d)"
if [ -z "$apt_fast_partial" ]; then
eval "$(apt-config -o Dir::Cache::archives::apt-fast-partial=apt-fast shell DLDIR Dir::Cache::archives::apt-fast-partial/d)"
else
eval "$(apt-config shell DLDIR Dir::Cache::archives::apt-fast-partial/d)"
fi
# Currently not needed.
eval "$(apt-config shell LISTDIR Dir::State::lists/d)"
DLLIST="/tmp/apt-fast.list"
_MAXNUM=5
_MAXCONPERSRV=10
_SPLITCON=8
_MINSPLITSZ="1M"
_PIECEALGO="default"
# Prefix in front of apt-fast output:
aptfast_prefix=
# aptfast_prefix="$(date '+%b %_d %T.%N') apt-fast: "
# Set color variables.
cGreen='\e[0;32m'
cRed='\e[0;31m'
cBlue='\e[0;34m'
endColor='\e[0m'
# Set timout value for apt-fast download confirmation dialog.
# Value is in seconds.
APT_FAST_TIMEOUT=60
# Ask for download confirmation if unset
DOWNLOADBEFORE=
# Formatted package list in download confirmation if unset
VERBOSE_OUTPUT=
# Download command.
_DOWNLOADER='aria2c --no-conf -c -j ${_MAXNUM} -x ${_MAXCONPERSRV} -s ${_SPLITCON} -i ${DLLIST} --min-split-size=${_MINSPLITSZ} --stream-piece-selector=${_PIECEALGO} --connect-timeout=600 --timeout=600 -m0'
# Load config file.
CONFFILE="/tmp/aptss-conf/apt-fast.conf"
#### Spark Store apt-fast conf is in /tmp
if [ -e "$CONFFILE" ]; then
source "$CONFFILE"
fi
# no proxy as default
ftp_proxy=
http_proxy=
https_proxy=
# Now overwrite with preserved values if values were set before (compare with
# 'random' string).
[ "$TMP_LCK_FILE" = "$TMP_RANDOM" ] || LCK_FILE="$TMP_LCK_FILE"
[ "$TMP_DOWNLOADBEFORE" = "$TMP_RANDOM" ] || DOWNLOADBEFORE="$TMP_DOWNLOADBEFORE"
[ "$TMP__APTMGR" = "$TMP_RANDOM" ] || _APTMGR="$TMP__APTMGR"
[ "$TMP_APTCACHE" = "$TMP_RANDOM" ] || APTCACHE="$TMP_APTCACHE"
[ "$TMP_DLDIR" = "$TMP_RANDOM" ] || DLDIR="$TMP_DLDIR"
[ "$TMP_DLLIST" = "$TMP_RANDOM" ] || DLLIST="$TMP_DLLIST"
[ "$TMP_LISTDIR" = "$TMP_RANDOM" ] || LISTDIR="$TMP_LISTDIR"
[ "$TMP__MAXNUM" = "$TMP_RANDOM" ] || _MAXNUM="$TMP__MAXNUM"
[ "$TMP__MAXCONPERSRV" = "$TMP_RANDOM" ] || _MAXCONPERSRV="$TMP__MAXCONPERSRV"
[ "$TMP__SPLITCON" = "$TMP_RANDOM" ] || _SPLITCON="$TMP__SPLITCON"
[ "$TMP__MINSPLITSZ" = "$TMP_RANDOM" ] || _MINSPLITSZ="$TMP__MINSPLITSZ"
[ "$TMP__PIECEALGO" = "$TMP_RANDOM" ] || _PIECEALGO="$TMP__PIECEALGO"
[ "$TMP_aptfast_prefix" = "$TMP_RANDOM" ] || aptfast_prefix="$TMP_aptfast_prefix"
[ "$TMP_APT_FAST_TIMEOUT" = "$TMP_RANDOM" ] || APT_FAST_TIMEOUT="$TMP_APT_FAST_TIMEOUT"
[ "$TMP_VERBOSE_OUTPUT" = "$TMP_RANDOM" ] || VERBOSE_OUTPUT="$TMP_VERBOSE_OUTPUT"
[ "$TMP_ftp_proxy" = "$TMP_RANDOM" ] || ftp_proxy="$TMP_ftp_proxy"
[ "$TMP_http_proxy" = "$TMP_RANDOM" ] || http_proxy="$TMP_http_proxy"
[ "$TMP_https_proxy" = "$TMP_RANDOM" ] || https_proxy="$TMP_https_proxy"
# Disable colors if not executed in terminal.
if [ ! -t 1 ]; then
cGreen=
cRed=
cBlue=
endColor=
#FIXME: Time not updated.
[ -z "$aptfast_prefix" ] && aptfast_prefix="[apt-fast $(date +"%T")]"
fi
msg_already_running()
{
msg "apt-fast already running!" "warning"
msg "apt-fast 已经在运行了" "warning"
msg "Verify that all apt-fast processes are finished then remove $LCK_FILE.lock and try again." "hint"
msg "请确认所有的apt-fast进程已经结束然后删除 $LCK_FILE.lock 后重试." "hint"
}
# Check if a lock file exists.
if [ -f "$LCK_FILE.lock" ]; then
msg_already_running
exit 1
fi
# create the lock file and lock it, die on failure
_create_lock()
{
eval "exec $LCK_FD>\"$LCK_FILE.lock\""
# trap "cleanup_aptfast; exit_cleanup_state" EXIT
# This will hide the exit code
trap "cleanup_aptfast" EXIT
trap "cleanup_aptfast; exit 1" INT TERM
flock -n $LCK_FD || { msg_already_running; exit 1; }
}
# unlock and remove the lock file
_remove_lock()
{
flock -u "$LCK_FD" 2>/dev/null
rm -f "$LCK_FILE.lock"
}
# Move download file away so missing permissions won't stop usage.
CLEANUP_STATE=0
cleanup_dllist()
{
if [ -f "$DLLIST" ]
then
if ! mv -- "$DLLIST{,.old}" 2>/dev/null
then
if ! rm -f -- "$DLLIST" 2>/dev/null
then
msg "Could not clean up download list file." "warning"
msg "无法清除下载列表文件." "warning"
CLEANUP_STATE=1
fi
fi
fi
}
cleanup_aptfast()
{
[ "$CLEANUP_STATE" -eq 0 ] && CLEANUP_STATE=$?
cleanup_dllist
_remove_lock
}
exit_cleanup_state()
{
exit $CLEANUP_STATE
}
# decode url string
# translates %xx but must not convert '+' in spaces
urldecode()
{
printf '%b' "${1//%/\\x}"
}
# Check if mirrors are available. And if so add all mirrors to download list.
get_mirrors(){
# Check all mirror lists.
for mirrorstr in "${MIRRORS[@]}"; do
# Build mirrors array from comma separated string.
IFS=", " read -r -a mirrors <<< "$mirrorstr"
# Check for all mirrors if URI of $1 is from mirror. If so add all other
# mirrors to (resmirror) list and break all loops.
for mirror in "${mirrors[@]}"; do
# Real expension.
if [[ "$1" == "$mirror"* ]]; then
filepath=${1#${mirror}}
# Build list for aria download list.
list="${mirrors[*]}"
echo -e "${list// /${filepath}\\t}$filepath\n"
return 0
fi
done
done
# No other mirrors found.
echo "$1"
}
# Globals to save package name, version, size and overall size.
DOWNLOAD_DISPLAY=
DOWNLOAD_SIZE=0
# Get the package URLs.
get_uris(){
if [ ! -d "$(dirname "$DLLIST")" ]
then
if ! mkdir -p -- "$(dirname "$DLLIST")"
then
msg "Could not create download file directory." "warning"
msg "无法创建下载文件夹" "warning"
exit 1
fi
elif [ -f "$DLLIST" ]; then
if ! rm -f -- "$DLLIST" 2>/dev/null && ! touch -- "$DLLIST" 2>/dev/null
then
msg "Unable to write to download file. Try restarting with root permissions or run 'aptss clean' first." "warning"
msg "无法下载文件。尝试使用root权限或者运行 'aptss clean'" "warning"
exit 1
fi
fi
# Add header to overwrite file.
echo "# apt-fast mirror list: $(date)" > "$DLLIST"
#NOTE: aptitude doesn't have this functionality, so we use apt-get to get
# package URIs.
# case "$_APTMGR" in
# apt|apt-get) uri_mgr=$_APTMGR;;
# *) uri_mgr=apt-get;;
# esac
# NOTE:apt可能出现变动不建议在脚本中使用因此在此统一改用apt-get
uri_mgr=apt-get
uris_full="$("$uri_mgr" "${APT_SCRIPT_WARNING[@]}" -y --print-uris "$@")"
uris_full_ret="$?"
if [ "$uris_full_ret" -ne 0 ]
then
msg "Package manager quit with exit code.Here is the log" "warning"
msg "包管理器以错误代码退出.日志如下" "warning"
msg "${uris_full}"
exit "$uris_full_ret"
fi
while read -r pkg_uri_info
do
[ -z "$pkg_uri_info" ] && continue
## --print-uris format is:
# 'fileurl' filename filesize checksum_hint:filechecksum
uri="$(echo "$pkg_uri_info" | cut -d' ' -f1 | tr -d "'")"
filename="$(echo "$pkg_uri_info" | cut -d' ' -f2)"
filesize="$(echo "$pkg_uri_info" | cut -d' ' -f3)"
checksum_string="$(echo "$pkg_uri_info" | cut -d' ' -f4)"
hash_algo="$(echo "$checksum_string" | cut -d':' -f1)"
checksum="$(echo "$checksum_string" | cut -d':' -f2)"
filename_decoded="$(urldecode "$filename")"
DOWNLOAD_DISPLAY="${DOWNLOAD_DISPLAY}$(echo "$filename_decoded" | cut -d'_' -f1)"
DOWNLOAD_DISPLAY="${DOWNLOAD_DISPLAY} $(echo "$filename_decoded" | cut -d'_' -f2)"
DOWNLOAD_DISPLAY="${DOWNLOAD_DISPLAY} $(echo "$filesize" | numfmt --to=iec-i --suffix=B)\n"
DOWNLOAD_SIZE=$((DOWNLOAD_SIZE + filesize))
## whole uri comes encoded (urlencoded). Filename must NOT be decoded because
# plain aptitude do not decode it when download and install it. Therefore, we
# will have ugly named packages at /var/cache/apt/archives but is the standard
# behavior.
# But package version must be decoded, otherways package=version calls will
# not work.
if [ -n "$HASH_SUPPORTED" ]; then
case "$hash_algo" in
SHA512) [ -z "$SHA512_SUPPORTED" ] && hash_algo= || hash_algo=sha-512 ;;
SHA256) [ -z "$SHA256_SUPPORTED" ] && hash_algo= || hash_algo=sha-256 ;;
SHA1) [ -z "$SHA1_SUPPORTED" ] && hash_algo= || hash_algo=sha-1 ;;
MD5Sum) [ -z "$MD5sum_SUPPORTED" ] && hash_algo= || hash_algo=md5 ;;
*) hash_algo=
esac
# Using apt-cache show package=version to ensure recover single and
# correct package version.
# Warning: assuming that package naming uses '_' as field separator.
# Therefore, this code expects package-name_version_arch.deb Otherways
# below code will fail resoundingly
if [ -z "$hash_algo" ]; then
pkg_name="$(echo "$filename" | cut -d'_' -f1)"
pkg_version="$(echo "$filename" | cut -d'_' -f2)"
pkg_version="$(urldecode "$pkg_version")"
package_info="$(apt-cache show "$pkg_name=$pkg_version")"
patch_checksum=
if [ -n "$SHA512_SUPPORTED" ]; then
patch_checksum="$(echo "$package_info" | grep SHA512 | head -n 1)"
[ -n "$patch_checksum" ] && hash_algo="sha-512"
fi
if [ -z "$patch_checksum" ] && [ -n "$SHA256_SUPPORTED" ]; then
patch_checksum="$(echo "$package_info" | grep SHA256 | head -n 1)"
[ -n "$patch_checksum" ] && hash_algo="sha-256"
fi
if [ -z "$patch_checksum" ] && [ -n "$SHA1_SUPPORTED" ]; then
patch_checksum="$(echo "$package_info" | grep SHA1 | head -n 1)"
[ -n "$patch_checksum" ] && hash_algo="sha-1"
fi
if [ -z "$patch_checksum" ] && [ -n "$MD5sum_SUPPORTED" ]; then
patch_checksum="$(echo "$package_info" | grep MD5sum | head -n 1)"
[ -n "$patch_checksum" ] && hash_algo="md5"
fi
if [ -n "$patch_checksum" ]; then
checksum="$(echo "$patch_checksum" | cut -d' ' -f2)"
else
msg "Couldn't get supported checksum for $pkg_name ($pkg_version)." "warning"
msg "无法获得 $pkg_name ($pkg_version) 的受支持的散列验证值" "warning"
REMOVE_WORKING_MESSAGE=
fi
fi
else
hash_algo=
fi
{
get_mirrors "$uri"
#echo " dir=$DLDIR"
if [ -n "$hash_algo" ]; then
echo " checksum=$hash_algo=$checksum"
fi
echo " out=$filename"
} >> "$DLLIST"
done <<<"$(echo "$uris_full" | grep -E "^'(http(s|)|(s|)ftp)://")"
#cat "$DLLIST"
#LCK_RM
#exit
}
display_downloadfile(){
if [ -n "$VERBOSE_OUTPUT" ]; then
cat "$DLLIST"
else
DISPLAY_SORT_OPTIONS=(-k 1,1)
# Sort output after package download size (decreasing):
#DISPLAY_SORT_OPTIONS=(-k 3,3 -hr)
while read -r line; do
[ -z "$line" ] && continue
pkg="$(echo "$line" | cut -d' ' -f1)"
ver="$(echo "$line" | cut -d' ' -f2)"
size="$(echo "$line" | cut -d' ' -f3)"
printf '%s%-40s %-20s %10s\n' "$aptfast_prefix" "$pkg" "$ver" "$size"
done <<<"$(echo -e "$DOWNLOAD_DISPLAY" | sort "${DISPLAY_SORT_OPTIONS[@]}")"
fi
msg "Download size: $(echo "$DOWNLOAD_SIZE" | numfmt --to=iec-i --suffix=B)" "normal"
msg "下载大小: $(echo "$DOWNLOAD_SIZE" | numfmt --to=iec-i --suffix=B)" "normal"
}
# Create and insert a PID number to lockfile.
_create_lock
# Make sure aria2c (in general first parameter from _DOWNLOADER) is available.
CMD="$(echo "$_DOWNLOADER" | sed 's/^\s*\([^ ]\+\).*$/\1/')"
if [ ! "$(command -v "$CMD")" ]; then
msg "Command not found: $CMD" "normal" "err"
msg "You must configure $CONFFILE to use aria2c or another supported download manager" "normal" "err"
exit 1
fi
# Make sure package manager is available.
if [ ! "$(command -v "$_APTMGR")" ]; then
msg "\`$_APTMGR\` command not available." "warning"
msg "You must configure $CONFFILE to use either apt-get or aptitude." "normal" "err"
exit 1
fi
# Disable script warning if apt is used.
APT_SCRIPT_WARNING=()
if [ "$_APTMGR" == "apt" ]; then
APT_SCRIPT_WARNING=(-o "Apt::Cmd::Disable-Script-Warning=true")
fi
# Set supported hash algorithms by aria2c (and also by Debian repository).
SHA512_SUPPORTED=
SHA256_SUPPORTED=
SHA1_SUPPORTED=
MD5sum_SUPPORTED=
HASH_SUPPORTED=
if [ "$CMD" == "aria2c" ]; then
for supported_hash in $(LC_ALL=C aria2c -v | sed '/^Hash Algorithms:/!d; s/\(^Hash Algorithms: \|,\)\+//g'); do
case "$supported_hash" in
sha-512) SHA512_SUPPORTED=y; HASH_SUPPORTED=y ;;
sha-256) SHA256_SUPPORTED=y; HASH_SUPPORTED=y ;;
sha-1) SHA1_SUPPORTED=y; HASH_SUPPORTED=y ;;
md5) MD5sum_SUPPORTED=y; HASH_SUPPORTED=y ;;
esac
done
if [ -z "$HASH_SUPPORTED" ]; then
msg "Couldn't find supported checksum algorithm from aria2c. Checksums disabled." "warning"
msg "无法找到aria2c支持的散列验证算法. 散列验证已被禁用." "warning"
fi
fi
# Check if "assume yes" switch is enabled and if yes enable $DOWNLOADBEFORE.
# Also check if "download only" switch is enabled.
#TODO: Get real value over APT items APT::Get::Assume-Yes and
# APT::Get::Assume-No .
# Respectively Aptitude::CmdLine::Download-Only and APT::Get::Download-Only.
DOWNLOAD_ONLY=
while true; do
while getopts ":dy-:" optchar; do
case "${optchar}" in
-)
case "${OPTARG}" in
yes | assume-yes) DOWNLOADBEFORE=true ;;
assume-no) DOWNLOADBEFORE= ;;
download-only) DOWNLOAD_ONLY=true ;;
esac
;;
y)
DOWNLOADBEFORE=true
;;
d)
DOWNLOAD_ONLY=true
;;
esac
done
((OPTIND++))
[ $OPTIND -gt $# ] && break
done
# Configure proxies. Use apt values over environment variables.
# Note: If proxy setting is not set, there is no apt-config output.
# Therefore variable doesn't get overriden, which is intended.
# Export the variables to make them available in subshells (aka the
# downloader command).
eval "$(apt-config shell ftp_proxy Acquire::ftp::proxy)"
export ftp_proxy
eval "$(apt-config shell http_proxy Acquire::http::proxy)"
export http_proxy
eval "$(apt-config shell https_proxy Acquire::https::proxy)"
export https_proxy
# aria2 has no socks support (see https://github.com/aria2/aria2/issues/153)
if echo "$http_proxy" | grep -q "^socks5h://" || echo "$https_proxy" | grep -q "^socks5h://"; then
msg "Socks proxy detected. Falling back to ${_APTMGR}" "hint"
"${_APTMGR}" "${APT_SCRIPT_WARNING[@]}" "$@"
exit 0
fi
# Run actions.
if [ "$option" == "install" ]; then
msg
msg "Working... this may take a while." "normal"
msg "正在工作中,请稍等" "normal"
REMOVE_WORKING_MESSAGE=y
get_uris "$@"
[ -t 1 ] && [ -n "$REMOVE_WORKING_MESSAGE" ] && tput cuu 1 && tput el && tput cuu 1
# Test /tmp/apt-fast.list file exists and not just the apt-fast comment line.
# Then download all files from the list.
if [ -f "$DLLIST" ] && [ "$(wc -l "$DLLIST" | cut -d' ' -f1)" -gt 1 ] && [ ! "$DOWNLOADBEFORE" ]; then
display_downloadfile
msg
msg "Do you want to download the packages? [Y/n] " "question"
while ((!updsys)); do
read -r -sn1 -t "$APT_FAST_TIMEOUT" answer || { msg; msg "Timed out." "warning"; exit 1; }
case "$answer" in
[JjYy]) result=1; updsys=1 ;;
[Nn]) result=0; updsys=1 ;;
"") result=1; updsys=1 ;;
*) updsys=0 ;;
esac
done
else
result=1
fi
if ((DOWNLOAD_SIZE)); then
msg
# Continue if answer was right or DOWNLOADBEFORE is enabled.
if ((result)); then
if [ -s "$DLLIST" ]; then
# Test if apt-fast directory is present where we put packages.
if [ ! -d "$DLDIR" ]; then
mkdir -p -- "$DLDIR"
fi
cd "$DLDIR" &>/dev/null || exit 1
eval "${_DOWNLOADER}" # execute downloadhelper command
if [ "$(find "$DLDIR" -printf . | wc -c)" -gt 1 ]; then
# Move all packages to the apt install directory by force to ensure
# already existing debs which may be incomplete are replaced
find . -type f -name "*.deb" -execdir mv -ft "$APTCACHE" {} \+
fi
cd - &>/dev/null || msg "Failed to change back directory" "warning"
fi
else
exit 1
fi
else
[ -t 1 ] && tput el
fi
if [ -z "$DOWNLOAD_ONLY" ] || [ "$_APTMGR" == "aptitude" ]; then
"${_APTMGR}" "${APT_SCRIPT_WARNING[@]}" "$@"
fi
elif [ "$option" == "clean" ]; then
"${_APTMGR}" "${APT_SCRIPT_WARNING[@]}" "$@" && {
find "$DLDIR" -maxdepth 1 -type f -delete
CLEANUP_STATE="$?"
[ -f "$DLLIST" ] && rm -f -- "$DLLIST"* || true
}
elif [ "$option" == "download" ]; then
msg
msg "Working... this may take a while." "normal"
msg "正在工作中,请稍等" "normal"
REMOVE_WORKING_MESSAGE=y
get_uris "$@"
[ -t 1 ] && [ -n "$REMOVE_WORKING_MESSAGE" ] && tput cuu 1 && tput el && tput cuu 1
if [ -f "$DLLIST" ] && [ "$(wc -l "$DLLIST" | cut -d' ' -f1)" -gt 1 ]; then
display_downloadfile
eval "${_DOWNLOADER}"
fi
if [ "$_APTMGR" == "aptitude" ]; then
"${_APTMGR}" "$@"
fi
elif [ "$option" == "source" ]; then
msg
msg "Working... this may take a while." "normal"
msg "正在工作中,请稍等" "normal"
REMOVE_WORKING_MESSAGE=y
get_uris "$@"
[ -t 1 ] && [ -n "$REMOVE_WORKING_MESSAGE" ] && tput cuu 1 && tput el && tput cuu 1
if [ -f "$DLLIST" ] && [ "$(wc -l "$DLLIST" | cut -d' ' -f1)" -gt 1 ]; then
display_downloadfile
eval "${_DOWNLOADER}"
fi
# We use APT manager here to provide more verbose output. This method is
# slightly slower then extractiong packages manually after download but also
# more hardened (e.g. some options like --compile are available).
"${_APTMGR}" "${APT_SCRIPT_WARNING[@]}" "$@"
# Uncomment following snippet to extract source directly and comment
# both lines before.
#while read srcfile; do
# # extract only .dsc files
# echo "$srcfile" | grep -q '\.dsc$' || continue
# dpkg-source -x "$(basename "$srcfile")"
#done < "$DLLIST"
# Execute package manager directly if unknown options are passed.
else
"${_APTMGR}" "${APT_SCRIPT_WARNING[@]}" "$@"
fi
# After error or all done remove our lockfile (done with EXIT trap)

View File

@@ -1,125 +1,2 @@
#!/bin/bash
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell
case `arch` in
x86_64)
STORE_URL="store"
STORE_LIST_URL=""
;;
aarch64)
STORE_URL="aarch64-store"
STORE_LIST_URL="-aarch64"
;;
esac
SS_APT_FAST="/opt/durapps/spark-store/bin/apt-fast/ss-apt-fast"
is_empty_dir(){
return `ls -A $1|wc -w`
}
if [ "$(id -u)" != "0" ];then
#############################无root权限时
echo -e "\e[1;32m${TRANSHELL_CONTENT_RUNNING_IN_NOT_ROOT_USER}\e[0m"
else
ln -sf /etc/apt/sources.list.d/* /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d
###让这里和系统同步,先链接,然后清除无效链接
find /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d -xtype l -delete
fi
if [ ! -e "/tmp/aptss-conf/apt-fast.conf" ];then
###刷新apt-fast配置
mkdir -p /tmp/aptss-conf/
echo -e "\e[1;32m${TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST}\e[0m"
echo
curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
chmod -R 755 /tmp/aptss-conf
fi
if [ ! -e "/var/lib/aptss/lists/d.spark-app.store_${STORE_URL}_Packages" ] && [ ! -e "/var/lib/aptss/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages" ] && [ ! -e "/var/lib/aptss/lists/mirrors.sdu.edu.cn_spark-store-repository_${STORE_URL}_Packages" ];then
mkdir -p /tmp/aptss-conf/
echo -e "\e[1;32m${TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST}\e[0m"
echo
curl --silent -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
chmod -R 755 /tmp/aptss-conf
curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://d.store.deepinos.org.cn/sparkstore${STORE_LIST_URL}.list"
apt update -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
#只更新星火源
fi
if [ "$1" = "install" ] || [ "$1" = "upgrade" ] || [ "$1" = "full-upgrade" ] ; then
###执行
${SS_APT_FAST} "$@" --allow-downgrades -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
ret="$?"
if [ "$ret" -ne 0 ];then
echo -e "\e[1;33m$TRANSHELL_CONTENT_PLEASE_USE_APTSS_INSTEAD_OF_APT\e[0m"
fi
elif [ "$1" = "download" ];then
###执行
${SS_APT_FAST} "$@" --allow-downgrades -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
elif [ "$1" = "policy" ] || [ "$1" = "search" ];then
###执行
apt "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
elif [ "$1" = "ssupdate" ];then
mkdir -p /tmp/aptss-conf/
echo -e "\e[1;32m${TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST}\e[0m"
echo
curl --silent -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
chmod -R 755 /tmp/aptss-conf
curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://d.store.deepinos.org.cn/sparkstore${STORE_LIST_URL}.list"
apt update -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" -o Dir::Etc::sourcelist="/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list"
#只更新星火源
elif [ "$1" = "update" ];then
echo -e "\e[1;32m${TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST}\e[0m"
echo
curl --progress-bar -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://d.store.deepinos.org.cn/sparkstore${STORE_LIST_URL}.list"
mkdir -p /tmp/aptss-conf/
curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
chmod -R 755 /tmp/aptss-conf
### 额外一份拿来给aptss自动补全用
apt "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
else
apt "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
fi
host-spawn $0 $@

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
<vendor>Spark Store</vendor>
<icon_name>x-package-repository</icon_name>
<action id="store.spark-app.ssinstall">
<description>运行ssinstall需要权限</description>
<message>要使用ssinstall需要权限</message>
<defaults>
<allow_any>yes</allow_any>
<allow_inactive>yes</allow_inactive>
<allow_active>yes</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/usr/local/bin/ssinstall</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>

View File

@@ -1,28 +0,0 @@
#!/bin/bash
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell
# 检查是否传入了路径参数
if [ -z "$1" ]; then
echo "${TRANSHELL_CONTENT_PLEASE_PROVIDE_FILE_PATH}"
exit 1
fi
DESKTOP_FILE_PATH=$1
if [[ $DESKTOP_FILE_PATH == file://* ]]; then
# 如果是,移除 'file://' 部分并输出结果
DESKTOP_FILE_PATH="${DESKTOP_FILE_PATH#file://}"
fi
# 获取文件内容中Exec=后的命令
exec_command=$(grep -oP "(?<=Exec=).*" "$DESKTOP_FILE_PATH")
# 打印提取的命令
echo "$exec_command"
# 在默认终端执行命令
eval "$exec_command"
echo --------------------------------------
echo "${TRANSHELL_CONTENT_ABOVE_IS_TERMINAL_OUTPUT}"
echo "${TRANSHELL_CONTENT_PRESS_ENTER_TO_FINISH}"
read

View File

@@ -1,5 +0,0 @@
#!/bin/bash
TRANSHELL_CONTENT_PLEASE_PROVIDE_FILE_PATH="Please provide a file path as an argument"
TRANSHELL_CONTENT_ABOVE_IS_TERMINAL_OUTPUT="The above is the output executed in the terminal. Please copy and paste it when providing feedback."
TRANSHELL_CONTENT_PRESS_ENTER_TO_FINISH="Press Enter to finish"

View File

@@ -1,5 +0,0 @@
#!/bin/bash
TRANSHELL_CONTENT_PLEASE_PROVIDE_FILE_PATH="请传入文件路径作为参数"
TRANSHELL_CONTENT_ABOVE_IS_TERMINAL_OUTPUT="以上是在终端中执行的输出,请在反馈问题的时候完整复制并贴上"
TRANSHELL_CONTENT_PRESS_ENTER_TO_FINISH="按回车结束"

View File

@@ -1,13 +1,13 @@
#!/bin/bash
echo "----------------Running Spark DStore Patch----------------"
#!/bin/bash
enumAppInfoList() {
appInfoList=()
apps="/opt/apps"
list=$(ls $apps)
list=$(ls $apps 2>/dev/null)
for appID in $list; do
appInfoList+=("$appID")
done
@@ -26,17 +26,17 @@ linkDir() {
targetDir=$(dirname "$target")
find "$source" -type f | while read sourceFile; do
targetFile="$targetDir/${sourceFile#$sourceDir/}"
if [ -L "$targetFile" ] && [ "$(readlink "$targetFile")" = "$sourceFile" ]; then
continue
else
rm -f "$targetFile"
fi
ensureTargetDir "$targetFile"
ln -s "$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,62 +63,66 @@ linkApp() {
done
}
function exec_uos_package_link(){
# execute linkApp function for each app and print output
for app in $(enumAppInfoList); do
linkApp "$app" &
if [ "$1" = "--debug" ]; then
echo "Linking for $app"
fi
# remove broken links in /usr/share
done
wait
}
if [ "$1" = "--debug" ]; then
echo "Cleaning links and updating databases and caches..."
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
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
}
if [ "$1" = "--debug" ]; then
find /usr/share/applications -xtype l -delete &
find /usr/share/icons -xtype l -delete &
find /usr/share/mime/packages -xtype l -delete &
find /usr/share/glib-2.0 -xtype l -delete &
find /usr/share/dbus-1/services -xtype l -delete &
find /usr/share/fcitx -xtype l -delete &
find /usr/share/help -xtype l -delete &
find /usr/share/locale -xtype l -delete &
find /usr/lib/`dpkg-architecture -qDEB_HOST_MULTIARCH`/fcitx -xtype l -delete &
find /usr/lib/mozilla/plugins -xtype l -delete &
find /usr/share/polkit-1/actions -xtype l -delete &
find /usr/share/fonts -xtype l -delete &
find /etc/fonts/conf.d -xtype l -delete &
update-icon-caches /usr/share/icons/* &
update-desktop-database -q &
update-mime-database -V /usr/share/mime &
glib-compile-schemas /usr/share/glib-2.0/schemas/ &
wait
else
find /usr/share/applications -xtype l -delete > /dev/null 2>&1 &
find /usr/share/icons -xtype l -delete > /dev/null 2>&1 &
find /usr/share/mime/packages -xtype l -delete > /dev/null 2>&1 &
find /usr/share/glib-2.0 -xtype l -delete > /dev/null 2>&1 &
find /usr/share/dbus-1/services -xtype l -delete > /dev/null 2>&1 &
find /usr/share/fcitx -xtype l -delete > /dev/null 2>&1 &
find /usr/share/help -xtype l -delete > /dev/null 2>&1 &
find /usr/share/locale -xtype l -delete > /dev/null 2>&1 &
find /usr/lib/`dpkg-architecture -qDEB_HOST_MULTIARCH`/fcitx -xtype l -delete > /dev/null 2>&1 &
find /usr/lib/mozilla/plugins -xtype l -delete > /dev/null 2>&1 &
find /usr/share/polkit-1/actions -xtype l -delete > /dev/null 2>&1 &
find /usr/share/fonts -xtype l -delete > /dev/null 2>&1 &
find /etc/fonts/conf.d -xtype l -delete > /dev/null 2>&1 &
function exec_link_clean(){
# 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 &
find /usr/share/glib-2.0 -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
find /usr/share/dbus-1/services -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
find /usr/share/fcitx -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
find /usr/share/help -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
find /usr/share/locale -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
find /usr/lib/`dpkg-architecture -qDEB_HOST_MULTIARCH`/fcitx -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
find /usr/lib/mozilla/plugins -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
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(){
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
fi
exec_v23_icon_link
exec_link_clean
wait
exec_uos_package_update
echo "----------------Finished----------------"

View File

@@ -1,49 +1,2 @@
#!/bin/bash
#用法sender.sh 下载链接 HD70642
case `arch` in
x86_64)
STORE_URL="store"
;;
aarch64)
STORE_URL="aarch64-store"
;;
esac
if [ -z $1 ] || [ "$2" != "HD70642" ];then
echo "Segment fault"
# 假的段错误
exit -1
fi
APP_LOCATION=${1#*/$STORE_URL/}
APP_LOCATION=${APP_LOCATION%/*}
echo $APP_LOCATION
APP_METALINK_FILE_NAME=${1##*/}
#echo $APP_METALINK_FILE_NAME
PIDS=$(pidof "spark-store")
# 检查 metalink以防止未下载时刷分
if [ ! -f /tmp/spark-store/$APP_METALINK_FILE_NAME ] || [ "$PIDS" = "" ];then
sleep 1
echo "发送!成功"
exit
# 其实是发送不成功的意思lolol
fi
echo $STORE_URL/$APP_LOCATION
curl -X POST -H "Content-Type: application/json" -d '{"path": "'"${STORE_URL}/${APP_LOCATION}"'"}' http://zunyun01.store.deepinos.org.cn:38324/handle_post
echo "Finished"
host-spawn $0 $@

View File

@@ -1,50 +1,2 @@
#!/bin/bash
echo "Spark Store Audit script.星火商店审核脚本"
#################检测文件是否存在
if [ $# -eq 0 ];then
echo "没有接收到参数,退出"
echo "用法:$0 deb路径"
exit
fi
if [ ! -f "$1" ]
then
echo "文件不存在"
exit 1
fi
if [ "$(id -u)" != "0" ];then
#############################无root权限时
echo "请使用root启动ssaudit"
exit 1
fi
###
DEBPATH=`realpath $1`
echo ------------------------------------------------------------
try_run_output=$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh test-install-app "$DEBPATH")
try_run_ret="$?"
if [ "$try_run_ret" -ne 0 ]
then
echo "OMG-IT-GOES-WRONG"
echo -e "${try_run_output}"
exit "$try_run_ret"
fi
dpkg -i "$DEBPATH" || aptss install -yf
install_ret="$?"
if [ "$install_ret" -ne 0 ]
then
echo "OMG-IT-GOES-WRONG"
exit "$install_ret"
fi
echo ---------------安装结束---------------
host-spawn $0 $@

View File

@@ -1,167 +1,2 @@
#!/bin/bash
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug
case `arch` in
x86_64)
STORE_URL="store"
;;
aarch64)
STORE_URL="aarch64-store"
;;
esac
echo "Spark Store Install script.星火商店安装脚本"
function pkexec_as_current_user() {
#Detect the user using such display
local user=$(who | awk '{print $1}' | head -n 1)
#Detect the id of the user
local uid=$(id -u $user)
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus pkexec "$@"
}
function zenity()
{
#Detect the user using such display
local user=$(who | awk '{print $1}' | head -n 1)
#Detect the id of the user
local uid=$(id -u $user)
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus zenity "$@"
}
function hash_check()
{
if [ ! -e "/var/lib/aptss/lists/cdn.d.store.deepinos.org.cn_${STORE_URL}_Packages" ] && [ ! -e "/var/lib/aptss/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages" ] && [ ! -e "/var/lib/aptss/lists/mirrors.sdu.edu.cn_spark-store-repository_${STORE_URL}_Packages" ];then
echo "接收星火仓库软件信息中..."
aptss ssupdate
fi
### 选择包信息位置
if [ -e "/var/lib/aptss/lists/cdn.d.store.deepinos.org.cn_${STORE_URL}_Packages" ];then
PACKAGES_DATA_PATH="/var/lib/aptss/lists/cdn.d.store.deepinos.org.cn_${STORE_URL}_Packages"
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是星火域名单目录仓库配置"
elif [ -e "/var/lib/aptss/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages" ];then
PACKAGES_DATA_PATH="/var/lib/aptss/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages"
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是星火域名单目录仓库配置"
else
PACKAGES_DATA_PATH="/var/lib/aptss/lists/mirrors.sdu.edu.cn_spark-store-repository_${STORE_URL}_Packages"
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是SDU镜像仓库配置"
fi
echo "正在运行包验证..."
echo "Running Spark Package Verify..."
DEB_SHA512SUM=$(sha512sum "$1" | cut -d ' ' -f 1)
IS_SHA512SUM_CHECKD=`cat $PACKAGES_DATA_PATH | grep $DEB_SHA512SUM`
}
##########################################################################
#################检测文件是否存在
if [ $# -eq 0 ];then
echo "没有接收到参数,退出"
echo "用法:$0 deb路径"
echo "OMG-IT-GOES-WRONG"
exit
fi
if [ ! -f "$1" ]
then
echo "${TRANSHELL_CONTENT_FILE_NOT_EXIST}"
echo "OMG-IT-GOES-WRONG"
exit 1
fi
if [ "$(id -u)" != "0" ];then
#############################无root权限时
echo "${TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT}"
echo "OMG-IT-GOES-WRONG"
exit 1
fi
###
DEBPATH=`realpath $1`
hash_check "$DEBPATH"
if [ -z "$IS_SHA512SUM_CHECKD" ];then
echo "尝试更新仓库信息重新校验"
aptss ssupdate
hash_check "$DEBPATH"
fi
if [ ! -z "$IS_SHA512SUM_CHECKD" ];then
echo "校验成功,开始安装"
echo ----------------------------------------------------------------------------------
package_name=$(dpkg-deb -f "$DEBPATH" Package)
echo "Package name is $package_name"
try_run_output=$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh test-install-app "$DEBPATH")
try_run_ret="$?"
if [ "$try_run_ret" -ne 0 ]
then
echo "OMG-IT-GOES-WRONG"
echo -e "${try_run_output}"
exit "$try_run_ret"
fi
dpkg -i "$DEBPATH" || aptss install -yf
#### --delete
if [ "$?" = "0" ] && [ "$2" = "--delete-after-install" ];then
##check if is installed yet
if dpkg -s "$package_name" >/dev/null 2>&1; then
echo "软件包已安装:$package_name"
rm "$DEBPATH"
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
else
echo "软件包未安装:$package_name"
echo "安装异常!抛出错误"
echo "OMG-IT-GOES-WRONG"
fi
else
echo "${TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB}"
if dpkg -s "$package_name" >/dev/null 2>&1; then
echo "软件包已安装:$package_name"
else
echo "软件包未安装:$package_name"
echo "安装异常!抛出错误"
echo "OMG-IT-GOES-WRONG"
fi
fi
else
zenity --info --icon-name=spark-store --height 270 --width 500 --text "${TRANSHELL_CONTENT_HASH_CHECK_FAILED}"
echo -e ${TRANSHELL_CONTENT_HASH_CHECK_FAILED}
echo "OMG-IT-GOES-WRONG"
fi
host-spawn $0 $@

View File

@@ -0,0 +1,2 @@
#!/bin/bash
host-spawn $0 $@

View File

@@ -1,68 +1,2 @@
#!/bin/bash
if [ "$(id -u)" != "0" ] ; then
pkexec "$0" "$@"
exit
fi
case $1 in
ssupdate)
aptss ssupdate 2>&1 | tee /tmp/spark-store-app-ssupdate-log.txt
IS_SSUPDATE_ERROR=`cat /tmp/spark-store-app-ssupdate-log.txt | grep "E: "`
echo "$IS_SSUPDATE_ERROR" > /tmp/spark-store-app-ssupdate-status.txt
;;
upgradable-list)
output=$(env LANGUAGE=en_US /usr/bin/apt -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf list --upgradable -o Dir::Etc::sourcelist="/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="/dev/null" -o APT::Get::List-Cleanup="0" | awk NR\>1)
IFS_OLD="$IFS"
IFS=$'\n'
for line in $output ; do
PKG_NAME=$(echo $line | awk -F '/' '{print $1}')
PKG_NEW_VER=$(echo $line | awk -F ' ' '{print $2}')
PKG_CUR_VER=$(echo $line | awk -F ' ' '{print $6}' | awk -F ']' '{print $1}')
echo "${PKG_NAME} ${PKG_NEW_VER} ${PKG_CUR_VER}"
done
IFS="$IFS_OLD"
;;
upgrade-app)
aptss install "${@:2}" --only-upgrade 2>&1 | tee /tmp/spark-store-app-upgrade-log.txt
IS_UPGRADE_ERROR=`cat /tmp/spark-store-app-upgrade-log.txt | grep "Package manager quit with exit code."`
echo "$IS_UPGRADE_ERROR" > /tmp/spark-store-app-upgrade-status.txt
;;
test-install-app)
try_run_output=$(aptss --dry-run install $2)
try_run_ret="$?"
if [ "$try_run_ret" -ne 0 ]
then
echo "Package manager quit with exit code.Here is the log"
echo "包管理器以错误代码退出.日志如下"
echo
echo -e "${try_run_output}"
echo "Will try after run aptss update"
echo "将会在aptss update之后再次尝试"
aptss update
echo ----------------------------------------------------------------------------
try_run_output=$(aptss --dry-run install $2)
try_run_ret="$?"
if [ "$try_run_ret" -ne 0 ]
then
echo "Package manager quit with exit code.Here is the log"
echo "包管理器以错误代码退出.日志如下"
echo
echo -e "${try_run_output}"
exit "$try_run_ret"
fi
fi
exit 0
;;
clean-log)
rm -f /tmp/spark-store-app-ssupdate-status.txt /tmp/spark-store-app-ssupdate-log.txt /tmp/spark-store-app-upgrade-log.txt /tmp/spark-store-app-upgrade-status.txt
;;
esac
host-spawn $0 $@

View File

@@ -1,87 +1,2 @@
#!/bin/bash
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug
touch /tmp/spark-store/upgradeStatus.txt
# 执行 apt update
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh ssupdate | zenity --progress --auto-close --pulsate --no-cancel --text="${TRANSHELL_CONTENT_UPDATE_CHEKING_PLEASE_WAIT}" --height 70 --width 400 --title="${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
if [ -z `cat /tmp/spark-store-app-ssupdate-status.txt` ] ; then
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
else
zenity --error --text "${TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
zenity --text-info --filename=/tmp/spark-store-app-ssupdate-log.txt --checkbox="${TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK}" --title="${TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
rm -f /tmp/spark-store/upgradeStatus.txt
exit
fi
# 获取可更新应用列表
PKG_LIST="$(pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgradable-list)"
## 如果没更新,就弹出不需要更新
if [ -z "$PKG_LIST" ] ; then
zenity --info --text "${TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else
## 获取用户选择的要更新的应用
### 指定分隔符为 \n
IFS_OLD="$IFS"
IFS=$'\n'
PKG_UPGRADE_LIST=`for line in $PKG_LIST ; do
PKG_NAME=$(echo $line | awk -F ' ' '{print $1}')
PKG_NEW_VER=$(echo $line | awk -F ' ' '{print $2}')
PKG_CUR_VER=$(echo $line | awk -F ' ' '{print $3}')
dpkg --compare-versions $PKG_NEW_VER le $PKG_CUR_VER
if [ $? -eq 0 ] ; then
continue
fi
#### 检测是否是 hold 状态
PKG_STA=$(dpkg-query -W -f='${db:Status-Want}' $PKG_NAME)
if [ "$PKG_STA" != "hold" ] ; then
echo "true"
echo "$PKG_NAME"
echo "$PKG_NEW_VER"
echo "$PKG_CUR_VER"
else
echo "false"
echo "$PKG_NAME${TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD}"
echo "$PKG_NEW_VER"
echo "$PKG_CUR_VER"
fi
done`
### 还原分隔符
IFS="$IFS_OLD"
## 如果没有应用需要更新,则直接退出
if [ -z "$PKG_UPGRADE_LIST" ] ; then
zenity --info --text "${TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else
PKG_UPGRADE_LIST=$(echo "$PKG_UPGRADE_LIST" | zenity --list --text="${TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE}" --column="${TRANSHELL_CONTENT_CHOOSE}" --column="${TRANSHELL_CONTENT_PKG_NAME}" --column="${TRANSHELL_CONTENT_NEW_VERSION}" --column="${TRANSHELL_CONTENT_UPGRADE_FROM}" --separator=" " --checklist --multiple --print-column=2 --height 350 --width 550 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg)
## 如果没有选择,则直接退出
if [ -z "$PKG_UPGRADE_LIST" ] ; then
zenity --info --text "${TRANSHELL_CONTENT_NO_APP_IS_CHOSEN}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else
### 更新用户选择的应用
for PKG_UPGRADE in $PKG_UPGRADE_LIST;do
update_transhell
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgrade-app $PKG_UPGRADE -y | zenity --progress --auto-close --no-cancel --pulsate --text="${TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT}" --height 70 --width 400 --title="${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
done
#### 更新成功
if [ -z "`cat /tmp/spark-store-app-upgrade-status.txt`" ] ; then
zenity --info --text "${TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else
#### 更新异常
zenity --error --text "${TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
zenity --text-info --filename=/tmp/spark-store-app-upgrade-log.txt --checkbox="${TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK}" --title="${TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
fi
fi
fi
fi
rm -f /tmp/spark-store/upgradeStatus.txt
# 从最开头
host-spawn $0 $@

View File

@@ -1,45 +1,2 @@
#!/bin/bash
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug
endloop=0
#####################检测是否启动过了更新检测工具
while [ $endloop -eq 0 ] ;do
if [ ! -e $HOME/.config/spark-union/spark-store/ssshell-config-do-not-show-upgrade-notify ];then
text_update_open="${TRANSHELL_CONTENT_CLOSE}"
#已经开启了就显示关闭
else
text_update_open="${TRANSHELL_CONTENT_OPEN}"
fi
update_transhell
option=`zenity --list --text="${TRANSHELL_CONTENT_WELCOME_AND_CHOOSE_ONE_TO_RUN}" --column 数字 --column=${TRANSHELL_CONTENT_OPTIONS} --print-column=2 --height 350 --width 760 0 "${TRANSHELL_CONTENT_OPEN_OR_CLOSE_UPGRADE_CHECK}" 1 "${TRANSHELL_CONTENT_CHECK_FOR_UPDATE}" 2 "${TRANSHELL_CONTENT_EXIT}" --hide-column=1 --print-column=1`
case $option in
0)
if [ ! -e $HOME/.config/spark-union/spark-store/ssshell-config-do-not-show-upgrade-notify ];then
mkdir -p $HOME/.config/spark-union/spark-store/
touch $HOME/.config/spark-union/spark-store/ssshell-config-do-not-show-upgrade-notify
zenity --info --icon-name=spark-store --height 150 --width 200 --text "${TRANSHELL_CONTENT_CLOSED}" --timeout=2
else
rm -f $HOME/.config/spark-union/spark-store/ssshell-config-do-not-show-upgrade-notify
zenity --info --icon-name=spark-store --height 150 --width 200 --text "${TRANSHELL_CONTENT_OPENED}" --timeout=2
fi
;;
1)
/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh
;;
2)
exit 0
;;
*)
exit 0
esac
done
host-spawn $0 $@

View File

@@ -1,123 +1,2 @@
#!/bin/bash
LANGUAGE=en_US
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug
#############################################################
# 发送通知
function notify-send() {
# Detect user using the display
local user=$(who | awk '{print $1}' | head -n 1)
# Detect uid of the user
local uid=$(id -u $user)
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${uid}/bus notify-send "$@"
}
# 检测网络链接畅通
function network-check()
{
# 超时时间
local timeout=15
# 目标网站
local target=www.baidu.com
# 获取响应状态码
local ret_code=`curl -I -s --connect-timeout ${timeout} ${target} -w %{http_code} | tail -n1`
if [ "x$ret_code" = "x200" ] ; then
# 网络畅通
return 0
else
# 网络不畅通
return 1
fi
}
network-check
if [ $? -ne 0 ] ; then
echo "$TRANSHELL_CONTENT_NETWORK_FAIL"
exit -1
fi
# The code above is modified from https://blog.csdn.net/yaxuan88521/article/details/120516298
# 每日更新星火源文件
aptss update
updatetext=`aptss ssupdate 2>&1`
until [ "`echo $updatetext | grep E: `" = "" ];do
echo "${TRANSHELL_CONTENT_UPDATE_ERROR_AND_WAIT_15_SEC}"
sleep 15
updatetext=`aptss ssupdate 2>&1`
done
isupdate=`echo ${updatetext: -5}`
if [ "$isupdate" = "date." ] ; then
exit 0
fi
## 从这里开始,只有检测到了更新才会进行
update_app_number=`echo ${updatetext%package*} #从右向左截取第一个 src 后的字符串`
update_app_number=`echo ${update_app_number##*information...}`
# 获取用户选择的要更新的应用
PKG_LIST="$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgradable-list)"
# 指定分隔符为 \n
IFS_OLD="$IFS"
IFS=$'\n'
for line in $PKG_LIST ; do
PKG_NAME=$(echo $line | awk -F ' ' '{print $1}')
PKG_NEW_VER=$(echo $line | awk -F ' ' '{print $2}')
PKG_CUR_VER=$(echo $line | awk -F ' ' '{print $3}')
dpkg --compare-versions $PKG_NEW_VER le $PKG_CUR_VER
if [ $? -eq 0 ] ; then
let update_app_number=$update_app_number-1
continue
fi
## 检测是否是 hold 状态
PKG_STA=$(dpkg-query -W -f='${db:Status-Want}' $PKG_NAME)
if [ "$PKG_STA" = "hold" ] ; then
let update_app_number=$update_app_number-1
fi
done
# 还原分隔符
IFS="$IFS_OLD"
if [ $update_app_number -le 0 ] ; then
exit 0
fi
update_transhell
## 如果都是hold或者版本一致的那就直接退出否则把剩余的给提醒了
##TODO:除了apt-mark hold之外额外有一个禁止检查列表
## 如果不想提示就不提示
user=$(who | awk '{print $1}' | head -n 1)
if [ -e "/home/$user/.config/spark-union/spark-store/ssshell-config-do-not-show-upgrade-notify" ];then
echo "他不想站在世界之巅,好吧"
echo "Okay he don't want to be at the top of the world, okay"
exit
else
notify-send -a spark-store "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_NOTIFY}" "${TRANSHELL_CONTENT_THERE_ARE_APPS_TO_UPGRADE}"
fi
host-spawn $0 $@

View File

@@ -4,14 +4,15 @@ TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL="Spark Store APP Upgrade module"
TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="Error occured in checking for update! Press Confirm to get the error log (Can be useful when feedback)"
TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK="I already copied the log in the text box and I will attach it when feeding back. You can find feedback entry in the settings which is located in the top right of the store."
TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS="Feedback entry in the settings which is located in the top right of the store"
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="All APPs are up to date.\nBut you are not at the top of the world"
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="All APPs are up to date."
TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD="Unable to upgrade: Being marked as hold"
TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE="Choose the app you want to upgrade"
TRANSHELL_CONTENT_CHOOSE="Choose"
TRANSHELL_CONTENT_PKG_NAME="Pkg name"
TRANSHELL_CONTENT_APP_NAME="APP name"
TRANSHELL_CONTENT_PKG_NAME="Package Name"
TRANSHELL_CONTENT_NEW_VERSION="New version"
TRANSHELL_CONTENT_UPGRADE_FROM="Upgrade from"
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="No app is chosen\nBut you are not at the top of the world"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="Upgrading $PKG_UPGRADE , please wait..."
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="No app is chosen"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="Upgrading $APP_UPGRADE , please wait..."
TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED="The chosen app is upgraded"
TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="Error occured when upgrading! Press Confirm to get the error log (Can be useful when feedback)"

View File

@@ -4,14 +4,15 @@ TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL="星火商店更新模块"
TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="检查更新进程出现错误!按确定查看报错,可用于反馈"
TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK="我已复制了此文本框中的日志,且将会在反馈时附上。反馈渠道可以在右上角菜单的设置中找到"
TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS="反馈渠道在商店右上角的设置里"
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="没有软件需要更新\n但是你并没有站在世界之巅"
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="没有软件需要更新"
TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD="(无法更新:已被标记为保留)"
TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE="选择你想更新的应用"
TRANSHELL_CONTENT_CHOOSE="选择"
TRANSHELL_CONTENT_APP_NAME="应用名"
TRANSHELL_CONTENT_PKG_NAME="包名"
TRANSHELL_CONTENT_NEW_VERSION="新版本"
TRANSHELL_CONTENT_UPGRADE_FROM="从该版本更新"
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="没有选中任何软件\n但是你并没有站在世界之巅"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="正在更新 $PKG_UPGRADE ,请稍候..."
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="没有选中任何软件"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="正在更新 $APP_UPGRADE ,请稍候..."
TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED="选中的软件已经更新完毕"
TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="更新出现错误!按确定查看报错,可用于反馈"

View File

@@ -4,14 +4,15 @@ TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL="星火商店更新模塊"
TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="檢查更新行程出現錯誤! 按確定查看報錯,可用於回報"
TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK="我已複製了此文字方塊中的日誌,且將會在回報時附上。 迴響通路可以在右上角選單的設定中找到 "
TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS="回報入口在商店右上角的設定裏"
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="沒有軟體需要更新\n但是你並沒有站在世界之巔"
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="沒有軟體需要更新"
TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD="(无法更新:已被标记为保留)"
TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE="选择你想更新的应用"
TRANSHELL_CONTENT_CHOOSE="选择"
TRANSHELL_CONTENT_APP_NAME="应用名"
TRANSHELL_CONTENT_PKG_NAME="包名"
TRANSHELL_CONTENT_NEW_VERSION="新版本"
TRANSHELL_CONTENT_UPGRADE_FROM="从该版本更新"
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="没有选中任何軟體\n但是你並沒有站在世界之巔"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="正在更新 $PKG_UPGRADE ,请稍候..."
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="没有选中任何軟體"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="正在更新 $APP_UPGRADE ,请稍候..."
TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED="选中的軟體已经更新完毕"
TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="更新出现错误!按确定查看报错,可用于反馈"

View File

@@ -1,12 +1,14 @@
#!/bin/bash
TRANSHELL_CONTENT_CLOSE="Close"
TRANSHELL_CONTENT_OPEN="Open"
TRANSHELL_CONTENT_CLOSE="Disable"
TRANSHELL_CONTENT_OPEN="Enable"
TRANSHELL_CONTENT_WELCOME_AND_CHOOSE_ONE_TO_RUN="Welcome to Spark Store APP Upgrade Settings\nPlease choose one option to run"
TRANSHELL_CONTENT_OPTIONS="Options"
TRANSHELL_CONTENT_OPEN_OR_CLOSE_UPGRADE_CHECK="$text_update_open Spark Store APP upgrade check. (Will notify APP upgrade at start up if opened.)"
TRANSHELL_CONTENT_CHECK_FOR_UPDATE="Check Upgradable app list."
TRANSHELL_CONTENT_EXIT="Exit"
TRANSHELL_CONTENT_CLOSING_UPGRADE_CHECK="Please authorize to close APP upgrade check"
TRANSHELL_CONTENT_CLOSED="Closed"
TRANSHELL_CONTENT_CLOSED="Disabled"
TRANSHELL_CONTENT_OPENING_UPGRADE_CHECK="Please authorize to open APP upgrade check"
TRANSHELL_CONTENT_OPENED="Opened"
TRANSHELL_CONTENT_OPENED="Enabled"
TRANSHELL_CONTENT_CLOSE_CREATE_DESKTOP="Disable auto create desktop shortcut"
TRANSHELL_CONTENT_OPEN_CREATE_DESKTOP="Enable auto create desktop shortcut"

View File

@@ -10,3 +10,5 @@ TRANSHELL_CONTENT_CLOSING_UPGRADE_CHECK="执行关闭自动更新检测,请授
TRANSHELL_CONTENT_CLOSED="已关闭"
TRANSHELL_CONTENT_OPENING_UPGRADE_CHECK="执行启动自动更新检测,请授权"
TRANSHELL_CONTENT_OPENED="已开启"
TRANSHELL_CONTENT_CLOSE_CREATE_DESKTOP="关闭自动创建桌面启动器"
TRANSHELL_CONTENT_OPEN_CREATE_DESKTOP="开启自动创建桌面启动器"

View File

@@ -10,3 +10,5 @@ TRANSHELL_CONTENT_CLOSING_UPGRADE_CHECK="执行关闭自动更新检测,请授
TRANSHELL_CONTENT_CLOSED="已关闭"
TRANSHELL_CONTENT_OPENING_UPGRADE_CHECK="执行启动自动更新检测,请授权"
TRANSHELL_CONTENT_OPENED="已开启"
TRANSHELL_CONTENT_CLOSE_CREATE_DESKTOP="关闭自动创建桌面启动器"
TRANSHELL_CONTENT_OPEN_CREATE_DESKTOP="开启自动创建桌面启动器"

View File

@@ -8,14 +8,6 @@
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="175"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="483"/>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
@@ -118,20 +110,29 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="765"/>
<location filename="../src/pages/appintopage.ui" line="768"/>
<source>Introduction</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<location filename="../src/pages/appintopage.ui" line="1071"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="903"/>
<location filename="../src/pages/appintopage.ui" line="906"/>
<source>Screen capture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="192"/>
<location filename="../src/pages/appintopage.cpp" line="330"/>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="518"/>
<source>Download and Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
@@ -145,109 +146,109 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1161"/>
<location filename="../src/pages/appintopage.ui" line="1164"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<location filename="../src/pages/appintopage.ui" line="1193"/>
<source>Contributor</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1197"/>
<location filename="../src/pages/appintopage.ui" line="1200"/>
<source>Pkgname</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<location filename="../src/pages/appintopage.ui" line="1306"/>
<source>Author</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<location filename="../src/pages/appintopage.ui" line="1342"/>
<source>Size</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<location filename="../src/pages/appintopage.ui" line="1378"/>
<source>Website</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="51"/>
<location filename="../src/pages/appintopage.cpp" line="53"/>
<source>Click Open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="114"/>
<location filename="../src/pages/appintopage.cpp" line="126"/>
<source>Developer Mode Disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="456"/>
<location filename="../src/pages/appintopage.cpp" line="177"/>
<location filename="../src/pages/appintopage.cpp" line="357"/>
<location filename="../src/pages/appintopage.cpp" line="490"/>
<source>Reinstall</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="167"/>
<location filename="../src/pages/appintopage.cpp" line="184"/>
<source>Upgrade</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="335"/>
<location filename="../src/pages/appintopage.cpp" line="466"/>
<source>Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<location filename="../src/pages/appintopage.cpp" line="340"/>
<source>Installing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<source>The current application does not support deepin, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<source>The current application does not support UOS, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<source>The current application does not support Ubuntu, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<source>The current application does not support current platform, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<source>Uninstall succeeded</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>The URL has been copied to the clipboard</source>
<translation type="unfinished"></translation>
</message>
@@ -268,16 +269,24 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="139"/>
<location filename="../src/application.cpp" line="142"/>
<source>Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="149"/>
<location filename="../src/application.cpp" line="152"/>
<source>%1 is released under %2</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DownloadController</name>
<message>
<location filename="../src/backend/downloadworker.cpp" line="180"/>
<source>Download Failed, please retry :(</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
@@ -366,7 +375,7 @@
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="238"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="239"/>
<source>dpkg progress had been abortedplease check the install info or try to reinstall.</source>
<source>dpkg progress had been aborted, please check the install info or try to reinstall.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -472,33 +481,33 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="187"/>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<source>Submit App</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="188"/>
<location filename="../src/mainwindow-dtk.cpp" line="191"/>
<source>Submit App with client(Recommanded)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="189"/>
<location filename="../src/mainwindow-dtk.cpp" line="192"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<location filename="../src/mainwindow-dtk.cpp" line="193"/>
<source>APP Upgrade and Install Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="146"/>
<location filename="../src/mainwindow-dtk.cpp" line="241"/>
<location filename="../src/mainwindow-dtk.cpp" line="147"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="151"/>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<source>Search or enter spk://</source>
<translation type="unfinished"></translation>
</message>
@@ -506,19 +515,19 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<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="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<location filename="../src/application.cpp" line="41"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;Professional application distribution solution&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Flamescion (Shenyang) Computer Software Development Co., Ltd.&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="146"/>
<location filename="../src/application.cpp" line="149"/>
<source>Spark Project</source>
<translation type="unfinished"></translation>
</message>
@@ -528,7 +537,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<source>Show MainWindow</source>
<translation type="unfinished"></translation>
</message>
@@ -627,22 +636,21 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="359"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;We are &lt;span style=&quot; font-weight:600;&quot;&gt;NOT&lt;/span&gt; the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &amp;quot;Spark Store&amp;quot;! &amp;quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. &lt;/p&gt;&lt;p&gt;We don&apos;t make a profit from this, all developers and maintainers don&apos;t get paid, and we rely on the community&apos;s donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. &lt;/p&gt;&lt;p&gt;Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. &lt;/p&gt;&lt;p&gt;If any part of the store infringes your rights, please tell us &lt;a href=&quot;mailto:jifengshenmo@outlook.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;jifengshenmo@outlook.com&lt;/span&gt;&lt;/a&gt; we will remove the infringing content as soon as possible. &lt;/p&gt;&lt;p&gt;If you&apos;d like to get involved with us too, whether you&apos;re involved in development, design, pitching or submitting work, we welcome you to join us. &lt;/p&gt;
&lt;p&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;&lt;br/&gt;&lt;/span&gt;Our contact method can be found at &lt;a href=&quot;https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;Here&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to this entity and its subsidiaries.&lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="217"/>
<location filename="../src/pages/settingspage.cpp" line="214"/>
<source>Updating, please wait...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<source>Temporary cache was cleaned</source>
<translation type="unfinished"></translation>
</message>
@@ -650,12 +658,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="245"/>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="246"/>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<source>Exit</source>
<translation type="unfinished"></translation>
</message>

View File

@@ -8,14 +8,6 @@
<source>Form</source>
<translation>Tipo</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="175"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="483"/>
<source>Download</source>
<translation>Descargar</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
@@ -118,20 +110,29 @@
<translation>Comentarios de la app</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="765"/>
<location filename="../src/pages/appintopage.ui" line="768"/>
<source>Introduction</source>
<translation>Introducción</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<location filename="../src/pages/appintopage.ui" line="1071"/>
<source>Description</source>
<translation>Descripción</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="903"/>
<location filename="../src/pages/appintopage.ui" line="906"/>
<source>Screen capture</source>
<translation>Captura de pantalla</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="192"/>
<location filename="../src/pages/appintopage.cpp" line="330"/>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="518"/>
<source>Download and Install</source>
<translation>Descargar e instalar</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
@@ -145,109 +146,109 @@
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;La aplicación wine. Spark Store configurará automáticamente el kit Wine para usted&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1161"/>
<location filename="../src/pages/appintopage.ui" line="1164"/>
<source>Update</source>
<translation>Modernizar</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<location filename="../src/pages/appintopage.ui" line="1193"/>
<source>Contributor</source>
<translation>Contribuyentes</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1197"/>
<location filename="../src/pages/appintopage.ui" line="1200"/>
<source>Pkgname</source>
<translation>Nombre del embalaje</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<location filename="../src/pages/appintopage.ui" line="1306"/>
<source>Author</source>
<translation>Autor</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<location filename="../src/pages/appintopage.ui" line="1342"/>
<source>Size</source>
<translation>Tamaño</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<location filename="../src/pages/appintopage.ui" line="1378"/>
<source>Website</source>
<translation>Sitio web</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="51"/>
<location filename="../src/pages/appintopage.cpp" line="53"/>
<source>Click Open</source>
<translation>Haga clic en &quot;abrir&quot;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="114"/>
<location filename="../src/pages/appintopage.cpp" line="126"/>
<source>Developer Mode Disabled</source>
<translation>Se ha desactivado el modo desarrollador</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="456"/>
<location filename="../src/pages/appintopage.cpp" line="177"/>
<location filename="../src/pages/appintopage.cpp" line="357"/>
<location filename="../src/pages/appintopage.cpp" line="490"/>
<source>Reinstall</source>
<translation>Reinstalación</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="167"/>
<location filename="../src/pages/appintopage.cpp" line="184"/>
<source>Upgrade</source>
<translation>Actualización</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="335"/>
<location filename="../src/pages/appintopage.cpp" line="466"/>
<source>Install</source>
<translation>Instalación</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<location filename="../src/pages/appintopage.cpp" line="340"/>
<source>Installing</source>
<translation>Se está instalando</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<source>Warning</source>
<translation>Aviso</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<source>The current application does not support deepin, there may be problems</source>
<translation>La aplicación actual no admite deepin, puede haber problemas</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<source>The current application does not support UOS, there may be problems</source>
<translation>La aplicación actual no admite uos, puede haber problemas</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<source>The current application does not support Ubuntu, there may be problems</source>
<translation>La aplicación actual no admite ubuntu, puede haber problemas</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<source>The current application does not support current platform, there may be problems</source>
<translation>La aplicación actual no admite la Plataforma actual, puede haber problemas</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>Spark Store</source>
<translation>SPARK Store</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<source>Uninstall succeeded</source>
<translation>Desinstalación exitosa</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>The URL has been copied to the clipboard</source>
<translation>La URL ha sido copiada al portapapeles</translation>
</message>
@@ -268,16 +269,24 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="139"/>
<location filename="../src/application.cpp" line="142"/>
<source>Version: %1</source>
<translation>Versión %1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="149"/>
<location filename="../src/application.cpp" line="152"/>
<source>%1 is released under %2</source>
<translation>%1 publicado bajo %2</translation>
</message>
</context>
<context>
<name>DownloadController</name>
<message>
<location filename="../src/backend/downloadworker.cpp" line="180"/>
<source>Download Failed, please retry :(</source>
<translation>Descarga fall, por favor vuelva a intentarlo</translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
@@ -366,8 +375,8 @@
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="238"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="239"/>
<source>dpkg progress had been abortedplease check the install info or try to reinstall.</source>
<translation>El proceso dpkg ha sido abortado, verifique la información de instalación o intente reinstalarlo.</translation>
<source>dpkg progress had been aborted, please check the install info or try to reinstall.</source>
<translation>El proceso de DPKG ha sido interrumpido, compruebe la información de instalación o intente reinstalar.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
@@ -472,33 +481,33 @@
<translation>Actualización de app</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="187"/>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<source>Submit App</source>
<translation>Presentación de la aplicación</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="188"/>
<location filename="../src/mainwindow-dtk.cpp" line="191"/>
<source>Submit App with client(Recommanded)</source>
<translation>Enviar la aplicación al cliente (recomendación)</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="189"/>
<location filename="../src/mainwindow-dtk.cpp" line="192"/>
<source>Settings</source>
<translation>Configuración</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<location filename="../src/mainwindow-dtk.cpp" line="193"/>
<source>APP Upgrade and Install Settings</source>
<translation>Actualización e instalación de app</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="146"/>
<location filename="../src/mainwindow-dtk.cpp" line="241"/>
<location filename="../src/mainwindow-dtk.cpp" line="147"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<source>Spark Store</source>
<translation>SPARK Store</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="151"/>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<source>Search or enter spk://</source>
<translation>Buscar o introducir spk: /%</translation>
</message>
@@ -506,19 +515,23 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<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="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</translation>
<location filename="../src/application.cpp" line="41"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;Professional application distribution solution&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Flamescion (Shenyang) Computer Software Development Co., Ltd.&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="146"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="vanished">&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</translation>
</message>
<message>
<location filename="../src/application.cpp" line="149"/>
<source>Spark Project</source>
<translation>Proyecto spark</translation>
</message>
@@ -528,7 +541,7 @@
<translation>Descargar lista</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<source>Show MainWindow</source>
<translation>Mostrar la ventana principal</translation>
</message>
@@ -627,22 +640,21 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="359"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;We are &lt;span style=&quot; font-weight:600;&quot;&gt;NOT&lt;/span&gt; the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &amp;quot;Spark Store&amp;quot;! &amp;quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. &lt;/p&gt;&lt;p&gt;We don&apos;t make a profit from this, all developers and maintainers don&apos;t get paid, and we rely on the community&apos;s donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. &lt;/p&gt;&lt;p&gt;Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. &lt;/p&gt;&lt;p&gt;If any part of the store infringes your rights, please tell us &lt;a href=&quot;mailto:jifengshenmo@outlook.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;jifengshenmo@outlook.com&lt;/span&gt;&lt;/a&gt; we will remove the infringing content as soon as possible. &lt;/p&gt;&lt;p&gt;If you&apos;d like to get involved with us too, whether you&apos;re involved in development, design, pitching or submitting work, we welcome you to join us. &lt;/p&gt;
&lt;p&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;&lt;br/&gt;&lt;/span&gt;Our contact method can be found at &lt;a href=&quot;https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;Here&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to this entity and its subsidiaries.&lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="217"/>
<location filename="../src/pages/settingspage.cpp" line="214"/>
<source>Updating, please wait...</source>
<translation>Se está actualizando, por favor Espere...</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<source>Spark Store</source>
<translation>SPARK Store</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<source>Temporary cache was cleaned</source>
<translation>Se ha limpiado la caché temporal</translation>
</message>
@@ -650,12 +662,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="245"/>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<source>About</source>
<translation>Sobre</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="246"/>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<source>Exit</source>
<translation>Exportaciones</translation>
</message>

View File

@@ -8,14 +8,6 @@
<source>Form</source>
<translation>Type</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="175"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="483"/>
<source>Download</source>
<translation>Télécharger</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
@@ -118,20 +110,29 @@
<translation>App feedback</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="765"/>
<location filename="../src/pages/appintopage.ui" line="768"/>
<source>Introduction</source>
<translation>Présentation</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<location filename="../src/pages/appintopage.ui" line="1071"/>
<source>Description</source>
<translation>Description</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="903"/>
<location filename="../src/pages/appintopage.ui" line="906"/>
<source>Screen capture</source>
<translation>Captures d&apos;écran</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="192"/>
<location filename="../src/pages/appintopage.cpp" line="330"/>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="518"/>
<source>Download and Install</source>
<translation>Télécharger et installer</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
@@ -145,109 +146,109 @@
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;L&apos;application wine. Spark Store configure automatiquement le kit Wine pour vous&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1161"/>
<location filename="../src/pages/appintopage.ui" line="1164"/>
<source>Update</source>
<translation>Moderniser</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<location filename="../src/pages/appintopage.ui" line="1193"/>
<source>Contributor</source>
<translation>Contributeurs</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1197"/>
<location filename="../src/pages/appintopage.ui" line="1200"/>
<source>Pkgname</source>
<translation>Nom de l&apos;emballage</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<location filename="../src/pages/appintopage.ui" line="1306"/>
<source>Author</source>
<translation>Auteur</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<location filename="../src/pages/appintopage.ui" line="1342"/>
<source>Size</source>
<translation>Taille</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<location filename="../src/pages/appintopage.ui" line="1378"/>
<source>Website</source>
<translation>Site Web</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="51"/>
<location filename="../src/pages/appintopage.cpp" line="53"/>
<source>Click Open</source>
<translation>Cliquez sur Ouvrir</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="114"/>
<location filename="../src/pages/appintopage.cpp" line="126"/>
<source>Developer Mode Disabled</source>
<translation>Mode développeur désactivé</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="456"/>
<location filename="../src/pages/appintopage.cpp" line="177"/>
<location filename="../src/pages/appintopage.cpp" line="357"/>
<location filename="../src/pages/appintopage.cpp" line="490"/>
<source>Reinstall</source>
<translation>Réinstaller</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="167"/>
<location filename="../src/pages/appintopage.cpp" line="184"/>
<source>Upgrade</source>
<translation>Mise à niveau</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="335"/>
<location filename="../src/pages/appintopage.cpp" line="466"/>
<source>Install</source>
<translation>Installation</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<location filename="../src/pages/appintopage.cpp" line="340"/>
<source>Installing</source>
<translation>Installation en cours</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<source>Warning</source>
<translation>Avertissement</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<source>The current application does not support deepin, there may be problems</source>
<translation>L&apos;application actuelle ne supporte pas deepin, il peut y avoir un problème</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<source>The current application does not support UOS, there may be problems</source>
<translation>L&apos;application actuelle ne prend pas en charge uos, il peut y avoir un problème</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<source>The current application does not support Ubuntu, there may be problems</source>
<translation>L&apos;application actuelle ne supporte pas Ubuntu, il peut y avoir un problème</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<source>The current application does not support current platform, there may be problems</source>
<translation>L&apos;application actuelle ne prend pas en charge la plate - forme actuelle, il peut y avoir un problème</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>Spark Store</source>
<translation>Le Spark store</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<source>Uninstall succeeded</source>
<translation>Désinstallation réussie</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>The URL has been copied to the clipboard</source>
<translation>L&apos;URL a é copiée dans le presse - papiers</translation>
</message>
@@ -268,16 +269,24 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="139"/>
<location filename="../src/application.cpp" line="142"/>
<source>Version: %1</source>
<translation>Version: %1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="149"/>
<location filename="../src/application.cpp" line="152"/>
<source>%1 is released under %2</source>
<translation>%1 publié sous %2</translation>
</message>
</context>
<context>
<name>DownloadController</name>
<message>
<location filename="../src/backend/downloadworker.cpp" line="180"/>
<source>Download Failed, please retry :(</source>
<translation>Le téléchargement a échoué, veuillez réessayer</translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
@@ -366,8 +375,8 @@
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="238"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="239"/>
<source>dpkg progress had been abortedplease check the install info or try to reinstall.</source>
<translation>Le processus dpkg a é abandonné, vérifiez les informations d&apos;installation ou essayez de le réinstaller.</translation>
<source>dpkg progress had been aborted, please check the install info or try to reinstall.</source>
<translation>La progression de DPKG a é interrompue, veuillez vérifier les informations dinstallation ou essayer de réinstaller.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
@@ -472,33 +481,33 @@
<translation>Mise à niveau app</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="187"/>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<source>Submit App</source>
<translation>Soumettre une application</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="188"/>
<location filename="../src/mainwindow-dtk.cpp" line="191"/>
<source>Submit App with client(Recommanded)</source>
<translation>Soumettre une demande au client (recommandé)</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="189"/>
<location filename="../src/mainwindow-dtk.cpp" line="192"/>
<source>Settings</source>
<translation>Paramètres</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<location filename="../src/mainwindow-dtk.cpp" line="193"/>
<source>APP Upgrade and Install Settings</source>
<translation>Paramètres de mise à niveau et d&apos;installation de l&apos;app</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="146"/>
<location filename="../src/mainwindow-dtk.cpp" line="241"/>
<location filename="../src/mainwindow-dtk.cpp" line="147"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<source>Spark Store</source>
<translation>Le Spark store</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="151"/>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<source>Search or enter spk://</source>
<translation>Rechercher ou entrer SPK /</translation>
</message>
@@ -506,19 +515,23 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<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="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</translation>
<location filename="../src/application.cpp" line="41"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;Professional application distribution solution&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Flamescion (Shenyang) Computer Software Development Co., Ltd.&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="146"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="vanished">&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</translation>
</message>
<message>
<location filename="../src/application.cpp" line="149"/>
<source>Spark Project</source>
<translation>Le projet Spark</translation>
</message>
@@ -528,7 +541,7 @@
<translation>Télécharger la Liste</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<source>Show MainWindow</source>
<translation>Afficher la fenêtre principale</translation>
</message>
@@ -627,22 +640,21 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="359"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;We are &lt;span style=&quot; font-weight:600;&quot;&gt;NOT&lt;/span&gt; the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &amp;quot;Spark Store&amp;quot;! &amp;quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. &lt;/p&gt;&lt;p&gt;We don&apos;t make a profit from this, all developers and maintainers don&apos;t get paid, and we rely on the community&apos;s donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. &lt;/p&gt;&lt;p&gt;Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. &lt;/p&gt;&lt;p&gt;If any part of the store infringes your rights, please tell us &lt;a href=&quot;mailto:jifengshenmo@outlook.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;jifengshenmo@outlook.com&lt;/span&gt;&lt;/a&gt; we will remove the infringing content as soon as possible. &lt;/p&gt;&lt;p&gt;If you&apos;d like to get involved with us too, whether you&apos;re involved in development, design, pitching or submitting work, we welcome you to join us. &lt;/p&gt;
&lt;p&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;&lt;br/&gt;&lt;/span&gt;Our contact method can be found at &lt;a href=&quot;https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;Here&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to this entity and its subsidiaries.&lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="217"/>
<location filename="../src/pages/settingspage.cpp" line="214"/>
<source>Updating, please wait...</source>
<translation>Mise à jour en cours, veuillez patienter...</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<source>Spark Store</source>
<translation>Le Spark store</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<source>Temporary cache was cleaned</source>
<translation>Cache temporaire nettoyé</translation>
</message>
@@ -650,12 +662,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="245"/>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<source>About</source>
<translation>À propos</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="246"/>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<source>Exit</source>
<translation>Exportations</translation>
</message>

View File

@@ -8,14 +8,6 @@
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="175"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="483"/>
<source>Download</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
@@ -118,15 +110,24 @@
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<location filename="../src/pages/appintopage.ui" line="1071"/>
<source>Description</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="903"/>
<location filename="../src/pages/appintopage.ui" line="906"/>
<source>Screen capture</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="192"/>
<location filename="../src/pages/appintopage.cpp" line="330"/>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="518"/>
<source>Download and Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
@@ -140,114 +141,114 @@
<translation> Wine wine环境</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="765"/>
<location filename="../src/pages/appintopage.ui" line="768"/>
<source>Introduction</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1161"/>
<location filename="../src/pages/appintopage.ui" line="1164"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<location filename="../src/pages/appintopage.ui" line="1193"/>
<source>Contributor</source>
<translation>稿</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1197"/>
<location filename="../src/pages/appintopage.ui" line="1200"/>
<source>Pkgname</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<location filename="../src/pages/appintopage.ui" line="1306"/>
<source>Author</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<location filename="../src/pages/appintopage.ui" line="1342"/>
<source>Size</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<location filename="../src/pages/appintopage.ui" line="1378"/>
<source>Website</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="51"/>
<location filename="../src/pages/appintopage.cpp" line="53"/>
<source>Click Open</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="114"/>
<location filename="../src/pages/appintopage.cpp" line="126"/>
<source>Developer Mode Disabled</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="456"/>
<location filename="../src/pages/appintopage.cpp" line="177"/>
<location filename="../src/pages/appintopage.cpp" line="357"/>
<location filename="../src/pages/appintopage.cpp" line="490"/>
<source>Reinstall</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="167"/>
<location filename="../src/pages/appintopage.cpp" line="184"/>
<source>Upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="335"/>
<location filename="../src/pages/appintopage.cpp" line="466"/>
<source>Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<location filename="../src/pages/appintopage.cpp" line="340"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<source>Warning</source>
<translation></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<source>The current application does not support deepin, there may be problems</source>
<translation>deepin</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<source>The current application does not support UOS, there may be problems</source>
<translation>UOS</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<source>The current application does not support Ubuntu, there may be problems</source>
<translation>Ubuntu</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<source>The current application does not support current platform, there may be problems</source>
<translation></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<source>Uninstall succeeded</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>The URL has been copied to the clipboard</source>
<translation></translation>
</message>
@@ -268,16 +269,24 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="139"/>
<location filename="../src/application.cpp" line="142"/>
<source>Version: %1</source>
<translation>%1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="149"/>
<location filename="../src/application.cpp" line="152"/>
<source>%1 is released under %2</source>
<translation>%1%2</translation>
</message>
</context>
<context>
<name>DownloadController</name>
<message>
<location filename="../src/backend/downloadworker.cpp" line="180"/>
<source>Download Failed, please retry :(</source>
<translation></translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
@@ -360,14 +369,14 @@
<location filename="../src/widgets/common/downloaditem.cpp" line="230"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="231"/>
<source>Error happened in dpkg progress , please check the install info or try to reinstall.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="238"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="239"/>
<source>dpkg progress had been abortedplease check the install info or try to reinstall.</source>
<translation>dpkg出现错误</translation>
<source>dpkg progress had been aborted, please check the install info or try to reinstall.</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
@@ -472,33 +481,33 @@
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="187"/>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<source>Submit App</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="188"/>
<location filename="../src/mainwindow-dtk.cpp" line="191"/>
<source>Submit App with client(Recommanded)</source>
<translation>使稿</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="189"/>
<location filename="../src/mainwindow-dtk.cpp" line="192"/>
<source>Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<location filename="../src/mainwindow-dtk.cpp" line="193"/>
<source>APP Upgrade and Install Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="146"/>
<location filename="../src/mainwindow-dtk.cpp" line="241"/>
<location filename="../src/mainwindow-dtk.cpp" line="147"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="151"/>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<source>Search or enter spk://</source>
<translation></translation>
</message>
@@ -506,19 +515,23 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<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="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation>
<location filename="../src/application.cpp" line="41"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;Professional application distribution solution&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Flamescion (Shenyang) Computer Software Development Co., Ltd.&lt;/span&gt;</source>
<translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;火穗(沈阳)计算机软件开发有限公司 &lt;/span&gt;</translation>
</message>
<message>
<location filename="../src/application.cpp" line="146"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="vanished">&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation>
</message>
<message>
<location filename="../src/application.cpp" line="149"/>
<source>Spark Project</source>
<translation></translation>
</message>
@@ -528,7 +541,7 @@
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<source>Show MainWindow</source>
<translation></translation>
</message>
@@ -627,22 +640,25 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="359"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;We are &lt;span style=&quot; font-weight:600;&quot;&gt;NOT&lt;/span&gt; the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &amp;quot;Spark Store&amp;quot;! &amp;quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. &lt;/p&gt;&lt;p&gt;We don&apos;t make a profit from this, all developers and maintainers don&apos;t get paid, and we rely on the community&apos;s donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. &lt;/p&gt;&lt;p&gt;Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. &lt;/p&gt;&lt;p&gt;If any part of the store infringes your rights, please tell us &lt;a href=&quot;mailto:jifengshenmo@outlook.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;jifengshenmo@outlook.com&lt;/span&gt;&lt;/a&gt; we will remove the infringing content as soon as possible. &lt;/p&gt;&lt;p&gt;If you&apos;d like to get involved with us too, whether you&apos;re involved in development, design, pitching or submitting work, we welcome you to join us. &lt;/p&gt;
&lt;p&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;&lt;br/&gt;&lt;/span&gt;Our contact method can be found at &lt;a href=&quot;https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;Here&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;&lt;/span&gt;Linux/deepinSpark&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;使使&lt;/p&gt;&lt;p&gt; &lt;a href=&quot;mailto:jifengshenmo@outlook.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;jifengshenmo@outlook.com&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;稿&lt;p&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;a href=&quot;https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to this entity and its subsidiaries.&lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; © 2024 &lt;/p&gt;&lt;p&gt; v4.2 &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt; 20240507 365&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="217"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to Naval Aeronautical University (NAU). &lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; © 2024 &lt;/p&gt;&lt;p&gt; v4.2 &lt;/p&gt;&lt;p&gt; Naval Aeronautical University(NAU) &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt; 20240507 365&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="214"/>
<source>Updating, please wait...</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<source>Temporary cache was cleaned</source>
<translation></translation>
</message>
@@ -650,12 +666,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="245"/>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<source>About</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="246"/>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<source>Exit</source>
<translation>退</translation>
</message>

View File

@@ -8,14 +8,6 @@
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="175"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="483"/>
<source>Download</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
@@ -118,15 +110,24 @@
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<location filename="../src/pages/appintopage.ui" line="1071"/>
<source>Description</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="903"/>
<location filename="../src/pages/appintopage.ui" line="906"/>
<source>Screen capture</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="192"/>
<location filename="../src/pages/appintopage.cpp" line="330"/>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="518"/>
<source>Download and Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
@@ -140,114 +141,114 @@
<translation> Wine wine环境</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="765"/>
<location filename="../src/pages/appintopage.ui" line="768"/>
<source>Introduction</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1161"/>
<location filename="../src/pages/appintopage.ui" line="1164"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<location filename="../src/pages/appintopage.ui" line="1193"/>
<source>Contributor</source>
<translation>稿</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1197"/>
<location filename="../src/pages/appintopage.ui" line="1200"/>
<source>Pkgname</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<location filename="../src/pages/appintopage.ui" line="1306"/>
<source>Author</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<location filename="../src/pages/appintopage.ui" line="1342"/>
<source>Size</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<location filename="../src/pages/appintopage.ui" line="1378"/>
<source>Website</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="51"/>
<location filename="../src/pages/appintopage.cpp" line="53"/>
<source>Click Open</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="114"/>
<location filename="../src/pages/appintopage.cpp" line="126"/>
<source>Developer Mode Disabled</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="456"/>
<location filename="../src/pages/appintopage.cpp" line="177"/>
<location filename="../src/pages/appintopage.cpp" line="357"/>
<location filename="../src/pages/appintopage.cpp" line="490"/>
<source>Reinstall</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="167"/>
<location filename="../src/pages/appintopage.cpp" line="184"/>
<source>Upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="335"/>
<location filename="../src/pages/appintopage.cpp" line="466"/>
<source>Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<location filename="../src/pages/appintopage.cpp" line="340"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<source>Warning</source>
<translation></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<source>The current application does not support deepin, there may be problems</source>
<translation></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<source>The current application does not support UOS, there may be problems</source>
<translation></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<source>The current application does not support Ubuntu, there may be problems</source>
<translation></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<source>The current application does not support current platform, there may be problems</source>
<translation></translation>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<source>Uninstall succeeded</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>The URL has been copied to the clipboard</source>
<translation></translation>
</message>
@@ -268,16 +269,24 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="139"/>
<location filename="../src/application.cpp" line="142"/>
<source>Version: %1</source>
<translation>%1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="149"/>
<location filename="../src/application.cpp" line="152"/>
<source>%1 is released under %2</source>
<translation>%1%2</translation>
</message>
</context>
<context>
<name>DownloadController</name>
<message>
<location filename="../src/backend/downloadworker.cpp" line="180"/>
<source>Download Failed, please retry :(</source>
<translation></translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
@@ -360,14 +369,14 @@
<location filename="../src/widgets/common/downloaditem.cpp" line="230"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="231"/>
<source>Error happened in dpkg progress , please check the install info or try to reinstall.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="238"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="239"/>
<source>dpkg progress had been abortedplease check the install info or try to reinstall.</source>
<translation>dpkg出現錯誤</translation>
<source>dpkg progress had been aborted, please check the install info or try to reinstall.</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
@@ -472,33 +481,33 @@
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="187"/>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<source>Submit App</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="188"/>
<location filename="../src/mainwindow-dtk.cpp" line="191"/>
<source>Submit App with client(Recommanded)</source>
<translation>()</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="189"/>
<location filename="../src/mainwindow-dtk.cpp" line="192"/>
<source>Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<location filename="../src/mainwindow-dtk.cpp" line="193"/>
<source>APP Upgrade and Install Settings</source>
<translation> </translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="146"/>
<location filename="../src/mainwindow-dtk.cpp" line="241"/>
<location filename="../src/mainwindow-dtk.cpp" line="147"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="151"/>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<source>Search or enter spk://</source>
<translation></translation>
</message>
@@ -506,19 +515,23 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<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="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation>
<location filename="../src/application.cpp" line="41"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;Professional application distribution solution&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Flamescion (Shenyang) Computer Software Development Co., Ltd.&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="146"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="vanished">&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation>
</message>
<message>
<location filename="../src/application.cpp" line="149"/>
<source>Spark Project</source>
<translation></translation>
</message>
@@ -528,7 +541,7 @@
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<source>Show MainWindow</source>
<translation></translation>
</message>
@@ -627,22 +640,21 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="359"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;We are &lt;span style=&quot; font-weight:600;&quot;&gt;NOT&lt;/span&gt; the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &amp;quot;Spark Store&amp;quot;! &amp;quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. &lt;/p&gt;&lt;p&gt;We don&apos;t make a profit from this, all developers and maintainers don&apos;t get paid, and we rely on the community&apos;s donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. &lt;/p&gt;&lt;p&gt;Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. &lt;/p&gt;&lt;p&gt;If any part of the store infringes your rights, please tell us &lt;a href=&quot;mailto:jifengshenmo@outlook.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;jifengshenmo@outlook.com&lt;/span&gt;&lt;/a&gt; we will remove the infringing content as soon as possible. &lt;/p&gt;&lt;p&gt;If you&apos;d like to get involved with us too, whether you&apos;re involved in development, design, pitching or submitting work, we welcome you to join us. &lt;/p&gt;
&lt;p&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;&lt;br/&gt;&lt;/span&gt;Our contact method can be found at &lt;a href=&quot;https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;Here&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;&lt;/span&gt;Linux/deepin使Spark&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;使使&lt;/p&gt;&lt;p&gt; &lt;a href=&quot;mailto:jifengshenmo@outlook.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;jifengshenmo@outlook.com&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;稿&lt;p&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;a href=&quot;https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0082fa;&quot;&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to this entity and its subsidiaries.&lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="217"/>
<location filename="../src/pages/settingspage.cpp" line="214"/>
<source>Updating, please wait...</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<source>Temporary cache was cleaned</source>
<translation></translation>
</message>
@@ -650,12 +662,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="245"/>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<source>About</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="246"/>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<source>Exit</source>
<translation>退</translation>
</message>