Compare commits

..

13 Commits

Author SHA1 Message Date
dd0629bc8d !235 4272
Merge pull request !235 from shenmo/dev
2023-09-13 10:25:17 +00:00
39be4cdf6f !233 4271+1
Merge pull request !233 from shenmo/dev
2023-09-01 14:59:52 +00:00
fc58de0325 !230 4271
Merge pull request !230 from shenmo/dev
2023-08-31 14:58:24 +00:00
ba00b208f0 !228 4.2.7
Merge pull request !228 from shenmo/dev
2023-08-14 04:38:46 +00:00
2cca83a34b !226 4266
Merge pull request !226 from shenmo/dev
2023-08-02 03:41:43 +00:00
ea7baa9ab0 !224 4265
Merge pull request !224 from shenmo/dev
2023-07-24 08:03:03 +00:00
c228706144 !222 4264 社群入口修复
Merge pull request !222 from shenmo/dev
2023-07-13 03:01:38 +00:00
c030bf9e6e !220 4263
Merge pull request !220 from shenmo/dev
2023-07-05 03:59:36 +00:00
9ac0c67a25 !216 4262
Merge pull request !216 from shenmo/dev
2023-04-25 14:07:41 +00:00
fd4b52e384 !214 426
Merge pull request !214 from shenmo/dev
2023-04-22 05:58:34 +00:00
db79a59fb6 !212 4251
Merge pull request !212 from shenmo/dev
2023-04-20 12:46:27 +00:00
6891fc5b87 !211 4.2.5
Merge pull request !211 from shenmo/dev
2023-04-12 05:20:09 +00:00
62f52451b7 !210 424
Merge pull request !210 from shenmo/dev
2023-03-23 06:25:48 +00:00
69 changed files with 1818 additions and 4639 deletions

1
.gitignore vendored
View File

@@ -53,4 +53,3 @@ debian/*.substvars
debian/spark-store
.vscode/*
src/spark-store

View File

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

View File

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

328
DOCS/code-analyze.md Normal file
View File

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

20
LICENSE
View File

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

83
README.md Normal file
View File

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

79
README.zh.md Normal file
View File

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

64
debian/changelog vendored
View File

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

4
debian/control vendored
View File

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

17
debian/rules vendored
View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -4,8 +4,8 @@ Type=Application
Categories=System;
Exec=spark-store %u
Icon=spark-store
Name=Spark Store(Enterprise)
Name[zh_CN]=星火应用商店(专业版)
Name=Spark Store
Name[zh_CN]=星火应用商店
Keywords=appstore;
Terminal=false
StartupNotify=true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 77 KiB

View File

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

View File

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

View File

@@ -62,6 +62,5 @@
<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,305 +0,0 @@
<?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

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

View File

@@ -1,21 +0,0 @@
#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

View File

@@ -1,147 +0,0 @@
#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);
}

View File

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

View File

@@ -5,16 +5,13 @@
#include <QtConcurrent>
#include <QStandardPaths>
#define DEFAULTURL "127.0.0.1"
#define MAXWAITTIME 200000
DownloadController::DownloadController(QObject *parent)
{
Q_UNUSED(parent)
// 初始化默认域名
domains.clear();
domains.append(DEFAULTURL);
domains.append("d.store.deepinos.org.cn");
/*
domains = {
@@ -40,8 +37,7 @@ bool checkMeatlink(QString metaUrl)
{
metaStatus.remove();
}
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());
system("curl -I -s --connect-timeout 5 " + metaUrl.toUtf8() + " -w %{http_code} |tail -n1 > /tmp/spark-store/metaStatus.txt");
if (metaStatus.open(QFile::ReadOnly) && QString(metaStatus.readAll()).toUtf8() == "200")
{
metaStatus.remove();
@@ -72,13 +68,9 @@ void gennerateDomain(QVector<QString> &domains)
}
if (domains.size() == 0)
{
domains.append(DEFAULTURL);
domains.append("d.store.deepinos.org.cn");
}
}
else
{
domains.append(DEFAULTURL);
}
}
/**
@@ -110,38 +102,34 @@ 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 aria2ConnectionTimeout = "--connect-timeout=5"; // 5 秒服务器连接超时
QString aria2MaxRetry = "--max-tries=1"; //设置最大重试次数
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";
if (useMetalink) //如果是metalink
if (useMetalink)
{
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; //下载大小记录
qint8 failDownloadTimes = 0; // 记录重试次数
const qint8 maxRetryTimes = 3; //最大重试次数
QString speedInfo = ""; //显示下载速度
QString percentInfo = ""; //显示下载进度
qint64 downloadSizeRecord = 0;
QString speedInfo = "";
QString percentInfo = "";
command.append(aria2Command.toUtf8());
command.append(downloadDir.toUtf8());
command.append(aria2Verbose.toUtf8());
@@ -149,9 +137,7 @@ void DownloadController::startDownload(const QString &url)
command.append(aria2SizePerThreads.toUtf8());
command.append(aria2ConnectionPerServer.toUtf8());
command.append(aria2ConnectionMax.toUtf8());
command.append(aria2ConnectionTimeout.toUtf8());
command.append(aria2MaxRetry.toUtf8());
command.append(aria2DNSCommand.toUtf8());
if (useMetalink)
{
command.append(aria2NoSeeds.toUtf8());
@@ -166,30 +152,11 @@ 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;
@@ -212,10 +179,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")
{
@@ -277,15 +244,6 @@ void DownloadController::stopDownload()
pidNumber = -1;
}
void DownloadController::restartDownload(QProcess &cmd, const QStringList &command)
{
cmd.terminate(); // 终止当前的下载进程
cmd.waitForFinished(); // 等待进程结束
cmd.setArguments(command); // 重新设置参数
cmd.start(); // 重新启动下载
cmd.waitForStarted(-1); // 等待启动完成
}
qint64 DownloadController::getFileSize(const QString &url)
{
// 已经无需使用 qtnetwork 再获取 filesize完全交给 aria2 来计算进度。 为保证兼容性,故保留此函数。

View File

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

View File

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

View File

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

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

@@ -16,8 +16,6 @@
#include <QtConcurrent>
#include <unistd.h>
#include <backend/ThemeChecker.h>
#define AppPageApplist 0
#define AppPageSearchlist 1
#define AppPageAppdetail 2
@@ -25,7 +23,7 @@
#define WaylandSearchCenter 1
#define OtherSearchCenter 2
#define RightSearchSpace 1
#define UploadServerUrl "https://upload.deepinos.org.cn/"
#define UploadServerUrl "https://upload.deepinos.org/"
MainWindow::MainWindow(QWidget *parent)
: BaseWidgetOpacity(parent)
@@ -41,6 +39,8 @@ MainWindow::MainWindow(QWidget *parent)
initTmpDir();
ui->appintopage->setDownloadWidget(downloadlistwidget);
emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
}
MainWindow::~MainWindow()
@@ -133,14 +133,13 @@ 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);
@@ -150,8 +149,6 @@ 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);
@@ -194,8 +191,8 @@ void MainWindow::initTitleBarMenu()
QMenu *menu = new QMenu(ui->titlebar);
menu->addAction(setting);
menu->addAction(upgrade);
//menu->addAction(actionSubmission);
//menu->addAction(actionSubmissionWithClient);
menu->addAction(actionSubmission);
menu->addAction(actionSubmissionWithClient);
ui->titlebar->setMenu(menu);
@@ -270,61 +267,57 @@ 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(ThemeChecker::instance(), &ThemeChecker::themeChanged, this, &MainWindow::refreshTheme);
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); });
// appintopage按下下载按钮时标题栏下载列表按钮抖动
connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]()

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

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

View File

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

View File

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

View File

@@ -241,7 +241,7 @@
</sizepolicy>
</property>
<property name="text">
<string>Download and Install</string>
<string>Download</string>
</property>
</widget>
</item>
@@ -608,9 +608,6 @@
<property name="text">
<string>APP Feedback</string>
</property>
<property name="flat">
<bool>false</bool>
</property>
</widget>
</item>
<item>
@@ -679,7 +676,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>485</width>
<width>482</width>
<height>601</height>
</rect>
</property>

View File

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

View File

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

View File

@@ -70,10 +70,10 @@
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>-58</x>
<y>-204</y>
<width>738</width>
<height>746</height>
<x>0</x>
<y>0</y>
<width>743</width>
<height>950</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_23">
@@ -356,7 +356,8 @@
<item>
<widget class="QLabel" name="label_10">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to this entity and its subsidiaries.&lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<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>

View File

@@ -34,8 +34,6 @@ 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 \
@@ -60,8 +58,6 @@ SOURCES += \
mainwindow-dtk.cpp
HEADERS += \
backend/DataCollectorAndUploader.h \
backend/ThemeChecker.h \
backend/downloadworker.h \
backend/image_show.h \
backend/sparkapi.h \
@@ -97,7 +93,6 @@ RESOURCES += \
TRANSLATIONS += \
../translations/spark-store_en.ts \
../translations/spark-store_es.ts \
../translations/spark-store_fr.ts \
../translations/spark-store_zh_CN.ts \
../translations/spark-store_zh_TW.ts

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -175,7 +175,7 @@ void DownloadItem::slotAsyncInstall(int t)
switch (t)
{
case 0:
installer.start("pkexec", QStringList() << "/usr/local/bin/ssinstall"
installer.start("pkexec", QStringList() << "ssinstall"
<< "/tmp/spark-store/" + ui->label_filename->text().toUtf8() << "--delete-after-install");
break;
case 1:
@@ -234,9 +234,9 @@ void DownloadItem::slotAsyncInstall(int t)
if (notRoot)
{
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."));
Utils::sendNotification("spark-store", tr("Spark Store"), tr("dpkg progress had been abortedplease check the install info or try to reinstall."));
ui->label_2->setText(tr("dpkg progress had been abortedplease check the install info or try to reinstall."));
ui->label_2->setToolTip(tr("dpkg progress had been abortedplease check the install info or try to reinstall."));
ui->pushButton_install->show();
ui->pushButton_3->hide();
}

View File

@@ -7,7 +7,20 @@
WebEnginePage::WebEnginePage(QObject *parent)
: QWebEnginePage(parent)
{
initHttpAcceptLanguage();
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;
}
}
WebEnginePage::~WebEnginePage()
@@ -34,18 +47,6 @@ 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,9 +16,6 @@ public:
protected:
QWebEnginePage *createWindow(WebWindowType type) override;
private:
void initHttpAcceptLanguage();
private slots:
void slotUrlChanged(const QUrl &url);

View File

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

View File

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

View File

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

View File

@@ -114,11 +114,7 @@ fi
# permissions.
# We need lock for non-root commands too, because we only have one download
# list file.
if [ "$IS_ACE_ENV" != "" ];then
LCK_FILE="/tmp/apt-fast-in-container.lock"
else
LCK_FILE="/tmp/apt-fast.lock"
fi
LCK_FILE="/tmp/apt-fast"
LCK_FD=99
# Set default package manager, APT cache, temporary download dir,
@@ -134,11 +130,7 @@ 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
@@ -166,7 +158,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=60 --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=600 --timeout=600 -m0'
# Load config file.
CONFFILE="/tmp/aptss-conf/apt-fast.conf"
@@ -215,15 +207,17 @@ fi
msg_already_running()
{
msg "Other aptss is running. Waited $timer senconds..." "normal"
msg "有其他的aptss正在运行。已经等待了$timer秒" "normal"
msg "apt-fast already running!" "warning"
msg "apt-fast 已经在运行了" "warning"
msg "Verify that all apt-fast processes are finished then remove $LCK_FILE.lock and try again." "hint"
msg "请确认所有的apt-fast进程已经结束然后删除 $LCK_FILE.lock 后重试." "hint"
}
# Check if a lock file exists.
#if [ -f "$LCK_FILE.lock" ]; then
# msg_already_running
# exit 1
#fi
if [ -f "$LCK_FILE.lock" ]; then
msg_already_running
exit 1
fi
# create the lock file and lock it, die on failure
@@ -235,13 +229,8 @@ _create_lock()
# This will hide the exit code
trap "cleanup_aptfast" EXIT
trap "cleanup_aptfast; exit 1" INT TERM
timer=0
until $(flock -xn $LCK_FD);do
msg_already_running
sleep 1
let timer+=1
done
unset timer
flock -n $LCK_FD || { msg_already_running; exit 1; }
}
# unlock and remove the lock file

View File

@@ -1,7 +1,5 @@
#!/bin/bash
SPARK_DOWNLOAD_SERVER_URL="http://127.0.0.1:8000"
SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL="127.0.0.1:8000"
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell
@@ -14,10 +12,6 @@ case `arch` in
STORE_URL="aarch64-store"
STORE_LIST_URL="-aarch64"
;;
loongarch64)
STORE_URL="loong64-store"
STORE_LIST_URL="-loong64"
;;
esac
SS_APT_FAST="/opt/durapps/spark-store/bin/apt-fast/ss-apt-fast"
@@ -46,22 +40,22 @@ if [ ! -e "/tmp/aptss-conf/apt-fast.conf" ];then
mkdir -p /tmp/aptss-conf/
echo -e "\e[1;32m${TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST}\e[0m"
echo
curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "${SPARK_DOWNLOAD_SERVER_URL}/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/aptss/lists/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${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
if [ ! -e "/var/lib/aptss/lists/d.spark-app.store_${STORE_URL}_Packages" ] && [ ! -e "/var/lib/aptss/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages" ] && [ ! -e "/var/lib/aptss/lists/mirrors.sdu.edu.cn_spark-store-repository_${STORE_URL}_Packages" ];then
mkdir -p /tmp/aptss-conf/
echo -e "\e[1;32m${TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST}\e[0m"
echo
curl --silent -o /tmp/aptss-conf/apt-fast.conf "${SPARK_DOWNLOAD_SERVER_URL}/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
curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "${SPARK_DOWNLOAD_SERVER_URL}/sparkstore${STORE_LIST_URL}.list"
/usr/bin/apt update -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://d.store.deepinos.org.cn/sparkstore${STORE_LIST_URL}.list"
apt update -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
#只更新星火源
@@ -82,7 +76,6 @@ if [ "$1" = "install" ] || [ "$1" = "upgrade" ] || [ "$1" = "full-upgrade" ] ;
ret="$?"
if [ "$ret" -ne 0 ];then
echo -e "\e[1;33m$TRANSHELL_CONTENT_PLEASE_USE_APTSS_INSTEAD_OF_APT\e[0m"
exit $ret
fi
@@ -98,35 +91,35 @@ elif [ "$1" = "policy" ] || [ "$1" = "search" ];then
###执行
/usr/bin/apt "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
apt "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
elif [ "$1" = "ssupdate" ];then
mkdir -p /tmp/aptss-conf/
echo -e "\e[1;32m${TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST}\e[0m"
echo
curl --silent -o /tmp/aptss-conf/apt-fast.conf "${SPARK_DOWNLOAD_SERVER_URL}/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
curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "${SPARK_DOWNLOAD_SERVER_URL}/sparkstore${STORE_LIST_URL}.list"
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"
/usr/bin/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"
apt update -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" -o Dir::Etc::sourcelist="/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list"
#只更新星火源
elif [ "$1" = "update" ];then
echo -e "\e[1;32m${TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST}\e[0m"
echo
curl --progress-bar -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "${SPARK_DOWNLOAD_SERVER_URL}/sparkstore${STORE_LIST_URL}.list"
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 "${SPARK_DOWNLOAD_SERVER_URL}/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
### 额外一份拿来给aptss自动补全用
/usr/bin/apt "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
apt "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
else
/usr/bin/apt "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
apt "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
fi

View File

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

View File

@@ -1,5 +1,4 @@
#!/bin/bash
SPARK_CORE_SERVER_URL="http://127.0.0.1:38324"
#用法sender.sh 下载链接 HD70642
@@ -10,9 +9,6 @@ case `arch` in
aarch64)
STORE_URL="aarch64-store"
;;
loongarch64)
STORE_URL="loong64-store"
;;
esac
if [ -z $1 ] || [ "$2" != "HD70642" ];then
@@ -45,7 +41,7 @@ fi
echo $STORE_URL/$APP_LOCATION
curl -X POST -H "Content-Type: application/json" -d '{"path": "'"${STORE_URL}/${APP_LOCATION}"'"}' ${SPARK_CORE_SERVER_URL}/handle_post
curl -X POST -H "Content-Type: application/json" -d '{"path": "'"${STORE_URL}/${APP_LOCATION}"'"}' http://zunyun01.store.deepinos.org.cn:38324/handle_post

View File

@@ -1,148 +1,50 @@
#!/bin/bash
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug
case $(arch) in
x86_64)
STORE_URL="store"
;;
aarch64)
STORE_URL="aarch64-store"
;;
esac
echo "Spark Store Install script. 星火商店审核脚本"
function pkexec_as_current_user() {
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
chmod +x $desktop_file_path
sudo -u "$user" cp "$desktop_file_path" "$(sudo -u "$user" xdg-user-dir DESKTOP)/"
fi
done
echo "Spark Store Audit script.星火商店审核脚本"
}
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
#################检测文件是否存在
if [ $# -eq 0 ];then
echo "没有接收到参数,退出"
echo "用法:$0 deb路径"
exit
fi
if [ ! -f "$1" ]; then
echo "${TRANSHELL_CONTENT_FILE_NOT_EXIST}"
echo "OMG-IT-GOES-WRONG"
exit 1
if [ ! -f "$1" ]
then
echo "文件不存在"
exit 1
fi
if [ "$(id -u)" != "0" ]; then
echo "${TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT}"
echo "OMG-IT-GOES-WRONG"
exit 1
if [ "$(id -u)" != "0" ];then
#############################无root权限时
echo "请使用root启动ssaudit"
exit 1
fi
DEBPATH=$(realpath "$1")
###
DEBPATH=`realpath $1`
echo ------------------------------------------------------------
try_run_output=$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh test-install-app "$DEBPATH")
try_run_ret="$?"
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
aptss update
try_run_output=$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh test-install-app "$DEBPATH")
try_run_ret="$?"
fi
if [ "$try_run_ret" -ne 0 ]
then
echo "OMG-IT-GOES-WRONG"
echo -e "${try_run_output}"
exit "$try_run_ret"
fi
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
dpkg -i "$DEBPATH" || aptss install -yf
install_ret="$?"
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
if [ "$install_ret" -ne 0 ]
then
echo "OMG-IT-GOES-WRONG"
exit "$install_ret"
fi
echo ---------------安装结束---------------

View File

@@ -1,171 +1,167 @@
#!/bin/bash
SPARK_DOWNLOAD_SERVER_URL="http://127.0.0.1:8000"
SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL="127.0.0.1:8000"
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
load_transhell_debug
case $(arch) in
case `arch` in
x86_64)
STORE_URL="store"
;;
aarch64)
STORE_URL="aarch64-store"
;;
loongarch64)
STORE_URL="loong64-store"
STORE_LIST_URL="-loong64"
;;
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
chmod +x $desktop_file_path
sudo -u "$user" cp "$desktop_file_path" "$(sudo -u "$user" xdg-user-dir DESKTOP)/"
fi
done
#Detect the user using such display
local user=$(who | awk '{print $1}' | head -n 1)
#Detect the id of the user
local uid=$(id -u $user)
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus pkexec "$@"
}
function zenity() {
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 zenity()
{
#Detect the user using such display
local user=$(who | awk '{print $1}' | head -n 1)
#Detect the id of the user
local uid=$(id -u $user)
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus zenity "$@"
}
function hash_check() {
if [ ! -e "/var/lib/aptss/lists/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${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/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${STORE_URL}_Packages" ]; then
PACKAGES_DATA_PATH="/var/lib/aptss/lists/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${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是d域名单目录仓库配置"
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)
unset IS_SHA512SUM_CHECKED
IS_SHA512SUM_CHECKED=$(cat "$PACKAGES_DATA_PATH" | grep "$DEB_SHA512SUM")
}
####################################
if [ $# -eq 0 ]; then
echo "没有接收到参数,退出"
echo "用法:$0 deb路径"
echo "OMG-IT-GOES-WRONG"
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 [ ! -f "$1" ]; then
echo "${TRANSHELL_CONTENT_FILE_NOT_EXIST}"
echo "OMG-IT-GOES-WRONG"
exit 1
### 选择包信息位置
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
if [ "$(id -u)" != "0" ]; then
echo "${TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT}"
echo "OMG-IT-GOES-WRONG"
exit 1
echo "正在运行包验证..."
echo "Running Spark Package Verify..."
DEB_SHA512SUM=$(sha512sum "$1" | cut -d ' ' -f 1)
IS_SHA512SUM_CHECKD=`cat $PACKAGES_DATA_PATH | grep $DEB_SHA512SUM`
}
##########################################################################
#################检测文件是否存在
if [ $# -eq 0 ];then
echo "没有接收到参数,退出"
echo "用法:$0 deb路径"
echo "OMG-IT-GOES-WRONG"
exit
fi
DEBPATH=$(realpath "$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 "${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
if [ -z "$IS_SHA512SUM_CHECKD" ];then
echo "尝试更新仓库信息重新校验"
aptss ssupdate
hash_check "$DEBPATH"
fi
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 [ ! -z "$IS_SHA512SUM_CHECKD" ];then
if [ "$try_run_ret" -ne 0 ]; then
aptss update
try_run_output=$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh test-install-app "$DEBPATH")
try_run_ret="$?"
fi
if [ "$try_run_ret" -ne 0 ]; then
echo "OMG-IT-GOES-WRONG"
echo -e "${try_run_output}"
exit "$try_run_ret"
fi
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="$?"
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
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
dpkg -i "$DEBPATH" || aptss install -yf
#### --delete
if [ "$?" = "0" ] && [ "$2" = "--delete-after-install" ];then
##check if is installed yet
if dpkg -s "$package_name" >/dev/null 2>&1; then
echo "软件包安装:$package_name"
rm "$DEBPATH"
echo "${TRANSHELL_CONTENT_DEB_IS_DELETED}"
else
echo "软件包未安装:$package_name"
echo "安装异常!抛出错误"
echo "OMG-IT-GOES-WRONG"
fi
else
echo "${TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB}"
if dpkg -s "$package_name" >/dev/null 2>&1; then
echo "软件包已安装:$package_name"
else
echo "软件包未安装:$package_name"
echo "安装异常!抛出错误"
echo "OMG-IT-GOES-WRONG"
fi
fi
else
zenity --info --icon-name=spark-store --height 270 --width 500 --text "${TRANSHELL_CONTENT_HASH_CHECK_FAILED}"
echo -e ${TRANSHELL_CONTENT_HASH_CHECK_FAILED}
echo "OMG-IT-GOES-WRONG"
fi

View File

@@ -1,2 +0,0 @@
#!/bin/bash
dpkg -l | grep "^ii" | grep -w "$1" > /dev/null

View File

@@ -1,17 +1,14 @@
#!/bin/bash
case $1 in
ssupdate)
if [ "$(id -u)" != "0" ] ; then
pkexec "$0" "$@"
exit
fi
case $1 in
ssupdate)
aptss ssupdate 2>&1 | tee /tmp/spark-store-app-ssupdate-log.txt
IS_SSUPDATE_ERROR=`cat /tmp/spark-store-app-ssupdate-log.txt | grep "E: "`
echo "$IS_SSUPDATE_ERROR" > /tmp/spark-store-app-ssupdate-status.txt
chmod 777 /tmp/spark-store-app-ssupdate-status.txt
chmod 777 /tmp/spark-store-app-ssupdate-log.txt
;;
upgradable-list)
@@ -31,21 +28,11 @@ fi
;;
upgrade-app)
if [ "$(id -u)" != "0" ] ; then
pkexec "$0" "$@"
exit
fi
aptss install "${@:2}" --only-upgrade 2>&1 | tee /tmp/spark-store-app-upgrade-log.txt
chmod 777 /tmp/spark-store-app-upgrade-log.txt
IS_UPGRADE_ERROR=`cat /tmp/spark-store-app-upgrade-log.txt | grep "Package manager quit with exit code."`
echo "$IS_UPGRADE_ERROR" > /tmp/spark-store-app-upgrade-status.txt
;;
test-install-app)
if [ "$(id -u)" != "0" ] ; then
pkexec "$0" "$@"
exit
fi
try_run_output=$(aptss --dry-run install $2)
try_run_ret="$?"
@@ -76,7 +63,6 @@ fi
;;
clean-log)
rm -f /tmp/spark-store-app-ssupdate-status.txt /tmp/spark-store-app-ssupdate-log.txt /tmp/spark-store-app-upgrade-log.txt /tmp/spark-store-app-upgrade-status.txt
rm -f /tmp/spark-store-app-ssupdate-status.txt /tmp/spark-store-app-ssupdate-log.txt /tmp/spark-store-app-upgrade-log.txt /tmp/spark-store-app-upgrade-status.txt
;;
esac

View File

@@ -3,63 +3,24 @@
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
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh ssupdate | zenity --progress --auto-close --pulsate --no-cancel --text="${TRANSHELL_CONTENT_UPDATE_CHEKING_PLEASE_WAIT}" --height 70 --width 400 --title="${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
if [ -z `cat /tmp/spark-store-app-ssupdate-status.txt` ] ; then
/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
else
zenity --error --text "${TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
zenity --text-info --filename=/tmp/spark-store-app-ssupdate-log.txt --checkbox="${TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK}" --title="${TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log
rm -f /tmp/spark-store/upgradeStatus.txt
exit
fi
# 获取可更新应用列表
PKG_LIST="$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgradable-list)"
PKG_LIST="$(pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgradable-list)"
## 如果没更新,就弹出不需要更新
if [ -z "$PKG_LIST" ] ; then
zenity --info --text "${TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
@@ -69,7 +30,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}')
@@ -78,23 +39,20 @@ 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 "$APP_NAME"
echo "$PKG_NAME"
echo "$PKG_NEW_VER"
echo "$PKG_CUR_VER"
echo "$PKG_NAME"
else
echo "false"
echo "$APP_NAME${TRANSHELL_CONTENT_CAN_NOT_UPGRADE_FOR_BEING_HOLD}"
echo "$PKG_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"
@@ -103,14 +61,13 @@ 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_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)
PKG_UPGRADE_LIST=$(echo "$PKG_UPGRADE_LIST" | zenity --list --text="${TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE}" --column="${TRANSHELL_CONTENT_CHOOSE}" --column="${TRANSHELL_CONTENT_PKG_NAME}" --column="${TRANSHELL_CONTENT_NEW_VERSION}" --column="${TRANSHELL_CONTENT_UPGRADE_FROM}" --separator=" " --checklist --multiple --print-column=2 --height 350 --width 550 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg)
## 如果没有选择,则直接退出
if [ -z "$PKG_UPGRADE_LIST" ] ; then
zenity --info --text "${TRANSHELL_CONTENT_NO_APP_IS_CHOSEN}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg
else
### 更新用户选择的应用
for PKG_UPGRADE in $PKG_UPGRADE_LIST;do
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

@@ -15,16 +15,9 @@ 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 "${CONTENT_SET_CREATE_DESKTOP}" 2 "${TRANSHELL_CONTENT_CHECK_FOR_UPDATE}" 3 "${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 "${TRANSHELL_CONTENT_CHECK_FOR_UPDATE}" 2 "${TRANSHELL_CONTENT_EXIT}" --hide-column=1 --print-column=1`
case $option in
0)
@@ -37,21 +30,12 @@ case $option in
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
;;
3)
2)
exit 0
;;
*)

View File

@@ -4,15 +4,14 @@ 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."
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_APP_NAME="APP name"
TRANSHELL_CONTENT_PKG_NAME="Package Name"
TRANSHELL_CONTENT_PKG_NAME="Pkg name"
TRANSHELL_CONTENT_NEW_VERSION="New version"
TRANSHELL_CONTENT_UPGRADE_FROM="Upgrade from"
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="No app is chosen"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="Upgrading $APP_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 $PKG_UPGRADE , please wait..."
TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED="The chosen app is upgraded"
TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="Error occured when upgrading! Press Confirm to get the error log (Can be useful when feedback)"

View File

@@ -4,15 +4,14 @@ TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL="星火商店更新模块"
TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="检查更新进程出现错误!按确定查看报错,可用于反馈"
TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK="我已复制了此文本框中的日志,且将会在反馈时附上。反馈渠道可以在右上角菜单的设置中找到"
TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS="反馈渠道在商店右上角的设置里"
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="没有软件需要更新"
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="没有选中任何软件"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="正在更新 $APP_UPGRADE ,请稍候..."
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="没有选中任何软件\n但是你并没有站在世界之巅"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="正在更新 $PKG_UPGRADE ,请稍候..."
TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED="选中的软件已经更新完毕"
TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="更新出现错误!按确定查看报错,可用于反馈"

View File

@@ -4,15 +4,14 @@ TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL="星火商店更新模塊"
TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="檢查更新行程出現錯誤! 按確定查看報錯,可用於回報"
TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK="我已複製了此文字方塊中的日誌,且將會在回報時附上。 迴響通路可以在右上角選單的設定中找到 "
TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS="回報入口在商店右上角的設定裏"
TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE="沒有軟體需要更新"
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="没有选中任何軟體"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="正在更新 $APP_UPGRADE ,请稍候..."
TRANSHELL_CONTENT_NO_APP_IS_CHOSEN="没有选中任何軟體\n但是你並沒有站在世界之巔"
TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT="正在更新 $PKG_UPGRADE ,请稍候..."
TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED="选中的軟體已经更新完毕"
TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK="更新出现错误!按确定查看报错,可用于反馈"

View File

@@ -10,5 +10,3 @@ 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

@@ -1,14 +1,12 @@
#!/bin/bash
TRANSHELL_CONTENT_CLOSE="Disable"
TRANSHELL_CONTENT_OPEN="Enable"
TRANSHELL_CONTENT_CLOSE="Close"
TRANSHELL_CONTENT_OPEN="Open"
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="Disabled"
TRANSHELL_CONTENT_CLOSED="Closed"
TRANSHELL_CONTENT_OPENING_UPGRADE_CHECK="Please authorize to open APP upgrade check"
TRANSHELL_CONTENT_OPENED="Enabled"
TRANSHELL_CONTENT_CLOSE_CREATE_DESKTOP="Disable auto create desktop shortcut"
TRANSHELL_CONTENT_OPEN_CREATE_DESKTOP="Enable auto create desktop shortcut"
TRANSHELL_CONTENT_OPENED="Opened"

View File

@@ -10,5 +10,3 @@ 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,6 +8,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="175"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="483"/>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
@@ -110,29 +118,20 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="768"/>
<location filename="../src/pages/appintopage.ui" line="765"/>
<source>Introduction</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1071"/>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="906"/>
<location filename="../src/pages/appintopage.ui" line="903"/>
<source>Screen capture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="192"/>
<location filename="../src/pages/appintopage.cpp" line="330"/>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="518"/>
<source>Download and Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
@@ -146,109 +145,109 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1164"/>
<location filename="../src/pages/appintopage.ui" line="1161"/>
<source>Update</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1193"/>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<source>Contributor</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1200"/>
<location filename="../src/pages/appintopage.ui" line="1197"/>
<source>Pkgname</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1306"/>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<source>Author</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1342"/>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<source>Size</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1378"/>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<source>Website</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="53"/>
<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="126"/>
<location filename="../src/pages/appintopage.cpp" line="114"/>
<source>Developer Mode Disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="177"/>
<location filename="../src/pages/appintopage.cpp" line="357"/>
<location filename="../src/pages/appintopage.cpp" line="490"/>
<location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="456"/>
<source>Reinstall</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="184"/>
<location filename="../src/pages/appintopage.cpp" line="167"/>
<source>Upgrade</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="335"/>
<location filename="../src/pages/appintopage.cpp" line="466"/>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<source>Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="340"/>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<source>Installing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<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="449"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<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="453"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<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="457"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<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="521"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<source>Uninstall succeeded</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<source>The URL has been copied to the clipboard</source>
<translation type="unfinished"></translation>
</message>
@@ -269,24 +268,16 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="142"/>
<location filename="../src/application.cpp" line="139"/>
<source>Version: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="152"/>
<location filename="../src/application.cpp" line="149"/>
<source>%1 is released under %2</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DownloadController</name>
<message>
<location filename="../src/backend/downloadworker.cpp" line="180"/>
<source>Download Failed, please retry :(</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
@@ -375,7 +366,7 @@
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="238"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="239"/>
<source>dpkg progress had been aborted, please check the install info or try to reinstall.</source>
<source>dpkg progress had been abortedplease check the install info or try to reinstall.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -481,33 +472,33 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<location filename="../src/mainwindow-dtk.cpp" line="187"/>
<source>Submit App</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="191"/>
<location filename="../src/mainwindow-dtk.cpp" line="188"/>
<source>Submit App with client(Recommanded)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="192"/>
<location filename="../src/mainwindow-dtk.cpp" line="189"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="193"/>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<source>APP Upgrade and Install Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="147"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<location filename="../src/mainwindow-dtk.cpp" line="146"/>
<location filename="../src/mainwindow-dtk.cpp" line="241"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<location filename="../src/mainwindow-dtk.cpp" line="151"/>
<source>Search or enter spk://</source>
<translation type="unfinished"></translation>
</message>
@@ -515,19 +506,19 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="36"/>
<location filename="../src/application.cpp" line="37"/>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<location filename="../src/mainwindow-dtk.cpp" line="126"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="41"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;Professional application distribution solution&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Flamescion (Shenyang) Computer Software Development Co., Ltd.&lt;/span&gt;</source>
<location filename="../src/application.cpp" line="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="149"/>
<location filename="../src/application.cpp" line="146"/>
<source>Spark Project</source>
<translation type="unfinished"></translation>
</message>
@@ -537,7 +528,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<source>Show MainWindow</source>
<translation type="unfinished"></translation>
</message>
@@ -636,21 +627,22 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="359"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to this entity and its subsidiaries.&lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<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="214"/>
<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="236"/>
<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="236"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Temporary cache was cleaned</source>
<translation type="unfinished"></translation>
</message>
@@ -658,12 +650,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<location filename="../src/mainwindow-dtk.cpp" line="245"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<location filename="../src/mainwindow-dtk.cpp" line="246"/>
<source>Exit</source>
<translation type="unfinished"></translation>
</message>

View File

@@ -8,6 +8,14 @@
<source>Form</source>
<translation>Tipo</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="175"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="483"/>
<source>Download</source>
<translation>Descargar</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
@@ -110,29 +118,20 @@
<translation>Comentarios de la app</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="768"/>
<location filename="../src/pages/appintopage.ui" line="765"/>
<source>Introduction</source>
<translation>Introducción</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1071"/>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<source>Description</source>
<translation>Descripción</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="906"/>
<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="192"/>
<location filename="../src/pages/appintopage.cpp" line="330"/>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="518"/>
<source>Download and Install</source>
<translation>Descargar e instalar</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
@@ -146,109 +145,109 @@
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;La aplicación wine. Spark Store configurará automáticamente el kit Wine para usted&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1164"/>
<location filename="../src/pages/appintopage.ui" line="1161"/>
<source>Update</source>
<translation>Modernizar</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1193"/>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<source>Contributor</source>
<translation>Contribuyentes</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1200"/>
<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="1306"/>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<source>Author</source>
<translation>Autor</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1342"/>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<source>Size</source>
<translation>Tamaño</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1378"/>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<source>Website</source>
<translation>Sitio web</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="53"/>
<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="126"/>
<location filename="../src/pages/appintopage.cpp" line="114"/>
<source>Developer Mode Disabled</source>
<translation>Se ha desactivado el modo desarrollador</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="177"/>
<location filename="../src/pages/appintopage.cpp" line="357"/>
<location filename="../src/pages/appintopage.cpp" line="490"/>
<location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="456"/>
<source>Reinstall</source>
<translation>Reinstalación</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="184"/>
<location filename="../src/pages/appintopage.cpp" line="167"/>
<source>Upgrade</source>
<translation>Actualización</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="335"/>
<location filename="../src/pages/appintopage.cpp" line="466"/>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<source>Install</source>
<translation>Instalación</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="340"/>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<source>Installing</source>
<translation>Se está instalando</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<source>Warning</source>
<translation type="unfinished"></translation>
<translation>Aviso</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<source>The current application does not support deepin, there may be problems</source>
<translation type="unfinished"></translation>
<translation>La aplicación actual no admite deepin, puede haber problemas</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<source>The current application does not support UOS, there may be problems</source>
<translation type="unfinished"></translation>
<translation>La aplicación actual no admite uos, puede haber problemas</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<source>The current application does not support Ubuntu, there may be problems</source>
<translation type="unfinished"></translation>
<translation>La aplicación actual no admite ubuntu, puede haber problemas</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<source>The current application does not support current platform, there may be problems</source>
<translation type="unfinished"></translation>
<translation>La aplicación actual no admite la Plataforma actual, puede haber problemas</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<source>Spark Store</source>
<translation>SPARK Store</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<source>Uninstall succeeded</source>
<translation>Desinstalación exitosa</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<source>The URL has been copied to the clipboard</source>
<translation>La URL ha sido copiada al portapapeles</translation>
</message>
@@ -269,24 +268,16 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="142"/>
<location filename="../src/application.cpp" line="139"/>
<source>Version: %1</source>
<translation>Versión %1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="152"/>
<location filename="../src/application.cpp" line="149"/>
<source>%1 is released under %2</source>
<translation>%1 publicado bajo %2</translation>
</message>
</context>
<context>
<name>DownloadController</name>
<message>
<location filename="../src/backend/downloadworker.cpp" line="180"/>
<source>Download Failed, please retry :(</source>
<translation>Descarga fall, por favor vuelva a intentarlo</translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
@@ -375,8 +366,8 @@
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="238"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="239"/>
<source>dpkg progress had been 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>
<source>dpkg progress had been abortedplease check the install info or try to reinstall.</source>
<translation>El proceso dpkg ha sido abortado, verifique la información de instalación o intente reinstalarlo.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
@@ -481,33 +472,33 @@
<translation>Actualización de app</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<location filename="../src/mainwindow-dtk.cpp" line="187"/>
<source>Submit App</source>
<translation>Presentación de la aplicación</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="191"/>
<location filename="../src/mainwindow-dtk.cpp" line="188"/>
<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"/>
<location filename="../src/mainwindow-dtk.cpp" line="189"/>
<source>Settings</source>
<translation>Configuración</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="193"/>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<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"/>
<location filename="../src/mainwindow-dtk.cpp" line="146"/>
<location filename="../src/mainwindow-dtk.cpp" line="241"/>
<source>Spark Store</source>
<translation>SPARK Store</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<location filename="../src/mainwindow-dtk.cpp" line="151"/>
<source>Search or enter spk://</source>
<translation>Buscar o introducir spk: /%</translation>
</message>
@@ -515,23 +506,19 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="36"/>
<location filename="../src/application.cpp" line="37"/>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<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;Professional application distribution solution&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Flamescion (Shenyang) Computer Software Development Co., Ltd.&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="vanished">&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</translation>
<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"/>
<location filename="../src/application.cpp" line="146"/>
<source>Spark Project</source>
<translation>Proyecto spark</translation>
</message>
@@ -541,7 +528,7 @@
<translation>Descargar lista</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<source>Show MainWindow</source>
<translation>Mostrar la ventana principal</translation>
</message>
@@ -640,21 +627,22 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="359"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to this entity and its subsidiaries.&lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<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="214"/>
<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="236"/>
<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="236"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Temporary cache was cleaned</source>
<translation>Se ha limpiado la caché temporal</translation>
</message>
@@ -662,12 +650,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<location filename="../src/mainwindow-dtk.cpp" line="245"/>
<source>About</source>
<translation>Sobre</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<location filename="../src/mainwindow-dtk.cpp" line="246"/>
<source>Exit</source>
<translation>Exportaciones</translation>
</message>

View File

@@ -8,6 +8,14 @@
<source>Form</source>
<translation>Type</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="175"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="483"/>
<source>Download</source>
<translation>Télécharger</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
@@ -110,29 +118,20 @@
<translation>App feedback</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="768"/>
<location filename="../src/pages/appintopage.ui" line="765"/>
<source>Introduction</source>
<translation>Présentation</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1071"/>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<source>Description</source>
<translation>Description</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="906"/>
<location filename="../src/pages/appintopage.ui" line="903"/>
<source>Screen capture</source>
<translation>Captures d&apos;écran</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="192"/>
<location filename="../src/pages/appintopage.cpp" line="330"/>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="518"/>
<source>Download and Install</source>
<translation>Télécharger et installer</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
@@ -146,109 +145,109 @@
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;L&apos;application wine. Spark Store configure automatiquement le kit Wine pour vous&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1164"/>
<location filename="../src/pages/appintopage.ui" line="1161"/>
<source>Update</source>
<translation>Moderniser</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1193"/>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<source>Contributor</source>
<translation>Contributeurs</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1200"/>
<location filename="../src/pages/appintopage.ui" line="1197"/>
<source>Pkgname</source>
<translation>Nom de l&apos;emballage</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1306"/>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<source>Author</source>
<translation>Auteur</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1342"/>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<source>Size</source>
<translation>Taille</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1378"/>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<source>Website</source>
<translation>Site Web</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="53"/>
<location filename="../src/pages/appintopage.cpp" line="51"/>
<source>Click Open</source>
<translation>Cliquez sur Ouvrir</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="126"/>
<location filename="../src/pages/appintopage.cpp" line="114"/>
<source>Developer Mode Disabled</source>
<translation>Mode développeur désactivé</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="177"/>
<location filename="../src/pages/appintopage.cpp" line="357"/>
<location filename="../src/pages/appintopage.cpp" line="490"/>
<location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="456"/>
<source>Reinstall</source>
<translation>Réinstaller</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="184"/>
<location filename="../src/pages/appintopage.cpp" line="167"/>
<source>Upgrade</source>
<translation>Mise à niveau</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="335"/>
<location filename="../src/pages/appintopage.cpp" line="466"/>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<source>Install</source>
<translation>Installation</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="340"/>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<source>Installing</source>
<translation>Installation en cours</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<source>Warning</source>
<translation type="unfinished"></translation>
<translation>Avertissement</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<source>The current application does not support deepin, there may be problems</source>
<translation type="unfinished"></translation>
<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="449"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<source>The current application does not support UOS, there may be problems</source>
<translation type="unfinished"></translation>
<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="453"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<source>The current application does not support Ubuntu, there may be problems</source>
<translation type="unfinished"></translation>
<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="457"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<source>The current application does not support current platform, there may be problems</source>
<translation type="unfinished"></translation>
<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="521"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<source>Spark Store</source>
<translation>Le Spark store</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<source>Uninstall succeeded</source>
<translation>Désinstallation réussie</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<source>The URL has been copied to the clipboard</source>
<translation>L&apos;URL a é copiée dans le presse - papiers</translation>
</message>
@@ -269,24 +268,16 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="142"/>
<location filename="../src/application.cpp" line="139"/>
<source>Version: %1</source>
<translation>Version: %1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="152"/>
<location filename="../src/application.cpp" line="149"/>
<source>%1 is released under %2</source>
<translation>%1 publié sous %2</translation>
</message>
</context>
<context>
<name>DownloadController</name>
<message>
<location filename="../src/backend/downloadworker.cpp" line="180"/>
<source>Download Failed, please retry :(</source>
<translation>Le téléchargement a échoué, veuillez réessayer</translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
@@ -375,8 +366,8 @@
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="238"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="239"/>
<source>dpkg progress had been 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>
<source>dpkg progress had been abortedplease check the install info or try to reinstall.</source>
<translation>Le processus dpkg a é abandonné, vérifiez les informations d&apos;installation ou essayez de le réinstaller.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
@@ -481,33 +472,33 @@
<translation>Mise à niveau app</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<location filename="../src/mainwindow-dtk.cpp" line="187"/>
<source>Submit App</source>
<translation>Soumettre une application</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="191"/>
<location filename="../src/mainwindow-dtk.cpp" line="188"/>
<source>Submit App with client(Recommanded)</source>
<translation>Soumettre une demande au client (recommandé)</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="192"/>
<location filename="../src/mainwindow-dtk.cpp" line="189"/>
<source>Settings</source>
<translation>Paramètres</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="193"/>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<source>APP Upgrade and Install Settings</source>
<translation>Paramètres de mise à niveau et d&apos;installation de l&apos;app</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="147"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<location filename="../src/mainwindow-dtk.cpp" line="146"/>
<location filename="../src/mainwindow-dtk.cpp" line="241"/>
<source>Spark Store</source>
<translation>Le Spark store</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<location filename="../src/mainwindow-dtk.cpp" line="151"/>
<source>Search or enter spk://</source>
<translation>Rechercher ou entrer SPK /</translation>
</message>
@@ -515,23 +506,19 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="36"/>
<location filename="../src/application.cpp" line="37"/>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<location filename="../src/mainwindow-dtk.cpp" line="126"/>
<source>Spark Store</source>
<translation>Le Spark store</translation>
</message>
<message>
<location filename="../src/application.cpp" line="41"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;Professional application distribution solution&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Flamescion (Shenyang) Computer Software Development Co., Ltd.&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="vanished">&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</translation>
<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"/>
<location filename="../src/application.cpp" line="146"/>
<source>Spark Project</source>
<translation>Le projet Spark</translation>
</message>
@@ -541,7 +528,7 @@
<translation>Télécharger la Liste</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<source>Show MainWindow</source>
<translation>Afficher la fenêtre principale</translation>
</message>
@@ -640,21 +627,22 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="359"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to this entity and its subsidiaries.&lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<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="214"/>
<location filename="../src/pages/settingspage.cpp" line="217"/>
<source>Updating, please wait...</source>
<translation>Mise à jour en cours, veuillez patienter...</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Spark Store</source>
<translation>Le Spark store</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Temporary cache was cleaned</source>
<translation>Cache temporaire nettoyé</translation>
</message>
@@ -662,12 +650,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<location filename="../src/mainwindow-dtk.cpp" line="245"/>
<source>About</source>
<translation>À propos</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<location filename="../src/mainwindow-dtk.cpp" line="246"/>
<source>Exit</source>
<translation>Exportations</translation>
</message>

View File

@@ -8,6 +8,14 @@
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="175"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="483"/>
<source>Download</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
@@ -110,24 +118,15 @@
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1071"/>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<source>Description</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="906"/>
<location filename="../src/pages/appintopage.ui" line="903"/>
<source>Screen capture</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="192"/>
<location filename="../src/pages/appintopage.cpp" line="330"/>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="518"/>
<source>Download and Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
@@ -141,114 +140,114 @@
<translation> Wine wine环境</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="768"/>
<location filename="../src/pages/appintopage.ui" line="765"/>
<source>Introduction</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1164"/>
<location filename="../src/pages/appintopage.ui" line="1161"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1193"/>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<source>Contributor</source>
<translation>稿</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1200"/>
<location filename="../src/pages/appintopage.ui" line="1197"/>
<source>Pkgname</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1306"/>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<source>Author</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1342"/>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<source>Size</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1378"/>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<source>Website</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="53"/>
<location filename="../src/pages/appintopage.cpp" line="51"/>
<source>Click Open</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="126"/>
<location filename="../src/pages/appintopage.cpp" line="114"/>
<source>Developer Mode Disabled</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="177"/>
<location filename="../src/pages/appintopage.cpp" line="357"/>
<location filename="../src/pages/appintopage.cpp" line="490"/>
<location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="456"/>
<source>Reinstall</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="184"/>
<location filename="../src/pages/appintopage.cpp" line="167"/>
<source>Upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="335"/>
<location filename="../src/pages/appintopage.cpp" line="466"/>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<source>Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="340"/>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<source>Warning</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<source>The current application does not support deepin, there may be problems</source>
<translation type="unfinished"></translation>
<translation>deepin</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<source>The current application does not support UOS, there may be problems</source>
<translation type="unfinished"></translation>
<translation>UOS</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<source>The current application does not support Ubuntu, there may be problems</source>
<translation type="unfinished"></translation>
<translation>Ubuntu</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<source>The current application does not support current platform, there may be problems</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<source>Uninstall succeeded</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<source>The URL has been copied to the clipboard</source>
<translation></translation>
</message>
@@ -269,24 +268,16 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="142"/>
<location filename="../src/application.cpp" line="139"/>
<source>Version: %1</source>
<translation>%1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="152"/>
<location filename="../src/application.cpp" line="149"/>
<source>%1 is released under %2</source>
<translation>%1%2</translation>
</message>
</context>
<context>
<name>DownloadController</name>
<message>
<location filename="../src/backend/downloadworker.cpp" line="180"/>
<source>Download Failed, please retry :(</source>
<translation></translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
@@ -369,14 +360,14 @@
<location filename="../src/widgets/common/downloaditem.cpp" line="230"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="231"/>
<source>Error happened in dpkg progress , please check the install info or try to reinstall.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="238"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="239"/>
<source>dpkg progress had been aborted, please check the install info or try to reinstall.</source>
<translation></translation>
<source>dpkg progress had been abortedplease check the install info or try to reinstall.</source>
<translation>dpkg出现错误</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
@@ -481,33 +472,33 @@
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<location filename="../src/mainwindow-dtk.cpp" line="187"/>
<source>Submit App</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="191"/>
<location filename="../src/mainwindow-dtk.cpp" line="188"/>
<source>Submit App with client(Recommanded)</source>
<translation>使稿</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="192"/>
<location filename="../src/mainwindow-dtk.cpp" line="189"/>
<source>Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="193"/>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<source>APP Upgrade and Install Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="147"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<location filename="../src/mainwindow-dtk.cpp" line="146"/>
<location filename="../src/mainwindow-dtk.cpp" line="241"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<location filename="../src/mainwindow-dtk.cpp" line="151"/>
<source>Search or enter spk://</source>
<translation></translation>
</message>
@@ -515,23 +506,19 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="36"/>
<location filename="../src/application.cpp" line="37"/>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<location filename="../src/mainwindow-dtk.cpp" line="126"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/application.cpp" line="41"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;Professional application distribution solution&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Flamescion (Shenyang) Computer Software Development Co., Ltd.&lt;/span&gt;</source>
<translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;火穗(沈阳)计算机软件开发有限公司 &lt;/span&gt;</translation>
</message>
<message>
<location filename="../src/application.cpp" line="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="vanished">&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation>
<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="149"/>
<location filename="../src/application.cpp" line="146"/>
<source>Spark Project</source>
<translation></translation>
</message>
@@ -541,7 +528,7 @@
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<source>Show MainWindow</source>
<translation></translation>
</message>
@@ -640,25 +627,22 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="359"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to this entity and its subsidiaries.&lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; © 2024 &lt;/p&gt;&lt;p&gt; v4.2 &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt; 20240507 365&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
<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>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to Naval Aeronautical University (NAU). &lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="vanished">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt; © 2024 &lt;/p&gt;&lt;p&gt; v4.2 &lt;/p&gt;&lt;p&gt; Naval Aeronautical University(NAU) &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt; 20240507 365&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="214"/>
<location filename="../src/pages/settingspage.cpp" line="217"/>
<source>Updating, please wait...</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Temporary cache was cleaned</source>
<translation></translation>
</message>
@@ -666,12 +650,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<location filename="../src/mainwindow-dtk.cpp" line="245"/>
<source>About</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<location filename="../src/mainwindow-dtk.cpp" line="246"/>
<source>Exit</source>
<translation>退</translation>
</message>

View File

@@ -8,6 +8,14 @@
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="175"/>
<location filename="../src/pages/appintopage.cpp" line="313"/>
<location filename="../src/pages/appintopage.cpp" line="483"/>
<source>Download</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
@@ -110,24 +118,15 @@
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1071"/>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<source>Description</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="906"/>
<location filename="../src/pages/appintopage.ui" line="903"/>
<source>Screen capture</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="192"/>
<location filename="../src/pages/appintopage.cpp" line="330"/>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="518"/>
<source>Download and Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
@@ -141,114 +140,114 @@
<translation> Wine wine环境</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="768"/>
<location filename="../src/pages/appintopage.ui" line="765"/>
<source>Introduction</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1164"/>
<location filename="../src/pages/appintopage.ui" line="1161"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1193"/>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<source>Contributor</source>
<translation>稿</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1200"/>
<location filename="../src/pages/appintopage.ui" line="1197"/>
<source>Pkgname</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1306"/>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<source>Author</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1342"/>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<source>Size</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1378"/>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<source>Website</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="53"/>
<location filename="../src/pages/appintopage.cpp" line="51"/>
<source>Click Open</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="126"/>
<location filename="../src/pages/appintopage.cpp" line="114"/>
<source>Developer Mode Disabled</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="177"/>
<location filename="../src/pages/appintopage.cpp" line="357"/>
<location filename="../src/pages/appintopage.cpp" line="490"/>
<location filename="../src/pages/appintopage.cpp" line="160"/>
<location filename="../src/pages/appintopage.cpp" line="329"/>
<location filename="../src/pages/appintopage.cpp" line="456"/>
<source>Reinstall</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="184"/>
<location filename="../src/pages/appintopage.cpp" line="167"/>
<source>Upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="335"/>
<location filename="../src/pages/appintopage.cpp" line="466"/>
<location filename="../src/pages/appintopage.cpp" line="318"/>
<location filename="../src/pages/appintopage.cpp" line="432"/>
<source>Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="340"/>
<location filename="../src/pages/appintopage.cpp" line="323"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<source>Warning</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="445"/>
<location filename="../src/pages/appintopage.cpp" line="411"/>
<source>The current application does not support deepin, there may be problems</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="449"/>
<location filename="../src/pages/appintopage.cpp" line="415"/>
<source>The current application does not support UOS, there may be problems</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="453"/>
<location filename="../src/pages/appintopage.cpp" line="419"/>
<source>The current application does not support Ubuntu, there may be problems</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="457"/>
<location filename="../src/pages/appintopage.cpp" line="423"/>
<source>The current application does not support current platform, there may be problems</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="521"/>
<location filename="../src/pages/appintopage.cpp" line="487"/>
<source>Uninstall succeeded</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="500"/>
<source>The URL has been copied to the clipboard</source>
<translation></translation>
</message>
@@ -269,24 +268,16 @@
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="142"/>
<location filename="../src/application.cpp" line="139"/>
<source>Version: %1</source>
<translation>%1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="152"/>
<location filename="../src/application.cpp" line="149"/>
<source>%1 is released under %2</source>
<translation>%1%2</translation>
</message>
</context>
<context>
<name>DownloadController</name>
<message>
<location filename="../src/backend/downloadworker.cpp" line="180"/>
<source>Download Failed, please retry :(</source>
<translation></translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
@@ -369,14 +360,14 @@
<location filename="../src/widgets/common/downloaditem.cpp" line="230"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="231"/>
<source>Error happened in dpkg progress , please check the install info or try to reinstall.</source>
<translation></translation>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="237"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="238"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="239"/>
<source>dpkg progress had been aborted, please check the install info or try to reinstall.</source>
<translation></translation>
<source>dpkg progress had been abortedplease check the install info or try to reinstall.</source>
<translation>dpkg出現錯誤</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
@@ -481,33 +472,33 @@
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<location filename="../src/mainwindow-dtk.cpp" line="187"/>
<source>Submit App</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="191"/>
<location filename="../src/mainwindow-dtk.cpp" line="188"/>
<source>Submit App with client(Recommanded)</source>
<translation>()</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="192"/>
<location filename="../src/mainwindow-dtk.cpp" line="189"/>
<source>Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="193"/>
<location filename="../src/mainwindow-dtk.cpp" line="190"/>
<source>APP Upgrade and Install Settings</source>
<translation> </translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="147"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<location filename="../src/mainwindow-dtk.cpp" line="146"/>
<location filename="../src/mainwindow-dtk.cpp" line="241"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="152"/>
<location filename="../src/mainwindow-dtk.cpp" line="151"/>
<source>Search or enter spk://</source>
<translation></translation>
</message>
@@ -515,23 +506,19 @@
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="36"/>
<location filename="../src/application.cpp" line="37"/>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<location filename="../src/mainwindow-dtk.cpp" line="126"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/application.cpp" line="41"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;Professional application distribution solution&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Flamescion (Shenyang) Computer Software Development Co., Ltd.&lt;/span&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/application.cpp" line="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="vanished">&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation>
<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="149"/>
<location filename="../src/application.cpp" line="146"/>
<source>Spark Project</source>
<translation></translation>
</message>
@@ -541,7 +528,7 @@
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="247"/>
<location filename="../src/mainwindow-dtk.cpp" line="244"/>
<source>Show MainWindow</source>
<translation></translation>
</message>
@@ -640,21 +627,22 @@
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="359"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Copyright © 2024 Flamescion (Shenyang) Computer Software Development Co., Ltd. &lt;/p&gt;&lt;p&gt;Spark App Store Professional Edition v4.2 &lt;/p&gt;&lt;p&gt;This version is licensed to this entity and its subsidiaries.&lt;/p&gt;&lt;p&gt;License Duration: Permanent &lt;/p&gt;&lt;p&gt;Service Duration: From May 7, 2024, for 365 days&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<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="214"/>
<location filename="../src/pages/settingspage.cpp" line="217"/>
<source>Updating, please wait...</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="236"/>
<location filename="../src/pages/settingspage.cpp" line="239"/>
<source>Temporary cache was cleaned</source>
<translation></translation>
</message>
@@ -662,12 +650,12 @@
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="248"/>
<location filename="../src/mainwindow-dtk.cpp" line="245"/>
<source>About</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="249"/>
<location filename="../src/mainwindow-dtk.cpp" line="246"/>
<source>Exit</source>
<translation>退</translation>
</message>