Compare commits
88 Commits
2.0.1
...
3.0-alpha2
| Author | SHA1 | Date | |
|---|---|---|---|
| ccdcf407cc | |||
| 1a18a51d3c | |||
|
|
ab88af006b | ||
|
|
d02900cb10 | ||
|
|
3e473c091a | ||
|
|
84541d0c22 | ||
|
|
51f84bed1b | ||
| 4a0acf0575 | |||
|
|
e28d1c39ac | ||
|
|
f58201a612 | ||
| 405d3b6986 | |||
| b619d3cc7b | |||
|
|
14e3e7f9a2 | ||
|
|
1d0e0cc65c | ||
|
|
7a5b982dea | ||
|
|
91fcab56df | ||
|
|
4315f04023 | ||
|
|
736ede0742 | ||
|
|
a73a4416fc | ||
|
|
62f0dd097c | ||
|
|
6f3e4398df | ||
|
|
3cca0d87fe | ||
| b7e038bd88 | |||
|
|
4f0e00ad76 | ||
|
|
579008e8b2 | ||
|
|
ccb405c983 | ||
|
|
66ef37c1ca | ||
|
|
8972425c7c | ||
|
|
2ae6e80785 | ||
| f5788efb47 | |||
| 32bc272791 | |||
| c5f04b5675 | |||
| cf208d0736 | |||
| fdc7cb4cb6 | |||
| 8e89ce3ae3 | |||
| ee51f59874 | |||
| 3d09a28794 | |||
| 4b05758479 | |||
| 74d9d0b563 | |||
|
|
f1a4f7acb5 | ||
| 93be66e871 | |||
| 7b46cca1d4 | |||
| c529367998 | |||
|
|
beae3e3efa | ||
|
|
9706480931 | ||
|
|
ed64eb6f5b | ||
| 8f6e5408ae | |||
| d5783458fc | |||
| 6e05066dd9 | |||
| 58aa5a3787 | |||
| 6087c8a5c8 | |||
| ff758946be | |||
| d1cbf95447 | |||
|
|
187ce7e277 | ||
| d3e4f75254 | |||
|
|
949eb33511 | ||
|
|
3f65002dc9 | ||
|
|
cfd4c7689a | ||
|
|
367c8d857c | ||
| b41f846ea4 | |||
| 1dcd7d1c5c | |||
| 01ac388f50 | |||
| cfbbd34695 | |||
|
|
b7afc5ec8a | ||
| b911158274 | |||
| 67c28d0224 | |||
| 1d65bfc66d | |||
| 0e595db328 | |||
| 7a16028e38 | |||
|
|
1b56d3ad52 | ||
| 431e7b555f | |||
|
|
1cbabe7cc5 | ||
| d027d513a3 | |||
|
|
eff8878e8b | ||
| f0bf0e5aec | |||
|
|
678a4229f7 | ||
| e89c14b5ca | |||
|
|
d4c734627a | ||
| 8830b14e10 | |||
| 8c9f5b8ba6 | |||
| badc3aa089 | |||
| 9c9317dea0 | |||
| 594f71f98a | |||
| c45bf8ffaf | |||
|
|
c9c0357646 | ||
|
|
bd8f660fe9 | ||
| 538c742303 | |||
|
|
c23e816017 |
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
*.pro.user*
|
||||||
|
build/
|
||||||
|
.vscode/
|
||||||
|
Lib/
|
||||||
BIN
Logo-Spark.png
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 46 KiB |
349
README.md
@@ -1,9 +1,21 @@
|
|||||||
# 星火商店
|
# 星火应用商店
|
||||||
|
|
||||||
|
|
||||||
|
众所周知,国内的Linux应用比较少,wine应用难以获取,优质工具分散在民间各大论坛,无法形成合力,难以改善生态
|
||||||
|
|
||||||
|
生态构建需要的不是某一方的单打独斗,而是人人行动起来,汇聚星火,产生燎原之势
|
||||||
|
|
||||||
|
我们创建了这个应用商店,广泛收录大家需要的软件包,搜集优质小工具,主动适配wine应用,存放到储存库供大家获取
|
||||||
|
|
||||||
|
我们支持:Deepin 20 ; Ubuntu 20.04 LTS ; UOS Home 20
|
||||||
|
|
||||||
|
希望看到这里的人也可以加入我们的队伍,开发或者投递应用都很欢迎,共同构建Linux应用生态
|
||||||
|
|
||||||
|
### [在这里投稿](http://upload.spark-app.store)
|
||||||
|
|
||||||
#### 介绍
|
|
||||||
星火商店商店,由深度社区爱好者维护
|
|
||||||
web页面部分正在开发当中,详情请见[web仓库](https://gitee.com/deepin-community-store/DCSAPP_WEB)
|
web页面部分正在开发当中,详情请见[web仓库](https://gitee.com/deepin-community-store/DCSAPP_WEB)
|
||||||
|
|
||||||
|
|
||||||
#### 说明
|
#### 说明
|
||||||
|
|
||||||
当前服务器线路列表(项目中包含):
|
当前服务器线路列表(项目中包含):
|
||||||
@@ -14,15 +26,14 @@ http://store.jerrywang.top/
|
|||||||
http://dcstore.spark-app.store/
|
http://dcstore.spark-app.store/
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 参数
|
#### 调用参数(spk规则)
|
||||||
|
|
||||||
参数只有一个Url,该url应当遵循这种格式:`spk://<任意合法字符>/web分类/包名`
|
参数只有一个Url,该url应当遵循这种格式:`spk://<任意合法字符>/web分类/包名`
|
||||||
|
|
||||||
例如:
|
例如:
|
||||||
|
|
||||||
[spk://abcdefg/network/firefox-zh](spk://abcdefg/network/firefox-zh)
|
[spk://abcdefg/games/store.spark-app.hmcl](spk://abcdefg/games/store.spark-app.hmcl)
|
||||||
|
|
||||||
[spk://higklmn/network/firefox-zh](spk://higklmn/network/firefox-zh)
|
|
||||||
|
|
||||||
可选的web分类:
|
可选的web分类:
|
||||||
|
|
||||||
@@ -32,29 +43,23 @@ http://dcstore.spark-app.store/
|
|||||||
| 社交沟通 | chat |
|
| 社交沟通 | chat |
|
||||||
| 音乐欣赏 | music |
|
| 音乐欣赏 | music |
|
||||||
| 视频播放 | video |
|
| 视频播放 | video |
|
||||||
| 图形图像 | image_graphics |
|
| 图形图像 | graphics |
|
||||||
| 游戏娱乐 | games |
|
| 游戏娱乐 | games |
|
||||||
| 办公学习 | office |
|
| 办公学习 | office |
|
||||||
| 阅读翻译 | reading |
|
| 阅读翻译 | reading |
|
||||||
| 编程开发 | development |
|
| 编程开发 | development |
|
||||||
| 系统工具 | tools |
|
| 系统工具 | tools |
|
||||||
| 主题美化 | themes |
|
| 主题美化 | beautify |
|
||||||
| 其他应用 | others |
|
| 其他应用 | others |
|
||||||
|
|
||||||
#### 目录结构
|
|
||||||
|
|
||||||
安装软件过程中产生的包,图标,截图等被储存到`/tmp/deepin-community-store/`中。
|
|
||||||
|
|
||||||
配置文件被储存到`~/.config/deepin-community-store/`中。
|
|
||||||
|
|
||||||
线路文件:新版的线路文件被放置于源服务器中,可随时刷新更新源列表
|
|
||||||
|
|
||||||
#### 如何编译
|
#### 如何编译
|
||||||
|
|
||||||
Deepin V20/UOS 系统下, 安装依赖
|
Deepin V20/UOS 系统下, 安装依赖
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
sudo apt install qt5-default libdtkcore-dev libdtkwidget-dev qtwebengine5-dev
|
sudo apt install qt5-default libdtkcore-dev libdtkwidget-dev qtwebengine5-dev libnotify-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
@@ -68,6 +73,316 @@ make -j
|
|||||||
|
|
||||||
./build文件下的spark-store即为可执行文件
|
./build文件下的spark-store即为可执行文件
|
||||||
|
|
||||||
#### 参与贡献
|
# 星火应用商店文档
|
||||||
|
|
||||||
1. Fork 本仓库
|
# 目录结构
|
||||||
|
几个目录结构
|
||||||
|
```
|
||||||
|
/
|
||||||
|
/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);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|||||||
BIN
assets/fonts/华康少女字体.ttf
Normal file
@@ -30,8 +30,40 @@
|
|||||||
<file>icons/homepage_dark.svg</file>
|
<file>icons/homepage_dark.svg</file>
|
||||||
<file>icons/category_active_dark.svg</file>
|
<file>icons/category_active_dark.svg</file>
|
||||||
<file>icons/category_active.svg</file>
|
<file>icons/category_active.svg</file>
|
||||||
|
<file>icons/refresh-page-dark.svg</file>
|
||||||
|
<file>icons/refresh-page.svg</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
<qresource prefix="/">
|
<qresource prefix="/">
|
||||||
<file>Logo-Spark.png</file>
|
<file>../Logo-Spark.png</file>
|
||||||
|
<file>../src/big_image.cpp</file>
|
||||||
|
<file>../src/big_image.h</file>
|
||||||
|
<file>../src/downloadlist.cpp</file>
|
||||||
|
<file>../src/downloadlist.h</file>
|
||||||
|
<file>../src/image_show.cpp</file>
|
||||||
|
<file>../src/image_show.h</file>
|
||||||
|
<file>../src/main.cpp</file>
|
||||||
|
<file>../src/progressload.cpp</file>
|
||||||
|
<file>../src/progressload.h</file>
|
||||||
|
<file>../src/widget.cpp</file>
|
||||||
|
<file>../src/widget.h</file>
|
||||||
|
<file>tags/a2d.png</file>
|
||||||
|
<file>tags/community.svg</file>
|
||||||
|
<file>tags/deepin.svg</file>
|
||||||
|
<file>tags/logo_icon.svg</file>
|
||||||
|
<file>tags/uos-authorize.svg</file>
|
||||||
|
<file>tags/a2d-small.png</file>
|
||||||
|
<file>tags/community-small.png</file>
|
||||||
|
<file>tags/deepin-small.png</file>
|
||||||
|
<file>tags/dtk-small.png</file>
|
||||||
|
<file>tags/uos-small.png</file>
|
||||||
|
<file>tags/community.png</file>
|
||||||
|
<file>tags/ubuntu-small.png</file>
|
||||||
|
<file>tags/ubuntu.png</file>
|
||||||
|
<file>tags/dwine5-small.png</file>
|
||||||
|
<file>tags/dwine5.svg</file>
|
||||||
|
<file>tags/dwine2-small.png</file>
|
||||||
|
</qresource>
|
||||||
|
<qresource prefix="/fonts">
|
||||||
|
<file>fonts/华康少女字体.ttf</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
3
assets/icons/category_active.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||||||
|
<path fill="#536076" d="M10.138807,3.52000025 L10.138,12.5230002 L14.6066017,8.05523757 L15.3137085,8.76234435 L9.65685425,14.4191986 L4,8.76234435 L4.70710678,8.05523757 L9.138,12.4870002 L9.138807,3.52000025 L10.138807,3.52000025 Z" transform="rotate(90 9.657 11.518)"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 366 B |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
3
assets/icons/category_active_dark.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||||||
|
<path fill="#536076" d="M10.138807,3.52000025 L10.138,12.5230002 L14.6066017,8.05523757 L15.3137085,8.76234435 L9.65685425,14.4191986 L4,8.76234435 L4.70710678,8.05523757 L9.138,12.4870002 L9.138807,3.52000025 L10.138807,3.52000025 Z" transform="rotate(90 9.657 11.518)"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 366 B |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 523 B After Width: | Height: | Size: 523 B |
|
Before Width: | Height: | Size: 553 B After Width: | Height: | Size: 553 B |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 865 B After Width: | Height: | Size: 865 B |
|
Before Width: | Height: | Size: 895 B After Width: | Height: | Size: 895 B |
|
Before Width: | Height: | Size: 929 B After Width: | Height: | Size: 929 B |
|
Before Width: | Height: | Size: 959 B After Width: | Height: | Size: 959 B |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 810 B After Width: | Height: | Size: 810 B |
|
Before Width: | Height: | Size: 828 B After Width: | Height: | Size: 828 B |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
54
assets/icons/refresh-page-dark.svg
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||||
|
height="16"
|
||||||
|
width="16"
|
||||||
|
sodipodi:docname="refresh-page-dark.svg"
|
||||||
|
xml:space="preserve"
|
||||||
|
viewBox="0 0 16 16"
|
||||||
|
y="0px"
|
||||||
|
x="0px"
|
||||||
|
id="Layer_1"
|
||||||
|
version="1.1"><metadata
|
||||||
|
id="metadata9"><rdf:RDF><cc:Work
|
||||||
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||||
|
id="defs7" /><sodipodi:namedview
|
||||||
|
inkscape:current-layer="Layer_1"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:cy="8.8351119"
|
||||||
|
inkscape:cx="12.452215"
|
||||||
|
inkscape:zoom="34.711876"
|
||||||
|
showgrid="true"
|
||||||
|
id="namedview5"
|
||||||
|
inkscape:window-height="958"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
guidetolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
objecttolerance="10"
|
||||||
|
borderopacity="1"
|
||||||
|
bordercolor="#666666"
|
||||||
|
pagecolor="#ffffff"><inkscape:grid
|
||||||
|
id="grid834"
|
||||||
|
type="xygrid" /></sodipodi:namedview>
|
||||||
|
<g
|
||||||
|
style="fill:#ffffff;fill-opacity:0.60000002"
|
||||||
|
transform="scale(0.03125,0.0312082)"
|
||||||
|
id="XMLID_2_">
|
||||||
|
<path
|
||||||
|
style="fill:#ffffff;fill-opacity:0.60000002"
|
||||||
|
d="M 436.6,75.4 C 390.1,28.9 326.7,0 256,0 114.5,0 0,114.5 0,256 0,397.5 114.5,512 256,512 375.2,512 474.8,430.1 503.6,320.2 h -67 C 410.5,394.7 339.8,447.7 256,447.7 149.9,447.7 64.2,362.1 64.2,255.9 64.2,149.7 149.9,64.2 256,64.2 c 53.1,0 100.5,22.3 135,56.8 L 287.7,224.3 H 512 V 0 Z"
|
||||||
|
id="XMLID_4_" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.9 KiB |
52
assets/icons/refresh-page.svg
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||||
|
height="16"
|
||||||
|
width="16"
|
||||||
|
sodipodi:docname="refresh-page.svg"
|
||||||
|
xml:space="preserve"
|
||||||
|
viewBox="0 0 16 16"
|
||||||
|
y="0px"
|
||||||
|
x="0px"
|
||||||
|
id="Layer_1"
|
||||||
|
version="1.1"><metadata
|
||||||
|
id="metadata9"><rdf:RDF><cc:Work
|
||||||
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||||
|
id="defs7" /><sodipodi:namedview
|
||||||
|
inkscape:current-layer="Layer_1"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:cy="8.8351119"
|
||||||
|
inkscape:cx="12.452215"
|
||||||
|
inkscape:zoom="34.711876"
|
||||||
|
showgrid="true"
|
||||||
|
id="namedview5"
|
||||||
|
inkscape:window-height="958"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
guidetolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
objecttolerance="10"
|
||||||
|
borderopacity="1"
|
||||||
|
bordercolor="#666666"
|
||||||
|
pagecolor="#ffffff"><inkscape:grid
|
||||||
|
id="grid834"
|
||||||
|
type="xygrid" /></sodipodi:namedview>
|
||||||
|
<g
|
||||||
|
transform="scale(0.03125,0.0312082)"
|
||||||
|
id="XMLID_2_">
|
||||||
|
<path
|
||||||
|
d="M 436.6,75.4 C 390.1,28.9 326.7,0 256,0 114.5,0 0,114.5 0,256 0,397.5 114.5,512 256,512 375.2,512 474.8,430.1 503.6,320.2 h -67 C 410.5,394.7 339.8,447.7 256,447.7 149.9,447.7 64.2,362.1 64.2,255.9 64.2,149.7 149.9,64.2 256,64.2 c 53.1,0 100.5,22.3 135,56.8 L 287.7,224.3 H 512 V 0 Z"
|
||||||
|
id="XMLID_4_" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 494 B After Width: | Height: | Size: 494 B |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
BIN
assets/tags/a2d-small.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
assets/tags/a2d.png
Normal file
|
After Width: | Height: | Size: 248 KiB |
BIN
assets/tags/community-small.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
assets/tags/community.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
240
assets/tags/community.svg
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
sodipodi:docname="deepin-community-store.svg"
|
||||||
|
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
|
||||||
|
id="svg8"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0 0 200 200"
|
||||||
|
height="200mm"
|
||||||
|
width="200mm">
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient1200"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
id="stop1196"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#000000;stop-opacity:0.1299435" />
|
||||||
|
<stop
|
||||||
|
id="stop1198"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#dadada;stop-opacity:0.81960785" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient1138">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#99e7ea;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop1134" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#007ffc;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop1136" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient1128"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
id="stop1124"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#99e7ea;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
id="stop1126"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#007ffc;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
only_selected="false"
|
||||||
|
apply_with_weight="true"
|
||||||
|
apply_no_weight="true"
|
||||||
|
helper_size="0"
|
||||||
|
steps="2"
|
||||||
|
weight="33.333333"
|
||||||
|
is_visible="true"
|
||||||
|
id="path-effect960"
|
||||||
|
effect="bspline" />
|
||||||
|
<radialGradient
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
|
||||||
|
r="90.135414"
|
||||||
|
fy="199.86011"
|
||||||
|
fx="100.35268"
|
||||||
|
cy="199.86011"
|
||||||
|
cx="100.35268"
|
||||||
|
id="radialGradient1130"
|
||||||
|
xlink:href="#linearGradient1128"
|
||||||
|
inkscape:collect="always" />
|
||||||
|
<radialGradient
|
||||||
|
r="90.135414"
|
||||||
|
fy="199.86011"
|
||||||
|
fx="100.35268"
|
||||||
|
cy="199.86011"
|
||||||
|
cx="100.35268"
|
||||||
|
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="radialGradient1132"
|
||||||
|
xlink:href="#linearGradient1138"
|
||||||
|
inkscape:collect="always" />
|
||||||
|
<radialGradient
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
|
||||||
|
r="90.135414"
|
||||||
|
fy="199.86011"
|
||||||
|
fx="100.35268"
|
||||||
|
cy="199.86011"
|
||||||
|
cx="100.35268"
|
||||||
|
id="radialGradient1202"
|
||||||
|
xlink:href="#linearGradient1200"
|
||||||
|
inkscape:collect="always" />
|
||||||
|
<filter
|
||||||
|
id="filter1448"
|
||||||
|
inkscape:label="Drop Shadow"
|
||||||
|
style="color-interpolation-filters:sRGB;">
|
||||||
|
<feFlood
|
||||||
|
id="feFlood1438"
|
||||||
|
result="flood"
|
||||||
|
flood-color="rgb(145,145,145)"
|
||||||
|
flood-opacity="0.372549" />
|
||||||
|
<feComposite
|
||||||
|
id="feComposite1440"
|
||||||
|
result="composite1"
|
||||||
|
operator="in"
|
||||||
|
in2="SourceGraphic"
|
||||||
|
in="flood" />
|
||||||
|
<feGaussianBlur
|
||||||
|
id="feGaussianBlur1442"
|
||||||
|
result="blur"
|
||||||
|
stdDeviation="5.2918"
|
||||||
|
in="composite1" />
|
||||||
|
<feOffset
|
||||||
|
id="feOffset1444"
|
||||||
|
result="offset"
|
||||||
|
dy="0"
|
||||||
|
dx="0" />
|
||||||
|
<feComposite
|
||||||
|
id="feComposite1446"
|
||||||
|
result="composite2"
|
||||||
|
operator="over"
|
||||||
|
in2="offset"
|
||||||
|
in="SourceGraphic" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
id="filter2201"
|
||||||
|
inkscape:label="Drop Shadow"
|
||||||
|
style="color-interpolation-filters:sRGB;">
|
||||||
|
<feFlood
|
||||||
|
id="feFlood2191"
|
||||||
|
result="flood"
|
||||||
|
flood-color="rgb(145,145,145)"
|
||||||
|
flood-opacity="0.372549" />
|
||||||
|
<feComposite
|
||||||
|
id="feComposite2193"
|
||||||
|
result="composite1"
|
||||||
|
operator="in"
|
||||||
|
in2="SourceGraphic"
|
||||||
|
in="flood" />
|
||||||
|
<feGaussianBlur
|
||||||
|
id="feGaussianBlur2195"
|
||||||
|
result="blur"
|
||||||
|
stdDeviation="3.76995"
|
||||||
|
in="composite1" />
|
||||||
|
<feOffset
|
||||||
|
id="feOffset2197"
|
||||||
|
result="offset"
|
||||||
|
dy="0"
|
||||||
|
dx="0" />
|
||||||
|
<feComposite
|
||||||
|
id="feComposite2199"
|
||||||
|
result="composite2"
|
||||||
|
operator="over"
|
||||||
|
in2="offset"
|
||||||
|
in="SourceGraphic" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
inkscape:document-rotation="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-height="705"
|
||||||
|
inkscape:window-width="1366"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:current-layer="layer2"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:cy="507.94585"
|
||||||
|
inkscape:cx="120.33119"
|
||||||
|
inkscape:zoom="0.35"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
borderopacity="1.0"
|
||||||
|
bordercolor="#666666"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
id="base" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
transform="translate(0,-97)"
|
||||||
|
id="layer1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
inkscape:label="Layer 1" />
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 2"
|
||||||
|
id="layer2"
|
||||||
|
inkscape:groupmode="layer">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path1002"
|
||||||
|
d="m 91.937746,32.561862 c 0,0 11.145084,-0.157476 22.599704,6.928753 11.45465,7.086223 18.11074,13.857508 20.27783,18.266716 2.16708,4.409213 9.28755,12.125333 9.13277,26.297793 -0.15488,14.17244 -3.40543,23.620766 -8.97797,31.494326 -5.57254,7.87359 -15.63405,13.85751 -27.70786,14.17247 -12.073834,0.31494 -19.813464,-7.55863 -22.444934,-11.96786 -2.63147,-4.4092 -3.71502,-13.85751 -0.46438,-20.628766 3.25065,-6.77132 8.3588,-6.77132 10.06152,-6.14141 1.70272,0.6299 2.16709,1.5747 3.09585,3.30689 0.92875,1.73219 1.54793,1.41726 2.941094,0.47243 1.39311,-0.94484 1.85748,-2.04715 1.54792,-3.46439 -0.30958,-1.41726 -2.167114,-3.14944 -3.715054,-3.62186 -1.54791,-0.47241 -3.71502,-1.88966 -6.81087,-1.41721 -3.09585,0.47238 -9.13276,2.04711 -14.24091,8.97585 -5.10815,6.928746 -4.48899,17.636836 -1.39313,22.675926 3.09585,5.0391 8.97796,14.48739 21.98054,17.79431 13.002594,3.30693 34.054354,-6.45633 41.329594,-21.57361 7.27524,-15.117296 7.43004,-22.203516 7.12048,-34.643766 C 145.96036,67.048164 134.97008,48.466503 122.74148,41.69522 110.51288,34.923934 101.38012,30.987141 91.937746,32.561862 Z"
|
||||||
|
style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path1012"
|
||||||
|
d="m 98.407556,95.469094 c 0,0 -3.06474,-2.8951 -5.80111,2.22698 -2.73637,5.122046 -4.04983,9.687366 -1.31346,15.254856 2.73637,5.56745 8.42801,8.90792 17.184454,8.79659 8.75636,-0.11148 15.21419,-2.22699 19.0451,-8.5739 3.83094,-6.34692 6.7862,-11.02357 7.11457,-13.361906 0.32839,-2.33835 2.07965,0.334036 1.53239,2.338336 -0.54728,2.00426 -0.43783,5.9015 1.09454,5.12204 1.53237,-0.77942 2.73637,-2.00427 2.95526,-1.44753 0.21893,0.55673 -1.75127,4.00859 -2.68162,5.73449 -0.93039,1.7259 -3.83094,5.90153 -5.5275,7.51607 -1.69652,1.61458 -4.04981,3.89724 -6.84092,5.56747 -2.79109,1.67024 -7.11454,3.61887 -9.52255,4.06427 -2.40801,0.44539 -7.22403,1.39184 -9.96042,1.2805 -2.73635,-0.11137 -6.238924,-0.61243 -10.124564,-2.56104 -3.88565,-1.94859 -8.09966,-4.95505 -9.74148,-7.96148 -1.64182,-3.00643 -4.15928,-5.73449 -3.61201,-13.30623 0.54728,-7.571746 3.01001,-11.468986 4.87074,-13.250556 1.86073,-1.7816 4.5971,-2.56105 6.40311,-2.17131 1.806,0.38971 2.95528,1.44755 3.3931,2.22697 0.43781,0.77944 1.14928,2.22699 1.53237,2.50538 z"
|
||||||
|
style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path1014"
|
||||||
|
d="m 126.2091,135.55481 c 0,0 13.13457,-7.6831 19.26404,-19.82016 6.12948,-12.13707 8.7564,-19.931516 7.99021,-31.845916 -0.76619,-11.91436 -2.62692,-6.01286 -0.54728,-11.13493 2.07964,-5.12208 -1.31345,-15.25486 0.10943,-15.922952 1.42292,-0.668097 4.48765,4.453972 5.3633,8.573902 0.87562,4.11992 4.70654,16.81372 1.64181,32.9594 -3.06472,16.145636 -10.28872,22.603906 -15.10475,26.946546 -4.81603,4.34261 -15.7615,11.91437 -17.40332,11.80302 -1.64183,-0.11148 -1.86073,-0.11148 -1.31348,-1.55891 z"
|
||||||
|
style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path1016"
|
||||||
|
d="m 102.56686,112.17145 c 0,0 7.00512,1.5589 12.36838,-1.78156 5.3633,-3.3405 9.5226,-8.79661 10.17931,-10.912246 0.65672,-2.11564 0.76619,1.892936 1.53236,-0.11125 0.76618,-2.00432 3.83093,-6.01288 2.29855,-15.36624 -1.53237,-9.35333 -1.64182,-9.79875 -4.48762,-14.80947 -2.84586,-5.01072 -9.63207,-11.914367 -13.79134,-14.141356 -4.15927,-2.226986 -9.96037,-5.567464 -17.950604,-5.344766 -7.9902,0.222699 -5.36328,-0.334048 -13.02512,1.002146 -7.66184,1.336187 -14.55749,5.010717 -16.85604,7.015006 -2.29855,2.004286 -8.42802,7.46041 -10.61712,10.46684 -2.1891,3.00643 -8.20911,9.79874 -11.3833,19.26344 -3.17419,9.46469 -4.48765,10.46683 -4.70656,16.702396 -0.21891,6.23557 0.54727,7.90578 -0.76618,8.46256 -1.31346,0.55673 -1.09455,-4.67668 -0.9851,-8.35123 0.10946,-3.6745 0.10946,-13.250556 4.92547,-23.940086 4.81601,-10.68954 13.35349,-19.59749 18.1695,-22.826621 4.81601,-3.229128 10.39821,-7.571752 19.04514,-9.687392 8.64693,-2.115635 17.29386,-1.781586 22.65716,-0.779443 5.363304,1.002145 13.681874,4.453974 18.169504,7.905802 4.48766,3.45183 9.41314,7.683104 13.13459,14.586764 3.72146,6.90365 4.70654,15.70025 4.59709,19.37477 -0.10943,3.67455 -1.97019,12.137106 -4.81601,16.257016 -2.84583,4.11993 -6.67674,9.0193 -10.61711,10.80089 -3.94039,1.78157 -8.75642,2.33833 -12.69675,0.55674 -3.94039,-1.78161 -3.72147,-2.44969 -4.3782,-4.34263 z"
|
||||||
|
style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path1018"
|
||||||
|
d="m 102.56686,112.17145 c 0,0 5.54674,1.56707 10.22918,-0.55878 4.68248,-2.12587 6.4239,-4.17301 7.54615,-5.3934 1.12223,-1.22042 3.25064,-3.50376 3.83112,-4.56669 0.58046,-1.06292 1.19962,-1.692816 1.19962,-2.086486 0,-0.39369 -1.08353,-1.33853 -0.0386,-3.62186 1.04482,-2.28333 1.97361,-7.51928 1.50922,-9.88134 -0.46438,-2.36207 -1.54792,-15.47161 -10.83547,-24.2113 -9.28753,-8.739679 -18.497714,-9.763243 -18.497714,-9.763243 0,0 14.705314,4.645415 21.593574,18.739133 6.88828,14.09374 4.64376,23.14835 0.23218,28.65986 -4.41158,5.511506 -10.68068,6.141406 -12.38342,4.724146 -1.70268,-1.41725 -5.2113,6.47164 -4.38574,7.95996 z"
|
||||||
|
style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path1020"
|
||||||
|
d="m 84.662496,61.615394 c 0,0 -9.90672,-0.0787 -17.41416,4.88161 -7.50743,4.96037 -11.14506,8.9759 -13.23476,12.12533 -2.08969,3.14945 -4.48898,7.47991 -4.17939,7.40118 0.30958,-0.0788 9.05536,-12.2828 15.86623,-15.43223 6.81087,-3.14944 13.62174,-7.55865 22.98669,-4.33049 9.36495,3.22819 13.776544,7.71612 15.788844,6.61383 2.0123,-1.1023 2.3993,-2.44082 1.23835,-3.9368 -1.16094,-1.49598 -9.364964,-8.81842 -21.051804,-7.32243 z"
|
||||||
|
style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path1022"
|
||||||
|
d="m 69.839846,124.53124 c 0.65673,0.33404 5.58219,8.90795 9.52257,10.35548 3.94037,1.44755 6.56728,1.55888 7.0051,2.227 0.43782,0.66809 0.32837,4.00858 3.83092,5.45614 3.50256,1.44753 19.920794,6.01284 24.627334,6.45824 4.70658,0.4454 0.76621,3.22911 3.61202,4.23125 2.84584,1.00217 14.99532,1.5589 17.95061,0.33405 2.95527,-1.22483 2.95527,1.1135 -2.1891,3.1178 -5.14437,2.00427 -18.71677,6.79231 -27.58261,5.67882 -8.865864,-1.1135 -19.373534,-3.00644 -25.284094,-7.23772 -5.91056,-4.23126 -8.42802,-6.1242 -6.23892,-6.45824 2.18909,-0.33407 7.9902,5.9015 10.50766,6.56959 2.51746,0.66809 4.5971,0.66809 3.06473,-0.8908 -1.53236,-1.55888 -11.49275,-8.46253 -12.47784,-8.1285 -0.9851,0.33405 -3.06474,0.55674 -4.81602,-1.78159 -1.75127,-2.33832 -10.94548,-15.25485 -10.39821,-22.1585 0.54728,-6.90365 2.29856,-5.12208 4.3782,-2.56103 2.07964,2.56103 4.48765,4.78801 4.48765,4.78801 z"
|
||||||
|
style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 13 KiB |
BIN
assets/tags/deepin-small.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
35
assets/tags/deepin.svg
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<svg width="512" height="512" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<defs>
|
||||||
|
<path d="m17,129c0,-61.30371 49.69629,-111 111,-111c61.30371,0 111,49.69629 111,111c0,61.30371 -49.69629,111 -111,111c-61.30371,0 -111,-49.69629 -111,-111z" id="deepin-launcher-b"/>
|
||||||
|
<filter filterUnits="objectBoundingBox" y="-6.3%" x="-8.1%" height="116.2%" width="116.2%" id="deepin-launcher-a">
|
||||||
|
<feGaussianBlur stdDeviation="5"/>
|
||||||
|
</filter>
|
||||||
|
<path d="m172.29023,47.20405c-13.1683,-7.14564 -28.25541,-11.20405 -44.29023,-11.20405c-3.85759,0 -7.66034,0.23489 -11.39471,0.69114c-13.8375,19.06416 -21.01047,50.16415 -20.43985,69.1948c0,0 -0.90954,28.19993 18.37748,38.20231c0,0 17.33291,7.61701 29.14502,-17.01295c0,0 8.11834,-13.89983 4.81381,-45.31395c0,0 3.16155,0.55793 3.51901,1.05927c0.35746,0.49728 6.98241,24.18523 2.32747,44.13339c0,0 -4.28556,23.44132 -25.35592,28.80234c-21.06242,5.36102 -37.47784,-7.60893 -48.62269,-19.82688c-8.29983,-9.09853 -20.62176,-33.53254 -26.69028,-62.84231c-11.72709,15.56323 -18.67934,34.92741 -18.67934,55.91495c0,14.49236 3.31502,28.21045 9.22816,40.43737c20.53097,6.06549 72.70224,17.88328 105.89216,-6.44123c21.96964,-16.10443 19.13893,-41.89451 19.13893,-41.89451c-0.36372,-19.61754 -12.30727,-39.10374 -12.30727,-39.10374c46.44186,42.01354 18.99265,88.68931 18.99265,88.68931c-12.77926,26.10154 -39.04908,42.79526 -62.02961,50.25104c4.59324,0.69782 9.29685,1.05965 14.08498,1.05965c51.36266,0 93,-41.63639 93,-92.99789c0,-21.72407 -7.44877,-41.70884 -19.93152,-57.53933c-4.54487,0.31322 -9.825,0.49664 -15.30337,0.31684c0,0 -24.70889,1.15387 -38.56418,8.0646c0,0 -10.33212,4.60716 -20.65999,12.41858c0,0 -2.19192,1.09575 -2.08593,5.12183c0.09327,4.01362 -2.10288,14.71385 -9.42058,20.98539c0,0 -5.22329,2.68544 -2.61165,6.52889c0,0 3.52742,5.12183 8.49633,-0.25734c0,0 12.81233,-13.18228 13.59668,-34.42501c0,0 4.05314,-3.4616 10.45506,-4.48264c0,0 1.17863,31.86824 -14.63539,47.86878c0,0 -15.04241,16.38239 -19.87565,-7.93593c0,0 -5.88469,-23.16861 24.45027,-50.68289c0,0 20.448,-20.42091 32.46751,-29.98388c1.66104,0.69233 3.29908,1.42749 4.91265,2.20406l-0.00001,-0.00001zm-44.29023,183.79595c-56.33322,0 -102,-45.66583 -102,-101.99789c0,-56.33281 45.66752,-102.00211 102,-102.00211c56.33248,0 102,45.6693 102,102.00211c0,56.33206 -45.66678,101.99789 -102,101.99789z" id="deepin-launcher-f"/>
|
||||||
|
<filter filterUnits="objectBoundingBox" y="-.5%" x="-.5%" height="102%" width="101%" id="deepin-launcher-e"/>
|
||||||
|
<filter filterUnits="objectBoundingBox" y="-.5%" x="-.5%" height="102%" width="101%" id="deepin-launcher-g"/>
|
||||||
|
<linearGradient y2="97.178%" y1="4.64%" x2="50%" x1="50%" id="deepin-launcher-c">
|
||||||
|
<stop stop-color="#00ABFF" offset="0%"/>
|
||||||
|
<stop stop-color="#0163FA" offset="100%"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient y2="100%" y1="0%" x2="50%" x1="50%" id="deepin-launcher-d">
|
||||||
|
<stop stop-color="#32BBFF" offset="0%"/>
|
||||||
|
<stop stop-color="#004FC5" offset="100%"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g>
|
||||||
|
<title>background</title>
|
||||||
|
<rect fill="none" id="canvas_background" height="514" width="514" y="-1" x="-1"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<title>Layer 1</title>
|
||||||
|
<g stroke="null" id="svg_1" fill-rule="evenodd" fill="none">
|
||||||
|
<use x="0" y="0" transform="matrix(2.15315318107605,0,0,2.15315318107605,-19.603604078292847,-20.756757259368896) " stroke="null" id="svg_2" xlink:href="#deepin-launcher-b" filter="url(#deepin-launcher-a)" fill="#000"/>
|
||||||
|
<use x="0" y="0" transform="matrix(2.15315318107605,0,0,2.15315318107605,-19.603604078292847,-20.756757259368896) " stroke="url(#deepin-launcher-d)" id="svg_3" xlink:href="#deepin-launcher-b" stroke-width="2" fill="url(#deepin-launcher-c)"/>
|
||||||
|
<g stroke="null" id="svg_4" fill-rule="nonzero">
|
||||||
|
<use x="0" y="0" transform="matrix(2.15315318107605,0,0,2.15315318107605,-19.603604078292847,-20.756757259368896) " stroke="null" id="svg_5" xlink:href="#deepin-launcher-f" filter="url(#deepin-launcher-e)" fill="#000"/>
|
||||||
|
<use x="0" y="0" transform="matrix(2.15315318107605,0,0,2.15315318107605,-19.603604078292847,-20.756757259368896) " stroke="null" id="svg_6" xlink:href="#deepin-launcher-f" fill="#F0F9FF"/>
|
||||||
|
<use x="0" y="0" transform="matrix(2.15315318107605,0,0,2.15315318107605,-19.603604078292847,-20.756757259368896) " stroke="null" id="svg_7" xlink:href="#deepin-launcher-f" filter="url(#deepin-launcher-g)" fill="#000"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 4.3 KiB |
BIN
assets/tags/dtk-small.png
Normal file
|
After Width: | Height: | Size: 954 B |
BIN
assets/tags/dwine2-small.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
assets/tags/dwine5-small.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
1
assets/tags/dwine5.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg width="305" height="304" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" overflow="hidden"><defs><clipPath id="clip0"><path d="M688 378 993 378 993 682 688 682Z" fill-rule="evenodd" clip-rule="evenodd"/></clipPath><clipPath id="clip1"><path d="M751.382 385.273 984.326 440.078 929.522 673.022 696.578 618.218Z" fill-rule="evenodd" clip-rule="evenodd"/></clipPath><clipPath id="clip2"><path d="M751.382 385.273 984.326 440.078 929.522 673.022 696.578 618.218Z" fill-rule="evenodd" clip-rule="evenodd"/></clipPath><clipPath id="clip3"><path d="M751.382 385.273 984.326 440.078 929.522 673.022 696.578 618.218Z" fill-rule="evenodd" clip-rule="evenodd"/></clipPath></defs><g clip-path="url(#clip0)" transform="translate(-688 -378)"><path d="M689 529.5C689 445.829 756.829 378 840.5 378 924.171 378 992 445.829 992 529.5 992 613.171 924.171 681 840.5 681 756.829 681 689 613.171 689 529.5Z" fill="#A20000" fill-rule="evenodd"/><g clip-path="url(#clip1)"><g clip-path="url(#clip2)"><g clip-path="url(#clip3)"><path d="M812.478 604.512 826.339 545.597C790.456 531.483 772.809 490.952 786.924 455.069 792.525 440.83 802.648 428.825 815.737 420.901L910.837 443.275C931.459 475.856 921.763 518.985 889.182 539.607 876.253 547.79 860.994 551.499 845.751 550.164L831.89 609.079 851.302 613.646C856.662 614.908 859.986 620.276 858.724 625.636 857.463 630.996 852.095 634.32 846.735 633.058L788.499 619.357C783.138 618.096 779.815 612.728 781.076 607.368 782.338 602.007 787.705 598.684 793.066 599.945L812.478 604.512ZM803.34 469.2 900.4 492.035C901.355 477.612 900.407 467.146 897.544 460.634L819.896 442.366C814.431 446.918 808.915 455.864 803.34 469.2Z" fill="#FFFFFF"/></g></g></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
23
assets/tags/logo_icon.svg
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<title>logo icon</title>
|
||||||
|
<defs>
|
||||||
|
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-1">
|
||||||
|
<stop stop-color="#00F1FF" offset="0%"></stop>
|
||||||
|
<stop stop-color="#008AFF" offset="100%"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g id="light" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="1" transform="translate(-460.000000, -159.000000)">
|
||||||
|
<g id="tittlebar" transform="translate(450.000000, 150.000000)">
|
||||||
|
<g id="logo-icon" transform="translate(10.000000, 9.000000)">
|
||||||
|
<g>
|
||||||
|
<rect id="矩形" fill="url(#linearGradient-1)" x="0" y="0" width="32" height="32" rx="8"></rect>
|
||||||
|
<path d="M23,25 L23,24.0002278 C21.6666667,24.0002278 21,24.0002278 21,24.0002278 L21,20 L22,20 L22,19 L21,19 L21,17 L20,17.5 L20,19 L19,19 L19,20 L20,20 L20,24.0002278 C20,24.0002278 20,24.0002278 20,24.0002278 C20,24.5523868 20.4476132,25 20.9997722,25 C20.9998481,25 20.9999241,25 21,25 L23,25 Z M24.0210414,23.9789586 L24.0210414,22.2215556 L24.0210414,22.2215556 L24.6565969,21.6226667 L27.2207674,25 L29.0052118,25 L25.6099302,20.7304444 L28.4678057,18.0074755 L26.6711391,18.0074755 L24.0210414,20.6204444 L24,15.5 L23,15 L23,25 C23.5639056,25 24.0210414,24.5428642 24.0210414,23.9789586 Z" id="tk" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||||
|
<path d="M10.275,24 C13.175,24 15.35,23.2 16.85,21.6 C18.275,20.075 19,17.825 19,15 C19,12.15 18.275,10.05 16.85,8.55 C15.35,6.95 13.175,6 10.275,6 L4,6 L4,24 L10.275,24 Z M9.725,21 L7,21 L7,9 L9.725,9 C11.95,9 13.575,9.15 14.6,10.175 C15.6,11.175 16,12.75 16,15 C16,17.2 15.6,18.9 14.6,19.95 C13.575,20.975 11.95,21 9.725,21 Z" id="D" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.0 KiB |
BIN
assets/tags/ubuntu-small.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
assets/tags/ubuntu.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
13
assets/tags/uos-authorize.svg
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="uos-托盘1-a" x1="15.968%" x2="100%" y1="14.224%" y2="60.554%">
|
||||||
|
<stop offset="0%" stop-color="#0071FF"/>
|
||||||
|
<stop offset="48.72%" stop-color="#00E8FC"/>
|
||||||
|
<stop offset="100%" stop-color="#00A2FF"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g fill="none" transform="translate(1 1)">
|
||||||
|
<circle cx="9" cy="9" r="9" fill="url(#uos-托盘1-a)"/>
|
||||||
|
<path fill="#FFF" d="M13,4.5 C13.5128358,4.5 13.9355072,4.88604019 13.9932723,5.38337887 L14,5.5 L14,9.5 C14,12.5 12,14.5 9,14.5 C6,14.5 4,12.5 4.0043492,9.70016408 L4,9.5 L4,5.5 C4,4.94771525 4.44771525,4.5 5,4.5 C5.51283584,4.5 5.93550716,4.88604019 5.99327227,5.38337887 L6,5.5 L6,9.5 C6,11.5 7.5,12.5 9,12.5 C10.5,12.5 12,11.5 12,9.5 L12,5.5 C12,4.94771525 12.4477153,4.5 13,4.5 Z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 873 B |
BIN
assets/tags/uos-small.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
13
assets/tags/uos.svg
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="uos-托盘1-a" x1="15.968%" x2="100%" y1="14.224%" y2="60.554%">
|
||||||
|
<stop offset="0%" stop-color="#0071FF"/>
|
||||||
|
<stop offset="48.72%" stop-color="#00E8FC"/>
|
||||||
|
<stop offset="100%" stop-color="#00A2FF"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g fill="none" transform="translate(1 1)">
|
||||||
|
<circle cx="9" cy="9" r="9" fill="url(#uos-托盘1-a)"/>
|
||||||
|
<path fill="#FFF" d="M13,4.5 C13.5128358,4.5 13.9355072,4.88604019 13.9932723,5.38337887 L14,5.5 L14,9.5 C14,12.5 12,14.5 9,14.5 C6,14.5 4,12.5 4.0043492,9.70016408 L4,9.5 L4,5.5 C4,4.94771525 4.44771525,4.5 5,4.5 C5.51283584,4.5 5.93550716,4.88604019 5.99327227,5.38337887 L6,5.5 L6,9.5 C6,11.5 7.5,12.5 9,12.5 C10.5,12.5 12,11.5 12,9.5 L12,5.5 C12,4.94771525 12.4477153,4.5 13,4.5 Z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 873 B |
67
main.cpp
@@ -1,67 +0,0 @@
|
|||||||
#include <DApplication>
|
|
||||||
#include <DWidgetUtil> //Dtk::Widget::moveToCenter(&w); 要调用它,就得引用DWidgetUtil
|
|
||||||
#include <QDesktopWidget>
|
|
||||||
#include <widget.h>
|
|
||||||
#include <QTranslator>
|
|
||||||
#include <DAboutDialog>
|
|
||||||
DWIDGET_USE_NAMESPACE
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
DApplication::loadDXcbPlugin(); //让bar处在标题栏中
|
|
||||||
DApplication a(argc, argv);
|
|
||||||
DAboutDialog dialog;
|
|
||||||
a.setAttribute(Qt::AA_UseHighDpiPixmaps);
|
|
||||||
a.loadTranslator();
|
|
||||||
a.setAboutDialog(&dialog);
|
|
||||||
dialog.setLicense("本程序按GPL第三版开源");
|
|
||||||
dialog.setVersion(DApplication::buildVersion("2.0+1"));
|
|
||||||
dialog.setAcknowledgementVisible(true);
|
|
||||||
dialog.setAcknowledgementLink("https://gitee.com/deepin-community-store/spark-store");
|
|
||||||
a.setApplicationAcknowledgementPage("https://gitee.com/deepin-community-store/spark-store");
|
|
||||||
dialog.setProductIcon(QIcon::fromTheme("spark-store")); //设置Logo
|
|
||||||
dialog.setProductName(QLabel::tr("Spark应用商店"));
|
|
||||||
//dialog.setDescription(QLabel::tr("社区驱动的一款第三方应用商店,为改变而生\n We born for change"));
|
|
||||||
dialog.setDescription(
|
|
||||||
"<span style=' font-size:10pt;font-weight:60;'>社区驱动的一款第三方应用商店</span><br/>"
|
|
||||||
"<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
|
|
||||||
"<span style=' font-size:12pt;'>Spark developers</span>");
|
|
||||||
dialog.setProductName(QLabel::tr("Spark应用商店"));
|
|
||||||
dialog.setCompanyLogo(QPixmap(":/Logo-Spark.png"));
|
|
||||||
dialog.setWebsiteName("The Spark Project");
|
|
||||||
dialog.setWebsiteLink("https://gitee.com/deepin-community-store");
|
|
||||||
Widget w;
|
|
||||||
QDesktopWidget *s=DApplication::desktop();
|
|
||||||
int d_w=s->width();
|
|
||||||
int d_h=s->height();
|
|
||||||
if(d_w<=1366){
|
|
||||||
w.setMinimumWidth(925);
|
|
||||||
w.resize(925,650);
|
|
||||||
}else if(d_w<=1920){
|
|
||||||
w.setMinimumWidth(1180);
|
|
||||||
w.resize(1180,760);
|
|
||||||
}else {
|
|
||||||
w.setMinimumWidth(1180);
|
|
||||||
w.resize(1180,760);
|
|
||||||
}
|
|
||||||
if(d_h<=768){
|
|
||||||
w.setMinimumHeight(650);
|
|
||||||
w.resize(925,650);
|
|
||||||
}else if(d_h<=1080){
|
|
||||||
w.setMinimumHeight(760);
|
|
||||||
w.resize(1180,760);
|
|
||||||
}else {
|
|
||||||
w.setMinimumHeight(760);
|
|
||||||
w.resize(1180,760);
|
|
||||||
}
|
|
||||||
// w.resize(925,650);
|
|
||||||
|
|
||||||
w.show();
|
|
||||||
QString arg1=argv[1];
|
|
||||||
if(arg1.left(6)=="spk://"){
|
|
||||||
w.openUrl(QUrl(argv[1]));
|
|
||||||
}
|
|
||||||
//让打开时界面显示在正中
|
|
||||||
Dtk::Widget::moveToCenter(&w);
|
|
||||||
|
|
||||||
return a.exec();
|
|
||||||
}
|
|
||||||
7
spark-store-project.pro
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
TEMPLATE = subdirs
|
||||||
|
CONFIG += ordered
|
||||||
|
|
||||||
|
SUBDIRS = third-party/QtNetworkService \
|
||||||
|
src/spark-store.pro
|
||||||
|
|
||||||
|
spark-store.depends = third-party/QtNetworkService
|
||||||
97
src/appitem.cpp
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
#include "appitem.h"
|
||||||
|
#include "ui_appitem.h"
|
||||||
|
#include <QtConcurrent>
|
||||||
|
#include <QNetworkAccessManager>
|
||||||
|
#include <QNetworkReply>
|
||||||
|
#include <QNetworkRequest>
|
||||||
|
#include <QEventLoop>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QGraphicsDropShadowEffect>
|
||||||
|
|
||||||
|
AppItem::AppItem(QWidget *parent) :
|
||||||
|
QWidget(parent),
|
||||||
|
ui(new Ui::AppItem)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
// auto shadow = new QGraphicsDropShadowEffect();
|
||||||
|
// shadow->setXOffset(0);
|
||||||
|
// shadow->setYOffset(1);
|
||||||
|
// shadow->setBlurRadius(2);
|
||||||
|
// shadow->setColor(QColor::fromRgba(qRgba(0, 0, 0, 180)));
|
||||||
|
// ui->container->setGraphicsEffect(shadow);
|
||||||
|
}
|
||||||
|
|
||||||
|
AppItem::~AppItem()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppItem::setTitle(QString title)
|
||||||
|
{
|
||||||
|
m_title = title;
|
||||||
|
ui->lbl_title->setText(title);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppItem::setDescription(QString description)
|
||||||
|
{
|
||||||
|
m_description = description;
|
||||||
|
QString elidedText = ui->lbl_desc->fontMetrics().elidedText(
|
||||||
|
description, Qt::ElideRight,
|
||||||
|
ui->lbl_desc->width(), Qt::TextShowMnemonic);
|
||||||
|
ui->lbl_desc->setText(elidedText);
|
||||||
|
ui->lbl_desc->setAlignment(Qt::AlignTop);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppItem::setIcon(QString icon)
|
||||||
|
{
|
||||||
|
m_icon = icon;
|
||||||
|
if (!icon.isEmpty()) {
|
||||||
|
downloadIcon(icon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppItem::setUrl(QString url)
|
||||||
|
{
|
||||||
|
m_url = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppItem::mousePressEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event);
|
||||||
|
emit clicked(QUrl(m_url));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 下载图标
|
||||||
|
* @param icon
|
||||||
|
*/
|
||||||
|
void AppItem::downloadIcon(QString icon)
|
||||||
|
{
|
||||||
|
QtConcurrent::run([=](){
|
||||||
|
auto reqManager = new QNetworkAccessManager();
|
||||||
|
QUrl url(icon);
|
||||||
|
QNetworkReply *reply = reqManager->get(QNetworkRequest(url));
|
||||||
|
QEventLoop loop;
|
||||||
|
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
|
||||||
|
connect(reply, &QNetworkReply::finished, this, [=] () { emit finished(); });
|
||||||
|
loop.exec();
|
||||||
|
reqManager->deleteLater();
|
||||||
|
QPixmap pixmap;
|
||||||
|
pixmap.loadFromData(reply->readAll());
|
||||||
|
pixmap = pixmap.scaled(78, 78, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||||
|
if (reply->error() == QNetworkReply::NoError) {
|
||||||
|
QMetaObject::invokeMethod(this, "loadIcon", Qt::QueuedConnection,
|
||||||
|
Q_ARG(QPixmap, pixmap));
|
||||||
|
} else {
|
||||||
|
qDebug() << reply->errorString();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppItem::loadIcon(QPixmap pic)
|
||||||
|
{
|
||||||
|
ui->lbl_icon->setPixmap(pic);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
44
src/appitem.h
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
#ifndef APPITEM_H
|
||||||
|
#define APPITEM_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class AppItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
class AppItem : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit AppItem(QWidget *parent = nullptr);
|
||||||
|
~AppItem();
|
||||||
|
|
||||||
|
void setTitle(QString title);
|
||||||
|
void setDescription(QString description);
|
||||||
|
void setIcon(QString icon);
|
||||||
|
void setUrl(QString url);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void mousePressEvent(QMouseEvent *event) override;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void clicked(QUrl url);
|
||||||
|
void finished();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void downloadIcon(QString icon);
|
||||||
|
void loadIcon(QPixmap pic);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::AppItem *ui;
|
||||||
|
|
||||||
|
QString m_title;
|
||||||
|
QString m_description;
|
||||||
|
QString m_icon;
|
||||||
|
QString m_url;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // APPITEM_H
|
||||||
160
src/appitem.ui
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>AppItem</class>
|
||||||
|
<widget class="QWidget" name="AppItem">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>333</width>
|
||||||
|
<height>133</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">QWidget#AppItem {
|
||||||
|
width: 300px;
|
||||||
|
height: 100px;
|
||||||
|
margin: 15px;
|
||||||
|
color: #6d6d6d;
|
||||||
|
border-radius: 18px;
|
||||||
|
background-color: width: 300px;
|
||||||
|
height: 100px;
|
||||||
|
margin: 15px;
|
||||||
|
color: #6d6d6d;
|
||||||
|
border-radius: 18px;
|
||||||
|
background-color: #F4F4F6;
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget#container {
|
||||||
|
background-color: #F4F4F6;
|
||||||
|
}
|
||||||
|
|
||||||
|
QLabel#lbl_icon {
|
||||||
|
background: transparent;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
QLabel#lbl_title {
|
||||||
|
text-align: left;
|
||||||
|
white-space: nowrap;
|
||||||
|
padding-right: 10px;
|
||||||
|
font-size: 19px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
QLabel#lbl_desc {
|
||||||
|
text-align: left;
|
||||||
|
font-weight: lighter;
|
||||||
|
white-space: nowrap;
|
||||||
|
font-size: 12px;
|
||||||
|
color: grey;
|
||||||
|
}</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QWidget" name="container" native="true">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="lbl_icon">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>100</width>
|
||||||
|
<height>100</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">width: 78px;
|
||||||
|
height: 70px;
|
||||||
|
padding: 10px;</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="scaledContents">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="lbl_title">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>200</width>
|
||||||
|
<height>50</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>200</width>
|
||||||
|
<height>50</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="lbl_desc">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>200</width>
|
||||||
|
<height>50</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>200</width>
|
||||||
|
<height>50</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "downloadlist.h"
|
#include "downloadlist.h"
|
||||||
#include "ui_downloadlist.h"
|
#include "ui_downloadlist.h"
|
||||||
|
#include "widget.h"
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
#include <QPixmap>
|
#include <QPixmap>
|
||||||
@@ -20,25 +21,27 @@ downloadlist::downloadlist(QWidget *parent) :
|
|||||||
ui->pushButton_3->hide();
|
ui->pushButton_3->hide();
|
||||||
ui->widget_spinner->start();
|
ui->widget_spinner->start();
|
||||||
ui->widget_spinner->hide();
|
ui->widget_spinner->hide();
|
||||||
action_dpkg->setText("dpkg");
|
action_dpkg->setText(tr("Spark Store App Installer"));
|
||||||
action_gdebi->setText("gdebi");
|
action_gdebi->setText(tr("gdebi"));
|
||||||
action_deepin->setText("深度安装器");
|
action_deepin->setText(tr("deepin deb installer"));
|
||||||
connect(action_dpkg,&QAction::triggered,[=](){downloadlist::install(1);});
|
connect(action_dpkg,&QAction::triggered,[=](){downloadlist::install(0);});
|
||||||
connect(action_gdebi,&QAction::triggered,[=](){downloadlist::install(0);});
|
connect(action_deepin,&QAction::triggered,[=](){downloadlist::install(1);});
|
||||||
connect(action_deepin,&QAction::triggered,[=](){downloadlist::install(2);});
|
connect(action_gdebi,&QAction::triggered,[=](){downloadlist::install(2);});
|
||||||
menu_install->addAction(action_gdebi);
|
|
||||||
//ssinstall命令存在时再加入该选项
|
//ssinstall命令存在时再加入该选项
|
||||||
QFile ssinstall("/bin/ssinstall");
|
QFile ssinstall("/bin/ssinstall");
|
||||||
ssinstall.open(QIODevice::ReadOnly);
|
ssinstall.open(QIODevice::ReadOnly);
|
||||||
if(ssinstall.isOpen()){
|
if(ssinstall.isOpen()){
|
||||||
menu_install->addAction(action_dpkg);
|
menu_install->addAction(action_dpkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
QFile deepin("/bin/deepin-deb-installer");
|
QFile deepin("/bin/deepin-deb-installer");
|
||||||
deepin.open(QIODevice::ReadOnly);
|
deepin.open(QIODevice::ReadOnly);
|
||||||
if(deepin.isOpen()){
|
if(deepin.isOpen()){
|
||||||
menu_install->addAction(action_deepin);
|
menu_install->addAction(action_deepin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
menu_install->addAction(action_gdebi);
|
||||||
}
|
}
|
||||||
|
|
||||||
downloadlist::~downloadlist()
|
downloadlist::~downloadlist()
|
||||||
@@ -51,7 +54,7 @@ void downloadlist::setValue(long long value)
|
|||||||
ui->progressBar->setValue(int(value));
|
ui->progressBar->setValue(int(value));
|
||||||
ui->label_2->setText(QString::number(double(value)/100)+"% ("+speed+")");
|
ui->label_2->setText(QString::number(double(value)/100)+"% ("+speed+")");
|
||||||
if(ui->label_2->text().left(4)=="100%"){
|
if(ui->label_2->text().left(4)=="100%"){
|
||||||
ui->label_2->setText("已完成,等待安装");
|
ui->label_2->setText(tr("Downloaded, waiting to install"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,8 +79,9 @@ void downloadlist::readyInstall()
|
|||||||
ui->progressBar->hide();
|
ui->progressBar->hide();
|
||||||
ui->pushButton_install->show();
|
ui->pushButton_install->show();
|
||||||
ui->pushButton_2->hide();
|
ui->pushButton_2->hide();
|
||||||
system("notify-send \""+ui->label->text().toUtf8()+"下载失败\"" +" --icon=/tmp/spark-store/icon_"+QString::number(num).toUtf8()+".png");
|
Widget::sendNotification(tr("Failed to download %1").arg(ui->label->text()), 5000,
|
||||||
ui->label_2->setText("下载失败,可能是网络错误");
|
"/tmp/spark-store/icon_"+QString::number(num).toUtf8()+".png");
|
||||||
|
ui->label_2->setText(tr("Download Failed,Check Your Connection"));
|
||||||
ui->pushButton_install->setEnabled(false);
|
ui->pushButton_install->setEnabled(false);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -87,7 +91,8 @@ void downloadlist::readyInstall()
|
|||||||
ui->pushButton_install->setEnabled(true);
|
ui->pushButton_install->setEnabled(true);
|
||||||
ui->pushButton_install->show();
|
ui->pushButton_install->show();
|
||||||
ui->pushButton_2->hide();
|
ui->pushButton_2->hide();
|
||||||
system("notify-send \""+ui->label->text().toUtf8()+"下载完成,等待安装\"" +" --icon=/tmp/spark-store/icon_"+QString::number(num).toUtf8()+".png");
|
Widget::sendNotification(tr("Finished downloading %1, awaiting to install").arg(ui->label->text()), 5000,
|
||||||
|
"/tmp/spark-store/icon_"+QString::number(num).toUtf8()+".png");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -119,32 +124,32 @@ void downloadlist::install(int t)
|
|||||||
ui->pushButton_install->hide();
|
ui->pushButton_install->hide();
|
||||||
ui->widget_spinner->show();
|
ui->widget_spinner->show();
|
||||||
qDebug()<<"/tmp/spark-store/"+ui->label_filename->text().toUtf8();
|
qDebug()<<"/tmp/spark-store/"+ui->label_filename->text().toUtf8();
|
||||||
ui->label_2->setText("正在安装,请稍候");
|
ui->label_2->setText(tr("Installing"));
|
||||||
QtConcurrent::run([=](){
|
QtConcurrent::run([=](){
|
||||||
QProcess installer;
|
QProcess installer;
|
||||||
if(!reinstall){
|
if(!reinstall){
|
||||||
switch (t) {
|
switch (t) {
|
||||||
case 0:
|
case 0:
|
||||||
installer.start("pkexec gdebi -n /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
installer.start("pkexec ssinstall /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
installer.start("pkexec ssinstall /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 1:
|
||||||
installer.start("deepin-deb-installer /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
installer.start("deepin-deb-installer /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
||||||
break;
|
break;
|
||||||
|
case 2:
|
||||||
|
installer.start("pkexec gdebi -n /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}else {
|
}else {
|
||||||
switch (t) {
|
switch (t) {
|
||||||
case 0:
|
case 0:
|
||||||
installer.start("pkexec gdebi -n /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
installer.start("pkexec ssinstall /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
installer.start("pkexec ssinstall /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 1:
|
||||||
installer.start("deepin-deb-installer /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
installer.start("deepin-deb-installer /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
||||||
break;
|
break;
|
||||||
|
case 2:
|
||||||
|
installer.start("pkexec gdebi -n /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool haveError=false;
|
bool haveError=false;
|
||||||
@@ -166,16 +171,16 @@ void downloadlist::install(int t)
|
|||||||
int error=QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
|
int error=QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
|
||||||
if(error==0){
|
if(error==0){
|
||||||
ui->pushButton_install->hide();
|
ui->pushButton_install->hide();
|
||||||
ui->label_2->setText("安装完成");
|
ui->label_2->setText(tr("Finish"));
|
||||||
ui->pushButton_3->show();
|
ui->pushButton_3->show();
|
||||||
}else {
|
}else {
|
||||||
ui->pushButton_install->show();
|
ui->pushButton_install->show();
|
||||||
ui->pushButton_install->setText("重装");
|
ui->pushButton_install->setText(tr("Retry"));
|
||||||
ui->label_2->setText("安装出现错误,可重新安装");
|
ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again"));
|
||||||
ui->pushButton_3->show();
|
ui->pushButton_3->show();
|
||||||
}
|
}
|
||||||
if(notRoot){
|
if(notRoot){
|
||||||
ui->label_2->setText("安装被终止,可重新安装");
|
ui->label_2->setText(tr("dpkg progress had been aborted,you can retry installation"));
|
||||||
ui->pushButton_install->show();
|
ui->pushButton_install->show();
|
||||||
ui->pushButton_3->hide();
|
ui->pushButton_3->hide();
|
||||||
}
|
}
|
||||||
@@ -197,7 +202,7 @@ void downloadlist::on_pushButton_install_clicked()
|
|||||||
|
|
||||||
void downloadlist::on_pushButton_2_clicked()
|
void downloadlist::on_pushButton_2_clicked()
|
||||||
{
|
{
|
||||||
ui->label_2->setText("已取消下载");
|
ui->label_2->setText(tr("Download canceled"));
|
||||||
ui->pushButton_2->setEnabled(false);
|
ui->pushButton_2->setEnabled(false);
|
||||||
ui->progressBar->hide();
|
ui->progressBar->hide();
|
||||||
close=true;
|
close=true;
|
||||||
@@ -103,7 +103,7 @@
|
|||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>名称</string>
|
<string>Name</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -186,7 +186,7 @@
|
|||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>等待开始下载</string>
|
<string>Waiting to download</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="alignment">
|
<property name="alignment">
|
||||||
<set>Qt::AlignCenter</set>
|
<set>Qt::AlignCenter</set>
|
||||||
@@ -237,7 +237,7 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>安装</string>
|
<string>Install</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -256,7 +256,7 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>取消</string>
|
<string>Cancel</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -275,7 +275,7 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>详情</string>
|
<string>Info</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
223
src/flowlayout.cpp
Normal file
@@ -0,0 +1,223 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2016 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the examples of the Qt Toolkit.
|
||||||
|
**
|
||||||
|
** $QT_BEGIN_LICENSE:BSD$
|
||||||
|
** Commercial License Usage
|
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
|
** accordance with the commercial license agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
**
|
||||||
|
** BSD License Usage
|
||||||
|
** Alternatively, you may use this file under the terms of the BSD license
|
||||||
|
** as follows:
|
||||||
|
**
|
||||||
|
** "Redistribution and use in source and binary forms, with or without
|
||||||
|
** modification, are permitted provided that the following conditions are
|
||||||
|
** met:
|
||||||
|
** * Redistributions of source code must retain the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer.
|
||||||
|
** * Redistributions in binary form must reproduce the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer in
|
||||||
|
** the documentation and/or other materials provided with the
|
||||||
|
** distribution.
|
||||||
|
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||||
|
** contributors may be used to endorse or promote products derived
|
||||||
|
** from this software without specific prior written permission.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <QtWidgets>
|
||||||
|
|
||||||
|
#include "flowlayout.h"
|
||||||
|
//! [1]
|
||||||
|
FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing)
|
||||||
|
: QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing)
|
||||||
|
{
|
||||||
|
setContentsMargins(margin, margin, margin, margin);
|
||||||
|
}
|
||||||
|
|
||||||
|
FlowLayout::FlowLayout(int margin, int hSpacing, int vSpacing)
|
||||||
|
: m_hSpace(hSpacing), m_vSpace(vSpacing)
|
||||||
|
{
|
||||||
|
setContentsMargins(margin, margin, margin, margin);
|
||||||
|
}
|
||||||
|
//! [1]
|
||||||
|
|
||||||
|
//! [2]
|
||||||
|
FlowLayout::~FlowLayout()
|
||||||
|
{
|
||||||
|
QLayoutItem *item;
|
||||||
|
while ((item = takeAt(0)))
|
||||||
|
delete item;
|
||||||
|
}
|
||||||
|
//! [2]
|
||||||
|
|
||||||
|
//! [3]
|
||||||
|
void FlowLayout::addItem(QLayoutItem *item)
|
||||||
|
{
|
||||||
|
itemList.append(item);
|
||||||
|
}
|
||||||
|
//! [3]
|
||||||
|
|
||||||
|
//! [4]
|
||||||
|
int FlowLayout::horizontalSpacing() const
|
||||||
|
{
|
||||||
|
if (m_hSpace >= 0) {
|
||||||
|
return m_hSpace;
|
||||||
|
} else {
|
||||||
|
return smartSpacing(QStyle::PM_LayoutHorizontalSpacing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int FlowLayout::verticalSpacing() const
|
||||||
|
{
|
||||||
|
if (m_vSpace >= 0) {
|
||||||
|
return m_vSpace;
|
||||||
|
} else {
|
||||||
|
return smartSpacing(QStyle::PM_LayoutVerticalSpacing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//! [4]
|
||||||
|
|
||||||
|
//! [5]
|
||||||
|
int FlowLayout::count() const
|
||||||
|
{
|
||||||
|
return itemList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
QLayoutItem *FlowLayout::itemAt(int index) const
|
||||||
|
{
|
||||||
|
return itemList.value(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
QLayoutItem *FlowLayout::takeAt(int index)
|
||||||
|
{
|
||||||
|
if (index >= 0 && index < itemList.size())
|
||||||
|
return itemList.takeAt(index);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//! [5]
|
||||||
|
|
||||||
|
//! [6]
|
||||||
|
Qt::Orientations FlowLayout::expandingDirections() const
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//! [6]
|
||||||
|
|
||||||
|
//! [7]
|
||||||
|
bool FlowLayout::hasHeightForWidth() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FlowLayout::heightForWidth(int width) const
|
||||||
|
{
|
||||||
|
int height = doLayout(QRect(0, 0, width, 0), true);
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
//! [7]
|
||||||
|
|
||||||
|
//! [8]
|
||||||
|
void FlowLayout::setGeometry(const QRect &rect)
|
||||||
|
{
|
||||||
|
QLayout::setGeometry(rect);
|
||||||
|
doLayout(rect, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
QSize FlowLayout::sizeHint() const
|
||||||
|
{
|
||||||
|
return minimumSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
QSize FlowLayout::minimumSize() const
|
||||||
|
{
|
||||||
|
QSize size;
|
||||||
|
QLayoutItem *item;
|
||||||
|
foreach (item, itemList)
|
||||||
|
size = size.expandedTo(item->minimumSize());
|
||||||
|
|
||||||
|
size += QSize(2*margin(), 2*margin());
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
//! [8]
|
||||||
|
|
||||||
|
//! [9]
|
||||||
|
int FlowLayout::doLayout(const QRect &rect, bool testOnly) const
|
||||||
|
{
|
||||||
|
int left, top, right, bottom;
|
||||||
|
getContentsMargins(&left, &top, &right, &bottom);
|
||||||
|
QRect effectiveRect = rect.adjusted(+left, +top, -right, -bottom);
|
||||||
|
int x = effectiveRect.x();
|
||||||
|
int y = effectiveRect.y();
|
||||||
|
int lineHeight = 0;
|
||||||
|
//! [9]
|
||||||
|
|
||||||
|
//! [10]
|
||||||
|
QLayoutItem *item;
|
||||||
|
foreach (item, itemList) {
|
||||||
|
QWidget *wid = item->widget();
|
||||||
|
int spaceX = horizontalSpacing();
|
||||||
|
if (spaceX == -1)
|
||||||
|
spaceX = wid->style()->layoutSpacing(
|
||||||
|
QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Horizontal);
|
||||||
|
int spaceY = verticalSpacing();
|
||||||
|
if (spaceY == -1)
|
||||||
|
spaceY = wid->style()->layoutSpacing(
|
||||||
|
QSizePolicy::PushButton, QSizePolicy::PushButton, Qt::Vertical);
|
||||||
|
//! [10]
|
||||||
|
//! [11]
|
||||||
|
int nextX = x + item->sizeHint().width() + spaceX;
|
||||||
|
if (nextX - spaceX > effectiveRect.right() && lineHeight > 0) {
|
||||||
|
x = effectiveRect.x();
|
||||||
|
y = y + lineHeight + spaceY;
|
||||||
|
nextX = x + item->sizeHint().width() + spaceX;
|
||||||
|
lineHeight = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!testOnly)
|
||||||
|
item->setGeometry(QRect(QPoint(x, y), item->sizeHint()));
|
||||||
|
|
||||||
|
x = nextX;
|
||||||
|
lineHeight = qMax(lineHeight, item->sizeHint().height());
|
||||||
|
}
|
||||||
|
return y + lineHeight - rect.y() + bottom;
|
||||||
|
}
|
||||||
|
//! [11]
|
||||||
|
//! [12]
|
||||||
|
int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const
|
||||||
|
{
|
||||||
|
QObject *parent = this->parent();
|
||||||
|
if (!parent) {
|
||||||
|
return -1;
|
||||||
|
} else if (parent->isWidgetType()) {
|
||||||
|
QWidget *pw = static_cast<QWidget *>(parent);
|
||||||
|
return pw->style()->pixelMetric(pm, 0, pw);
|
||||||
|
} else {
|
||||||
|
return static_cast<QLayout *>(parent)->spacing();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//! [12]
|
||||||
88
src/flowlayout.h
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2016 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the examples of the Qt Toolkit.
|
||||||
|
**
|
||||||
|
** $QT_BEGIN_LICENSE:BSD$
|
||||||
|
** Commercial License Usage
|
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
|
** accordance with the commercial license agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
**
|
||||||
|
** BSD License Usage
|
||||||
|
** Alternatively, you may use this file under the terms of the BSD license
|
||||||
|
** as follows:
|
||||||
|
**
|
||||||
|
** "Redistribution and use in source and binary forms, with or without
|
||||||
|
** modification, are permitted provided that the following conditions are
|
||||||
|
** met:
|
||||||
|
** * Redistributions of source code must retain the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer.
|
||||||
|
** * Redistributions in binary form must reproduce the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer in
|
||||||
|
** the documentation and/or other materials provided with the
|
||||||
|
** distribution.
|
||||||
|
** * Neither the name of The Qt Company Ltd nor the names of its
|
||||||
|
** contributors may be used to endorse or promote products derived
|
||||||
|
** from this software without specific prior written permission.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
||||||
|
**
|
||||||
|
** $QT_END_LICENSE$
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef FLOWLAYOUT_H
|
||||||
|
#define FLOWLAYOUT_H
|
||||||
|
|
||||||
|
#include <QLayout>
|
||||||
|
#include <QRect>
|
||||||
|
#include <QStyle>
|
||||||
|
//! [0]
|
||||||
|
class FlowLayout : public QLayout
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit FlowLayout(QWidget *parent, int margin = -1, int hSpacing = -1, int vSpacing = -1);
|
||||||
|
explicit FlowLayout(int margin = -1, int hSpacing = -1, int vSpacing = -1);
|
||||||
|
~FlowLayout();
|
||||||
|
|
||||||
|
void addItem(QLayoutItem *item) override;
|
||||||
|
int horizontalSpacing() const;
|
||||||
|
int verticalSpacing() const;
|
||||||
|
Qt::Orientations expandingDirections() const override;
|
||||||
|
bool hasHeightForWidth() const override;
|
||||||
|
int heightForWidth(int) const override;
|
||||||
|
int count() const override;
|
||||||
|
QLayoutItem *itemAt(int index) const override;
|
||||||
|
QSize minimumSize() const override;
|
||||||
|
void setGeometry(const QRect &rect) override;
|
||||||
|
QSize sizeHint() const override;
|
||||||
|
QLayoutItem *takeAt(int index) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int doLayout(const QRect &rect, bool testOnly) const;
|
||||||
|
int smartSpacing(QStyle::PixelMetric pm) const;
|
||||||
|
|
||||||
|
QList<QLayoutItem *> itemList;
|
||||||
|
int m_hSpace;
|
||||||
|
int m_vSpace;
|
||||||
|
};
|
||||||
|
//! [0]
|
||||||
|
|
||||||
|
#endif // FLOWLAYOUT_H
|
||||||
@@ -18,7 +18,6 @@ image_show::image_show(QWidget *parent) : QWidget(parent)
|
|||||||
|
|
||||||
void image_show::setImage(QPixmap image)
|
void image_show::setImage(QPixmap image)
|
||||||
{
|
{
|
||||||
|
|
||||||
QImage screen0;
|
QImage screen0;
|
||||||
screen0=image.toImage();
|
screen0=image.toImage();
|
||||||
// QPainter painter(&screen0);
|
// QPainter painter(&screen0);
|
||||||
90
src/main.cpp
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
#include <DApplication>
|
||||||
|
#include <DWidgetUtil> //Dtk::Widget::moveToCenter(&w); 要调用它,就得引用DWidgetUtil
|
||||||
|
#include <QDesktopWidget>
|
||||||
|
#include <widget.h>
|
||||||
|
#include <QTranslator>
|
||||||
|
#include <DAboutDialog>
|
||||||
|
#include "appitem.h"
|
||||||
|
|
||||||
|
DWIDGET_USE_NAMESPACE
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
DApplication::loadDXcbPlugin(); //让bar处在标题栏中
|
||||||
|
DApplication a(argc, argv);
|
||||||
|
|
||||||
|
a.setAttribute(Qt::AA_UseHighDpiPixmaps);
|
||||||
|
a.loadTranslator();//载入翻译
|
||||||
|
|
||||||
|
/* Customized DAboutDialog (Can't work on other distro like Ubuntu...)
|
||||||
|
*
|
||||||
|
* DAboutDialog dialog;
|
||||||
|
* a.setAboutDialog(&dialog);
|
||||||
|
* dialog.setLicense(QObject::tr("We publish this program under GPL V3"));
|
||||||
|
* dialog.setVersion(DApplication::buildVersion("Version 2.0.2.5"));
|
||||||
|
* dialog.setProductIcon(QIcon::fromTheme("spark-store")); //设置Logo
|
||||||
|
* dialog.setProductName(QLabel::tr("Spark Store"));
|
||||||
|
* dialog.setDescription(
|
||||||
|
* QObject::tr(
|
||||||
|
* "<span style=' font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/>"
|
||||||
|
* "<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
|
||||||
|
* "<span style=' font-size:12pt;'>Spark developers</span>"
|
||||||
|
* )
|
||||||
|
* );
|
||||||
|
* dialog.setProductName(QLabel::tr("Spark Store"));
|
||||||
|
* dialog.setCompanyLogo(QPixmap(":/Logo-Spark.png"));
|
||||||
|
* dialog.setWebsiteName(QObject::tr("The Spark Project"));
|
||||||
|
* dialog.setWebsiteLink("https://gitee.com/deepin-community-store");
|
||||||
|
*/
|
||||||
|
|
||||||
|
a.setProductName(QLabel::tr("Spark Store"));
|
||||||
|
a.setProductIcon(QIcon::fromTheme("spark-store")); //设置Logo
|
||||||
|
a.setOrganizationName("spark-union");
|
||||||
|
a.setOrganizationDomain("https://www.deepinos.org/");
|
||||||
|
a.setApplicationName("Spark Store"); //不需要翻译,否则 ~/.local/share/ 下文件夹名称也被翻译为中文
|
||||||
|
a.setApplicationVersion(DApplication::buildVersion("3.0~alpha2"));
|
||||||
|
a.setApplicationAcknowledgementPage("https://gitee.com/deepin-community-store/spark-store");
|
||||||
|
a.setApplicationDescription(
|
||||||
|
QObject::tr(
|
||||||
|
"<span style='font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/>"
|
||||||
|
"<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
|
||||||
|
"<span style='font-size:12pt;'>Spark developers</span><br/><br/>"
|
||||||
|
"Published under GPL V3"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
Widget w;
|
||||||
|
QDesktopWidget *s=DApplication::desktop();
|
||||||
|
int d_w=s->width();
|
||||||
|
int d_h=s->height();
|
||||||
|
if(d_w<=1366){
|
||||||
|
w.setMinimumWidth(925);
|
||||||
|
w.resize(925,650);
|
||||||
|
}else if(d_w<=1920){
|
||||||
|
w.setMinimumWidth(1180);
|
||||||
|
w.resize(1180,760);
|
||||||
|
}else {
|
||||||
|
w.setMinimumWidth(1180);
|
||||||
|
w.resize(1180,760);
|
||||||
|
}
|
||||||
|
if(d_h<=768){
|
||||||
|
w.setMinimumHeight(650);
|
||||||
|
w.resize(925,650);
|
||||||
|
}else if(d_h<=1080){
|
||||||
|
w.setMinimumHeight(760);
|
||||||
|
w.resize(1180,760);
|
||||||
|
}else {
|
||||||
|
w.setMinimumHeight(760);
|
||||||
|
w.resize(1180,760);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString arg1=argv[1];
|
||||||
|
if(arg1.left(6)=="spk://"){
|
||||||
|
w.openUrl(QUrl(argv[1]));
|
||||||
|
}
|
||||||
|
//让打开时界面显示在正中
|
||||||
|
Dtk::Widget::moveToCenter(&w);
|
||||||
|
|
||||||
|
w.show();
|
||||||
|
|
||||||
|
return a.exec();
|
||||||
|
}
|
||||||
@@ -7,11 +7,9 @@
|
|||||||
QT += core gui network concurrent webenginewidgets
|
QT += core gui network concurrent webenginewidgets
|
||||||
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||||
TRANSLATIONS = ./trans/lang_English.ts \
|
|
||||||
./trans/lang_Chinses.ts
|
|
||||||
|
|
||||||
CONFIG += link_pkgconfig
|
CONFIG += c++11 link_pkgconfig
|
||||||
PKGCONFIG += dtkwidget
|
PKGCONFIG += dtkwidget glib-2.0 gdk-pixbuf-2.0 libnotify
|
||||||
|
|
||||||
TARGET = spark-store
|
TARGET = spark-store
|
||||||
TEMPLATE = app
|
TEMPLATE = app
|
||||||
@@ -27,28 +25,53 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
|||||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||||
|
|
||||||
|
|
||||||
SOURCES += main.cpp\
|
SOURCES += main.cpp\
|
||||||
|
appitem.cpp \
|
||||||
widget.cpp \
|
widget.cpp \
|
||||||
downloadlist.cpp \
|
downloadlist.cpp \
|
||||||
image_show.cpp \
|
image_show.cpp \
|
||||||
big_image.cpp \
|
big_image.cpp \
|
||||||
progressload.cpp
|
progressload.cpp \
|
||||||
|
flowlayout.cpp \
|
||||||
|
workerthreads.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
|
appitem.h \
|
||||||
widget.h \
|
widget.h \
|
||||||
downloadlist.h \
|
downloadlist.h \
|
||||||
image_show.h \
|
image_show.h \
|
||||||
big_image.h \
|
big_image.h \
|
||||||
progressload.h
|
progressload.h \
|
||||||
|
flowlayout.h \
|
||||||
|
workerthreads.h
|
||||||
|
|
||||||
CONFIG += c++11
|
|
||||||
|
|
||||||
FORMS += \
|
FORMS += \
|
||||||
|
appitem.ui \
|
||||||
widget.ui \
|
widget.ui \
|
||||||
downloadlist.ui
|
downloadlist.ui
|
||||||
|
|
||||||
RESOURCES += \
|
RESOURCES += \
|
||||||
icons.qrc
|
../assets/icons.qrc
|
||||||
|
|
||||||
|
DISTFILES += \
|
||||||
|
../assets/tags/a2d-small.png \
|
||||||
|
../assets/tags/a2d.png \
|
||||||
|
../assets/tags/community-small.png \
|
||||||
|
../assets/tags/community.png \
|
||||||
|
../assets/tags/deepin-small.png \
|
||||||
|
../assets/tags/dtk-small.png \
|
||||||
|
../assets/tags/ubuntu-small.png \
|
||||||
|
../assets/tags/ubuntu.png \
|
||||||
|
../assets/tags/uos-small.png \
|
||||||
|
../assets/tags/community.svg \
|
||||||
|
../assets/tags/deepin.svg \
|
||||||
|
../assets/tags/logo_icon.svg \
|
||||||
|
../assets/tags/uos.svg
|
||||||
|
|
||||||
|
TRANSLATIONS = ../translations/spark-store_en.ts \
|
||||||
|
../translations/spark-store_zh_CN.ts
|
||||||
|
../translations/spark-store_fr.ts\
|
||||||
|
|
||||||
|
DEFINES += QT_APP_DEBUG
|
||||||
|
include(../third-party/QtNetworkService/QtNetworkService.pri)
|
||||||
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include <libnotify/notify.h>
|
||||||
#include "widget.h"
|
#include "widget.h"
|
||||||
#include "ui_widget.h"
|
#include "ui_widget.h"
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
@@ -8,8 +9,8 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QJsonDocument>
|
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
#include <QJsonDocument>
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QByteArray>
|
#include <QByteArray>
|
||||||
#include <QPixmap>
|
#include <QPixmap>
|
||||||
@@ -18,6 +19,7 @@
|
|||||||
#include <QIcon>
|
#include <QIcon>
|
||||||
#include <QGraphicsOpacityEffect>
|
#include <QGraphicsOpacityEffect>
|
||||||
#include <QDesktopServices>
|
#include <QDesktopServices>
|
||||||
|
#include <DDialog>
|
||||||
#include <DSettings>
|
#include <DSettings>
|
||||||
#include <DSettingsOption>
|
#include <DSettingsOption>
|
||||||
#include <DSettingsDialog>
|
#include <DSettingsDialog>
|
||||||
@@ -26,8 +28,14 @@
|
|||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
#include <DApplication>
|
#include <DApplication>
|
||||||
#include <DGuiApplicationHelper>
|
#include <DGuiApplicationHelper>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include "HttpClient.h"
|
||||||
|
#include "appitem.h"
|
||||||
|
#include "flowlayout.h"
|
||||||
|
|
||||||
DWIDGET_USE_NAMESPACE
|
DWIDGET_USE_NAMESPACE
|
||||||
|
|
||||||
|
|
||||||
Widget::Widget(DBlurEffectWidget *parent) :
|
Widget::Widget(DBlurEffectWidget *parent) :
|
||||||
DBlurEffectWidget(parent),
|
DBlurEffectWidget(parent),
|
||||||
ui(new Ui::Widget)
|
ui(new Ui::Widget)
|
||||||
@@ -39,6 +47,8 @@ Widget::Widget(DBlurEffectWidget *parent) :
|
|||||||
m_loadweb=ui->progressload;
|
m_loadweb=ui->progressload;
|
||||||
m_loadweb->show();
|
m_loadweb->show();
|
||||||
|
|
||||||
|
httpClient = new AeaQt::HttpClient;
|
||||||
|
|
||||||
connect(ui->menu_main,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(0);});
|
connect(ui->menu_main,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(0);});
|
||||||
connect(ui->menu_network,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(1);});
|
connect(ui->menu_network,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(1);});
|
||||||
connect(ui->menu_chat,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(2);});
|
connect(ui->menu_chat,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(2);});
|
||||||
@@ -55,15 +65,22 @@ Widget::Widget(DBlurEffectWidget *parent) :
|
|||||||
connect(ui->menu_download,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(13);});
|
connect(ui->menu_download,&QPushButton::clicked,[=](){Widget::chooseLeftMenu(13);});
|
||||||
// connect((ui->titlebar))
|
// connect((ui->titlebar))
|
||||||
|
|
||||||
|
connect(&appinfoLoadThread, SIGNAL(requestResetUi()), this, SLOT(sltAppinfoResetUi()), Qt::ConnectionType::BlockingQueuedConnection);
|
||||||
|
connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::requestSetTags, this, &Widget::sltAppinfoTags, Qt::ConnectionType::BlockingQueuedConnection);
|
||||||
|
connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::requestSetAppInformation, this, &Widget::sltAppinfoDetails, Qt::ConnectionType::BlockingQueuedConnection);
|
||||||
|
connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::finishedIconLoad, this, &Widget::sltAppinfoIcon, Qt::ConnectionType::BlockingQueuedConnection);
|
||||||
|
connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::finishedScreenshotLoad, this, &Widget::sltAppinfoScreenshot, Qt::ConnectionType::BlockingQueuedConnection);
|
||||||
|
connect(&appinfoLoadThread, &SpkAppInfoLoaderThread::finishAllLoading, this, &Widget::sltAppinfoFinish, Qt::ConnectionType::BlockingQueuedConnection);
|
||||||
|
|
||||||
// 搜索事件
|
// 搜索事件
|
||||||
connect(searchEdit,&DSearchEdit::editingFinished,this,[=](){
|
connect(searchEdit,&DSearchEdit::returnPressed ,this,[=](){
|
||||||
|
qDebug() << "触发了搜索,呜啦啦啦!";
|
||||||
QString searchtext=searchEdit->text();
|
QString searchtext=searchEdit->text();
|
||||||
if(searchtext!=""){
|
if(searchtext!=""){
|
||||||
qDebug()<<searchEdit->text();
|
qDebug()<<searchEdit->text();
|
||||||
searchApp(searchtext);
|
searchApp(searchtext);
|
||||||
}
|
}
|
||||||
searchEdit->clearEdit();
|
this->setFocus();
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType) {
|
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType) {
|
||||||
@@ -73,7 +90,7 @@ Widget::Widget(DBlurEffectWidget *parent) :
|
|||||||
qDebug()<<"Dark";
|
qDebug()<<"Dark";
|
||||||
setTheme(true,main_color);
|
setTheme(true,main_color);
|
||||||
}else {
|
}else {
|
||||||
qDebug()<<"White";
|
qDebug()<<"Light";
|
||||||
setTheme(false,main_color);
|
setTheme(false,main_color);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -101,11 +118,13 @@ Widget::Widget(DBlurEffectWidget *parent) :
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
notify_init(tr("Spark\\ Store").toLocal8Bit());
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget::~Widget()
|
Widget::~Widget()
|
||||||
{
|
{
|
||||||
|
notify_uninit();
|
||||||
|
|
||||||
delete ui;
|
delete ui;
|
||||||
qDebug()<<"exit";
|
qDebug()<<"exit";
|
||||||
DApplication::quit();
|
DApplication::quit();
|
||||||
@@ -124,6 +143,8 @@ void Widget::initUI()
|
|||||||
ui->icon->setPixmap(QIcon::fromTheme("spark-store").pixmap(36,36));
|
ui->icon->setPixmap(QIcon::fromTheme("spark-store").pixmap(36,36));
|
||||||
ui->titlebar->setFixedHeight(50);
|
ui->titlebar->setFixedHeight(50);
|
||||||
|
|
||||||
|
label_screen << ui->screen_0 << ui->screen_1 << ui->screen_2 << ui->screen_3 << ui->screen_4;
|
||||||
|
|
||||||
// 初始化分界线
|
// 初始化分界线
|
||||||
QGraphicsOpacityEffect *opacityEffect_1=new QGraphicsOpacityEffect;
|
QGraphicsOpacityEffect *opacityEffect_1=new QGraphicsOpacityEffect;
|
||||||
opacityEffect_1->setOpacity(0.1);
|
opacityEffect_1->setOpacity(0.1);
|
||||||
@@ -141,18 +162,34 @@ void Widget::initUI()
|
|||||||
titlebar=ui->titlebar;
|
titlebar=ui->titlebar;
|
||||||
titlebar->setCustomWidget(w_titlebar);
|
titlebar->setCustomWidget(w_titlebar);
|
||||||
// titlebar->setIcon(QIcon::fromTheme("spark-store"));
|
// titlebar->setIcon(QIcon::fromTheme("spark-store"));
|
||||||
titlebar->setTitle("星火应用商店");
|
titlebar->setTitle(tr("Spark Store"));
|
||||||
searchEdit->setPlaceholderText("搜索或打开链接");
|
searchEdit->setPlaceholderText(tr("Search or enter spk://"));
|
||||||
searchEdit->setFixedWidth(300);
|
searchEdit->setFixedWidth(300);
|
||||||
titlebar->setSeparatorVisible(false);
|
titlebar->setSeparatorVisible(false);
|
||||||
// titlebar->setAutoHideOnFullscreen(true);
|
// titlebar->setAutoHideOnFullscreen(true);
|
||||||
|
|
||||||
// 添加菜单项
|
// 添加菜单项
|
||||||
QAction *setting=new QAction("设置");
|
QAction *actionSubmission = new QAction(tr("Submit App"), this);
|
||||||
|
QAction *setting=new QAction(tr("Settings"));
|
||||||
|
|
||||||
QMenu *menu=new QMenu;
|
QMenu *menu=new QMenu;
|
||||||
|
|
||||||
menu->addAction(setting);
|
menu->addAction(setting);
|
||||||
|
menu->addAction(actionSubmission);
|
||||||
titlebar->setMenu(menu);
|
titlebar->setMenu(menu);
|
||||||
connect(setting,&QAction::triggered,this,&Widget::opensetting);
|
connect(actionSubmission, &QAction::triggered, this, [ = ] () {
|
||||||
|
QDesktopServices::openUrl(QUrl("https://upload.spark-app.store/"));
|
||||||
|
});
|
||||||
|
connect(setting, &QAction::triggered, this, &Widget::opensetting);
|
||||||
|
|
||||||
|
// 载入自定义字体
|
||||||
|
int loadedFontID = QFontDatabase::addApplicationFont(":/fonts/fonts/华康少女字体.ttf");
|
||||||
|
QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(loadedFontID);
|
||||||
|
if(!loadedFontFamilies.isEmpty())
|
||||||
|
font = loadedFontFamilies.at(0);
|
||||||
|
/* 全局字体设置
|
||||||
|
* DApplication::setFont(font);
|
||||||
|
*/
|
||||||
|
|
||||||
// 初始化菜单数组
|
// 初始化菜单数组
|
||||||
left_list[0]=ui->menu_main;
|
left_list[0]=ui->menu_main;
|
||||||
@@ -170,9 +207,10 @@ void Widget::initUI()
|
|||||||
left_list[12]=ui->menu_other;
|
left_list[12]=ui->menu_other;
|
||||||
left_list[13]=ui->menu_download;
|
left_list[13]=ui->menu_download;
|
||||||
|
|
||||||
|
|
||||||
ui->label_show->hide();
|
ui->label_show->hide();
|
||||||
|
|
||||||
|
// 搜索列表页
|
||||||
|
applist_grid = new FlowLayout;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::initConfig()
|
void Widget::initConfig()
|
||||||
@@ -193,9 +231,9 @@ void Widget::initConfig()
|
|||||||
QSettings readConfig(QDir::homePath()+"/.config/spark-store/config.ini",QSettings::IniFormat);
|
QSettings readConfig(QDir::homePath()+"/.config/spark-store/config.ini",QSettings::IniFormat);
|
||||||
if(readConfig.value("server/choose").toString()!=""){
|
if(readConfig.value("server/choose").toString()!=""){
|
||||||
ui->comboBox_server->setCurrentText(readConfig.value("server/choose").toString());
|
ui->comboBox_server->setCurrentText(readConfig.value("server/choose").toString());
|
||||||
serverUrl=readConfig.value("server/choose").toString();
|
appinfoLoadThread.setServer(serverUrl=readConfig.value("server/choose").toString());
|
||||||
}else {
|
}else {
|
||||||
serverUrl="http://sucdn.jerrywang.top/"; // 默认URL
|
appinfoLoadThread.setServer(serverUrl="http://sucdn.jerrywang.top/"); // 默认URL
|
||||||
}
|
}
|
||||||
configCanSave=true; // 防止触发保存配置信号
|
configCanSave=true; // 防止触发保存配置信号
|
||||||
menuUrl[0]=serverUrl + "store/#/";
|
menuUrl[0]=serverUrl + "store/#/";
|
||||||
@@ -215,13 +253,13 @@ void Widget::initConfig()
|
|||||||
|
|
||||||
|
|
||||||
//web控件初始化
|
//web控件初始化
|
||||||
// ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); //用来激活接受linkClicked信号
|
// ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); //用来激活接受linkClicked信号
|
||||||
// ui->webView->page()->settings()->setAttribute(QWebSettings::JavascriptEnabled,true);
|
// ui->webView->page()->settings()->setAttribute(QWebSettings::JavascriptEnabled,true);
|
||||||
ui->webfoot->hide();
|
ui->webfoot->hide();
|
||||||
|
|
||||||
//初始化首页
|
//初始化首页
|
||||||
ui->webEngineView->setUrl(menuUrl[0]);
|
ui->webEngineView->setUrl(menuUrl[0]);
|
||||||
// ui->webEngineView->setUrl(menuUrl[1]);
|
// ui->webEngineView->setUrl(menuUrl[1]);
|
||||||
|
|
||||||
//给下载列表赋值到数组,方便调用
|
//给下载列表赋值到数组,方便调用
|
||||||
for (int i =0; i<LIST_MAX;i++){
|
for (int i =0; i<LIST_MAX;i++){
|
||||||
@@ -234,7 +272,7 @@ void Widget::initConfig()
|
|||||||
if(aptserver.isOpen()){
|
if(aptserver.isOpen()){
|
||||||
ui->label_aptserver->setText(aptserver.readAll());
|
ui->label_aptserver->setText(aptserver.readAll());
|
||||||
}else {
|
}else {
|
||||||
ui->label_aptserver->setText("不存在");
|
ui->label_aptserver->setText(tr("Not Exist"));
|
||||||
}
|
}
|
||||||
aptserver.close();
|
aptserver.close();
|
||||||
|
|
||||||
@@ -253,9 +291,10 @@ void Widget::setTheme(bool isDark,QColor color)
|
|||||||
ui->btn_openDir->setStyleSheet("color:#8B91A1;background-color:#2E2F30;border:0px");
|
ui->btn_openDir->setStyleSheet("color:#8B91A1;background-color:#2E2F30;border:0px");
|
||||||
ui->webfoot->setStyleSheet("background-color:#252525");
|
ui->webfoot->setStyleSheet("background-color:#252525");
|
||||||
ui->label->setStyleSheet("background-color:#252525");
|
ui->label->setStyleSheet("background-color:#252525");
|
||||||
// ui->scrollArea->setStyleSheet("background-color:#252525");
|
// ui->scrollArea->setStyleSheet("background-color:#252525");
|
||||||
ui->label_show->setStyleSheet("background-color:#252525");
|
ui->label_show->setStyleSheet("background-color:#252525");
|
||||||
ui->pushButton_return->setIcon(QIcon(":/icons/icons/category_active_dark.svg"));
|
ui->pushButton_return->setIcon(QIcon(":/icons/icons/category_active_dark.svg"));
|
||||||
|
ui->pushButton_refresh->setIcon(QIcon(":/icons/icons/refresh-page-dark.svg"));
|
||||||
}else {
|
}else {
|
||||||
// 亮色模式
|
// 亮色模式
|
||||||
themeIsDark=false;
|
themeIsDark=false;
|
||||||
@@ -263,9 +302,10 @@ void Widget::setTheme(bool isDark,QColor color)
|
|||||||
ui->webfoot->setStyleSheet("background-color:#FFFFFF");
|
ui->webfoot->setStyleSheet("background-color:#FFFFFF");
|
||||||
ui->btn_openDir->setStyleSheet("color:#505050;background-color:#FBFBFB;border:0px");
|
ui->btn_openDir->setStyleSheet("color:#505050;background-color:#FBFBFB;border:0px");
|
||||||
ui->label->setStyleSheet("background-color:#FFFFFF");
|
ui->label->setStyleSheet("background-color:#FFFFFF");
|
||||||
// ui->scrollArea->setStyleSheet("background-color:#F8F8F8");
|
// ui->scrollArea->setStyleSheet("background-color:#F8F8F8");
|
||||||
ui->label_show->setStyleSheet("background-color:#F8F8F8");
|
ui->label_show->setStyleSheet("background-color:#F8F8F8");
|
||||||
ui->pushButton_return->setIcon(QIcon(":/icons/icons/category_active.svg"));
|
ui->pushButton_return->setIcon(QIcon(":/icons/icons/category_active.svg"));
|
||||||
|
ui->pushButton_refresh->setIcon(QIcon(":/icons/icons/refresh-page.svg"));
|
||||||
}
|
}
|
||||||
main_color=color;
|
main_color=color;
|
||||||
m_loadweb->setTheme(themeIsDark,color);
|
m_loadweb->setTheme(themeIsDark,color);
|
||||||
@@ -273,7 +313,6 @@ void Widget::setTheme(bool isDark,QColor color)
|
|||||||
if(ui->stackedWidget->currentIndex()==0){
|
if(ui->stackedWidget->currentIndex()==0){
|
||||||
chooseLeftMenu(nowMenu);
|
chooseLeftMenu(nowMenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DTitlebar* Widget::getTitlebar()
|
DTitlebar* Widget::getTitlebar()
|
||||||
@@ -281,6 +320,34 @@ DTitlebar* Widget::getTitlebar()
|
|||||||
return ui->titlebar;
|
return ui->titlebar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NotifyNotification *_notify = nullptr;
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Widget::sendNotification(const char *message, const int msTimeout, const QString &icon)
|
||||||
|
{
|
||||||
|
if(_notify == nullptr)
|
||||||
|
{
|
||||||
|
_notify = notify_notification_new(tr("Spark\\ Store").toLocal8Bit(), message, icon.toLocal8Bit());
|
||||||
|
notify_notification_set_timeout(_notify, msTimeout);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
notify_notification_update(_notify, tr("Spark\\ Store").toLocal8Bit(), message, icon.toLocal8Bit());
|
||||||
|
|
||||||
|
notify_notification_show(_notify, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
void Widget::updateUI()
|
void Widget::updateUI()
|
||||||
{
|
{
|
||||||
if(themeIsDark){
|
if(themeIsDark){
|
||||||
@@ -315,16 +382,32 @@ void Widget::updateUI()
|
|||||||
left_list[13]->setIcon(QIcon(":/icons/icons/downloads-symbolic.svg"));
|
left_list[13]->setIcon(QIcon(":/icons/icons/downloads-symbolic.svg"));
|
||||||
}
|
}
|
||||||
for (int i=0;i<14;i++) {
|
for (int i=0;i<14;i++) {
|
||||||
left_list[i]->setFont(QFont("",11));
|
|
||||||
|
/* 设置左侧菜单字体
|
||||||
|
* QFont temp = font;
|
||||||
|
* temp.setPixelSize(15);
|
||||||
|
* left_list[i]->setFont(temp);
|
||||||
|
*/
|
||||||
|
|
||||||
left_list[i]->setFixedHeight(38);
|
left_list[i]->setFixedHeight(38);
|
||||||
if(themeIsDark){
|
if(themeIsDark){
|
||||||
left_list[i]->setStyleSheet("color:#FFFFFF;border:0px");
|
// 中文环境菜单文字居中,其他则左对齐
|
||||||
|
if(QLocale::system().name() == "zh_CN")
|
||||||
|
left_list[i]->setStyleSheet("color:#FFFFFF;border:0px;");
|
||||||
|
else
|
||||||
|
left_list[i]->setStyleSheet("color:#FFFFFF;border:0px;text-align:left;padding-left:15px;");
|
||||||
}else {
|
}else {
|
||||||
left_list[i]->setStyleSheet("color:#252525;border:0px");
|
if(QLocale::system().name() == "zh_CN")
|
||||||
|
left_list[i]->setStyleSheet("color:#252525;border:0px;");
|
||||||
|
else
|
||||||
|
left_list[i]->setStyleSheet("color:#252525;border:0px;text-align:left;padding-left:15px;");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
left_list[nowMenu]->setStyleSheet("color:#FFFFFF;background-color:"+main_color.name()+";border-radius:8;border:0px");
|
if(QLocale::system().name() == "zh_CN")
|
||||||
|
left_list[nowMenu]->setStyleSheet("color:#FFFFFF;background-color:"+main_color.name()+";border-radius:8;border:0px;");
|
||||||
|
else
|
||||||
|
left_list[nowMenu]->setStyleSheet("color:#FFFFFF;background-color:"+main_color.name()+";border-radius:8;border:0px;text-align:left;padding-left:15px;");
|
||||||
switch (nowMenu) {
|
switch (nowMenu) {
|
||||||
case 0:
|
case 0:
|
||||||
left_list[0]->setIcon(QIcon(":/icons/icons/homepage_dark.svg"));
|
left_list[0]->setIcon(QIcon(":/icons/icons/homepage_dark.svg"));
|
||||||
@@ -376,8 +459,16 @@ void Widget::chooseLeftMenu(int index)
|
|||||||
{
|
{
|
||||||
nowMenu=index;
|
nowMenu=index;
|
||||||
|
|
||||||
|
// 菜单切换时,清除搜索栏的内容
|
||||||
|
if (!searchEdit->text().isEmpty()) {
|
||||||
|
searchEdit->clear();
|
||||||
|
}
|
||||||
|
|
||||||
updateUI();
|
updateUI();
|
||||||
left_list[index]->setStyleSheet("color:#FFFFFF;background-color:"+main_color.name()+";border-radius:8;border:0px");
|
if(QLocale::system().name() == "zh_CN")
|
||||||
|
left_list[index]->setStyleSheet("color:#FFFFFF;background-color:"+main_color.name()+";border-radius:8;border:0px;");
|
||||||
|
else
|
||||||
|
left_list[index]->setStyleSheet("color:#FFFFFF;background-color:"+main_color.name()+";border-radius:8;border:0px;text-align:left;padding-left:15px;");
|
||||||
if(index<=12){
|
if(index<=12){
|
||||||
if(themeIsDark){
|
if(themeIsDark){
|
||||||
QString darkurl=menuUrl[index].toString();
|
QString darkurl=menuUrl[index].toString();
|
||||||
@@ -399,6 +490,7 @@ void Widget::chooseLeftMenu(int index)
|
|||||||
}else if (index==13) {
|
}else if (index==13) {
|
||||||
ui->stackedWidget->setCurrentIndex(1);
|
ui->stackedWidget->setCurrentIndex(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::setfoot(int h)
|
void Widget::setfoot(int h)
|
||||||
@@ -412,10 +504,10 @@ void Widget::updatefoot()
|
|||||||
ui->webfoot->setFixedHeight(allh-foot);
|
ui->webfoot->setFixedHeight(allh-foot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::loadappinfo(QUrl arg1)
|
int Widget::loadappinfo(QUrl arg1)
|
||||||
{
|
{
|
||||||
if(arg1.isEmpty()){
|
if(arg1.isEmpty()){
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 先隐藏详情页负责显示截图的label
|
// 先隐藏详情页负责显示截图的label
|
||||||
@@ -436,9 +528,11 @@ void Widget::loadappinfo(QUrl arg1)
|
|||||||
|
|
||||||
// 重置UI状态
|
// 重置UI状态
|
||||||
ui->pushButton_uninstall->hide();
|
ui->pushButton_uninstall->hide();
|
||||||
ui->label_show->setText("正在加载,请稍候");
|
ui->pushButton_website->setEnabled(false);
|
||||||
|
ui->pushButton->setEnabled(false);
|
||||||
|
ui->pushButton_translate->setEnabled(false);
|
||||||
|
ui->label_show->setText("Loading...");
|
||||||
ui->label_show->show();
|
ui->label_show->show();
|
||||||
ui->pushButton_website->hide();
|
|
||||||
|
|
||||||
QProcess get_json;
|
QProcess get_json;
|
||||||
QDir dir("/tmp");
|
QDir dir("/tmp");
|
||||||
@@ -447,6 +541,11 @@ void Widget::loadappinfo(QUrl arg1)
|
|||||||
|
|
||||||
get_json.start("curl -o app.json "+arg1.toString());
|
get_json.start("curl -o app.json "+arg1.toString());
|
||||||
get_json.waitForFinished();
|
get_json.waitForFinished();
|
||||||
|
if(get_json.exitCode())
|
||||||
|
{
|
||||||
|
sendNotification(tr("Failed to download app info. Please check internet connection."));
|
||||||
|
}
|
||||||
|
|
||||||
QFile app_json("app.json");
|
QFile app_json("app.json");
|
||||||
if(app_json.open(QIODevice::ReadOnly)){
|
if(app_json.open(QIODevice::ReadOnly)){
|
||||||
// 成功得到json文件
|
// 成功得到json文件
|
||||||
@@ -474,20 +573,20 @@ void Widget::loadappinfo(QUrl arg1)
|
|||||||
ui->label_show->show();
|
ui->label_show->show();
|
||||||
// 软件信息加载
|
// 软件信息加载
|
||||||
QString info;
|
QString info;
|
||||||
info= "包名: "+json["Pkgname"].toString()+"\n";
|
info= tr("PkgName: ")+json["Pkgname"].toString()+"\n";
|
||||||
info+="版本号: "+json["Version"].toString()+"\n";
|
info+=tr("Version: ")+json["Version"].toString()+"\n";
|
||||||
if(json["Author"].toString()!="" && json["Author"].toString()!=" "){
|
if(json["Author"].toString()!="" && json["Author"].toString()!=" "){
|
||||||
info+="作者: "+json["Author"].toString()+"\n";
|
info+=tr("Author: ")+json["Author"].toString()+"\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if(json["Website"].toString()!="" && json["Website"].toString()!=" "){
|
if(json["Website"].toString()!="" && json["Website"].toString()!=" "){
|
||||||
info+="官网: "+json["Website"].toString()+"\n";
|
info+=tr("Official Site: ")+json["Website"].toString()+"\n";
|
||||||
ui->pushButton_website->show();
|
ui->pushButton_website->show();
|
||||||
appweb=json["Website"].toString();
|
appweb=json["Website"].toString();
|
||||||
}
|
}
|
||||||
info+="投稿者: "+json["Contributor"].toString()+"\n";
|
info+=tr("Contributor: ")+json["Contributor"].toString()+"\n";
|
||||||
info+="更新时间: "+json["Update"].toString()+"\n";
|
info+=tr("Update Time: ")+json["Update"].toString()+"\n";
|
||||||
info+="大小: "+json["Size"].toString()+"\n";
|
info+=tr("Installed Size: ")+json["Size"].toString()+"\n";
|
||||||
ui->label_info->setText(info);
|
ui->label_info->setText(info);
|
||||||
ui->label_more->setText(json["More"].toString());
|
ui->label_more->setText(json["More"].toString());
|
||||||
QProcess isInstall;
|
QProcess isInstall;
|
||||||
@@ -496,11 +595,11 @@ void Widget::loadappinfo(QUrl arg1)
|
|||||||
isInstall.waitForFinished();
|
isInstall.waitForFinished();
|
||||||
int error=QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
|
int error=QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
|
||||||
if(error==0){
|
if(error==0){
|
||||||
ui->pushButton_download->setText("重新安装");
|
ui->pushButton_download->setText(tr("Reinstall"));
|
||||||
ui->pushButton_uninstall->show();
|
ui->pushButton_uninstall->show();
|
||||||
|
|
||||||
}else {
|
}else {
|
||||||
ui->pushButton_download->setText("安装");
|
ui->pushButton_download->setText(tr("Install"));
|
||||||
}
|
}
|
||||||
//tag加载
|
//tag加载
|
||||||
QString tags=json["Tags"].toString();
|
QString tags=json["Tags"].toString();
|
||||||
@@ -526,24 +625,31 @@ void Widget::loadappinfo(QUrl arg1)
|
|||||||
// 图标加载
|
// 图标加载
|
||||||
get_json.start("curl -o icon.png "+urladdress+"icon.png");
|
get_json.start("curl -o icon.png "+urladdress+"icon.png");
|
||||||
get_json.waitForFinished();
|
get_json.waitForFinished();
|
||||||
QPixmap appicon(QString::fromUtf8(TMP_PATH)+"/icon.png");
|
if(!get_json.exitCode()) {
|
||||||
ui->label_appicon->setPixmap(appicon);
|
QPixmap appicon(QString::fromUtf8(TMP_PATH)+"/icon.png");
|
||||||
ui->pushButton_download->setEnabled(true);
|
ui->label_appicon->setPixmap(appicon);
|
||||||
|
ui->pushButton_download->setEnabled(true);
|
||||||
|
ui->pushButton->setEnabled(true);
|
||||||
|
ui->pushButton_translate->setEnabled(true);
|
||||||
|
ui->pushButton_website->setEnabled(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sendNotification(tr("Failed to load application icon."));
|
||||||
|
|
||||||
|
|
||||||
// 截图展示加载
|
// 截图展示加载
|
||||||
image_show *label_screen[5];
|
QList<image_show*> label_screen;
|
||||||
label_screen[0]=ui->screen_0;
|
label_screen << ui->screen_0 << ui->screen_1 << ui->screen_2 << ui->screen_3 << ui->screen_4;
|
||||||
label_screen[1]=ui->screen_1;
|
for (int i = 0; i < 5; i++) {
|
||||||
label_screen[2]=ui->screen_2;
|
QString cmd = "curl -o screen_"+QString::number(i+1)+".png "+urladdress+"screen_"+QString::number(i+1)+".png";
|
||||||
label_screen[3]=ui->screen_3;
|
get_json.terminate();
|
||||||
label_screen[4]=ui->screen_4;
|
get_json.start(cmd);
|
||||||
for (int i=0;i<5;i++) {
|
|
||||||
get_json.start("curl -o screen_"+QString::number(i+1)+".png "+urladdress+"screen_"+QString::number(i+1)+".png");
|
|
||||||
get_json.waitForFinished();
|
get_json.waitForFinished();
|
||||||
if(screen[i].load("screen_"+QString::number(i+1)+".png")){
|
bool s = screen[i].load("screen_"+QString::number(i+1)+".png");
|
||||||
|
if(s){
|
||||||
label_screen[i]->setImage(screen[i]);
|
label_screen[i]->setImage(screen[i]);
|
||||||
label_screen[i]->show();
|
label_screen[i]->show();
|
||||||
|
/*
|
||||||
switch(i){ // 故意为之,为了清除多余截图
|
switch(i){ // 故意为之,为了清除多余截图
|
||||||
case 0:
|
case 0:
|
||||||
label_screen[1]->hide();
|
label_screen[1]->hide();
|
||||||
@@ -553,7 +659,8 @@ void Widget::loadappinfo(QUrl arg1)
|
|||||||
label_screen[3]->hide();
|
label_screen[3]->hide();
|
||||||
case 3:
|
case 3:
|
||||||
label_screen[4]->hide();
|
label_screen[4]->hide();
|
||||||
}
|
|
||||||
|
}*/
|
||||||
}else{
|
}else{
|
||||||
QFile::remove("screen_"+QString::number(i+1)+".png");
|
QFile::remove("screen_"+QString::number(i+1)+".png");
|
||||||
break;
|
break;
|
||||||
@@ -562,6 +669,7 @@ void Widget::loadappinfo(QUrl arg1)
|
|||||||
ui->label_show->setText("");
|
ui->label_show->setText("");
|
||||||
ui->label_show->hide();
|
ui->label_show->hide();
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::on_pushButton_download_clicked()
|
void Widget::on_pushButton_download_clicked()
|
||||||
@@ -573,7 +681,7 @@ void Widget::on_pushButton_download_clicked()
|
|||||||
download_list[allDownload-1].pkgName=pkgName;
|
download_list[allDownload-1].pkgName=pkgName;
|
||||||
if(fileName.isEmpty())
|
if(fileName.isEmpty())
|
||||||
{
|
{
|
||||||
system("notify-send 获取失败 --icon=spark-store");
|
sendNotification(tr("Failed to get the name to the file to be downloaded."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
download_list[allDownload-1].setParent(ui->listWidget);
|
download_list[allDownload-1].setParent(ui->listWidget);
|
||||||
@@ -598,7 +706,7 @@ void Widget::on_pushButton_download_clicked()
|
|||||||
nowDownload+=1;
|
nowDownload+=1;
|
||||||
startRequest(urList.at(nowDownload-1)); // 进行链接请求
|
startRequest(urList.at(nowDownload-1)); // 进行链接请求
|
||||||
}
|
}
|
||||||
if(ui->pushButton_download->text()=="重新安装"){
|
if(ui->pushButton_download->text()==tr("Reinstall")){
|
||||||
download_list[allDownload-1].reinstall=true;
|
download_list[allDownload-1].reinstall=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -620,13 +728,90 @@ void Widget::searchApp(QString text)
|
|||||||
{
|
{
|
||||||
if(text.left(6)=="spk://"){
|
if(text.left(6)=="spk://"){
|
||||||
openUrl(text);
|
openUrl(text);
|
||||||
|
searchEdit->clearEdit();
|
||||||
}else {
|
}else {
|
||||||
system("notify-send 目前仅支持商店专用链接的打开,搜索功能正在开发,请期待以后的版本! --icon=spark-store");
|
// sendNotification(tr("Spark store could only process spk:// links for now. The search feature is coming soon!"));
|
||||||
// ui->webView->setUrl(QUrl("http://www.baidu.com/s?wd="+text));
|
// ui->webView->setUrl(QUrl("http://www.baidu.com/s?wd="+text));//这东西对接百度
|
||||||
// ui->stackedWidget->setCurrentIndex(0);
|
// ui->stackedWidget->setCurrentIndex(0);
|
||||||
|
|
||||||
|
// 禁止同时进行多次搜索
|
||||||
|
if(!mutex.tryLock())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// 关键字搜索处理
|
||||||
|
httpClient->get("https://search.deepinos.org.cn/appinfo/search")
|
||||||
|
.header("content-type", "application/json")
|
||||||
|
.queryParam("keyword", text)
|
||||||
|
.onResponse([this](QByteArray result) {
|
||||||
|
auto json = QJsonDocument::fromJson(result).array();
|
||||||
|
if (json.empty()) {
|
||||||
|
qDebug() << "相关应用未找到!";
|
||||||
|
sendNotification(tr("Relative apps Not Found!"));
|
||||||
|
mutex.unlock();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
displaySearchApp(json);
|
||||||
|
})
|
||||||
|
.onError([this](QString errorStr) {
|
||||||
|
qDebug() << "请求出错:" << errorStr;
|
||||||
|
sendNotification(QString(tr("Request Error: %1")).arg(errorStr));
|
||||||
|
mutex.unlock();
|
||||||
|
return;
|
||||||
|
})
|
||||||
|
.timeout(10 * 1000)
|
||||||
|
.exec();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 展示搜索的APP信息
|
||||||
|
*/
|
||||||
|
void Widget::displaySearchApp(QJsonArray array)
|
||||||
|
{
|
||||||
|
ui->stackedWidget->setCurrentIndex(4);
|
||||||
|
|
||||||
|
// 清除原有的搜索结果
|
||||||
|
QLayoutItem *item;
|
||||||
|
while ((item = applist_grid->takeAt(0)) != nullptr) {
|
||||||
|
item->widget()->disconnect();
|
||||||
|
delete item->widget();
|
||||||
|
delete item;
|
||||||
|
}
|
||||||
|
item = nullptr;
|
||||||
|
|
||||||
|
for(int i = 0; i < array.size(); i++)
|
||||||
|
{
|
||||||
|
QJsonObject appInfo = array.at(i).toObject();
|
||||||
|
AppItem *appItem = new AppItem(this);
|
||||||
|
QString url = QString("spk://store/%1/%2")
|
||||||
|
.arg(appInfo["category_slug"].toString())
|
||||||
|
.arg(appInfo["pkgname"].toString());
|
||||||
|
appItem->setTitle(appInfo["name"].toString());
|
||||||
|
appItem->setDescription(appInfo["more"].toString());
|
||||||
|
appItem->setIcon(appInfo["icon"].toString());
|
||||||
|
appItem->setUrl(url);
|
||||||
|
applist_grid->addWidget(appItem);
|
||||||
|
qDebug() << "应用链接为:" << url;
|
||||||
|
connect(appItem, &AppItem::clicked, this, &Widget::openUrl);
|
||||||
|
connect(appItem, &AppItem::finished, this, [=](){
|
||||||
|
count++;
|
||||||
|
downloadIconsFinished(array.size());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
ui->applist_scrollarea->widget()->setLayout(applist_grid);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Widget::downloadIconsFinished(int arraysize)
|
||||||
|
{
|
||||||
|
// 当前搜索列表图标全部加载完成后才允许下一次搜索
|
||||||
|
if(count == arraysize)
|
||||||
|
{
|
||||||
|
count = 0;
|
||||||
|
mutex.unlock();
|
||||||
|
}
|
||||||
|
ui->applist_scrollarea->widget()->setLayout(applist_grid);
|
||||||
|
}
|
||||||
|
|
||||||
void Widget::httpReadyRead()
|
void Widget::httpReadyRead()
|
||||||
{
|
{
|
||||||
if(file)
|
if(file)
|
||||||
@@ -637,6 +822,7 @@ void Widget::httpReadyRead()
|
|||||||
|
|
||||||
void Widget::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
|
void Widget::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
|
||||||
{
|
{
|
||||||
|
if(totalBytes <= 0) return;
|
||||||
download_list[nowDownload-1].setMax(10000); // 最大值
|
download_list[nowDownload-1].setMax(10000); // 最大值
|
||||||
download_list[nowDownload-1].setValue((bytesRead*10000)/totalBytes); // 当前值
|
download_list[nowDownload-1].setValue((bytesRead*10000)/totalBytes); // 当前值
|
||||||
download_size=bytesRead;
|
download_size=bytesRead;
|
||||||
@@ -646,6 +832,111 @@ void Widget::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Widget::sltAppinfoResetUi()
|
||||||
|
{
|
||||||
|
// 先隐藏详情页负责显示截图的label
|
||||||
|
ui->screen_0->hide();
|
||||||
|
ui->screen_1->hide();
|
||||||
|
ui->screen_2->hide();
|
||||||
|
ui->screen_3->hide();
|
||||||
|
ui->screen_4->hide();
|
||||||
|
ui->label_appicon->clear();
|
||||||
|
ui->tag_community->hide();
|
||||||
|
ui->tag_ubuntu->hide();
|
||||||
|
ui->tag_deepin->hide();
|
||||||
|
ui->tag_uos->hide();
|
||||||
|
ui->tag_dtk5->hide();
|
||||||
|
ui->tag_dwine2->hide();
|
||||||
|
ui->tag_dwine5->hide();
|
||||||
|
ui->tag_a2d->hide();
|
||||||
|
|
||||||
|
// 重置UI状态
|
||||||
|
ui->pushButton_uninstall->hide();
|
||||||
|
ui->pushButton_website->setEnabled(false);
|
||||||
|
ui->pushButton->setEnabled(false);
|
||||||
|
ui->pushButton_translate->setEnabled(false);
|
||||||
|
ui->label_show->setText("Loading...");
|
||||||
|
ui->label_show->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Widget::sltAppinfoTags(QStringList *tagList)
|
||||||
|
{
|
||||||
|
foreach (const QString &tag, *tagList) {
|
||||||
|
if(tag=="community")
|
||||||
|
ui->tag_community->show();
|
||||||
|
else if(tag=="ubuntu")
|
||||||
|
ui->tag_ubuntu->show();
|
||||||
|
else if(tag=="deepin")
|
||||||
|
ui->tag_deepin->show();
|
||||||
|
else if(tag=="uos")
|
||||||
|
ui->tag_uos->show();
|
||||||
|
else if(tag=="dtk5")
|
||||||
|
ui->tag_dtk5->show();
|
||||||
|
else if(tag=="dwine2")
|
||||||
|
ui->tag_dwine2->show();
|
||||||
|
else if(tag=="dwine5")
|
||||||
|
ui->tag_dwine5->show();
|
||||||
|
else if(tag=="a2d")
|
||||||
|
ui->tag_a2d->show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Widget::sltAppinfoDetails(QString *name, QString *details, QString *info,
|
||||||
|
QString *website, QString *packageName, QUrl *fileUrl,
|
||||||
|
bool isInstalled)
|
||||||
|
{
|
||||||
|
ui->label_appname->setText(appName = *name);
|
||||||
|
ui->label_appname->show();
|
||||||
|
ui->label_info->setText(*details);
|
||||||
|
ui->label_info->show();
|
||||||
|
ui->label_more->setText(*info);
|
||||||
|
ui->label_more->show();
|
||||||
|
pkgName = *packageName;
|
||||||
|
url = *fileUrl;
|
||||||
|
appweb = *website;
|
||||||
|
if(isInstalled){
|
||||||
|
ui->pushButton_download->setText(tr("Reinstall"));
|
||||||
|
ui->pushButton_uninstall->show();
|
||||||
|
}else {
|
||||||
|
ui->pushButton_download->setText(tr("Install"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Widget::sltAppinfoIcon(QPixmap *icon)
|
||||||
|
{
|
||||||
|
ui->label_appicon->setPixmap(*icon);
|
||||||
|
ui->label_appicon->show();
|
||||||
|
ui->pushButton_download->setEnabled(true);
|
||||||
|
ui->pushButton->setEnabled(true);
|
||||||
|
ui->pushButton_translate->setEnabled(true);
|
||||||
|
ui->pushButton_website->setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Widget::sltAppinfoScreenshot(QPixmap *picture, int index)
|
||||||
|
{
|
||||||
|
if(picture != nullptr) {
|
||||||
|
screen[index] = *picture;
|
||||||
|
label_screen[index]->setImage(*picture);
|
||||||
|
label_screen[index]->show();
|
||||||
|
switch(index) { // 故意为之,为了清除多余截图
|
||||||
|
case 0:
|
||||||
|
label_screen[1]->hide();
|
||||||
|
case 1:
|
||||||
|
label_screen[2]->hide();
|
||||||
|
case 2:
|
||||||
|
label_screen[3]->hide();
|
||||||
|
case 3:
|
||||||
|
label_screen[4]->hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Widget::sltAppinfoFinish()
|
||||||
|
{
|
||||||
|
ui->label_show->setText("");
|
||||||
|
ui->label_show->hide();
|
||||||
|
}
|
||||||
|
|
||||||
void Widget::httpFinished() // 完成下载
|
void Widget::httpFinished() // 完成下载
|
||||||
{
|
{
|
||||||
file->flush();
|
file->flush();
|
||||||
@@ -682,7 +973,18 @@ void Widget::on_pushButton_return_clicked()
|
|||||||
// chooseLeftMenu(13);
|
// chooseLeftMenu(13);
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
chooseLeftMenu(nowMenu);
|
appinfoLoadThread.requestInterruption();
|
||||||
|
|
||||||
|
// 检测是否是从搜索页面进入到应用详情页的,根据搜索栏是否有关键词判断
|
||||||
|
if (searchEdit->text().isEmpty()) {
|
||||||
|
ui->webEngineView->back();
|
||||||
|
ui->stackedWidget->setCurrentIndex(0);
|
||||||
|
} else {
|
||||||
|
ui->stackedWidget->setCurrentIndex(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// chooseLeftMenu(nowMenu);
|
||||||
// if(themeIsDark){
|
// if(themeIsDark){
|
||||||
// QString darkurl=menuUrl[nowMenu].toString();
|
// QString darkurl=menuUrl[nowMenu].toString();
|
||||||
// QStringList tmp=darkurl.split("/");
|
// QStringList tmp=darkurl.split("/");
|
||||||
@@ -698,8 +1000,17 @@ void Widget::on_pushButton_return_clicked()
|
|||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Widget::on_pushButton_refresh_clicked()
|
||||||
|
{
|
||||||
|
if(ui->stackedWidget->currentIndex() == 2) //如果在详情页面要重新触发UrlChanged
|
||||||
|
emit ui->webEngineView->urlChanged(ui->webEngineView->url());
|
||||||
|
else
|
||||||
|
ui->webEngineView->reload();
|
||||||
|
}
|
||||||
|
|
||||||
void Widget::on_comboBox_server_currentIndexChanged(const QString &arg1)
|
void Widget::on_comboBox_server_currentIndexChanged(const QString &arg1)
|
||||||
{
|
{
|
||||||
|
appinfoLoadThread.setServer(arg1); // 服务器信息更新
|
||||||
if(configCanSave){
|
if(configCanSave){
|
||||||
ui->label_setting1->show();
|
ui->label_setting1->show();
|
||||||
QSettings *setConfig=new QSettings(QDir::homePath()+"/.config/spark-store/config.ini",QSettings::IniFormat);
|
QSettings *setConfig=new QSettings(QDir::homePath()+"/.config/spark-store/config.ini",QSettings::IniFormat);
|
||||||
@@ -732,43 +1043,70 @@ void Widget::on_pushButton_updateServer_clicked()
|
|||||||
void Widget::on_pushButton_updateApt_clicked()
|
void Widget::on_pushButton_updateApt_clicked()
|
||||||
{
|
{
|
||||||
QtConcurrent::run([=](){
|
QtConcurrent::run([=](){
|
||||||
ui->pushButton_updateApt->setEnabled(false);
|
ui->pushButton_updateApt->setEnabled(false);
|
||||||
ui->label_aptserver->setText("请稍等,正在更新");
|
ui->label_aptserver->setText(tr("Updating, please wait..."));
|
||||||
std::fstream sourcesList;
|
|
||||||
QDir tmpdir("/tmp");
|
|
||||||
tmpdir.mkpath("spark-store");
|
|
||||||
sourcesList.open(QString::fromUtf8(TMP_PATH).toStdString()+"/sparkstore.list",std::ios::out);
|
|
||||||
if(sourcesList){
|
|
||||||
sourcesList<<"deb [by-hash=force] ";
|
|
||||||
sourcesList<<QString::fromUtf8(ui->comboBox_server->currentText().toUtf8()).toStdString();
|
|
||||||
sourcesList<<" /";
|
|
||||||
std::fstream update;
|
|
||||||
update.open(QString::fromUtf8(TMP_PATH).toStdString()+"/update.sh",std::ios::out);
|
|
||||||
update<<"#!/bin/sh\n";
|
|
||||||
update<<"mv "+QString::fromUtf8(TMP_PATH).toStdString()+"/sparkstore.list /etc/apt/sources.list.d/sparkstore.list && apt update";
|
|
||||||
update.close();
|
|
||||||
system("chmod +x "+QString::fromUtf8(TMP_PATH).toUtf8()+"/update.sh");
|
|
||||||
QProcess runupdate;
|
|
||||||
runupdate.start("pkexec "+QString::fromUtf8(TMP_PATH)+"/update.sh");
|
|
||||||
runupdate.waitForFinished();
|
|
||||||
QString error=QString::fromStdString(runupdate.readAllStandardError().toStdString());
|
|
||||||
QStringList everyError=error.split("\n");
|
|
||||||
bool haveError=false;
|
|
||||||
for (int i=0;i<everyError.size();i++) {
|
|
||||||
if(everyError[i].left(2)=="E:"){
|
|
||||||
haveError=true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!haveError){
|
|
||||||
ui->label_aptserver->setText("deb [by-hash=force] "+ui->comboBox_server->currentText().toUtf8()+" /");
|
|
||||||
}else {
|
|
||||||
ui->label_aptserver->setText("更新中发生错误,请在终端使用apt update来查看错误原因");
|
|
||||||
}
|
|
||||||
}else {
|
|
||||||
ui->label_aptserver->setText("服务器错误");
|
|
||||||
}
|
|
||||||
|
|
||||||
ui->pushButton_updateApt->setEnabled(true);
|
std::fstream sourcesList, policy, update;
|
||||||
|
QDir tmpdir("/tmp");
|
||||||
|
auto tmpPath = QString::fromUtf8(TMP_PATH).toStdString();
|
||||||
|
bool unknownError = true;
|
||||||
|
|
||||||
|
tmpdir.mkpath("spark-store");
|
||||||
|
sourcesList.open(tmpPath + "/sparkstore.list", std::ios::out);
|
||||||
|
//policy.open(tmpPath + "/sparkstore", std::ios::out);
|
||||||
|
// 商店已经下架会替换系统库的包,优先级policy弃用
|
||||||
|
|
||||||
|
if(sourcesList /*&& policy*/) {
|
||||||
|
auto serverAddr = ui->comboBox_server->currentText();
|
||||||
|
|
||||||
|
sourcesList << "deb [by-hash=force] ";
|
||||||
|
sourcesList << serverAddr.toUtf8().toStdString();
|
||||||
|
sourcesList << " /";
|
||||||
|
sourcesList.close();
|
||||||
|
|
||||||
|
/*
|
||||||
|
policy << "Package: *\n"
|
||||||
|
"Pin: origin *" << serverAddr.mid(serverAddr.indexOf('.')).toUtf8().toStdString() << "\n"
|
||||||
|
"Pin-Priority: 90"; // 降低星火源的优先级,防止从星火安装已存在的系统包,破坏依赖
|
||||||
|
policy.close();
|
||||||
|
*/
|
||||||
|
|
||||||
|
update.open(tmpPath + "/update.sh",std::ios::out);
|
||||||
|
if(update) {
|
||||||
|
unknownError = false;
|
||||||
|
update << "#!/bin/sh\n"
|
||||||
|
"mv " + tmpPath + "/sparkstore.list /etc/apt/sources.list.d/sparkstore.list && "
|
||||||
|
// "mv " + tmpPath + "/sparkstore /etc/apt/preferences.d/sparkstore && "
|
||||||
|
"apt update";
|
||||||
|
update.close();
|
||||||
|
|
||||||
|
system(("chmod +x " + tmpPath + "/update.sh").c_str());
|
||||||
|
QProcess runupdate;
|
||||||
|
runupdate.start(QString::fromStdString("pkexec " + tmpPath + "/update.sh"));
|
||||||
|
runupdate.waitForFinished();
|
||||||
|
QString error = runupdate.readAllStandardError();
|
||||||
|
|
||||||
|
QStringList everyError = error.split("\n");
|
||||||
|
bool haveError = false;
|
||||||
|
for (int i=0; i < everyError.size(); i++) {
|
||||||
|
if(everyError[i].left(2) == "E:") {
|
||||||
|
haveError = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!haveError) {
|
||||||
|
ui->label_aptserver->setText("deb [by-hash=force] " + ui->comboBox_server->currentText().toUtf8() + " /");
|
||||||
|
} else {
|
||||||
|
ui->label_aptserver->setText(tr("Apt has reported an error. Please use apt update in terminal to locate the problem."));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(unknownError) {
|
||||||
|
ui->label_aptserver->setText(tr("Unknown error!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->pushButton_updateApt->setEnabled(true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -778,14 +1116,14 @@ void Widget::on_pushButton_uninstall_clicked()
|
|||||||
ui->pushButton_download->setEnabled(false);
|
ui->pushButton_download->setEnabled(false);
|
||||||
ui->pushButton_uninstall->setEnabled(false);
|
ui->pushButton_uninstall->setEnabled(false);
|
||||||
QProcess uninstall;
|
QProcess uninstall;
|
||||||
uninstall.start("pkexec apt purge -y "+pkgName);
|
uninstall.start("pkexec apt purge -y "+pkgName.toLower());
|
||||||
uninstall.waitForFinished();
|
uninstall.waitForFinished();
|
||||||
ui->pushButton_download->setEnabled(true);
|
ui->pushButton_download->setEnabled(true);
|
||||||
ui->pushButton_download->setText("安装");
|
ui->pushButton_download->setText("Install");
|
||||||
ui->pushButton_uninstall->hide();
|
ui->pushButton_uninstall->hide();
|
||||||
ui->pushButton_uninstall->setEnabled(true);
|
ui->pushButton_uninstall->setEnabled(true);
|
||||||
updatesEnabled();
|
updatesEnabled();
|
||||||
system("notify-send 卸载完成 --icon=spark-store");
|
sendNotification(tr("Uninstall succeeded"));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -799,7 +1137,7 @@ void Widget::on_pushButton_clear_clicked() // 清空临时缓存目录
|
|||||||
for (int i=0;i<quantity;i++) {
|
for (int i=0;i<quantity;i++) {
|
||||||
tmpdir.remove(tmpdir[i]);
|
tmpdir.remove(tmpdir[i]);
|
||||||
}
|
}
|
||||||
system("notify-send 已清除所有临时缓存 --icon=spark-store");
|
sendNotification(tr("Temporary cache was cleaned"));
|
||||||
ui->pushButton_clear->setEnabled(true);
|
ui->pushButton_clear->setEnabled(true);
|
||||||
Widget::opensetting();
|
Widget::opensetting();
|
||||||
});
|
});
|
||||||
@@ -851,7 +1189,8 @@ void Widget::opensetting()
|
|||||||
void Widget::openUrl(QUrl u)
|
void Widget::openUrl(QUrl u)
|
||||||
{
|
{
|
||||||
QString app=serverUrl + "store"+u.path()+"/app.json";
|
QString app=serverUrl + "store"+u.path()+"/app.json";
|
||||||
ui->webEngineView->setUrl(app);
|
// ui->webEngineView->setUrl(app);
|
||||||
|
emit ui->webEngineView->urlChanged(app);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::on_pushButton_website_clicked()
|
void Widget::on_pushButton_website_clicked()
|
||||||
@@ -865,8 +1204,8 @@ void Widget::on_pushButton_clicked()
|
|||||||
share_url="spk://store/"+type_name+"/"+pkgName;
|
share_url="spk://store/"+type_name+"/"+pkgName;
|
||||||
qDebug()<<"Share"<<share_url;
|
qDebug()<<"Share"<<share_url;
|
||||||
QClipboard *clipboard=QApplication::clipboard();
|
QClipboard *clipboard=QApplication::clipboard();
|
||||||
system("notify-send 链接已经复制到剪贴板 --icon=spark-store");
|
|
||||||
clipboard->setText(share_url);
|
clipboard->setText(share_url);
|
||||||
|
sendNotification(tr("The URL has been copied to the clipboard"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::on_btn_openDir_clicked()
|
void Widget::on_btn_openDir_clicked()
|
||||||
@@ -903,11 +1242,16 @@ void Widget::on_webEngineView_urlChanged(const QUrl &arg1)
|
|||||||
ui->pushButton_download->setEnabled(false);
|
ui->pushButton_download->setEnabled(false);
|
||||||
ui->stackedWidget->setCurrentIndex(2);
|
ui->stackedWidget->setCurrentIndex(2);
|
||||||
qDebug()<<"https://demo-one-vert.vercel.app/"+type_name+"/"+pname;
|
qDebug()<<"https://demo-one-vert.vercel.app/"+type_name+"/"+pname;
|
||||||
|
/*
|
||||||
load.cancel();//打开并发加载线程前关闭正在执行的线程
|
load.cancel();//打开并发加载线程前关闭正在执行的线程
|
||||||
load = QtConcurrent::run([=](){
|
load = QtConcurrent::run([=](){
|
||||||
|
int loadresult = loadappinfo(arg1);
|
||||||
loadappinfo(arg1);
|
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
|
appinfoLoadThread.requestInterruption();
|
||||||
|
appinfoLoadThread.wait(100);
|
||||||
|
appinfoLoadThread.setUrl(arg1);
|
||||||
|
appinfoLoadThread.start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -930,10 +1274,28 @@ void Widget::on_webEngineView_loadProgress(int progress)
|
|||||||
void Widget::on_webEngineView_loadFinished(bool arg1)
|
void Widget::on_webEngineView_loadFinished(bool arg1)
|
||||||
{
|
{
|
||||||
if(arg1){
|
if(arg1){
|
||||||
m_loadweb->setValue(0);
|
m_loadweb->setValue(0);
|
||||||
}else {
|
}else {
|
||||||
m_loadweb->setValue(0);
|
m_loadweb->setValue(0);
|
||||||
m_loaderror->show();
|
m_loaderror->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Widget::on_pushButton_translate_clicked()
|
||||||
|
{
|
||||||
|
DDialog tipDialog;
|
||||||
|
tipDialog.setWordWrapMessage(true);
|
||||||
|
tipDialog.addButtons({ tr("Yes"), tr("No") });
|
||||||
|
tipDialog.setTitle(tr("Information for Contributors"));
|
||||||
|
tipDialog.setMessage(tr("Currently the translation contribution is limited to English,\n"
|
||||||
|
"and you will be redirected to our Gitee repository at which you are\n"
|
||||||
|
"supposed to be creating pull requests to contribute app info\n"
|
||||||
|
"translations.\n"
|
||||||
|
"Tips:You can simply click the file to edit to create a flat pull request without create a full pull request\n"
|
||||||
|
"Tips:You can use github account to login to Gitee"
|
||||||
|
"\nClick yes to continue."));
|
||||||
|
if(!tipDialog.exec())
|
||||||
|
QDesktopServices::openUrl("https://gitee.com/deepin-community-store/json/tree/master/store/" +
|
||||||
|
type_name + '/' + pkgName);
|
||||||
|
}
|
||||||
@@ -10,8 +10,13 @@
|
|||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QFuture>
|
#include <QFuture>
|
||||||
|
#include <QFutureWatcher>
|
||||||
#include <QToolButton>
|
#include <QToolButton>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
|
#include <QJsonArray>
|
||||||
|
#include <QFontDatabase>
|
||||||
|
#include <QMutex>
|
||||||
|
|
||||||
#include <DSettings>
|
#include <DSettings>
|
||||||
#include <DBlurEffectWidget>
|
#include <DBlurEffectWidget>
|
||||||
#include <DSpinner>
|
#include <DSpinner>
|
||||||
@@ -20,6 +25,9 @@
|
|||||||
#include <DTitlebar>
|
#include <DTitlebar>
|
||||||
#include <DSearchEdit>
|
#include <DSearchEdit>
|
||||||
#include <progressload.h>
|
#include <progressload.h>
|
||||||
|
#include "workerthreads.h"
|
||||||
|
#include "image_show.h"
|
||||||
|
|
||||||
#define LIST_MAX 99 //一次最多下载数量
|
#define LIST_MAX 99 //一次最多下载数量
|
||||||
#define TMP_PATH "/tmp/spark-store"
|
#define TMP_PATH "/tmp/spark-store"
|
||||||
|
|
||||||
@@ -29,6 +37,11 @@ class Widget;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class FlowLayout;
|
||||||
|
|
||||||
|
namespace AeaQt {
|
||||||
|
class HttpClient;
|
||||||
|
}
|
||||||
|
|
||||||
class Widget : public DBlurEffectWidget
|
class Widget : public DBlurEffectWidget
|
||||||
{
|
{
|
||||||
@@ -47,11 +60,28 @@ public:
|
|||||||
void setTheme(bool,QColor);
|
void setTheme(bool,QColor);
|
||||||
DTitlebar* getTitlebar();
|
DTitlebar* getTitlebar();
|
||||||
|
|
||||||
|
static void sendNotification(const QString &message, const int msTimeout = 5000, const QString &icon = "spark-store");
|
||||||
|
static void sendNotification(const char *message, const int msTimeout = 5000, const QString &icon = "spark-store");
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void httpFinished();
|
void httpFinished();
|
||||||
void httpReadyRead();
|
void httpReadyRead();
|
||||||
void updateDataReadProgress(qint64,qint64);
|
void updateDataReadProgress(qint64,qint64);
|
||||||
|
|
||||||
|
// SpkAppInfoLoaderThread的槽函数
|
||||||
|
void sltAppinfoResetUi();
|
||||||
|
void sltAppinfoTags(QStringList *tagList);
|
||||||
|
void sltAppinfoDetails(QString *name, QString *details, QString *info,
|
||||||
|
QString *website, QString *packageName,
|
||||||
|
QUrl *fileUrl, bool isInstalled);
|
||||||
|
void sltAppinfoIcon(QPixmap *icon);
|
||||||
|
void sltAppinfoScreenshot(QPixmap *picture, int index);
|
||||||
|
void sltAppinfoFinish();
|
||||||
|
|
||||||
|
void displaySearchApp(QJsonArray array); // 展示搜索的APP信息
|
||||||
|
void downloadIconsFinished(int arraysize); // 当前搜索列表图标是否下载完成
|
||||||
|
|
||||||
void on_pushButton_download_clicked();
|
void on_pushButton_download_clicked();
|
||||||
void on_pushButton_return_clicked();
|
void on_pushButton_return_clicked();
|
||||||
void on_comboBox_server_currentIndexChanged(const QString &arg1);
|
void on_comboBox_server_currentIndexChanged(const QString &arg1);
|
||||||
@@ -60,20 +90,15 @@ private slots:
|
|||||||
void on_pushButton_uninstall_clicked();
|
void on_pushButton_uninstall_clicked();
|
||||||
void on_pushButton_clear_clicked();
|
void on_pushButton_clear_clicked();
|
||||||
void on_pushButton_website_clicked();
|
void on_pushButton_website_clicked();
|
||||||
|
|
||||||
void on_pushButton_clicked();
|
void on_pushButton_clicked();
|
||||||
|
|
||||||
void on_btn_openDir_clicked();
|
void on_btn_openDir_clicked();
|
||||||
|
|
||||||
void on_stackedWidget_currentChanged(int arg1);
|
void on_stackedWidget_currentChanged(int arg1);
|
||||||
|
|
||||||
void on_webEngineView_urlChanged(const QUrl &arg1);
|
void on_webEngineView_urlChanged(const QUrl &arg1);
|
||||||
|
|
||||||
void on_webEngineView_loadStarted();
|
void on_webEngineView_loadStarted();
|
||||||
|
|
||||||
void on_webEngineView_loadProgress(int progress);
|
void on_webEngineView_loadProgress(int progress);
|
||||||
|
|
||||||
void on_webEngineView_loadFinished(bool arg1);
|
void on_webEngineView_loadFinished(bool arg1);
|
||||||
|
void on_pushButton_refresh_clicked();
|
||||||
|
void on_pushButton_translate_clicked();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -91,12 +116,12 @@ public:
|
|||||||
QString appweb;
|
QString appweb;
|
||||||
bool themeIsDark;
|
bool themeIsDark;
|
||||||
|
|
||||||
|
QFont font;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initUI();
|
void initUI();
|
||||||
void initConfig();
|
void initConfig();
|
||||||
void loadappinfo(QUrl);
|
int loadappinfo(QUrl);
|
||||||
void chooseLeftMenu(int index);
|
void chooseLeftMenu(int index);
|
||||||
void setfoot(int);
|
void setfoot(int);
|
||||||
void updatefoot();
|
void updatefoot();
|
||||||
@@ -118,6 +143,7 @@ private:
|
|||||||
long size2=0;
|
long size2=0;
|
||||||
QPixmap screen[5];
|
QPixmap screen[5];
|
||||||
QFuture<void> load;
|
QFuture<void> load;
|
||||||
|
QFutureWatcher<void> watchScreenshotLoad;
|
||||||
QTimer download_speed;
|
QTimer download_speed;
|
||||||
QString type_name;
|
QString type_name;
|
||||||
QColor main_color;
|
QColor main_color;
|
||||||
@@ -125,6 +151,14 @@ private:
|
|||||||
DSearchEdit *searchEdit=new DSearchEdit;
|
DSearchEdit *searchEdit=new DSearchEdit;
|
||||||
DTitlebar *titlebar;
|
DTitlebar *titlebar;
|
||||||
|
|
||||||
|
int count = 0; // 记录当前搜索列表下载图标完成的个数
|
||||||
|
QMutex mutex; // 禁止多次搜索事件同时发生
|
||||||
|
|
||||||
|
QList<image_show*> label_screen;
|
||||||
|
SpkAppInfoLoaderThread appinfoLoadThread;
|
||||||
|
|
||||||
|
AeaQt::HttpClient *httpClient;
|
||||||
|
FlowLayout *applist_grid;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // WIDGET_H
|
#endif // WIDGET_H
|
||||||
152
src/workerthreads.cpp
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include "workerthreads.h"
|
||||||
|
#include "widget.h"
|
||||||
|
|
||||||
|
void SpkAppInfoLoaderThread::run()
|
||||||
|
{
|
||||||
|
emit requestResetUi();
|
||||||
|
|
||||||
|
QProcess get_json;
|
||||||
|
QString urladdress, deatils, more, packagename, appweb;
|
||||||
|
QDir dir("/tmp");
|
||||||
|
bool isInstalled;
|
||||||
|
dir.mkdir("spark-store");
|
||||||
|
QDir::setCurrent("/tmp/spark-store");
|
||||||
|
|
||||||
|
get_json.start("curl -o app.json " + targetUrl.toString());
|
||||||
|
if(waitDownload(get_json) == -1)
|
||||||
|
return;
|
||||||
|
if(get_json.exitCode())
|
||||||
|
{
|
||||||
|
Widget::sendNotification(tr("Failed to download app info. Please check internet connection."));
|
||||||
|
}
|
||||||
|
|
||||||
|
QFile app_json("app.json");
|
||||||
|
if(app_json.open(QIODevice::ReadOnly)){
|
||||||
|
// 成功得到json文件
|
||||||
|
QByteArray json_array = app_json.readAll();
|
||||||
|
// 将路径转化为相应源的下载路径
|
||||||
|
urladdress = targetUrl.toString().left(targetUrl.toString().length()-8);
|
||||||
|
QStringList downloadurl=urladdress.split("/");
|
||||||
|
|
||||||
|
QString deburl = serverUrl;
|
||||||
|
deburl = deburl.left(urladdress.length()-1);
|
||||||
|
urladdress = "https://cdn.jsdelivr.net/gh/Jerrywang959/jsonpng@master/"; // 使用图片专用服务器请保留这行,删除后将使用源服务器
|
||||||
|
urladdress = urladdress.left(urladdress.length()-1);
|
||||||
|
|
||||||
|
for (int i=3;i<downloadurl.size();i++) {
|
||||||
|
urladdress+="/"+downloadurl[i];
|
||||||
|
deburl+="/"+downloadurl[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 路径转化完成
|
||||||
|
QJsonObject json= QJsonDocument::fromJson(json_array).object();
|
||||||
|
QString appName = json["Name"].toString();
|
||||||
|
QUrl fileUrl = deburl + json["Filename"].toString();
|
||||||
|
|
||||||
|
// 软件信息加载
|
||||||
|
QString details;
|
||||||
|
details = tr("PkgName: ") + json["Pkgname"].toString()+"\n";
|
||||||
|
details += tr("Version: ") + json["Version"].toString()+"\n";
|
||||||
|
if(json["Author"].toString() != "" && json["Author"].toString() != " "){
|
||||||
|
details += tr("Author: ") + json["Author"].toString() + "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(json["Website"].toString() != "" && json["Website"].toString() != " "){
|
||||||
|
details += tr("Official Site: ") + json["Website"].toString() + "\n";
|
||||||
|
//ui->pushButton_website->show(); move to setinfo slot
|
||||||
|
appweb=json["Website"].toString();
|
||||||
|
}
|
||||||
|
details+=tr("Contributor: ")+json["Contributor"].toString()+"\n";
|
||||||
|
details+=tr("Update Time: ")+json["Update"].toString()+"\n";
|
||||||
|
details+=tr("Installed Size: ")+json["Size"].toString()+"\n";
|
||||||
|
more = json["More"].toString();
|
||||||
|
|
||||||
|
QProcess isInstall;
|
||||||
|
packagename = json["Pkgname"].toString();
|
||||||
|
isInstall.start("dpkg -s "+json["Pkgname"].toString());
|
||||||
|
isInstall.waitForFinished();
|
||||||
|
int error=QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
|
||||||
|
if(error==0)
|
||||||
|
isInstalled = true;
|
||||||
|
else
|
||||||
|
isInstalled = false;
|
||||||
|
|
||||||
|
emit requestSetAppInformation(&appName, &details, &more, &appweb, &packagename, &fileUrl, isInstalled);
|
||||||
|
|
||||||
|
//tag加载
|
||||||
|
QString tags=json["Tags"].toString();
|
||||||
|
QStringList tagList=tags.split(";");
|
||||||
|
emit requestSetTags(&tagList);
|
||||||
|
|
||||||
|
// 图标加载
|
||||||
|
get_json.start("curl -o icon.png "+urladdress+"icon.png");
|
||||||
|
if(waitDownload(get_json) == -1)
|
||||||
|
return;
|
||||||
|
if(!get_json.exitCode()) {
|
||||||
|
QPixmap appicon("icon.png");
|
||||||
|
emit finishedIconLoad(&appicon);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Widget::sendNotification(tr("Failed to load application icon."));
|
||||||
|
|
||||||
|
|
||||||
|
// 截图展示加载
|
||||||
|
QPixmap screenshotCache[5];
|
||||||
|
for (int i = 0; i < 5; i++) {
|
||||||
|
QString cmd = "curl -o screen_"+QString::number(i+1)+".png "+urladdress+"screen_"+QString::number(i+1)+".png";
|
||||||
|
get_json.start(cmd);
|
||||||
|
if(waitDownload(get_json) == -1)
|
||||||
|
return;
|
||||||
|
bool s = screenshotCache[i].load(QString(TMP_PATH) + "/screen_"+QString::number(i+1)+".png");
|
||||||
|
if(s){
|
||||||
|
emit finishedScreenshotLoad(&screenshotCache[i], i);
|
||||||
|
}else{
|
||||||
|
emit finishedScreenshotLoad(nullptr, i);
|
||||||
|
QFile::remove("screen_"+QString::number(i+1)+".png");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
emit finishAllLoading();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpkAppInfoLoaderThread::setUrl(const QUrl &url)
|
||||||
|
{
|
||||||
|
targetUrl = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpkAppInfoLoaderThread::setServer(const QString &server)
|
||||||
|
{
|
||||||
|
serverUrl = server;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpkAppInfoLoaderThread::downloadFinished(int exitcode, QProcess::ExitStatus status)
|
||||||
|
{
|
||||||
|
Q_UNUSED(exitcode);
|
||||||
|
Q_UNUSED(status);
|
||||||
|
qDebug() << "Finish one download";
|
||||||
|
finishedDownload = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SpkAppInfoLoaderThread::waitDownload(QProcess& downloader)
|
||||||
|
{
|
||||||
|
while(!downloader.waitForFinished(100))
|
||||||
|
{
|
||||||
|
if(downloader.state() == QProcess::NotRunning)
|
||||||
|
return -1;
|
||||||
|
if(this->isInterruptionRequested())
|
||||||
|
{
|
||||||
|
downloader.terminate();
|
||||||
|
downloader.waitForFinished(-1);
|
||||||
|
qDebug() << "Appinfo loader thread was forcefully terminated";
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
36
src/workerthreads.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#ifndef WORKERTHREADS_H
|
||||||
|
#define WORKERTHREADS_H
|
||||||
|
|
||||||
|
#include <QThread>
|
||||||
|
#include <QPixmap>
|
||||||
|
#include <QUrl>
|
||||||
|
#include <QProcess>
|
||||||
|
|
||||||
|
class SpkAppInfoLoaderThread Q_DECL_FINAL : public QThread
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
//explicit SpkAppInfoLoaderThread() = default;
|
||||||
|
void run() Q_DECL_OVERRIDE;
|
||||||
|
public slots:
|
||||||
|
void setUrl(const QUrl &url);
|
||||||
|
void setServer(const QString &server);
|
||||||
|
void downloadFinished(int exitcode, QProcess::ExitStatus status);
|
||||||
|
signals:
|
||||||
|
void requestResetUi();
|
||||||
|
void requestSetTags(QStringList *tagList);
|
||||||
|
void requestSetAppInformation(QString *name, QString *details, QString *info,
|
||||||
|
QString *website, QString *packageName,
|
||||||
|
QUrl *fileUrl, bool isInstalled);
|
||||||
|
void finishedIconLoad(QPixmap *icon);
|
||||||
|
void finishedScreenshotLoad(QPixmap *icon, int index); // 该信号必须以BlockingQueued方式连接
|
||||||
|
void finishAllLoading(); // 该信号必须以BlockingQueued方式连接
|
||||||
|
private:
|
||||||
|
int waitDownload(QProcess& downloader);
|
||||||
|
QUrl targetUrl;
|
||||||
|
QString serverUrl;
|
||||||
|
bool finishedDownload = false;
|
||||||
|
int downloaderRetval = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // WORKERTHREADS_H
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
dpkg -i $1 || apt install -yf || dpkg -P $1
|
dpkg -i $1 || apt install -yf || dpkg -P $1
|
||||||
|
|||||||
42
third-party/QtNetworkService/HttpClient.cpp
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/**********************************************************
|
||||||
|
Author: Qt君
|
||||||
|
微信公众号: Qt君(文章首发)
|
||||||
|
Website: qtbig.com(后续更新)
|
||||||
|
Email: 2088201923@qq.com
|
||||||
|
QQ交流群: 732271126
|
||||||
|
LISCENSE: MIT
|
||||||
|
**********************************************************/
|
||||||
|
#include "HttpClient.h"
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QBuffer>
|
||||||
|
|
||||||
|
using namespace AeaQt;
|
||||||
|
|
||||||
|
HttpClient::HttpClient()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpClient::~HttpClient()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest HttpClient::get(const QString &url)
|
||||||
|
{
|
||||||
|
return HttpRequest(QNetworkAccessManager::GetOperation, this).url(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest HttpClient::post(const QString &url)
|
||||||
|
{
|
||||||
|
return HttpRequest(QNetworkAccessManager::PostOperation, this).url(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest HttpClient::put(const QString &url)
|
||||||
|
{
|
||||||
|
return HttpRequest(QNetworkAccessManager::PutOperation, this).url(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest HttpClient::send(const QString &url, QNetworkAccessManager::Operation op)
|
||||||
|
{
|
||||||
|
return HttpRequest(op, this).url(url);
|
||||||
|
}
|
||||||
36
third-party/QtNetworkService/HttpClient.h
vendored
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/**********************************************************
|
||||||
|
Author: Qt君
|
||||||
|
微信公众号: Qt君(文章首发)
|
||||||
|
Website: qtbig.com(后续更新)
|
||||||
|
Email: 2088201923@qq.com
|
||||||
|
QQ交流群: 732271126
|
||||||
|
LISCENSE: MIT
|
||||||
|
**********************************************************/
|
||||||
|
#ifndef HTTP_CLIENT_H
|
||||||
|
#define HTTP_CLIENT_H
|
||||||
|
|
||||||
|
#include "HttpRequest.h"
|
||||||
|
#include "HttpResponse.h"
|
||||||
|
#include <QNetworkRequest>
|
||||||
|
#include <QNetworkReply>
|
||||||
|
|
||||||
|
namespace AeaQt {
|
||||||
|
|
||||||
|
class HttpClient : public QNetworkAccessManager
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
friend class HttpRequest;
|
||||||
|
|
||||||
|
HttpClient();
|
||||||
|
~HttpClient();
|
||||||
|
|
||||||
|
HttpRequest get(const QString &url);
|
||||||
|
HttpRequest post(const QString &url);
|
||||||
|
HttpRequest put(const QString &url);
|
||||||
|
|
||||||
|
HttpRequest send(const QString &url, Operation op = GetOperation);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
268
third-party/QtNetworkService/HttpRequest.cpp
vendored
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
/**********************************************************
|
||||||
|
Author: Qt君
|
||||||
|
微信公众号: Qt君(文章首发)
|
||||||
|
Website: qtbig.com(后续更新)
|
||||||
|
Email: 2088201923@qq.com
|
||||||
|
QQ交流群: 732271126
|
||||||
|
LISCENSE: MIT
|
||||||
|
**********************************************************/
|
||||||
|
#include "HttpRequest.h"
|
||||||
|
#include "HttpClient.h"
|
||||||
|
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QUrlQuery>
|
||||||
|
#include <QBuffer>
|
||||||
|
#include <QMetaEnum>
|
||||||
|
|
||||||
|
using namespace AeaQt;
|
||||||
|
|
||||||
|
static const char *s_httpOperation[] = {
|
||||||
|
"UnknownOperation",
|
||||||
|
"HeadOperation",
|
||||||
|
"GetOperation",
|
||||||
|
"PutOperation",
|
||||||
|
"PostOperation",
|
||||||
|
"DeleteOperation",
|
||||||
|
"CustomOperation"
|
||||||
|
};
|
||||||
|
|
||||||
|
HttpRequest::HttpRequest()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest::~HttpRequest()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest::HttpRequest(QNetworkAccessManager::Operation op, HttpClient *jsonHttpClient) :
|
||||||
|
m_body(QByteArray()),
|
||||||
|
m_op(op),
|
||||||
|
m_httpService(jsonHttpClient),
|
||||||
|
m_timeout(-1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::url(const QString &url)
|
||||||
|
{
|
||||||
|
m_networkRequest.setUrl(QUrl(url));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::header(const QString &key, const QVariant &value)
|
||||||
|
{
|
||||||
|
m_networkRequest.setRawHeader(QByteArray(key.toStdString().data()), QByteArray(value.toString().toStdString().data()));
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::headers(const QMap<QString, QVariant> &headers)
|
||||||
|
{
|
||||||
|
QMapIterator<QString, QVariant> iter(headers);
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
iter.next();
|
||||||
|
header(iter.key(), iter.value());
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::body(const QVariantMap &content)
|
||||||
|
{
|
||||||
|
m_body = QJsonDocument(QJsonObject::fromVariantMap(content)).toJson();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::body(const QJsonObject &content)
|
||||||
|
{
|
||||||
|
m_body = QJsonDocument(QJsonObject::fromVariantMap(content.toVariantMap())).toJson();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::body(const QByteArray &content)
|
||||||
|
{
|
||||||
|
m_body = content;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
HttpRequest &HttpRequest::body(const QVariant &body)
|
||||||
|
{
|
||||||
|
/// clear m_jsonBody
|
||||||
|
m_jsonBody = QJsonObject();
|
||||||
|
|
||||||
|
if (type == X_Www_Form_Urlencoded) {
|
||||||
|
QUrl url;
|
||||||
|
QUrlQuery urlQuery(url);
|
||||||
|
|
||||||
|
if (body.type() == QVariant::Map
|
||||||
|
|| body.typeName() == QMetaType::typeName(QMetaType::QJsonObject)) {
|
||||||
|
|
||||||
|
QMapIterator<QString, QVariant> i(body.toMap());
|
||||||
|
while (i.hasNext()) {
|
||||||
|
i.next();
|
||||||
|
urlQuery.addQueryItem(i.key(), i.value().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
url.setQuery(urlQuery);
|
||||||
|
m_body = url.toString(QUrl::FullyEncoded).toUtf8().remove(0, 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_body = body.toByteArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (type == Raw_Text_Json) {
|
||||||
|
if (body.type() == QVariant::Map
|
||||||
|
|| body.typeName() == QMetaType::typeName(QMetaType::QJsonObject)) {
|
||||||
|
|
||||||
|
m_body = QJsonDocument(QJsonObject::fromVariantMap(body.toMap())).toJson();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
log_warning << "This is not data in JSON format(QVariantMap or QJsonObject).";
|
||||||
|
m_body = QByteArray();
|
||||||
|
// warning output
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_body = QByteArray();
|
||||||
|
log_warning << "Disable body.";
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debugger << "Body Content:" << m_body;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::onResponse(const QObject *receiver, const char *slot, HttpResponse::SupportMethod type)
|
||||||
|
{
|
||||||
|
m_slotsMap.insert(type, {slot, QVariant::fromValue((QObject *)receiver)});
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::onResponse(std::function<void (QNetworkReply *)> lambda)
|
||||||
|
{
|
||||||
|
return onResponse(QVariant::fromValue(lambda));
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::onResponse(std::function<void (QVariantMap)> lambda)
|
||||||
|
{
|
||||||
|
return onResponse(QVariant::fromValue(lambda));
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::onResponse(std::function<void (QByteArray)> lambda)
|
||||||
|
{
|
||||||
|
return onResponse(QVariant::fromValue(lambda));
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::onResponse(std::function<void (qint64, qint64)> lambda)
|
||||||
|
{
|
||||||
|
return onResponse(QVariant::fromValue(lambda));
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::onError(const QObject *receiver, const char *slot)
|
||||||
|
{
|
||||||
|
return onResponse(receiver, slot, HttpResponse::AutoInfer);
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::onError(std::function<void (QNetworkReply::NetworkError)> lambda)
|
||||||
|
{
|
||||||
|
return onResponse(QVariant::fromValue(lambda));
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::onError(std::function<void (QString)> lambda)
|
||||||
|
{
|
||||||
|
return onResponse(QVariant::fromValue(lambda));
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::onError(std::function<void (QNetworkReply::NetworkError, QNetworkReply *)> lambda)
|
||||||
|
{
|
||||||
|
return onResponse(QVariant::fromValue(lambda));
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::onError(std::function<void (QString, QNetworkReply *)> lambda)
|
||||||
|
{
|
||||||
|
return onResponse(QVariant::fromValue(lambda));
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::timeout(const int &msec)
|
||||||
|
{
|
||||||
|
m_timeout = msec;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::block()
|
||||||
|
{
|
||||||
|
m_isBlock = true;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::onResponse(QVariant lambda)
|
||||||
|
{
|
||||||
|
m_slotsMap.insert(HttpResponse::AutoInfer, {lambda.typeName(), lambda});
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpResponse *HttpRequest::exec()
|
||||||
|
{
|
||||||
|
QNetworkReply* reply = NULL;
|
||||||
|
QBuffer* sendBuffer = new QBuffer();
|
||||||
|
if (! m_body.isEmpty()) {
|
||||||
|
sendBuffer->setData(m_body);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debugger << "Http Client info: ";
|
||||||
|
log_debugger << "Type: " << s_httpOperation[m_op];
|
||||||
|
log_debugger << "Url: " << m_networkRequest.url().toString();
|
||||||
|
QString headers;
|
||||||
|
for (int i = 0; i < m_networkRequest.rawHeaderList().count(); i++) {
|
||||||
|
QString each = m_networkRequest.rawHeaderList().at(i);
|
||||||
|
QString header = m_networkRequest.rawHeader(each.toUtf8());
|
||||||
|
headers += QString("%1: %2;").arg(each)
|
||||||
|
.arg(header);
|
||||||
|
}
|
||||||
|
log_debugger << "Header: " << headers;
|
||||||
|
log_debugger << "Send buffer(Body):\r\n" << m_body;
|
||||||
|
|
||||||
|
reply = m_httpService->createRequest(m_op, m_networkRequest, sendBuffer);
|
||||||
|
|
||||||
|
if (reply == NULL) {
|
||||||
|
sendBuffer->deleteLater();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sendBuffer->setParent(reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new HttpResponse(reply, m_slotsMap, m_timeout, m_isBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::queryParam(const QString &key, const QVariant &value)
|
||||||
|
{
|
||||||
|
QUrl url(m_networkRequest.url());
|
||||||
|
QUrlQuery urlQuery(url);
|
||||||
|
|
||||||
|
urlQuery.addQueryItem(key, value.toString());
|
||||||
|
url.setQuery(urlQuery);
|
||||||
|
|
||||||
|
m_networkRequest.setUrl(url);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::queryParams(const QMap<QString, QVariant> ¶ms)
|
||||||
|
{
|
||||||
|
QMapIterator<QString, QVariant> iter(params);
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
iter.next();
|
||||||
|
queryParam(iter.key(), iter.value());
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest &HttpRequest::userAttribute(const QVariant &value)
|
||||||
|
{
|
||||||
|
m_networkRequest.setAttribute(QNetworkRequest::User, value);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
115
third-party/QtNetworkService/HttpRequest.h
vendored
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/**********************************************************
|
||||||
|
Author: Qt君
|
||||||
|
微信公众号: Qt君(文章首发)
|
||||||
|
Website: qtbig.com(后续更新)
|
||||||
|
Email: 2088201923@qq.com
|
||||||
|
QQ交流群: 732271126
|
||||||
|
LISCENSE: MIT
|
||||||
|
**********************************************************/
|
||||||
|
#ifndef HTTP_REQUEST_H
|
||||||
|
#define HTTP_REQUEST_H
|
||||||
|
|
||||||
|
#include "HttpResponse.h"
|
||||||
|
|
||||||
|
#include <QNetworkRequest>
|
||||||
|
#include <QNetworkAccessManager>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
namespace AeaQt {
|
||||||
|
|
||||||
|
#ifdef QT_APP_DEBUG
|
||||||
|
#define log_debugger qDebug().noquote().nospace() \
|
||||||
|
<< "[AeaQt::Network] Debug: -> " \
|
||||||
|
<< "function: " << __func__ << "; " \
|
||||||
|
<< "line: " << __LINE__ << "; "
|
||||||
|
#else
|
||||||
|
#define log_debugger QString()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define log_warning qWarning().noquote().nospace() \
|
||||||
|
<< "[AeaQt::Network] Warning: -> " \
|
||||||
|
<< "function: " << __func__ << "; " \
|
||||||
|
<< "line: " << __LINE__ << "; "
|
||||||
|
|
||||||
|
class HttpClient;
|
||||||
|
|
||||||
|
class HttpRequest
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum BodyType {
|
||||||
|
None = 0, // This request does not have a body.
|
||||||
|
X_Www_Form_Urlencoded, // x-www-form-urlencoded
|
||||||
|
Raw_Text_Json, // application/json
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit HttpRequest(QNetworkAccessManager::Operation op, HttpClient *jsonHttpClient);
|
||||||
|
virtual ~HttpRequest();
|
||||||
|
|
||||||
|
HttpRequest &url(const QString &url);
|
||||||
|
HttpRequest &header(const QString &key, const QVariant &value);
|
||||||
|
HttpRequest &headers(const QMap<QString, QVariant> &headers);
|
||||||
|
|
||||||
|
HttpRequest &queryParam(const QString &key, const QVariant &value);
|
||||||
|
HttpRequest &queryParams(const QMap<QString, QVariant> ¶ms);
|
||||||
|
|
||||||
|
/* Mainly used for identification */
|
||||||
|
HttpRequest &userAttribute(const QVariant &value);
|
||||||
|
|
||||||
|
HttpRequest &body(const QVariantMap &content);
|
||||||
|
HttpRequest &body(const QJsonObject &content);
|
||||||
|
HttpRequest &body(const QByteArray &content);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @onRespone slot support type: void function(QVariantMap resultMap) OR
|
||||||
|
* void function(QByteArray resultData) OR
|
||||||
|
* void function(QNetworkReply* reply)
|
||||||
|
* note: The same type is only triggered once
|
||||||
|
*/
|
||||||
|
HttpRequest &onResponse(const QObject *receiver, const char *slot, HttpResponse::SupportMethod type = HttpResponse::AutoInfer);
|
||||||
|
HttpRequest &onResponse(std::function<void (QNetworkReply*)> lambda);
|
||||||
|
HttpRequest &onResponse(std::function<void (QVariantMap)> lambda);
|
||||||
|
HttpRequest &onResponse(std::function<void (QByteArray)> lambda);
|
||||||
|
HttpRequest &onResponse(std::function<void (qint64, qint64)> lambda);
|
||||||
|
/*
|
||||||
|
* @onError slot support type: void function(QNetworkReply::NetworkError error)
|
||||||
|
* void function(QString errorString);
|
||||||
|
* void function(QNetworkReply::NetworkError error, QNetworkReply* reply);
|
||||||
|
* void function(QString errorString, QNetworkReply* reply);
|
||||||
|
* note: The same type is only triggered once
|
||||||
|
*/
|
||||||
|
HttpRequest &onError(const QObject *receiver, const char *slot);
|
||||||
|
HttpRequest &onError(std::function<void (QNetworkReply::NetworkError)> lambda);
|
||||||
|
HttpRequest &onError(std::function<void (QString)> lambda);
|
||||||
|
HttpRequest &onError(std::function<void (QNetworkReply::NetworkError, QNetworkReply*)> lambda);
|
||||||
|
HttpRequest &onError(std::function<void (QString, QNetworkReply*)> lambda);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief msec <= 0, disable timeout
|
||||||
|
* msec > 0, enable timeout
|
||||||
|
*/
|
||||||
|
HttpRequest &timeout(const int &msec = -1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Block current thread, entering an event loop.
|
||||||
|
*/
|
||||||
|
HttpRequest &block();
|
||||||
|
|
||||||
|
HttpResponse *exec();
|
||||||
|
|
||||||
|
private:
|
||||||
|
HttpRequest();
|
||||||
|
HttpRequest &onResponse(QVariant lambda);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QNetworkRequest m_networkRequest;
|
||||||
|
QByteArray m_body;
|
||||||
|
QNetworkAccessManager::Operation m_op;
|
||||||
|
HttpClient *m_httpService;
|
||||||
|
int m_timeout;
|
||||||
|
bool m_isBlock;
|
||||||
|
QMultiMap<HttpResponse::SupportMethod, QPair<QString, QVariant>> m_slotsMap;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif // HTTP_REQUEST_H
|
||||||
331
third-party/QtNetworkService/HttpResponse.cpp
vendored
Normal file
@@ -0,0 +1,331 @@
|
|||||||
|
/**********************************************************
|
||||||
|
Author: Qt君
|
||||||
|
微信公众号: Qt君(文章首发)
|
||||||
|
Website: qtbig.com(后续更新)
|
||||||
|
Email: 2088201923@qq.com
|
||||||
|
QQ交流群: 732271126
|
||||||
|
LISCENSE: MIT
|
||||||
|
**********************************************************/
|
||||||
|
#include "HttpResponse.h"
|
||||||
|
|
||||||
|
#include <QRegExp>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QByteArray>
|
||||||
|
#include <QNetworkConfigurationManager>
|
||||||
|
#include <QMetaEnum>
|
||||||
|
#include <QEventLoop>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QJsonObject>
|
||||||
|
|
||||||
|
#define T2S(t) (QString(#t).remove(QRegExp("\\s"))) //type to string
|
||||||
|
|
||||||
|
#define _exec(target, type, arg) \
|
||||||
|
if (target.canConvert<std::function<void (type)> >()) { \
|
||||||
|
std::function<void (type)> func = target.value<std::function<void (type)> >(); func(arg); \
|
||||||
|
} \
|
||||||
|
else
|
||||||
|
|
||||||
|
#define _exec2(target, type1, type2, arg1, arg2) \
|
||||||
|
if (target.canConvert<std::function<void (type1, type2)> >()) { \
|
||||||
|
std::function<void (type1, type2)> func = target.value<std::function<void (type1, type2)> >(); func(arg1, arg2); \
|
||||||
|
} else
|
||||||
|
|
||||||
|
using namespace AeaQt;
|
||||||
|
|
||||||
|
static const QMap<HttpResponse::SupportMethod, QMap<QString, QVariant>> methodParams =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
HttpResponse::onResponse_QNetworkReply_A_Pointer,
|
||||||
|
{
|
||||||
|
{"types", QStringList({T2S(QNetworkReply*)})},
|
||||||
|
{"lambda", T2S(std::function<void (QNetworkReply*)>)},
|
||||||
|
{"signal", SIGNAL(finished(QNetworkReply*))},
|
||||||
|
{"isAutoInfer", true}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
HttpResponse::onResponse_QByteArray,
|
||||||
|
{
|
||||||
|
{"types", QStringList({T2S(QByteArray)})},
|
||||||
|
{"lambda", T2S(std::function<void (QByteArray)>)},
|
||||||
|
{"signal", SIGNAL(finished(QByteArray))},
|
||||||
|
{"isAutoInfer", true}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
HttpResponse::onResponse_QVariantMap,
|
||||||
|
{
|
||||||
|
{"types", QStringList({T2S(QVariantMap)})},
|
||||||
|
{"lambda", T2S(std::function<void (QVariantMap)>)},
|
||||||
|
{"signal", SIGNAL(finished(QVariantMap))},
|
||||||
|
{"isAutoInfer", true}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
HttpResponse::onDownloadProgress_qint64_qint64,
|
||||||
|
{
|
||||||
|
{"types", QStringList({T2S(qint64), T2S(qint64)})},
|
||||||
|
{"lambda", T2S(std::function<void (qint64, qint64)>)},
|
||||||
|
{"signal", SIGNAL(downloadProgress(qint64, qint64))},
|
||||||
|
{"isAutoInfer", true}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
HttpResponse::onError_QNetworkReply_To_NetworkError,
|
||||||
|
{
|
||||||
|
{"types", QStringList({T2S(QNetworkReply::NetworkError)})},
|
||||||
|
{"lambda", T2S(std::function<void (QNetworkReply::NetworkError)>)},
|
||||||
|
{"signal", SIGNAL(error(QNetworkReply::NetworkError))},
|
||||||
|
{"isAutoInfer", true}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
HttpResponse::onError_QString,
|
||||||
|
{
|
||||||
|
{"types", QStringList({T2S(QString)})},
|
||||||
|
{"lambda", T2S(std::function<void (QString)>)},
|
||||||
|
{"signal", SIGNAL(error(QString))},
|
||||||
|
{"isAutoInfer", true}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
HttpResponse::onError_QNetworkReply_To_NetworkError_QNetworkReply_A_Pointer,
|
||||||
|
{
|
||||||
|
{"types", QStringList({T2S(QNetworkReply::NetworkError), T2S(QNetworkReply*)})},
|
||||||
|
{"lambda", T2S(std::function<void (QNetworkReply::NetworkError, QNetworkReply*)>)},
|
||||||
|
{"signal", SIGNAL(error(QNetworkReply::NetworkError, QNetworkReply*))},
|
||||||
|
{"isAutoInfer", true}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
HttpResponse::onError_QString_QNetworkReply_A_Poniter,
|
||||||
|
{
|
||||||
|
{"types", QStringList({T2S(QString), T2S(QNetworkReply*)})},
|
||||||
|
{"lambda", T2S(std::function<void (QString, QNetworkReply*)>)},
|
||||||
|
{"signal", SIGNAL(error(QString, QNetworkReply*))},
|
||||||
|
{"isAutoInfer", true}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static int extractCode(const char *member)
|
||||||
|
{
|
||||||
|
/* extract code, ensure QMETHOD_CODE <= code <= QSIGNAL_CODE */
|
||||||
|
return (((int)(*member) - '0') & 0x3);
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpResponse::HttpResponse(QNetworkReply *networkReply,
|
||||||
|
const QMultiMap<SupportMethod, QPair<QString, QVariant> > &slotsMap,
|
||||||
|
const int &timeout,
|
||||||
|
bool isBlock)
|
||||||
|
: m_networkReply(networkReply),
|
||||||
|
m_slotsMap(slotsMap),
|
||||||
|
QObject(networkReply)
|
||||||
|
{
|
||||||
|
slotsMapOperation(m_slotsMap);
|
||||||
|
new HttpResponseTimeout(networkReply, timeout);
|
||||||
|
|
||||||
|
connect(m_networkReply, SIGNAL(finished()), this, SLOT(onFinished()));
|
||||||
|
connect(m_networkReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onError(QNetworkReply::NetworkError)));
|
||||||
|
connect(m_networkReply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(onDownloadProgress(qint64, qint64)));
|
||||||
|
|
||||||
|
if (isBlock) {
|
||||||
|
QEventLoop loop;
|
||||||
|
QObject::connect(m_networkReply, SIGNAL(finished()), &loop, SLOT(quit()));
|
||||||
|
loop.exec();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpResponse::~HttpResponse()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QNetworkReply *HttpResponse::networkReply()
|
||||||
|
{
|
||||||
|
return m_networkReply;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HttpResponse::onFinished()
|
||||||
|
{
|
||||||
|
QNetworkReply *reply = m_networkReply;
|
||||||
|
if (reply->error() != QNetworkReply::NoError)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (m_slotsMap.contains(onResponse_QNetworkReply_A_Pointer)) {
|
||||||
|
_exec(m_slotsMap.value(onResponse_QNetworkReply_A_Pointer).second, QNetworkReply*, reply) {
|
||||||
|
emit finished(reply);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (m_slotsMap.contains((onResponse_QByteArray))) {
|
||||||
|
QByteArray result = reply->readAll();
|
||||||
|
|
||||||
|
_exec(m_slotsMap.value((onResponse_QByteArray)).second, QByteArray, result) {
|
||||||
|
emit finished(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
reply->deleteLater();
|
||||||
|
}
|
||||||
|
else if (m_slotsMap.contains((onResponse_QVariantMap))) {
|
||||||
|
QByteArray result = reply->readAll();
|
||||||
|
QVariantMap resultMap = QJsonDocument::fromJson(result).object().toVariantMap();
|
||||||
|
|
||||||
|
_exec(m_slotsMap.value((onResponse_QVariantMap)).second, QVariantMap, resultMap){
|
||||||
|
emit finished(resultMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
reply->deleteLater();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HttpResponse::onError(QNetworkReply::NetworkError error)
|
||||||
|
{
|
||||||
|
QNetworkReply *reply = m_networkReply;
|
||||||
|
const QMetaObject & metaObject = QNetworkReply::staticMetaObject;
|
||||||
|
QMetaEnum metaEnum = metaObject.enumerator(metaObject.indexOfEnumerator("NetworkError"));
|
||||||
|
QString errorString = reply->errorString().isEmpty() ? metaEnum.valueToKey(error) : reply->errorString();
|
||||||
|
|
||||||
|
if (m_slotsMap.contains((onError_QString_QNetworkReply_A_Poniter))) {
|
||||||
|
_exec2(m_slotsMap.value((onError_QString_QNetworkReply_A_Poniter)).second, QString, QNetworkReply*, errorString, reply) {
|
||||||
|
emit this->error(errorString, reply);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (m_slotsMap.contains((onError_QNetworkReply_To_NetworkError_QNetworkReply_A_Pointer))) {
|
||||||
|
_exec2(m_slotsMap.value((onError_QNetworkReply_To_NetworkError_QNetworkReply_A_Pointer)).second,
|
||||||
|
QNetworkReply::NetworkError, QNetworkReply*,
|
||||||
|
error, reply) {
|
||||||
|
emit this->error(error, reply);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (m_slotsMap.contains((onError_QString))) {
|
||||||
|
_exec(m_slotsMap.value((onError_QString)).second, QString, errorString) {
|
||||||
|
emit this->error(errorString);
|
||||||
|
}
|
||||||
|
|
||||||
|
reply->deleteLater();
|
||||||
|
}
|
||||||
|
else if (m_slotsMap.contains((onError_QNetworkReply_To_NetworkError))) {
|
||||||
|
_exec(m_slotsMap.value((onError_QNetworkReply_To_NetworkError)).second, QNetworkReply::NetworkError, error) {
|
||||||
|
emit this->error(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
reply->deleteLater();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HttpResponse::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal)
|
||||||
|
{
|
||||||
|
if (m_slotsMap.contains((onDownloadProgress_qint64_qint64))) {
|
||||||
|
_exec2(m_slotsMap.value((onDownloadProgress_qint64_qint64)).second, qint64, qint64, bytesReceived, bytesTotal) {
|
||||||
|
emit downloadProgress(bytesReceived, bytesTotal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void extractSlot(const QString &respReceiverSlot, QString &extractSlot, QStringList &extractSlotTypes)
|
||||||
|
{
|
||||||
|
QString slot(respReceiverSlot);
|
||||||
|
if (extractCode(respReceiverSlot.toStdString().data()) == QSLOT_CODE && !slot.isEmpty()) {
|
||||||
|
slot.remove(0, 1);
|
||||||
|
|
||||||
|
QString unconvertedSlotType = slot;
|
||||||
|
int startIndex = slot.indexOf('(');
|
||||||
|
int endIndex = slot.indexOf(')');
|
||||||
|
Q_ASSERT(startIndex != -1 && endIndex != -1);
|
||||||
|
|
||||||
|
extractSlot = slot.remove(startIndex, endIndex-startIndex+1);
|
||||||
|
|
||||||
|
extractSlotTypes = unconvertedSlotType.mid(startIndex+1, endIndex-startIndex-1)
|
||||||
|
.remove(QRegExp("\\s"))
|
||||||
|
.split(',');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* from slotMap get [SupportMethod] */
|
||||||
|
static HttpResponse::SupportMethod getSupportMethod(const QPair<QString, QVariant> &slotMap) {
|
||||||
|
|
||||||
|
QMapIterator<HttpResponse::SupportMethod, QMap<QString, QVariant>> iter(methodParams);
|
||||||
|
|
||||||
|
QString receiverSlot = slotMap.first;
|
||||||
|
QString slot;
|
||||||
|
QStringList slotTypes;
|
||||||
|
extractSlot(receiverSlot, slot, slotTypes);
|
||||||
|
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
iter.next();
|
||||||
|
HttpResponse::SupportMethod supportMethod = iter.key();
|
||||||
|
QMap<QString, QVariant> value = iter.value();
|
||||||
|
if (slotTypes == value.value("types").toStringList()) {
|
||||||
|
return supportMethod;
|
||||||
|
}
|
||||||
|
else if (receiverSlot == value.value("lambda").toString()) {
|
||||||
|
return supportMethod;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return HttpResponse::Invalid;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void autoInfterConvertedSupportMethod(QMultiMap<HttpResponse::SupportMethod, QPair<QString, QVariant> > &unconvertedSlotsMap)
|
||||||
|
{
|
||||||
|
QMultiMap<HttpResponse::SupportMethod, QPair<QString, QVariant> > convertedSlotsMap;
|
||||||
|
QMapIterator<HttpResponse::SupportMethod, QPair<QString, QVariant> > iter(unconvertedSlotsMap);
|
||||||
|
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
iter.next();
|
||||||
|
const HttpResponse::SupportMethod supportMethod = iter.key();
|
||||||
|
const QPair<QString, QVariant> slotMap = iter.value();
|
||||||
|
|
||||||
|
if (supportMethod == HttpResponse::AutoInfer) {
|
||||||
|
HttpResponse::SupportMethod supportMethod = getSupportMethod(slotMap);
|
||||||
|
if (supportMethod == HttpResponse::Invalid) {
|
||||||
|
qDebug()<<"Not find support Method!"<<slotMap.first;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (methodParams[supportMethod].value("isAutoInfer").toBool())
|
||||||
|
convertedSlotsMap.insert(supportMethod, slotMap);
|
||||||
|
else
|
||||||
|
qDebug()<<"This type["<<methodParams[supportMethod].value("types").toString()<<"] does not support automatic derivation";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (methodParams[supportMethod].value("isAutoInfer").toBool())
|
||||||
|
convertedSlotsMap.insert(supportMethod, slotMap);
|
||||||
|
else
|
||||||
|
qDebug()<<"This type["<<methodParams[supportMethod].value("types").toString()<<"] does not support automatic derivation";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unconvertedSlotsMap = convertedSlotsMap;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void HttpResponse::slotsMapOperation(QMultiMap<SupportMethod, QPair<QString, QVariant> > &slotsMap)
|
||||||
|
{
|
||||||
|
autoInfterConvertedSupportMethod(slotsMap);
|
||||||
|
|
||||||
|
QMapIterator<SupportMethod, QPair<QString, QVariant> > iter(slotsMap);
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
iter.next();
|
||||||
|
SupportMethod supportMethod = iter.key();
|
||||||
|
const QPair<QString, QVariant> &slotMap = iter.value();
|
||||||
|
|
||||||
|
const QString &receiverSlot = slotMap.first;
|
||||||
|
QVariant target = slotMap.second;
|
||||||
|
const QObject *receiver = target.value<QObject*>();
|
||||||
|
|
||||||
|
if (receiver) {
|
||||||
|
if (methodParams.contains(supportMethod)) {
|
||||||
|
connect(this,
|
||||||
|
methodParams[supportMethod].value("signal").toString().toStdString().data(),
|
||||||
|
receiver,
|
||||||
|
receiverSlot.toStdString().data(),
|
||||||
|
Qt::QueuedConnection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpResponse::HttpResponse()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
107
third-party/QtNetworkService/HttpResponse.h
vendored
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
/**********************************************************
|
||||||
|
Author: Qt君
|
||||||
|
微信公众号: Qt君(文章首发)
|
||||||
|
Website: qtbig.com(后续更新)
|
||||||
|
Email: 2088201923@qq.com
|
||||||
|
QQ交流群: 732271126
|
||||||
|
LISCENSE: MIT
|
||||||
|
**********************************************************/
|
||||||
|
#ifndef HTTP_RESPONSE_H
|
||||||
|
#define HTTP_RESPONSE_H
|
||||||
|
|
||||||
|
#include <QNetworkReply>
|
||||||
|
#include <QMultiMap>
|
||||||
|
#include <functional>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
namespace AeaQt {
|
||||||
|
|
||||||
|
class HttpResponseTimeout : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
HttpResponseTimeout(QNetworkReply *parent = NULL, const int timeout = -1) : QObject(parent) {
|
||||||
|
if (timeout > 0)
|
||||||
|
QTimer::singleShot(timeout, this, SLOT(onTimeout()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onTimeout() {
|
||||||
|
QNetworkReply *reply = static_cast<QNetworkReply*>(parent());
|
||||||
|
if (reply->isRunning()) {
|
||||||
|
reply->abort();
|
||||||
|
reply->deleteLater();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class HttpResponse : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
/*
|
||||||
|
* Support Reflex Method
|
||||||
|
* default: AutoInfer
|
||||||
|
* AutoInfer: Automatic derivation based on type
|
||||||
|
*/
|
||||||
|
enum SupportMethod {
|
||||||
|
Invalid = 0,
|
||||||
|
AutoInfer,
|
||||||
|
onResponse_QNetworkReply_A_Pointer, /* method: void function(QNetworkReply* reply); Is_AutoInfer: true */
|
||||||
|
onResponse_QByteArray, /* method: void function(QByteArray data); Is_AutoInfer: true */
|
||||||
|
onResponse_QVariantMap, /* method: void function(QVariantMap map); Is_AutoInfer: true */
|
||||||
|
onDownloadProgress_qint64_qint64, /* method: void function(qint64 bytesReceived, qint64 bytesTotal); Is_AutoInfer: true */
|
||||||
|
onError_QNetworkReply_To_NetworkError, /* method: void function(QNetworkReply::NetworkError error); Is_AutoInfer: true */
|
||||||
|
onError_QString, /* method: void function(QString errorString); Is_AutoInfer: true */
|
||||||
|
onError_QNetworkReply_To_NetworkError_QNetworkReply_A_Pointer, /* method: void function(QNetworkReply::NetworkError error, QNetworkReply* reply); Is_AutoInfer: true */
|
||||||
|
onError_QString_QNetworkReply_A_Poniter/* method: void function(QString errorString, QNetworkReply* reply); Is_AutoInfer: true */
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit HttpResponse(QNetworkReply *networkReply,
|
||||||
|
const QMultiMap<SupportMethod, QPair<QString, QVariant> > &slotsMap,
|
||||||
|
const int &timeout,
|
||||||
|
bool isBlock);
|
||||||
|
|
||||||
|
virtual ~HttpResponse();
|
||||||
|
|
||||||
|
QNetworkReply *networkReply();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void slotsMapOperation(QMultiMap<SupportMethod, QPair<QString, QVariant> > &slotsMap);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void finished(QNetworkReply *reply);
|
||||||
|
void finished(QByteArray data);
|
||||||
|
void finished(QVariantMap map);
|
||||||
|
void error(QString errorString);
|
||||||
|
void error(QNetworkReply::NetworkError error);
|
||||||
|
void error(QString errorString, QNetworkReply *reply);
|
||||||
|
void error(QNetworkReply::NetworkError error, QNetworkReply *reply);
|
||||||
|
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onFinished();
|
||||||
|
void onError(QNetworkReply::NetworkError error);
|
||||||
|
void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal);
|
||||||
|
|
||||||
|
private:
|
||||||
|
HttpResponse();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QMultiMap<SupportMethod, QPair<QString, QVariant> > m_slotsMap;
|
||||||
|
QNetworkReply *m_networkReply;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(std::function<void (QNetworkReply*)>)
|
||||||
|
Q_DECLARE_METATYPE(std::function<void (QByteArray)>)
|
||||||
|
Q_DECLARE_METATYPE(std::function<void (QVariantMap)>)
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(std::function<void (QString)>)
|
||||||
|
Q_DECLARE_METATYPE(std::function<void (QNetworkReply::NetworkError)>)
|
||||||
|
Q_DECLARE_METATYPE(std::function<void (QNetworkReply::NetworkError, QNetworkReply *)>)
|
||||||
|
Q_DECLARE_METATYPE(std::function<void (QString, QNetworkReply *)>)
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE(std::function<void (qint64, qint64)>)
|
||||||
|
|
||||||
|
#endif // HTTP_RESPONSE_H
|
||||||
21
third-party/QtNetworkService/LICENSE
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2019 Qt君
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
15
third-party/QtNetworkService/QtNetworkService.pri
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#**********************************************************
|
||||||
|
#Author: Qt君
|
||||||
|
#微信公众号: Qt君(文章首发)
|
||||||
|
#Website: qtbig.com(后续更新)
|
||||||
|
#Email: 2088201923@qq.com
|
||||||
|
#QQ交流群: 732271126
|
||||||
|
#LISCENSE: MIT
|
||||||
|
#**********************************************************
|
||||||
|
INCLUDEPATH += $$PWD/
|
||||||
|
|
||||||
|
QT += network
|
||||||
|
|
||||||
|
!CONFIG(QT_APP_MODE) {
|
||||||
|
LIBS += -L$$OUT_PWD/../third-party/QtNetworkService/Lib -lQtNetworkService
|
||||||
|
}
|
||||||
37
third-party/QtNetworkService/QtNetworkService.pro
vendored
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
#**********************************************************
|
||||||
|
#Author: Qt君
|
||||||
|
#微信公众号: Qt君(文章首发)
|
||||||
|
#Website: qtbig.com(后续更新)
|
||||||
|
#Email: 2088201923@qq.com
|
||||||
|
#QQ交流群: 732271126
|
||||||
|
#LISCENSE: MIT
|
||||||
|
#**********************************************************
|
||||||
|
CONFIG += c++11
|
||||||
|
|
||||||
|
#CONFIG += QT_APP_MODE
|
||||||
|
DEFINES += QT_APP_DEBUG
|
||||||
|
|
||||||
|
QT += network
|
||||||
|
|
||||||
|
TEMPLATE = lib
|
||||||
|
CONFIG += staticlib
|
||||||
|
unix:TARGET = $$OUT_PWD/Lib/QtNetworkService
|
||||||
|
|
||||||
|
win32: {
|
||||||
|
DESTDIR = $$OUT_PWD/Lib/
|
||||||
|
TARGET = QtNetworkService
|
||||||
|
}
|
||||||
|
|
||||||
|
message(" ================ QtNetworkService Library ================ ")
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
$$PWD/HttpResponse.cpp \
|
||||||
|
$$PWD/HttpRequest.cpp \
|
||||||
|
$$PWD/HttpClient.cpp
|
||||||
|
|
||||||
|
HEADERS += \
|
||||||
|
$$PWD/HttpResponse.h \
|
||||||
|
$$PWD/HttpRequest.h \
|
||||||
|
$$PWD/HttpClient.h
|
||||||
|
|
||||||
|
include(QtNetworkService.pri)
|
||||||
83
third-party/QtNetworkService/README.md
vendored
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
# 示例
|
||||||
|
(1) 简单示例
|
||||||
|
* 使用lambda特性
|
||||||
|
```cpp
|
||||||
|
static HttpClient http;
|
||||||
|
http.post("https://example.com")
|
||||||
|
.header("content-type", "application/json")
|
||||||
|
.queryParam("key", "Hello world!")
|
||||||
|
.body(R"({"user": "test"})")
|
||||||
|
.onResponse([](QByteArray result) { /* 接收数据 */
|
||||||
|
qDebug() << "Result: " << result;
|
||||||
|
})
|
||||||
|
.onResponse([](qint64 recv, qint64 total) { /* 接收进度 */
|
||||||
|
qDebug() << "Total: " << total << "; Received: " << recv;
|
||||||
|
})
|
||||||
|
.onError([](QString errorStr) { /* 错误处理 */
|
||||||
|
qDebug()<<"Error: "<<errorStr;
|
||||||
|
})
|
||||||
|
.timeout(30 * 1000) /* 超时操作(30s) */
|
||||||
|
.block() /* 阻塞操作 */
|
||||||
|
.exec();
|
||||||
|
```
|
||||||
|
|
||||||
|
* 使用Qt信号与槽特性
|
||||||
|
```cpp
|
||||||
|
http.post("https://example.com")
|
||||||
|
.header("content-type", "application/json")
|
||||||
|
.queryParam("key", "Hello world!")
|
||||||
|
.body(R"({"user": "test"})")
|
||||||
|
.onResponse(this, SLOT(finish(QByteArray)))
|
||||||
|
.onResponse(this, SLOT(downloadProgress(qint64, qint64)))
|
||||||
|
.onError(this, SLOT(error(QString)))
|
||||||
|
.timeout(30 * 1000) /* 超时操作(30s) */
|
||||||
|
.block() /* 阻塞操作 */
|
||||||
|
.exec();
|
||||||
|
```
|
||||||
|
|
||||||
|
(2) 复杂示例
|
||||||
|
```cpp
|
||||||
|
/* 获取音乐url功能,请求嵌套请求 */
|
||||||
|
static HttpService http;
|
||||||
|
http.get("http://mobilecdn.kugou.com/api/v3/search/song")
|
||||||
|
.queryParam("format", "json")
|
||||||
|
.queryParam("keyword", "稻香")
|
||||||
|
.queryParam("page", 1)
|
||||||
|
.queryParam("pagesize", 3)
|
||||||
|
.queryParam("showtype", 1)
|
||||||
|
.onResopnse([](QVariantMap result){
|
||||||
|
QVariantMap data;
|
||||||
|
QList<QVariant> infos;
|
||||||
|
if (!result.isEmpty())
|
||||||
|
data = result.value("data").toMap();
|
||||||
|
|
||||||
|
if (!data.isEmpty())
|
||||||
|
infos = data.value("info").toList();
|
||||||
|
|
||||||
|
static HttpService http;
|
||||||
|
foreach (QVariant each, infos) {
|
||||||
|
http.get("http://m.kugou.com/app/i/getSongInfo.php")
|
||||||
|
.queryParam("cmd", "playInfo")
|
||||||
|
.queryParam("hash", each.toMap()["hash"])
|
||||||
|
.onResopnse([](QVariantMap result){
|
||||||
|
qDebug()<<"mp3: "<<result["url"].toString();
|
||||||
|
})
|
||||||
|
.onError([](QString errorStr){ qDebug()<<"Error: "<<errorStr; })
|
||||||
|
.exec();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.onError([](QString errorStr){ qDebug()<<"Error: "<<errorStr; })
|
||||||
|
.exec();
|
||||||
|
```
|
||||||
|
## 1.如何使用?
|
||||||
|
* 以Qt子工程使用.再在其他子工程包含pri文件即可使用;
|
||||||
|
* 通过引用库的方式使用.
|
||||||
|
|
||||||
|
## 2.如何启用demo测试?
|
||||||
|
* 在QtNetworkService.pro文件中将"#CONFIG += QT_APP_MODE"这一行的#去除即可转为可执行文件形式,在Demo目录的main.cpp为主执行文件,如需要测试接口编辑便可。
|
||||||
|
|
||||||
|
## 3.扫码关注,第一时间获取推送
|
||||||
|
<p align="center">
|
||||||
|
<img src="http://www.qtbig.com/about/index/my_qrcode.jpg" alt="微信公众号:Qt君">
|
||||||
|
<p align="center"><em>Qt君</em></p>
|
||||||
|
</p>
|
||||||
@@ -1 +0,0 @@
|
|||||||
<<3C>d<18><EFBFBD>!<1C>`<60><><EFBFBD>
|
|
||||||
@@ -1,307 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!DOCTYPE TS>
|
|
||||||
<TS version="2.1" language="zh_CN">
|
|
||||||
<context>
|
|
||||||
<name>QLabel</name>
|
|
||||||
<message>
|
|
||||||
<location filename="../main.cpp" line="19"/>
|
|
||||||
<location filename="../main.cpp" line="21"/>
|
|
||||||
<source>Spark应用商店</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../main.cpp" line="20"/>
|
|
||||||
<source>社区驱动的一款为第三方应用商店,为改变而生
|
|
||||||
本程序按GPL第三版开源</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>Widget</name>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="14"/>
|
|
||||||
<source>Form</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="52"/>
|
|
||||||
<source>background-color:#FFFFFF</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="67"/>
|
|
||||||
<source>视频播放</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="74"/>
|
|
||||||
<source>下载列表</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="81"/>
|
|
||||||
<source>系统工具</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="88"/>
|
|
||||||
<source>主题美化</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="95"/>
|
|
||||||
<source>音乐欣赏</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="114"/>
|
|
||||||
<source>icon</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="153"/>
|
|
||||||
<source>编程开发</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="177"/>
|
|
||||||
<source>办公学习</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="197"/>
|
|
||||||
<source>阅读翻译</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="204"/>
|
|
||||||
<source>其他应用</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="214"/>
|
|
||||||
<source>商店首页</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="221"/>
|
|
||||||
<source>图形图像</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="228"/>
|
|
||||||
<source>游戏娱乐</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="235"/>
|
|
||||||
<source>社交沟通</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="242"/>
|
|
||||||
<source>网络应用</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="313"/>
|
|
||||||
<source>about:blank</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="354"/>
|
|
||||||
<source>当前下载列表为空</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="386"/>
|
|
||||||
<source>打开文件夹</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="486"/>
|
|
||||||
<source>安装</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="522"/>
|
|
||||||
<source>卸载</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="551"/>
|
|
||||||
<source>官网</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="580"/>
|
|
||||||
<source>软件名</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="592"/>
|
|
||||||
<source><html><head/><body><p><br/></p></body></html></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="636"/>
|
|
||||||
<source>图标</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="649"/>
|
|
||||||
<source>分享</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="683"/>
|
|
||||||
<location filename="../widget.ui" line="696"/>
|
|
||||||
<location filename="../widget.ui" line="709"/>
|
|
||||||
<location filename="../widget.ui" line="722"/>
|
|
||||||
<location filename="../widget.ui" line="735"/>
|
|
||||||
<location filename="../widget.ui" line="748"/>
|
|
||||||
<location filename="../widget.ui" line="761"/>
|
|
||||||
<location filename="../widget.ui" line="774"/>
|
|
||||||
<source>TextLabel</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="808"/>
|
|
||||||
<source>详细介绍</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="815"/>
|
|
||||||
<source><html><head/><body><p>由社区爱好者开发的软件商店</p></body></html></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="854"/>
|
|
||||||
<source>软件截图</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1017"/>
|
|
||||||
<source>线路设置</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1033"/>
|
|
||||||
<source>线路选择:</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1056"/>
|
|
||||||
<source>刷新</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1069"/>
|
|
||||||
<source> 重启商店后生效</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1098"/>
|
|
||||||
<source><html><head/><body><p>源服务器的作用是保证软件更新,并且支持使用apt工具获取软件。通常我们更建议你使用第一个线路作为更新源,一般是最稳定的。</p></body></html></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1108"/>
|
|
||||||
<source>更新源</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1115"/>
|
|
||||||
<source>更新源服务器:</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1135"/>
|
|
||||||
<source>服务器</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1156"/>
|
|
||||||
<source>缓存目录</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1179"/>
|
|
||||||
<source>清空</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1189"/>
|
|
||||||
<source>因为这个目录位于/tmp下,所以即使你不手动清空的话,其也将在系统重启时自动清空。</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1202"/>
|
|
||||||
<source>目录大小:</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1209"/>
|
|
||||||
<source>0B</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1216"/>
|
|
||||||
<source>目录位置:/tmp/spark-store</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1237"/>
|
|
||||||
<source>关于我们</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1244"/>
|
|
||||||
<source><html><head/><body><p>我们并不是官方团队,和你一样,我们也只是众多Linux/deepin系统爱好者和用户之中的一员,我们开发并且运营这个“Spark应用商店”,是为了让社区的朋友们一起分享好用的软件,或者一起参与开发,让大家都用到最新的,最优秀的软件。</p><p>我们并没有因此盈利,所有开发和维护人员都不会获得报酬,我们的主要支出大部分依赖于社区对我们的捐助,很感谢大家,这部分捐助让我们并不需要耗费太多精力去担心资金问题。</p><p>我们的服务和开发的软件都是免费供给大家使用,交流,学习的,但是在您的使用过程中一定要遵守当地的法律法规,否则出现任何问题和我们无关。</p><p>如果商店中任何一部分有侵犯您权益的行为,请告知我们&lt;jifengshenmo@outlook.com&gt;,我们会第一时间删除侵权内容。</p><p>如果你也想参与我们,不管是参与开发,设计,投递还是投稿作品,我们都欢迎你的加入。</p><p>QQ群:872690351<br/></p></body></html></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>downloadlist</name>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="20"/>
|
|
||||||
<source>Form</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="50"/>
|
|
||||||
<source>icon</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="82"/>
|
|
||||||
<source>TextLabel</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="106"/>
|
|
||||||
<source>名称</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="189"/>
|
|
||||||
<source>等待开始下载</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="240"/>
|
|
||||||
<source>安装</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="259"/>
|
|
||||||
<source>取消</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="278"/>
|
|
||||||
<source>详情</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
|
||||||
@@ -1,312 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!DOCTYPE TS>
|
|
||||||
<TS version="2.1" language="en">
|
|
||||||
<context>
|
|
||||||
<name>QLabel</name>
|
|
||||||
<message>
|
|
||||||
<location filename="../main.cpp" line="19"/>
|
|
||||||
<location filename="../main.cpp" line="21"/>
|
|
||||||
<source>Spark应用商店</source>
|
|
||||||
<translation>Spark Store</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../main.cpp" line="20"/>
|
|
||||||
<source>社区驱动的一款为第三方应用商店,为改变而生
|
|
||||||
本程序按GPL第三版开源</source>
|
|
||||||
<translation>A 3-rd party app store powered by deepin community
|
|
||||||
Spark Store is published under GPL V3
|
|
||||||
We born for change.</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>Widget</name>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="14"/>
|
|
||||||
<source>Form</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="52"/>
|
|
||||||
<source>background-color:#FFFFFF</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="67"/>
|
|
||||||
<source>视频播放</source>
|
|
||||||
<translatorcomment>Video Players and Video Makers</translatorcomment>
|
|
||||||
<translation>Video</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="74"/>
|
|
||||||
<source>下载列表</source>
|
|
||||||
<translation>Download list</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="81"/>
|
|
||||||
<source>系统工具</source>
|
|
||||||
<translation>Tools</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="88"/>
|
|
||||||
<source>主题美化</source>
|
|
||||||
<translatorcomment>Icon theme and other </translatorcomment>
|
|
||||||
<translation>Themes</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="95"/>
|
|
||||||
<source>音乐欣赏</source>
|
|
||||||
<translation>Music</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="114"/>
|
|
||||||
<source>icon</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="153"/>
|
|
||||||
<source>编程开发</source>
|
|
||||||
<translation>Development</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="177"/>
|
|
||||||
<source>办公学习</source>
|
|
||||||
<translation>Office</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="197"/>
|
|
||||||
<source>阅读翻译</source>
|
|
||||||
<translation>Translate</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="204"/>
|
|
||||||
<source>其他应用</source>
|
|
||||||
<translation>Others</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="214"/>
|
|
||||||
<source>商店首页</source>
|
|
||||||
<translation>Home</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="221"/>
|
|
||||||
<source>图形图像</source>
|
|
||||||
<translation>Images</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="228"/>
|
|
||||||
<source>游戏娱乐</source>
|
|
||||||
<translation>Games</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="235"/>
|
|
||||||
<source>社交沟通</source>
|
|
||||||
<translation>Chat</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="242"/>
|
|
||||||
<source>网络应用</source>
|
|
||||||
<translation type="unfinished">Network</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="313"/>
|
|
||||||
<source>about:blank</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="354"/>
|
|
||||||
<source>当前下载列表为空</source>
|
|
||||||
<translation>The Download list is empty</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="386"/>
|
|
||||||
<source>打开文件夹</source>
|
|
||||||
<translation>Open in File Manager</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="486"/>
|
|
||||||
<source>安装</source>
|
|
||||||
<translation>Install</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="522"/>
|
|
||||||
<source>卸载</source>
|
|
||||||
<translation>Remove</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="551"/>
|
|
||||||
<source>官网</source>
|
|
||||||
<translation>Site</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="580"/>
|
|
||||||
<source>软件名</source>
|
|
||||||
<translation>Name</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="592"/>
|
|
||||||
<source><html><head/><body><p><br/></p></body></html></source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="636"/>
|
|
||||||
<source>图标</source>
|
|
||||||
<translation>Icon</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="649"/>
|
|
||||||
<source>分享</source>
|
|
||||||
<translation>Share</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="683"/>
|
|
||||||
<location filename="../widget.ui" line="696"/>
|
|
||||||
<location filename="../widget.ui" line="709"/>
|
|
||||||
<location filename="../widget.ui" line="722"/>
|
|
||||||
<location filename="../widget.ui" line="735"/>
|
|
||||||
<location filename="../widget.ui" line="748"/>
|
|
||||||
<location filename="../widget.ui" line="761"/>
|
|
||||||
<location filename="../widget.ui" line="774"/>
|
|
||||||
<source>TextLabel</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="808"/>
|
|
||||||
<source>详细介绍</source>
|
|
||||||
<translation type="unfinished">Details</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="815"/>
|
|
||||||
<source><html><head/><body><p>由社区爱好者开发的软件商店</p></body></html></source>
|
|
||||||
<translation type="unfinished"><html><head/><body><p>software store developed by community enthusiasts</p></body></html></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="854"/>
|
|
||||||
<source>软件截图</source>
|
|
||||||
<translation>Screen Shots</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1017"/>
|
|
||||||
<source>线路设置</source>
|
|
||||||
<translation>Line Settings</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1033"/>
|
|
||||||
<source>线路选择:</source>
|
|
||||||
<translation type="unfinished">Choose</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1056"/>
|
|
||||||
<source>刷新</source>
|
|
||||||
<translation>Update</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1069"/>
|
|
||||||
<source> 重启商店后生效</source>
|
|
||||||
<translation>Restart to take effect</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1098"/>
|
|
||||||
<source><html><head/><body><p>源服务器的作用是保证软件更新,并且支持使用apt工具获取软件。通常我们更建议你使用第一个线路作为更新源,一般是最稳定的。</p></body></html></source>
|
|
||||||
<translation type="unfinished"><html><head/><body><p>The role of the source server is to ensure that the software is updated, and supports the use of the apt tool to get the software. We usually prefer that you use the first line as the update source, which is generally the most stable. </p></body></html></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1108"/>
|
|
||||||
<source>更新源</source>
|
|
||||||
<translation>Update APT Source</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1115"/>
|
|
||||||
<source>更新源服务器:</source>
|
|
||||||
<translation type="unfinished">APT Source</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1135"/>
|
|
||||||
<source>服务器</source>
|
|
||||||
<translation type="unfinished">server</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1156"/>
|
|
||||||
<source>缓存目录</source>
|
|
||||||
<translation>Temp</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1179"/>
|
|
||||||
<source>清空</source>
|
|
||||||
<translation>Clean</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1189"/>
|
|
||||||
<source>因为这个目录位于/tmp下,所以即使你不手动清空的话,其也将在系统重启时自动清空。</source>
|
|
||||||
<translation>Since the dictionary is at /tmp,It would be cleaned automatically when system reboot.</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1202"/>
|
|
||||||
<source>目录大小:</source>
|
|
||||||
<translation type="unfinished">Size: </translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1209"/>
|
|
||||||
<source>0B</source>
|
|
||||||
<translation type="unfinished">0B</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1216"/>
|
|
||||||
<source>目录位置:/tmp/spark-store</source>
|
|
||||||
<translation type="unfinished">Location:/tmp/spark-store</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1237"/>
|
|
||||||
<source>关于我们</source>
|
|
||||||
<translation type="unfinished">About us</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../widget.ui" line="1244"/>
|
|
||||||
<source><html><head/><body><p>我们并不是官方团队,和你一样,我们也只是众多Linux/deepin系统爱好者和用户之中的一员,我们开发并且运营这个“Spark应用商店”,是为了让社区的朋友们一起分享好用的软件,或者一起参与开发,让大家都用到最新的,最优秀的软件。</p><p>我们并没有因此盈利,所有开发和维护人员都不会获得报酬,我们的主要支出大部分依赖于社区对我们的捐助,很感谢大家,这部分捐助让我们并不需要耗费太多精力去担心资金问题。</p><p>我们的服务和开发的软件都是免费供给大家使用,交流,学习的,但是在您的使用过程中一定要遵守当地的法律法规,否则出现任何问题和我们无关。</p><p>如果商店中任何一部分有侵犯您权益的行为,请告知我们&lt;jifengshenmo@outlook.com&gt;,我们会第一时间删除侵权内容。</p><p>如果你也想参与我们,不管是参与开发,设计,投递还是投稿作品,我们都欢迎你的加入。</p><p>QQ群:872690351<br/></p></body></html></source>
|
|
||||||
<translation type="unfinished"><html><head/><body><p>We are not the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the "Spark Store"! ", 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. </p><p> 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. </p><p>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. </p><p>If any part of the store infringes your rights, please tell us &lt;jifengshenmo@outlook.com&gt; we will remove the infringing content as soon as possible. </p><p>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. </p><p>QQ group:872690351<br/></p></body></html></translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
<context>
|
|
||||||
<name>downloadlist</name>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="20"/>
|
|
||||||
<source>Form</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="50"/>
|
|
||||||
<source>icon</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="82"/>
|
|
||||||
<source>TextLabel</source>
|
|
||||||
<translation type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="106"/>
|
|
||||||
<source>名称</source>
|
|
||||||
<translation>Name</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="189"/>
|
|
||||||
<source>等待开始下载</source>
|
|
||||||
<translatorcomment>Wait to download</translatorcomment>
|
|
||||||
<translation>Wait to download</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="240"/>
|
|
||||||
<source>安装</source>
|
|
||||||
<translation>Install</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="259"/>
|
|
||||||
<source>取消</source>
|
|
||||||
<translation>Cancel</translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../downloadlist.ui" line="278"/>
|
|
||||||
<source>详情</source>
|
|
||||||
<translation>Detail</translation>
|
|
||||||
</message>
|
|
||||||
</context>
|
|
||||||
</TS>
|
|
||||||
679
translations/spark-store_en.ts
Normal file
@@ -0,0 +1,679 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="en">
|
||||||
|
<context>
|
||||||
|
<name>AppItem</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/appitem.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/main.cpp" line="39"/>
|
||||||
|
<source>Spark Store</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QObject</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/main.cpp" line="47"/>
|
||||||
|
<source><span style='font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style='font-size:12pt;'>Spark developers</span><br/><br/>Published under GPL V3</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>SpkAppInfoLoaderThread</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="25"/>
|
||||||
|
<source>Failed to download app info. Please check internet connection.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="53"/>
|
||||||
|
<source>PkgName: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="54"/>
|
||||||
|
<source>Version: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="56"/>
|
||||||
|
<source>Author: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="60"/>
|
||||||
|
<source>Official Site: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="64"/>
|
||||||
|
<source>Contributor: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="65"/>
|
||||||
|
<source>Update Time: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="66"/>
|
||||||
|
<source>Installed Size: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="95"/>
|
||||||
|
<source>Failed to load application icon.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Widget</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="84"/>
|
||||||
|
<source>background-color:#FFFFFF</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="184"/>
|
||||||
|
<source>Tools</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="265"/>
|
||||||
|
<source>Beautify</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="115"/>
|
||||||
|
<source>Music</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="198"/>
|
||||||
|
<source>Office</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="286"/>
|
||||||
|
<source>Others</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="279"/>
|
||||||
|
<source>Games</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="560"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="600"/>
|
||||||
|
<source>ICON</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="547"/>
|
||||||
|
<location filename="../src/widget.cpp" line="602"/>
|
||||||
|
<location filename="../src/widget.cpp" line="901"/>
|
||||||
|
<source>Install</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="655"/>
|
||||||
|
<source>Uninstall</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="671"/>
|
||||||
|
<source>Site</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="744"/>
|
||||||
|
<location filename="../src/widget.ui" line="747"/>
|
||||||
|
<source><html><head/><body><p>This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="750"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/community-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="763"/>
|
||||||
|
<location filename="../src/widget.ui" line="766"/>
|
||||||
|
<source><html><head/><body><p>Capable to Ubuntu 20.04</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="769"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/ubuntu-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="807"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/uos-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="782"/>
|
||||||
|
<location filename="../src/widget.ui" line="785"/>
|
||||||
|
<source><html><head/><body><p>Capable to deepin 20</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="313"/>
|
||||||
|
<source>Video</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="306"/>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="238"/>
|
||||||
|
<source>Back to category</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="191"/>
|
||||||
|
<source>Reading</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="225"/>
|
||||||
|
<source>Chat</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="211"/>
|
||||||
|
<source>Reload</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="415"/>
|
||||||
|
<source>The list is currently empty. Go and download some softwares!</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="447"/>
|
||||||
|
<source>Open download directory</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="788"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/deepin-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="801"/>
|
||||||
|
<location filename="../src/widget.ui" line="804"/>
|
||||||
|
<source><html><head/><body><p>Capable to UOS home 20</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="820"/>
|
||||||
|
<location filename="../src/widget.ui" line="823"/>
|
||||||
|
<source><html><head/><body><p>This is a DTK5 app,which means it would have better effect on Deepin Desktop Environment</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="826"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/dtk-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="858"/>
|
||||||
|
<location filename="../src/widget.ui" line="861"/>
|
||||||
|
<source><html><head/><body><p>A deepin-wine5 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine5 by your self.</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="877"/>
|
||||||
|
<location filename="../src/widget.ui" line="880"/>
|
||||||
|
<source><html><head/><body><p>An Appimage to deb app.</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="883"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/a2d-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="710"/>
|
||||||
|
<source>Share</source>
|
||||||
|
<translation type="unfinished">Spk share link</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="129"/>
|
||||||
|
<source>Development</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="296"/>
|
||||||
|
<source>Home</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="122"/>
|
||||||
|
<source>Graphics</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="272"/>
|
||||||
|
<source>Network</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="839"/>
|
||||||
|
<location filename="../src/widget.ui" line="842"/>
|
||||||
|
<source><html><head/><body><p>A deepin-wine2 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine2 by your self.</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="845"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/dwine2-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="864"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/dwine5-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="906"/>
|
||||||
|
<source>Contribute translation</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="924"/>
|
||||||
|
<source>Info</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="931"/>
|
||||||
|
<source><html><head/><body><p>An app store developed by community enthusiasts</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="970"/>
|
||||||
|
<source>Screenshots</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1133"/>
|
||||||
|
<source>Line Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1149"/>
|
||||||
|
<source>Choose Line:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1172"/>
|
||||||
|
<source>Refresh</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1214"/>
|
||||||
|
<source><html><head/><body><p>The role of the source server is to ensure that the software is updated, and supports the use of the apt tool to get the software. We usually prefer that you use the first line as the update source, which is generally the most stable. </p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1224"/>
|
||||||
|
<source>Update</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1231"/>
|
||||||
|
<source>Source Server</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1251"/>
|
||||||
|
<source>Server</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1272"/>
|
||||||
|
<source>Temp</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1295"/>
|
||||||
|
<source>Clean</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1305"/>
|
||||||
|
<source>Since the dictionary is at /tmp,It would be cleaned automatically when system reboot.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1318"/>
|
||||||
|
<source>Size:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1332"/>
|
||||||
|
<source>Location:/tmp/spark-store</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1353"/>
|
||||||
|
<source>About us</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1360"/>
|
||||||
|
<source><html><head/><body><p>We are <span style=" font-weight:600;">NOT</span> the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &quot;Spark Store&quot;! &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. </p><p>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. </p><p>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. </p><p>If any part of the store infringes your rights, please tell us &lt;jifengshenmo@outlook.com&gt; we will remove the infringing content as soon as possible. </p><p>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. </p><p>QQ group:872690351<br/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="148"/>
|
||||||
|
<source>icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="374"/>
|
||||||
|
<source>about:blank</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="572"/>
|
||||||
|
<source><html><head/><body><p><br/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1185"/>
|
||||||
|
<source>Take effect when restart</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1325"/>
|
||||||
|
<source>0B</source>
|
||||||
|
<translation type="unfinished">0B</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="165"/>
|
||||||
|
<source>Spark Store</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="166"/>
|
||||||
|
<source>Search or enter spk://</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="172"/>
|
||||||
|
<source>Submit App</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="173"/>
|
||||||
|
<source>Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="275"/>
|
||||||
|
<source>Not Exist</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="121"/>
|
||||||
|
<location filename="../src/widget.cpp" line="329"/>
|
||||||
|
<location filename="../src/widget.cpp" line="333"/>
|
||||||
|
<location filename="../src/widget.cpp" line="342"/>
|
||||||
|
<location filename="../src/widget.cpp" line="346"/>
|
||||||
|
<source>Spark\ Store</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="546"/>
|
||||||
|
<source>Failed to download app info. Please check internet connection.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="576"/>
|
||||||
|
<source>PkgName: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="577"/>
|
||||||
|
<source>Version: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="579"/>
|
||||||
|
<source>Author: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="583"/>
|
||||||
|
<source>Official Site: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="587"/>
|
||||||
|
<source>Contributor: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="588"/>
|
||||||
|
<source>Update Time: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="589"/>
|
||||||
|
<source>Installed Size: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="598"/>
|
||||||
|
<location filename="../src/widget.cpp" line="709"/>
|
||||||
|
<location filename="../src/widget.cpp" line="898"/>
|
||||||
|
<source>Reinstall</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="637"/>
|
||||||
|
<source>Failed to load application icon.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="684"/>
|
||||||
|
<source>Failed to get the name to the file to be downloaded.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1047"/>
|
||||||
|
<source>Updating, please wait...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1100"/>
|
||||||
|
<source>Apt has reported an error. Please use apt update in terminal to locate the problem.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1106"/>
|
||||||
|
<source>Unknown error!</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1289"/>
|
||||||
|
<source>Yes</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1289"/>
|
||||||
|
<source>No</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1290"/>
|
||||||
|
<source>Information for Contributors</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1291"/>
|
||||||
|
<source>Currently the translation contribution is limited to English,
|
||||||
|
and you will be redirected to our Gitee repository at which you are
|
||||||
|
supposed to be creating pull requests to contribute app info
|
||||||
|
translations.
|
||||||
|
Tips:You can simply click the file to edit to create a flat pull request without create a full pull request
|
||||||
|
Tips:You can use github account to login to Gitee
|
||||||
|
Click yes to continue.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1126"/>
|
||||||
|
<source>Uninstall succeeded</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="749"/>
|
||||||
|
<source>Relative apps Not Found!</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="757"/>
|
||||||
|
<source>Request Error: %1</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1140"/>
|
||||||
|
<source>Temporary cache was cleaned</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1208"/>
|
||||||
|
<source>The URL has been copied to the clipboard</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>downloadlist</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="20"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="50"/>
|
||||||
|
<source>icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="82"/>
|
||||||
|
<source>TextLabel</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="106"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="189"/>
|
||||||
|
<source>Waiting to download</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="240"/>
|
||||||
|
<source>Install</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="259"/>
|
||||||
|
<source>Cancel</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="278"/>
|
||||||
|
<source>Info</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="24"/>
|
||||||
|
<source>Spark Store App Installer</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="25"/>
|
||||||
|
<source>gdebi</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="26"/>
|
||||||
|
<source>deepin deb installer</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="57"/>
|
||||||
|
<source>Downloaded, waiting to install</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="82"/>
|
||||||
|
<source>Failed to download %1</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="84"/>
|
||||||
|
<source>Download Failed,Check Your Connection</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="94"/>
|
||||||
|
<source>Finished downloading %1, awaiting to install</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="127"/>
|
||||||
|
<source>Installing</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="174"/>
|
||||||
|
<source>Finish</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="178"/>
|
||||||
|
<source>Retry</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="179"/>
|
||||||
|
<source>Error happened in dpkg progress , you can try it again</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="183"/>
|
||||||
|
<source>dpkg progress had been aborted,you can retry installation</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="205"/>
|
||||||
|
<source>Download canceled</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
||||||
860
translations/spark-store_fr.ts
Normal file
@@ -0,0 +1,860 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="fr">
|
||||||
|
<context>
|
||||||
|
<name>QLabel</name>
|
||||||
|
<message>
|
||||||
|
<source>Spark应用商店</source>
|
||||||
|
<translation type="vanished">Spark Store</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>社区驱动的一款为第三方应用商店,为改变而生
|
||||||
|
本程序按GPL第三版开源</source>
|
||||||
|
<translation type="vanished">Un app store tier alimenté par la communauté Deepin
|
||||||
|
Spark Store est publié sous licence GPL V3
|
||||||
|
Nous sommes nés pour le changement.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="37"/>
|
||||||
|
<source>Spark Store</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QObject</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="45"/>
|
||||||
|
<source><span style='font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style='font-size:12pt;'>Spark developers</span><br/><br/>Published under GPL V3</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>SpkAppInfoLoaderThread</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../workerthreads.cpp" line="25"/>
|
||||||
|
<source>Failed to download app info. Please check internet connection.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../workerthreads.cpp" line="53"/>
|
||||||
|
<source>PkgName: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../workerthreads.cpp" line="54"/>
|
||||||
|
<source>Version: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../workerthreads.cpp" line="56"/>
|
||||||
|
<source>Author: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../workerthreads.cpp" line="60"/>
|
||||||
|
<source>Official Site: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../workerthreads.cpp" line="64"/>
|
||||||
|
<source>Contributor: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../workerthreads.cpp" line="65"/>
|
||||||
|
<source>Update Time: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../workerthreads.cpp" line="66"/>
|
||||||
|
<source>Installed Size: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../workerthreads.cpp" line="95"/>
|
||||||
|
<source>Failed to load application icon.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Widget</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="52"/>
|
||||||
|
<source>background-color:#FFFFFF</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="67"/>
|
||||||
|
<source>Video</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="74"/>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="81"/>
|
||||||
|
<source>Tools</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="88"/>
|
||||||
|
<source>Beautify</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="95"/>
|
||||||
|
<source>Music</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="153"/>
|
||||||
|
<source>Development</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="160"/>
|
||||||
|
<source>Office</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="173"/>
|
||||||
|
<source>Back to category</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="200"/>
|
||||||
|
<source>Reading</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="207"/>
|
||||||
|
<source>Others</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="217"/>
|
||||||
|
<source>Home</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="227"/>
|
||||||
|
<source>Graphics</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="234"/>
|
||||||
|
<source>Games</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="241"/>
|
||||||
|
<source>Chat</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="248"/>
|
||||||
|
<source>Network</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="293"/>
|
||||||
|
<source>Reload</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="383"/>
|
||||||
|
<source>The list is currently empty. Go and download some softwares!</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="415"/>
|
||||||
|
<source>Open download directory</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="515"/>
|
||||||
|
<location filename="../widget.cpp" line="586"/>
|
||||||
|
<location filename="../widget.cpp" line="808"/>
|
||||||
|
<source>Install</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="528"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="568"/>
|
||||||
|
<source>ICON</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="623"/>
|
||||||
|
<source>Uninstall</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="639"/>
|
||||||
|
<source>Site</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="678"/>
|
||||||
|
<source>Share</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="712"/>
|
||||||
|
<location filename="../widget.ui" line="715"/>
|
||||||
|
<source><html><head/><body><p>This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="718"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/community-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="731"/>
|
||||||
|
<location filename="../widget.ui" line="734"/>
|
||||||
|
<source><html><head/><body><p>Capable to Ubuntu 20.04</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="737"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/ubuntu-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="750"/>
|
||||||
|
<location filename="../widget.ui" line="753"/>
|
||||||
|
<source><html><head/><body><p>Capable to deepin 20</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="756"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/deepin-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="769"/>
|
||||||
|
<location filename="../widget.ui" line="772"/>
|
||||||
|
<source><html><head/><body><p>Capable to UOS home 20</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="775"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/uos-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="788"/>
|
||||||
|
<location filename="../widget.ui" line="791"/>
|
||||||
|
<source><html><head/><body><p>This is a DTK5 app,which means it would have better effect on Deepin Desktop Environment</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="794"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/dtk-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="807"/>
|
||||||
|
<location filename="../widget.ui" line="810"/>
|
||||||
|
<source><html><head/><body><p>A deepin-wine2 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine2 by your self.</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="813"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/dwine2-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="826"/>
|
||||||
|
<location filename="../widget.ui" line="829"/>
|
||||||
|
<source><html><head/><body><p>A deepin-wine5 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine5 by your self.</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="832"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/dwine5-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="845"/>
|
||||||
|
<location filename="../widget.ui" line="848"/>
|
||||||
|
<source><html><head/><body><p>An Appimage to deb app.</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="851"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/a2d-small.png"/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="874"/>
|
||||||
|
<source>Contribute translation</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="892"/>
|
||||||
|
<source>Info</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="899"/>
|
||||||
|
<source><html><head/><body><p>An app store developed by community enthusiasts</p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="938"/>
|
||||||
|
<source>Screenshots</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1101"/>
|
||||||
|
<source>Line Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1117"/>
|
||||||
|
<source>Choose Line:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1140"/>
|
||||||
|
<source>Refresh</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1153"/>
|
||||||
|
<source>Take effect when restart</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1182"/>
|
||||||
|
<source><html><head/><body><p>The role of the source server is to ensure that the software is updated, and supports the use of the apt tool to get the software. We usually prefer that you use the first line as the update source, which is generally the most stable. </p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1192"/>
|
||||||
|
<source>Update</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1199"/>
|
||||||
|
<source>Source Server</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1219"/>
|
||||||
|
<source>Server</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1240"/>
|
||||||
|
<source>Temp</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1263"/>
|
||||||
|
<source>Clean</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1273"/>
|
||||||
|
<source>Since the dictionary is at /tmp,It would be cleaned automatically when system reboot.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1286"/>
|
||||||
|
<source>Size:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1300"/>
|
||||||
|
<source>Location:/tmp/spark-store</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1321"/>
|
||||||
|
<source>About us</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1328"/>
|
||||||
|
<source><html><head/><body><p>We are <span style=" font-weight:600;">NOT</span> the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &quot;Spark Store&quot;! &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. </p><p>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. </p><p>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. </p><p>If any part of the store infringes your rights, please tell us &lt;jifengshenmo@outlook.com&gt; we will remove the infringing content as soon as possible. </p><p>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. </p><p>QQ group:872690351<br/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>视频播放</source>
|
||||||
|
<translatorcomment>Lecteurs vidéo et créateurs vidéo</translatorcomment>
|
||||||
|
<translation type="vanished">Vidéo</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>下载列表</source>
|
||||||
|
<translation type="vanished">Liste de téléchargement</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>系统工具</source>
|
||||||
|
<translation type="vanished">Outils</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>主题美化</source>
|
||||||
|
<translatorcomment>Thème des icônes et autres </translatorcomment>
|
||||||
|
<translation type="vanished">Thèmes</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>音乐欣赏</source>
|
||||||
|
<translation type="vanished">Musique</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="114"/>
|
||||||
|
<source>icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>编程开发</source>
|
||||||
|
<translation type="vanished">Développement</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>办公学习</source>
|
||||||
|
<translation type="vanished">Bureau</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>阅读翻译</source>
|
||||||
|
<translation type="vanished">Traduire</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>其他应用</source>
|
||||||
|
<translation type="vanished">Autres</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>商店首页</source>
|
||||||
|
<translation type="vanished">Accueil</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>图形图像</source>
|
||||||
|
<translation type="vanished">Images</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>游戏娱乐</source>
|
||||||
|
<translation type="vanished">Jeux</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>社交沟通</source>
|
||||||
|
<translation type="vanished">Chat</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>网络应用</source>
|
||||||
|
<translation type="vanished">Réseau</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="342"/>
|
||||||
|
<source>about:blank</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>当前下载列表为空</source>
|
||||||
|
<translation type="vanished">La liste de téléchargement est vide</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>打开文件夹</source>
|
||||||
|
<translation type="vanished">Ouvrir dans le gestionnaire de fichiers</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>安装</source>
|
||||||
|
<translation type="vanished">Installer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>卸载</source>
|
||||||
|
<translation type="vanished">Supprimer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>官网</source>
|
||||||
|
<translation type="vanished">Site</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>软件名</source>
|
||||||
|
<translation type="vanished">Nom</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="540"/>
|
||||||
|
<source><html><head/><body><p><br/></p></body></html></source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>图标</source>
|
||||||
|
<translation type="vanished">Icon</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>分享</source>
|
||||||
|
<translation type="vanished">Partager</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>详细介绍</source>
|
||||||
|
<translation type="vanished">Détails</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source><html><head/><body><p>由社区爱好者开发的软件商店</p></body></html></source>
|
||||||
|
<translation type="vanished"><html><head/><body><p>magasin de logiciels développé par des passionnés de la communauté</p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>软件截图</source>
|
||||||
|
<translation type="vanished">Captures d'écran</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>线路设置</source>
|
||||||
|
<translation type="vanished">Line Settings</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>线路选择:</source>
|
||||||
|
<translation type="vanished">Choisissez: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>刷新</source>
|
||||||
|
<translation type="vanished">Mise à jour</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source> 重启商店后生效</source>
|
||||||
|
<translation type="vanished">Redémarrez pour prendre effet</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source><html><head/><body><p>源服务器的作用是保证软件更新,并且支持使用apt工具获取软件。通常我们更建议你使用第一个线路作为更新源,一般是最稳定的。</p></body></html></source>
|
||||||
|
<translation type="vanished"><html><head/><body><p>Le rôle du serveur source est de s'assurer que le logiciel est mis à jour et prend en charge l'utilisation de l'outil apt pour obtenir le logiciel. Nous préférons généralement que vous utilisiez la première ligne comme source de mise à jour, qui est généralement la plus stable. </p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>更新源</source>
|
||||||
|
<translation type="vanished">Mettre à jour la source APT</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>更新源服务器:</source>
|
||||||
|
<translation type="vanished">Source APT: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>服务器</source>
|
||||||
|
<translation type="vanished">serveur</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>缓存目录</source>
|
||||||
|
<translation type="vanished">Temp</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>清空</source>
|
||||||
|
<translation type="vanished">Nettoyer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>因为这个目录位于/tmp下,所以即使你不手动清空的话,其也将在系统重启时自动清空。</source>
|
||||||
|
<translation type="vanished">Étant donné que ce répertoire se trouve sous /tmp, même si vous ne l'effacez pas manuellement, il sera effacé automatiquement au redémarrage du système.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>目录大小:</source>
|
||||||
|
<translation type="vanished">Taille: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.ui" line="1293"/>
|
||||||
|
<source>0B</source>
|
||||||
|
<translation type="unfinished">0B</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>目录位置:/tmp/spark-store</source>
|
||||||
|
<translation type="vanished">Emplacement:/tmp/spark-store</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>关于我们</source>
|
||||||
|
<translation type="vanished">À propos de nous</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source><html><head/><body><p>我们并不是官方团队,和你一样,我们也只是众多Linux/deepin系统爱好者和用户之中的一员,我们开发并且运营这个“Spark应用商店”,是为了让社区的朋友们一起分享好用的软件,或者一起参与开发,让大家都用到最新的,最优秀的软件。</p><p>我们并没有因此盈利,所有开发和维护人员都不会获得报酬,我们的主要支出大部分依赖于社区对我们的捐助,很感谢大家,这部分捐助让我们并不需要耗费太多精力去担心资金问题。</p><p>我们的服务和开发的软件都是免费供给大家使用,交流,学习的,但是在您的使用过程中一定要遵守当地的法律法规,否则出现任何问题和我们无关。</p><p>如果商店中任何一部分有侵犯您权益的行为,请告知我们&lt;jifengshenmo@outlook.com&gt;,我们会第一时间删除侵权内容。</p><p>如果你也想参与我们,不管是参与开发,设计,投递还是投稿作品,我们都欢迎你的加入。</p><p>QQ群:872690351<br/></p></body></html></source>
|
||||||
|
<translation type="vanished"><html><head/><body><p>Nous ne sommes pas l'équipe officielle, tout comme vous, nous ne sommes qu'un des nombreux passionnés et utilisateurs de systèmes Linux / deepin, nous développons et gérons le "Spark Store"! ", est de rassembler la communauté pour partager des logiciels utiles, ou pour participer au développement ensemble, afin que nous utilisions tous les derniers et meilleurs logiciels. </p><p> Nous n'en tirons aucun profit, tous les développeurs et mainteneurs ne sont pas payés, et nous comptons sur les dons de la communauté pour la plupart de nos dépenses, dont nous sommes reconnaissants et qui nous permettent de ne pas dépenser trop d'énergie se soucier du financement. </p><p>Notre service et nos logiciels sont gratuits pour tout le monde à utiliser, à communiquer et à apprendre, mais vous devez vous conformer aux lois et réglementations locales dans le processus de votre utilisation, sinon tout problème n'a rien à voir avec nous. </p><p>Si une partie du magasin enfreint vos droits, veuillez nous en informer &lt;jifengshenmo@outlook.com&gt; nous retirerons le contenu en infraction dès que possible. </p><p>Si vous souhaitez également vous impliquer avec nous, que vous soyez impliqué dans le développement, la conception, le pitching ou la soumission de travaux, nous vous invitons à nous rejoindre. </p><p>QQ group:872690351<br/></p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="113"/>
|
||||||
|
<location filename="../widget.cpp" line="319"/>
|
||||||
|
<location filename="../widget.cpp" line="323"/>
|
||||||
|
<location filename="../widget.cpp" line="332"/>
|
||||||
|
<location filename="../widget.cpp" line="336"/>
|
||||||
|
<source>Spark\ Store</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="157"/>
|
||||||
|
<source>Spark Store</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="158"/>
|
||||||
|
<source>Search or enter spk://</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="164"/>
|
||||||
|
<source>Submit App</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="165"/>
|
||||||
|
<source>Settings</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="264"/>
|
||||||
|
<source>Not Exist</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="530"/>
|
||||||
|
<source>Failed to download app info. Please check internet connection.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="560"/>
|
||||||
|
<source>PkgName: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="561"/>
|
||||||
|
<source>Version: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="563"/>
|
||||||
|
<source>Author: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="567"/>
|
||||||
|
<source>Official Site: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="571"/>
|
||||||
|
<source>Contributor: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="572"/>
|
||||||
|
<source>Update Time: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="573"/>
|
||||||
|
<source>Installed Size: </source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="582"/>
|
||||||
|
<location filename="../widget.cpp" line="693"/>
|
||||||
|
<location filename="../widget.cpp" line="805"/>
|
||||||
|
<source>Reinstall</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="621"/>
|
||||||
|
<source>Failed to load application icon.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="668"/>
|
||||||
|
<source>Failed to get the name to the file to be downloaded.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="716"/>
|
||||||
|
<source>Spark store could only process spk:// links for now. The search feature is coming soon!</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="944"/>
|
||||||
|
<source>Updating, please wait...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="997"/>
|
||||||
|
<source>Apt has reported an error. Please use apt update in terminal to locate the problem.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="1003"/>
|
||||||
|
<source>Unknown error!</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="1023"/>
|
||||||
|
<source>Uninstall succeeded</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="1037"/>
|
||||||
|
<source>Temporary cache was cleaned</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="1104"/>
|
||||||
|
<source>The URL has been copied to the clipboard</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="1185"/>
|
||||||
|
<source>Yes</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="1185"/>
|
||||||
|
<source>No</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="1186"/>
|
||||||
|
<source>Information for Contributors</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../widget.cpp" line="1187"/>
|
||||||
|
<source>Currently the translation contribution is limited to English,
|
||||||
|
and you will be redirected to our Gitee repository at which you are
|
||||||
|
supposed to be creating pull requests to contribute app info
|
||||||
|
translations.
|
||||||
|
Tips:You can simply click the file to edit to create a flat pull request without create a full pull request
|
||||||
|
Tips:You can use github account to login to Gitee
|
||||||
|
Click yes to continue.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>downloadlist</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.ui" line="20"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.ui" line="50"/>
|
||||||
|
<source>icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.ui" line="82"/>
|
||||||
|
<source>TextLabel</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.ui" line="106"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.ui" line="189"/>
|
||||||
|
<source>Waiting to download</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.ui" line="240"/>
|
||||||
|
<source>Install</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.ui" line="259"/>
|
||||||
|
<source>Cancel</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.ui" line="278"/>
|
||||||
|
<source>Info</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>名称</source>
|
||||||
|
<translation type="vanished">Nom</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>等待开始下载</source>
|
||||||
|
<translatorcomment>Attendez pour téléchargerd</translatorcomment>
|
||||||
|
<translation type="vanished">Attendez pour télécharger</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>安装</source>
|
||||||
|
<translation type="vanished">Installer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>取消</source>
|
||||||
|
<translation type="vanished">Annuler</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>详情</source>
|
||||||
|
<translation type="vanished">Détail</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.cpp" line="24"/>
|
||||||
|
<source>dpkg</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.cpp" line="25"/>
|
||||||
|
<source>gdebi</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.cpp" line="26"/>
|
||||||
|
<source>deepin deb installer</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.cpp" line="55"/>
|
||||||
|
<source>Downloaded, waiting to install</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.cpp" line="80"/>
|
||||||
|
<source>Failed to download %1</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.cpp" line="82"/>
|
||||||
|
<source>Download Failed,Check Your Connection</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.cpp" line="92"/>
|
||||||
|
<source>Finished downloading %1, awaiting to install</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.cpp" line="125"/>
|
||||||
|
<source>Installing</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.cpp" line="172"/>
|
||||||
|
<source>Finish</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.cpp" line="176"/>
|
||||||
|
<source>Retry</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.cpp" line="177"/>
|
||||||
|
<source>Error happened in dpkg progress , you can try it again</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.cpp" line="181"/>
|
||||||
|
<source>dpkg progress had been aborted,you can retry installation</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../downloadlist.cpp" line="203"/>
|
||||||
|
<source>Download canceled</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
||||||
776
translations/spark-store_zh_CN.ts
Normal file
@@ -0,0 +1,776 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="zh_CN">
|
||||||
|
<context>
|
||||||
|
<name>AppItem</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/appitem.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/main.cpp" line="39"/>
|
||||||
|
<source>Spark Store</source>
|
||||||
|
<translation>Spark 应用商店</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QObject</name>
|
||||||
|
<message>
|
||||||
|
<source>We publish this program under GPL V3</source>
|
||||||
|
<translation type="vanished">本程序按GPL V3开源</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Version 2.0+2</source>
|
||||||
|
<translation type="vanished">版本: 2.0+2</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source><span style=' font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></source>
|
||||||
|
<translation type="vanished"><span style=' font-size:10pt;font-weight:60;'>deepin 社区驱动的一款第三方应用商店</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>The Spark Project</source>
|
||||||
|
<translation type="vanished">星火项目组</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source><span style=' font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style=' font-size:12pt;'>Spark developers</span><br/>We publish this program under GPL V3</source>
|
||||||
|
<translation type="vanished"><span style=' font-size:10pt;font-weight:60;'>一款由 深度社区 出品的应用商店</span><br/>""<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>""<span style=' font-size:12pt;'>星火开发者联盟</span><br/>本程序遵循 GPL V3 协议发布</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/main.cpp" line="47"/>
|
||||||
|
<source><span style='font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style='font-size:12pt;'>Spark developers</span><br/><br/>Published under GPL V3</source>
|
||||||
|
<translation><span style='font-size:10pt;font-weight:60;'>由 Deepin 社区出品的应用商店</span><br/><a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/><span style='font-size:12pt;'>星火商店开发组</span><br/><br/>遵循 GPL V3 协议发布</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>SpkAppInfoLoaderThread</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="25"/>
|
||||||
|
<source>Failed to download app info. Please check internet connection.</source>
|
||||||
|
<translation>下载应用程序详细信息失败,请检查网络连接。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="53"/>
|
||||||
|
<source>PkgName: </source>
|
||||||
|
<translation>包名: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="54"/>
|
||||||
|
<source>Version: </source>
|
||||||
|
<translation>版本: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="56"/>
|
||||||
|
<source>Author: </source>
|
||||||
|
<translation>作者: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="60"/>
|
||||||
|
<source>Official Site: </source>
|
||||||
|
<translation>官网: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="64"/>
|
||||||
|
<source>Contributor: </source>
|
||||||
|
<translation>投稿者: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="65"/>
|
||||||
|
<source>Update Time: </source>
|
||||||
|
<translation>更新时间: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="66"/>
|
||||||
|
<source>Installed Size: </source>
|
||||||
|
<translation>大小: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/workerthreads.cpp" line="95"/>
|
||||||
|
<source>Failed to load application icon.</source>
|
||||||
|
<translation>加载应用程序图标失败。</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>Widget</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="84"/>
|
||||||
|
<source>background-color:#FFFFFF</source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Videos</source>
|
||||||
|
<translation type="vanished">视频播放</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Download List</source>
|
||||||
|
<translation type="vanished">下载列表</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="184"/>
|
||||||
|
<source>Tools</source>
|
||||||
|
<translation>系统工具</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="265"/>
|
||||||
|
<source>Beautify</source>
|
||||||
|
<translation>主题美化</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="115"/>
|
||||||
|
<source>Music</source>
|
||||||
|
<translation>音乐欣赏</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Coding</source>
|
||||||
|
<translation type="vanished">编程开发</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="198"/>
|
||||||
|
<source>Office</source>
|
||||||
|
<translation>办公学习</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Translate</source>
|
||||||
|
<translation type="vanished">阅读翻译</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="286"/>
|
||||||
|
<source>Others</source>
|
||||||
|
<translation>其他应用</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>FrontPage</source>
|
||||||
|
<translation type="vanished">商店首页</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Images</source>
|
||||||
|
<translation type="vanished">图形图像</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="279"/>
|
||||||
|
<source>Games</source>
|
||||||
|
<translation>游戏娱乐</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Chatting</source>
|
||||||
|
<translation type="vanished">社交沟通</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="272"/>
|
||||||
|
<source>Network</source>
|
||||||
|
<translation>网络应用</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="415"/>
|
||||||
|
<source>The list is currently empty. Go and download some softwares!</source>
|
||||||
|
<translation>当前下载列表为空。去下载些软件吧!</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="447"/>
|
||||||
|
<source>Open download directory</source>
|
||||||
|
<translation>打开下载文件夹</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="560"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>软件名</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="600"/>
|
||||||
|
<source>ICON</source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="547"/>
|
||||||
|
<location filename="../src/widget.cpp" line="602"/>
|
||||||
|
<location filename="../src/widget.cpp" line="901"/>
|
||||||
|
<source>Install</source>
|
||||||
|
<translation>安装</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="313"/>
|
||||||
|
<source>Video</source>
|
||||||
|
<translation>视频播放</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="306"/>
|
||||||
|
<source>Download</source>
|
||||||
|
<translation>下载列表</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="191"/>
|
||||||
|
<source>Reading</source>
|
||||||
|
<translation>阅读翻译</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="225"/>
|
||||||
|
<source>Chat</source>
|
||||||
|
<translation>社交沟通</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="655"/>
|
||||||
|
<source>Uninstall</source>
|
||||||
|
<translation>卸载</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="671"/>
|
||||||
|
<source>Site</source>
|
||||||
|
<translation>官网</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="744"/>
|
||||||
|
<location filename="../src/widget.ui" line="747"/>
|
||||||
|
<source><html><head/><body><p>This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology</p></body></html></source>
|
||||||
|
<translation><html><head/><body><p>这款应用是社区开发者开发的,我们为社区开发者颁发这款勋章以表彰他们对Linux生态的贡献</p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="750"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/community-small.png"/></p></body></html></source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="763"/>
|
||||||
|
<location filename="../src/widget.ui" line="766"/>
|
||||||
|
<source><html><head/><body><p>Capable to Ubuntu 20.04</p></body></html></source>
|
||||||
|
<translation><html><head/><body><p>支持Ubuntu 20.04</p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="782"/>
|
||||||
|
<location filename="../src/widget.ui" line="785"/>
|
||||||
|
<source><html><head/><body><p>Capable to deepin 20</p></body></html></source>
|
||||||
|
<translation><html><head/><body><p>支持deepin 20</p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="788"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/deepin-small.png"/></p></body></html></source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="801"/>
|
||||||
|
<location filename="../src/widget.ui" line="804"/>
|
||||||
|
<source><html><head/><body><p>Capable to UOS home 20</p></body></html></source>
|
||||||
|
<translation><html><head/><body><p>支持UOS家庭版 20</p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="820"/>
|
||||||
|
<location filename="../src/widget.ui" line="823"/>
|
||||||
|
<source><html><head/><body><p>This is a DTK5 app,which means it would have better effect on Deepin Desktop Environment</p></body></html></source>
|
||||||
|
<translation><html><head/><body><p>这是一款DTK5应用,请使用深度桌面环境来获得最完美的体验</p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="826"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/dtk-small.png"/></p></body></html></source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="858"/>
|
||||||
|
<location filename="../src/widget.ui" line="861"/>
|
||||||
|
<source><html><head/><body><p>A deepin-wine5 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine5 by your self.</p></body></html></source>
|
||||||
|
<translation><html><head/><body><p>这是一款deepin-wine5应用,如果你并没有在使用深度系列发行版(比如您在使用ubuntu),你需要自行配置deepin-wine5环境</p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="877"/>
|
||||||
|
<location filename="../src/widget.ui" line="880"/>
|
||||||
|
<source><html><head/><body><p>An Appimage to deb app.</p></body></html></source>
|
||||||
|
<translation><html><head/><body><p>这是一款Appimage转制应用.</p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="883"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/a2d-small.png"/></p></body></html></source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="710"/>
|
||||||
|
<source>Share</source>
|
||||||
|
<translation>Spk分享链接</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="129"/>
|
||||||
|
<source>Development</source>
|
||||||
|
<translation>编程开发</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Home </source>
|
||||||
|
<translation type="vanished">商店首页</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="122"/>
|
||||||
|
<source>Graphics</source>
|
||||||
|
<translation>图形图像</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Communication</source>
|
||||||
|
<translation type="vanished">社交沟通</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="839"/>
|
||||||
|
<location filename="../src/widget.ui" line="842"/>
|
||||||
|
<source><html><head/><body><p>A deepin-wine2 app.If you are using ubuntu or other non-deepin distro,you should deploy deepin-wine2 by your self.</p></body></html></source>
|
||||||
|
<translation><html><head/><body><p>这是一款 deepin-wine2 应用,如果你并没有在使用深度系列发行版(比如您在使用ubuntu),你需要自行配置 deepin-wine2 环境</p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="845"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/dwine2-small.png"/></p></body></html></source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="864"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/dwine5-small.png"/></p></body></html></source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="906"/>
|
||||||
|
<source>Contribute translation</source>
|
||||||
|
<translation>贡献翻译/应用反馈</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="924"/>
|
||||||
|
<source>Info</source>
|
||||||
|
<translation>详细</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="931"/>
|
||||||
|
<source><html><head/><body><p>An app store developed by community enthusiasts</p></body></html></source>
|
||||||
|
<translation><html><head/><body><p>由社区爱好者开发的一款应用商店</p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="970"/>
|
||||||
|
<source>Screenshots</source>
|
||||||
|
<translation>屏幕截图</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1133"/>
|
||||||
|
<source>Line Settings</source>
|
||||||
|
<translation>线路设置</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1149"/>
|
||||||
|
<source>Choose Line:</source>
|
||||||
|
<translation>线路选择:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1172"/>
|
||||||
|
<source>Refresh</source>
|
||||||
|
<translation>刷新</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Take effect when restart </source>
|
||||||
|
<translation type="vanished">重启商店后生效</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1214"/>
|
||||||
|
<source><html><head/><body><p>The role of the source server is to ensure that the software is updated, and supports the use of the apt tool to get the software. We usually prefer that you use the first line as the update source, which is generally the most stable. </p></body></html></source>
|
||||||
|
<translation><html><head/><body><p>源服务器的作用是保证软件更新,并且支持使用apt工具获取软件。通常我们更建议你使用第一个线路作为更新源,一般是最稳定的。</p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1224"/>
|
||||||
|
<source>Update</source>
|
||||||
|
<translation>更新源</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1231"/>
|
||||||
|
<source>Source Server</source>
|
||||||
|
<translation>更新源服务器</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1251"/>
|
||||||
|
<source>Server</source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1272"/>
|
||||||
|
<source>Temp</source>
|
||||||
|
<translation>缓存目录</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1295"/>
|
||||||
|
<source>Clean</source>
|
||||||
|
<translation>清空</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1305"/>
|
||||||
|
<source>Since the dictionary is at /tmp,It would be cleaned automatically when system reboot.</source>
|
||||||
|
<translation>因为这个目录位于/tmp下,所以即使你不手动清空的话,其也将在系统重启时自动清空。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1318"/>
|
||||||
|
<source>Size:</source>
|
||||||
|
<translation>目录大小:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1332"/>
|
||||||
|
<source>Location:/tmp/spark-store</source>
|
||||||
|
<translation>目录位置:/tmp/spark-store</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1353"/>
|
||||||
|
<source>About us</source>
|
||||||
|
<translation>关于我们</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1360"/>
|
||||||
|
<source><html><head/><body><p>We are <span style=" font-weight:600;">NOT</span> the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &quot;Spark Store&quot;! &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. </p><p>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. </p><p>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. </p><p>If any part of the store infringes your rights, please tell us &lt;jifengshenmo@outlook.com&gt; we will remove the infringing content as soon as possible. </p><p>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. </p><p>QQ group:872690351<br/></p></body></html></source>
|
||||||
|
<translation><html><head/><body><p>我们并<span style=" font-weight:600;">不是</span>官方团队,和你一样,我们也只是众多Linux/deepin系统爱好者和用户之中的一员,我们开发并且运营这个“Spark应用商店”,是为了让社区的朋友们一起分享好用的软件,或者一起参与开发,让大家都用到最新的,最优秀的软件。</p><p>我们并没有因此盈利,所有开发和维护人员都不会获得报酬,我们的主要支出大部分依赖于社区对我们的捐助,很感谢大家,这部分捐助让我们并不需要耗费太多精力去担心资金问题。</p><p>我们的服务和开发的软件都是免费供给大家使用,交流,学习的,但是在您的使用过程中一定要遵守当地的法律法规,否则出现任何问题和我们无关。</p><p>如果商店中任何一部分有侵犯您权益的行为,请告知我们 &lt;jifengshenmo@outlook.com&gt;,我们会第一时间删除侵权内容。</p><p>如果你也想参与我们,不管是参与开发,设计,投递还是投稿作品,我们都欢迎你的加入。</p><p>QQ 群:872690351<br/></p></body></html></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="148"/>
|
||||||
|
<source>icon</source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="238"/>
|
||||||
|
<source>Back to category</source>
|
||||||
|
<translation>返回分类</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="296"/>
|
||||||
|
<source>Home</source>
|
||||||
|
<translation>商店首页</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="211"/>
|
||||||
|
<source>Reload</source>
|
||||||
|
<translation>刷新</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="374"/>
|
||||||
|
<source>about:blank</source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="572"/>
|
||||||
|
<source><html><head/><body><p><br/></p></body></html></source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="769"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/ubuntu-small.png"/></p></body></html></source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="807"/>
|
||||||
|
<source><html><head/><body><p><img src=":/tags/uos-small.png"/></p></body></html></source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1185"/>
|
||||||
|
<source>Take effect when restart</source>
|
||||||
|
<translation>重启商店后生效</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.ui" line="1325"/>
|
||||||
|
<source>0B</source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="165"/>
|
||||||
|
<source>Spark Store</source>
|
||||||
|
<translation>Spark 应用商店</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="166"/>
|
||||||
|
<source>Search or enter spk://</source>
|
||||||
|
<translation>搜索或打开链接</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="172"/>
|
||||||
|
<source>Submit App</source>
|
||||||
|
<translation>投递应用</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="173"/>
|
||||||
|
<source>Settings</source>
|
||||||
|
<translation>设置</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="275"/>
|
||||||
|
<source>Not Exist</source>
|
||||||
|
<translation>不存在</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="121"/>
|
||||||
|
<location filename="../src/widget.cpp" line="329"/>
|
||||||
|
<location filename="../src/widget.cpp" line="333"/>
|
||||||
|
<location filename="../src/widget.cpp" line="342"/>
|
||||||
|
<location filename="../src/widget.cpp" line="346"/>
|
||||||
|
<source>Spark\ Store</source>
|
||||||
|
<translation>星火应用商店</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="546"/>
|
||||||
|
<source>Failed to download app info. Please check internet connection.</source>
|
||||||
|
<translation>下载应用程序详细信息失败,请检查网络连接。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="576"/>
|
||||||
|
<source>PkgName: </source>
|
||||||
|
<translation>包名: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="577"/>
|
||||||
|
<source>Version: </source>
|
||||||
|
<translation>版本: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="579"/>
|
||||||
|
<source>Author: </source>
|
||||||
|
<translation>作者: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="583"/>
|
||||||
|
<source>Official Site: </source>
|
||||||
|
<translation>官网: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="587"/>
|
||||||
|
<source>Contributor: </source>
|
||||||
|
<translation>投稿者: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="588"/>
|
||||||
|
<source>Update Time: </source>
|
||||||
|
<translation>更新时间: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="589"/>
|
||||||
|
<source>Installed Size: </source>
|
||||||
|
<translation>大小: </translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="598"/>
|
||||||
|
<location filename="../src/widget.cpp" line="709"/>
|
||||||
|
<location filename="../src/widget.cpp" line="898"/>
|
||||||
|
<source>Reinstall</source>
|
||||||
|
<translation>重新安装</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="637"/>
|
||||||
|
<source>Failed to load application icon.</source>
|
||||||
|
<translation>加载应用程序图标失败。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="684"/>
|
||||||
|
<source>Failed to get the name to the file to be downloaded.</source>
|
||||||
|
<translation>获取安装包文件名失败。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="749"/>
|
||||||
|
<source>Relative apps Not Found!</source>
|
||||||
|
<translation>相关应用未找到!</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="757"/>
|
||||||
|
<source>Request Error: %1</source>
|
||||||
|
<translation>请求错误:%1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Spark store could only process spk:// links for now. The search feature is coming soon!</source>
|
||||||
|
<translation type="vanished">目前仅支持商店专用链接的打开,搜索功能正在开发,请期待以后的版本!</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1047"/>
|
||||||
|
<source>Updating, please wait...</source>
|
||||||
|
<translation>正在更新,请稍候……</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1100"/>
|
||||||
|
<source>Apt has reported an error. Please use apt update in terminal to locate the problem.</source>
|
||||||
|
<translation>更新中发生错误,请在终端使用apt update来查看错误原因。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1106"/>
|
||||||
|
<source>Unknown error!</source>
|
||||||
|
<translation>未知错误!</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1289"/>
|
||||||
|
<source>Yes</source>
|
||||||
|
<translation>是</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1289"/>
|
||||||
|
<source>No</source>
|
||||||
|
<translation>否</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1290"/>
|
||||||
|
<source>Information for Contributors</source>
|
||||||
|
<translation>贡献者须知</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1291"/>
|
||||||
|
<source>Currently the translation contribution is limited to English,
|
||||||
|
and you will be redirected to our Gitee repository at which you are
|
||||||
|
supposed to be creating pull requests to contribute app info
|
||||||
|
translations.
|
||||||
|
Tips:You can simply click the file to edit to create a flat pull request without create a full pull request
|
||||||
|
Tips:You can use github account to login to Gitee
|
||||||
|
Click yes to continue.</source>
|
||||||
|
<translation>目前商店仅支持应用程序英文详细信息的贡献。
|
||||||
|
在你确认后你会被导向到我们的 Gitee 页面,
|
||||||
|
请在此创建 Pull Request 以进行翻译贡献。
|
||||||
|
备注:你可以直接在页面编辑以快速创建轻量级pr
|
||||||
|
你也可以使用github账户直接登陆Gitee
|
||||||
|
|
||||||
|
单击“是”以继续。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Currently the translation contribution is limited to English,
|
||||||
|
and you will be redirected to our Gitee repository at which you are
|
||||||
|
supposed to be creating pull requests to contribute app info
|
||||||
|
translations.
|
||||||
|
|
||||||
|
Click yes to continue.</source>
|
||||||
|
<translation type="obsolete">目前商店仅支持应用程序英文详细信息的贡献。
|
||||||
|
在你确认后你会被导向到我们的 Gitee 页面,
|
||||||
|
请在此创建 Pull Request 以进行翻译贡献。
|
||||||
|
备注:你可以直接在页面编辑以快速创建轻量级pr
|
||||||
|
你也可以使用github账户直接登陆Gitee
|
||||||
|
|
||||||
|
单击“是”以继续。.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Unknown server error!</source>
|
||||||
|
<translation type="vanished">服务器未知错误</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1126"/>
|
||||||
|
<source>Uninstall succeeded</source>
|
||||||
|
<translation>卸载成功</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1140"/>
|
||||||
|
<source>Temporary cache was cleaned</source>
|
||||||
|
<translation>缓存目录已清空</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/widget.cpp" line="1208"/>
|
||||||
|
<source>The URL has been copied to the clipboard</source>
|
||||||
|
<translation>链接已复制到剪贴板</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>downloadlist</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="20"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="50"/>
|
||||||
|
<source>icon</source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="82"/>
|
||||||
|
<source>TextLabel</source>
|
||||||
|
<translation></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="106"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>软件名</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="189"/>
|
||||||
|
<source>Waiting to download</source>
|
||||||
|
<translation>正在等待下载</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="240"/>
|
||||||
|
<source>Install</source>
|
||||||
|
<translation>安装</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="259"/>
|
||||||
|
<source>Cancel</source>
|
||||||
|
<translation>取消</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.ui" line="278"/>
|
||||||
|
<source>Info</source>
|
||||||
|
<translation>详情</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>dpkg</source>
|
||||||
|
<translation type="vanished">dpkg</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="24"/>
|
||||||
|
<source>Spark Store App Installer</source>
|
||||||
|
<translation>星火内置安装器</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="25"/>
|
||||||
|
<source>gdebi</source>
|
||||||
|
<translation>gdebi</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="26"/>
|
||||||
|
<source>deepin deb installer</source>
|
||||||
|
<translation>深度软件包安装器</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="57"/>
|
||||||
|
<source>Downloaded, waiting to install</source>
|
||||||
|
<translation>已完成,等待安装</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="82"/>
|
||||||
|
<source>Failed to download %1</source>
|
||||||
|
<translation>下载 %1 失败</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="84"/>
|
||||||
|
<source>Download Failed,Check Your Connection</source>
|
||||||
|
<translation>下载失败,请检查网络连接</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="94"/>
|
||||||
|
<source>Finished downloading %1, awaiting to install</source>
|
||||||
|
<translation>%1 下载完成,等待安装</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="127"/>
|
||||||
|
<source>Installing</source>
|
||||||
|
<translation>正在安装</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Installing...</source>
|
||||||
|
<translation type="obsolete">正在安装</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="174"/>
|
||||||
|
<source>Finish</source>
|
||||||
|
<translation>完成</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="178"/>
|
||||||
|
<source>Retry</source>
|
||||||
|
<translation>重试</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="179"/>
|
||||||
|
<source>Error happened in dpkg progress , you can try it again</source>
|
||||||
|
<translation>dpkg出现错误,可重新安装</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="183"/>
|
||||||
|
<source>dpkg progress had been aborted,you can retry installation</source>
|
||||||
|
<translation>安装被中止,可重新安装</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/downloadlist.cpp" line="205"/>
|
||||||
|
<source>Download canceled</source>
|
||||||
|
<translation>下载已取消</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
||||||