Compare commits

..

300 Commits

Author SHA1 Message Date
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
d33c85b5e6 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-13 10:23:10 +00:00
f557a0d341 * 新增:内置在终端打开功能
* 调整:散列验证更改为使用sha256
2023-09-11 09:08:21 +08:00
56692bbdc3 add DOCS/json-api-doc.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-09 05:56:59 +00:00
def03de995 update DOCS/spk-doc.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-09-09 05:52:02 +00:00
ebef968a65 !234 合并翻译
Merge pull request !234 from depend/dev
2023-09-08 14:08:39 +00:00
d832df6efd update 西班牙语翻译 2023-09-04 11:32:59 +08:00
cc3561777e update 法语翻译 2023-09-04 11:26:07 +08:00
d085f3de73 fix: now wont inform aptss everytime 2023-09-01 22:56:44 +08:00
407ec6b573 update debian/spark-store.postinst.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-08-31 11:30:17 +00:00
2803d4b8da update tool/ssinstall.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-08-31 09:26:59 +00:00
48028076a8 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-08-31 09:14:16 +00:00
e435cf66dc 降低提示等级为 信息 2023-08-28 23:48:58 +08:00
766b7cd178 调整:因为apt-fast返回值都是1,只好暂时全部提示 2023-08-28 23:45:23 +08:00
5d4ac6f523 * 修复:aptss加锁失败现在会正常报错
* 新增:在aptss的特定操作时添加了提示

  * 新增:在aptss提示加粗
2023-08-28 23:42:25 +08:00
29869dbb9d fix: Do not report error when aptss stuck
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-08-27 01:48:13 +00:00
d07f2a5fa4 fix-变量 2023-08-14 12:11:06 +08:00
708d8866ac feat:new-download-backend 2023-08-14 11:52:33 +08:00
2115b1fb11 fix-path-error 2023-08-13 21:55:24 +08:00
0e810cea87 modify: 加入了配置系统,不再用瞳孔地震的方式处理升级 2023-08-13 21:44:53 +08:00
zty199
9f32a02f35 feat: #I6OTLZ 设置中可开关平台不兼容提示
设置界面增加选项,控制进入详情页时是否发送“应用不兼容系统”通知

Log: 设置界面添加“其他设置”部分,新增单选框控制是否开启应用不兼容系统提示;SettingsPage 添加静态属性 needUncompatibleNotification,启动时从配置文件中同步开关状态,单选框点击修改时写入配置文件;详情页加载标签时,判断 needUncompatibleNotification 为 false 则不发送通知;更新翻译文件
2023-08-12 01:35:37 +08:00
zty199
9f23c2b381 feat: #I7R2L5 更新星火商店时不再自动打开更新提示服务
prerm 脚本中添加判断,upgrade 时将更新提示 service 文件改名添加 bak,以此作为升级判断依据;postinst 脚本中判断 bak 文件存在时,优先判断更新提示服务是否为 enable 状态,若被 disable 则不再自启(若为 inactive 状态则同理不再重启服务)

Log: 修改 prerm 和 postinst 实现更新时判断更新提示服务是否需要重新设置自启;修改 debian/changelog,消除编译打包警告
2023-08-11 23:29:05 +08:00
1f98c8df7c bump-4266 2023-08-02 11:40:56 +08:00
da9f84d78a 调整:文案修改:安装失败后引导查看详情而不是重新安装 2023-08-02 11:35:59 +08:00
88cc3eb921 如果dpkg阻塞会出现漏掉的安装失败,在安装后检测 2023-08-02 11:30:12 +08:00
f04130f902 修复:UOS专业版上安装成功仍然显示失败的问题:方式:忽略E:等消息,仅检查脚本报错
调整:卸载应用时采用autopurge以一并卸载依赖
2023-08-02 11:16:06 +08:00
e7e810ea2b update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-07-24 08:02:03 +00:00
1de46a8296 update tool/ssaudit.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-07-24 04:27:05 +00:00
5ece2b2034 调整:4264版本发布
修复:过于老旧的联系方式入口
2023-07-13 10:58:07 +08:00
460dcfebed 修复:依赖 desktop-file-utils 添加
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-07-08 07:28:56 +00:00
fb257212b6 update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-07-05 04:10:10 +00:00
1436e35a49 update README.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-07-05 04:09:55 +00:00
a16248f8a4 修复:部分下载量线路失效 2023-07-05 11:58:38 +08:00
7b49732405 fix mail 8
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-07-05 03:57:14 +00:00
1b6e02c5bf mail 10 fix
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-07-05 03:53:41 +00:00
4d228fd331 mail 2 fix
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-07-05 03:51:16 +00:00
f6ac9752d1 重命名 LICENCE 为 LICENSE 2023-06-30 10:52:44 +00:00
716344cf68 重命名 LICENCE-Additional 为 LICENCE 2023-06-30 10:50:42 +00:00
79e0ef2b7b 重命名 LICENSE 为 LICENSE-GPL3 2023-06-30 10:50:34 +00:00
779b62a12f update LICENCE-Additional.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-06-30 10:47:47 +00:00
6427a32c31 add LICENCE-Additional.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-06-30 10:46:37 +00:00
1f8d237d40 update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-06-14 06:39:55 +00:00
04732f61c0 update README.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-06-14 06:39:17 +00:00
63147b2ca3 update tool/update-upgrade/transhell/ss-do-upgrade.sh_en_US.transhell.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-06-14 06:37:27 +00:00
d1d1e54022 文案同步
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-06-14 06:34:51 +00:00
d175fc497e 文案同步
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-06-14 06:34:13 +00:00
e073764a80 !219 回退 'Pull Request !218 : 添加对LingmoOS的支持'
Merge pull request !219 from shenmo/revert-merge-218-dev
2023-06-08 12:01:00 +00:00
5cf8b587ee 回退 'Pull Request !218 : 添加对LingmoOS的支持' 2023-06-08 12:00:47 +00:00
b715f1c54b !218 添加对LingmoOS的支持
Merge pull request !218 from Floating dream/beta
2023-06-08 11:59:15 +00:00
Floating dream
7513667c6e 添加LingmoOS适配 2023-06-08 11:22:21 +08:00
Floating dream
0edf87c95c Add detection for LingmoOS 2023-06-08 01:30:17 +08:00
22a54cd0ed 幸亏一直没用到这个函数
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-05-24 05:09:00 +00:00
d4fbd1b386 update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-05-07 02:15:15 +00:00
87a71fe3b3 update README.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-05-07 02:14:43 +00:00
c7e48ae01d 支持zunyun01
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-26 10:20:51 +00:00
cb66f5e903 arm架构applist支持 2023-04-25 19:29:11 +08:00
842f0893b3 支持arm搜索 2023-04-25 18:41:38 +08:00
f5a35a332a update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-22 09:18:46 +00:00
0ba0587e17 fix I6XTK0
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-22 09:17:14 +00:00
c65eea12a6 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-22 05:43:27 +00:00
d6e01a5803 fix: 快读切换应用页面可能出现ux重叠 2023-04-21 12:37:48 +08:00
04aeac62f8 fix: 截图加载失败 2023-04-21 12:37:26 +08:00
9b1b432e7c update tool/spark-dstore-patch.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-20 10:46:36 +00:00
cfafc04628 update tool/spark-dstore-patch.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-20 08:43:26 +00:00
8450e6afa6 update tool/spark-dstore-patch.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-20 08:35:36 +00:00
2a4d33e73f update tool/spark-dstore-patch.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-20 08:23:53 +00:00
8c2a10ebbc update tool/spark-dstore-patch.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-20 08:13:01 +00:00
2bec2de456 update tool/spark-dstore-patch.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-20 08:09:48 +00:00
90dea4ed2e update tool/spark-dstore-patch.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-20 08:06:48 +00:00
06ca1b7a97 update debian/control.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-14 09:21:30 +00:00
f9e2cea98e * 调整:重写了spark-dstore-patch,速度提升,尤其对机械硬盘下
* 调整:优化了aptss源文件同步策略
2023-04-14 16:34:26 +08:00
1bbf7027d3 用更优雅的方式同步source
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-14 07:51:44 +00:00
90ec030f8b update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-12 05:17:32 +00:00
347c8ed093 update debian/spark-store.postinst.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-09 14:03:31 +00:00
d987c840c7 update debian/spark-store.postinst.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-09 14:03:19 +00:00
88a28c5658 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-09 02:31:28 +00:00
484a82b00b update tool/ssinstall.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-09 02:30:26 +00:00
1506b74b01 调整:删除libc6-dev依赖
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-04-09 02:06:05 +00:00
09b880fff8 update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-03-31 09:04:39 +00:00
c6d3742daa update README.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-03-31 09:04:18 +00:00
917527cbe6 fix: 更改文案描述 2023-03-31 14:32:55 +08:00
faad17470a feat: 统一到同一个url配置 2023-03-27 15:20:26 +08:00
9f53c2eaa6 424 changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-03-23 06:20:49 +00:00
6d1d4e9f23 ts 2023-03-22 14:40:38 +08:00
753945228e fixup! feat: 进入应用前检测平台并提示 2023-03-14 14:33:35 +08:00
2f409c7082 * 修复:ssinstall校验失败的时候仍然提示安装成功
* 新增:ssinstall可以自动刷新ssupdate以防止仓库更新中导致的安装校验失败
2023-03-14 13:43:42 +08:00
728fc5866c failed 2023-03-13 09:36:54 +00:00
ace24914f4 update pipeline-dtk-build-aarch64.yml 2023-03-13 09:33:46 +00:00
8b9bf53e4e update pipeline-dtk-build-aarch64.yml 2023-03-13 09:29:42 +00:00
453d3963dd update pipeline-dtk-build-aarch64.yml 2023-03-13 09:24:04 +00:00
dff869cec8 update pipeline-dtk-build-aarch64.yml 2023-03-13 09:11:59 +00:00
17a6b22e55 update pipeline-dtk-build-aarch64.yml 2023-03-13 09:00:30 +00:00
cb66e8a0bd update pipeline-dtk-build-aarch64.yml 2023-03-13 08:56:17 +00:00
001ce7e4e8 update pipeline-dtk-build-aarch64.yml 2023-03-13 08:51:55 +00:00
351bbc0fc1 update pipeline-dtk-build-aarch64.yml 2023-03-13 08:50:33 +00:00
824ffbca2b update pipeline-dtk-build-aarch64.yml 2023-03-13 06:37:03 +00:00
d6082be71f update pipeline-dtk-build-aarch64.yml 2023-03-13 06:14:53 +00:00
6b807b24e2 create pipeline-dtk-build-aarch64.yml 2023-03-13 06:10:48 +00:00
3679e8d6eb Merge: merge reason to dev 2023-03-13 14:03:08 +08:00
335996b7d0 OMG-IT-GOES-WRONG 2023-03-13 11:32:10 +08:00
aa3b102fdd Merge branch 'dev' into Reason 2023-03-13 00:41:57 +08:00
5394e5cc57 fix: 跟进 dryrun 的错误信息 2023-03-13 00:41:33 +08:00
d2544795f5 Merge branch 'dev' into Reason 2023-03-13 00:39:22 +08:00
06c7664a37 --squash=2e807c36e76437798f48519cd5e7eb2cc2dbff86 2023-03-13 00:38:16 +08:00
2d09b549af Merge branch 'dev' into Reason 2023-03-13 00:35:43 +08:00
2e807c36e7 fix: 跟进 dryrun 的错误信息 2023-03-13 00:33:01 +08:00
0a1a6e73f0 Merge branch 'dev' into Reason 2023-03-13 00:17:59 +08:00
fea69319de --fixup=e8f13693be24559110b709a1778f58a71fabc37e 2023-03-13 00:14:46 +08:00
6519053648 update: update translate 2023-03-12 22:34:15 +08:00
ef41110632 fixup! I6JSL5 2023-03-12 22:26:22 +08:00
30cdeb89b1 https://gitee.com/deepin-community-store/spark-store/issues/I6JSL5 2023-03-12 22:25:38 +08:00
512df973f9 fixup! https://gitee.com/deepin-community-store/spark-store/issues/I6JSL5 2023-03-12 22:24:10 +08:00
d3b71fbacc Merge branch 'dev' into Reason 2023-03-12 22:05:44 +08:00
e8f13693be feat: 进入应用前检测平台并提示 2023-03-12 22:00:49 +08:00
6bd05655d6 feat: 检查 /tmp/spark-store 目录权限 2023-03-12 21:20:47 +08:00
ebe78f0937 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-03-12 02:02:04 +00:00
abae11a30e update debian/control.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-03-11 03:55:38 +00:00
f8ea89a069 Merge branch 'dev' into Reason 2023-03-11 00:41:31 +08:00
496d20d536 fix: Readme 文件描述中缺少依赖 2023-03-11 00:41:04 +08:00
369a7801ab fix: 使用cpu核心数目构建,防止小内存机器OOM 2023-03-11 00:38:55 +08:00
0478df3b49 安装失败时输出 2023-03-10 20:17:33 +08:00
d8909b1424 ssinstall解析绝对路径 2023-03-09 23:21:43 +08:00
ab707c8c2b 参数传错了 2023-03-09 22:58:05 +08:00
13d6965558 Merge remote-tracking branch 'refs/remotes/origin/Reason' into Reason 2023-03-09 17:54:41 +08:00
22cb1f6058 检验是否安装转到worker 2023-03-09 17:54:31 +08:00
8e560805b2 Merge branch 'dev' into Reason 2023-03-09 14:46:04 +08:00
8475623135 feat: 改进HIDPI支持 2023-03-09 14:45:24 +08:00
e865431411 9 2023-03-09 10:51:51 +08:00
ab8faa487e Merge remote-tracking branch 'refs/remotes/origin/Reason' into Reason 2023-03-09 10:32:06 +08:00
f0e3b6b687 放弃sender-d 2023-03-09 10:31:54 +08:00
5de20aa19d Merge branch 'dev' into Reason 2023-03-09 00:38:16 +08:00
b5ae73fbeb fix: 先使图像居中再显示图像界面 2023-03-09 00:37:07 +08:00
28326b37c7 !208 fix: 多显示器大图显示居中 2023-03-08 16:18:59 +00:00
12a114450c Merge branch 'dev' into Reason 2023-03-09 00:17:39 +08:00
768ed38ace fix: add vscode files to .gitignore 2023-03-09 00:17:23 +08:00
19f7e3fa0e Merge branch 'dev' into Reason 2023-03-09 00:15:56 +08:00
6d65b445dd fix: 多显示器大图显示居中 2023-03-09 00:15:28 +08:00
2867cf0500 绕过dh_strip 2023-03-08 18:55:02 +08:00
07eaebf483 sender-d用cpp 2023-03-08 18:43:31 +08:00
2d116ae6c1 sender-d用cpp 2023-03-08 18:42:39 +08:00
ceb43da10b regenerate sender-d_aarch64.sh.c,not sure it work everywhere 2023-03-08 14:00:19 +08:00
710cd9fa5c logo更新 2023-03-08 09:21:30 +08:00
c6688e47fb ssaudit也加上aptssupdate 2023-03-08 08:14:36 +08:00
e04b2545a9 修复一些去除bwrap带来的问题,真是的,跑的好好的就不要动啊kora 2023-03-08 01:04:43 +08:00
9b4c3aa2ce 不再使用cp-r同步系统lists,防止把未更新的也带过来 2023-03-08 00:44:21 +08:00
e6561e0a07 reason6 2023-03-08 00:35:57 +08:00
9616deb4b6 * ssinstall发现无法验证时尝试update而不是ssupdate
* 启动每日aptss update
2023-03-08 00:26:14 +08:00
96d2ea6669 红豆泥私密马赛,现在好了 2023-03-07 19:09:56 +08:00
d57c43a2b7 私密马赛,忘记空格了 2023-03-07 19:04:56 +08:00
40eadaca35 https://gitee.com/deepin-community-store/spark-store/issues/I6JSL5 2023-03-07 19:00:51 +08:00
21bcb67a73 update src/assets/json/features.json.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-03-07 09:21:53 +00:00
890718fdbb changelog 2023-03-07 17:14:53 +08:00
1613825b7c 自动读取分支名 2023-03-07 17:12:22 +08:00
bcb399dc30 aptss支持非root模式启动,添加transhell支持 2023-03-07 16:53:30 +08:00
cd581d4de9 若sources.list.d为空则终止清理 2023-03-06 23:19:58 +08:00
41ef63ec4a 修复:apt-fast仍然会在旧的archieve复制,指定到旧的archieve 2023-03-06 22:47:37 +08:00
02419bfdcb 修复:无法访问系统源 2023-03-06 22:29:51 +08:00
b67fd11fd5 修复:aptss无法找到新标准的list 2023-03-06 21:51:14 +08:00
9a7a80223a feat: 彻底抛弃bwrap,提升aptss响应速度。现已可将aptss当apt用 2023-03-06 21:45:12 +08:00
aa85ee53a8 好啊,来啊
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-03-05 15:49:40 +00:00
ac45f5eec9 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-03-05 15:42:52 +00:00
84cc4a9208 fix: 修复在x86下的编译问题 2023-03-05 23:42:07 +08:00
795a6ca709 fix: 新后端多架构 2023-03-05 23:29:07 +08:00
dab4606e9b Merge branch 'Reason' of gitee.com:deepin-community-store/spark-store into Reason 2023-03-05 23:22:47 +08:00
1954196ba1 feat: 多架构编译支持 2023-03-05 23:21:36 +08:00
fc0edab44c feat:aarch64-shc-sender 2023-03-05 23:10:12 +08:00
a04cf4e6d9 Merge branch 'Reason' of https://gitee.com/deepin-community-store/spark-store into Reason 2023-03-05 23:03:26 +08:00
e85576e5f0 fix:sender.sh 2023-03-05 23:03:16 +08:00
efba72002a Merge branch 'dev' of gitee.com:deepin-community-store/spark-store into Reason 2023-03-05 22:57:18 +08:00
4bdcb2cf3c Merge branch 'dev' of gitee.com:uniartisan2018/spark-store into dev 2023-03-05 22:52:16 +08:00
8ff46e554f Merge branch 'Reason' of gitee.com:deepin-community-store/spark-store into Reason 2023-03-05 22:51:47 +08:00
57db01aeaf Merge remote-tracking branch 'refs/remotes/origin/Reason' into Reason 2023-03-05 22:46:25 +08:00
0ceb99e121 补充依赖pkexec 2023-03-05 22:46:12 +08:00
83b539e7da update README.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-03-05 11:56:52 +00:00
ce6c0a4613 update README.zh.md.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2023-03-05 11:53:45 +00:00
cf59aeb4eb 使用hardcode的方式修改了url
请在后续版本改善
仅用于测试!!!!
web请求方式被改回旧版了,请在柚子发布新web后改回
2023-03-05 19:11:21 +08:00
17ca13cf00 !207 fix: 修复安装不成功时,关闭主窗口会直接退出,且重启后没有记录的问题
Merge pull request !207 from zty199/auto-7392693-dev-034d32be
2023-03-05 02:26:20 +00:00
zty199
b99225bd3c fix: 修复安装不成功时,关闭主窗口会直接退出,且重启后没有记录的问题
由于安装操作在线程中异步执行,原始逻辑中仅判断下载完成后就检测是否还有后续任务,存在安装未结束就退出的情况

Log: 调整判断后续下载任务位置到槽函数中,每个任务安装完成结果信号触发后优先判断安装是否成功,再判断是否需要退出
2023-03-04 22:42:08 +08:00
8f39710cdb postinst增加判断arch 2023-03-04 21:09:05 +08:00
7ec6be1969 aa64+x86 2023-03-04 21:01:54 +08:00
d9ee17c9b1 Merge branch 'Reason' into dev 2023-03-04 18:21:01 +08:00
1543d75339 !206 去除无用的重复获取
Merge pull request !206 from shenmo/auto-4915358-dev-bc4479a1
2023-03-03 14:12:10 +00:00
77eb0d84c7 ss-feedback 2023-03-03 22:11:48 +08:00
68ddb3ffcc 去除无用的重复获取 2023-03-03 22:03:32 +08:00
58ea0249d8 调整效果 2023-03-03 21:29:33 +08:00
eb01bf253e !205 薪炎
Merge pull request !205 from shenmo/auto-4915358-dev-f2477c82
2023-03-03 13:28:58 +00:00
c22ce6290b 薪炎 2023-03-03 21:28:47 +08:00
1f7608bf77 2023-03-03 21:26:11 +08:00
16115a455b !204 4.2.3.1
Merge pull request !204 from shenmo/dev
2023-03-03 13:04:39 +00:00
ce680d54f9 !203 4231
Merge pull request !203 from shenmo/auto-4915358-dev-f244898b
2023-03-03 13:04:07 +00:00
a90699163f 4231 2023-03-03 21:02:31 +08:00
3edf39b4ef Merge branch 'Reason' of gitee.com:deepin-community-store/spark-store into Reason 2023-03-02 23:58:53 +08:00
f5c879b369 feat: aarch64 下x11时使用软件渲染 2023-03-02 23:49:08 +08:00
2bd9c4a440 !198 4.2.3
Merge pull request !198 from shenmo/dev
2023-03-02 15:34:05 +00:00
f494f15922 !202 Merge remote-tracking branch 'refs/remotes/origin/dev' into dev
Merge pull request !202 from shenmo/auto-4915358-dev-47465fb4
2023-03-02 15:33:49 +00:00
d5df4057e9 Merge remote-tracking branch 'refs/remotes/origin/dev' into dev 2023-03-02 23:33:27 +08:00
dc07b7cb02 changelog 2023-03-02 23:33:16 +08:00
1bb0bf7d71 !201 Merge remote-tracking branch 'refs/remotes/origin/dev' into dev
Merge pull request !201 from shenmo/auto-4915358-dev-844840b2
2023-03-02 15:32:32 +00:00
cf00d54355 Merge remote-tracking branch 'refs/remotes/origin/dev' into dev 2023-03-02 23:32:04 +08:00
1ea7067379 ci构建线程是2 2023-03-02 23:31:31 +08:00
29ad3cc72d !200 完全修复prerm崩溃
Merge pull request !200 from shenmo/auto-4915358-dev-8846a8bc
2023-03-02 15:27:29 +00:00
dfe57bf2c3 !199 fix: 修复软件构建依赖缺失
Merge pull request !199 from Pluto/auto-5304420-dev-2c49bfa9
2023-03-02 15:26:13 +00:00
b37f8d7f7e 完全修复prerm崩溃 2023-03-02 23:25:49 +08:00
b51b248566 fix: 修复软件构建依赖缺失 2023-03-02 23:13:49 +08:00
21baf598d7 修复prerm崩溃 2023-03-02 23:09:00 +08:00
2c6d706c58 423 2023-03-02 22:40:08 +08:00
1b1f7578d0 changelog 2023-02-24 22:13:40 +08:00
9275425bdf feat: 一键编译并安装脚本 2023-02-24 01:07:09 +08:00
22b1d66c07 fix: 删除不应该删除的指针造成闪退 2023-02-24 00:10:19 +08:00
a3e1d19ac3 !197 feat: 后台安装结束后退出任务栏驻留
* fix: 没有下载的时候直接退出客户端
* feat: 后台安装结束后退出任务栏驻留
* feat: 更新的时候关闭旧实例
2023-02-23 12:50:44 +00:00
762caae49f !196 fix: QtWebEngine
* fix: QtWebEngine
2023-02-23 08:41:14 +00:00
4e4ee205de !195 aptss加入对sdu镜像package文件识别;修改版本号到323t4
Merge pull request !195 from shenmo/auto-4915358-dev-a949fd8a
2023-02-21 07:49:06 +00:00
9d4e19e606 aptss加入对sdu镜像package文件识别;修改版本号到323t4 2023-02-21 15:48:12 +08:00
4d142ec614 !194 fix: ssinstall 失去作用
Merge pull request !194 from Pluto/auto-5304420-dev-cf41f4bd
2023-02-21 06:45:29 +00:00
80cf746f90 fix: ssinstall 失去作用 2023-02-21 14:38:38 +08:00
3b83b335be !193 aptss 获取线路信息 转到从 d. 服务器获取 顺便改了下changelog
Merge pull request !193 from shenmo/auto-4915358-dev-3747efbc
2023-02-20 01:47:48 +00:00
1f0a0e48ff 特性链接修改 2023-02-20 09:46:39 +08:00
432215e040 aptss 获取线路信息 转到从 d. 服务器获取
顺便改了下changelog
2023-02-20 09:32:41 +08:00
1a65386c6b !192 feat: 支持打包时从 debian/changelog 自动获取构建版本号并写入关于窗口
feat: 支持打包时从 debian/changelog 自动获取构建版本号并写入关于窗口
2023-02-18 23:12:26 +00:00
zty199
757dced302 fix: 修复 debian/control 中错误字段
Standards-Version 被错误修改为 Standard-Version

Log: 修复 debian/control 中错误字段,改为 Standards-Version
2023-02-19 07:06:12 +08:00
zty199
854caafd6b feat: 支持打包时从 debian/changelog 自动获取构建版本号并写入关于窗口
修改 debian/rules 文件,configure 时 qmake 添加环境变量 BUILD_VERSION,用于 .pro 文件中获取构建版本号并设置宏定义,在关于窗口中显示

Log: 修改并整理 debian 构建文件夹;修改 .pro 文件,支持打包时自动获取构建版本号;添加 usr/share/dsg/org.deepin.dtkwidget.feature-display.json,用于控制版本特性窗口显示提醒
2023-02-19 06:51:29 +08:00
1332107642 !191 fix: 修复下载列表对话框中,点击某个 item 取消下载按钮后下载列表无法再次显示的问题
fix: 修复下载列表对话框中,点击某个 item 取消下载按钮后下载列表无法再次显示的问题
2023-02-18 17:14:50 +00:00
zty199
4825417de8 fix: 修复下载列表对话框中,点击某个 item 取消下载按钮后下载列表无法再次显示的问题
MainWindow::notify 中焦点判断异常,未去除 QStyleSheetStyle 导致错误认为需要隐藏下载管理对话框

Log: 判断 focusIn 事件前排除 QStyleSheetStyle 对象
2023-02-19 01:08:41 +08:00
0001df153b !190 fix: downloadController 修改为懒汉式单例
fix: downloadController 修改为懒汉式单例
2023-02-18 16:56:12 +00:00
f88b38dd39 Merge branch 'dev' of gitee.com:deepin-community-store/spark-store into dev 2023-02-19 00:48:53 +08:00
3f2404ec1c fix: downloadController 修改为懒汉式单例 2023-02-19 00:45:17 +08:00
5b822194fa !188 fix: 多个应用安装可能会出现某一个应用没有安装
Merge pull request !188 from Pluto/auto-5304420-dev-f9438ba2
2023-02-18 12:21:51 +00:00
33ea9ee065 fix: 多个应用安装可能会出现某一个应用没有安装 2023-02-18 20:06:36 +08:00
d742e85332 !187 fix: 修复下载按钮点击/双击/拖动时,主窗口动作与下载管理对话框动作同时触发问题
Merge pull request !187 from zty199/auto-7392693-dev-bd4133a2
2023-02-17 08:18:26 +00:00
zty199
8dfb1fbe2f fix: 修复下载按钮点击/双击/拖动时,主窗口动作与下载管理对话框动作同时触发问题
下载按钮未屏蔽双击事件,导致触发主窗口最大化动作,同时下载对话框显示在原始位置;拖动时触发下载对话框显示,移动时又隐藏下载对话框,造成闪烁现象;重复点击下载按钮,对话框闪烁

Log: 修改下载按钮和下载对话框焦点策略对象,保证对话框焦点状态与下载按钮同步;对话框显示操作移入下载按钮鼠标事件中处理,隐藏操作移入主窗口事件循环中判断,当主窗口/下载对话框均不是活动窗口时隐藏对话框

* 可能修复 ISSUE #I6FNOW,目前修改后,连续点击下载按钮,对话框将按顺序显示/隐藏
2023-02-17 02:15:14 +08:00
4114b51d87 !186 feat: 支持 DTK 5.6.4 关于对话框“版本特性”显示功能
Merge pull request !186 from zty199/auto-7392693-dev-f4457187
2023-02-16 00:09:05 +00:00
zty199
deec70f14b feat: 支持 DTK 5.6.4 关于对话框“版本特性”显示功能
将版本特性信息写入 json,运行时解析文件信息并初始化版本特性对话框

Log: 添加版本特性 json 文件以及解析文件相关函数,用于构造版本特性对话框;版本号维护放入 src/assets/json/features.json 中统一管理,不再修改 main 函数,运行时从 json 文件读取并显示

* 该提交需要在低版本 DTK 验证能否正常编译运行
2023-02-16 01:18:11 +08:00
99 changed files with 5997 additions and 3253 deletions

2
.gitignore vendored
View File

@@ -52,3 +52,5 @@ debian/files
debian/*.substvars
debian/spark-store
.vscode/*
src/spark-store

View File

@@ -32,8 +32,7 @@ stages:
- cd ..
- rm -rf dtk-old-bundle
- 'mk-build-deps --install --tool "apt-get -o Debug::pkgProblemResolver=yes -y" '
- sed -i 's/-j$(JOBS)/-j2/g' debian/rules
- dpkg-buildpackage -b -us -uc
- dpkg-buildpackage -j2 -b -us -uc
- cd ..
- ls -all
- pwd

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:
@@ -33,8 +33,7 @@ stages:
- rm -rf dtk-old-bundle
- ''
- 'mk-build-deps --install --tool "apt-get -o Debug::pkgProblemResolver=yes -y" '
- sed -i 's/-j$(JOBS)/-j2/g' debian/rules
- dpkg-buildpackage -b -us -uc
- dpkg-buildpackage -j2 -b -us -uc
- cd ..
- ls -all
- pwd

View File

@@ -0,0 +1,48 @@
version: '1.0'
name: pipeline-dtk-build-aarch64
displayName: dtk-build-aarch64
triggers:
trigger: manual
push:
tags:
prefix:
- ''
stages:
- name: stage-2c12cce1
displayName: 编译
strategy: naturally
trigger: auto
executor: []
steps:
- step: execute@docker
name: execute_by_docker
displayName: 基于镜像的脚本执行
certificate: ''
image: docker.io/debian:buster
command:
- '# 请在此输入您想执行的脚本'
- sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
- apt update
- export DEBIAN_FRONTEND=noninteractive
- echo "安装wget qemu-user-static"
- apt install git wget qemu-user-static xz-utils binfmt-support -y
- mkdir ../spark-store-git
- mv * ../spark-store-git
- 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
- wget https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/spark-build-aarch64.sh && mv spark-build-aarch64.sh DEBIAN/root
- mv /usr/bin/qemu-aarch64-static DEBIAN/
- chroot DEBIAN /qemu-aarch64-static /bin/bash /root/spark-build-aarch64.sh
- ''
- ''
artifacts:
- name: BUILD_ARTIFACT
path:
- ./DEBIAN/root/build-spark/target
notify: []
strategy:
retry: '0'

48
DOCS/json-api-doc.md Normal file
View File

@@ -0,0 +1,48 @@
# 基本格式
0. 应用信息
例子https://cdn.d.store.deepinos.org.cn/store/tools/spark-store/app.json
```json
{
"Name": "星火应用商店",
"Version": "4.2.7.1",
"Filename": "spark-store_4.2.7.1_amd64.deb",
"Torrent_address": "spark-store_4.2.7.1_amd64.deb.torrent",
"Pkgname": "spark-store",
"Author": "shenmo <shenmo@spark-app.store>",
"Contributor": "shenmo <jifengshenmo@outlook.com>",
"Website": "https://www.spark-app.store/",
"Update": "2023-09-01 23:22:23",
"Size": "590.5 KB",
"More": "* 修复aptss加锁失败现在会正常报错\n * 新增在aptss的特定操作时添加了提示\n * 新增在aptss提示加粗\n * 调整ssinstall验证支持使用cdn.d.获取",
"Tags": "community;ubuntu;deepin;uos;dtk5",
"img_urls": "[\"https://examine-spark.oss-cn-shanghai.aliyuncs.com/images/2023/09/01/411c32fd691544bb985ecba87d151ea0.png\",\"https://examine-spark.oss-cn-shanghai.aliyuncs.com/images/2023/09/01/f44b3c2242c045e28f1161980d805e0d.png\",\"https://examine-spark.oss-cn-shanghai.aliyuncs.com/images/2023/09/01/00263ba857894667bd99240558bec69c.png\",\"https://examine-spark.oss-cn-shanghai.aliyuncs.com/images/2023/09/01/6fd248ad9eea4ef18c9c4acc2a9d372d.png\"]",
"icons": "https://examine-spark.oss-cn-shanghai.aliyuncs.com/icons/2023/09/01/a88dd18cc1734396a02e7e3c6be59718.png"
}
```
*注意img_urls和icons的信息不保证有效大部分是有效的少部分app.json可能缺失此项目*
**对于icon和截图的获取需求请参考第三点**
1. 对于某分类下的所有应用信息
`{SOURCE_URL}/{ARCH}/{CATOGARY}/applist.json`
说明SOURCE_URL线路链接目前推荐 https://cdn.d.store.deepinos.org.cn你也可以使用其他的星火线路
ARCH架构文件夹 x86是store或amd64-storearm是aarch64-store。特别的如果你使用非https://cdn.d.store.deepinos.org.cn的线路你可能会发现amd64-store会返回404因为不是所有的服务器都支持软连接
CATOGARY分类目录。参考 https://gitee.com/deepin-community-store/spark-store/blob/dev/DOCS/spk-doc.md 中 store 直达的对应关系
例子https://cdn.d.store.deepinos.org.cn/aarch64-store/tools/applist.json
2. 对于单个应用的应用信息
`{SOURCE_URL}/{ARCH}/{CATOGARY}/{Package Name}/app.json`
Package Name是包名。可从上级的applist.json读取
例子https://cdn.d.store.deepinos.org.cn/store/tools/spark-store/app.json
3. 对应用截图和icon的获取
`{SOURCE_URL}/{ARCH}/{CATOGARY}/{Package Name}/icon.png`
`{SOURCE_URL}/{ARCH}/{CATOGARY}/{Package Name}/screen_n.png`(n=1-5)(至少为1不是所有的都有到5. 404是正常的

View File

@@ -1,12 +1,14 @@
#### 调用参数(spk规则)
参数只有一个Url该url应当遵循这种格式`spk://<任意合法字符>/web分类/包名`
* store直达
该url应当遵循这种格式`spk://store/web分类/包名`
目前第一字段不进行处理,以后可能会对此识别。在目前阶段,这个字段可以填写任意合法字符
例如:
[spk://abcdefg/games/store.spark-app.hmcl](spk://abcdefg/games/store.spark-app.hmcl)
[spk://store/games/store.spark-app.hmcl](spk://store/games/store.spark-app.hmcl)
可选的web分类
@@ -25,3 +27,8 @@
| 工具 | tools |
| 主题 | themes |
| 其他 | others |
* search搜索
spk://search/pkgname

91
FAQ.md Normal file
View File

@@ -0,0 +1,91 @@
# FAQ
## Spark App Store FAQ and Support Guide
### Introduction
The Spark App Store is an application store aimed at Linux users and supports multiple Linux distributions. Below are some commonly asked questions and solutions. Please note that this document is primarily intended for ordinary users who are not familiar with Linux and the APT package management system.
---
### Communication and Feedback
**Q: Where can I join the community group?**
**A:** You can click [here](https://www.deepinos.org/) to enter the main communication platform of the Spark Store.
> ⚠️ If the above link doesn't work, you can also join our QQ groups as an alternative. The group numbers are 872690351 and 865927727. We also offer forums for communication.
#### Differences Between arm64 and amd64
arm64
* Full Name: Advanced RISC Machine 64-bit
* Main Use: Primarily used in mobile devices, embedded systems, and some new servers and desktop computers.
* Advantages: Low power consumption, high efficiency, suitable for battery-driven and heat-sensitive devices.
* Main Manufacturers: Apple, Qualcomm, HiSilicon, Phytium, etc.
amd64
* Full Name: AMD 64-bit, also known as x86_64
* Main Use: Primarily used in desktop computers, laptops, and servers.
* Advantages: High performance, suitable for computation-intensive applications.
* Main Manufacturers: Intel and AMD.
* The main differences between the two are in the instruction sets and application scenarios. amd64 is usually used for high-performance computers and servers, while arm64 is more commonly used in power-sensitive settings.
#### How to Check:
Linux:
- Open the terminal.
- Type `uname -m` or `arch` and press Enter.
- You will see your processor architecture (possibly x86_64, aarch64, etc.).
---
### Domestic Architecture Support
**Q: I use a domestic chip architecture, how can I get applications?**
**A:** Currently, Spark Store supports **arm** architecture for domestic chips. You can download deb packages suitable for arm64 architecture.
> ⚠️ Please note that this is experimental support. If you encounter any issues, please provide feedback via Spark's communication platform, QQ group, or forums.
---
### Dependency Issues
**Q: I get errors when installing dependencies**
**A:** If you are using UOS or deepin, please do not install the dependency packages. For Kali Linux/Kdeneon etc., temporary support is not available, please compile and install yourself.
> 💡 If errors occur, try running `sudo apt update` before attempting the installation again. If the issue persists, refer to the first question and seek help on the community platform.
---
### Submission and App Updates
**Q: Where can I submit applications?**
**A:** You can find the "Submit Application" option in the upper-right corner menu of the app store interface.
---
### Support for Non-deepin/UOS Users
**Q: I'm not a deepin/UOS user; can I use the Spark App Store?**
**A:** Yes, you can directly install if you're using Ubuntu 22.04. For Ubuntu 20.04/Debian10/Debian11, please install the dependencies first.
---
### Installation Methods
**Q: Can I use dpkg -i for installation?**
**A:** No! Use `sudo apt install ./xxxx.deb` to install, or use graphical installers like gdebi.
> ⚠️ Using dpkg directly will not handle software dependencies, which is a common mistake.
---
### System Updates
**Q: Will the Spark Store affect normal system updates?**
**A:** No, the Spark Store has separated its application sources from system sources and will not affect regular system updates.
---
### Reporting Issues and Removing Apps
**Q: Some apps are outdated or inactive, and I want them removed**
**A:** You can report issues [here](https://gitee.com/deepin-community-store/software_-issue).
---
### Installing Spark App Store
If you wish to install the Spark App Store, please visit the [Release page](https://gitee.com/deepin-community-store/spark-store/releases), find the latest version, and choose the package suitable for your current system.
> ⚠️ Special Note: If you are using Debian10/Debian11 or Ubuntu 20.04, you may need to download additional dependency packages. After downloading, unzip multiple times until you see the software user guide. For operating systems later than Ubuntu 22.04, you do not need to install dependency packages. Just follow the steps above to install the main program directly.
---

90
FAQ.zh.md Normal file
View File

@@ -0,0 +1,90 @@
# FAQ
## 星火应用商店FAQ与支持指南
### 简介
星火应用商店是一个面向 Linux 用户的应用商店,支持多种不同的 Linux 发行版。以下是一些常见问题及解决方案。请注意,该文档主要面向对 Linux 和 APT 软件包管理系统不熟悉的普通用户。
---
### 交流与反馈
**Q: 在哪进交流群?**
**A:** 你可以点击[这里](https://www.deepinos.org/)进入星火商店的主交流平台。
> ⚠️ 如果上面的链接无法使用,你还可以加入我们的 QQ 群作为备选方案,群号是 872690351 和 865927727。我们还提供论坛作为交流平台。
arm64与amd64的区别
arm64
* 全称: Advanced RISC Machine 64-bit
* 主要用途: 主要应用于移动设备、嵌入式系统以及一些新型的服务器和桌面计算机。
* 优势: 低功耗、高效率,适合用在电池驱动和热敏感的设备。
* 主要生产商: 苹果、高通、海思、飞腾等。
amd64
* 全称: AMD 64-bit, 也被称为 x86_64
* 主要用途: 主要应用于桌面计算机、笔记本以及服务器。
* 优势: 高性能,适用于计算密集型应用。
* 主要生产商: Intel和AMD。
* 两者最主要的不同在于指令集和应用场景。amd64通常用于高性能需求的计算机和服务器而arm64则更多应用于功耗要求更严格的场合。
查看方法:
Linux
- 打开终端。
- 输入 uname -m 或 arch 并按回车。
- 你将看到你的处理器架构(可能是 x86_64, aarch64 等)。
---
### 国产架构支持
**Q: 我是国产架构,怎么获取应用?**
**A:** 目前,星火商店支持**arm**架构的国产芯片。你可以下载适用于 arm64 架构的deb包软件安装包
> ⚠️ 请注意这是实验性的支持。如果遇到问题请在星火交流平台、QQ群或论坛向我们反馈。
---
### 安装依赖问题
**Q: 安装依赖包出现错误**
**A:** 如果你使用UOS或deepin请不要安装依赖包。对于Kali Linux/Kdeneon等暂时不支持请自行编译安装。
> 💡 出现错误时,尝试运行 `sudo apt update` 后再尝试安装。如果问题仍然存在,请参考第一条,进入交流平台寻求帮助。
---
### 投稿与应用更新
**Q: 在哪里投稿?**
**A:** 你可以在应用商店界面的右上角菜单找到“投递应用”的选项。
---
### 非deepin/UOS用户支持
**Q: 我不是deepin/UOS用户可以使用星火应用商店吗**
**A:** 可以,如果你是使用 Ubuntu 22.04,请直接安装。对于 Ubuntu 20.04/Debian10/Debian11请先安装依赖包。
---
### 安装方法
**Q: 我可以用dpkg -i安装吗**
**A:** 不可以!使用 `sudo apt install ./xxxx.deb` 来安装或者使用gdebi等图形化的安装器。
> ⚠️ 直接使用dpkg是不会处理软件依赖的这是一个常见的错误。
---
### 系统更新
**Q: 星火商店会影响系统正常更新吗?**
**A:** 不会,星火商店已经将应用源与系统源分开,不会影响系统的正常更新。
---
### 报告问题和应用下架
**Q: 有些应用已经过时或者失效了,我想让他下架**
**A:** 你可以前往 [这里](https://gitee.com/deepin-community-store/software_-issue) 报告问题。
---
### 安装星火应用商店
如果你想安装星火应用商店,请打开[Release页面](https://gitee.com/deepin-community-store/spark-store/releases),找到最新版本,并选择适用于当前系统的安装包下载。
> ⚠️ 特别提示: 如果你在使用 Debian10/Debian11 或 Ubuntu 20.04,你可能额外下载依赖补充包。您需要在下载完依赖包后,解压多次一直到看到内部的软件使用说明,对于 Ubuntu22.04 以后的操作系统版本,您无需安装依赖包,您需要按照上面的操作直接安装本体程序。
---

683
LICENSE
View File

@@ -1,674 +1,29 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
星火开源软件协议Spark Opensource LICENSE
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
版权所有 (C) 2023 星火社区
Preamble
根据 GNU 通用公共许可证第三版GPL v3本软件是自由软件您可以修改和再发布它。但是为了维护原作者的权益并保护社区用户的权益请遵守以下条款
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
1. 对本仓库下的所有文件生效:本许可证适用于本仓库(或项目)下的所有文件。任何使用、修改或再发布本软件的个人或组织都必须遵守本许可证。
2. 版权声明和许可证文件:您不得移除、隐藏或更改本软件中包含的原作者的版权声明和许可证文件。保留原作者的权益信息对于维护开源软件生态系统至关重要。
3. 版本标注:如果您对本软件做出修改并再发布,您必须在醒目位置标注此版本并非星火社区官方提供。这样可以避免误导使用者认为该软件为星火社区官方提供的版本。
4. 商标使用您不得在再发布版本中使用“星火应用商店”、“Spark Store”或星火应用商店的Logo等可能误导使用者此软件由星火社区官方提供的信息。
5. 其他条款:除上述约定外,您应遵守 GPL v3 的所有其他条款和要求。
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
GPLV3许可证的完整文本可以在以下链接找到https://www.gnu.org/licenses/gpl-3.0.html
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
---------------------------------------------------------------------------------------------------------------------------------
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
Spark Opensource LICENSE
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Copyright (C) 2023 The Spark Community
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
This software is free software; you can modify and redistribute it under the terms of the GNU General Public License version 3 (GPL v3). However, to protect the rights of the original authors and the interests of the community users, please adhere to the following terms:
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
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.
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.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it 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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
You can find the full text of GPLV3 license at: https://www.gnu.org/licenses/gpl-3.0.html

674
LICENSE-GPL3 Normal file
View File

@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it 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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

163
README.md
View File

@@ -1,73 +1,160 @@
# 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)
# Spark App Store
[![star](https://gitee.com/spark-store-project/spark-store/badge/star.svg?theme=gvp)](https://gitee.com/spark-store-project/spark-store/stargazers) [![fork](https://gitee.com/spark-store-project/spark-store/badge/fork.svg?theme=gvp)](https://gitee.com/spark-store-project/spark-store/members)
Spark Store aims to collect Linux apps for the convieniece of Linux new comers
## Introduction
The collecting process needs everyone's help
Welcome to the Spark App Store! This is an app store designed for Linux users, aiming to solve the problem of dispersed and difficult-to-obtain applications in the Linux ecosystem. No matter what type of Linux distribution you are using, you may find suitable software packages here.
We set up this APP Store and collect APPs/tools that everyone need widely. Also we pack Windows apps with wine.
The number of Linux applications is relatively limited, and the availability of Wine software is also quite challenging. Excellent development and tool resources are scattered across various communities and forums, making it difficult for the entire ecosystem to improve comprehensively.
All packages will be shared in our repository for users to get freely.
The construction of the ecosystem is not dependent on the isolated efforts of individuals but requires the participation of the entire community. Only when everyone's "sparks" gather together can they ignite a "prairie fire."
Distrobution supportedDeepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(May stop support in the future ; UniontechOS Home 21
To improve this situation, we have launched this app store. We have broadly included various user-demand software packages, gathered high-quality tools, and actively adapted Wine applications, all stored in our software library for easy user access.
*About OpenKylin and deepin 23*
**Currently supported Linux distributions include:**
The adaptation work is scheduled after their official release.
- **amd64 architecture:** deepin 20 / deepin 23 / Ubuntu 20.04 / Ubuntu 22.04 / UOS Home Edition 20
- **arm64 architecture:** UOS Professional Edition 1060 / Ubuntu 22.04 / deepin 23
You can track our Issue resoving progress here https://gitee.com/deepin-community-store/spark-store/board
> Special Note: We also support all versions of Ubuntu operating systems higher than Ubuntu 22.04, such as Ubuntu 22.10, 23.04, 23.10, etc.
**Important Notice:** This software does not provide any form of warranty. If you plan to use it on UOS Professional Edition, please make sure to understand and enable Developer Mode. Make sure you have basic troubleshooting capabilities. It should be clear that we have not conducted extensive testing on the UOS operating system. Therefore, using the Spark client may lead to a series of issues like failed system updates, data loss, etc., all risks to be borne by the user.
We hope people who see here can also join our teamdevelopment help or submit applications are welcomed
## Team Collaboration: For detailed documentation related to branch management, please see [this link](https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo).
If you want to submit an APP to share with othersPlease [Click here](https://upload.deepinos.org/index)
We warmly welcome you to join our development team. Whether you want to participate in development or submit applications, you can find your place here to jointly promote the development of the Linux application ecosystem.
You can track our Issue handling status in real-time through the following link: [Gitee Issue Board](https://gitee.com/deepin-community-store/spark-store/board).
## 🙌 A simple start
If you have a software package you'd like to submit, please [click here to submit](https://upload.deepinos.org/index).
If you simply want to install the Spark Store,just enter the [Release] page, find the version you want and install.
## Contents
If you are using Debian11/Ubuntu 20.04, you will need extra dependency package. Available [here](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
- [Determine your system architecture](#determine-your-system-architecture)
- [System support and installation guide](#system-support-and-installation-guide)
- [For Deepin / UOS Users](#for-deepin-users)
- [For Ubuntu Users](#for-ubuntu-users)
- [For Debian Users](#for-debian-users)
- [Frequently Asked Questions (FAQ)](#frequently-asked-questions-faq)
- [Contact and Feedback](#contact-and-feedback)
---
#### Compile and developement
## Determine your system architecture
For Deepin V20/UOS 21/ Debian 11
Before installing any software, you need to know what architecture your computer runs on (such as x86_64/amd64 or aarch64/arm64).
```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
**How to check:**
```
1. Open a Linux terminal.
2. Type `uname -m` or `arch` and press Enter.
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
You will see an output, and that's your system architecture.
```
- If you see `x86_64`, your system is AMD64 architecture.
- If you see `aarch64`, your system is ARM64 architecture.
Then
---
```shell
git clone https://gitee.com/deepin-community-store/spark-store.git
cd spark-store
dpkg-buildpackage
```
## System support and installation guide
### For Deepin Users
#### For Deepin Users
## 🚀 Coorperation
1. **Download and Install**
We use Gitee as our code hosting platform. Please click here to contact us.
You can directly search for Spark App Store in the Deepin Store to install, or copy this link to open and install in your browser:
https://gitee.com/deepin-community-store/spark-store
> appstore://deepin-home-appstore-client?app_detail_info/spark-store
### Rocket Chat
To use the latest version, please visit the [Spark App Store Release page](https://gitee.com/deepin-community-store/spark-store/releases) and download the latest version suitable for Deepin. Install to use.
https://chat.shenmo.tech/
Assuming you've downloaded to the `Downloads` folder in your user directory, we recommend you use the APT tool to install:
PWA Client
```shell
cd ~/Downloads
sudo apt install ./spark-store*.deb
```
spk://store/chat/store.spark-app.feedback
### For Ubuntu Users
Copy and paste to search bar or in browser address bar after installing Spark Store
#### For Ubuntu 20.04 Users
1. **Download Dependencies**
* Please visit the [Spark App Store Dependency Download page](https://spark-app.store/download_dependencies_latest) and download the latest dependency package.
* Unzip the dependency package multiple times until you see multiple installation packages ending with `.deb`.
* Follow the instructions in the dependency package to install all the dependencies at once.
2. **Download and Install**
Visit the [Spark App Store Release page](https://gitee.com/deepin-community-store/spark-store/releases), download the installation package that matches your computer's architecture, and install it.
Assuming you've downloaded to the `Downloads` folder in your user directory, we recommend you use the APT tool to install:
```shell
cd ~/Downloads
sudo apt install ./spark-store*.deb
```
#### For Ubuntu 22.04 and Higher Version Users
1. **No Need to Install Dependencies**
2. **Download and Install**
Visit the [Spark App Store Release page](https://gitee.com/deepin-community-store/spark-store/releases), download the installation package that matches your computer's architecture, and install it.
Assuming you've downloaded to the `Downloads` folder in your user directory, we recommend you use the APT tool to install:
```shell
cd ~/Downloads
sudo apt install ./spark-store*.deb
```
### For Debian Users
#### For Debian 11 Users
1. **Download Dependencies**
* Please visit the [Spark App Store Dependency Download page](https://spark-app.store/download_dependencies_latest) and download the latest dependency package.
* Unzip the dependency package multiple times until you see multiple installation packages ending with `.deb`.
* Follow the instructions in the dependency package to install all the dependencies at once.
2. **Download and Install**
Please visit the [Spark App Store Release page](https://gitee.com/deepin-community-store/spark-store/releases) and download. Install to use.
#### For Debian 12+ Users
1. **No Need to Install Dependencies**
2. **Download and Install**
Please visit the [Spark App Store Release page](https://gitee.com/deepin-community-store/spark-store/releases), download the installation package that matches your computer's architecture, and install it.
Assuming you've downloaded to the `Downloads` folder in your user directory, we recommend you use the APT tool to install:
```shell
cd ~/Downloads
sudo apt install ./spark-store*.deb
```
---
## Frequently Asked Questions (FAQ)
Please refer to the [Spark App Store FAQ and Support Guide](https://gitee.com/deepin-community-store/spark-store/blob/dev/FAQ.md).
You can also check the [Chinese version](https://gitee.com/deepin-community-store/spark-store/blob/dev/FAQ.zh.md) here.
---
## Contact and Feedback
- If you have any questions or suggestions, please submit them via email or on our [Gitee page](https://gitee.com/deepin-community-store/spark-store/issues).
- If you want to follow our development progress, you can go to the [Spark App Store Board](https://gitee.com/deepin-community-store/spark-store/board) for more information.
- Our [Forum](https://www.deepinos.org/)
- Our [QQ Group](https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/)
---

View File

@@ -1,68 +1,173 @@
# 星火应用商店
[![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)
众所周知国内的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)
[![star](https://gitee.com/spark-store-project/spark-store/badge/star.svg?theme=gvp)](https://gitee.com/spark-store-project/spark-store/stargazers) [![fork](https://gitee.com/spark-store-project/spark-store/badge/fork.svg?theme=gvp)](https://gitee.com/spark-store-project/spark-store/members)
## 🙌 简单的开始
## 简介
如果想安装 `星火应用商店` ,请打开右侧的 [Release] 页面,找到最新版本,并选择适用于当前系统的安装包下载
欢迎来到星火应用商店这是一个为Linux用户设计的应用商店旨在解决Linux生态下应用分散、难以获取的问题。无论你是使用什么类型的Linux发行版这里都有可能找到适合你的软件包
如果你在使用 `Debian 11/Ubuntu 20.04`,你需要额外下载[依赖补充包](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
Linux 应用的数量相对有限Wine 软件的可获得性也颇为困难。优秀的开发和工具资源散布在各大社区和论坛之间,这种分散化让整个生态系统难以得到全面的提升。
生态系统的构建并非依赖个体的孤立努力,而需要全社区共同参与。只有当大家的“星火”聚集一处,方可引发“燎原之势”。
为了改善这一现状,我们推出了这个应用商店。我们广泛地收录了各种用户需求的软件包,汇集了高质量的小工具,并主动对 Wine 应用进行了适配,一切都储存在我们的软件库中,以便用户方便地获取。
**当前支持的Linux发行版包括**
- **amd64架构** deepin 20 / deepin 23 / Ubuntu 20.04 / Ubuntu 22.04 / UOS家庭版20
- **arm64架构** UOS专业版1060 / Ubuntu 22.04 / deepin 23
> 特别说明我们还支持所有版本高于Ubuntu 22.04的Ubuntu操作系统例如Ubuntu 22.10、23.04、23.10等。
**重要须知:** 本软件不提供任何形式的保证。若您计划在UOS专业版上使用请务必了解并启用开发者模式。请确保您具备基础的故障排查能力。需要明确的是我们没有在UOS操作系统上进行广泛的测试。因此使用星火客户端可能会导致一系列问题如系统更新失败、数据丢失等所有风险需由用户自行承担。
## 关于团队协作:分支管理相关的详细文档可参见 [此链接](https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo)。
我们热忱欢迎您加入我们的开发团队。无论您是想参与开发还是想提交应用都能在这里找到属于您的一席之地共同推动Linux应用生态的发展。
您可以通过以下链接实时跟踪我们的Issue处理状态[Gitee Issue看板](https://gitee.com/deepin-community-store/spark-store/board)。
若您有软件包想要提交,敬请 [点击此处进行投稿](https://deepin-community-store.gitee.io/spark-wiki/#/Submit/Submit)。
## 目录
- [确定你的系统架构](#确定你的系统架构)
- [系统支持与安装指引](#系统支持与安装指引)
- [对于 Deepin / UOS 用户](#对于deepin用户)
- [对于 Ubuntu 用户](#对于ubuntu用户)
- [对于 Debian 用户](#对于debian用户)
- [常见问题FAQ](#常见问题faq)
- [联系与反馈](#联系与反馈)
---
#### 编译安装
## 确定你的系统架构
在安装任何软件之前你需要知道你的计算机运行的是哪种架构如x86_64/amd64或aarch64/arm64
**如何检查:**
1. 打开Linux终端。
2. 输入 `uname -m``arch` 并按回车。
你会看到一个输出,这就是你的系统架构。
- 如果看到 `x86_64`你的系统是AMD64架构。
- 如果看到 `aarch64`你的系统是ARM64架构。
---
## 系统支持与安装指引
根据你的Linux发行版和系统架构以下是安装星火应用商店的详细步骤。
### 对于 Deepin 用户
#### 对于 Deepin 用户
1. **下载并安装**
您可直接在深度商店搜索 星火应用商店 安装,或复制此链接到浏览器打开安装
> appstore://deepin-home-appstore-client?app_detail_info/spark-store
Deepin V20/UOS 21 系统下, 安装依赖
若要使用最新版本,请访问[星火应用商店的Release页面](https://gitee.com/deepin-community-store/spark-store/releases)并下载适用于Deepin的最新版本。安装后即可使用。
```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
假设您下载到用户目录下的 Downloads 文件夹, 我们推荐您使用 APT 工具安装:
```
```shell
cd ~/Downloads
sudo apt install ./spark-store*.deb
```
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
### 对于 Ubuntu 用户
```
#### 对于 Ubuntu 20.04 用户
然后
```shell
git clone https://gitee.com/deepin-community-store/spark-store.git
cd spark-store
dpkg-buildpackage
```
1. **下载依赖包**
* 请访问[星火应用商店依赖包下载页面](https://spark-app.store/download_dependencies_latest) 下载最新的依赖包。
* 请多次解压依赖包,直到你可以看到诸多以 deb 结尾的安装包。
* 依据依赖包内的说明,一次性安装所有的依赖包。
2. **下载并安装**
## 🚀 协作
请访问[星火应用商店的Release页面](https://gitee.com/deepin-community-store/spark-store/releases),下载和您电脑相同架构的安装包并安装。
非常感谢有兴趣的开发者或爱好者参与 `星火应用商店` 项目,分享你的见解与思路。
假设您下载到用户目录下的 Downloads 文件夹, 我们推荐您使用 APT 工具安装:
### 交流平台
```shell
cd ~/Downloads
sudo apt install ./spark-store*.deb
```
https://chat.shenmo.tech/
#### 对于 Ubuntu 22.04 及更高版本的 Ubuntu 用户
1. **无需安装依赖包**
客户端PWA
spk://store/chat/store.spark-app.feedback
2. **下载并安装**
(安装星火商店后在浏览器打开或复制到搜索栏打开)
请访问[星火应用商店的Release页面](https://gitee.com/deepin-community-store/spark-store/releases),下载和您电脑相同架构的安装包并安装。
假设您下载到用户目录下的 Downloads 文件夹, 我们推荐您使用 APT 工具安装:
```shell
cd ~/Downloads
sudo apt install ./spark-store*.deb
```
### 对于 Debian 用户
#### 对于 Debian 11 用户
1. **下载依赖包**
* 请访问[星火应用商店依赖包下载页面](https://spark-app.store/download_dependencies_latest) 下载最新的依赖包。
* 请多次解压依赖包,直到你可以看到诸多以 deb 结尾的安装包。
* 依据依赖包内的说明,一次性安装所有的依赖包。
2. **下载并安装**
请访问[星火应用商店的Release页面](https://gitee.com/deepin-community-store/spark-store/releases)并下载,安装后即可使用。
#### 对于 Debian 12+ 用户
1. **无需安装依赖包**
2. **下载并安装**
请访问[星火应用商店的Release页面](https://gitee.com/deepin-community-store/spark-store/releases),下载和您电脑相同架构的安装包并安装。
假设您下载到用户目录下的 Downloads 文件夹, 我们推荐您使用 APT 工具安装:
```shell
cd ~/Downloads
sudo apt install ./spark-store*.deb
```
---
## 常见问题FAQ
请参见[星火应用商店FAQ与支持指南](https://gitee.com/deepin-community-store/spark-store/blob/dev/FAQ.md)。
在这里可以查阅[中文版本](https://gitee.com/deepin-community-store/spark-store/blob/dev/FAQ.zh.md)。
---
## 联系与反馈
- 如果您有任何问题或建议,请通过邮件或在[Gitee页面](https://gitee.com/deepin-community-store/spark-store/issues)上提交问题。
- 如果你想关注我们的开发进度,可以跳转[星火应用商店Board](https://gitee.com/deepin-community-store/spark-store/board)获取更多信息。
- 我们的[论坛](https://www.deepinos.org/)
- 我们的[QQ群](https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/)
---

24
build_and_install.sh Executable file
View File

@@ -0,0 +1,24 @@
# 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
# ```
# 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
# ```
echo "Deepin V20/UOS 21 系统下, 安装依赖"
echo "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"
echo "Ubuntu 22.04 系统下, 安装依赖"
echo "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"
dpkg-buildpackage -j$(cat /proc/cpuinfo | grep processor | wc -l)
sudo apt reinstall ../spark-store_*.deb
rm ../spark-store_*

256
debian/changelog vendored
View File

@@ -1,3 +1,258 @@
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
* 新增:内置在终端打开功能
* 调整散列验证更改为使用sha512
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.7.1) stable; urgency=medium
* 修复aptss加锁失败现在会正常报错
* 新增在aptss的特定操作时添加了提示
* 新增在aptss提示加粗
* 调整ssinstall验证支持使用cdn.d.获取
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.7) stable; urgency=medium
* 修复:更新星火商店后禁止更新提醒的配置失效
* 新增:支持在设置中关闭平台不兼容提示
* 调整:更改了下载量统计的方式,减少漏数
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.6.6) stable; urgency=medium
* 调整:文案修改:安装失败后引导查看详情而不是重新安装
* 修复dpkg阻塞出现漏掉的安装失败现在在安装后检测是否安装
* 修复UOS专业版上安装成功仍然显示失败的问题方式忽略E:等消息,仅检查脚本报错
* 调整卸载应用时采用autopurge以一并卸载依赖
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.6.5) stable; urgency=medium
* 调整ssaudit安装结束时会提示安装结束
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.6.4) stable; urgency=medium
* 修复:关于页面的入口过时
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.6.3) stable; urgency=medium
* 修复:部分下载统计线路失效
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.6.2) stable; urgency=medium
* 新增支持arm架构搜索
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.6.1) stable; urgency=medium
* 修复mint下更新检测不正常
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.6) stable; urgency=medium
* 修复:截图加载失败时点击闪退
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.5.1) stable; urgency=medium
* 调整重写了spark-dstore-patch速度提升尤其对机械硬盘下
* 调整优化了aptss源文件同步策略
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.5) stable; urgency=medium
* 修复ssinstall在文件不存在时仍然报安装成功
* 修复删除不再需要的依赖libc6-dev
* 在aarch64架构安装时也启用32位支持
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.4) stable; urgency=medium
* 修复ssinstall校验失败的时候仍然提示安装成功
* 新增ssinstall可以自动刷新ssupdate以防止仓库更新中导致的安装校验失败
* 修复:在不受支持的平台安装应用时弹出提示不正确
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.3.3) stable; urgency=medium
* aptss 不再使用bwrap去除依赖支持容器中启动
* aptss 支持非root模式启动
* aptss 添加transhell支持
* 关于界面自动获取分支名称
* 现在安装成功则自动删除安装包
* 完成 arm 架构大部分功能适配
* 修复依赖不完整的问题
* 4.3 roadmap 实现,在浏览不支持的应用时会出现提示
* 4.3 roadmap 实现,在下载文件夹没有读写权限时会出现提示
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.3.2~Reason10) stable; urgency=medium
* 完成除web外大部分功能适配
* 修复依赖不完整的问题
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.3.2~Reason9) stable; urgency=medium
* sender-d.sh
* ssinstall和ssaudit的安装测试转到upgrade-worker
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.3.2~Reason8) stable; urgency=medium
* sender-d改用cpp重写在aarch64上稳定运行
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.3.2~Reason7) stable; urgency=medium
* ssinstall发现无法验证时尝试update而不是ssupdate
* 启动每日aptss update
* ssinstall在发现无法安装后尝试先进行下aptss update
* 修复:安装商店后首次启动无法安装任何软件
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.3.2~Reason5) stable; urgency=medium
* aptss 不再使用bwrap去除依赖支持容器中启动
* aptss 支持非root模式启动
* aptss 添加transhell支持
* 关于界面自动获取分支名称
* 现在安装成功则自动删除安装包
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.3.2~Reason3) stable; urgency=medium
* 现在可在x86上编译使用同一套代码
* 暂时在aarch64上使用旧web----等待柚子
* 空间,疾疫,现在是静谧
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
spark-store (4.2.3.2~only-for-test1) stable; urgency=medium
* 注意!!!!!! 此版本仅为启动测试还需要进一步完善——hardcode需要改善——关于web界面的调用方式需要在柚子做好之后修改成新的
* fix: hardcode
* fix: sender-d
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2.3.1) stable; urgency=medium
* 修复: ssinstall验证签名出错
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2.3) stable; urgency=medium
* 修复: 编译依赖不全
* 修复: prerm导致的dpkg崩溃
* 新增: aptss 检查package配置增加sdustore
* 新增: 一键编译并安装脚本
* 新增: 后台安装结束后退出任务栏驻留
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2.3~test4) stable; urgency=medium
* 修复: aptss 无法安装
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2.3~test3) stable; urgency=medium
* 调整:打包时从 debian/changelog 自动获取构建版本号并写入关于窗口保证与deb一致
* 新增:支持 DTK 5.6.4 关于对话框“版本特性”显示功能。目前只在deepin编译安装时开启
* 修复:修复下载列表对话框中,点击某个 item 取消下载按钮后下载列表无法再次显示的问题
* 修复:多个应用安装可能会出现某一个应用没有安装
* 修复:修复下载按钮点击/双击/拖动时,主窗口动作与下载管理对话框动作同时触发问题
* aptss 获取线路信息 转到从 d. 服务器获取
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2.3~test2) stable; urgency=medium
* 调整:开启安装包加固
@@ -5,6 +260,7 @@ spark-store (4.2.3~test2) stable; urgency=medium
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2.3~test1) stable; urgency=medium
* 修复因判断安装状态错误创建多个相同任务的bug

15
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,
@@ -14,15 +15,16 @@ Build-Depends:
libdtkcore-dev(>=5.0),
libdtkgui-dev(>=5.0),
libdtkwidget-dev(>=5.0),
libqt5svg5-dev,
qttools5-private-dev,
qtwebengine5-dev,
qtwayland5,
qtwayland5-dev-tools,
gcc,
g++
Standards-Version: 3.0
Standards-Version: 4.0.0
Homepage: https://www.spark-app.store/
Package: spark-store
Architecture: any
Depends:${shlibs:Depends}, ${misc:Depends},
@@ -38,10 +40,11 @@ Depends:${shlibs:Depends}, ${misc:Depends},
curl,
openssl,
dde-qt5integration,
bubblewrap,
aria2,
gcc,
gnupg,
zenity,
libc6-dev
policykit-1,
libnotify-bin,
desktop-file-utils
Description: Spark Store
A community powered app store, based on DTK.

14
debian/rules vendored
View File

@@ -1,14 +1,14 @@
#!/usr/bin/make -f
export QT_SELECT=5
export QT_SELECT = qt5
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
include /usr/share/dpkg/default.mk
DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
DH_AUTO_ARGS = --parallel --buildsystem=qmake
DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
#export DH_VERBOSE = 1
%:
dh $@ --parallel
@@ -18,14 +18,13 @@ override_dh_auto_clean:
override_dh_auto_configure:
mkdir -p $(CURDIR)/build
dh_auto_configure MAKEFLAGS=-j$(JOBS) -- spark-store-project.pro \
qmake BUILD_VERSION=$(DEB_VERSION_UPSTREAM) spark-store-project.pro \
-spec linux-g++ CONFIG+=qtquickcompiler \
-o $(CURDIR)/build/
override_dh_auto_build:
make -C $(CURDIR)/build -j$(JOBS)
make MAKEFLAGS="$(MAKEFLAGS)" -C $(CURDIR)/build
override_dh_auto_install:
make -C $(CURDIR)/build install \
@@ -36,3 +35,4 @@ override_dh_auto_install:
# Qt Mutidedia lib will ref to network libraray.
override_dh_shlibdeps:
dh_shlibdeps --dpkg-shlibdeps-params=--warnings=0

View File

@@ -1,60 +1,56 @@
#!/bin/sh
#!/bin/bash
case "$1" in
configure)
# Enable i386 arch
echo "Enable i386 arch..."
dpkg --add-architecture i386
case `arch` in
x86_64)
echo "Enabling i386 arch..."
dpkg --add-architecture i386
;;
# config for aptss
mkdir -p /etc/aptss/sources.list.d
ln -s -f /etc/apt/sources.list /etc/aptss/sources.list
aarch64)
echo "Will not enable armhf since 4271"
;;
# Remove the sources.list file
if [ -e /etc/apt/sources.list.d/sparkstore.list ];then
rm /etc/apt/sources.list.d/sparkstore.list
fi
*)
echo "Unknown architecture, skip enable 32-bit arch"
;;
esac
mkdir -p /var/lib/aptss/lists
# Remove the sources.list file
rm -f /etc/apt/sources.list.d/sparkstore.list
# Check if /usr/local/bin existed
mkdir -p /usr/local/bin
# Create symbol links for binary files
ln -s -f /opt/durapps/spark-store/bin/ussinstall /usr/local/bin/ussinstall
ln -s -f /opt/durapps/spark-store/bin/ussremove /usr/local/bin/ussremove
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/spark-dstore-patch /usr/local/bin/spark-dstore-patch
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/local/bin/ss-apt-fast
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/bin/aptss
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/bin/aptss
# Create symbol links for SSINSTALL
ln -s -f /opt/durapps/spark-store/bin/auto-install-policy/store.spark-app.ssinstall.policy /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy
echo "Compiling the Sender module..."
gcc -Wformat -Wformat-security -Werror=format-security /opt/durapps/spark-store/bin/ss-feedback/sender-d.sh.c -o /opt/durapps/spark-store/bin/ss-feedback/sender-d
# Install key
mkdir -p /tmp/spark-store-install/
cp -f /opt/durapps/spark-store/bin/spark-store.asc /tmp/spark-store-install/spark-store.asc
cp -f /opt/durapps/spark-store/bin/spark-store.asc /tmp/spark-store-install/spark-store.asc
gpg --dearmor /tmp/spark-store-install/spark-store.asc
cp -f /tmp/spark-store-install/spark-store.asc.gpg /etc/apt/trusted.gpg.d/spark-store.gpg
# Run apt update to avoid users being fucked up by the non-exist dependency problem
# Now abandoned as aptss now run ssupdate everytime
#aptss ssupdate
# Start upgrade detect service
systemctl daemon-reload
systemctl enable spark-update-notifier
service spark-update-notifier start
systemctl start spark-update-notifier
# Update certain caches
update-icon-caches /usr/share/icons/hicolor || true
@@ -63,12 +59,10 @@ case "$1" in
update-mime-database /usr/share/mime || true
# Send email for statistics
# /tmp/spark-store-install/feedback.sh
#/tmp/spark-store-install/feedback.sh
# Remove temp dir
rm -rf /tmp/spark-store-install
;;
triggered)

View File

@@ -1,4 +1,4 @@
#!/bin/sh
#!/bin/bash
# Update certain caches
update-icon-caches /usr/share/icons/hicolor || true

View File

@@ -1,48 +1,62 @@
#!/bin/sh
#!/bin/bash
if [ "$1" = "remove" ] || [ "$1" = "purge" ];then
# Remove residual symbol links
rm /usr/local/bin/spark-store
rm /usr/local/bin/ssinstall
rm /usr/local/bin/ssaudit
rm /usr/local/bin/spark-dstore-patch
rm /usr/local/bin/ussinstall
rm /usr/local/bin/ussremove
rm /usr/local/bin/ss-apt-fast
rm /usr/bin/aptss
function notify-send()
{
# Detect the user using such display
local user=$(who | awk '{print $1}' | head -n 1)
rm -rf /etc/aptss/
# Detect the id of the user
local uid=$(id -u $user)
# Remove Sender module
rm /opt/durapps/spark-store/bin/ss-feedback/sender-d
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send "$@"
}
# Remove residual symbol links to stop upgrade detect if exist
if [ -e /etc/xdg/autostart/spark-update-notifier.desktop ];then
rm /etc/xdg/autostart/spark-update-notifier.desktop
fi
if [ "$1" = "remove" -o "$1" = "purge" ] ; then
echo "$1"
echo "卸载操作,进行配置清理"
# Shutdown services
service spark-update-notifier stop
# 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
# Stop update detect service
systemctl disable spark-update-notifier
rm -rf /etc/aptss/
rm -rf /var/lib/aptss/
# Remove residual symbol links to stop upgrade detect
rm -f /etc/xdg/autostart/spark-update-notifier.desktop
# Remove config files
for username in `ls /home`
do
echo /home/$username
if [ -d /home/$username/.config/spark-union/spark-store ]
then
rm -rf /home/$username/.config/spark-union/spark-store
fi
done
# Shutdown services
systemctl stop spark-update-notifier
# Stop update detect service
systemctl disable spark-update-notifier
# Clean the auto install polkit file if exist
if [ -f "/usr/share/polkit-1/actions/store.spark-app.ssinstall.policy" ] ; then
rm /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy
fi
# Remove gpg key file
if [ -f "/etc/apt/trusted.gpg.d/spark-store.gpg" ] ; then
rm /etc/apt/trusted.gpg.d/spark-store.gpg
fi
apt-key del '9D9A A859 F750 24B1 A1EC E16E 0E41 D354 A29A 440C'
# Clean the auto install polkit file if exist
rm -f /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy
# Remove gpg key file
rm -f /etc/apt/trusted.gpg.d/spark-store.gpg
apt-key del '9D9A A859 F750 24B1 A1EC E16E 0E41 D354 A29A 440C'
else
echo "非卸载操作,不进行配置清理"
if [ ! -z "`pidof spark-store`" ] ; then
echo "关闭已有 spark-store.."
notify-send "正在升级星火商店" "请在升级结束后重启星火商店" -i spark-store
killall spark-store
fi
fi

View File

@@ -0,0 +1,12 @@
[Desktop Entry]
Categories=Development;
Encoding=UTF-8
Exec=/opt/durapps/spark-store/bin/open-in-terminal/open-in-terminal %U
Icon=open-me-in-terminal
MimeType=application/x-desktop
Name=Open me in terminal
Name[zh_CN]=在终端中打开
NoDisplay=true
StartupWMClass=在终端中打开
Terminal=true
Type=Application

View File

@@ -0,0 +1,5 @@
#!/bin/bash
TRANSHELL_CONTENT_RUNNING_IN_NOT_ROOT_USER="INFO:Running in non-root mode! If error occurs, please try to excute me as root."
TRANSHELL_CONTENT_INFO_SOURCES_LIST_D_IS_EMPTY="INFOsources.list.d directory is emptywill not try to sync"
TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST="Getting server and mirror lists..."
TRANSHELL_CONTENT_PLEASE_USE_APTSS_INSTEAD_OF_APT="Please note: Although the error message suggests using \"apt\" (such as \"apt install --fix-broken\"), please use \"aptss\" instead of \"apt\" when troubleshooting errors (for example, change to \"aptss install --fix-broken\")."

View File

@@ -0,0 +1,5 @@
#!/bin/bash
TRANSHELL_CONTENT_RUNNING_IN_NOT_ROOT_USER="信息正在使用非root权限模式启动若出现问题请尝试使用root权限执行指令"
TRANSHELL_CONTENT_INFO_SOURCES_LIST_D_IS_EMPTY="信息sources.list.d文件夹是空的将不会尝试同步"
TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST="从服务器获取配置和镜像列表..."
TRANSHELL_CONTENT_PLEASE_USE_APTSS_INSTEAD_OF_APT="注意尽管报错信息中提示使用apt如apt install --fix-broken),请在排查错误的时候使用aptss而不是apt(对于例子,改为使用 aptss install --fix-broken)."

View File

@@ -63,7 +63,7 @@ _aptss()
# Complete a -t<SPACE><TAB>
case $prev in
-t|--target-release)
COMPREPLY=( $( compgen -W "$( apt-cache policy -o Dir::Cache="/etc/aptss/" | egrep -o 'a=[^,]*|n=[^,]*' | cut -f2- -d= | sort -u)" -- "$cur" ) )
COMPREPLY=( $( compgen -W "$( apt-cache policy -o Dir::Cache="/var/lib/aptss/" | egrep -o 'a=[^,]*|n=[^,]*' | cut -f2- -d= | sort -u)" -- "$cur" ) )
return 0
;;
esac
@@ -185,12 +185,12 @@ _aptss()
return 0
;;
show|list|download|changelog|depends|rdepends)
COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/etc/aptss/" \
COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/var/lib/aptss/" \
2> /dev/null ) )
return 0
;;
install)
COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/etc/aptss/" \
COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/var/lib/aptss/" \
2> /dev/null ) )
if [[ "$cur" == ./* || "$cur" == /* ]]; then
_filedir "deb"
@@ -198,8 +198,8 @@ _aptss()
return 0
;;
source|build-dep|showsrc|policy)
COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/etc/aptss/" \
2> /dev/null ) $( apt-cache dumpavail -o Dir::Cache="/etc/aptss/" | \
COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/var/lib/aptss/" \
2> /dev/null ) $( apt-cache dumpavail -o Dir::Cache="/var/lib/aptss/" | \
command grep "^Source: $cur" | sort -u | cut -f2 -d" " ) )
return 0
;;

View File

@@ -0,0 +1,26 @@
{
"magic": "dsg.config.meta",
"version": "1.0",
"contents": {
"featureUpdated": {
"value": false,
"serial": 0,
"flags": [],
"name": "Whether the application has new feature updates",
"name[zh_CN]": "配置应用的更新状态",
"description": "Configure the update status of the application",
"permissions": "readwrite",
"visibility": "public"
},
"autoDisplayFeature": {
"value": false,
"serial": 0,
"flags": [],
"name": "The application automatically display new features once",
"name[zh_CN]": "配置应用是否自动展示一次新特性",
"description": "The application automatically display updated contents once",
"permissions": "readwrite",
"visibility": "public"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

View File

@@ -1,6 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
@@ -10,12 +8,15 @@
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="127"
inkscape:export-xdpi="127"
inkscape:export-filename="/home/zhangtianyi/Desktop/deepin-community-store.png"
width="200mm"
height="200mm"
viewBox="0 0 200 200"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
inkscape:version="1.0 (4035a4f, 2020-05-01)"
sodipodi:docname="deepin-community-store.svg">
<defs
id="defs2">
@@ -170,17 +171,18 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="120.33119"
inkscape:cy="507.94585"
inkscape:zoom="0.7"
inkscape:cx="13.97476"
inkscape:cy="371.76152"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1040"
inkscape:window-height="941"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
inkscape:window-maximized="1"
inkscape:document-rotation="0" />
<metadata
id="metadata5">
<rdf:RDF>
@@ -199,70 +201,54 @@
id="layer1"
transform="translate(0,-97)">
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ebebeb;stroke-width:2.87003541;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter2201)"
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ebebeb;stroke-width:2.87004;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter2201)"
id="rect2119"
width="162.54665"
height="170.16383"
x="20.431099"
y="112.51035"
rx="30"
ry="30" />
<circle
style="opacity:1;fill:#959595;fill-opacity:1;stroke:#e9e9e9;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path2121"
cx="58.208336"
cy="131.8244"
r="6.0476193" />
<circle
style="opacity:1;fill:#9c9c9c;fill-opacity:1;stroke:#eaeaea;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path2121-5"
cx="143.63095"
cy="133.71429"
r="6.0476193" />
ry="30"
transform="matrix(1.0253898,0,0,0.97932001,-4.2824724,3.4808454)" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2">
<path
style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 94.205599,42.389243 c 0,0 11.145081,-0.157476 22.599701,6.928753 11.45465,7.086223 18.11074,13.857508 20.27783,18.266716 2.16708,4.409209 9.28755,12.125332 9.13277,26.297795 -0.15488,14.172433 -3.40543,23.620763 -8.97797,31.494323 -5.57254,7.87359 -15.63405,13.85751 -27.70786,14.17247 -12.073829,0.31494 -19.813453,-7.55863 -22.444927,-11.96786 -2.631469,-4.4092 -3.715019,-13.85751 -0.464377,-20.62877 3.250645,-6.77132 8.358796,-6.77132 10.061513,-6.14141 1.702724,0.6299 2.167092,1.5747 3.095852,3.30689 0.928749,1.73219 1.547929,1.41726 2.941089,0.47243 1.39311,-0.94484 1.85748,-2.04715 1.54792,-3.46439 -0.30958,-1.417253 -2.16711,-3.149433 -3.71505,-3.621853 -1.547909,-0.47241 -3.715016,-1.88966 -6.810869,-1.41721 -3.095848,0.47238 -9.132757,2.04711 -14.240906,8.975843 -5.108153,6.92875 -4.488988,17.63684 -1.393134,22.67593 3.095849,5.0391 8.977962,14.48739 21.980539,17.79431 13.00259,3.30693 34.05435,-6.45633 41.32959,-21.57361 7.27524,-15.1173 7.43004,-22.20352 7.12048,-34.643764 C 148.22821,76.875544 137.23793,58.293884 125.00933,51.522601 112.78073,44.751315 103.64797,40.814522 94.205599,42.389243 Z"
style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 94.205599,38.155907 c 0,0 11.145081,-0.157476 22.599701,6.928753 11.45465,7.086223 18.11074,13.857508 20.27783,18.266716 2.16708,4.409209 9.28755,12.125332 9.13277,26.297795 -0.15488,14.172409 -3.40543,23.620739 -8.97797,31.494299 -5.57254,7.87359 -15.63405,13.85751 -27.70786,14.17247 -12.073829,0.31494 -19.813453,-7.55863 -22.444927,-11.96786 -2.631469,-4.4092 -3.715019,-13.85751 -0.464377,-20.62877 3.250645,-6.771296 8.358796,-6.771296 10.061513,-6.141389 1.702724,0.629897 2.167092,1.574691 3.095852,3.306872 0.928749,1.732187 1.547929,1.417257 2.941089,0.472427 1.39311,-0.944834 1.85748,-2.047138 1.54792,-3.464372 -0.30958,-1.417247 -2.16711,-3.149427 -3.71505,-3.621847 -1.547909,-0.47241 -3.715016,-1.88966 -6.810869,-1.41721 -3.095848,0.47238 -9.132757,2.04711 -14.240906,8.975819 -5.108153,6.92875 -4.488988,17.63684 -1.393134,22.67593 3.095849,5.0391 8.977962,14.48739 21.980539,17.79431 13.00259,3.30693 34.05435,-6.45633 41.32959,-21.57361 7.27524,-15.1173 7.43004,-22.203505 7.12048,-34.64374 C 148.22821,72.642208 137.23793,54.060548 125.00933,47.289265 112.78073,40.517979 103.64797,36.581186 94.205599,38.155907 Z"
id="path1002"
inkscape:connector-curvature="0" />
<path
style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 100.67541,105.29647 c 0,0 -3.06474,-2.8951 -5.801108,2.22698 -2.736373,5.12205 -4.049827,9.68737 -1.313459,15.25486 2.736367,5.56745 8.428007,8.90792 17.184447,8.79659 8.75636,-0.11148 15.21419,-2.22699 19.0451,-8.5739 3.83094,-6.34692 6.7862,-11.02357 7.11457,-13.36191 0.32839,-2.33835 2.07965,0.33404 1.53239,2.33834 -0.54728,2.00426 -0.43783,5.9015 1.09454,5.12204 1.53237,-0.77942 2.73637,-2.00427 2.95526,-1.44753 0.21893,0.55673 -1.75127,4.00859 -2.68162,5.73449 -0.93039,1.7259 -3.83094,5.90153 -5.5275,7.51607 -1.69652,1.61458 -4.04981,3.89724 -6.84092,5.56747 -2.79109,1.67024 -7.11454,3.61887 -9.52255,4.06427 -2.40801,0.44539 -7.22403,1.39184 -9.96042,1.2805 -2.73635,-0.11137 -6.23892,-0.61243 -10.124558,-2.56104 -3.885645,-1.94859 -8.099657,-4.95505 -9.741479,-7.96148 -1.641825,-3.00643 -4.159283,-5.73449 -3.61201,-13.30623 0.547277,-7.57175 3.010008,-11.46899 4.870741,-13.25056 1.860731,-1.7816 4.597103,-2.56105 6.403105,-2.17131 1.806004,0.38971 2.955282,1.44755 3.393102,2.22697 0.43781,0.77944 1.149279,2.22699 1.532369,2.50538 z"
style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 100.67541,101.06311 c 0,0 -3.06474,-2.895088 -5.801108,2.22698 -2.736373,5.12205 -4.049827,9.68737 -1.313459,15.25486 2.736367,5.56745 8.428007,8.90792 17.184447,8.79659 8.75636,-0.11148 15.21419,-2.22699 19.0451,-8.5739 3.83094,-6.34692 6.7862,-11.02357 7.11457,-13.36191 0.32839,-2.33835 2.07965,0.33404 1.53239,2.33834 -0.54728,2.00426 -0.43783,5.9015 1.09454,5.12204 1.53237,-0.77942 2.73637,-2.00427 2.95526,-1.44753 0.21893,0.55673 -1.75127,4.00859 -2.68162,5.73449 -0.93039,1.7259 -3.83094,5.90153 -5.5275,7.51607 -1.69652,1.61458 -4.04981,3.89724 -6.84092,5.56747 -2.79109,1.67024 -7.11454,3.61887 -9.52255,4.06427 -2.40801,0.44539 -7.22403,1.39184 -9.96042,1.2805 -2.73635,-0.11137 -6.23892,-0.61243 -10.124558,-2.56104 -3.885645,-1.94859 -8.099657,-4.95505 -9.741479,-7.96148 -1.641825,-3.00643 -4.159283,-5.73449 -3.61201,-13.30623 0.547277,-7.57175 3.010008,-11.46899 4.870741,-13.250551 1.860731,-1.781588 4.597103,-2.561035 6.403105,-2.171298 1.806004,0.38971 2.955282,1.447544 3.393102,2.226958 0.43781,0.779437 1.149279,2.226981 1.532369,2.505371 z"
id="path1012"
inkscape:connector-curvature="0" />
<path
style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 128.47695,145.38219 c 0,0 13.13457,-7.6831 19.26404,-19.82016 6.12948,-12.13707 8.7564,-19.93152 7.99021,-31.84592 -0.76619,-11.914358 -2.62692,-6.012854 -0.54728,-11.134928 2.07964,-5.122074 -1.31345,-15.254857 0.10943,-15.922949 1.42292,-0.668097 4.48765,4.453971 5.3633,8.573903 0.87562,4.119922 4.70654,16.813721 1.64181,32.959394 -3.06472,16.14564 -10.28872,22.60391 -15.10475,26.94655 -4.81603,4.34261 -15.7615,11.91437 -17.40332,11.80302 -1.64183,-0.11148 -1.86073,-0.11148 -1.31348,-1.55891 z"
style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 132.18114,140.09049 c 0,0 13.13457,-7.6831 19.26404,-19.82016 6.12948,-12.13707 8.7564,-19.93152 7.99021,-31.84589 -0.76619,-11.914358 -2.62692,-6.012854 -0.54728,-11.134928 2.07964,-5.122074 -1.31345,-15.254857 0.10943,-15.922949 1.42292,-0.668097 4.48765,4.453971 5.3633,8.573903 0.87562,4.119922 4.70654,16.813721 1.64181,32.959364 -3.06472,16.14564 -10.28872,22.60391 -15.10475,26.94655 -4.81603,4.34261 -15.7615,11.91437 -17.40332,11.80302 -1.64183,-0.11148 -1.86073,-0.11148 -1.31348,-1.55891 z"
id="path1014"
inkscape:connector-curvature="0" />
<path
style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 104.83471,121.99883 c 0,0 7.00512,1.5589 12.36838,-1.78156 5.3633,-3.3405 9.5226,-8.79661 10.17931,-10.91225 0.65672,-2.11564 0.76619,1.89294 1.53236,-0.11125 0.76618,-2.00432 3.83093,-6.01288 2.29855,-15.366239 -1.53237,-9.35333 -1.64182,-9.798747 -4.48762,-14.809463 -2.84586,-5.010719 -9.63207,-11.91437 -13.79134,-14.141359 -4.15927,-2.226986 -9.96037,-5.567464 -17.950594,-5.344766 -7.990202,0.222699 -5.363286,-0.334048 -13.025124,1.002146 -7.661836,1.336187 -14.557491,5.010717 -16.856041,7.015006 -2.298552,2.004286 -8.428023,7.460405 -10.61712,10.46684 -2.189098,3.00643 -8.209113,9.798741 -11.383303,19.263442 -3.174189,9.464683 -4.487646,10.466823 -4.706555,16.702393 -0.21891,6.23557 0.547274,7.90578 -0.766185,8.46256 -1.31346,0.55673 -1.094547,-4.67668 -0.985094,-8.35123 0.109463,-3.6745 0.109463,-13.25056 4.925468,-23.940084 4.816015,-10.689538 13.353489,-19.597489 18.169503,-22.826622 4.816009,-3.229128 10.398208,-7.571752 19.045135,-9.687392 8.646933,-2.115635 17.293863,-1.781586 22.65716,-0.779443 5.3633,1.002145 13.68187,4.453974 18.1695,7.905802 4.48766,3.45183 9.41314,7.683099 13.13459,14.586765 3.72146,6.903648 4.70654,15.700251 4.59709,19.374771 -0.10943,3.674543 -1.97019,12.137103 -4.81601,16.257013 -2.84583,4.11993 -6.67674,9.0193 -10.61711,10.80089 -3.94039,1.78157 -8.75642,2.33833 -12.69675,0.55674 -3.94039,-1.78161 -3.72147,-2.44969 -4.3782,-4.34263 z"
style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 104.83471,117.2363 c 0,0 7.00512,1.5589 12.36838,-1.78156 5.3633,-3.3405 9.5226,-8.79661 10.17931,-10.91225 0.65672,-2.11564 0.76619,1.89294 1.53236,-0.11125 0.76618,-2.00432 3.83093,-6.012871 2.29855,-15.366212 -1.53237,-9.35333 -1.64182,-9.798747 -4.48762,-14.809463 -2.84586,-5.010719 -9.63207,-11.91437 -13.79134,-14.141359 -4.15927,-2.226986 -9.96037,-5.567464 -17.950594,-5.344766 -7.990202,0.222699 -5.363286,-0.334048 -13.025124,1.002146 -7.661836,1.336187 -14.557491,5.010717 -16.856041,7.015006 -2.298552,2.004286 -8.428023,7.460405 -10.61712,10.46684 -2.189098,3.00643 -8.209113,9.798741 -11.383303,19.263442 -3.174189,9.464656 -4.487646,10.466796 -4.706555,16.702366 -0.21891,6.23557 0.547274,7.90578 -0.766185,8.46256 -1.31346,0.55673 -1.094547,-4.67668 -0.985094,-8.35123 0.109463,-3.6745 0.109463,-13.250536 4.925468,-23.940057 4.816015,-10.689538 13.353489,-19.597489 18.169503,-22.826622 4.816009,-3.229128 10.398208,-7.571752 19.045135,-9.687392 8.646933,-2.115635 17.293863,-1.781586 22.65716,-0.779443 5.3633,1.002145 13.68187,4.453974 18.1695,7.905802 4.48766,3.45183 9.41314,7.683099 13.13459,14.586765 3.72146,6.903648 4.70654,15.700251 4.59709,19.374771 -0.10943,3.674531 -1.97019,12.137076 -4.81601,16.256986 -2.84583,4.11993 -6.67674,9.0193 -10.61711,10.80089 -3.94039,1.78157 -8.75642,2.33833 -12.69675,0.55674 -3.94039,-1.78161 -3.72147,-2.44969 -4.3782,-4.34263 z"
id="path1016"
inkscape:connector-curvature="0" />
<path
style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 104.83471,121.99883 c 0,0 5.54674,1.56707 10.22918,-0.55878 4.68248,-2.12587 6.4239,-4.17301 7.54615,-5.3934 1.12223,-1.22042 3.25064,-3.50376 3.83112,-4.56669 0.58046,-1.06292 1.19962,-1.69282 1.19962,-2.08649 0,-0.39369 -1.08353,-1.33853 -0.0386,-3.62186 1.04482,-2.28333 1.97361,-7.519273 1.50922,-9.881333 -0.46438,-2.362073 -1.54792,-15.471616 -10.83547,-24.211303 -9.28753,-8.739678 -18.497709,-9.763242 -18.497709,-9.763242 0,0 14.705309,4.645415 21.593569,18.739134 6.88828,14.093741 4.64376,23.148344 0.23218,28.659854 -4.41158,5.51151 -10.68068,6.14141 -12.38342,4.72415 -1.70268,-1.41725 -5.2113,6.47164 -4.38574,7.95996 z"
style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 104.83471,117.2363 c 0,0 5.54674,1.56707 10.22918,-0.55878 4.68248,-2.12587 6.4239,-4.17301 7.54615,-5.3934 1.12223,-1.22042 3.25064,-3.50376 3.83112,-4.56669 0.58046,-1.06292 1.19962,-1.69282 1.19962,-2.08649 0,-0.39369 -1.08353,-1.33853 -0.0386,-3.62186 1.04482,-2.283321 1.97361,-7.519246 1.50922,-9.881306 -0.46438,-2.362073 -1.54792,-15.471616 -10.83547,-24.211303 -9.28753,-8.739678 -18.497709,-9.763242 -18.497709,-9.763242 0,0 14.705309,4.645415 21.593569,18.739134 6.88828,14.093741 4.64376,23.148323 0.23218,28.659827 -4.41158,5.51151 -10.68068,6.14141 -12.38342,4.72415 -1.70268,-1.41725 -5.2113,6.47164 -4.38574,7.95996 z"
id="path1018"
inkscape:connector-curvature="0" />
<path
style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 86.930353,71.44277 c 0,0 -9.906718,-0.07875 -17.414156,4.881616 -7.507436,4.960371 -11.14506,8.975903 -13.23476,12.125332 -2.089697,3.149446 -4.488981,7.479909 -4.179395,7.401179 0.309585,-0.0788 9.055364,-12.2828 15.866229,-15.432236 6.81087,-3.149436 13.621741,-7.558644 22.986687,-4.330482 9.364952,3.228184 13.776542,7.716118 15.788842,6.613829 2.0123,-1.1023 2.3993,-2.440824 1.23835,-3.936804 -1.16094,-1.495979 -9.364961,-8.818417 -21.051797,-7.322434 z"
style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 86.930353,66.680267 c 0,0 -9.906718,-0.07875 -17.414156,4.881616 -7.507436,4.960371 -11.14506,8.975903 -13.23476,12.125332 -2.089697,3.149446 -4.488981,7.479909 -4.179395,7.401179 0.309585,-0.0788 9.055364,-12.2828 15.866229,-15.432236 6.81087,-3.149436 13.621741,-7.558644 22.986687,-4.330482 9.364952,3.228184 13.776542,7.716118 15.788842,6.613829 2.0123,-1.1023 2.3993,-2.440824 1.23835,-3.936804 -1.16094,-1.495979 -9.364961,-8.818417 -21.051797,-7.322434 z"
id="path1020"
inkscape:connector-curvature="0" />
<path
style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 72.107699,134.35862 c 0.65673,0.33404 5.58219,8.90795 9.522571,10.35548 3.940372,1.44755 6.567286,1.55888 7.005104,2.227 0.437821,0.66809 0.328367,4.00858 3.830921,5.45614 3.502555,1.44753 19.920785,6.01284 24.627325,6.45824 4.70658,0.4454 0.76621,3.22911 3.61202,4.23125 2.84584,1.00217 14.99532,1.5589 17.95061,0.33405 2.95527,-1.22483 2.95527,1.1135 -2.1891,3.1178 -5.14437,2.00427 -18.71677,6.79231 -27.58261,5.67882 -8.86586,-1.1135 -19.373526,-3.00644 -25.284086,-7.23772 -5.910565,-4.23126 -8.42802,-6.1242 -6.238924,-6.45824 2.189096,-0.33407 7.990199,5.9015 10.507662,6.56959 2.517463,0.66809 4.597103,0.66809 3.064735,-0.8908 -1.532366,-1.55888 -11.492755,-8.46253 -12.477849,-8.1285 -0.985092,0.33405 -3.064737,0.55674 -4.816012,-1.78159 -1.751278,-2.33832 -10.945484,-15.25485 -10.39821,-22.1585 0.547273,-6.90365 2.298552,-5.12208 4.378195,-2.56103 2.079641,2.56103 4.487648,4.78801 4.487648,4.78801 z"
style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 72.107699,130.12526 c 0.65673,0.33404 5.58219,8.90795 9.522571,10.35548 3.940372,1.44755 6.567286,1.55888 7.005104,2.227 0.437821,0.66809 0.328367,4.00858 3.830921,5.45614 3.502555,1.44753 19.920785,6.01284 24.627325,6.45824 4.70658,0.4454 0.76621,3.22911 3.61202,4.23125 2.84584,1.00217 14.99532,1.5589 17.95061,0.33405 2.95527,-1.22483 2.95527,1.1135 -2.1891,3.1178 -5.14437,2.00427 -18.71677,6.79231 -27.58261,5.67882 -8.86586,-1.1135 -19.373526,-3.00644 -25.284086,-7.23772 -5.910565,-4.23126 -8.42802,-6.1242 -6.238924,-6.45824 2.189096,-0.33407 7.990199,5.9015 10.507662,6.56959 2.517463,0.66809 4.597103,0.66809 3.064735,-0.8908 -1.532366,-1.55888 -11.492755,-8.46253 -12.477849,-8.1285 -0.985092,0.33405 -3.064737,0.55674 -4.816012,-1.78159 -1.751278,-2.33832 -10.945484,-15.25485 -10.39821,-22.1585 0.547273,-6.90365 2.298552,-5.12208 4.378195,-2.56103 2.079641,2.56103 4.487648,4.78801 4.487648,4.78801 z"
id="path1022"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#939393;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 56.889259,34.981831 c 0,0 16.252976,26.08036 43.845241,26.83631 27.59226,0.75596 42.33333,-23.8125 42.33333,-23.8125"
id="path2138"
inkscape:connector-curvature="0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -1,4 +1,6 @@
#!/bin/bash
TRANSHELL_CONTENT_HASH_CHECK_FAILED="Failed in checking package hash! \nPossibly reason can be the package is broken, laggy in sync of Spark Store repository, or, there is a malware attempt to attack. \nIf you don't know what happend, please try install again after execute the command below\n sudo aptss ssupdate\n\nIf the problem still happen, please click APP Feedback button in the APP information page to feedback to us.\n\n If you are in the Audition GroupPlease use ssaudit instead of ssinstall to audit APPsfor ssinstall is used for password-free install now.\nIf you want to install an app that is removed from Spark Store repositoryyou can also use ssaudit."
TRANSHELL_CONTENT_HASH_CHECK_FAILED="Failed in checking package hash! \nPossibly reason can be the package is broken, laggy in sync of Spark Store repository, or, there is a malware attempt to attack. \nIf you don't know what happend, please try install again after execute the command below\n sudo aptss update\n\nIf the problem still happen, please click APP Feedback button in the APP information page to feedback to us.\n\n If you are in the Audition GroupPlease use ssaudit instead of ssinstall to audit APPsfor ssinstall is used for password-free install now.\nIf you want to install an app that is removed from Spark Store repositoryyou can also use ssaudit."
TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT="Please run ssinstall as root"
TRANSHELL_CONTENT_FILE_NOT_EXIST="File not exist"
TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB="No delete after install option given, will not delete the deb"
TRANSHELL_CONTENT_DEB_IS_DELETED="--delete-after-install option is given and the installation is succeeded, delete the deb file."

View File

@@ -1,4 +1,6 @@
#!/bin/bash
TRANSHELL_CONTENT_HASH_CHECK_FAILED="软件包校验失败!这不应该发生!\n可能是因为软件包已损坏星火仓库未同步或者最坏的情况恶意软件尝试利用自动安装来入侵系统\n如果你不清楚发生了什么请执行 sudo aptss ssupdate 后再尝试安装。\n如果问题仍然存在请在应用信息界面点击 应用反馈 来提交反馈给我们!\n\n 如果你是审核人员,请使用 ssaudit来替代ssinstall进行审核工作因为现在ssinstall已经被用于免密安装。\n如果你正在尝试安装已经下架的星火应用也可用ssaudit来替代ssinstall"
TRANSHELL_CONTENT_HASH_CHECK_FAILED="软件包校验失败!这不应该发生!\n可能是因为软件包已损坏星火仓库未同步或者最坏的情况恶意软件尝试利用自动安装来入侵系统\n如果你不清楚发生了什么请执行 sudo aptss update 后再尝试安装。\n如果问题仍然存在请在应用信息界面点击 应用反馈 来提交反馈给我们!\n\n 如果你是审核人员,请使用 ssaudit来替代ssinstall进行审核工作因为现在ssinstall已经被用于免密安装。\n如果你正在尝试安装已经下架的星火应用也可用ssaudit来替代ssinstall"
TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT="请使用root启动ssinstall"
TRANSHELL_CONTENT_FILE_NOT_EXIST="文件不存在"
TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB="未指定安装后删除或安装出错不删除deb包"
TRANSHELL_CONTENT_DEB_IS_DELETED="使用了--delete-after-install选项且安装未出错删除deb包"

View File

@@ -7,15 +7,20 @@
TARGET = spark-store
TEMPLATE = subdirs
CONFIG += ordered
#CONFIG += ordered
CONFIG += wayland-compositor
SUBDIRS += \
src/spark-dstore-patch \
src/spark-store.pro
# https://wiki.debian.org/Hardening
QMAKE_CFLAGS *= $(shell dpkg-buildflags --get CFLAGS)
QMAKE_CPPFLAGS *= $(shell dpkg-buildflags --get CPPFLAGS)
QMAKE_CXXFLAGS *= $(shell dpkg-buildflags --get CXXFLAGS)
QMAKE_LFLAGS *= $(shell dpkg-buildflags --get LDFLAGS)
# Update translation files
CONFIG(release, debug|release) {
CONFIG(release, debug | release) {
system(bash $${PWD}/translate_update.sh)
system(bash $${PWD}/translate_generation.sh)
}
@@ -36,21 +41,25 @@ qm.path = /usr/share/spark-store/translations
bash_completion.files += pkg/usr/share/bash-completion/completions/aptss
bash_completion.path = /usr/share/bash-completion/completions
desktop.files += pkg/usr/share/applications/spark-store.desktop
desktop.files += pkg/usr/share/applications/*.desktop
desktop.path = /usr/share/applications
service.files += pkg/usr/lib/systemd/system/spark-update-notifier.service
service.path = /usr/lib/systemd/system/
polkit-1.files +=pkg/usr/share/polkit-1/actions/store.spark-app.ss-do-upgrade-worker.policy
polkit-1.files += pkg/usr/share/polkit-1/actions/store.spark-app.ss-do-upgrade-worker.policy
polkit-1.path = /usr/share/polkit-1/actions/
icon.files += pkg/usr/share/icons/hicolor/scalable/apps/spark-store.svg
icon.files += pkg/usr/share/icons/hicolor/scalable/apps/*.svg
icon.files += pkg/usr/share/icons/hicolor/scalable/apps/*.png
icon.path = /usr/share/icons/hicolor/scalable/apps
ssinstall-transhell.files += pkg/usr/share/ssinstall/transhell
ssinstall-transhell.path = /usr/share/ssinstall/
aptss-transhell.files += pkg/usr/share/aptss/transhell
aptss-transhell.path = /usr/share/aptss/
tmp.files += pkg/tmp/spark-store-install/feedback.sh
tmp.path = /tmp/spark-store-install
@@ -60,15 +69,10 @@ INSTALLS += \
desktop \
icon \
ssinstall-transhell \
aptss-transhell \
# sourceslist \
tmp \
service \
bash_completion \
polkit-1
# 暂时不添加
# https://wiki.debian.org/Hardening
QMAKE_CPPFLAGS *= $(shell dpkg-buildflags --get CPPFLAGS)
QMAKE_CFLAGS *= $(shell dpkg-buildflags --get CFLAGS)
QMAKE_CXXFLAGS *= $(shell dpkg-buildflags --get CXXFLAGS)
QMAKE_LFLAGS *= $(shell dpkg-buildflags --get LDFLAGS)

View File

@@ -1,13 +1,20 @@
#include "application.h"
#include "mainwindow-dtk.h"
#include "utils/utils.h"
#include <QDir>
#include <QJsonArray>
#include <DPlatformWindowHandle>
#include <DLog>
#include <DGuiApplicationHelper>
#include <DAboutDialog>
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
#include <DFeatureDisplayDialog>
#endif
#include <QSettings>
#include <QStandardPaths>
#include <QTranslator>
DCORE_USE_NAMESPACE
@@ -43,6 +50,9 @@ Application::Application(int &argc, char **argv)
// 初始化日志模块 (默认日志位置 ~/.cache/spark-union/spark-store)
DLogManager::registerConsoleAppender();
DLogManager::registerFileAppender();
// 获取版本特性信息
m_featuresJsonObj = Utils::parseFeatureJsonFile();
}
void Application::handleAboutAction()
@@ -53,9 +63,21 @@ void Application::handleAboutAction()
}
initAboutDialog();
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
initFeatureDisplayDialog(); // 初始化版本特性对话框
#endif
DApplication::handleAboutAction();
}
bool Application::notify(QObject *receiver, QEvent *event)
{
if (m_mainWindow) {
m_mainWindow->notify(receiver, event);
}
return DApplication::notify(receiver, event);
}
void Application::checkAppConfigLocation()
{
QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation));
@@ -65,21 +87,19 @@ void Application::checkAppConfigLocation()
}
}
void Application::setVersionAndBuildDateTime(const QString &version, const QString &buildDateTime)
void Application::setBuildDateTime(const QString &buildDateTime)
{
m_version = version;
m_buildDateTime = buildDateTime;
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
if (config.value("build/version").toString() != m_version) {
if (config.value("build/version").toString() != QString(APP_VERSION)) {
qDebug() << "Spark Store has been updated!";
config.setValue("build/version", m_version);
config.setValue("build/time", m_buildDateTime);
config.setValue("build/version", QString(APP_VERSION));
config.setValue("build/branch", QString(APP_BRANCH));
config.setValue("build/time", buildDateTime);
config.sync();
}
setApplicationVersion(DApplication::buildVersion(config.value("build/version").toString() + "-" + "Flamescion" + "-" + config.value("build/time").toString()));
setApplicationVersion(DApplication::buildVersion(QString(APP_VERSION) + "-" + QString(APP_BRANCH) + "-" + buildDateTime));
}
void Application::setMainWindow(MainWindow *window)
@@ -89,6 +109,17 @@ void Application::setMainWindow(MainWindow *window)
{
initAboutDialog();
}
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
if (featureDisplayDialog() == nullptr || featureDisplayDialog()->parent() != m_mainWindow)
{
initFeatureDisplayDialog(); // 初始化版本特性对话框
}
#endif
}
MainWindow *Application::mainWindow()
{
return m_mainWindow;
}
void Application::initAboutDialog()
@@ -109,6 +140,9 @@ void Application::initAboutDialog()
dialog->setProductName(productName());
dialog->setProductIcon(productIcon());
dialog->setVersion(translate("DAboutDialog", "Version: %1").arg(applicationVersion()));
if (runtimeDtkVersion() >= DTK_VERSION_CHECK(5, 6, 4, 0)) {
dialog->setVersion(applicationVersion());
}
// 根据 shenmo 要求,不显示组织 Logo
// dialog->setCompanyLogo(QPixmap(":/icon/Logo-Spark.png"));
dialog->setCompanyLogo(QPixmap());
@@ -118,9 +152,81 @@ void Application::initAboutDialog()
dialog->setLicense(translate("DAboutDialog", "%1 is released under %2").arg(productName()).arg(applicationLicense()));
setAboutDialog(dialog);
connect(aboutDialog(), &DAboutDialog::destroyed, this, [=] {
connect(aboutDialog(), &DAboutDialog::destroyed, this, [=]() {
setAboutDialog(nullptr);
});
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 初始化版本特性对话框
*/
void Application::initFeatureDisplayDialog()
{
if (featureDisplayDialog())
{
featureDisplayDialog()->deleteLater();
setFeatureDisplayDialog(nullptr);
}
// 自定义 DFeatureDisplayDialog
DFeatureDisplayDialog *dialog = new DFeatureDisplayDialog(m_mainWindow);
// 标题
dialog->setTitle(m_featuresJsonObj.value("title").toString());
// NOTE: json 文件中支持多语言;考虑到维护性,不放入翻译文件处理
if (m_featuresJsonObj.contains(QString("title[%1]").arg(QLocale::system().name())))
{
dialog->setTitle(m_featuresJsonObj.value(QString("title[%1]").arg(QLocale::system().name())).toString());
}
// 特性项
QList<DFeatureItem *> items;
foreach (const QJsonValue &jsonValue, m_featuresJsonObj.value("items").toArray())
{
QJsonObject jsonObj = jsonValue.toObject();
QString name = jsonObj.value("name").toString();
if (jsonObj.contains(QString("name[%1]").arg(QLocale::system().name())))
{
name = jsonObj.value(QString("name[%1]").arg(QLocale::system().name())).toString();
}
QString description = jsonObj.value("description").toString();
if (jsonObj.contains(QString("description[%1]").arg(QLocale::system().name())))
{
description = jsonObj.value(QString("description[%1]").arg(QLocale::system().name())).toString();
}
DFeatureItem *item = new DFeatureItem(QIcon::fromTheme("spark-store"), name, description, dialog);
items.append(item);
}
dialog->addItems(items); // NOTE: 也支持 addItem 依次添加单个 item
// “了解更多”链接按钮
dialog->setLinkUrl(m_featuresJsonObj.value("linkUrl").toString());
dialog->setLinkButtonVisible(m_featuresJsonObj.value("linkButtonVisible").toBool());
setFeatureDisplayDialog(dialog);
connect(featureDisplayDialog(), &DFeatureDisplayDialog::destroyed, this, [=]() {
setFeatureDisplayDialog(nullptr);
});
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
connect(aboutDialog(), &DAboutDialog::featureActivated, this, [=]() {
featureDisplayDialog()->show();
});
#endif
dialog->hide();
}
#endif

View File

@@ -3,6 +3,8 @@
#include <DApplication>
#include <QJsonObject>
DWIDGET_USE_NAMESPACE
class MainWindow;
@@ -13,18 +15,25 @@ class Application : public DApplication
public:
Application(int &argc, char **argv);
void handleAboutAction() override;
bool notify(QObject *receiver, QEvent *event) override;
static void checkAppConfigLocation();
void setVersionAndBuildDateTime(const QString &version, const QString &buildDateTime);
void setBuildDateTime(const QString &buildDateTime);
void setMainWindow(MainWindow *window);
MainWindow *mainWindow();
private:
void initAboutDialog();
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
void initFeatureDisplayDialog();
#endif
void loadTranslator();
private:
QString m_version;
QString m_buildDateTime;
QJsonObject m_featuresJsonObj;
MainWindow *m_mainWindow = nullptr;
};

View File

@@ -44,6 +44,7 @@
<file>icon/light/text.svg</file>
<file>icon/light/update.svg</file>
<file>icon/logo.svg</file>
<file>json/features.json</file>
<file>tags/a2d-small.png</file>
<file>tags/a2d.png</file>
<file>tags/community-small.png</file>
@@ -61,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>

View File

@@ -1,268 +1,254 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="200mm"
height="200mm"
viewBox="0 0 200 200"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="deepin-community-store.svg">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient1200">
<stop
style="stop-color:#000000;stop-opacity:0.1299435"
offset="0"
id="stop1196" />
<stop
style="stop-color:#dadada;stop-opacity:0.81960785"
offset="1"
id="stop1198" />
</linearGradient>
<linearGradient
id="linearGradient1138"
inkscape:collect="always">
<stop
id="stop1134"
offset="0"
style="stop-color:#99e7ea;stop-opacity:1" />
<stop
id="stop1136"
offset="1"
style="stop-color:#007ffc;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient1128">
<stop
style="stop-color:#99e7ea;stop-opacity:1"
offset="0"
id="stop1124" />
<stop
style="stop-color:#007ffc;stop-opacity:1"
offset="1"
id="stop1126" />
</linearGradient>
<inkscape:path-effect
effect="bspline"
id="path-effect960"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1128"
id="radialGradient1130"
cx="100.35268"
cy="199.86011"
fx="100.35268"
fy="199.86011"
r="90.135414"
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1138"
id="radialGradient1132"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
cx="100.35268"
cy="199.86011"
fx="100.35268"
fy="199.86011"
r="90.135414" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1200"
id="radialGradient1202"
cx="100.35268"
cy="199.86011"
fx="100.35268"
fy="199.86011"
r="90.135414"
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
gradientUnits="userSpaceOnUse" />
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter1448">
<feFlood
flood-opacity="0.372549"
flood-color="rgb(145,145,145)"
result="flood"
id="feFlood1438" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite1440" />
<feGaussianBlur
in="composite1"
stdDeviation="5.2918"
result="blur"
id="feGaussianBlur1442" />
<feOffset
dx="0"
dy="0"
result="offset"
id="feOffset1444" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite1446" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter2201">
<feFlood
flood-opacity="0.372549"
flood-color="rgb(145,145,145)"
result="flood"
id="feFlood2191" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite2193" />
<feGaussianBlur
in="composite1"
stdDeviation="3.76995"
result="blur"
id="feGaussianBlur2195" />
<feOffset
dx="0"
dy="0"
result="offset"
id="feOffset2197" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite2199" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="120.33119"
inkscape:cy="507.94585"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1040"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-97)">
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ebebeb;stroke-width:2.87003541;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter2201)"
id="rect2119"
width="162.54665"
height="170.16383"
x="20.431099"
y="112.51035"
rx="30"
ry="30" />
<circle
style="opacity:1;fill:#959595;fill-opacity:1;stroke:#e9e9e9;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path2121"
cx="58.208336"
cy="131.8244"
r="6.0476193" />
<circle
style="opacity:1;fill:#9c9c9c;fill-opacity:1;stroke:#eaeaea;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path2121-5"
cx="143.63095"
cy="133.71429"
r="6.0476193" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2">
<path
style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 94.205599,42.389243 c 0,0 11.145081,-0.157476 22.599701,6.928753 11.45465,7.086223 18.11074,13.857508 20.27783,18.266716 2.16708,4.409209 9.28755,12.125332 9.13277,26.297795 -0.15488,14.172433 -3.40543,23.620763 -8.97797,31.494323 -5.57254,7.87359 -15.63405,13.85751 -27.70786,14.17247 -12.073829,0.31494 -19.813453,-7.55863 -22.444927,-11.96786 -2.631469,-4.4092 -3.715019,-13.85751 -0.464377,-20.62877 3.250645,-6.77132 8.358796,-6.77132 10.061513,-6.14141 1.702724,0.6299 2.167092,1.5747 3.095852,3.30689 0.928749,1.73219 1.547929,1.41726 2.941089,0.47243 1.39311,-0.94484 1.85748,-2.04715 1.54792,-3.46439 -0.30958,-1.417253 -2.16711,-3.149433 -3.71505,-3.621853 -1.547909,-0.47241 -3.715016,-1.88966 -6.810869,-1.41721 -3.095848,0.47238 -9.132757,2.04711 -14.240906,8.975843 -5.108153,6.92875 -4.488988,17.63684 -1.393134,22.67593 3.095849,5.0391 8.977962,14.48739 21.980539,17.79431 13.00259,3.30693 34.05435,-6.45633 41.32959,-21.57361 7.27524,-15.1173 7.43004,-22.20352 7.12048,-34.643764 C 148.22821,76.875544 137.23793,58.293884 125.00933,51.522601 112.78073,44.751315 103.64797,40.814522 94.205599,42.389243 Z"
id="path1002"
inkscape:connector-curvature="0" />
<path
style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 100.67541,105.29647 c 0,0 -3.06474,-2.8951 -5.801108,2.22698 -2.736373,5.12205 -4.049827,9.68737 -1.313459,15.25486 2.736367,5.56745 8.428007,8.90792 17.184447,8.79659 8.75636,-0.11148 15.21419,-2.22699 19.0451,-8.5739 3.83094,-6.34692 6.7862,-11.02357 7.11457,-13.36191 0.32839,-2.33835 2.07965,0.33404 1.53239,2.33834 -0.54728,2.00426 -0.43783,5.9015 1.09454,5.12204 1.53237,-0.77942 2.73637,-2.00427 2.95526,-1.44753 0.21893,0.55673 -1.75127,4.00859 -2.68162,5.73449 -0.93039,1.7259 -3.83094,5.90153 -5.5275,7.51607 -1.69652,1.61458 -4.04981,3.89724 -6.84092,5.56747 -2.79109,1.67024 -7.11454,3.61887 -9.52255,4.06427 -2.40801,0.44539 -7.22403,1.39184 -9.96042,1.2805 -2.73635,-0.11137 -6.23892,-0.61243 -10.124558,-2.56104 -3.885645,-1.94859 -8.099657,-4.95505 -9.741479,-7.96148 -1.641825,-3.00643 -4.159283,-5.73449 -3.61201,-13.30623 0.547277,-7.57175 3.010008,-11.46899 4.870741,-13.25056 1.860731,-1.7816 4.597103,-2.56105 6.403105,-2.17131 1.806004,0.38971 2.955282,1.44755 3.393102,2.22697 0.43781,0.77944 1.149279,2.22699 1.532369,2.50538 z"
id="path1012"
inkscape:connector-curvature="0" />
<path
style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 128.47695,145.38219 c 0,0 13.13457,-7.6831 19.26404,-19.82016 6.12948,-12.13707 8.7564,-19.93152 7.99021,-31.84592 -0.76619,-11.914358 -2.62692,-6.012854 -0.54728,-11.134928 2.07964,-5.122074 -1.31345,-15.254857 0.10943,-15.922949 1.42292,-0.668097 4.48765,4.453971 5.3633,8.573903 0.87562,4.119922 4.70654,16.813721 1.64181,32.959394 -3.06472,16.14564 -10.28872,22.60391 -15.10475,26.94655 -4.81603,4.34261 -15.7615,11.91437 -17.40332,11.80302 -1.64183,-0.11148 -1.86073,-0.11148 -1.31348,-1.55891 z"
id="path1014"
inkscape:connector-curvature="0" />
<path
style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 104.83471,121.99883 c 0,0 7.00512,1.5589 12.36838,-1.78156 5.3633,-3.3405 9.5226,-8.79661 10.17931,-10.91225 0.65672,-2.11564 0.76619,1.89294 1.53236,-0.11125 0.76618,-2.00432 3.83093,-6.01288 2.29855,-15.366239 -1.53237,-9.35333 -1.64182,-9.798747 -4.48762,-14.809463 -2.84586,-5.010719 -9.63207,-11.91437 -13.79134,-14.141359 -4.15927,-2.226986 -9.96037,-5.567464 -17.950594,-5.344766 -7.990202,0.222699 -5.363286,-0.334048 -13.025124,1.002146 -7.661836,1.336187 -14.557491,5.010717 -16.856041,7.015006 -2.298552,2.004286 -8.428023,7.460405 -10.61712,10.46684 -2.189098,3.00643 -8.209113,9.798741 -11.383303,19.263442 -3.174189,9.464683 -4.487646,10.466823 -4.706555,16.702393 -0.21891,6.23557 0.547274,7.90578 -0.766185,8.46256 -1.31346,0.55673 -1.094547,-4.67668 -0.985094,-8.35123 0.109463,-3.6745 0.109463,-13.25056 4.925468,-23.940084 4.816015,-10.689538 13.353489,-19.597489 18.169503,-22.826622 4.816009,-3.229128 10.398208,-7.571752 19.045135,-9.687392 8.646933,-2.115635 17.293863,-1.781586 22.65716,-0.779443 5.3633,1.002145 13.68187,4.453974 18.1695,7.905802 4.48766,3.45183 9.41314,7.683099 13.13459,14.586765 3.72146,6.903648 4.70654,15.700251 4.59709,19.374771 -0.10943,3.674543 -1.97019,12.137103 -4.81601,16.257013 -2.84583,4.11993 -6.67674,9.0193 -10.61711,10.80089 -3.94039,1.78157 -8.75642,2.33833 -12.69675,0.55674 -3.94039,-1.78161 -3.72147,-2.44969 -4.3782,-4.34263 z"
id="path1016"
inkscape:connector-curvature="0" />
<path
style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 104.83471,121.99883 c 0,0 5.54674,1.56707 10.22918,-0.55878 4.68248,-2.12587 6.4239,-4.17301 7.54615,-5.3934 1.12223,-1.22042 3.25064,-3.50376 3.83112,-4.56669 0.58046,-1.06292 1.19962,-1.69282 1.19962,-2.08649 0,-0.39369 -1.08353,-1.33853 -0.0386,-3.62186 1.04482,-2.28333 1.97361,-7.519273 1.50922,-9.881333 -0.46438,-2.362073 -1.54792,-15.471616 -10.83547,-24.211303 -9.28753,-8.739678 -18.497709,-9.763242 -18.497709,-9.763242 0,0 14.705309,4.645415 21.593569,18.739134 6.88828,14.093741 4.64376,23.148344 0.23218,28.659854 -4.41158,5.51151 -10.68068,6.14141 -12.38342,4.72415 -1.70268,-1.41725 -5.2113,6.47164 -4.38574,7.95996 z"
id="path1018"
inkscape:connector-curvature="0" />
<path
style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 86.930353,71.44277 c 0,0 -9.906718,-0.07875 -17.414156,4.881616 -7.507436,4.960371 -11.14506,8.975903 -13.23476,12.125332 -2.089697,3.149446 -4.488981,7.479909 -4.179395,7.401179 0.309585,-0.0788 9.055364,-12.2828 15.866229,-15.432236 6.81087,-3.149436 13.621741,-7.558644 22.986687,-4.330482 9.364952,3.228184 13.776542,7.716118 15.788842,6.613829 2.0123,-1.1023 2.3993,-2.440824 1.23835,-3.936804 -1.16094,-1.495979 -9.364961,-8.818417 -21.051797,-7.322434 z"
id="path1020"
inkscape:connector-curvature="0" />
<path
style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 72.107699,134.35862 c 0.65673,0.33404 5.58219,8.90795 9.522571,10.35548 3.940372,1.44755 6.567286,1.55888 7.005104,2.227 0.437821,0.66809 0.328367,4.00858 3.830921,5.45614 3.502555,1.44753 19.920785,6.01284 24.627325,6.45824 4.70658,0.4454 0.76621,3.22911 3.61202,4.23125 2.84584,1.00217 14.99532,1.5589 17.95061,0.33405 2.95527,-1.22483 2.95527,1.1135 -2.1891,3.1178 -5.14437,2.00427 -18.71677,6.79231 -27.58261,5.67882 -8.86586,-1.1135 -19.373526,-3.00644 -25.284086,-7.23772 -5.910565,-4.23126 -8.42802,-6.1242 -6.238924,-6.45824 2.189096,-0.33407 7.990199,5.9015 10.507662,6.56959 2.517463,0.66809 4.597103,0.66809 3.064735,-0.8908 -1.532366,-1.55888 -11.492755,-8.46253 -12.477849,-8.1285 -0.985092,0.33405 -3.064737,0.55674 -4.816012,-1.78159 -1.751278,-2.33832 -10.945484,-15.25485 -10.39821,-22.1585 0.547273,-6.90365 2.298552,-5.12208 4.378195,-2.56103 2.079641,2.56103 4.487648,4.78801 4.487648,4.78801 z"
id="path1022"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#939393;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 56.889259,34.981831 c 0,0 16.252976,26.08036 43.845241,26.83631 27.59226,0.75596 42.33333,-23.8125 42.33333,-23.8125"
id="path2138"
inkscape:connector-curvature="0" />
</g>
</svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="127"
inkscape:export-xdpi="127"
inkscape:export-filename="/home/zhangtianyi/Desktop/deepin-community-store.png"
width="200mm"
height="200mm"
viewBox="0 0 200 200"
version="1.1"
id="svg8"
inkscape:version="1.0 (4035a4f, 2020-05-01)"
sodipodi:docname="deepin-community-store.svg">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient1200">
<stop
style="stop-color:#000000;stop-opacity:0.1299435"
offset="0"
id="stop1196" />
<stop
style="stop-color:#dadada;stop-opacity:0.81960785"
offset="1"
id="stop1198" />
</linearGradient>
<linearGradient
id="linearGradient1138"
inkscape:collect="always">
<stop
id="stop1134"
offset="0"
style="stop-color:#99e7ea;stop-opacity:1" />
<stop
id="stop1136"
offset="1"
style="stop-color:#007ffc;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient1128">
<stop
style="stop-color:#99e7ea;stop-opacity:1"
offset="0"
id="stop1124" />
<stop
style="stop-color:#007ffc;stop-opacity:1"
offset="1"
id="stop1126" />
</linearGradient>
<inkscape:path-effect
effect="bspline"
id="path-effect960"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1128"
id="radialGradient1130"
cx="100.35268"
cy="199.86011"
fx="100.35268"
fy="199.86011"
r="90.135414"
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1138"
id="radialGradient1132"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
cx="100.35268"
cy="199.86011"
fx="100.35268"
fy="199.86011"
r="90.135414" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1200"
id="radialGradient1202"
cx="100.35268"
cy="199.86011"
fx="100.35268"
fy="199.86011"
r="90.135414"
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
gradientUnits="userSpaceOnUse" />
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter1448">
<feFlood
flood-opacity="0.372549"
flood-color="rgb(145,145,145)"
result="flood"
id="feFlood1438" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite1440" />
<feGaussianBlur
in="composite1"
stdDeviation="5.2918"
result="blur"
id="feGaussianBlur1442" />
<feOffset
dx="0"
dy="0"
result="offset"
id="feOffset1444" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite1446" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter2201">
<feFlood
flood-opacity="0.372549"
flood-color="rgb(145,145,145)"
result="flood"
id="feFlood2191" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite2193" />
<feGaussianBlur
in="composite1"
stdDeviation="3.76995"
result="blur"
id="feGaussianBlur2195" />
<feOffset
dx="0"
dy="0"
result="offset"
id="feOffset2197" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite2199" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="13.97476"
inkscape:cy="371.76152"
inkscape:document-units="mm"
inkscape:current-layer="layer2"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="941"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:document-rotation="0" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-97)">
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ebebeb;stroke-width:2.87004;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter2201)"
id="rect2119"
width="162.54665"
height="170.16383"
x="20.431099"
y="112.51035"
rx="30"
ry="30"
transform="matrix(1.0253898,0,0,0.97932001,-4.2824724,3.4808454)" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2">
<path
style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 94.205599,38.155907 c 0,0 11.145081,-0.157476 22.599701,6.928753 11.45465,7.086223 18.11074,13.857508 20.27783,18.266716 2.16708,4.409209 9.28755,12.125332 9.13277,26.297795 -0.15488,14.172409 -3.40543,23.620739 -8.97797,31.494299 -5.57254,7.87359 -15.63405,13.85751 -27.70786,14.17247 -12.073829,0.31494 -19.813453,-7.55863 -22.444927,-11.96786 -2.631469,-4.4092 -3.715019,-13.85751 -0.464377,-20.62877 3.250645,-6.771296 8.358796,-6.771296 10.061513,-6.141389 1.702724,0.629897 2.167092,1.574691 3.095852,3.306872 0.928749,1.732187 1.547929,1.417257 2.941089,0.472427 1.39311,-0.944834 1.85748,-2.047138 1.54792,-3.464372 -0.30958,-1.417247 -2.16711,-3.149427 -3.71505,-3.621847 -1.547909,-0.47241 -3.715016,-1.88966 -6.810869,-1.41721 -3.095848,0.47238 -9.132757,2.04711 -14.240906,8.975819 -5.108153,6.92875 -4.488988,17.63684 -1.393134,22.67593 3.095849,5.0391 8.977962,14.48739 21.980539,17.79431 13.00259,3.30693 34.05435,-6.45633 41.32959,-21.57361 7.27524,-15.1173 7.43004,-22.203505 7.12048,-34.64374 C 148.22821,72.642208 137.23793,54.060548 125.00933,47.289265 112.78073,40.517979 103.64797,36.581186 94.205599,38.155907 Z"
id="path1002"
inkscape:connector-curvature="0" />
<path
style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 100.67541,101.06311 c 0,0 -3.06474,-2.895088 -5.801108,2.22698 -2.736373,5.12205 -4.049827,9.68737 -1.313459,15.25486 2.736367,5.56745 8.428007,8.90792 17.184447,8.79659 8.75636,-0.11148 15.21419,-2.22699 19.0451,-8.5739 3.83094,-6.34692 6.7862,-11.02357 7.11457,-13.36191 0.32839,-2.33835 2.07965,0.33404 1.53239,2.33834 -0.54728,2.00426 -0.43783,5.9015 1.09454,5.12204 1.53237,-0.77942 2.73637,-2.00427 2.95526,-1.44753 0.21893,0.55673 -1.75127,4.00859 -2.68162,5.73449 -0.93039,1.7259 -3.83094,5.90153 -5.5275,7.51607 -1.69652,1.61458 -4.04981,3.89724 -6.84092,5.56747 -2.79109,1.67024 -7.11454,3.61887 -9.52255,4.06427 -2.40801,0.44539 -7.22403,1.39184 -9.96042,1.2805 -2.73635,-0.11137 -6.23892,-0.61243 -10.124558,-2.56104 -3.885645,-1.94859 -8.099657,-4.95505 -9.741479,-7.96148 -1.641825,-3.00643 -4.159283,-5.73449 -3.61201,-13.30623 0.547277,-7.57175 3.010008,-11.46899 4.870741,-13.250551 1.860731,-1.781588 4.597103,-2.561035 6.403105,-2.171298 1.806004,0.38971 2.955282,1.447544 3.393102,2.226958 0.43781,0.779437 1.149279,2.226981 1.532369,2.505371 z"
id="path1012"
inkscape:connector-curvature="0" />
<path
style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 132.18114,140.09049 c 0,0 13.13457,-7.6831 19.26404,-19.82016 6.12948,-12.13707 8.7564,-19.93152 7.99021,-31.84589 -0.76619,-11.914358 -2.62692,-6.012854 -0.54728,-11.134928 2.07964,-5.122074 -1.31345,-15.254857 0.10943,-15.922949 1.42292,-0.668097 4.48765,4.453971 5.3633,8.573903 0.87562,4.119922 4.70654,16.813721 1.64181,32.959364 -3.06472,16.14564 -10.28872,22.60391 -15.10475,26.94655 -4.81603,4.34261 -15.7615,11.91437 -17.40332,11.80302 -1.64183,-0.11148 -1.86073,-0.11148 -1.31348,-1.55891 z"
id="path1014"
inkscape:connector-curvature="0" />
<path
style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 104.83471,117.2363 c 0,0 7.00512,1.5589 12.36838,-1.78156 5.3633,-3.3405 9.5226,-8.79661 10.17931,-10.91225 0.65672,-2.11564 0.76619,1.89294 1.53236,-0.11125 0.76618,-2.00432 3.83093,-6.012871 2.29855,-15.366212 -1.53237,-9.35333 -1.64182,-9.798747 -4.48762,-14.809463 -2.84586,-5.010719 -9.63207,-11.91437 -13.79134,-14.141359 -4.15927,-2.226986 -9.96037,-5.567464 -17.950594,-5.344766 -7.990202,0.222699 -5.363286,-0.334048 -13.025124,1.002146 -7.661836,1.336187 -14.557491,5.010717 -16.856041,7.015006 -2.298552,2.004286 -8.428023,7.460405 -10.61712,10.46684 -2.189098,3.00643 -8.209113,9.798741 -11.383303,19.263442 -3.174189,9.464656 -4.487646,10.466796 -4.706555,16.702366 -0.21891,6.23557 0.547274,7.90578 -0.766185,8.46256 -1.31346,0.55673 -1.094547,-4.67668 -0.985094,-8.35123 0.109463,-3.6745 0.109463,-13.250536 4.925468,-23.940057 4.816015,-10.689538 13.353489,-19.597489 18.169503,-22.826622 4.816009,-3.229128 10.398208,-7.571752 19.045135,-9.687392 8.646933,-2.115635 17.293863,-1.781586 22.65716,-0.779443 5.3633,1.002145 13.68187,4.453974 18.1695,7.905802 4.48766,3.45183 9.41314,7.683099 13.13459,14.586765 3.72146,6.903648 4.70654,15.700251 4.59709,19.374771 -0.10943,3.674531 -1.97019,12.137076 -4.81601,16.256986 -2.84583,4.11993 -6.67674,9.0193 -10.61711,10.80089 -3.94039,1.78157 -8.75642,2.33833 -12.69675,0.55674 -3.94039,-1.78161 -3.72147,-2.44969 -4.3782,-4.34263 z"
id="path1016"
inkscape:connector-curvature="0" />
<path
style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 104.83471,117.2363 c 0,0 5.54674,1.56707 10.22918,-0.55878 4.68248,-2.12587 6.4239,-4.17301 7.54615,-5.3934 1.12223,-1.22042 3.25064,-3.50376 3.83112,-4.56669 0.58046,-1.06292 1.19962,-1.69282 1.19962,-2.08649 0,-0.39369 -1.08353,-1.33853 -0.0386,-3.62186 1.04482,-2.283321 1.97361,-7.519246 1.50922,-9.881306 -0.46438,-2.362073 -1.54792,-15.471616 -10.83547,-24.211303 -9.28753,-8.739678 -18.497709,-9.763242 -18.497709,-9.763242 0,0 14.705309,4.645415 21.593569,18.739134 6.88828,14.093741 4.64376,23.148323 0.23218,28.659827 -4.41158,5.51151 -10.68068,6.14141 -12.38342,4.72415 -1.70268,-1.41725 -5.2113,6.47164 -4.38574,7.95996 z"
id="path1018"
inkscape:connector-curvature="0" />
<path
style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 86.930353,66.680267 c 0,0 -9.906718,-0.07875 -17.414156,4.881616 -7.507436,4.960371 -11.14506,8.975903 -13.23476,12.125332 -2.089697,3.149446 -4.488981,7.479909 -4.179395,7.401179 0.309585,-0.0788 9.055364,-12.2828 15.866229,-15.432236 6.81087,-3.149436 13.621741,-7.558644 22.986687,-4.330482 9.364952,3.228184 13.776542,7.716118 15.788842,6.613829 2.0123,-1.1023 2.3993,-2.440824 1.23835,-3.936804 -1.16094,-1.495979 -9.364961,-8.818417 -21.051797,-7.322434 z"
id="path1020"
inkscape:connector-curvature="0" />
<path
style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 72.107699,130.12526 c 0.65673,0.33404 5.58219,8.90795 9.522571,10.35548 3.940372,1.44755 6.567286,1.55888 7.005104,2.227 0.437821,0.66809 0.328367,4.00858 3.830921,5.45614 3.502555,1.44753 19.920785,6.01284 24.627325,6.45824 4.70658,0.4454 0.76621,3.22911 3.61202,4.23125 2.84584,1.00217 14.99532,1.5589 17.95061,0.33405 2.95527,-1.22483 2.95527,1.1135 -2.1891,3.1178 -5.14437,2.00427 -18.71677,6.79231 -27.58261,5.67882 -8.86586,-1.1135 -19.373526,-3.00644 -25.284086,-7.23772 -5.910565,-4.23126 -8.42802,-6.1242 -6.238924,-6.45824 2.189096,-0.33407 7.990199,5.9015 10.507662,6.56959 2.517463,0.66809 4.597103,0.66809 3.064735,-0.8908 -1.532366,-1.55888 -11.492755,-8.46253 -12.477849,-8.1285 -0.985092,0.33405 -3.064737,0.55674 -4.816012,-1.78159 -1.751278,-2.33832 -10.945484,-15.25485 -10.39821,-22.1585 0.547273,-6.90365 2.298552,-5.12208 4.378195,-2.56103 2.079641,2.56103 4.487648,4.78801 4.487648,4.78801 z"
id="path1022"
inkscape:connector-curvature="0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,268 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="200mm"
height="200mm"
viewBox="0 0 200 200"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="deepin-community-store.svg">
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient1200">
<stop
style="stop-color:#000000;stop-opacity:0.1299435"
offset="0"
id="stop1196" />
<stop
style="stop-color:#dadada;stop-opacity:0.81960785"
offset="1"
id="stop1198" />
</linearGradient>
<linearGradient
id="linearGradient1138"
inkscape:collect="always">
<stop
id="stop1134"
offset="0"
style="stop-color:#99e7ea;stop-opacity:1" />
<stop
id="stop1136"
offset="1"
style="stop-color:#007ffc;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient1128">
<stop
style="stop-color:#99e7ea;stop-opacity:1"
offset="0"
id="stop1124" />
<stop
style="stop-color:#007ffc;stop-opacity:1"
offset="1"
id="stop1126" />
</linearGradient>
<inkscape:path-effect
effect="bspline"
id="path-effect960"
is_visible="true"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1128"
id="radialGradient1130"
cx="100.35268"
cy="199.86011"
fx="100.35268"
fy="199.86011"
r="90.135414"
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1138"
id="radialGradient1132"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
cx="100.35268"
cy="199.86011"
fx="100.35268"
fy="199.86011"
r="90.135414" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1200"
id="radialGradient1202"
cx="100.35268"
cy="199.86011"
fx="100.35268"
fy="199.86011"
r="90.135414"
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
gradientUnits="userSpaceOnUse" />
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter1448">
<feFlood
flood-opacity="0.372549"
flood-color="rgb(145,145,145)"
result="flood"
id="feFlood1438" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite1440" />
<feGaussianBlur
in="composite1"
stdDeviation="5.2918"
result="blur"
id="feGaussianBlur1442" />
<feOffset
dx="0"
dy="0"
result="offset"
id="feOffset1444" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite1446" />
</filter>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Drop Shadow"
id="filter2201">
<feFlood
flood-opacity="0.372549"
flood-color="rgb(145,145,145)"
result="flood"
id="feFlood2191" />
<feComposite
in="flood"
in2="SourceGraphic"
operator="in"
result="composite1"
id="feComposite2193" />
<feGaussianBlur
in="composite1"
stdDeviation="3.76995"
result="blur"
id="feGaussianBlur2195" />
<feOffset
dx="0"
dy="0"
result="offset"
id="feOffset2197" />
<feComposite
in="SourceGraphic"
in2="offset"
operator="over"
result="composite2"
id="feComposite2199" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="120.33119"
inkscape:cy="507.94585"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1040"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-97)">
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ebebeb;stroke-width:2.87003541;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter2201)"
id="rect2119"
width="162.54665"
height="170.16383"
x="20.431099"
y="112.51035"
rx="30"
ry="30" />
<circle
style="opacity:1;fill:#959595;fill-opacity:1;stroke:#e9e9e9;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path2121"
cx="58.208336"
cy="131.8244"
r="6.0476193" />
<circle
style="opacity:1;fill:#9c9c9c;fill-opacity:1;stroke:#eaeaea;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path2121-5"
cx="143.63095"
cy="133.71429"
r="6.0476193" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2">
<path
style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 94.205599,42.389243 c 0,0 11.145081,-0.157476 22.599701,6.928753 11.45465,7.086223 18.11074,13.857508 20.27783,18.266716 2.16708,4.409209 9.28755,12.125332 9.13277,26.297795 -0.15488,14.172433 -3.40543,23.620763 -8.97797,31.494323 -5.57254,7.87359 -15.63405,13.85751 -27.70786,14.17247 -12.073829,0.31494 -19.813453,-7.55863 -22.444927,-11.96786 -2.631469,-4.4092 -3.715019,-13.85751 -0.464377,-20.62877 3.250645,-6.77132 8.358796,-6.77132 10.061513,-6.14141 1.702724,0.6299 2.167092,1.5747 3.095852,3.30689 0.928749,1.73219 1.547929,1.41726 2.941089,0.47243 1.39311,-0.94484 1.85748,-2.04715 1.54792,-3.46439 -0.30958,-1.417253 -2.16711,-3.149433 -3.71505,-3.621853 -1.547909,-0.47241 -3.715016,-1.88966 -6.810869,-1.41721 -3.095848,0.47238 -9.132757,2.04711 -14.240906,8.975843 -5.108153,6.92875 -4.488988,17.63684 -1.393134,22.67593 3.095849,5.0391 8.977962,14.48739 21.980539,17.79431 13.00259,3.30693 34.05435,-6.45633 41.32959,-21.57361 7.27524,-15.1173 7.43004,-22.20352 7.12048,-34.643764 C 148.22821,76.875544 137.23793,58.293884 125.00933,51.522601 112.78073,44.751315 103.64797,40.814522 94.205599,42.389243 Z"
id="path1002"
inkscape:connector-curvature="0" />
<path
style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 100.67541,105.29647 c 0,0 -3.06474,-2.8951 -5.801108,2.22698 -2.736373,5.12205 -4.049827,9.68737 -1.313459,15.25486 2.736367,5.56745 8.428007,8.90792 17.184447,8.79659 8.75636,-0.11148 15.21419,-2.22699 19.0451,-8.5739 3.83094,-6.34692 6.7862,-11.02357 7.11457,-13.36191 0.32839,-2.33835 2.07965,0.33404 1.53239,2.33834 -0.54728,2.00426 -0.43783,5.9015 1.09454,5.12204 1.53237,-0.77942 2.73637,-2.00427 2.95526,-1.44753 0.21893,0.55673 -1.75127,4.00859 -2.68162,5.73449 -0.93039,1.7259 -3.83094,5.90153 -5.5275,7.51607 -1.69652,1.61458 -4.04981,3.89724 -6.84092,5.56747 -2.79109,1.67024 -7.11454,3.61887 -9.52255,4.06427 -2.40801,0.44539 -7.22403,1.39184 -9.96042,1.2805 -2.73635,-0.11137 -6.23892,-0.61243 -10.124558,-2.56104 -3.885645,-1.94859 -8.099657,-4.95505 -9.741479,-7.96148 -1.641825,-3.00643 -4.159283,-5.73449 -3.61201,-13.30623 0.547277,-7.57175 3.010008,-11.46899 4.870741,-13.25056 1.860731,-1.7816 4.597103,-2.56105 6.403105,-2.17131 1.806004,0.38971 2.955282,1.44755 3.393102,2.22697 0.43781,0.77944 1.149279,2.22699 1.532369,2.50538 z"
id="path1012"
inkscape:connector-curvature="0" />
<path
style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 128.47695,145.38219 c 0,0 13.13457,-7.6831 19.26404,-19.82016 6.12948,-12.13707 8.7564,-19.93152 7.99021,-31.84592 -0.76619,-11.914358 -2.62692,-6.012854 -0.54728,-11.134928 2.07964,-5.122074 -1.31345,-15.254857 0.10943,-15.922949 1.42292,-0.668097 4.48765,4.453971 5.3633,8.573903 0.87562,4.119922 4.70654,16.813721 1.64181,32.959394 -3.06472,16.14564 -10.28872,22.60391 -15.10475,26.94655 -4.81603,4.34261 -15.7615,11.91437 -17.40332,11.80302 -1.64183,-0.11148 -1.86073,-0.11148 -1.31348,-1.55891 z"
id="path1014"
inkscape:connector-curvature="0" />
<path
style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 104.83471,121.99883 c 0,0 7.00512,1.5589 12.36838,-1.78156 5.3633,-3.3405 9.5226,-8.79661 10.17931,-10.91225 0.65672,-2.11564 0.76619,1.89294 1.53236,-0.11125 0.76618,-2.00432 3.83093,-6.01288 2.29855,-15.366239 -1.53237,-9.35333 -1.64182,-9.798747 -4.48762,-14.809463 -2.84586,-5.010719 -9.63207,-11.91437 -13.79134,-14.141359 -4.15927,-2.226986 -9.96037,-5.567464 -17.950594,-5.344766 -7.990202,0.222699 -5.363286,-0.334048 -13.025124,1.002146 -7.661836,1.336187 -14.557491,5.010717 -16.856041,7.015006 -2.298552,2.004286 -8.428023,7.460405 -10.61712,10.46684 -2.189098,3.00643 -8.209113,9.798741 -11.383303,19.263442 -3.174189,9.464683 -4.487646,10.466823 -4.706555,16.702393 -0.21891,6.23557 0.547274,7.90578 -0.766185,8.46256 -1.31346,0.55673 -1.094547,-4.67668 -0.985094,-8.35123 0.109463,-3.6745 0.109463,-13.25056 4.925468,-23.940084 4.816015,-10.689538 13.353489,-19.597489 18.169503,-22.826622 4.816009,-3.229128 10.398208,-7.571752 19.045135,-9.687392 8.646933,-2.115635 17.293863,-1.781586 22.65716,-0.779443 5.3633,1.002145 13.68187,4.453974 18.1695,7.905802 4.48766,3.45183 9.41314,7.683099 13.13459,14.586765 3.72146,6.903648 4.70654,15.700251 4.59709,19.374771 -0.10943,3.674543 -1.97019,12.137103 -4.81601,16.257013 -2.84583,4.11993 -6.67674,9.0193 -10.61711,10.80089 -3.94039,1.78157 -8.75642,2.33833 -12.69675,0.55674 -3.94039,-1.78161 -3.72147,-2.44969 -4.3782,-4.34263 z"
id="path1016"
inkscape:connector-curvature="0" />
<path
style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 104.83471,121.99883 c 0,0 5.54674,1.56707 10.22918,-0.55878 4.68248,-2.12587 6.4239,-4.17301 7.54615,-5.3934 1.12223,-1.22042 3.25064,-3.50376 3.83112,-4.56669 0.58046,-1.06292 1.19962,-1.69282 1.19962,-2.08649 0,-0.39369 -1.08353,-1.33853 -0.0386,-3.62186 1.04482,-2.28333 1.97361,-7.519273 1.50922,-9.881333 -0.46438,-2.362073 -1.54792,-15.471616 -10.83547,-24.211303 -9.28753,-8.739678 -18.497709,-9.763242 -18.497709,-9.763242 0,0 14.705309,4.645415 21.593569,18.739134 6.88828,14.093741 4.64376,23.148344 0.23218,28.659854 -4.41158,5.51151 -10.68068,6.14141 -12.38342,4.72415 -1.70268,-1.41725 -5.2113,6.47164 -4.38574,7.95996 z"
id="path1018"
inkscape:connector-curvature="0" />
<path
style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 86.930353,71.44277 c 0,0 -9.906718,-0.07875 -17.414156,4.881616 -7.507436,4.960371 -11.14506,8.975903 -13.23476,12.125332 -2.089697,3.149446 -4.488981,7.479909 -4.179395,7.401179 0.309585,-0.0788 9.055364,-12.2828 15.866229,-15.432236 6.81087,-3.149436 13.621741,-7.558644 22.986687,-4.330482 9.364952,3.228184 13.776542,7.716118 15.788842,6.613829 2.0123,-1.1023 2.3993,-2.440824 1.23835,-3.936804 -1.16094,-1.495979 -9.364961,-8.818417 -21.051797,-7.322434 z"
id="path1020"
inkscape:connector-curvature="0" />
<path
style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 72.107699,134.35862 c 0.65673,0.33404 5.58219,8.90795 9.522571,10.35548 3.940372,1.44755 6.567286,1.55888 7.005104,2.227 0.437821,0.66809 0.328367,4.00858 3.830921,5.45614 3.502555,1.44753 19.920785,6.01284 24.627325,6.45824 4.70658,0.4454 0.76621,3.22911 3.61202,4.23125 2.84584,1.00217 14.99532,1.5589 17.95061,0.33405 2.95527,-1.22483 2.95527,1.1135 -2.1891,3.1178 -5.14437,2.00427 -18.71677,6.79231 -27.58261,5.67882 -8.86586,-1.1135 -19.373526,-3.00644 -25.284086,-7.23772 -5.910565,-4.23126 -8.42802,-6.1242 -6.238924,-6.45824 2.189096,-0.33407 7.990199,5.9015 10.507662,6.56959 2.517463,0.66809 4.597103,0.66809 3.064735,-0.8908 -1.532366,-1.55888 -11.492755,-8.46253 -12.477849,-8.1285 -0.985092,0.33405 -3.064737,0.55674 -4.816012,-1.78159 -1.751278,-2.33832 -10.945484,-15.25485 -10.39821,-22.1585 0.547273,-6.90365 2.298552,-5.12208 4.378195,-2.56103 2.079641,2.56103 4.487648,4.78801 4.487648,4.78801 z"
id="path1022"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#939393;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 56.889259,34.981831 c 0,0 16.252976,26.08036 43.845241,26.83631 27.59226,0.75596 42.33333,-23.8125 42.33333,-23.8125"
id="path2138"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,25 @@
{
"title": "Features",
"title[zh_CN]": "版本特性",
"items": [
{
"icon": "/usr/share/icons/hicolor/scalable/apps/spark-store.svg",
"name": "Feature 1",
"name[zh_CN]": "特性 1",
"description": "Please click the learn more button to check",
"description[zh_CN]": "请点击 了解更多 按钮来获取特性"
},
{
"icon": ":/icon/logo.svg",
"name": "Feature 2",
"description": "Feature 2 detailed description..."
},
{
"icon": "spark-store",
"name": "Fix 1",
"description": "Fix 1 detailed description..."
}
],
"linkUrl": "https://gitee.com/deepin-community-store/spark-store/releases/",
"linkButtonVisible": true
}

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("http://zunyun01.store.deepinos.org.cn:12345");
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

@@ -1,19 +1,20 @@
#include "downloadworker.h"
#include <QEventLoop>
#include <QProcess>
#include <QRegularExpression>
#include <QDir>
#include <QtConcurrent>
#include <QStandardPaths>
#define DEFAULTURL "d.store.deepinos.org.cn"
#define MAXWAITTIME 200000
DownloadController::DownloadController(QObject *parent)
{
Q_UNUSED(parent)
// 初始化默认域名
domains.clear();
domains.append("d.store.deepinos.org.cn");
domains.append(DEFAULTURL);
/*
domains = {
@@ -39,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();
@@ -70,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);
}
}
/**
@@ -104,34 +110,36 @@ 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"; //最大同时下载数
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());
@@ -139,7 +147,7 @@ void DownloadController::startDownload(const QString &url)
command.append(aria2SizePerThreads.toUtf8());
command.append(aria2ConnectionPerServer.toUtf8());
command.append(aria2ConnectionMax.toUtf8());
command.append(aria2DNSCommand.toUtf8());
if (useMetalink)
{
command.append(aria2NoSeeds.toUtf8());
@@ -154,11 +162,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;
@@ -181,10 +208,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")
{
@@ -246,6 +273,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

@@ -2,9 +2,8 @@
#define DOWNLOADWORKER_H
#include <QObject>
#include <QList>
#include <QFile>
#include <QNetworkReply>
#include <QVector>
#include <QProcess>
class DownloadController : public QObject
{
@@ -16,26 +15,23 @@ 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);
signals:
void errorOccur(const QString& msg);
void downloadProcess(QString, qint64, qint64);
void downloadFinished();
private:
int threadNum;
qint64 pidNumber = -1;
QString filename;
qint64 fileSize;
QVector<QPair<qint64, qint64>> ranges;
QFile *file;
bool finished = false;
QVector<QString> domains;
signals:
void errorOccur(const QString& msg);
void downloadProcess(QString, qint64, qint64);
void downloadFinished();
};
#endif // FILEDOWNLOADWORKER_H

View File

@@ -22,13 +22,13 @@ void image_show::setImage(QPixmap image)
QImage re_screen1;
QImage re_screen0 = screen0.scaled(QSize(400, 300), Qt::KeepAspectRatio, Qt::SmoothTransformation);
// 获取主屏幕尺寸
desktop_w = QGuiApplication::primaryScreen()->geometry().width();
desktop_h = QGuiApplication::primaryScreen()->geometry().height();
// 获取当前app所在的主屏幕尺寸
desktop_w = QGuiApplication::screenAt(QCursor().pos())->geometry().width();
desktop_h = QGuiApplication::screenAt(QCursor().pos())->geometry().height();
if (screen0.width() > (desktop_w - 20) || screen0.height() > (desktop_h - 20))
if (screen0.width() > int(desktop_w / 3 * 2) || screen0.height() > int(desktop_h / 3 * 2))
{
re_screen1 = screen0.scaled(QSize(desktop_w - 20, desktop_h - 20), Qt::KeepAspectRatio, Qt::SmoothTransformation);
re_screen1 = screen0.scaled(QSize(int(desktop_w / 3 * 2), int(desktop_h / 3 * 2)), Qt::KeepAspectRatio, Qt::SmoothTransformation);
m_image = QPixmap::fromImage(re_screen1);
}
else
@@ -42,12 +42,13 @@ void image_show::setImage(QPixmap image)
void image_show::mousePressEvent(QMouseEvent *)
{
m_dialog->setimage(m_image);
m_dialog->showFullScreen();
// 识别主屏幕尺寸并设置 widget 大小
m_dialog->setFixedSize(desktop_w, desktop_h);
m_dialog->setFixedSize(qMin(desktop_w, m_image.width() + int(desktop_h / 16 * m_image.width() / m_image.height())), qMin(desktop_h, m_image.height() + int(desktop_h / 16)));
m_dialog->move(0, 0);
m_dialog->move(QGuiApplication::screenAt(QCursor().pos())->geometry().center() - m_dialog->rect().center());
m_dialog->show();
}
image_show::~image_show()
{

View File

@@ -5,6 +5,12 @@
#include <QDebug>
QString SparkAPI::serverUrl = "";
#ifdef __x86_64__
QString SparkAPI::serverUrlDir = "store";
#elif __aarch64__
QString SparkAPI::serverUrlDir = "aarch64-store";
#endif
SparkAPI::SparkAPI(QObject *parent) : QObject(parent)
{
@@ -54,7 +60,7 @@ void SparkAPI::getRAW(QUrl url)
void SparkAPI::getAppList(QString type)
{
get(QUrl(getServerUrl() + "store/" + type + "/applist.json"));
get(QUrl(getServerUrl() + SparkAPI::serverUrlDir + "/" + type + "/applist.json"));
}
void SparkAPI::getSearchList(QString keyword)
@@ -64,12 +70,17 @@ void SparkAPI::getSearchList(QString keyword)
void SparkAPI::getAppInfo(QUrl spk)
{
get(QUrl(getServerUrl() + "store" + spk.path().replace("+", "%2B") + "/app.json"));
get(QUrl(getServerUrl() + SparkAPI::serverUrlDir + spk.path().replace("+", "%2B") + "/app.json"));
}
QString SparkAPI::getArchDir()
{
return SparkAPI::serverUrlDir;
}
void SparkAPI::getAppDownloadTimes(QUrl spk)
{
getRAW(QUrl(getServerUrl() + "store" + spk.path().replace("+", "%2B") + "/download-times.txt"));
getRAW(QUrl(getServerUrl() + SparkAPI::serverUrlDir + spk.path().replace("+", "%2B") + "/download-times.txt"));
}
QString SparkAPI::getServerUrl()

View File

@@ -25,6 +25,7 @@ public:
void getRAW(QUrl url);
void getAppList(QString type);
void getAppInfo(QUrl spk);
static QString getArchDir();
signals:
void finished(QJsonArray);
@@ -33,6 +34,7 @@ signals:
private:
static QString serverUrl;
static QString serverUrlDir;
};
#endif // SPARKAPI_H

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>
@@ -11,17 +20,103 @@
#include <QSettings>
#include <QFile>
#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/deepin-community-store/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 QString version = "4.2.3";
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,21 +126,96 @@ 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
qputenv("DTK_FORCE_RASTER_WIDGETS", "FALSE");
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-features=UseModernMediaControls");
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-web-security");
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-features=UseModernMediaControls");
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-web-security");
// 浏览器开启 GPU 支持
#ifdef __sw_64__
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode --no-sandbox");
#else
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode");
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
DApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 开启 Hidpi 支持
/**
* FIXME: 对于麒麟 CPU 设备,调用 QtWebEngine 会导致客户端崩溃;
* 暂时不对 CPU 进行判断,对 wayland 环境下统一处理
*/
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);
}
#endif
// 强制使用 DTK 平台插件
QVector<char *> fakeArgs(argc + 2);
@@ -59,7 +229,7 @@ int main(int argc, char *argv[])
int fakeArgc = argc + 2; // QCoreApplication 的 argc 要用引用,避免 c++ 编译器优化
Application a(fakeArgc, fakeArgs.data());
// 设置版本和构建时间
a.setVersionAndBuildDateTime(version, buildDateTime);
a.setBuildDateTime(buildDateTime);
// 限制单实例运行
if (!a.setSingleInstance("spark-store"))

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

@@ -3,6 +3,7 @@
#include "utils/widgetanimation.h"
#include "widgets/common/progressbutton.h"
#include "widgets/downloadlistwidget.h"
#include "widgets/common/downloaditem.h"
#include "dbus/dbussparkstoreservice.h"
#include "application.h"
@@ -10,8 +11,12 @@
#include <DWidgetUtil>
#include <DGuiApplicationHelper>
#include <QDesktopServices>
#include <QAbstractButton>
#include <QtConcurrent>
#include <unistd.h>
#include <backend/ThemeChecker.h>
#define AppPageApplist 0
#define AppPageSearchlist 1
@@ -30,14 +35,12 @@ MainWindow::MainWindow(QWidget *parent)
{
ui->setupUi(this);
initTmpDir();
initUI();
initConnections();
ui->appintopage->setDownloadWidget(downloadlistwidget);
initTmpDir();
emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
ui->appintopage->setDownloadWidget(downloadlistwidget);
}
MainWindow::~MainWindow()
@@ -102,6 +105,22 @@ void MainWindow::openUrl(const QString &url)
}
}
bool MainWindow::isCloseWindowAnimation()
{
return closeWindowAnimation;
}
void MainWindow::closeEvent(QCloseEvent *event)
{
// 判断下载任务数量,如果没有要下载的,就直接退出主程序
if(!downloadlistwidget->isDownloadInProcess()){
// 已经全部下载完成
qApp->quit();
}
BaseWidgetOpacity::closeEvent(event);
}
void MainWindow::initUI()
{
setWindowTitle(QObject::tr("Spark Store"));
@@ -114,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);
@@ -130,8 +150,13 @@ 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);
downloadButton->setFocusPolicy(Qt::FocusPolicy::ClickFocus);
downloadlistwidget->setFocusProxy(downloadButton);
QWidget *w_titlebar = new QWidget(ui->titlebar);
QHBoxLayout *ly_titlebar = new QHBoxLayout(w_titlebar);
@@ -245,65 +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(downloadButton, &ProgressButton::clicked, [=]()
{
QPoint pos;
pos.setX(downloadButton->mapToGlobal(QPoint(0, 0)).x() + downloadButton->width() / 2 - downloadlistwidget->width() / 2);
pos.setY(downloadButton->mapToGlobal(QPoint(0, 0)).y() + downloadButton->height() + 5);
downloadlistwidget->m_move(pos.x(), pos.y());
downloadlistwidget->show(); });
connect(ThemeChecker::instance(), &ThemeChecker::themeChanged, this, &MainWindow::refreshTheme);
// appintopage按下下载按钮时标题栏下载列表按钮抖动
connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]()
@@ -380,6 +401,28 @@ void MainWindow::initTmpDir()
// 新建临时文件夹
QDir dir;
dir.mkpath("/tmp/spark-store");
// 检查写入权限
QFileInfo info("/tmp/spark-store");
if (info.isWritable() == false)
{
QtConcurrent::run([=]
{
sleep(3);
auto upgradeP = new QProcess();
upgradeP->startDetached("zenity", QStringList() << "--warning"
<< "--text"
<< "用户未拥有 /tmp/spark-store 写入权限,星火商店会因此工作异常,请检查!"
<< "--title"
<< "权限受限提示"
<< "--width"
<< "360"
);
upgradeP->waitForStarted();
upgradeP->waitForFinished(30);
upgradeP->deleteLater(); });
}
}
void MainWindow::switchPage(int now) // 临时方案,回家后修改
@@ -421,6 +464,35 @@ void MainWindow::updateUi(int now)
switchPage(AppPageApplist);
}
void MainWindow::notify(QObject *receiver, QEvent *event)
{
if (!receiver) {
return;
}
Dtk::Widget::DStyle *o_ptr = qobject_cast<Dtk::Widget::DStyle *>(receiver);
if (o_ptr) {
return;
}
if (receiver->inherits("QWidgetWindow")
|| receiver->inherits("QStyleSheetStyle")) {
return;
}
if (event->type() == QEvent::FocusIn) {
QList<QObject *> list = downloadButton->findChildren<QObject *>(QString(), Qt::FindChildrenRecursively);
list << downloadlistwidget->findChildren<QObject *>(QString(), Qt::FindChildrenRecursively);
if (receiver != downloadButton && receiver != downloadlistwidget && !list.contains(receiver)) {
downloadlistwidget->hide();
}
} else if (event->type() == QEvent::FocusOut) {
if (!downloadlistwidget->isActiveWindow() && !isActiveWindow()) {
downloadlistwidget->hide();
}
}
}
void MainWindow::on_pushButton_14_clicked()
{
// Check UOS

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

@@ -25,10 +25,16 @@ class MainWindow : public BaseWidgetOpacity
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
~MainWindow() override;
void openUrl(const QString &url);
bool isCloseWindowAnimation();
Q_INVOKABLE void refreshTheme(bool isDarkMode);
protected:
void closeEvent(QCloseEvent *event) override;
private:
void initUI();
void initTitleBar();
@@ -41,6 +47,9 @@ private:
void switchPage(int now);
void updateUi(int now);
public slots:
void notify(QObject *receiver, QEvent *event);
private slots:
//接受来自dbus的url
void onGetUrl(const QString &url);

View File

@@ -2,11 +2,17 @@
#include "ui_appintopage.h"
#include "backend/sparkapi.h"
#include "widgets/downloadlistwidget.h"
#include "widgets/common/downloaditem.h"
#include "backend/image_show.h"
#include "application.h"
#include "utils/utils.h"
#include "pages/settingspage.h"
#include <QtConcurrent>
#include <QClipboard>
#include <QFile>
#include <DSysInfo>
AppIntoPage::AppIntoPage(QWidget *parent)
: QWidget(parent)
@@ -53,8 +59,9 @@ void AppIntoPage::openUrl(const QUrl &url)
// 获取图标
QNetworkRequest request;
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
qDebug() << api->getImgServerUrl() + "store" + url.path() + "/icon.png";
request.setUrl(QUrl(api->getImgServerUrl() + "store" + url.path() + "/icon.png"));
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);
@@ -69,20 +76,12 @@ void AppIntoPage::openUrl(const QUrl &url)
manager->deleteLater(); });
// 获取截图
QJsonParseError error;
QJsonArray array = QJsonDocument::fromJson(info.value("img_urls").toString().toUtf8(), &error).array();
QStringList imglist;
foreach (const QJsonValue &value, array) {
QString imgUrl = value.toString();
imglist.append(imgUrl);
}
qDebug() << imglist;
for (int i = 0; i < imglist.size(); i++)
for (int i = 0; i < 5 /* 魔法数字,最多五个截图 */; i++)
{
QString imgUrl = pkgUrlBase + "/screen_" + QString::number(i + 1) + ".png";
QNetworkRequest request;
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
request.setUrl(QUrl(imglist.value(i)));
request.setUrl(QUrl(imgUrl));
request.setRawHeader("User-Agent", "Mozilla/5.0");
request.setRawHeader("Content-Type", "charset='utf-8'");
manager->get(request);
@@ -90,17 +89,21 @@ void AppIntoPage::openUrl(const QUrl &url)
{
QByteArray jpegData = reply->readAll();
QPixmap pixmap;
pixmap.loadFromData(jpegData);
pixmap.scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
image_show *img=new image_show(this);
img->setImage(pixmap);
//img->setScaledContents(true);
QListWidgetItem* pItem = new QListWidgetItem();
pItem->setSizeHint(QSize(280, 200));
ui->listWidget->addItem(pItem);
ui->listWidget->setItemWidget(pItem, img);
if (pixmap.loadFromData(jpegData))
{
pixmap.scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
image_show *img = new image_show(this);
img->setImage(pixmap);
// img->setScaledContents(true);
QListWidgetItem *pItem = new QListWidgetItem();
pItem->setSizeHint(QSize(280, 200));
ui->listWidget->insertItem(i, pItem);
ui->listWidget->setItemWidget(pItem, img);
qDebug() << imgUrl;
}
manager->deleteLater(); });
manager->deleteLater();
});
}
// Check UOS
@@ -168,12 +171,12 @@ 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();
}
isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString());
isDownloading(SparkAPI::getServerUrl() + SparkAPI::getArchDir() + spk.path() + "/" + info["Filename"].toString());
}
api1->disconnect();
@@ -196,24 +199,20 @@ void AppIntoPage::clear()
ui->tag_community->hide();
ui->icon->clear();
ui->title->clear();
ui->version->clear();
ui->author->clear();
ui->d_author->clear();
ui->d_size->clear();
ui->d_update->clear();
ui->d_pkgname->clear();
ui->d_website->clear();
ui->d_contributor->clear();
ui->label_2->clear();
ui->downloadButton->hide();
ui->downloadButton->setEnabled(false);
ui->pushButton_3->hide();
// QListWidgetItem *item = nullptr;
// while ((item = ui->listWidget->takeItem(0)) != nullptr)
// {
// QWidget *card = ui->listWidget->itemWidget(item);
// if (card)
// {
// card->deleteLater();
// card = nullptr;
// }
// delete item;
// item = nullptr;
// }
ui->listWidget->clear(); // NOTE: QListWidget::clear() 会析构所有 items
}
@@ -265,7 +264,7 @@ void AppIntoPage::setDownloadWidget(DownloadListWidget *w)
dw = w;
connect(w, &DownloadListWidget::downloadFinished, [=]()
{ isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString()); });
{ isDownloading(SparkAPI::getServerUrl() + SparkAPI::getArchDir() + spk.path() + "/" + info["Filename"].toString()); });
}
void AppIntoPage::initUI()
@@ -310,7 +309,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)
{
@@ -334,6 +333,9 @@ void AppIntoPage::isDownloading(const QUrl &url)
void AppIntoPage::setAppinfoTags(const QStringList &tagList)
{
bool ubuntuSupport = false;
bool deepinSupport = false;
bool uosSupport = false;
foreach (const QString &tag, tagList)
{
if (tag == "community")
@@ -343,14 +345,18 @@ void AppIntoPage::setAppinfoTags(const QStringList &tagList)
else if (tag == "ubuntu")
{
ui->tag_ubuntu->show();
ubuntuSupport = true;
}
else if (tag == "deepin")
{
ui->tag_deepin->show();
deepinSupport = true;
}
else if (tag == "uos")
{
ui->tag_uos->show();
uosSupport = true;
}
else if (tag == "dtk5")
{
@@ -369,11 +375,59 @@ void AppIntoPage::setAppinfoTags(const QStringList &tagList)
ui->tag_a2d->show();
}
}
notifyUserUnsupportedTags(ubuntuSupport, deepinSupport, uosSupport);
}
void AppIntoPage::notifyUserUnsupportedTags(bool ubuntuSupport, bool deepinSupport, bool uosSupport)
{
if (!SettingsPage::needUncompatibleNotification) {
return;
}
bool isDeepin = Dtk::Core::DSysInfo::productType() == Dtk::Core::DSysInfo::Deepin;
bool isUOS = Dtk::Core::DSysInfo::productType() == Dtk::Core::DSysInfo::Uos;
bool checkdeepin = (isDeepin && !deepinSupport);
bool checkuos = (isUOS && !uosSupport);
bool isUbuntu = false;
if (!checkdeepin && !checkuos)
{
// 检查是否为 ubuntu 系统
QFile lsb("/etc/lsb-release");
if (!lsb.open(QIODevice::ReadOnly))
{
qDebug() << "打开 /etc/lsb-release 失败";
}
else if (lsb.readAll().contains("Ubuntu"))
{
isUbuntu = true;
lsb.close();
}
}
bool checkubuntu = (isUbuntu && !ubuntuSupport);
if (checkdeepin)
{
Utils::sendNotification("spark-store", tr("Warning"), tr("The current application does not support deepin, there may be problems"));
}
else if (checkuos)
{
Utils::sendNotification("spark-store", tr("Warning"), tr("The current application does not support UOS, there may be problems"));
}
else if (checkubuntu)
{
Utils::sendNotification("spark-store", tr("Warning"), tr("The current application does not support Ubuntu, there may be problems"));
}
else if (!isUbuntu && !isDeepin && !isUOS)
{
Utils::sendNotification("spark-store", tr("Warning"), tr("The current application does not support current platform, there may be problems"));
}
return;
}
void AppIntoPage::on_downloadButton_clicked()
{
QString downloadUrl = SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString();
QString downloadUrl = SparkAPI::getServerUrl() + SparkAPI::getArchDir() + spk.path() + "/" + info["Filename"].toString();
if (ui->downloadButton->text() == tr("Install"))
{
DownloadItem *item = dw->getDIList()[dw->getUrlList().lastIndexOf(downloadUrl)];
@@ -416,7 +470,7 @@ void AppIntoPage::on_pushButton_3_clicked()
ui->pushButton_3->setEnabled(false);
QProcess uninstall;
uninstall.start("pkexec", QStringList() << "apt" << "purge" << "-y" << info["Pkgname"].toString().toLower());
uninstall.start("pkexec", QStringList() << "apt" << "autopurge" << "-y" << info["Pkgname"].toString().toLower());
uninstall.waitForFinished(-1);
QProcess check;
@@ -425,7 +479,7 @@ void AppIntoPage::on_pushButton_3_clicked()
if (check.readAllStandardOutput().isEmpty())
{
ui->downloadButton->setText(tr("Download"));
ui->downloadButton->setText(tr("Download and Install"));
ui->pushButton_3->hide();
updatesEnabled();

View File

@@ -1,8 +1,6 @@
#ifndef APPINTOPAGE_H
#define APPINTOPAGE_H
#include "utils/utils.h"
#include <QWidget>
#include <QJsonObject>
#include <QUrl>
@@ -31,6 +29,7 @@ private:
void initConnections();
void isDownloading(const QUrl &url);
void setAppinfoTags(const QStringList &tagList);
void notifyUserUnsupportedTags(bool ubuntuSupport, bool deepinSupport, bool uosSupport);
signals:
void clickedDownloadBtn();

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,6 +1,8 @@
#include "applistpage.h"
#include "ui_applistpage.h"
AppListPage::AppListPage(QWidget *parent) : QWidget(parent),
ui(new Ui::AppListPage)
{
@@ -45,11 +47,17 @@ void AppListPage::getAppList(QString type)
}
if (type == "")
{
url = api->getServerUrl() + "store/#/flamescion/?" + theme;
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() + "store/#/flamescion/applist?type=" + type + "&" + theme;
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);
@@ -71,7 +79,11 @@ void AppListPage::getSearchList(const QString &keyword)
{
theme = "theme=light";
}
url = api->getServerUrl() + "store/#/flamescion/search?keywords=" + QUrl::toPercentEncoding(keyword) + "&" + theme;
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;
}
@@ -86,7 +98,7 @@ void AppListPage::on_webEngineView_urlChanged(const QUrl &arg1)
if (arg1.path().right(8) == "app.json")
{
QString url = arg1.toString();
url = url.mid(url.indexOf("/store/"));
url = url.mid(url.indexOf("/" + SparkAPI::getArchDir() + "/"));
url = "spk:/" + url;
url = url.mid(0, url.indexOf("/app.json"));
qDebug() << "程序跳转链接地址:" << url;

View File

@@ -11,6 +11,7 @@
#define DEFAULT_SERVER_URL "https://cdn.d.store.deepinos.org.cn/"
#define DEFAULT_CHECK_DOMAIN "deepinos"
bool SettingsPage::needUncompatibleNotification = true;
bool SettingsPage::isdownload = false;
SettingsPage::SettingsPage(QWidget *parent)
@@ -99,6 +100,9 @@ void SettingsPage::initConfig()
SparkAPI::setServerUrl(config.value("server/choose").toString());
}
configCanSave = true; //  防止触发保存配置信号
needUncompatibleNotification = config.value("other/uncompatibleNotification", needUncompatibleNotification).toBool();
ui->checkBox->setChecked(needUncompatibleNotification);
}
SettingsPage::~SettingsPage()
@@ -114,7 +118,7 @@ void SettingsPage::on_pushButton_updateServer_clicked()
QFile::remove(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/server.list");
auto updateSuccess = system("curl -o " + QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation).toUtf8() + "/server.list https://d.store.deepinos.org.cn/store/server-and-mirror.list");
auto updateSuccess = system("curl -o " + QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation).toUtf8() + "/server.list " /* 注意空格的问题 */ + DEFAULT_SERVER_URL + "store/server-and-mirror.list");
qDebug() << "Update serverlist status:" << updateSuccess;
if (updateSuccess != 0) // 更新失败不换服务器配置
{
@@ -252,3 +256,11 @@ void SettingsPage::on_pushButton_clearWebCache_clicked()
cacheDir.removeRecursively();
});
}
void SettingsPage::on_checkBox_clicked(bool checked)
{
needUncompatibleNotification = checked;
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
config.setValue("other/uncompatibleNotification", needUncompatibleNotification);
config.sync();
}

View File

@@ -30,6 +30,11 @@ private slots:
void on_pushButton_clearWebCache_clicked();
void on_checkBox_clicked(bool checked);
public:
static bool needUncompatibleNotification;
private:
static bool isdownload;
bool configCanSave;

View File

@@ -54,7 +54,7 @@
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="scrollArea_2">
<widget class="QScrollArea" name="scrollArea">
<property name="styleSheet">
<string notr="true"/>
</property>
@@ -67,21 +67,21 @@
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents_3">
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>679</width>
<height>741</height>
<width>743</width>
<height>950</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_23">
<item>
<widget class="QWidget" name="widget_6" native="true">
<widget class="QWidget" name="widget" native="true">
<layout class="QVBoxLayout" name="verticalLayout_22">
<item>
<widget class="QLabel" name="label_2">
<widget class="QLabel" name="label">
<property name="font">
<font>
<pointsize>18</pointsize>
@@ -93,10 +93,10 @@
</widget>
</item>
<item>
<widget class="QWidget" name="widget_7" native="true">
<widget class="QWidget" name="widget_2" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_3">
<widget class="QLabel" name="label_2">
<property name="maximumSize">
<size>
<width>100</width>
@@ -132,7 +132,7 @@
</widget>
</item>
<item>
<widget class="QLabel" name="label_setting1">
<widget class="QLabel" name="label_setting">
<property name="maximumSize">
<size>
<width>160</width>
@@ -140,12 +140,12 @@
</size>
</property>
<property name="text">
<string>Take effect when restart</string>
<string>Take effect immediately</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@@ -161,10 +161,10 @@
</widget>
</item>
<item>
<widget class="QWidget" name="widget_8" native="true">
<widget class="QWidget" name="widget_3" native="true">
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="3">
<spacer name="horizontalSpacer_4">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@@ -177,7 +177,7 @@
</spacer>
</item>
<item row="1" column="0" colspan="4">
<widget class="QLabel" name="label_7">
<widget class="QLabel" name="label_4">
<property name="styleSheet">
<string notr="true">color:#808080</string>
</property>
@@ -190,7 +190,7 @@
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Spark Store Update</string>
</property>
@@ -217,10 +217,44 @@
</widget>
</item>
<item>
<widget class="QWidget" name="widget_9" native="true">
<widget class="QWidget" name="widget_7" native="true">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_11">
<property name="font">
<font>
<pointsize>18</pointsize>
</font>
</property>
<property name="text">
<string>Other Settings</string>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_8" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>Enable notification for apps not compatible with current system</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget_4" native="true">
<layout class="QVBoxLayout" name="verticalLayout_26">
<item>
<widget class="QLabel" name="label_8">
<widget class="QLabel" name="label_5">
<property name="font">
<font>
<pointsize>18</pointsize>
@@ -232,10 +266,10 @@
</widget>
</item>
<item>
<widget class="QWidget" name="widget_10" native="true">
<widget class="QWidget" name="widget_5" native="true">
<layout class="QGridLayout" name="gridLayout_4">
<item row="2" column="0" colspan="5">
<widget class="QLabel" name="label_12">
<widget class="QLabel" name="label_8">
<property name="styleSheet">
<string notr="true">color:#808080</string>
</property>
@@ -252,14 +286,14 @@
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_11">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Location/tmp/spark-store</string>
</property>
</widget>
</item>
<item row="0" column="4">
<spacer name="horizontalSpacer_5">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@@ -279,7 +313,7 @@
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_13">
<widget class="QLabel" name="label_7">
<property name="maximumSize">
<size>
<width>80</width>
@@ -305,10 +339,10 @@
</widget>
</item>
<item>
<widget class="QWidget" name="widget_2" native="true">
<widget class="QWidget" name="widget_6" native="true">
<layout class="QVBoxLayout" name="verticalLayout_25">
<item>
<widget class="QLabel" name="label_4">
<widget class="QLabel" name="label_9">
<property name="font">
<font>
<pointsize>18</pointsize>
@@ -320,9 +354,10 @@
</widget>
</item>
<item>
<widget class="QLabel" name="label_5">
<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 &amp;lt;jifengshenmo@outlook.com&amp;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;Connect us on Spark IM: &lt;a href=&quot;https://chat.shenmo.tech&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://chat.shenmo.tech&lt;br/&gt;&lt;/span&gt;&lt;/a&gt;Our QQ Group number:872690351&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<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>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -336,7 +371,7 @@
</widget>
</item>
<item>
<spacer name="verticalSpacer_4">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>

View File

@@ -1,9 +0,0 @@
TARGET = spark-dstore-patch
TEMPLATE += app
QT += widgets
SOURCES += spark-dstore-tool.cpp
# Default rules for deployment.
qnx: target.path = /tmp/spark-store/bin
else: unix:!android: target.path = /opt/durapps/spark-store/bin
!isEmpty(target.path): INSTALLS += target

View File

@@ -1,195 +0,0 @@
#include <QCoreApplication>
#include <QDir>
#include <QJsonObject>
#include <QJsonDocument>
#include <QDebug>
#include <QDirIterator>
#include <QProcess>
#include <unistd.h>
QList<QJsonObject> enumAppInfoList()
{
QList<QJsonObject> appInfoList;
QDir apps("/opt/apps");
auto list = apps.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
for (auto &appID : list) {
auto infoPath = apps.absoluteFilePath(appID + "/info");
QFile infoFile(infoPath);
if (!infoFile.open(QIODevice::ReadOnly)) {
continue;
}
auto doc = QJsonDocument::fromJson(infoFile.readAll());
appInfoList.push_back(doc.object());
}
return appInfoList;
}
//这段是去找appid和info没看懂用来干啥的在此之后info文件也没再用过
//可能以后版本的实现会用到,等官方加功能再说
void linkDir(const QString &source, const QString &target)
{
auto ensureTargetDir = [](const QString &targetFile) {
QFileInfo t(targetFile);
QDir tDir(t.dir());
tDir.mkpath(".");
};
QDir sourceDir(source);
QDir targetDir(target);
QDirIterator iter(source, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
while (iter.hasNext()) {
auto sourceFile = iter.next();
auto targetFile = targetDir.absoluteFilePath(sourceDir.relativeFilePath(sourceFile));
QFileInfo tfi(targetFile);
// if (tfi.isSymLink() && (tfi.canonicalFilePath() == sourceFile)) {
//这里官方应该是写错了,否则会每触发一次就把所有软链接都删了重新创建一次
if (tfi.isSymLink() && (tfi.symLinkTarget() == sourceFile)) {
continue;
} else {
QFile::remove(targetFile);
}
ensureTargetDir(targetFile);
auto ret = symlink(sourceFile.toStdString().c_str(), targetFile.toStdString().c_str());
if (0 != ret) {
qDebug() << "link failed" << sourceFile << "=>" << targetFile << ret;
}
}
}
//reset Dynamic library rpath
void setRpath(const QString &file, const QString &path)
{
if (!QFileInfo::exists(path))
return;
QProcess p;
auto cmd = "patchelf " + file + " --set-rpath " + path;
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
}
QString getGlic()
{
//get arch & glibc
QProcess p;
auto cmd = "gcc -dumpmachine";
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
return p.readAll();
}
void linkApp(const QJsonObject &app)
{
auto appID = app.value("appid").toString();
auto appEntriesDir = QDir("/opt/apps/" + appID + "/entries");
auto appLibsDir = QDir("/opt/apps/" + appID + "/files/lib");
auto autoStartDir = QDir(appEntriesDir.absoluteFilePath("autostart"));
bool autoStart = app.value("permissions").toObject().value("autostart").toBool();
if (autoStart) {
linkDir(appEntriesDir.absoluteFilePath("autostart"), "/etc/xdg/autostart");
}
// link application
auto sysShareDir = QDir("/usr/share");
linkDir(appEntriesDir.absoluteFilePath("applications"), sysShareDir.absoluteFilePath("applications"));
linkDir(appEntriesDir.absoluteFilePath("icons"), sysShareDir.absoluteFilePath("icons"));
linkDir(appEntriesDir.absoluteFilePath("mime"), sysShareDir.absoluteFilePath("mime"));
linkDir(appEntriesDir.absoluteFilePath("glib-2.0"), sysShareDir.absoluteFilePath("glib-2.0"));
linkDir(appEntriesDir.absoluteFilePath("services"), sysShareDir.absoluteFilePath("dbus-1/services"));
linkDir(appEntriesDir.absoluteFilePath("GConf"), sysShareDir.absoluteFilePath("GConf"));
linkDir(appEntriesDir.absoluteFilePath("help"), sysShareDir.absoluteFilePath("help"));
linkDir(appEntriesDir.absoluteFilePath("locale"), sysShareDir.absoluteFilePath("locale"));
linkDir(appEntriesDir.absoluteFilePath("fcitx"), sysShareDir.absoluteFilePath("fcitx"));
linkDir(appEntriesDir.absoluteFilePath("polkit"), sysShareDir.absoluteFilePath("polkit-1"));
linkDir(appEntriesDir.absoluteFilePath("fonts/conf"), "/etc/fonts/conf.d");
linkDir(appEntriesDir.absoluteFilePath("fonts/files"), sysShareDir.absoluteFilePath("fonts"));
//原来会导致Gtk相关应用翻译缺失补足了
auto pluginDir = QDir(appEntriesDir.absoluteFilePath("plugins"));
if (pluginDir.exists()) {
QString arch = getGlic();
// if (pluginDir.exists()) {
// QDirIterator iter(pluginDir.absolutePath(), QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
// while (iter.hasNext()) {
// auto sourceFile = iter.next();
// setRpath(sourceFile, appLibsDir.absolutePath()); //set rpath
// }
// }
linkDir(appEntriesDir.absoluteFilePath("plugins/fcitx"), "/usr/lib/" + arch + "/fcitx");
linkDir(appEntriesDir.absoluteFilePath("plugins/browser"), "/usr/lib/mozilla/plugins");
}
}
void cleanLink()
{
auto cleanDirBrokenLink = [](const QString &dir) {
QProcess p;
auto cmd = "find " + dir + " -xtype l -delete";
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
};
QString arch = getGlic();
auto sysShareDir = QDir("/usr/share");
cleanDirBrokenLink(sysShareDir.absoluteFilePath("applications"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("icons"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("mime/packages"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("glib-2.0"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("dbus-1/services"));
cleanDirBrokenLink("/etc/xdg/autostart");
cleanDirBrokenLink(sysShareDir.absoluteFilePath("fcitx"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("help"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("locale"));
cleanDirBrokenLink("/usr/lib/" + arch + "/fcitx");
cleanDirBrokenLink("/usr/lib/mozilla/plugins");
cleanDirBrokenLink(sysShareDir.absoluteFilePath("polkit-1/actions"));
cleanDirBrokenLink(sysShareDir.absoluteFilePath("fonts"));
cleanDirBrokenLink("/etc/fonts/conf.d");
}
void update()
{
QProcess p;
auto cmd = "glib-compile-schemas /usr/share/glib-2.0/schemas/";
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
cmd = "update-icon-caches /usr/share/icons/*";
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
cmd = "update-desktop-database -q";
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
cmd = "update-mime-database -V /usr/share/mime";
p.start("bash", QStringList {"-c", cmd});
p.waitForFinished();
}
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
cleanLink();
for (auto &a : enumAppInfoList()) {
linkApp(a);
}
qInfo()<<"Spark dstore patch (c) The Spark Project 2022-Now. Modified from deepin-app-store-tool";
// trigger
update();
return 0;
}

View File

@@ -22,13 +22,20 @@ DEFINES += QT_DEPRECATED_WARNINGS
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
# Get build version from qmake
VERSION = $$BUILD_VERSION
isEmpty(VERSION): VERSION = 4.0.0
DEFINES += APP_VERSION=\\\"'$${VERSION}'\\\"
DEFINES += APP_BRANCH=\\\"'$$system(git symbolic-ref --short -q HEAD)'\\\"
# Disable qWarning / qDebug output in Release
# CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
#CONFIG(release, debug | release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
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 \
@@ -53,6 +60,8 @@ SOURCES += \
mainwindow-dtk.cpp
HEADERS += \
backend/DataCollectorAndUploader.h \
backend/ThemeChecker.h \
backend/downloadworker.h \
backend/image_show.h \
backend/sparkapi.h \
@@ -88,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

@@ -8,6 +8,8 @@
#include <QSettings>
#include <QStandardPaths>
#include <QFile>
#include <QUuid>
#include <QJsonDocument>
#define UOSDeveloperModeFile "/var/lib/deepin/developer-mode/enabled"
@@ -95,6 +97,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
@@ -125,6 +132,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
*/
@@ -182,3 +197,33 @@ void Utils::checkUOSDeveloperMode()
file.close();
config.sync(); // 写入更改至 config.ini并同步最新内容
}
/**
* @brief Utils::parseFeatureJsonFile 解析版本特性 json 文件
* @return 返回 QJsonObject
*/
QJsonObject Utils::parseFeatureJsonFile()
{
QFile file(":/json/features.json");
if (!file.open(QFile::ReadOnly))
{
qWarning() << Q_FUNC_INFO << "features.json open failed";
return QJsonObject();
}
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(file.readAll(), &error);
if (error.error != QJsonParseError::NoError || jsonDoc.isNull())
{
qWarning() << Q_FUNC_INFO << "features.json validate failed:" << error.errorString();
return QJsonObject();
}
if (jsonDoc.isEmpty() || !jsonDoc.isObject())
{
qWarning() << Q_FUNC_INFO << "features jsonDoc parse failed:" << jsonDoc;
return QJsonObject();
}
return jsonDoc.object();
}

View File

@@ -2,6 +2,7 @@
#define UTILS_H
#include <QObject>
#include <QJsonObject>
class Utils
{
@@ -11,8 +12,10 @@ public:
static bool isWayland();
static void initConfig();
static bool isUOS();
static QString initUUID();
static void setQPAPlatform();
static void checkUOSDeveloperMode();
static QJsonObject parseFeatureJsonFile();
};
#endif // UTILS_H

View File

@@ -43,6 +43,7 @@ void BaseWidgetOpacity::closeEvent(QCloseEvent *event)
bool isWayland = Utils::isWayland();
if (isWayland)
{
closeWindowAnimation = true;
return DBlurEffectWidget::closeEvent(event);
}

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

@@ -61,8 +61,21 @@ QString DownloadItem::getName()
return ui->label_filename->text();
}
void DownloadItem::readyInstall()
/***************************************************************
* @brief 告知界面,准备安装
* @param
* @note 如果正在安装,返回-1
* @Sample usage: DownloadItem::install(0);
**************************************************************/
int DownloadItem::readyInstall()
{
// 检查是否正在安装,如果是返回错误 -1
if (isInstall)
{
return -1;
}
if (!close)
{
ui->progressBar->hide();
@@ -70,7 +83,9 @@ void DownloadItem::readyInstall()
ui->pushButton_install->show();
DownloadItem::install(0);
ui->pushButton_2->hide();
return 1;
}
return 0;
}
void DownloadItem::setFileName(QString fileName)
@@ -93,6 +108,12 @@ void DownloadItem::setSpeed(QString s)
speed = s;
}
/***************************************************************
* @brief 安装当前应用
* @param int t, t为安装方式可以为 0,1,2
* @note 执行这个函数时,需要已经检查是否可以安装,但该函数仍然会再检测一次!
* @Sample usage: DownloadItem::install(0);
**************************************************************/
void DownloadItem::install(int t)
{
if (!isInstall)
@@ -142,19 +163,28 @@ void DownloadItem::on_pushButton_3_clicked()
output_w->show();
}
/***************************************************************
* @brief 实际安装应用
* @param int t, t为安装方式可以为 0,1,2
* @note 备注
* @Sample usage: slotAsyncInstall(0);
**************************************************************/
void DownloadItem::slotAsyncInstall(int t)
{
QProcess installer;
switch(t)
switch (t)
{
case 0:
installer.start("pkexec", QStringList() << "ssinstall" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
installer.start("pkexec", QStringList() << "ssinstall"
<< "/tmp/spark-store/" + ui->label_filename->text().toUtf8() << "--delete-after-install");
break;
case 1:
installer.start("deepin-deb-installer", QStringList() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
break;
case 2:
installer.start("pkexec", QStringList() << "gdebi" << "-n" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
installer.start("pkexec", QStringList() << "gdebi"
<< "-n"
<< "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
break;
}
@@ -164,13 +194,15 @@ void DownloadItem::slotAsyncInstall(int t)
out = installer.readAllStandardOutput();
QStringList everyOut = out.split("\n");
QString tempOutput;
for (int i = 0; i < everyOut.size(); i++)
{
if(everyOut[i].left(2) == "E:")
tempOutput = everyOut[i];
if (everyOut[i].left(2) == tempOutput.contains("OMG-IT-GOES-WRONG"))
{
haveError = true;
}
if(everyOut[i].right(14) == "Not authorized")
if (tempOutput.contains("Not authorized"))
{
notRoot = true;
}
@@ -178,12 +210,12 @@ void DownloadItem::slotAsyncInstall(int t)
QProcess isInstall;
isInstall.start("dpkg", QStringList() << "-s" << pkgName);
isInstall.waitForFinished(180*1000); // 默认超时 3 分钟
isInstall.waitForFinished(180 * 1000); // 默认超时 3 分钟
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
if (error == 0 && !haveError)
{
ui->pushButton_install->hide();
Utils::sendNotification("spark-store",tr("Spark Store"),ui->label->text() + " " + tr("Installation complete."));
Utils::sendNotification("spark-store", tr("Spark Store"), ui->label->text() + " " + tr("Installation complete."));
ui->label_2->setText(tr("Finish"));
ui->label_2->setToolTip(tr("Finish"));
download = 3;
@@ -194,22 +226,26 @@ void DownloadItem::slotAsyncInstall(int t)
ui->pushButton_install->show();
ui->pushButton_install->setText(tr("Retry"));
download = 1;
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Error happened in dpkg progress , you can try it again."));
ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again"));
ui->label_2->setToolTip(tr("Error happened in dpkg progress , you can try it again"));
Utils::sendNotification("spark-store", tr("Spark Store"), tr("Error happened in dpkg progress , please check the install info or try to reinstall."));
ui->label_2->setText(tr("Error happened in dpkg progress , please check the install info or try to reinstall."));
ui->label_2->setToolTip(tr("Error happened in dpkg progress , please check the install info or try to reinstall."));
ui->pushButton_3->show();
}
if (notRoot)
{
Utils::sendNotification("spark-store",tr("Spark Store"),tr("dpkg progress had been abortedyou can retry installation."));
ui->label_2->setText(tr("dpkg progress had been abortedyou can retry installation"));
ui->label_2->setToolTip(tr("dpkg progress had been abortedyou can retry installation"));
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();
}
ui->widget_spinner->hide();
DownloadItem::isInstall = false;
emit finished();
installer.deleteLater();
isInstall.deleteLater();
emit finished(error == 0 && !haveError && !notRoot);
}

View File

@@ -34,7 +34,7 @@ public:
void setMax(qint64);
void setName(QString);
QString getName();
void readyInstall();
int readyInstall();
void setFileName(QString);
void seticon(const QPixmap);
@@ -62,7 +62,7 @@ private slots:
void slotAsyncInstall(int t);
signals:
void finished();
void finished(bool success);
};
#endif // DOWNLOADITEM_H

View File

@@ -1,20 +1,20 @@
#include "progressbutton.h"
#include "widgets/downloadlistwidget.h"
#include <QPainter>
#include <QPainterPath>
#include <QRect>
#include <QConicalGradient>
#include <QVariantAnimation>
#include <QMoveEvent>
#include <QSvgRenderer>
ProgressButton::ProgressButton(QWidget *parent)
: QWidget{parent}
{
// this->setWindowFlags(Qt::FramelessWindowHint);
// this->setAttribute(Qt::WA_TranslucentBackground, true);
setMinimumWidth(36);
setMinimumHeight(36);
setMinimumSize(36, 36);
svgPath = "";
backColor = Qt::transparent;
setMouseTracking(true);
connect(this, &ProgressButton::startProcessing, this, &ProgressButton::operationProcessing, Qt::QueuedConnection);
}
@@ -23,69 +23,6 @@ ProgressButton::~ProgressButton()
{
}
void ProgressButton::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
auto rect = event->rect();
if (buttonState == state::normal || buttonState == state::hover)
{
auto radiu = (rect.height() - 6) / 2;
painter.translate(rect.center());
painter.setPen(Qt::transparent);
painter.setBrush(QColor(buttonState == state::normal ? color : color.darker()));
// painter.drawEllipse(QPoint(0,0),radiu,radiu);
// radiu -= 3;
painter.setBrush(backColor);
painter.drawEllipse(QPoint(0, 0), radiu, radiu);
QSvgRenderer m_svgRender;
m_svgRender.load(svgPath);
m_svgRender.render(&painter, QRectF(-radiu / 2, -radiu / 2, radiu, radiu));
}
else if (buttonState == state::openProgress)
{
painter.translate(rect.center());
auto radiu = (rect.height() - 6) / 2 - 3;
painter.setBrush(backColor);
painter.setPen(QPen(backColor, 3));
painter.drawEllipse(QPoint(0, 0), radiu, radiu);
painter.setPen(QPen(backColor, 3));
QSvgRenderer m_svgRender;
m_svgRender.load(svgPath);
m_svgRender.render(&painter, QRectF(-radiu / 2, -radiu / 2, radiu, radiu));
QRect rect = QRect(-radiu, -radiu,
radiu * 2, radiu * 2);
painter.setPen(QPen(color.darker(100), 3));
auto angle = progress * 360 / 100;
painter.drawArc(rect.adjusted(-3, -3, 3, 3), 90 * 16, -static_cast<int>(angle * 16));
}
else if (buttonState == state::closeProgress)
{
auto radiu = (rect.height() - 6) / 2;
painter.translate(rect.center());
painter.setPen(Qt::transparent);
painter.setBrush(QColor(0, 0, 0, 63));
painter.drawEllipse(QPoint(0, 0), radiu, radiu);
radiu -= 3;
painter.setBrush(backColor);
painter.drawEllipse(QPoint(0, 0), radiu, radiu);
painter.setPen(QPen(color, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
painter.drawLine(QPoint(-radiu / 3, 0),
QPoint(-radiu / 5, radiu / 3));
painter.drawLine(QPoint(-radiu / 5, radiu / 3),
QPoint(radiu / 4, -radiu / 4));
}
}
void ProgressButton::setProgress(int progress)
{
buttonState = state::openProgress;
@@ -107,6 +44,11 @@ void ProgressButton::setProgress(int progress)
update();
}
void ProgressButton::setDownloadListWidget(DownloadListWidget *widget)
{
m_downloadListWidget = widget;
}
void ProgressButton::setIcon(QString svgPATH)
{
svgPath = svgPATH;
@@ -125,17 +67,15 @@ void ProgressButton::setColor(QColor color)
update();
}
void ProgressButton::leaveEvent(QEvent *event)
void ProgressButton::mousePressEvent(QMouseEvent *event)
{
if (buttonState == state::hover)
{
buttonState = state::normal;
update();
}
QWidget::leaveEvent(event);
m_mouseMoved = false;
m_isDownloadListWidgetVisible = m_downloadListWidget->isVisible();
m_downloadListWidget->hide();
QWidget::mousePressEvent(event);
}
void ProgressButton::mousePressEvent(QMouseEvent *event)
void ProgressButton::mouseReleaseEvent(QMouseEvent *event)
{
if (buttonState == state::hover || buttonState == state::normal)
{
@@ -146,8 +86,109 @@ void ProgressButton::mousePressEvent(QMouseEvent *event)
{
update();
}
emit clicked();
QWidget::mousePressEvent(event);
if (m_mouseMoved) {
return QWidget::mouseReleaseEvent(event);
}
if (m_isDownloadListWidgetVisible) {
m_downloadListWidget->hide();
} else {
QPoint pos(this->mapToGlobal(QPoint(0, 0)));
pos += QPoint(width() / 2 - m_downloadListWidget->width() / 2, height() + 5);
m_downloadListWidget->m_move(pos.x(), pos.y());
m_downloadListWidget->setWindowState(windowState() & Qt::WindowState::WindowActive);
m_downloadListWidget->activateWindow();
m_downloadListWidget->show();
m_downloadListWidget->raise();
}
m_isDownloadListWidgetVisible = m_downloadListWidget->isVisible();
QWidget::mouseReleaseEvent(event);
}
void ProgressButton::mouseDoubleClickEvent(QMouseEvent *event)
{
event->accept();
}
void ProgressButton::mouseMoveEvent(QMouseEvent *event)
{
m_mouseMoved = true;
QWidget::mouseMoveEvent(event);
}
void ProgressButton::leaveEvent(QEvent *event)
{
if (buttonState == state::hover)
{
buttonState = state::normal;
update();
}
QWidget::leaveEvent(event);
}
void ProgressButton::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
QRect rect = event->rect();
if (buttonState == state::normal || buttonState == state::hover)
{
int radius = (rect.height() - 6) / 2;
painter.translate(rect.center());
painter.setPen(Qt::transparent);
painter.setBrush(QColor(buttonState == state::normal ? color : color.darker()));
// painter.drawEllipse(QPoint(0, 0), radius, radius);
// radiu -= 3;
painter.setBrush(backColor);
painter.drawEllipse(QPoint(0, 0), radius, radius);
QSvgRenderer m_svgRender;
m_svgRender.load(svgPath);
m_svgRender.render(&painter, QRectF(-radius / 2, -radius / 2, radius, radius));
}
else if (buttonState == state::openProgress)
{
painter.translate(rect.center());
int radius = (rect.height() - 6) / 2 - 3;
painter.setBrush(backColor);
painter.setPen(QPen(backColor, 3));
painter.drawEllipse(QPoint(0, 0), radius, radius);
painter.setPen(QPen(backColor, 3));
QSvgRenderer m_svgRender;
m_svgRender.load(svgPath);
m_svgRender.render(&painter, QRectF(-radius / 2, -radius / 2, radius, radius));
QRect rect = QRect(-radius, -radius,
radius * 2, radius * 2);
painter.setPen(QPen(color.darker(100), 3));
qreal angle = progress * 360 / 100 * 1.0;
painter.drawArc(rect.adjusted(-3, -3, 3, 3), 90 * 16, -qIntCast(angle * 16));
}
else if (buttonState == state::closeProgress)
{
auto radius = (rect.height() - 6) / 2;
painter.translate(rect.center());
painter.setPen(Qt::transparent);
painter.setBrush(QColor(0, 0, 0, 63));
painter.drawEllipse(QPoint(0, 0), radius, radius);
radius -= 3;
painter.setBrush(backColor);
painter.drawEllipse(QPoint(0, 0), radius, radius);
painter.setPen(QPen(color, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
painter.drawLine(QPoint(-radius / 3, 0),
QPoint(-radius / 5, radius / 3));
painter.drawLine(QPoint(-radius / 5, radius / 3),
QPoint(radius / 4, -radius / 4));
}
QWidget::paintEvent(event);
}
void ProgressButton::operationProcessing()
@@ -156,16 +197,16 @@ void ProgressButton::operationProcessing()
const int RADIUS = 60;
WaterDrop::WaterDrop(QWidget *parent)
: QWidget(parent), m_waterDropAnimation(nullptr), m_animationRadius(0)
: QWidget(parent)
, m_waterDropAnimation(new QVariantAnimation(this))
, m_animationRadius(0)
{
this->setFixedSize(QSize(RADIUS * 2, RADIUS * 2));
// this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
// this->setAttribute(Qt::WA_TranslucentBackground);
// this->setAttribute(Qt::WA_DeleteOnClose);
m_waterDropAnimation = new QVariantAnimation(this);
// m_waterDropAnimation->setEasingCurve(QEasingCurve(static_cast<QEasingCurve::Type>(QRandomGenerator::global()->bounded(40))));
connect(m_waterDropAnimation, &QVariantAnimation::finished, this, &WaterDrop::deleteLater);
// m_waterDropAnimation->setEasingCurve(QEasingCurve(static_cast<QEasingCurve::Type>(QRandomGenerator::global()->bounded(40))));
}
// 把鼠标点击的点转换为圆心点坐标
@@ -191,8 +232,7 @@ void WaterDrop::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
QPen pen;
pen.setColor(QColor(0xffffff80));
QPen pen(QBrush(QColor("#ffff80")), 5.0);
pen.setWidth(5);
painter.setPen(pen);
painter.drawEllipse(event->rect().center(), m_animationRadius, m_animationRadius);
@@ -200,7 +240,7 @@ void WaterDrop::paintEvent(QPaintEvent *event)
QWidget::paintEvent(event);
}
void WaterDrop::onRadiusChanged(QVariant value)
void WaterDrop::onRadiusChanged(const QVariant &value)
{
m_animationRadius = value.toInt();
update();

View File

@@ -1,53 +1,62 @@
#ifndef PROGRESSBUTTON_H
#define PROGRESSBUTTON_H
#include <QtWidgets/QWidget>
#include <QPaintEvent>
#include <QWidget>
#include <QTimer>
#include <QTimerEvent>
#include<QColor>
#include <QList>
#include <QMouseEvent>
#include <QVariantAnimation>
class DownloadListWidget;
class ProgressButton : public QWidget
{
Q_OBJECT
public:
ProgressButton(QWidget *parent = nullptr);
explicit ProgressButton(QWidget *parent = nullptr);
~ProgressButton() override;
void setIcon(QString svgPATH);
void setBackgroundColor(QColor color);
void setColor(QColor color);
void setProgress(int progress);
~ProgressButton();
void setDownloadListWidget(DownloadListWidget *widget);
protected:
void mousePressEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
void mouseDoubleClickEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void leaveEvent(QEvent *event) override;
void paintEvent(QPaintEvent *event) override;
signals:
void startProcessing();
void clicked();
protected:
void paintEvent(QPaintEvent *event)override;
void leaveEvent(QEvent *event)override;
void mousePressEvent(QMouseEvent *event)override;
private slots:
void operationProcessing();
private:
enum class state
enum state
{
normal,
hover,
openProgress,
closeProgress,
recovery
}
buttonState{state::normal};
};
DownloadListWidget *m_downloadListWidget = nullptr;
state buttonState{state::normal};
QColor backColor;
QColor color;
QString svgPath;
int widthChangeValue{0};
void operationProcessing();
int progress{0};//处理百分比
bool m_mouseMoved = false;
bool m_isDownloadListWidgetVisible = true;
};
class WaterDrop : public QWidget
@@ -55,19 +64,19 @@ class WaterDrop : public QWidget
Q_OBJECT
public:
WaterDrop(QWidget *parent = Q_NULLPTR);
explicit WaterDrop(QWidget *parent = nullptr);
void show();
void move(const QPoint &point);
private:
protected:
void paintEvent(QPaintEvent *event);
void onRadiusChanged(QVariant value);
private slots:
void onRadiusChanged(const QVariant &value);
private:
class QVariantAnimation* m_waterDropAnimation;
QVariantAnimation *m_waterDropAnimation = nullptr;
int m_animationRadius;
};
#endif // PROGRESSBUTTON_H

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

@@ -1,8 +1,16 @@
#include "downloadlistwidget.h"
#include "ui_downloadlistwidget.h"
#include <QGraphicsOpacityEffect>
#include <QPropertyAnimation>
#include "widgets/common/downloaditem.h"
#include "backend/sparkapi.h"
#include "backend/downloadworker.h"
#include "utils/utils.h"
#include "application.h"
#include "mainwindow-dtk.h"
#include <QDesktopServices>
#include <QtConcurrent>
#include <QDebug>
DownloadListWidget::DownloadListWidget(QWidget *parent) : DBlurEffectWidget(parent),
ui(new Ui::DownloadListWidget)
{
@@ -56,40 +64,41 @@ DownloadListWidget::~DownloadListWidget()
{
downloadController->disconnect();
downloadController->stopDownload();
downloadController->deleteLater();
// 这里没有释放 downloadController,使用懒汉式单例
}
clearItem();
delete ui;
}
bool DownloadListWidget::isDownloadInProcess()
{
if (toDownload > 0)
{
return true;
}
return false;
}
void DownloadListWidget::clearItem()
{
// QListWidgetItem *item = nullptr;
// while ((item = ui->listWidget->takeItem(0)) != nullptr)
// {
// QWidget *card = ui->listWidget->itemWidget(item);
// if (card)
// {
// card->deleteLater();
// card = nullptr;
// }
// delete item;
// item = nullptr;
// }
// ui->listWidget->vScrollBar->scrollTop();
ui->listWidget->clear();
}
DownloadItem* DownloadListWidget::addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl)
{
if (fileName.isEmpty())
{
return nullptr;
}
urList.append(downloadurl);
allDownload += 1;
toDownload += 1;
DownloadItem *di = new DownloadItem;
connect(di, &DownloadItem::finished, this, &DownloadListWidget::slotInstallFinished, Qt::QueuedConnection);
dlist << downloadurl;
downloaditemlist << di;
di->setName(name);
@@ -127,13 +136,17 @@ void DownloadListWidget::startRequest(QUrl url, QString fileName)
isdownload = true;
downloaditemlist[allDownload - 1]->free = false;
if (downloadController)
// 使用懒汉式单例来存储downloadController
if (downloadController == nullptr)
{
downloadController = new DownloadController; // 并发下载,在第一次点击下载按钮的时候才会初始化
}
else
{
downloadController->disconnect();
downloadController->stopDownload();
downloadController->deleteLater();
}
downloadController = new DownloadController; // 并发下载,在点击下载按钮的时候才会初始化
connect(downloadController, &DownloadController::downloadProcess, this, &DownloadListWidget::updateDataReadProgress);
connect(downloadController, &DownloadController::downloadFinished, this, &DownloadListWidget::httpFinished);
// connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);});
@@ -141,30 +154,43 @@ void DownloadListWidget::startRequest(QUrl url, QString fileName)
downloadController->startDownload(url.toString());
}
/***************************************************************
* @brief 下载列表完成下载的回调函数
* @param
* @note 如果正在安装,则在新开的线程空间中等待上一个安装完
* @Sample usage:
**************************************************************/
void DownloadListWidget::httpFinished() // 完成下载
{
isdownload = false;
isBusy = false;
downloaditemlist[nowDownload - 1]->readyInstall();
downloaditemlist[nowDownload - 1]->free = true;
emit downloadFinished();
if (nowDownload < allDownload)
QtConcurrent::run([=]()
{
// 如果有排队则下载下一个
qDebug() << "切换下一个下载...";
nowDownload += 1;
while (downloaditemlist[nowDownload - 1]->close)
while (downloaditemlist[nowDownload - 1]->readyInstall() == -1) // 安装当前应用堵塞安装后面的下载suspend
{
QThread::msleep(500); // 休眠500ms减少CPU负担
continue;
}
downloaditemlist[nowDownload - 1]->free = true;
emit downloadFinished();
if (nowDownload < allDownload)
{
// 如果有排队则下载下一个
qDebug() << "Download: 切换下一个下载...";
nowDownload += 1;
if (nowDownload >= allDownload)
while (nowDownload <= allDownload && downloaditemlist[nowDownload - 1]->close)
{
nowDownload = allDownload;
return;
nowDownload += 1;
}
if (nowDownload <= allDownload)
{
QString fileName = downloaditemlist[nowDownload - 1]->getName();
startRequest(urList.at(nowDownload - 1), fileName);
}
}
QString fileName = downloaditemlist[nowDownload - 1]->getName();
startRequest(urList.at(nowDownload - 1), fileName);
}
});
}
void DownloadListWidget::updateDataReadProgress(QString speedInfo, qint64 bytesRead, qint64 totalBytes)
@@ -195,21 +221,7 @@ void DownloadListWidget::m_move(int x, int y)
move(x, y);
return;
}
bool DownloadListWidget::eventFilter(QObject *watched, QEvent *event)
{
if (Q_NULLPTR == watched)
{
return false;
}
if (QEvent::ActivationChange == event->type())
{
if (QApplication::activeWindow() != this)
{
this->close();
}
}
return QWidget::eventFilter(watched, event);
}
void DownloadListWidget::mouseMoveEvent(QMouseEvent *event)
{
setGeometry(m_rect);
@@ -219,3 +231,27 @@ void DownloadListWidget::on_pushButton_clicked()
{
QDesktopServices::openUrl(QUrl("file:///tmp/spark-store", QUrl::TolerantMode));
}
void DownloadListWidget::slotInstallFinished(bool success)
{
// NOTE: 仅在安装成功后判断是否需要退出后台
if (!success) {
qDebug() << "Download: install failed";
return;
}
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)
{
qDebug() << "Download: 后台安装结束,退出程序";
qApp->quit();
}
}
}

View File

@@ -1,20 +1,19 @@
#ifndef DOWNLOADLISTWIDGET_H
#define DOWNLOADLISTWIDGET_H
#include <DBlurEffectWidget>
#include <QWidget>
#include <QTimer>
#include <DBlurEffectWidget>
#include <QNetworkAccessManager>
#include <QDesktopServices>
#include "widgets/common/downloaditem.h"
#include "backend/sparkapi.h"
#include "backend/downloadworker.h"
#include "utils/utils.h"
DWIDGET_USE_NAMESPACE
namespace Ui {
class DownloadListWidget;
}
DWIDGET_USE_NAMESPACE
class DownloadItem;
class DownloadController;
class DownloadListWidget : public DBlurEffectWidget
{
Q_OBJECT
@@ -23,11 +22,17 @@ public:
DownloadItem *addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl);
int nowDownload = 0;
int allDownload = 0;
int toDownload = 0;
QList<DownloadItem *> getDIList();
QList<QUrl> getUrlList();
void m_move(int x, int y);
explicit DownloadListWidget(QWidget *parent = nullptr);
~DownloadListWidget();
~DownloadListWidget() override;
bool isDownloadInProcess();
protected:
void mouseMoveEvent(QMouseEvent *event) override;
private:
int isdownload = false;
@@ -48,13 +53,14 @@ private:
void clearItem();
QRect m_rect;
Ui::DownloadListWidget *ui;
private slots:
bool eventFilter(QObject *, QEvent *);
void mouseMoveEvent(QMouseEvent *event);
void on_pushButton_clicked();
signals:
void downloadFinished();
void downloadProgress(int i);
private slots:
void on_pushButton_clicked();
void slotInstallFinished(bool success);
};
#endif // DOWNLOADLISTWIDGET_H

View File

@@ -0,0 +1,14 @@
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,5 +1,5 @@
#!/bin/bash
#
#
# apt-fast v1.9
# Use this just like aptitude or apt-get for faster package downloading.
#
@@ -114,7 +114,11 @@ fi
# permissions.
# We need lock for non-root commands too, because we only have one download
# list file.
LCK_FILE="/tmp/apt-fast"
if [ "$IS_ACE_ENV" != "" ];then
LCK_FILE="/tmp/apt-fast-in-container.lock"
else
LCK_FILE="/tmp/apt-fast.lock"
fi
LCK_FD=99
# Set default package manager, APT cache, temporary download dir,
@@ -130,7 +134,11 @@ else
fi
# Currently not needed.
eval "$(apt-config shell LISTDIR Dir::State::lists/d)"
if [ "$IS_ACE_ENV" != "" ];then
DLLIST="/tmp/apt-fast-in-container.list"
else
DLLIST="/tmp/apt-fast.list"
fi
_MAXNUM=5
_MAXCONPERSRV=10
_SPLITCON=8
@@ -158,7 +166,7 @@ DOWNLOADBEFORE=
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'
_DOWNLOADER='aria2c --no-conf -c -j ${_MAXNUM} -x ${_MAXCONPERSRV} -s ${_SPLITCON} -i ${DLLIST} --min-split-size=${_MINSPLITSZ} --stream-piece-selector=${_PIECEALGO} --connect-timeout=60 --timeout=600 -m0'
# Load config file.
CONFFILE="/tmp/aptss-conf/apt-fast.conf"
@@ -207,17 +215,15 @@ 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"
msg "Other aptss is running. Waited $timer senconds..." "normal"
msg "有其他的aptss正在运行。已经等待了$timer秒" "normal"
}
# Check if a lock file exists.
if [ -f "$LCK_FILE.lock" ]; then
msg_already_running
exit 1
fi
#if [ -f "$LCK_FILE.lock" ]; then
# msg_already_running
# exit 1
#fi
# create the lock file and lock it, die on failure
@@ -225,10 +231,17 @@ _create_lock()
{
eval "exec $LCK_FD>\"$LCK_FILE.lock\""
trap "cleanup_aptfast; exit_cleanup_state" EXIT
# 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; }
timer=0
until $(flock -xn $LCK_FD);do
msg_already_running
sleep 1
let timer+=1
done
unset timer
}
# unlock and remove the lock file
@@ -301,8 +314,10 @@ get_mirrors(){
# 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")"
@@ -449,6 +464,7 @@ display_downloadfile(){
}
# Create and insert a PID number to lockfile.
_create_lock
# Make sure aria2c (in general first parameter from _DOWNLOADER) is available.
@@ -548,7 +564,6 @@ if [ "$option" == "install" ]; then
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.

View File

@@ -1,31 +1,61 @@
#!/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 "从服务器获取配置和镜像列表..."
echo "Getting server and mirror lists..."
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://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.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
fi
if [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_Packages" ] && [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages" ];then
echo "接收星火仓库软件信息中..."
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 "从服务器获取配置和镜像列表..."
echo "Getting server and mirror lists..."
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://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf"
curl --silent -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
chmod -R 755 /tmp/aptss-conf
sudo curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list"
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
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
#只更新星火源
@@ -41,17 +71,20 @@ if [ "$1" = "install" ] || [ "$1" = "upgrade" ] || [ "$1" = "full-upgrade" ] ;
###执行
bwrap --dev-bind / / \
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
${SS_APT_FAST} "$@" --allow-downgrades
${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"
exit $ret
fi
elif [ "$1" = "download" ];then
###执行
bwrap --dev-bind / / \
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
${SS_APT_FAST} "$@" --allow-downgrades
${SS_APT_FAST} "$@" --allow-downgrades -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
elif [ "$1" = "policy" ] || [ "$1" = "search" ];then
@@ -59,47 +92,35 @@ elif [ "$1" = "policy" ] || [ "$1" = "search" ];then
###执行
bwrap --dev-bind / / \
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
apt "$@"
apt "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
elif [ "$1" = "ssupdate" ];then
mkdir -p /tmp/aptss-conf/
echo "从服务器获取配置和镜像列表..."
echo "Getting server and mirror lists..."
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://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf"
curl --silent -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
chmod -R 755 /tmp/aptss-conf
sudo curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list"
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
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
sudo curl --progress-bar -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list"
mkdir -p /tmp/aptss-conf/
echo "从服务器获取配置和镜像列表..."
echo "Getting server and mirror lists..."
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://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf"
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自动补全用
bwrap --dev-bind / / \
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
apt "$@" -o APT::Get::List-Cleanup="0"
bwrap --dev-bind / / \
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
apt "$@" -o APT::Get::List-Cleanup="0" -o Dir::Cache="/etc/aptss/"
apt "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
else
bwrap --dev-bind / / \
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
apt "$@"
apt "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
fi

View File

@@ -0,0 +1,28 @@
#!/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

@@ -0,0 +1,5 @@
#!/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

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

124
tool/spark-dstore-patch Executable file
View File

@@ -0,0 +1,124 @@
#!/bin/bash
echo "----------------Running Spark DStore Patch----------------"
#!/bin/bash
enumAppInfoList() {
appInfoList=()
apps="/opt/apps"
list=$(ls $apps)
for appID in $list; do
appInfoList+=("$appID")
done
echo "${appInfoList[@]}"
}
linkDir() {
ensureTargetDir() {
targetFile=$1
t=$(dirname "$targetFile")
mkdir -p "$t"
}
source=$1
target=$2
sourceDir=$(dirname "$source")
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"
done
}
linkApp() {
appID=$1
appEntriesDir="/opt/apps/$appID/entries"
appLibsDir="/opt/apps/$appID/files/lib"
autoStartDir="$appEntriesDir/autostart"
if [ -d "$autoStartDir" ]; then
linkDir "$autoStartDir" "/etc/xdg/autostart"
fi
# link application
sysShareDir="/usr/share"
for folder in "$appEntriesDir/applications" "$appEntriesDir/icons" "$appEntriesDir/mime" "$appEntriesDir/glib-2.0" "$appEntriesDir/services" "$appEntriesDir/GConf" "$appEntriesDir/help" "$appEntriesDir/locale" "$appEntriesDir/fcitx"; do
if [ ! -d "$folder" ]; then
continue
fi
if [ "$folder" = "$appEntriesDir/polkit" ]; then
linkDir "$folder" "/usr/share/polkit-1"
elif [ "$folder" = "$appEntriesDir/fonts/conf" ]; then
linkDir "$folder" "/etc/fonts/conf.d"
else
linkDir "$folder" "$sysShareDir/${folder##*/}"
fi
done
}
# 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..."
fi
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 &
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 &
fi
echo "----------------Finished----------------"

View File

@@ -1,2 +0,0 @@
# Feadback 反馈脚本
使用 shc 加密, 需要使用 cc、gcc 编译。

49
tool/ss-feedback/sender-d Executable file
View File

@@ -0,0 +1,49 @@
#!/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"

View File

@@ -1,817 +0,0 @@
#if 0
shc Version 4.0.3, Generic Shell Script Compiler
GNU GPL Version 3 Md Jahidul Hamid <jahidulhamid@yahoo.com>
shc -v -r -f sender-d.sh
#endif
static char data [] =
#define pswd_z 256
#define pswd ((&data[15]))
"\073\237\114\151\003\324\064\061\057\100\342\310\062\343\346\075"
"\105\011\036\257\154\107\223\050\237\060\137\020\063\015\377\156"
"\162\230\321\117\026\333\267\322\335\062\077\075\261\355\172\366"
"\367\231\246\144\341\071\215\201\151\354\221\234\371\221\013\153"
"\052\334\273\101\267\162\023\224\244\123\322\125\100\115\114\067"
"\347\362\233\310\053\050\111\225\025\333\061\016\154\075\172\227"
"\031\065\330\320\250\354\145\114\077\067\242\200\204\357\267\154"
"\341\123\064\015\174\176\242\221\131\324\240\306\021\032\136\053"
"\117\066\373\367\043\141\104\142\230\347\342\035\326\232\212\270"
"\356\276\306\152\075\151\374\227\076\234\135\120\266\273\173\006"
"\362\167\376\025\330\103\170\161\052\133\217\001\366\031\272\344"
"\330\201\116\025\352\113\254\051\347\012\171\236\305\365\245\270"
"\154\243\316\105\346\106\267\021\242\106\023\230\137\316\174\067"
"\117\313\115\072\026\371\143\376\003\334\234\311\322\101\202\076"
"\345\120\204\313\227\073\335\071\202\360\321\341\276\116\031\016"
"\031\146\110\057\140\253\056\144\210\312\056\132\014\260\231\361"
"\000\036\275\230\131\232\321\333\213\243\275\112\361\327\130\360"
"\173\100\213\115\034\027\361\331\141\342\261\272\356\360\133\051"
"\217\247\222\222\173\307\304\253\007\247\163\072\212\132\052\005"
"\232\266\123\266\315\104\220"
#define date_z 1
#define date ((&data[311]))
"\375"
#define tst2_z 19
#define tst2 ((&data[312]))
"\031\242\273\246\041\336\076\145\246\300\036\051\047\366\106\356"
"\220\064\226"
#define shll_z 10
#define shll ((&data[331]))
"\142\312\022\213\061\052\357\062\161\266\353\321"
#define inlo_z 3
#define inlo ((&data[343]))
"\216\314\250"
#define msg1_z 65
#define msg1 ((&data[347]))
"\300\115\164\240\306\270\356\211\346\362\207\042\205\377\337\231"
"\113\016\267\021\330\324\374\242\242\336\361\041\143\054\223\355"
"\361\326\220\125\016\336\260\031\012\341\025\102\124\131\005\244"
"\234\133\315\262\013\375\340\025\227\352\060\034\236\222\347\136"
"\160\356\206\333\112\340\006\120\173\274\243\061"
#define chk1_z 22
#define chk1 ((&data[427]))
"\270\017\004\242\044\277\223\036\316\135\273\047\172\354\056\123"
"\141\200\041\375\363\101\127\122\242\373\336\067\346\143\370"
#define text_z 1869
#define text ((&data[549]))
"\071\315\146\114\156\047\322\111\162\262\117\303\055\014\146\137"
"\226\117\042\116\136\046\360\203\135\327\346\126\251\033\243\342"
"\351\012\056\127\062\000\240\244\263\360\147\341\374\316\101\222"
"\035\143\341\174\212\322\377\350\251\345\076\122\001\342\065\352"
"\355\143\101\037\144\342\304\030\323\053\372\320\372\073\142\030"
"\237\104\224\051\026\223\022\300\171\121\023\172\064\110\144\041"
"\131\377\367\164\123\316\261\141\353\367\301\016\274\016\120\047"
"\114\046\100\031\034\140\073\010\260\305\236\267\340\334\172\305"
"\021\246\221\332\021\311\021\154\112\347\316\242\317\135\332\301"
"\336\151\126\072\217\354\230\133\220\107\301\140\001\353\360\166"
"\213\363\372\027\233\047\323\276\201\201\216\023\154\320\161\313"
"\320\152\257\025\322\272\025\153\247\235\321\160\071\321\067\253"
"\241\156\046\022\220\271\031\066\331\215\206\354\323\250\277\275"
"\253\021\137\373\037\247\054\101\371\345\374\104\113\056\231\313"
"\256\361\253\230\051\271\176\340\337\333\050\341\362\056\167\255"
"\110\043\213\146\047\300\122\142\314\236\021\040\074\377\243\374"
"\373\242\311\017\027\025\325\213\232\031\105\104\013\052\212\072"
"\030\104\271\142\045\220\026\110\122\375\151\376\117\030\367\246"
"\217\256\245\325\077\346\276\327\045\113\166\374\164\175\046\022"
"\327\265\135\221\047\346\332\276\260\240\227\230\211\165\023\170"
"\316\154\240\317\001\217\073\173\212\106\115\070\141\315\324\116"
"\204\026\326\026\254\252\257\044\333\310\024\223\327\026\336\312"
"\151\363\273\204\220\242\016\226\317\314\156\124\240\122\232\124"
"\110\055\240\223\016\373\000\136\102\135\122\057\222\070\210\130"
"\012\234\324\361\047\201\232\126\155\021\270\134\303\377\110\250"
"\220\352\314\011\276\260\131\175\233\367\254\266\366\263\014\102"
"\237\066\305\270\257\117\034\316\147\136\133\373\051\333\006\077"
"\242\225\073\276\155\106\311\232\247\112\341\143\016\103\013\062"
"\214\247\315\302\241\024\076\037\135\126\145\227\342\323\061\230"
"\016\246\203\251\033\223\105\251\131\001\060\306\305\034\005\133"
"\161\366\173\132\343\314\135\205\273\260\170\145\370\262\153\321"
"\253\345\131\260\346\020\367\016\127\056\307\040\112\052\012\264"
"\247\057\273\157\016\275\270\226\173\033\071\042\072\142\170\134"
"\045\016\163\251\362\073\214\166\354\103\017\330\122\073\211\204"
"\200\004\003\176\324\343\275\017\056\341\055\071\173\175\144\147"
"\365\115\274\012\253\277\036\370\220\115\307\120\131\037\206\063"
"\355\032\324\265\064\114\014\217\113\302\125\301\033\100\357\042"
"\334\212\202\353\262\040\130\240\027\110\343\271\356\171\001\325"
"\167\062\056\061\210\316\075\142\261\005\116\142\230\367\343\135"
"\174\302\375\047\075\334\222\326\253\073\174\173\360\260\021\344"
"\331\315\146\233\057\007\314\231\256\113\221\021\126\173\045\315"
"\247\126\162\253\375\041\043\263\232\274\171\132\320\020\070\152"
"\013\224\371\045\350\270\077\251\145\063\357\171\036\245\125\315"
"\020\206\333\111\062\331\054\144\346\173\132\113\374\043\022\371"
"\311\101\043\300\337\334\367\145\030\023\207\043\253\042\227\302"
"\350\037\067\332\350\253\117\124\243\341\046\211\061\007\303\154"
"\022\210\064\112\311\170\123\071\332\266\205\151\265\300\343\237"
"\147\001\024\013\173\265\330\375\070\111\044\246\204\155\146\067"
"\036\060\065\251\005\354\200\115\136\076\034\040\335\033\043\221"
"\374\211\170\061\251\321\372\116\023\167\330\007\310\060\175\076"
"\064\242\253\131\116\074\275\022\133\016\203\214\254\115\002\325"
"\046\213\073\107\241\341\273\110\300\236\005\231\275\325\012\175"
"\365\056\370\275\132\330\041\035\166\130\240\013\162\041\163\140"
"\377\225\075\315\115\106\270\277\233\113\106\305\270\240\026\106"
"\317\325\264\324\126\337\214\155\366\331\372\200\306\272\163\333"
"\266\343\246\100\016\002\242\070\231\262\005\137\323\257\343\047"
"\301\206\266\341\302\046\266\167\227\276\125\165\027\044\353\035"
"\043\036\300\137\140\244\156\205\364\361\067\016\324\110\142\167"
"\125\216\360\003\023\161\060\263\356\073\050\173\151\371\005\027"
"\027\273\363\163\017\044\064\055\267\345\052\320\370\132\374\123"
"\020\263\163\176\037\145\346\003\275\377\154\040\166\363\224\240"
"\214\304\332\367\057\146\070\165\101\026\125\361\100\357\001\031"
"\305\363\242\164\125\067\077\063\134\271\250\242\243\022\031\114"
"\225\006\352\203\137\376\201\147\225\372\053\217\331\003\156\143"
"\332\361\315\167\027\232\307\331\314\071\025\271\047\031\126\310"
"\254\200\324\257\022\351\244\007\335\036\150\036\362\072\021\007"
"\140\155\073\242\063\071\162\205\121\257\302\056\155\071\306\057"
"\236\364\027\143\074\375\254\324\117\176\242\267\247\215\374\137"
"\003\123\113\247\064\347\123\321\123\044\211\351\253\045\226\324"
"\034\147\117\066\000\370\074\041\242\137\270\361\106\154\113\045"
"\275\172\101\331\157\137\222\202\136\241\075\132\267\033\325\113"
"\042\352\305\133\274\252\111\213\330\215\261\145\322\246\174\031"
"\267\347\275\247\251\030\255\106\116\362\117\277\024\135\356\172"
"\033\066\346\252\205\144\302\147\131\076\122\021\152\225\313\235"
"\202\066\043\300\027\147\263\001\201\341\121\051\310\140\317\333"
"\131\254\112\104\337\014\320\143\375\231\252\220\064\143\234\000"
"\017\304\317\113\131\055\324\177\367\224\230\264\132\311\261\152"
"\034\137\223\225\365\314\014\076\377\025\023\040\222\043\022\047"
"\332\363\144\102\015\314\010\256\206\065\310\103\337\001\326\206"
"\024\354\074\045\337\107\003\225\137\032\055\332\056\347\073\055"
"\267\115\315\204\061\310\304\007\065\267\107\176\066\216\011\014"
"\066\215\236\247\176\327\164\113\353\215\343\313\302\106\302\250"
"\077\220\165\207\015\144\336\311\065\351\311\163\104\104\267\262"
"\307\057\106\061\110\271\053\136\133\263\066\177\103\212\234\166"
"\271\130\043\076\352\006\066\017\220\207\275\024\235\356\377\344"
"\005\257\200\002\253\123\052\015\326\342\225\116\137\256\213\354"
"\251\026\237\347\166\014\121\075\306\022\247\276\265\017\375\161"
"\174\113\273\017\227\064\057\217\376\326\311\140\354\074\160\121"
"\346\370\327\255\277\376\062\301\033\111\042\016\233\162\101\303"
"\161\123\210\042\157\270\114\252\372\315\352\335\221\115\300\252"
"\163\344\140\324\157\261\256\232\173\171\024\250\006\342\320\340"
"\365\137\167\336\216\320\337\345\265\346\363\133\023\076\121\117"
"\002\021\237\112\206\043\012\370\033\045\133\151\303\330\001\222"
"\073\174\074\320\054\005\127\000\210\240\347\131\256\126\253\007"
"\342\137\135\162\075\344\340\210\333\057\141\042\223\055\006\174"
"\000\005\225\117\203\320\143\136\130\037\333\217\136\371\221\220"
"\052\071\173\374\261\213\235\241\071\260\057\226\360\212\211\346"
"\333\062\135\157\357\316\156\022\111\201\010\151\065\111\364\364"
"\137\005\161\265\354\014\003\204\117\112\075\042\357\165\042\354"
"\263\304\343\323\045\127\244\326\160\216\335\042\353\173\135\061"
"\354\306\013\252\265\013\046\173\100\050\146\372\303\210\171\200"
"\160\377\013\300\245\265\307\146\355\047\052\007\011\214\060\367"
"\177\327\043\302\111\263\123\276\107\220\316\207\024\142\070\325"
"\004\262\276\355\075\175\146\163\370\345\135\214\322\041\105\047"
"\371\073\016\023\064\231\203\005\246\204\203\306\340\002\160\365"
"\315\022\302\170\340\356\151\323\344\242\134\046\134\162\227\117"
"\262\240\062\234\324\135\326\242\341\066\232\314\200\331\124\077"
"\201\245\227\252\073\356\252\367\277\232\331\005\324\350\032\261"
"\035\246\325\177\334\121\146\316\041\043\352\253\373\043\035\234"
"\231\321\046\171\221\105\216\272\025\321\042\222\007\351\363\232"
"\006\016\231\137\124\215\132\071\166\042\065\127\337\253\307\021"
"\337\364\070\261\112\201\310\242\335\104\353\055\277\322\232\240"
"\007\374\034\322\312\373\031\130\204\036\362\373\142\043\273\315"
"\216\373\273\260\310\111\070\031\207\101\325\157\110\142\216\357"
"\172\023\345\067\105\007\375\023\053\256\121\163\255\323\257\132"
"\164\360\307\234\106\130\275\217\211\327\300\322\261\206\364\326"
"\021\255\077\302\202\027\207\370\263\313\333\070\010\115\377\271"
"\173\302\243\224\126\201\255\356\261\176\213\135\216\054\237\371"
"\040\174\342\367\323\053\341\031\333\211\214\042\343\254\122\252"
"\325\326\263\326\325\063\065\362\114\161\314\151\116\237\160\073"
"\321\025\336\117\020\055\371\021\371\104\001\072\204\064\227\333"
"\034\374\123\265\343\026\372\207\264\033\065\316\147\211\142\366"
"\371\257\120\162\107\234\134\010\035\212\241\132\317\254\246\101"
"\020\211\005\051\134\061\043\054\054\137\217\104\376\323\330\050"
"\352\154\072\253\345\214\276\137\300\006\304\341\262\152\043\303"
"\364\051\354\120\132\017\175\207\156\014\313\155\337\244\225\312"
"\020\320\165\366\134\063\126\034\072\032\376\355\205\041\260\171"
"\113\234\312\245\254\107\055\033\123\370\210\063\235\036\375\256"
"\356\163\245\113\247\373\150\341\025\146\316\233\210\177\024\323"
"\034\336\171\310\046\246\343\171\237\153\255\075\211\252\353\170"
"\036\220\304\305\214\054\246\242\222\165\075\033\365\122\357\021"
"\061\150\331\127\017\275\321\257\051\176"
#define chk2_z 19
#define chk2 ((&data[2562]))
"\330\053\107\261\150\156\021\060\277\165\015\167\176\171\251\302"
"\276\160\207\325\012\334"
#define lsto_z 1
#define lsto ((&data[2581]))
"\010"
#define xecc_z 15
#define xecc ((&data[2582]))
"\005\040\327\254\114\361\156\300\024\244\110\337\050\143\126\227"
"\257"
#define tst1_z 22
#define tst1 ((&data[2603]))
"\036\047\271\057\207\076\001\326\201\264\356\151\036\164\071\111"
"\027\304\031\244\017\252\223\354\153\051\130\042\011\260"
#define msg2_z 19
#define msg2 ((&data[2632]))
"\341\357\377\335\143\002\251\076\361\005\267\075\204\313\320\034"
"\012\023\243\361\261\374\315\242"
#define rlax_z 1
#define rlax ((&data[2653]))
"\121"
#define opts_z 1
#define opts ((&data[2654]))
"\241"/* End of data[] */;
#define hide_z 4096
#define SETUID 0 /* Define as 1 to call setuid(0) at start of script */
#define DEBUGEXEC 0 /* Define as 1 to debug execvp calls */
#define TRACEABLE 1 /* Define as 1 to enable ptrace the executable */
#define HARDENING 0 /* Define as 1 to disable ptrace/dump the executable */
#define BUSYBOXON 0 /* Define as 1 to enable work with busybox */
#if HARDENING
static const char * shc_x[] = {
"/*",
" * Copyright 2019 - Intika <intika@librefox.org>",
" * Replace ******** with secret read from fd 21",
" * Also change arguments location of sub commands (sh script commands)",
" * gcc -Wall -fpic -shared -o shc_secret.so shc_secret.c -ldl",
" */",
"",
"#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */",
"#define PLACEHOLDER \"********\"",
"#include <dlfcn.h>",
"#include <stdlib.h>",
"#include <string.h>",
"#include <unistd.h>",
"#include <stdio.h>",
"#include <signal.h>",
"",
"static char secret[128000]; //max size",
"typedef int (*pfi)(int, char **, char **);",
"static pfi real_main;",
"",
"// copy argv to new location",
"char **copyargs(int argc, char** argv){",
" char **newargv = malloc((argc+1)*sizeof(*argv));",
" char *from,*to;",
" int i,len;",
"",
" for(i = 0; i<argc; i++){",
" from = argv[i];",
" len = strlen(from)+1;",
" to = malloc(len);",
" memcpy(to,from,len);",
" // zap old argv space",
" memset(from,'\\0',len);",
" newargv[i] = to;",
" argv[i] = 0;",
" }",
" newargv[argc] = 0;",
" return newargv;",
"}",
"",
"static int mymain(int argc, char** argv, char** env) {",
" //fprintf(stderr, \"Inject main argc = %d\\n\", argc);",
" return real_main(argc, copyargs(argc,argv), env);",
"}",
"",
"int __libc_start_main(int (*main) (int, char**, char**),",
" int argc,",
" char **argv,",
" void (*init) (void),",
" void (*fini)(void),",
" void (*rtld_fini)(void),",
" void (*stack_end)){",
" static int (*real___libc_start_main)() = NULL;",
" int n;",
"",
" if (!real___libc_start_main) {",
" real___libc_start_main = dlsym(RTLD_NEXT, \"__libc_start_main\");",
" if (!real___libc_start_main) abort();",
" }",
"",
" n = read(21, secret, sizeof(secret));",
" if (n > 0) {",
" int i;",
"",
" if (secret[n - 1] == '\\n') secret[--n] = '\\0';",
" for (i = 1; i < argc; i++)",
" if (strcmp(argv[i], PLACEHOLDER) == 0)",
" argv[i] = secret;",
" }",
"",
" real_main = main;",
"",
" return real___libc_start_main(mymain, argc, argv, init, fini, rtld_fini, stack_end);",
"}",
"",
0};
#endif /* HARDENING */
/* rtc.c */
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
/* 'Alleged RC4' */
static unsigned char stte[256], indx, jndx, kndx;
/*
* Reset arc4 stte.
*/
void stte_0(void)
{
indx = jndx = kndx = 0;
do {
stte[indx] = indx;
} while (++indx);
}
/*
* Set key. Can be used more than once.
*/
void key(void * str, int len)
{
unsigned char tmp, * ptr = (unsigned char *)str;
while (len > 0) {
do {
tmp = stte[indx];
kndx += tmp;
kndx += ptr[(int)indx % len];
stte[indx] = stte[kndx];
stte[kndx] = tmp;
} while (++indx);
ptr += 256;
len -= 256;
}
}
/*
* Crypt data.
*/
void arc4(void * str, int len)
{
unsigned char tmp, * ptr = (unsigned char *)str;
while (len > 0) {
indx++;
tmp = stte[indx];
jndx += tmp;
stte[indx] = stte[jndx];
stte[jndx] = tmp;
tmp += stte[indx];
*ptr ^= stte[tmp];
ptr++;
len--;
}
}
/* End of ARC4 */
#if HARDENING
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/prctl.h>
#define PR_SET_PTRACER 0x59616d61
/* Seccomp Sandboxing Init */
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/prctl.h>
#include <sys/syscall.h>
#include <sys/socket.h>
#include <linux/filter.h>
#include <linux/seccomp.h>
#include <linux/audit.h>
#define ArchField offsetof(struct seccomp_data, arch)
#define Allow(syscall) \
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_##syscall, 0, 1), \
BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW)
struct sock_filter filter[] = {
/* validate arch */
BPF_STMT(BPF_LD+BPF_W+BPF_ABS, ArchField),
BPF_JUMP( BPF_JMP+BPF_JEQ+BPF_K, AUDIT_ARCH_X86_64, 1, 0),
BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL),
/* load syscall */
BPF_STMT(BPF_LD+BPF_W+BPF_ABS, offsetof(struct seccomp_data, nr)),
/* list of allowed syscalls */
Allow(exit_group), /* exits a process */
Allow(brk), /* for malloc(), inside libc */
Allow(mmap), /* also for malloc() */
Allow(munmap), /* for free(), inside libc */
/* and if we don't match above, die */
BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL),
};
struct sock_fprog filterprog = {
.len = sizeof(filter)/sizeof(filter[0]),
.filter = filter
};
/* Seccomp Sandboxing - Set up the restricted environment */
void seccomp_hardening() {
if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) {
perror("Could not start seccomp:");
exit(1);
}
if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &filterprog) == -1) {
perror("Could not start seccomp:");
exit(1);
}
}
/* End Seccomp Sandboxing Init */
void shc_x_file() {
FILE *fp;
int line = 0;
if ((fp = fopen("/tmp/shc_x.c", "w")) == NULL ) {exit(1); exit(1);}
for (line = 0; shc_x[line]; line++) fprintf(fp, "%s\n", shc_x[line]);
fflush(fp);fclose(fp);
}
int make() {
char * cc, * cflags, * ldflags;
char cmd[4096];
cc = getenv("CC");
if (!cc) cc = "cc";
sprintf(cmd, "%s %s -o %s %s", cc, "-Wall -fpic -shared", "/tmp/shc_x.so", "/tmp/shc_x.c -ldl");
if (system(cmd)) {remove("/tmp/shc_x.c"); return -1;}
remove("/tmp/shc_x.c"); return 0;
}
void arc4_hardrun(void * str, int len) {
//Decode locally
char tmp2[len];
char tmp3[len+1024];
memcpy(tmp2, str, len);
unsigned char tmp, * ptr = (unsigned char *)tmp2;
int lentmp = len;
int pid, status;
pid = fork();
shc_x_file();
if (make()) {exit(1);}
setenv("LD_PRELOAD","/tmp/shc_x.so",1);
if(pid==0) {
//Start tracing to protect from dump & trace
if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) {
kill(getpid(), SIGKILL);
_exit(1);
}
//Decode Bash
while (len > 0) {
indx++;
tmp = stte[indx];
jndx += tmp;
stte[indx] = stte[jndx];
stte[jndx] = tmp;
tmp += stte[indx];
*ptr ^= stte[tmp];
ptr++;
len--;
}
//Do the magic
sprintf(tmp3, "%s %s", "'********' 21<<<", tmp2);
//Exec bash script //fork execl with 'sh -c'
system(tmp2);
//Empty script variable
memcpy(tmp2, str, lentmp);
//Clean temp
remove("/tmp/shc_x.so");
//Sinal to detach ptrace
ptrace(PTRACE_DETACH, 0, 0, 0);
exit(0);
}
else {wait(&status);}
/* Seccomp Sandboxing - Start */
seccomp_hardening();
exit(0);
}
#endif /* HARDENING */
/*
* Key with file invariants.
*/
int key_with_file(char * file)
{
struct stat statf[1];
struct stat control[1];
if (stat(file, statf) < 0)
return -1;
/* Turn on stable fields */
memset(control, 0, sizeof(control));
control->st_ino = statf->st_ino;
control->st_dev = statf->st_dev;
control->st_rdev = statf->st_rdev;
control->st_uid = statf->st_uid;
control->st_gid = statf->st_gid;
control->st_size = statf->st_size;
control->st_mtime = statf->st_mtime;
control->st_ctime = statf->st_ctime;
key(control, sizeof(control));
return 0;
}
#if DEBUGEXEC
void debugexec(char * sh11, int argc, char ** argv)
{
int i;
fprintf(stderr, "shll=%s\n", sh11 ? sh11 : "<null>");
fprintf(stderr, "argc=%d\n", argc);
if (!argv) {
fprintf(stderr, "argv=<null>\n");
} else {
for (i = 0; i <= argc ; i++)
fprintf(stderr, "argv[%d]=%.60s\n", i, argv[i] ? argv[i] : "<null>");
}
}
#endif /* DEBUGEXEC */
void rmarg(char ** argv, char * arg)
{
for (; argv && *argv && *argv != arg; argv++);
for (; argv && *argv; argv++)
*argv = argv[1];
}
void chkenv_end(void);
int chkenv(int argc)
{
char buff[512];
unsigned long mask, m;
int l, a, c;
char * string;
extern char ** environ;
mask = (unsigned long)getpid();
stte_0();
key(&chkenv, (void*)&chkenv_end - (void*)&chkenv);
key(&data, sizeof(data));
key(&mask, sizeof(mask));
arc4(&mask, sizeof(mask));
sprintf(buff, "x%lx", mask);
string = getenv(buff);
#if DEBUGEXEC
fprintf(stderr, "getenv(%s)=%s\n", buff, string ? string : "<null>");
#endif
l = strlen(buff);
if (!string) {
/* 1st */
sprintf(&buff[l], "=%lu %d", mask, argc);
putenv(strdup(buff));
return 0;
}
c = sscanf(string, "%lu %d%c", &m, &a, buff);
if (c == 2 && m == mask) {
/* 3rd */
rmarg(environ, &string[-l - 1]);
return 1 + (argc - a);
}
return -1;
}
void chkenv_end(void){}
#if HARDENING
static void gets_process_name(const pid_t pid, char * name) {
char procfile[BUFSIZ];
sprintf(procfile, "/proc/%d/cmdline", pid);
FILE* f = fopen(procfile, "r");
if (f) {
size_t size;
size = fread(name, sizeof (char), sizeof (procfile), f);
if (size > 0) {
if ('\n' == name[size - 1])
name[size - 1] = '\0';
}
fclose(f);
}
}
void hardening() {
prctl(PR_SET_DUMPABLE, 0);
prctl(PR_SET_PTRACER, -1);
int pid = getppid();
char name[256] = {0};
gets_process_name(pid, name);
if ( (strcmp(name, "bash") != 0)
&& (strcmp(name, "/bin/bash") != 0)
&& (strcmp(name, "sh") != 0)
&& (strcmp(name, "/bin/sh") != 0)
&& (strcmp(name, "sudo") != 0)
&& (strcmp(name, "/bin/sudo") != 0)
&& (strcmp(name, "/usr/bin/sudo") != 0)
&& (strcmp(name, "gksudo") != 0)
&& (strcmp(name, "/bin/gksudo") != 0)
&& (strcmp(name, "/usr/bin/gksudo") != 0)
&& (strcmp(name, "kdesu") != 0)
&& (strcmp(name, "/bin/kdesu") != 0)
&& (strcmp(name, "/usr/bin/kdesu") != 0)
)
{
printf("Operation not permitted\n");
kill(getpid(), SIGKILL);
exit(1);
}
}
#endif /* HARDENING */
#if !TRACEABLE
#define _LINUX_SOURCE_COMPAT
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#if !defined(PT_ATTACHEXC) /* New replacement for PT_ATTACH */
#if !defined(PTRACE_ATTACH) && defined(PT_ATTACH)
#define PT_ATTACHEXC PT_ATTACH
#elif defined(PTRACE_ATTACH)
#define PT_ATTACHEXC PTRACE_ATTACH
#endif
#endif
void untraceable(char * argv0)
{
char proc[80];
int pid, mine;
switch(pid = fork()) {
case 0:
pid = getppid();
/* For problematic SunOS ptrace */
#if defined(__FreeBSD__)
sprintf(proc, "/proc/%d/mem", (int)pid);
#else
sprintf(proc, "/proc/%d/as", (int)pid);
#endif
close(0);
mine = !open(proc, O_RDWR|O_EXCL);
if (!mine && errno != EBUSY)
mine = !ptrace(PT_ATTACHEXC, pid, 0, 0);
if (mine) {
kill(pid, SIGCONT);
} else {
perror(argv0);
kill(pid, SIGKILL);
}
_exit(mine);
case -1:
break;
default:
if (pid == waitpid(pid, 0, 0))
return;
}
perror(argv0);
_exit(1);
}
#endif /* !TRACEABLE */
char * xsh(int argc, char ** argv)
{
char * scrpt;
int ret, i, j;
char ** varg;
char * me = argv[0];
if (me == NULL) { me = getenv("_"); }
if (me == 0) { fprintf(stderr, "E: neither argv[0] nor $_ works."); exit(1); }
ret = chkenv(argc);
stte_0();
key(pswd, pswd_z);
arc4(msg1, msg1_z);
arc4(date, date_z);
if (date[0] && (atoll(date)<time(NULL)))
return msg1;
arc4(shll, shll_z);
arc4(inlo, inlo_z);
arc4(xecc, xecc_z);
arc4(lsto, lsto_z);
arc4(tst1, tst1_z);
key(tst1, tst1_z);
arc4(chk1, chk1_z);
if ((chk1_z != tst1_z) || memcmp(tst1, chk1, tst1_z))
return tst1;
arc4(msg2, msg2_z);
if (ret < 0)
return msg2;
varg = (char **)calloc(argc + 10, sizeof(char *));
if (!varg)
return 0;
if (ret) {
arc4(rlax, rlax_z);
if (!rlax[0] && key_with_file(shll))
return shll;
arc4(opts, opts_z);
#if HARDENING
arc4_hardrun(text, text_z);
exit(0);
/* Seccomp Sandboxing - Start */
seccomp_hardening();
#endif
arc4(text, text_z);
arc4(tst2, tst2_z);
key(tst2, tst2_z);
arc4(chk2, chk2_z);
if ((chk2_z != tst2_z) || memcmp(tst2, chk2, tst2_z))
return tst2;
/* Prepend hide_z spaces to script text to hide it. */
scrpt = malloc(hide_z + text_z);
if (!scrpt)
return 0;
memset(scrpt, (int) ' ', hide_z);
memcpy(&scrpt[hide_z], text, text_z);
} else { /* Reexecute */
if (*xecc) {
scrpt = malloc(512);
if (!scrpt)
return 0;
sprintf(scrpt, xecc, me);
} else {
scrpt = me;
}
}
j = 0;
#if BUSYBOXON
varg[j++] = "busybox";
varg[j++] = "sh";
#else
varg[j++] = argv[0]; /* My own name at execution */
#endif
if (ret && *opts)
varg[j++] = opts; /* Options on 1st line of code */
if (*inlo)
varg[j++] = inlo; /* Option introducing inline code */
varg[j++] = scrpt; /* The script itself */
if (*lsto)
varg[j++] = lsto; /* Option meaning last option */
i = (ret > 1) ? ret : 0; /* Args numbering correction */
while (i < argc)
varg[j++] = argv[i++]; /* Main run-time arguments */
varg[j] = 0; /* NULL terminated array */
#if DEBUGEXEC
debugexec(shll, j, varg);
#endif
execvp(shll, varg);
return shll;
}
int main(int argc, char ** argv)
{
#if SETUID
setuid(0);
#endif
#if DEBUGEXEC
debugexec("main", argc, argv);
#endif
#if HARDENING
hardening();
#endif
#if !TRACEABLE
untraceable(argv[0]);
#endif
argv[1] = xsh(argc, argv);
fprintf(stderr, "%s%s%s: %s\n", argv[0],
errno ? ": " : "",
errno ? strerror(errno) : "",
argv[1] ? argv[1] : "<null>"
);
return 1;
}

View File

@@ -1,44 +1,141 @@
#!/bin/bash
echo "Spark Store Audit script.星火商店审核脚本"
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() {
local user=$(who | awk '{print $1}' | head -n 1)
local uid=$(id -u "$user")
sudo -u "$user" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/"$uid"/bus pkexec "$@"
}
function create_desktop_file() {
local user=$(who | awk '{print $1}' | head -n 1)
if [ -e $(sudo -u "$user" xdg-user-dir)/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop ];then
echo "It is configured that do not create desktop file. Give up"
else
exec_create_desktop_file
fi
}
function exec_create_desktop_file() {
local user=$(who | awk '{print $1}' | head -n 1)
for desktop_file_path in $(dpkg -L "$package_name" |grep /usr/share/applications/ | awk '/\.desktop$/ {print}'); do
if [ "$(cat $desktop_file_path | grep NoDisplay=true)" = "" ];then
echo $desktop_file_path is checked and will be installed to desktop
sudo -u "$user" cp "$desktop_file_path" "$(sudo -u "$user" xdg-user-dir DESKTOP)/"
fi
done
for desktop_file_path in $(dpkg -L "$package_name" |grep /opt/apps/$package_name/entries/applications | awk '/\.desktop$/ {print}'); do
if [ "$(cat $desktop_file_path | grep NoDisplay=true)" = "" ];then
echo $desktop_file_path is checked and will be installed to desktop
sudo -u "$user" cp "$desktop_file_path" "$(sudo -u "$user" xdg-user-dir DESKTOP)/"
fi
done
#################检测文件是否存在
if [ $# -eq 0 ];then
echo "没有接收到参数,退出"
echo "用法:$0 deb路径"
exit
}
function zenity() {
local user=$(who | awk '{print $1}' | head -n 1)
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_CHECKED=$(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 "文件不存在"
exit 1
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 "请使用root启动ssaudit"
exit 1
if [ "$(id -u)" != "0" ]; then
echo "${TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT}"
echo "OMG-IT-GOES-WRONG"
exit 1
fi
###
DEBPATH=$(realpath "$1")
DEBPATH=`realpath $1`
echo ----------------------------------------------------------------------------------
try_run_output=$(aptss --dry-run install $DEBPATH)
try_run_ret="$?"
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 "Package manager quit with exit code.Here is the log"
echo "包管理器以错误代码退出.日志如下"
echo
echo -e "${try_run_output}"
exit "$try_run_ret"
fi
dpkg -i "$DEBPATH" || aptss install -yf
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
if [ "$?" = "0" ] && [ "$2" = "--delete-after-install" ]; then
if dpkg -s "$package_name" >/dev/null 2>&1; then
echo "软件包已安装:$package_name"
create_desktop_file
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"
create_desktop_file
else
echo "软件包未安装:$package_name"
echo "安装异常!抛出错误"
echo "OMG-IT-GOES-WRONG"
fi
fi

View File

@@ -3,104 +3,156 @@
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.星火商店安装脚本"
echo "Spark Store Install script. 星火商店安装脚本"
function pkexec_as_current_user() {
local user=$(who | awk '{print $1}' | head -n 1)
local uid=$(id -u "$user")
sudo -u "$user" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/"$uid"/bus pkexec "$@"
}
function create_desktop_file() {
local user=$(who | awk '{print $1}' | head -n 1)
if [ -e $(sudo -u "$user" xdg-user-dir)/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop ];then
echo "It is configured that do not create desktop file. Give up"
else
exec_create_desktop_file
fi
}
function exec_create_desktop_file() {
local user=$(who | awk '{print $1}' | head -n 1)
for desktop_file_path in $(dpkg -L "$package_name" |grep /usr/share/applications/ | awk '/\.desktop$/ {print}'); do
if [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "true" ] || [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "True" ];then
echo $desktop_file_path is checked and will be installed to desktop
sudo -u "$user" cp "$desktop_file_path" "$(sudo -u "$user" xdg-user-dir DESKTOP)/"
fi
done
for desktop_file_path in $(dpkg -L "$package_name" |grep /opt/apps/$package_name/entries/applications | awk '/\.desktop$/ {print}'); do
if [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "true" ] || [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "True" ];then
echo $desktop_file_path is checked and will be installed to desktop
sudo -u "$user" cp "$desktop_file_path" "$(sudo -u "$user" xdg-user-dir DESKTOP)/"
fi
done
#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 zenity() {
local user=$(who | awk '{print $1}' | head -n 1)
local uid=$(id -u "$user")
sudo -u "$user" DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/"$uid"/bus zenity "$@"
}
#################检测文件是否存在
if [ $# -eq 0 ];then
echo "没有接收到参数,退出"
echo "用法:$0 deb路径"
exit
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_CHECKED=$(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}"
if [ ! -f "$1" ]; then
echo "${TRANSHELL_CONTENT_FILE_NOT_EXIST}"
echo "OMG-IT-GOES-WRONG"
exit 1
fi
if [ "$(id -u)" != "0" ]; then
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_CHECKED" ]; then
echo "尝试更新仓库信息重新校验"
aptss ssupdate
hash_check "$DEBPATH"
if [ -z "$IS_SHA512SUM_CHECKED" ]; then
echo -e "$TRANSHELL_CONTENT_HASH_CHECK_FAILED"
zenity --info --icon-name=spark-store --height 270 --width 500 --text "$TRANSHELL_CONTENT_HASH_CHECK_FAILED"
echo "OMG-IT-GOES-WRONG"
exit 1
fi
fi
if [ "$(id -u)" != "0" ];then
#############################无root权限时
echo "${TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT}"
exit 1
if [ ! -z "$IS_SHA512SUM_CHECKED" ]; 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
if [ "$?" = "0" ] && [ "$2" = "--delete-after-install" ]; then
if dpkg -s "$package_name" >/dev/null 2>&1; then
echo "软件包已安装:$package_name"
create_desktop_file
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"
create_desktop_file
else
echo "软件包未安装:$package_name"
echo "安装异常!抛出错误"
echo "OMG-IT-GOES-WRONG"
fi
fi
fi
###
DEBPATH=`realpath $1`
if [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_Packages" ] && [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages" ];then
echo "接收星火仓库软件信息中..."
aptss ssupdate
fi
### 选择包信息位置
if [ -e "/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages" ];then
PACKAGES_DATA_PATH="/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages"
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是单目录仓库配置"
else
PACKAGES_DATA_PATH="/var/lib/apt/lists/d.store.deepinos.org.cn_Packages"
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是根目录仓库配置"
fi
echo "正在计算hash并与星火仓库匹配..."
DEB_MD5SUM=`md5sum "$DEBPATH" | cut -c -32`
IS_MD5SUM_CHECKD=`cat $PACKAGES_DATA_PATH | grep $DEB_MD5SUM`
if [ ! -z "$IS_MD5SUM_CHECKD" ];then
echo "校验成功,开始安装"
echo ----------------------------------------------------------------------------------
try_run_output=$(aptss --dry-run install $DEBPATH)
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
dpkg -i "$DEBPATH" || aptss install -yf
else
zenity --info --icon-name=spark-store --height 270 --width 500 --text "${TRANSHELL_CONTENT_HASH_CHECK_FAILED}"
echo -e ${TRANSHELL_CONTENT_HASH_CHECK_FAILED}
fi

View File

@@ -12,7 +12,7 @@ case $1 in
;;
upgradable-list)
output=$(env LANGUAGE=en_US bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt list --upgradable -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="/dev/null" -o APT::Get::List-Cleanup="0" | awk NR\>1)
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'
@@ -33,18 +33,32 @@ case $1 in
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 ]
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
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
;;

View File

@@ -3,7 +3,46 @@
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug
function get_name_from_desktop_file() {
local app_name_in_desktop
local name_orig
local name_i18n
local package_name
package_name=$1
for desktop_file_path in $(dpkg -L "$package_name" |grep /usr/share/applications/ | awk '/\.desktop$/ {print}'); do
if [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "true" ] || [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "True" ];then
continue
else
name_orig=$(grep -m 1 '^Name=' "$desktop_file_path" | cut -d '=' -f 2)
name_i18n=$(grep -m 1 "^Name\[${LANGUAGE}\]\=" "$desktop_file_path" | cut -d '=' -f 2)
if [ -z "$name_i18n" ] ;then
app_name_in_desktop=$name_orig
else
app_name_in_desktop=$name_i18n
fi
fi
done
for desktop_file_path in $(dpkg -L "$package_name" |grep /opt/apps/$package_name/entries/applications | awk '/\.desktop$/ {print}'); do
if [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "true" ] || [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "True" ];then
continue
else
name_orig=$(grep -m 1 '^Name=' "$desktop_file_path" | cut -d '=' -f 2)
name_i18n=$(grep -m 1 "^Name\[${LANGUAGE}\]\=" "$desktop_file_path" | cut -d '=' -f 2)
if [ -z "$name_i18n" ] ;then
app_name_in_desktop=$name_orig
else
app_name_in_desktop=$name_i18n
fi
fi
done
if [ -z "$app_name_in_desktop" ] ;then
app_name_in_desktop=${package_name}
fi
echo ${app_name_in_desktop}
}
touch /tmp/spark-store/upgradeStatus.txt
# 执行 apt update
@@ -30,7 +69,7 @@ else
IFS_OLD="$IFS"
IFS=$'\n'
PKG_UPGRADE_LIST=`for line in $PKG_LIST ; do
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}')
@@ -39,20 +78,23 @@ else
if [ $? -eq 0 ] ; then
continue
fi
APP_NAME=$(get_name_from_desktop_file $PKG_NAME)
#### 检测是否是 hold 状态
PKG_STA=$(dpkg-query -W -f='${db:Status-Want}' $PKG_NAME)
if [ "$PKG_STA" != "hold" ] ; then
echo "true"
echo "$PKG_NAME"
echo "$APP_NAME"
echo "$PKG_NEW_VER"
echo "$PKG_CUR_VER"
echo "$PKG_NAME"
else
echo "false"
echo "$PKG_NAME${TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD}"
echo "$APP_NAME${TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD}"
echo "$PKG_NEW_VER"
echo "$PKG_CUR_VER"
echo "$PKG_NAME"
fi
done`
done)
### 还原分隔符
IFS="$IFS_OLD"
@@ -61,13 +103,14 @@ done`
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)
PKG_UPGRADE_LIST=$(echo "$PKG_UPGRADE_LIST" | zenity --list --text="${TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE}" --column="${TRANSHELL_CONTENT_CHOOSE}" --column="${TRANSHELL_CONTENT_APP_NAME}" --column="${TRANSHELL_CONTENT_NEW_VERSION}" --column="${TRANSHELL_CONTENT_UPGRADE_FROM}" --column="${TRANSHELL_CONTENT_PKG_NAME}" --separator=" " --checklist --multiple --print-column=5 --height 350 --width 650 --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
APP_UPGRADE="$(get_name_from_desktop_file $PKG_UPGRADE)"
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

View File

@@ -8,36 +8,50 @@ endloop=0
#####################检测是否启动过了更新检测工具
while [ $endloop -eq 0 ] ;do
if [ -e /etc/systemd/system/multi-user.target.wants/spark-update-notifier.service ];then
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
if [ ! -e $HOME/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop ];then
CONTENT_SET_CREATE_DESKTOP="${TRANSHELL_CONTENT_CLOSE_CREATE_DESKTOP}"
#已经开启了就显示关闭
else
CONTENT_SET_CREATE_DESKTOP="${TRANSHELL_CONTENT_OPEN_CREATE_DESKTOP}"
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`
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 "${CONTENT_SET_CREATE_DESKTOP}" 2 "${TRANSHELL_CONTENT_CHECK_FOR_UPDATE}" 3 "${TRANSHELL_CONTENT_EXIT}" --hide-column=1 --print-column=1)
case $option in
0)
if [ -e /etc/systemd/system/multi-user.target.wants/spark-update-notifier.service ];then
zenity --info --icon-name=spark-store --height 150 --width 200 --text "${TRANSHELL_CONTENT_CLOSING_UPGRADE_CHECK}" --timeout=2
pkexec systemctl disable spark-update-notifier
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
zenity --info --icon-name=spark-store --height 150 --width 200 --text "${TRANSHELL_CONTENT_OPENING_UPGRADE_CHECK}" --timeout=2
pkexec systemctl enable spark-update-notifier
pkexec service spark-update-notifier start
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)
if [ ! -e $HOME/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop ];then
mkdir -p $HOME/.config/spark-union/spark-store/
touch $HOME/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop
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-create-desktop
zenity --info --icon-name=spark-store --height 150 --width 200 --text "${TRANSHELL_CONTENT_OPENED}" --timeout=2
fi
;;
2)
/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh
;;
2)
3)
exit 0
;;
*)

View File

@@ -20,8 +20,10 @@ function notify-send() {
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/${uid}/bus notify-send "$@"
}
# 检测网络链接畅通
function network()
function network-check()
{
# 超时时间
local timeout=15
@@ -41,7 +43,7 @@ function network()
fi
}
network
network-check
if [ $? -ne 0 ] ; then
echo "$TRANSHELL_CONTENT_NETWORK_FAIL"
exit -1
@@ -50,9 +52,8 @@ fi
# The code above is modified from https://blog.csdn.net/yaxuan88521/article/details/120516298
# 每日更新星火源文件
curl --progress-bar -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list"
aptss update
updatetext=`aptss ssupdate 2>&1`
@@ -107,4 +108,16 @@ 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

View File

@@ -1,17 +1,18 @@
#!/bin/bash
TRANSHELL_CONTENT_UPDATE_CHEKING_PLEASE_WAIT="Checking for update, please wait..."
TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL="Spark Store APP Upgrade model"
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 standing at the top of the world"
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="All APPs are up to date.\nBut you are not at the top of the world"
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 standing 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\nBut you are not at the top of the world"
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

@@ -8,10 +8,11 @@ TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="没有软件需要更新\n但是你并没
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_UPGRADING_PLEASE_WAIT="正在更新 $APP_UPGRADE ,请稍候..."
TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED="选中的软件已经更新完毕"
TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="更新出现错误!按确定查看报错,可用于反馈"

View File

@@ -8,10 +8,11 @@ TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="沒有軟體需要更新\n但是你並沒
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_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="171"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="428"/>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
@@ -132,6 +124,14 @@
<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="174"/>
<location filename="../src/pages/appintopage.cpp" line="312"/>
<location filename="../src/pages/appintopage.cpp" line="482"/>
<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"/>
@@ -175,51 +175,79 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="45"/>
<location filename="../src/pages/appintopage.cpp" line="51"/>
<source>Click Open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="110"/>
<location filename="../src/pages/appintopage.cpp" line="113"/>
<source>Developer Mode Disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="156"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="401"/>
<location filename="../src/pages/appintopage.cpp" line="159"/>
<location filename="../src/pages/appintopage.cpp" line="328"/>
<location filename="../src/pages/appintopage.cpp" line="455"/>
<source>Reinstall</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="163"/>
<location filename="../src/pages/appintopage.cpp" line="166"/>
<source>Upgrade</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="377"/>
<location filename="../src/pages/appintopage.cpp" line="317"/>
<location filename="../src/pages/appintopage.cpp" line="431"/>
<source>Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<location filename="../src/pages/appintopage.cpp" line="322"/>
<source>Installing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="410"/>
<location filename="../src/pages/appintopage.cpp" line="414"/>
<location filename="../src/pages/appintopage.cpp" line="418"/>
<location filename="../src/pages/appintopage.cpp" line="422"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="410"/>
<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="414"/>
<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="418"/>
<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="422"/>
<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="486"/>
<location filename="../src/pages/appintopage.cpp" line="499"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="486"/>
<source>Uninstall succeeded</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="499"/>
<source>The URL has been copied to the clipboard</source>
<translation type="unfinished"></translation>
</message>
@@ -240,16 +268,24 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="111"/>
<location filename="../src/application.cpp" line="142"/>
<source>Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="118"/>
<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="176"/>
<source>Download Failed, please retry :(</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
@@ -299,59 +335,51 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="218"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="229"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="104"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="105"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="125"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="126"/>
<source>Installing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="218"/>
<source>Installation complete.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="187"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="188"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="219"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="220"/>
<source>Finish</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="195"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="227"/>
<source>Retry</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<source>Error happened in dpkg progress , you can try it again.</source>
<location filename="../src/widgets/common/downloaditem.cpp" line="229"/>
<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 type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="198"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="199"/>
<source>Error happened in dpkg progress , you can try it again</source>
<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 aborted, please check the install info or try to reinstall.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<source>dpkg progress had been abortedyou can retry installation.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="206"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="207"/>
<source>dpkg progress had been abortedyou can retry installation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="123"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="124"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="145"/>
<source>Download canceled</source>
<translation type="unfinished"></translation>
</message>
@@ -452,33 +480,33 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="165"/>
<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="166"/>
<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="167"/>
<location filename="../src/mainwindow-dtk.cpp" line="192"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="168"/>
<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="127"/>
<location filename="../src/mainwindow-dtk.cpp" line="219"/>
<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="132"/>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<source>Search or enter spk://</source>
<translation type="unfinished"></translation>
</message>
@@ -486,29 +514,29 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="29"/>
<location filename="../src/application.cpp" line="30"/>
<location filename="../src/mainwindow-dtk.cpp" line="107"/>
<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="34"/>
<location filename="../src/application.cpp" line="41"/>
<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="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="115"/>
<location filename="../src/application.cpp" line="149"/>
<source>Spark Project</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.cpp" line="10"/>
<location filename="../src/widgets/downloadlistwidget.cpp" line="18"/>
<source>Download list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="222"/>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<source>Show MainWindow</source>
<translation type="unfinished"></translation>
</message>
@@ -537,7 +565,7 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="143"/>
<source>Take effect when restart</source>
<source>Take effect immediately</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -557,61 +585,72 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="230"/>
<source>Other Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="240"/>
<source>Enable notification for apps not compatible with current system</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="264"/>
<source>Temp</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="243"/>
<location filename="../src/pages/settingspage.ui" line="277"/>
<source>Since the dictionary is at /tmp,It would be cleaned automatically when system reboot.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="250"/>
<location filename="../src/pages/settingspage.ui" line="284"/>
<source>0B</source>
<translation type="unfinished">0B</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="257"/>
<location filename="../src/pages/settingspage.ui" line="291"/>
<source>Location/tmp/spark-store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="277"/>
<location filename="../src/pages/settingspage.ui" line="311"/>
<source>Clean</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="290"/>
<location filename="../src/pages/settingspage.ui" line="324"/>
<source>Size:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="297"/>
<location filename="../src/pages/settingspage.ui" line="331"/>
<source>Clear Web Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="318"/>
<location filename="../src/pages/settingspage.ui" line="352"/>
<source>About us</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="325"/>
<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 &amp;lt;jifengshenmo@outlook.com&amp;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;Connect us on Spark IM: &lt;a href=&quot;https://chat.shenmo.tech&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://chat.shenmo.tech&lt;br/&gt;&lt;/span&gt;&lt;/a&gt;Our QQ Group number:872690351&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<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 type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="213"/>
<location filename="../src/pages/settingspage.cpp" line="217"/>
<source>Updating, please wait...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="235"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="235"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Temporary cache was cleaned</source>
<translation type="unfinished"></translation>
</message>
@@ -619,12 +658,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="223"/>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="224"/>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<source>Exit</source>
<translation type="unfinished"></translation>
</message>

View File

@@ -0,0 +1,671 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="es">
<context>
<name>AppIntoPage</name>
<message>
<location filename="../src/pages/appintopage.ui" line="14"/>
<source>Form</source>
<translation>Tipo</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
<translation>Desinstalar</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="346"/>
<source>0</source>
<translation>0</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="356"/>
<source>Download Times</source>
<translation>Número de descargas</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="410"/>
<location filename="../src/pages/appintopage.ui" line="413"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Esta aplicación fue desarrollada por usuarios de la comunidad y la Etiquetamos en honor a aquellos que contribuyeron a la ecología de linux.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="416"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&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;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="435"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&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;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="448"/>
<location filename="../src/pages/appintopage.ui" line="451"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capaz de UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="454"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/uos-small.png&quot;/&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;img src=&quot;:/tags/uos-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="467"/>
<location filename="../src/pages/appintopage.ui" line="470"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app. Spark Store will automatically configure the wine kit for you.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app. La tienda Spark le configurará automáticamente un traje de vino.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="473"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine2-small.png&quot;/&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;img src=&quot;:/tags/dwine2-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="486"/>
<location filename="../src/pages/appintopage.ui" line="489"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Esta es una aplicación dtk5, lo que significa que funcionará mejor en un entorno de escritorio profundo.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="492"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dtk-small.png&quot;/&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;img src=&quot;:/tags/dtk-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="505"/>
<location filename="../src/pages/appintopage.ui" line="508"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capaz de deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="511"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/deepin-small.png&quot;/&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;img src=&quot;:/tags/deepin-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="524"/>
<location filename="../src/pages/appintopage.ui" line="527"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Appimage de la aplicación deb.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="530"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&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;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="549"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&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;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="602"/>
<source>Share</source>
<translation>Comunión</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="609"/>
<source>APP Feedback</source>
<translation>Comentarios de la app</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="765"/>
<source>Introduction</source>
<translation>Introducción</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<source>Description</source>
<translation>Descripción</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="903"/>
<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="174"/>
<location filename="../src/pages/appintopage.cpp" line="312"/>
<location filename="../src/pages/appintopage.cpp" line="482"/>
<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"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capaz de Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="543"/>
<location filename="../src/pages/appintopage.ui" line="546"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A Wine app.Spark Store will automatically configure the wine kit for you&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<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"/>
<source>Update</source>
<translation>Modernizar</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<source>Contributor</source>
<translation>Contribuyentes</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1197"/>
<source>Pkgname</source>
<translation>Nombre del embalaje</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<source>Author</source>
<translation>Autor</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<source>Size</source>
<translation>Tamaño</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<source>Website</source>
<translation>Sitio web</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="51"/>
<source>Click Open</source>
<translation>Haga clic en &quot;abrir&quot;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="113"/>
<source>Developer Mode Disabled</source>
<translation>Se ha desactivado el modo desarrollador</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="159"/>
<location filename="../src/pages/appintopage.cpp" line="328"/>
<location filename="../src/pages/appintopage.cpp" line="455"/>
<source>Reinstall</source>
<translation>Reinstalación</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="166"/>
<source>Upgrade</source>
<translation>Actualización</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="317"/>
<location filename="../src/pages/appintopage.cpp" line="431"/>
<source>Install</source>
<translation>Instalación</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="322"/>
<source>Installing</source>
<translation>Se está instalando</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="410"/>
<location filename="../src/pages/appintopage.cpp" line="414"/>
<location filename="../src/pages/appintopage.cpp" line="418"/>
<location filename="../src/pages/appintopage.cpp" line="422"/>
<source>Warning</source>
<translation>Aviso</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="410"/>
<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>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="414"/>
<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>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="418"/>
<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>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="422"/>
<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>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="486"/>
<location filename="../src/pages/appintopage.cpp" line="499"/>
<source>Spark Store</source>
<translation>SPARK Store</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="486"/>
<source>Uninstall succeeded</source>
<translation>Desinstalación exitosa</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="499"/>
<source>The URL has been copied to the clipboard</source>
<translation>La URL ha sido copiada al portapapeles</translation>
</message>
</context>
<context>
<name>AppListPage</name>
<message>
<location filename="../src/pages/applistpage.ui" line="14"/>
<source>Form</source>
<translation>Tipo</translation>
</message>
<message>
<location filename="../src/pages/applistpage.ui" line="60"/>
<source>about:blank</source>
<translation>Sobre: en blanco</translation>
</message>
</context>
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="142"/>
<source>Version: %1</source>
<translation>Versión %1</translation>
</message>
<message>
<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="176"/>
<source>Download Failed, please retry :(</source>
<translation>Descarga fall, por favor vuelva a intentarlo</translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="32"/>
<source>Form</source>
<translation>Tipo</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="74"/>
<source>icon</source>
<translation>ídolo</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="134"/>
<source>TextLabel</source>
<translation>Etiquetas de texto</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="121"/>
<source>Name</source>
<translation>Nombre</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="226"/>
<source>Waiting to download</source>
<translation>Esperando descargar</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="277"/>
<source>Install</source>
<translation>Instalación</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="296"/>
<source>Cancel</source>
<translation>Cancelación</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="315"/>
<source>Info</source>
<translation>Información</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="43"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="44"/>
<source>Download Complete.</source>
<translation>Descarga completada.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="218"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="229"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<source>Spark Store</source>
<translation>SPARK Store</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="125"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="126"/>
<source>Installing</source>
<translation>Se está instalando</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="218"/>
<source>Installation complete.</source>
<translation>La instalación está completa.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="219"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="220"/>
<source>Finish</source>
<translation>Completado</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="227"/>
<source>Retry</source>
<translation>Reinterpretar</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="229"/>
<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>Se produjo un error durante el proceso dpkg, verifique la información de instalación o intente reinstalar.</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 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"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="145"/>
<source>Download canceled</source>
<translation>Descarga cancelada</translation>
</message>
</context>
<context>
<name>DownloadListWidget</name>
<message>
<location filename="../src/widgets/downloadlistwidget.ui" line="14"/>
<source>Form</source>
<translation>Tipo</translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.ui" line="41"/>
<source>The list is currently empty. Go and download some softwares!</source>
<translation>La lista está actualmente vacía. ¡Ve a descargar un poco de software!</translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.ui" line="116"/>
<source>Open download directory</source>
<translation>Abrir el catálogo de descargas</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../src/mainwindow-dtk.ui" line="14"/>
<source>MainWindow</source>
<translation>Ventana principal</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="166"/>
<source>Home</source>
<translation>Casa</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="203"/>
<source>Network</source>
<translation>Red</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="231"/>
<source>Chat</source>
<translation>Charla</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="259"/>
<source>Music</source>
<translation>Música</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="287"/>
<source>Video</source>
<translation>Vídeo</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="315"/>
<source>Picture</source>
<translation>Foto</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="343"/>
<source>Game</source>
<translation>Juego</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="371"/>
<source>Office</source>
<translation>Oficina</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="399"/>
<source>Reading</source>
<translation>Leer</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="427"/>
<source>Development</source>
<translation>Desarrollo</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="455"/>
<source>Tool</source>
<translation>Herramientas</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="483"/>
<source>Theme</source>
<translation>Tema</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="511"/>
<source>Other</source>
<translation>Además</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="539"/>
<source>APP Upgrade</source>
<translation>Actualización de app</translation>
</message>
<message>
<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="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="192"/>
<source>Settings</source>
<translation>Configuración</translation>
</message>
<message>
<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="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="152"/>
<source>Search or enter spk://</source>
<translation>Buscar o introducir spk: /%</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="36"/>
<location filename="../src/application.cpp" line="37"/>
<location filename="../src/mainwindow-dtk.cpp" line="126"/>
<source>Spark Store</source>
<translation>SPARK Store</translation>
</message>
<message>
<location filename="../src/application.cpp" line="41"/>
<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>
</message>
<message>
<location filename="../src/application.cpp" line="149"/>
<source>Spark Project</source>
<translation>Proyecto spark</translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.cpp" line="18"/>
<source>Download list</source>
<translation>Descargar lista</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<source>Show MainWindow</source>
<translation>Mostrar la ventana principal</translation>
</message>
</context>
<context>
<name>SettingsPage</name>
<message>
<location filename="../src/pages/settingspage.ui" line="14"/>
<source>Form</source>
<translation>Tipo</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="91"/>
<source>Line Settings</source>
<translation>Configuración de la línea</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="107"/>
<source>Choose Line:</source>
<translation>Selección de líneas:</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="130"/>
<source>Refresh</source>
<translation>Refrescar</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="143"/>
<source>Take effect immediately</source>
<translation>Entrada en vigor inmediata</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="185"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check update for Spark Store. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Revisa las actualizaciones de la Spark Store. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="202"/>
<source>Update</source>
<translation>Modernizar</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="195"/>
<source>Spark Store Update</source>
<translation>Actualización de la tienda spark</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="230"/>
<source>Other Settings</source>
<translation>Otras configuraciones</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="240"/>
<source>Enable notification for apps not compatible with current system</source>
<translation>Habilitar notificaciones para aplicaciones incompatibles con el sistema actual</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="264"/>
<source>Temp</source>
<translation>Empleados temporales</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="277"/>
<source>Since the dictionary is at /tmp,It would be cleaned automatically when system reboot.</source>
<translation>Debido a que el diccionario se encuentra en / tmp, se limpia automáticamente cuando el sistema se reinicia.</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="284"/>
<source>0B</source>
<translation>0B</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="291"/>
<source>Location/tmp/spark-store</source>
<translation>Ubicación: / TMP / Spark Storage</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="311"/>
<source>Clean</source>
<translation>Limpio</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="324"/>
<source>Size:</source>
<translation>Tamaño:</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="331"/>
<source>Clear Web Cache</source>
<translation>Borrar la caché web</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="352"/>
<source>About us</source>
<translation>Sobre nosotros</translation>
</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>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="217"/>
<source>Updating, please wait...</source>
<translation>Se está actualizando, por favor Espere...</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Spark Store</source>
<translation>SPARK Store</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Temporary cache was cleaned</source>
<translation>Se ha limpiado la caché temporal</translation>
</message>
</context>
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<source>About</source>
<translation>Sobre</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<source>Exit</source>
<translation>Exportaciones</translation>
</message>
</context>
</TS>

View File

@@ -6,222 +6,250 @@
<message>
<location filename="../src/pages/appintopage.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="171"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="428"/>
<source>Download</source>
<translation type="unfinished"></translation>
<translation>Type</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
<translation type="unfinished"></translation>
<translation>Désinstaller</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="346"/>
<source>0</source>
<translation type="unfinished">0B {0?}</translation>
<translation>0</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="356"/>
<source>Download Times</source>
<translation type="unfinished"></translation>
<translation>Nombre de téléchargements</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="410"/>
<location filename="../src/pages/appintopage.ui" line="413"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Cette application a é développée par des utilisateurs de la communauté et nous avons donné ce label à ceux qui ont contribué à l&apos;écologie de Linux&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="416"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="435"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="448"/>
<location filename="../src/pages/appintopage.ui" line="451"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable de la home UOS 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="454"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/uos-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/uos-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="467"/>
<location filename="../src/pages/appintopage.ui" line="470"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app. Spark Store will automatically configure the wine kit for you.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Une application deepin-wine2. Le Spark Store configure automatiquement votre pack de vins.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="473"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine2-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine2-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="486"/>
<location filename="../src/pages/appintopage.ui" line="489"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;C&apos;est une application dtk5, ce qui signifie qu&apos;elle fonctionnera mieux dans un environnement de bureau profond.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="492"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dtk-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dtk-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="505"/>
<location filename="../src/pages/appintopage.ui" line="508"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable de la deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="511"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/deepin-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/deepin-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="524"/>
<location filename="../src/pages/appintopage.ui" line="527"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Appimage pour l&apos;application DEB&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="530"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="549"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="602"/>
<source>Share</source>
<translation type="unfinished"></translation>
<translation>Au total</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="609"/>
<source>APP Feedback</source>
<translation type="unfinished"></translation>
<translation>App feedback</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="765"/>
<source>Introduction</source>
<translation type="unfinished"></translation>
<translation>Présentation</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<source>Description</source>
<translation type="unfinished"></translation>
<translation>Description</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="903"/>
<source>Screen capture</source>
<translation type="unfinished"></translation>
<translation>Captures d&apos;écran</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="174"/>
<location filename="../src/pages/appintopage.cpp" line="312"/>
<location filename="../src/pages/appintopage.cpp" line="482"/>
<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"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable de la Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="543"/>
<location filename="../src/pages/appintopage.ui" line="546"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A Wine app.Spark Store will automatically configure the wine kit for you&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<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"/>
<source>Update</source>
<translation type="unfinished"></translation>
<translation>Moderniser</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<source>Contributor</source>
<translation type="unfinished"></translation>
<translation>Contributeurs</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1197"/>
<source>Pkgname</source>
<translation type="unfinished"></translation>
<translation>Nom de l&apos;emballage</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<source>Author</source>
<translation type="unfinished"></translation>
<translation>Auteur</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<source>Size</source>
<translation type="unfinished"></translation>
<translation>Taille</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<source>Website</source>
<translation type="unfinished"></translation>
<translation>Site Web</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="45"/>
<location filename="../src/pages/appintopage.cpp" line="51"/>
<source>Click Open</source>
<translation type="unfinished"></translation>
<translation>Cliquez sur Ouvrir</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="110"/>
<location filename="../src/pages/appintopage.cpp" line="113"/>
<source>Developer Mode Disabled</source>
<translation type="unfinished"></translation>
<translation>Mode développeur désactivé</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="156"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="401"/>
<location filename="../src/pages/appintopage.cpp" line="159"/>
<location filename="../src/pages/appintopage.cpp" line="328"/>
<location filename="../src/pages/appintopage.cpp" line="455"/>
<source>Reinstall</source>
<translation type="unfinished"></translation>
<translation>Réinstaller</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="163"/>
<location filename="../src/pages/appintopage.cpp" line="166"/>
<source>Upgrade</source>
<translation type="unfinished"></translation>
<translation>Mise à niveau</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="377"/>
<location filename="../src/pages/appintopage.cpp" line="317"/>
<location filename="../src/pages/appintopage.cpp" line="431"/>
<source>Install</source>
<translation type="unfinished"></translation>
<translation>Installation</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<location filename="../src/pages/appintopage.cpp" line="322"/>
<source>Installing</source>
<translation type="unfinished"></translation>
<translation>Installation en cours</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="410"/>
<location filename="../src/pages/appintopage.cpp" line="414"/>
<location filename="../src/pages/appintopage.cpp" line="418"/>
<location filename="../src/pages/appintopage.cpp" line="422"/>
<source>Warning</source>
<translation>Avertissement</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="410"/>
<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>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="414"/>
<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>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="418"/>
<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>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="422"/>
<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>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="486"/>
<location filename="../src/pages/appintopage.cpp" line="499"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
<translation>Le Spark store</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="486"/>
<source>Uninstall succeeded</source>
<translation type="unfinished"></translation>
<translation>Désinstallation réussie</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="499"/>
<source>The URL has been copied to the clipboard</source>
<translation type="unfinished"></translation>
<translation>L&apos;URL a é copiée dans le presse - papiers</translation>
</message>
</context>
<context>
@@ -229,25 +257,33 @@
<message>
<location filename="../src/pages/applistpage.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
<translation>Type</translation>
</message>
<message>
<location filename="../src/pages/applistpage.ui" line="60"/>
<source>about:blank</source>
<translation type="unfinished"></translation>
<translation>Re: vide</translation>
</message>
</context>
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="111"/>
<location filename="../src/application.cpp" line="142"/>
<source>Version: %1</source>
<translation type="unfinished"></translation>
<translation>Version: %1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="118"/>
<location filename="../src/application.cpp" line="152"/>
<source>%1 is released under %2</source>
<translation type="unfinished"></translation>
<translation>%1 publié sous %2</translation>
</message>
</context>
<context>
<name>DownloadController</name>
<message>
<location filename="../src/backend/downloadworker.cpp" line="176"/>
<source>Download Failed, please retry :(</source>
<translation>Le téléchargement a échoué, veuillez réessayer</translation>
</message>
</context>
<context>
@@ -255,105 +291,97 @@
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="32"/>
<source>Form</source>
<translation type="unfinished"></translation>
<translation>Type</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="74"/>
<source>icon</source>
<translation type="unfinished"></translation>
<translation>Idoles</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="134"/>
<source>TextLabel</source>
<translation type="unfinished"></translation>
<translation>Étiquettes de texte</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="121"/>
<source>Name</source>
<translation type="unfinished"></translation>
<translation>Le nom</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="226"/>
<source>Waiting to download</source>
<translation type="unfinished"></translation>
<translation>En attente de téléchargement</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="277"/>
<source>Install</source>
<translation type="unfinished"></translation>
<translation>Installation</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="296"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
<translation>Annulation</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="315"/>
<source>Info</source>
<translation type="unfinished"></translation>
<translation>Informations</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="43"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="44"/>
<source>Download Complete.</source>
<translation type="unfinished"></translation>
<translation>Le téléchargement est terminé.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="218"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="229"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
<translation>Le Spark store</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="104"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="105"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="125"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="126"/>
<source>Installing</source>
<translation type="unfinished"></translation>
<translation>Installation en cours</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="218"/>
<source>Installation complete.</source>
<translation type="unfinished"></translation>
<translation>L&apos;installation est terminée.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="187"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="188"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="219"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="220"/>
<source>Finish</source>
<translation type="unfinished"></translation>
<translation>Terminé</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="195"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="227"/>
<source>Retry</source>
<translation type="unfinished"></translation>
<translation>Essayez à nouveau</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<source>Error happened in dpkg progress , you can try it again.</source>
<translation type="unfinished"></translation>
<location filename="../src/widgets/common/downloaditem.cpp" line="229"/>
<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>Une erreur s&apos;est produite dans le processus dpkg, vérifiez les informations d&apos;installation ou essayez de réinstaller.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="198"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="199"/>
<source>Error happened in dpkg progress , you can try it again</source>
<translation type="unfinished"></translation>
<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 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="205"/>
<source>dpkg progress had been abortedyou can retry installation.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="206"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="207"/>
<source>dpkg progress had been abortedyou can retry installation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="123"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="124"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="145"/>
<source>Download canceled</source>
<translation type="unfinished"></translation>
<translation>Le téléchargement a é annulé</translation>
</message>
</context>
<context>
@@ -361,17 +389,17 @@
<message>
<location filename="../src/widgets/downloadlistwidget.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
<translation>Type</translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.ui" line="41"/>
<source>The list is currently empty. Go and download some softwares!</source>
<translation type="unfinished"></translation>
<translation>La liste est actuellement vide. Allez télécharger quelques logiciels!</translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.ui" line="116"/>
<source>Open download directory</source>
<translation type="unfinished"></translation>
<translation>Ouvrir le catalogue de téléchargement</translation>
</message>
</context>
<context>
@@ -379,138 +407,138 @@
<message>
<location filename="../src/mainwindow-dtk.ui" line="14"/>
<source>MainWindow</source>
<translation type="unfinished"></translation>
<translation>Fenêtre principale</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="166"/>
<source>Home</source>
<translation type="unfinished"></translation>
<translation>Maison</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="203"/>
<source>Network</source>
<translation type="unfinished"></translation>
<translation>Réseau</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="231"/>
<source>Chat</source>
<translation type="unfinished"></translation>
<translation>Bavarder</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="259"/>
<source>Music</source>
<translation type="unfinished"></translation>
<translation>Musique</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="287"/>
<source>Video</source>
<translation type="unfinished"></translation>
<translation>Vidéo</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="315"/>
<source>Picture</source>
<translation type="unfinished"></translation>
<translation>Photos</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="343"/>
<source>Game</source>
<translation type="unfinished"></translation>
<translation>Jeux</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="371"/>
<source>Office</source>
<translation type="unfinished"></translation>
<translation>Bureaux</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="399"/>
<source>Reading</source>
<translation type="unfinished"></translation>
<translation>Lire</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="427"/>
<source>Development</source>
<translation type="unfinished"></translation>
<translation>Développement</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="455"/>
<source>Tool</source>
<translation type="unfinished"></translation>
<translation>Outils</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="483"/>
<source>Theme</source>
<translation type="unfinished"></translation>
<translation>Thèmes</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="511"/>
<source>Other</source>
<translation type="unfinished"></translation>
<translation>En outre</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="539"/>
<source>APP Upgrade</source>
<translation type="unfinished"></translation>
<translation>Mise à niveau app</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="165"/>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<source>Submit App</source>
<translation type="unfinished"></translation>
<translation>Soumettre une application</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="166"/>
<location filename="../src/mainwindow-dtk.cpp" line="191"/>
<source>Submit App with client(Recommanded)</source>
<translation type="unfinished"></translation>
<translation>Soumettre une demande au client (recommandé)</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="167"/>
<location filename="../src/mainwindow-dtk.cpp" line="192"/>
<source>Settings</source>
<translation type="unfinished"></translation>
<translation>Paramètres</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="168"/>
<location filename="../src/mainwindow-dtk.cpp" line="193"/>
<source>APP Upgrade and Install Settings</source>
<translation type="unfinished"></translation>
<translation>Paramètres de mise à niveau et d&apos;installation de l&apos;app</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="127"/>
<location filename="../src/mainwindow-dtk.cpp" line="219"/>
<location filename="../src/mainwindow-dtk.cpp" line="147"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
<translation>Le Spark store</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="132"/>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<source>Search or enter spk://</source>
<translation type="unfinished"></translation>
<translation>Rechercher ou entrer SPK /</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="29"/>
<location filename="../src/application.cpp" line="30"/>
<location filename="../src/mainwindow-dtk.cpp" line="107"/>
<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>
<translation>Le Spark store</translation>
</message>
<message>
<location filename="../src/application.cpp" line="34"/>
<location filename="../src/application.cpp" line="41"/>
<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="unfinished"></translation>
<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>
</message>
<message>
<location filename="../src/application.cpp" line="115"/>
<location filename="../src/application.cpp" line="149"/>
<source>Spark Project</source>
<translation type="unfinished"></translation>
<translation>Le projet Spark</translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.cpp" line="10"/>
<location filename="../src/widgets/downloadlistwidget.cpp" line="18"/>
<source>Download list</source>
<translation type="unfinished"></translation>
<translation>Télécharger la Liste</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="222"/>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<source>Show MainWindow</source>
<translation type="unfinished"></translation>
<translation>Afficher la fenêtre principale</translation>
</message>
</context>
<context>
@@ -518,115 +546,126 @@
<message>
<location filename="../src/pages/settingspage.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
<translation>Type</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="91"/>
<source>Line Settings</source>
<translation type="unfinished"></translation>
<translation>Configuration de la ligne</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="107"/>
<source>Choose Line:</source>
<translation type="unfinished"></translation>
<translation>Sélectionnez la ligne:</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="130"/>
<source>Refresh</source>
<translation type="unfinished"></translation>
<translation>Rafraîchir</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="143"/>
<source>Take effect when restart</source>
<translation type="unfinished"></translation>
<source>Take effect immediately</source>
<translation>Entrée en vigueur immédiate</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="185"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check update for Spark Store. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Vérifiez les mises à jour sur le Spark Store. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="202"/>
<source>Update</source>
<translation type="unfinished"></translation>
<translation>Moderniser</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="195"/>
<source>Spark Store Update</source>
<translation type="unfinished"></translation>
<translation>Mise à jour du Spark store</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="230"/>
<source>Other Settings</source>
<translation>Autres paramètres</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="240"/>
<source>Enable notification for apps not compatible with current system</source>
<translation>Activer les notifications pour les applications incompatibles avec le système actuel</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="264"/>
<source>Temp</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="243"/>
<source>Since the dictionary is at /tmp,It would be cleaned automatically when system reboot.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="250"/>
<source>0B</source>
<translation type="unfinished">0B</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="257"/>
<source>Location/tmp/spark-store</source>
<translation type="unfinished"></translation>
<translation>Employés temporaires</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="277"/>
<source>Since the dictionary is at /tmp,It would be cleaned automatically when system reboot.</source>
<translation>Comme le dictionnaire se trouve dans / tmp, il est nettoyé automatiquement lorsque le système redémarre.</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="284"/>
<source>0B</source>
<translation>0B</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="291"/>
<source>Location/tmp/spark-store</source>
<translation>Emplacement: / tmp / Spark stockage</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="311"/>
<source>Clean</source>
<translation type="unfinished"></translation>
<translation>Nettoyé</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="290"/>
<location filename="../src/pages/settingspage.ui" line="324"/>
<source>Size:</source>
<translation type="unfinished"></translation>
<translation>Dimensions:</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="297"/>
<location filename="../src/pages/settingspage.ui" line="331"/>
<source>Clear Web Cache</source>
<translation type="unfinished"></translation>
<translation>Effacer le cache Web</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="318"/>
<location filename="../src/pages/settingspage.ui" line="352"/>
<source>About us</source>
<translation type="unfinished"></translation>
<translation>À propos de nous</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="325"/>
<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 &amp;lt;jifengshenmo@outlook.com&amp;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;Connect us on Spark IM: &lt;a href=&quot;https://chat.shenmo.tech&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://chat.shenmo.tech&lt;br/&gt;&lt;/span&gt;&lt;/a&gt;Our QQ Group number:872690351&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<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>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="213"/>
<location filename="../src/pages/settingspage.cpp" line="217"/>
<source>Updating, please wait...</source>
<translation type="unfinished"></translation>
<translation>Mise à jour en cours, veuillez patienter...</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="235"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
<translation>Le Spark store</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="235"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Temporary cache was cleaned</source>
<translation type="unfinished"></translation>
<translation>Cache temporaire nettoyé</translation>
</message>
</context>
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="223"/>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<source>About</source>
<translation type="unfinished"></translation>
<translation>À propos</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="224"/>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<source>Exit</source>
<translation type="unfinished"></translation>
<translation>Exportations</translation>
</message>
</context>
</TS>

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="171"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="428"/>
<source>Download</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
@@ -127,6 +119,14 @@
<source>Screen capture</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="174"/>
<location filename="../src/pages/appintopage.cpp" line="312"/>
<location filename="../src/pages/appintopage.cpp" line="482"/>
<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"/>
@@ -175,51 +175,79 @@
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="45"/>
<location filename="../src/pages/appintopage.cpp" line="51"/>
<source>Click Open</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="110"/>
<location filename="../src/pages/appintopage.cpp" line="113"/>
<source>Developer Mode Disabled</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="156"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="401"/>
<location filename="../src/pages/appintopage.cpp" line="159"/>
<location filename="../src/pages/appintopage.cpp" line="328"/>
<location filename="../src/pages/appintopage.cpp" line="455"/>
<source>Reinstall</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="163"/>
<location filename="../src/pages/appintopage.cpp" line="166"/>
<source>Upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="377"/>
<location filename="../src/pages/appintopage.cpp" line="317"/>
<location filename="../src/pages/appintopage.cpp" line="431"/>
<source>Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<location filename="../src/pages/appintopage.cpp" line="322"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="410"/>
<location filename="../src/pages/appintopage.cpp" line="414"/>
<location filename="../src/pages/appintopage.cpp" line="418"/>
<location filename="../src/pages/appintopage.cpp" line="422"/>
<source>Warning</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="410"/>
<source>The current application does not support deepin, there may be problems</source>
<translation>deepin</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="414"/>
<source>The current application does not support UOS, there may be problems</source>
<translation>UOS</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="418"/>
<source>The current application does not support Ubuntu, there may be problems</source>
<translation>Ubuntu</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="422"/>
<source>The current application does not support current platform, there may be problems</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="486"/>
<location filename="../src/pages/appintopage.cpp" line="499"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="486"/>
<source>Uninstall succeeded</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="499"/>
<source>The URL has been copied to the clipboard</source>
<translation></translation>
</message>
@@ -240,16 +268,24 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="111"/>
<location filename="../src/application.cpp" line="142"/>
<source>Version: %1</source>
<translation>%1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="118"/>
<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="176"/>
<source>Download Failed, please retry :(</source>
<translation></translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
@@ -299,59 +335,51 @@
<translation>.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="218"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="229"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="104"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="105"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="125"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="126"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="218"/>
<source>Installation complete.</source>
<translation>.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="187"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="188"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="219"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="220"/>
<source>Finish</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="195"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="227"/>
<source>Retry</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<source>Error happened in dpkg progress , you can try it again.</source>
<translation></translation>
<location filename="../src/widgets/common/downloaditem.cpp" line="229"/>
<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>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="198"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="199"/>
<source>Error happened in dpkg progress , you can try it again</source>
<translation>dpkg出现错误</translation>
<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 aborted, please check the install info or try to reinstall.</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<source>dpkg progress had been abortedyou can retry installation.</source>
<translation>dpkg进程被中断</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="206"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="207"/>
<source>dpkg progress had been abortedyou can retry installation</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="123"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="124"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="145"/>
<source>Download canceled</source>
<translation></translation>
</message>
@@ -452,33 +480,33 @@
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="165"/>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<source>Submit App</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="166"/>
<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="167"/>
<location filename="../src/mainwindow-dtk.cpp" line="192"/>
<source>Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="168"/>
<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="127"/>
<location filename="../src/mainwindow-dtk.cpp" line="219"/>
<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="132"/>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<source>Search or enter spk://</source>
<translation></translation>
</message>
@@ -486,29 +514,29 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="29"/>
<location filename="../src/application.cpp" line="30"/>
<location filename="../src/mainwindow-dtk.cpp" line="107"/>
<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="34"/>
<location filename="../src/application.cpp" line="41"/>
<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>
</message>
<message>
<location filename="../src/application.cpp" line="115"/>
<location filename="../src/application.cpp" line="149"/>
<source>Spark Project</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.cpp" line="10"/>
<location filename="../src/widgets/downloadlistwidget.cpp" line="18"/>
<source>Download list</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="222"/>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<source>Show MainWindow</source>
<translation></translation>
</message>
@@ -537,8 +565,8 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="143"/>
<source>Take effect when restart</source>
<translation></translation>
<source>Take effect immediately</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="185"/>
@@ -557,61 +585,72 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="230"/>
<source>Other Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="240"/>
<source>Enable notification for apps not compatible with current system</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="264"/>
<source>Temp</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="243"/>
<location filename="../src/pages/settingspage.ui" line="277"/>
<source>Since the dictionary is at /tmp,It would be cleaned automatically when system reboot.</source>
<translation>/tmp下使</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="250"/>
<location filename="../src/pages/settingspage.ui" line="284"/>
<source>0B</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="257"/>
<location filename="../src/pages/settingspage.ui" line="291"/>
<source>Location/tmp/spark-store</source>
<translation>/tmp/spark-store</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="277"/>
<location filename="../src/pages/settingspage.ui" line="311"/>
<source>Clean</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="290"/>
<location filename="../src/pages/settingspage.ui" line="324"/>
<source>Size:</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="297"/>
<location filename="../src/pages/settingspage.ui" line="331"/>
<source>Clear Web Cache</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="318"/>
<location filename="../src/pages/settingspage.ui" line="352"/>
<source>About us</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="325"/>
<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 &amp;lt;jifengshenmo@outlook.com&amp;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;Connect us on Spark IM: &lt;a href=&quot;https://chat.shenmo.tech&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://chat.shenmo.tech&lt;br/&gt;&lt;/span&gt;&lt;/a&gt;Our QQ Group number:872690351&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; &amp;lt;jifengshenmo@outlook.com&amp;gt; &lt;/p&gt;&lt;p&gt;稿&lt;/p&gt;&lt;p&gt; Spark IM :&lt;a href=&quot;https://chat.shenmo.tech&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://chat.shenmo.tech&lt;br/&gt;&lt;/span&gt;&lt;/a&gt;QQ 872690351&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<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>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="213"/>
<location filename="../src/pages/settingspage.cpp" line="217"/>
<source>Updating, please wait...</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="235"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="235"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Temporary cache was cleaned</source>
<translation></translation>
</message>
@@ -619,12 +658,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="223"/>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<source>About</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="224"/>
<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="171"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="428"/>
<source>Download</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
@@ -127,6 +119,14 @@
<source>Screen capture</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="174"/>
<location filename="../src/pages/appintopage.cpp" line="312"/>
<location filename="../src/pages/appintopage.cpp" line="482"/>
<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"/>
@@ -175,51 +175,79 @@
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="45"/>
<location filename="../src/pages/appintopage.cpp" line="51"/>
<source>Click Open</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="110"/>
<location filename="../src/pages/appintopage.cpp" line="113"/>
<source>Developer Mode Disabled</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="156"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="401"/>
<location filename="../src/pages/appintopage.cpp" line="159"/>
<location filename="../src/pages/appintopage.cpp" line="328"/>
<location filename="../src/pages/appintopage.cpp" line="455"/>
<source>Reinstall</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="163"/>
<location filename="../src/pages/appintopage.cpp" line="166"/>
<source>Upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="377"/>
<location filename="../src/pages/appintopage.cpp" line="317"/>
<location filename="../src/pages/appintopage.cpp" line="431"/>
<source>Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<location filename="../src/pages/appintopage.cpp" line="322"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="410"/>
<location filename="../src/pages/appintopage.cpp" line="414"/>
<location filename="../src/pages/appintopage.cpp" line="418"/>
<location filename="../src/pages/appintopage.cpp" line="422"/>
<source>Warning</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="410"/>
<source>The current application does not support deepin, there may be problems</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="414"/>
<source>The current application does not support UOS, there may be problems</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="418"/>
<source>The current application does not support Ubuntu, there may be problems</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="422"/>
<source>The current application does not support current platform, there may be problems</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="486"/>
<location filename="../src/pages/appintopage.cpp" line="499"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<location filename="../src/pages/appintopage.cpp" line="486"/>
<source>Uninstall succeeded</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="499"/>
<source>The URL has been copied to the clipboard</source>
<translation></translation>
</message>
@@ -240,16 +268,24 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="111"/>
<location filename="../src/application.cpp" line="142"/>
<source>Version: %1</source>
<translation>%1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="118"/>
<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="176"/>
<source>Download Failed, please retry :(</source>
<translation></translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
@@ -299,59 +335,51 @@
<translation>.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="218"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="229"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="104"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="105"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="125"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="126"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="186"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="218"/>
<source>Installation complete.</source>
<translation>.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="187"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="188"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="219"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="220"/>
<source>Finish</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="195"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="227"/>
<source>Retry</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="197"/>
<source>Error happened in dpkg progress , you can try it again.</source>
<translation></translation>
<location filename="../src/widgets/common/downloaditem.cpp" line="229"/>
<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>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="198"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="199"/>
<source>Error happened in dpkg progress , you can try it again</source>
<translation>dpkg出现错误</translation>
<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 aborted, please check the install info or try to reinstall.</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="205"/>
<source>dpkg progress had been abortedyou can retry installation.</source>
<translation>dpkg进程被中断</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="206"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="207"/>
<source>dpkg progress had been abortedyou can retry installation</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="123"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="124"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="145"/>
<source>Download canceled</source>
<translation></translation>
</message>
@@ -452,33 +480,33 @@
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="165"/>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<source>Submit App</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="166"/>
<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="167"/>
<location filename="../src/mainwindow-dtk.cpp" line="192"/>
<source>Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="168"/>
<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="127"/>
<location filename="../src/mainwindow-dtk.cpp" line="219"/>
<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="132"/>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<source>Search or enter spk://</source>
<translation></translation>
</message>
@@ -486,29 +514,29 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="29"/>
<location filename="../src/application.cpp" line="30"/>
<location filename="../src/mainwindow-dtk.cpp" line="107"/>
<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="34"/>
<location filename="../src/application.cpp" line="41"/>
<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>
</message>
<message>
<location filename="../src/application.cpp" line="115"/>
<location filename="../src/application.cpp" line="149"/>
<source>Spark Project</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.cpp" line="10"/>
<location filename="../src/widgets/downloadlistwidget.cpp" line="18"/>
<source>Download list</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="222"/>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<source>Show MainWindow</source>
<translation></translation>
</message>
@@ -537,8 +565,8 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="143"/>
<source>Take effect when restart</source>
<translation></translation>
<source>Take effect immediately</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="185"/>
@@ -557,61 +585,72 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="230"/>
<source>Other Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="240"/>
<source>Enable notification for apps not compatible with current system</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="264"/>
<source>Temp</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="243"/>
<location filename="../src/pages/settingspage.ui" line="277"/>
<source>Since the dictionary is at /tmp,It would be cleaned automatically when system reboot.</source>
<translation>/tmp下使</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="250"/>
<location filename="../src/pages/settingspage.ui" line="284"/>
<source>0B</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="257"/>
<location filename="../src/pages/settingspage.ui" line="291"/>
<source>Location/tmp/spark-store</source>
<translation>/tmp/spark-store</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="277"/>
<location filename="../src/pages/settingspage.ui" line="311"/>
<source>Clean</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="290"/>
<location filename="../src/pages/settingspage.ui" line="324"/>
<source>Size:</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="297"/>
<location filename="../src/pages/settingspage.ui" line="331"/>
<source>Clear Web Cache</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="318"/>
<location filename="../src/pages/settingspage.ui" line="352"/>
<source>About us</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="325"/>
<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 &amp;lt;jifengshenmo@outlook.com&amp;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;Connect us on Spark IM: &lt;a href=&quot;https://chat.shenmo.tech&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://chat.shenmo.tech&lt;br/&gt;&lt;/span&gt;&lt;/a&gt;Our QQ Group number:872690351&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; &amp;lt;jifengshenmo@outlook.com&amp;gt; &lt;/p&gt;&lt;p&gt;稿&lt;/p&gt;&lt;p&gt; Spark IM :&lt;a href=&quot;https://chat.shenmo.tech&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://chat.shenmo.tech&lt;br/&gt;&lt;/span&gt;&lt;/a&gt;QQ 872690351&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<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>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="213"/>
<location filename="../src/pages/settingspage.cpp" line="217"/>
<source>Updating, please wait...</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="235"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="235"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Temporary cache was cleaned</source>
<translation></translation>
</message>
@@ -619,12 +658,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="223"/>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<source>About</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="224"/>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<source>Exit</source>
<translation>退</translation>
</message>