Compare commits

..

23 Commits

Author SHA1 Message Date
80cf746f90 fix: ssinstall 失去作用 2023-02-21 14:38:38 +08:00
3b83b335be !193 aptss 获取线路信息 转到从 d. 服务器获取 顺便改了下changelog
Merge pull request !193 from shenmo/auto-4915358-dev-3747efbc
2023-02-20 01:47:48 +00:00
1f0a0e48ff 特性链接修改 2023-02-20 09:46:39 +08:00
432215e040 aptss 获取线路信息 转到从 d. 服务器获取
顺便改了下changelog
2023-02-20 09:32:41 +08:00
1a65386c6b !192 feat: 支持打包时从 debian/changelog 自动获取构建版本号并写入关于窗口
feat: 支持打包时从 debian/changelog 自动获取构建版本号并写入关于窗口
2023-02-18 23:12:26 +00:00
zty199
757dced302 fix: 修复 debian/control 中错误字段
Standards-Version 被错误修改为 Standard-Version

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

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

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

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

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

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

* 该提交需要在低版本 DTK 验证能否正常编译运行
2023-02-16 01:18:11 +08:00
80adfd5dc1 !184 翻译
Merge pull request !184 from shenmo/auto-4915358-dev-be4c6d8e
2023-02-13 07:37:00 +00:00
e81c846432 加入zh_TW配置 2023-02-13 15:35:28 +08:00
03d60d74f1 翻译 2023-02-13 15:31:29 +08:00
4f2c5f1bdc fix: 内存安全加固 2023-02-12 23:56:25 +08:00
zty199
da03261cbb fix: ISSUE #I6CU7C 下载完成时,即使主窗口被遮挡,下载列表按钮动画效果仍显示在最上层
动画效果 WaterDrop widget 未设置父对象,使用全局坐标映射显示在按钮位置

Log: 对 WaterDrop 添加父对象,与下载列表按钮同级,为标题栏布局子控件,以此限制动画显示范围仅在标题栏内
2023-02-11 19:19:09 +08:00
36 changed files with 1422 additions and 460 deletions

25
debian/changelog vendored
View File

@@ -1,3 +1,28 @@
spark-store (4.2.3~test4) stable; urgency=medium
* 修复: aptss 无法安装
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2.3~test3) stable; urgency=medium
* 调整:打包时从 debian/changelog 自动获取构建版本号并写入关于窗口保证与deb一致
* 新增:支持 DTK 5.6.4 关于对话框“版本特性”显示功能。目前只在deepin编译安装时开启
* 修复:修复下载列表对话框中,点击某个 item 取消下载按钮后下载列表无法再次显示的问题
* 修复:多个应用安装可能会出现某一个应用没有安装
* 修复:修复下载按钮点击/双击/拖动时,主窗口动作与下载管理对话框动作同时触发问题
* aptss 获取线路信息 转到从 d. 服务器获取
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2.3~test2) stable; urgency=medium
* 调整:开启安装包加固
* 添加zh_TW翻译
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
spark-store (4.2.3~test1) stable; urgency=medium spark-store (4.2.3~test1) stable; urgency=medium
* 修复因判断安装状态错误创建多个相同任务的bug * 修复因判断安装状态错误创建多个相同任务的bug

4
debian/control vendored
View File

@@ -20,9 +20,9 @@ Build-Depends:
qtwayland5-dev-tools, qtwayland5-dev-tools,
gcc, gcc,
g++ g++
Standards-Version: 4.0.0
Standards-Version: 3.0
Homepage: https://www.spark-app.store/ Homepage: https://www.spark-app.store/
Package: spark-store Package: spark-store
Architecture: any Architecture: any
Depends:${shlibs:Depends}, ${misc:Depends}, Depends:${shlibs:Depends}, ${misc:Depends},

15
debian/rules vendored
View File

@@ -1,13 +1,14 @@
#!/usr/bin/make -f #!/usr/bin/make -f
export QT_SELECT=5 export QT_SELECT = qt5
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
include /usr/share/dpkg/default.mk include /usr/share/dpkg/default.mk
DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH) DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
DH_AUTO_ARGS = --parallel --buildsystem=qmake DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
# Uncomment this to turn on verbose mode. # Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1 #export DH_VERBOSE = 1
%: %:
dh $@ --parallel dh $@ --parallel
@@ -17,20 +18,18 @@ override_dh_auto_clean:
override_dh_auto_configure: override_dh_auto_configure:
mkdir -p $(CURDIR)/build mkdir -p $(CURDIR)/build
dh_auto_configure MAKEFLAGS=-j$(JOBS) -- spark-store-project.pro \ qmake BUILD_VERSION=$(DEB_VERSION_UPSTREAM) spark-store-project.pro \
-spec linux-g++ CONFIG+=qtquickcompiler \ -spec linux-g++ CONFIG+=qtquickcompiler \
-o $(CURDIR)/build/ -o $(CURDIR)/build/
override_dh_auto_build: override_dh_auto_build:
make -C $(CURDIR)/build -j$(JOBS) make MAKEFLAGS="$(MAKEFLAGS)" -C $(CURDIR)/build
override_dh_auto_install: override_dh_auto_install:
make -C $(CURDIR)/build install \ make -C $(CURDIR)/build install \
INSTALL_ROOT=$(CURDIR)/debian/spark-store INSTALL_ROOT=$(CURDIR)/debian/spark-store
# Ignore the dpkg-shlibdeps: warning (it uses none of the library's symbols) # Ignore the dpkg-shlibdeps: warning (it uses none of the library's symbols)
# Qt Mutidedia lib will ref to network libraray. # Qt Mutidedia lib will ref to network libraray.
override_dh_shlibdeps: override_dh_shlibdeps:

View File

@@ -2,20 +2,16 @@
case "$1" in case "$1" in
configure) configure)
# Enable i386 arch
echo "Enabling i386 arch..."
dpkg --add-architecture i386
# Enable i386 arch # config for aptss
echo "Enable i386 arch..." mkdir -p /etc/aptss/sources.list.d
dpkg --add-architecture i386 ln -s -f /etc/apt/sources.list /etc/aptss/sources.list
# config for aptss # Remove the sources.list file
mkdir -p /etc/aptss/sources.list.d rm -f /etc/apt/sources.list.d/sparkstore.list
ln -s -f /etc/apt/sources.list /etc/aptss/sources.list
# Remove the sources.list file
if [ -e /etc/apt/sources.list.d/sparkstore.list ];then
rm /etc/apt/sources.list.d/sparkstore.list
fi
# Check if /usr/local/bin existed # Check if /usr/local/bin existed
mkdir -p /usr/local/bin mkdir -p /usr/local/bin
@@ -28,33 +24,29 @@ case "$1" in
ln -s -f /opt/durapps/spark-store/bin/ssaudit /usr/local/bin/ssaudit ln -s -f /opt/durapps/spark-store/bin/ssaudit /usr/local/bin/ssaudit
ln -s -f /opt/durapps/spark-store/bin/spark-dstore-patch /usr/local/bin/spark-dstore-patch ln -s -f /opt/durapps/spark-store/bin/spark-dstore-patch /usr/local/bin/spark-dstore-patch
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/local/bin/ss-apt-fast ln -s -f /opt/durapps/spark-store/bin/aptss /usr/local/bin/ss-apt-fast
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/bin/aptss ln -s -f /opt/durapps/spark-store/bin/aptss /usr/bin/aptss
# Create symbol links for SSINSTALL # Create symbol links for SSINSTALL
ln -s -f /opt/durapps/spark-store/bin/auto-install-policy/store.spark-app.ssinstall.policy /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy ln -s -f /opt/durapps/spark-store/bin/auto-install-policy/store.spark-app.ssinstall.policy /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy
# Compile sender module
echo "Compiling the Sender module..." echo "Compiling the Sender module..."
gcc -Wformat -Wformat-security -Werror=format-security /opt/durapps/spark-store/bin/ss-feedback/sender-d.sh.c -o /opt/durapps/spark-store/bin/ss-feedback/sender-d
gcc /opt/durapps/spark-store/bin/ss-feedback/sender-d.sh.c -o /opt/durapps/spark-store/bin/ss-feedback/sender-d
# Install key # Install key
mkdir -p /tmp/spark-store-install/ mkdir -p /tmp/spark-store-install/
cp -f /opt/durapps/spark-store/bin/spark-store.asc /tmp/spark-store-install/spark-store.asc cp -f /opt/durapps/spark-store/bin/spark-store.asc /tmp/spark-store-install/spark-store.asc
gpg --dearmor /tmp/spark-store-install/spark-store.asc gpg --dearmor /tmp/spark-store-install/spark-store.asc
cp -f /tmp/spark-store-install/spark-store.asc.gpg /etc/apt/trusted.gpg.d/spark-store.gpg cp -f /tmp/spark-store-install/spark-store.asc.gpg /etc/apt/trusted.gpg.d/spark-store.gpg
# Run apt update to avoid users being fucked up by the non-exist dependency problem
# Run apt update to avoid users being fucked up by the non-exist dependency problem
# Now abandoned as aptss now run ssupdate everytime # Now abandoned as aptss now run ssupdate everytime
#aptss ssupdate #aptss ssupdate
# Start upgrade detect service # Start upgrade detect service
systemctl enable spark-update-notifier systemctl enable spark-update-notifier
service spark-update-notifier start systemctl start spark-update-notifier
# Update certain caches # Update certain caches
update-icon-caches /usr/share/icons/hicolor || true update-icon-caches /usr/share/icons/hicolor || true
@@ -63,12 +55,10 @@ case "$1" in
update-mime-database /usr/share/mime || true update-mime-database /usr/share/mime || true
# Send email for statistics # Send email for statistics
# /tmp/spark-store-install/feedback.sh #/tmp/spark-store-install/feedback.sh
# Remove temp dir # Remove temp dir
rm -rf /tmp/spark-store-install rm -rf /tmp/spark-store-install
;; ;;
triggered) triggered)

View File

@@ -1,48 +1,35 @@
#!/bin/sh #!/bin/sh
if [ "$1" = "remove" ] || [ "$1" = "purge" ];then if [ "$1" = "remove" ] || [ "$1" = "purge" ] ; then
# Remove residual symbol links # Remove residual symbol links
rm /usr/local/bin/spark-store rm -f /usr/local/bin/spark-store
rm /usr/local/bin/ssinstall rm -f /usr/local/bin/ssinstall
rm /usr/local/bin/ssaudit rm -f /usr/local/bin/ssaudit
rm /usr/local/bin/spark-dstore-patch rm -f /usr/local/bin/spark-dstore-patch
rm /usr/local/bin/ussinstall rm -f /usr/local/bin/ussinstall
rm /usr/local/bin/ussremove rm -f /usr/local/bin/ussremove
rm /usr/local/bin/ss-apt-fast rm -f /usr/local/bin/ss-apt-fast
rm /usr/bin/aptss rm -f /usr/bin/aptss
rm -rf /etc/aptss/ rm -rf /etc/aptss/
# Remove Sender module # Remove Sender module
rm /opt/durapps/spark-store/bin/ss-feedback/sender-d rm -f /opt/durapps/spark-store/bin/ss-feedback/sender-d
# Remove residual symbol links to stop upgrade detect if exist # Remove residual symbol links to stop upgrade detect
if [ -e /etc/xdg/autostart/spark-update-notifier.desktop ];then rm -f /etc/xdg/autostart/spark-update-notifier.desktop
rm /etc/xdg/autostart/spark-update-notifier.desktop
fi
# Shutdown services # Shutdown services
service spark-update-notifier stop systemctl stop spark-update-notifier
# Stop update detect service
systemctl disable spark-update-notifier
# Stop update detect service # Clean the auto install polkit file if exist
systemctl disable spark-update-notifier rm -f /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy
# Clean the auto install polkit file if exist
if [ -f "/usr/share/polkit-1/actions/store.spark-app.ssinstall.policy" ] ; then
rm /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy
fi
# Remove gpg key file
if [ -f "/etc/apt/trusted.gpg.d/spark-store.gpg" ] ; then
rm /etc/apt/trusted.gpg.d/spark-store.gpg
fi
apt-key del '9D9A A859 F750 24B1 A1EC E16E 0E41 D354 A29A 440C'
# Remove gpg key file
rm -f /etc/apt/trusted.gpg.d/spark-store.gpg
apt-key del '9D9A A859 F750 24B1 A1EC E16E 0E41 D354 A29A 440C'
else else
echo "非卸载操作,不进行配置清理"
echo "非卸载操作,不进行配置清理"
fi fi

View File

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

View File

@@ -14,8 +14,14 @@ SUBDIRS += \
src/spark-dstore-patch \ src/spark-dstore-patch \
src/spark-store.pro src/spark-store.pro
# https://wiki.debian.org/Hardening
QMAKE_CFLAGS *= $(shell dpkg-buildflags --get CFLAGS)
QMAKE_CPPFLAGS *= $(shell dpkg-buildflags --get CPPFLAGS)
QMAKE_CXXFLAGS *= $(shell dpkg-buildflags --get CXXFLAGS)
QMAKE_LFLAGS *= $(shell dpkg-buildflags --get LDFLAGS)
# Update translation files # Update translation files
CONFIG(release, debug|release) { CONFIG(release, debug | release) {
system(bash $${PWD}/translate_update.sh) system(bash $${PWD}/translate_update.sh)
system(bash $${PWD}/translate_generation.sh) system(bash $${PWD}/translate_generation.sh)
} }

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,9 +1,7 @@
#include "downloadworker.h" #include "downloadworker.h"
#include <QEventLoop>
#include <QProcess> #include <QProcess>
#include <QRegularExpression> #include <QRegularExpression>
#include <QDir>
#include <QtConcurrent> #include <QtConcurrent>
#include <QStandardPaths> #include <QStandardPaths>

View File

@@ -2,9 +2,7 @@
#define DOWNLOADWORKER_H #define DOWNLOADWORKER_H
#include <QObject> #include <QObject>
#include <QList> #include <QVector>
#include <QFile>
#include <QNetworkReply>
class DownloadController : public QObject class DownloadController : public QObject
{ {
@@ -19,23 +17,19 @@ public:
qint64 getFileSize(const QString& url); qint64 getFileSize(const QString& url);
QString replaceDomain(const QString& url, const QString domain); QString replaceDomain(const QString& url, const QString domain);
signals:
void errorOccur(const QString& msg);
void downloadProcess(QString, qint64, qint64);
void downloadFinished();
private: private:
int threadNum; int threadNum;
qint64 pidNumber = -1; qint64 pidNumber = -1;
QString filename; QString filename;
qint64 fileSize; qint64 fileSize;
QVector<QPair<qint64, qint64>> ranges; QVector<QPair<qint64, qint64>> ranges;
QFile *file;
bool finished = false; bool finished = false;
QVector<QString> domains; QVector<QString> domains;
signals:
void errorOccur(const QString& msg);
void downloadProcess(QString, qint64, qint64);
void downloadFinished();
}; };
#endif // FILEDOWNLOADWORKER_H #endif // FILEDOWNLOADWORKER_H

View File

@@ -18,7 +18,6 @@ DWIDGET_USE_NAMESPACE
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
// Get build time // Get build time
static const QString version = "4.2.3";
static const QDate buildDate = QLocale(QLocale::English).toDate(QString(__DATE__).replace(" ", " 0"), "MMM dd yyyy"); static const QDate buildDate = QLocale(QLocale::English).toDate(QString(__DATE__).replace(" ", " 0"), "MMM dd yyyy");
static const QTime buildTime = QTime::fromString(__TIME__, "hh:mm:ss"); static const QTime buildTime = QTime::fromString(__TIME__, "hh:mm:ss");
static const QString buildDateTime = buildDate.toString("yyyy.MM.dd") + "-" + buildTime.toString("hh:mm:ss"); static const QString buildDateTime = buildDate.toString("yyyy.MM.dd") + "-" + buildTime.toString("hh:mm:ss");
@@ -59,7 +58,7 @@ int main(int argc, char *argv[])
int fakeArgc = argc + 2; // QCoreApplication 的 argc 要用引用,避免 c++ 编译器优化 int fakeArgc = argc + 2; // QCoreApplication 的 argc 要用引用,避免 c++ 编译器优化
Application a(fakeArgc, fakeArgs.data()); Application a(fakeArgc, fakeArgs.data());
// 设置版本和构建时间 // 设置版本和构建时间
a.setVersionAndBuildDateTime(version, buildDateTime); a.setBuildDateTime(buildDateTime);
// 限制单实例运行 // 限制单实例运行
if (!a.setSingleInstance("spark-store")) if (!a.setSingleInstance("spark-store"))

View File

@@ -3,6 +3,7 @@
#include "utils/widgetanimation.h" #include "utils/widgetanimation.h"
#include "widgets/common/progressbutton.h" #include "widgets/common/progressbutton.h"
#include "widgets/downloadlistwidget.h" #include "widgets/downloadlistwidget.h"
#include "widgets/common/downloaditem.h"
#include "dbus/dbussparkstoreservice.h" #include "dbus/dbussparkstoreservice.h"
#include "application.h" #include "application.h"
@@ -10,6 +11,7 @@
#include <DWidgetUtil> #include <DWidgetUtil>
#include <DGuiApplicationHelper> #include <DGuiApplicationHelper>
#include <QDesktopServices>
#include <QAbstractButton> #include <QAbstractButton>
#include <QtConcurrent> #include <QtConcurrent>
@@ -132,6 +134,9 @@ void MainWindow::initTitleBar()
searchEdit->setPlaceholderText(tr("Search or enter spk://")); searchEdit->setPlaceholderText(tr("Search or enter spk://"));
downloadButton = new ProgressButton(ui->titlebar); downloadButton = new ProgressButton(ui->titlebar);
downloadButton->setDownloadListWidget(downloadlistwidget);
downloadButton->setFocusPolicy(Qt::FocusPolicy::ClickFocus);
downloadlistwidget->setFocusProxy(downloadButton);
QWidget *w_titlebar = new QWidget(ui->titlebar); QWidget *w_titlebar = new QWidget(ui->titlebar);
QHBoxLayout *ly_titlebar = new QHBoxLayout(w_titlebar); QHBoxLayout *ly_titlebar = new QHBoxLayout(w_titlebar);
@@ -297,14 +302,6 @@ void MainWindow::initConnections()
ui->appintopage->setTheme(themeType == DGuiApplicationHelper::DarkType); ui->appintopage->setTheme(themeType == DGuiApplicationHelper::DarkType);
ui->settingspage->setTheme(themeType == DGuiApplicationHelper::DarkType); }); ui->settingspage->setTheme(themeType == DGuiApplicationHelper::DarkType); });
connect(downloadButton, &ProgressButton::clicked, [=]()
{
QPoint pos;
pos.setX(downloadButton->mapToGlobal(QPoint(0, 0)).x() + downloadButton->width() / 2 - downloadlistwidget->width() / 2);
pos.setY(downloadButton->mapToGlobal(QPoint(0, 0)).y() + downloadButton->height() + 5);
downloadlistwidget->m_move(pos.x(), pos.y());
downloadlistwidget->show(); });
// appintopage按下下载按钮时标题栏下载列表按钮抖动 // appintopage按下下载按钮时标题栏下载列表按钮抖动
connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]() connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]()
{ {
@@ -421,6 +418,35 @@ void MainWindow::updateUi(int now)
switchPage(AppPageApplist); switchPage(AppPageApplist);
} }
void MainWindow::notify(QObject *receiver, QEvent *event)
{
if (!receiver) {
return;
}
Dtk::Widget::DStyle *o_ptr = qobject_cast<Dtk::Widget::DStyle *>(receiver);
if (o_ptr) {
return;
}
if (receiver->inherits("QWidgetWindow")
|| receiver->inherits("QStyleSheetStyle")) {
return;
}
if (event->type() == QEvent::FocusIn) {
QList<QObject *> list = downloadButton->findChildren<QObject *>(QString(), Qt::FindChildrenRecursively);
list << downloadlistwidget->findChildren<QObject *>(QString(), Qt::FindChildrenRecursively);
if (receiver != downloadButton && receiver != downloadlistwidget && !list.contains(receiver)) {
downloadlistwidget->hide();
}
} else if (event->type() == QEvent::FocusOut) {
if (!downloadlistwidget->isActiveWindow() && !isActiveWindow()) {
downloadlistwidget->hide();
}
}
}
void MainWindow::on_pushButton_14_clicked() void MainWindow::on_pushButton_14_clicked()
{ {
// Check UOS // Check UOS

View File

@@ -25,7 +25,7 @@ class MainWindow : public BaseWidgetOpacity
public: public:
explicit MainWindow(QWidget *parent = nullptr); explicit MainWindow(QWidget *parent = nullptr);
~MainWindow(); ~MainWindow() override;
void openUrl(const QString &url); void openUrl(const QString &url);
@@ -41,6 +41,9 @@ private:
void switchPage(int now); void switchPage(int now);
void updateUi(int now); void updateUi(int now);
public slots:
void notify(QObject *receiver, QEvent *event);
private slots: private slots:
//接受来自dbus的url //接受来自dbus的url
void onGetUrl(const QString &url); void onGetUrl(const QString &url);

View File

@@ -2,8 +2,10 @@
#include "ui_appintopage.h" #include "ui_appintopage.h"
#include "backend/sparkapi.h" #include "backend/sparkapi.h"
#include "widgets/downloadlistwidget.h" #include "widgets/downloadlistwidget.h"
#include "widgets/common/downloaditem.h"
#include "backend/image_show.h" #include "backend/image_show.h"
#include "application.h" #include "application.h"
#include "utils/utils.h"
#include <QtConcurrent> #include <QtConcurrent>
#include <QClipboard> #include <QClipboard>

View File

@@ -1,8 +1,6 @@
#ifndef APPINTOPAGE_H #ifndef APPINTOPAGE_H
#define APPINTOPAGE_H #define APPINTOPAGE_H
#include "utils/utils.h"
#include <QWidget> #include <QWidget>
#include <QJsonObject> #include <QJsonObject>
#include <QUrl> #include <QUrl>

View File

@@ -22,8 +22,13 @@ 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
# Get build version from qmake
VERSION = $$BUILD_VERSION
isEmpty(VERSION): VERSION = 4.0.0
DEFINES += APP_VERSION=\\\"'$${VERSION}'\\\"
# Disable qWarning / qDebug output in Release # Disable qWarning / qDebug output in Release
# CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT #CONFIG(release, debug | release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
CONFIG += c++11 link_pkgconfig CONFIG += c++11 link_pkgconfig
PKGCONFIG += dtkcore dtkgui dtkwidget PKGCONFIG += dtkcore dtkgui dtkwidget
@@ -89,7 +94,8 @@ RESOURCES += \
TRANSLATIONS += \ TRANSLATIONS += \
../translations/spark-store_en.ts \ ../translations/spark-store_en.ts \
../translations/spark-store_fr.ts \ ../translations/spark-store_fr.ts \
../translations/spark-store_zh_CN.ts ../translations/spark-store_zh_CN.ts \
../translations/spark-store_zh_TW.ts
# Default rules for deployment. # Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin qnx: target.path = /tmp/$${TARGET}/bin

View File

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

View File

@@ -2,6 +2,7 @@
#define UTILS_H #define UTILS_H
#include <QObject> #include <QObject>
#include <QJsonObject>
class Utils class Utils
{ {
@@ -13,6 +14,7 @@ public:
static bool isUOS(); static bool isUOS();
static void setQPAPlatform(); static void setQPAPlatform();
static void checkUOSDeveloperMode(); static void checkUOSDeveloperMode();
static QJsonObject parseFeatureJsonFile();
}; };
#endif // UTILS_H #endif // UTILS_H

View File

@@ -61,8 +61,21 @@ QString DownloadItem::getName()
return ui->label_filename->text(); return ui->label_filename->text();
} }
void DownloadItem::readyInstall()
/***************************************************************
* @brief 告知界面,准备安装
* @param
* @note 如果正在安装,返回-1
* @Sample usage: DownloadItem::install(0);
**************************************************************/
int DownloadItem::readyInstall()
{ {
// 检查是否正在安装,如果是返回错误 -1
if (isInstall)
{
return -1;
}
if (!close) if (!close)
{ {
ui->progressBar->hide(); ui->progressBar->hide();
@@ -70,7 +83,9 @@ void DownloadItem::readyInstall()
ui->pushButton_install->show(); ui->pushButton_install->show();
DownloadItem::install(0); DownloadItem::install(0);
ui->pushButton_2->hide(); ui->pushButton_2->hide();
return 1;
} }
return 0;
} }
void DownloadItem::setFileName(QString fileName) void DownloadItem::setFileName(QString fileName)
@@ -93,6 +108,12 @@ void DownloadItem::setSpeed(QString s)
speed = s; speed = s;
} }
/***************************************************************
* @brief 安装当前应用
* @param int t, t为安装方式可以为 0,1,2
* @note 备注
* @Sample usage: DownloadItem::install(0);
**************************************************************/
void DownloadItem::install(int t) void DownloadItem::install(int t)
{ {
if (!isInstall) if (!isInstall)
@@ -142,6 +163,12 @@ void DownloadItem::on_pushButton_3_clicked()
output_w->show(); output_w->show();
} }
/***************************************************************
* @brief 实际安装应用
* @param int t, t为安装方式可以为 0,1,2
* @note 备注
* @Sample usage: slotAsyncInstall(0);
**************************************************************/
void DownloadItem::slotAsyncInstall(int t) void DownloadItem::slotAsyncInstall(int t)
{ {
QProcess installer; QProcess installer;

View File

@@ -34,7 +34,7 @@ public:
void setMax(qint64); void setMax(qint64);
void setName(QString); void setName(QString);
QString getName(); QString getName();
void readyInstall(); int readyInstall();
void setFileName(QString); void setFileName(QString);
void seticon(const QPixmap); void seticon(const QPixmap);

View File

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

View File

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

View File

@@ -1,8 +1,15 @@
#include "downloadlistwidget.h" #include "downloadlistwidget.h"
#include "ui_downloadlistwidget.h" #include "ui_downloadlistwidget.h"
#include <QGraphicsOpacityEffect> #include "widgets/common/downloaditem.h"
#include <QPropertyAnimation> #include "backend/sparkapi.h"
#include "backend/downloadworker.h"
#include "utils/utils.h"
#include "application.h"
#include <QDesktopServices>
#include <QtConcurrent>
#include <QDebug> #include <QDebug>
DownloadListWidget::DownloadListWidget(QWidget *parent) : DBlurEffectWidget(parent), DownloadListWidget::DownloadListWidget(QWidget *parent) : DBlurEffectWidget(parent),
ui(new Ui::DownloadListWidget) ui(new Ui::DownloadListWidget)
{ {
@@ -56,7 +63,7 @@ DownloadListWidget::~DownloadListWidget()
{ {
downloadController->disconnect(); downloadController->disconnect();
downloadController->stopDownload(); downloadController->stopDownload();
downloadController->deleteLater(); // 这里没有释放 downloadController,使用懒汉式单例
} }
clearItem(); clearItem();
@@ -65,22 +72,9 @@ DownloadListWidget::~DownloadListWidget()
void DownloadListWidget::clearItem() void DownloadListWidget::clearItem()
{ {
// QListWidgetItem *item = nullptr;
// while ((item = ui->listWidget->takeItem(0)) != nullptr)
// {
// QWidget *card = ui->listWidget->itemWidget(item);
// if (card)
// {
// card->deleteLater();
// card = nullptr;
// }
// delete item;
// item = nullptr;
// }
// ui->listWidget->vScrollBar->scrollTop();
ui->listWidget->clear(); ui->listWidget->clear();
} }
DownloadItem* DownloadListWidget::addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl) DownloadItem* DownloadListWidget::addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl)
{ {
if (fileName.isEmpty()) if (fileName.isEmpty())
@@ -127,13 +121,18 @@ void DownloadListWidget::startRequest(QUrl url, QString fileName)
isdownload = true; isdownload = true;
downloaditemlist[allDownload - 1]->free = false; downloaditemlist[allDownload - 1]->free = false;
// 使用懒汉式单例来存储downloadController
if (downloadController == nullptr)
{
downloadController = new DownloadController; // 并发下载,在第一次点击下载按钮的时候才会初始化
}
if (downloadController) if (downloadController)
{ {
downloadController->disconnect(); downloadController->disconnect();
downloadController->stopDownload(); downloadController->stopDownload();
downloadController->deleteLater();
} }
downloadController = new DownloadController; // 并发下载,在点击下载按钮的时候才会初始化
connect(downloadController, &DownloadController::downloadProcess, this, &DownloadListWidget::updateDataReadProgress); connect(downloadController, &DownloadController::downloadProcess, this, &DownloadListWidget::updateDataReadProgress);
connect(downloadController, &DownloadController::downloadFinished, this, &DownloadListWidget::httpFinished); connect(downloadController, &DownloadController::downloadFinished, this, &DownloadListWidget::httpFinished);
// connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);}); // connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);});
@@ -141,30 +140,44 @@ void DownloadListWidget::startRequest(QUrl url, QString fileName)
downloadController->startDownload(url.toString()); downloadController->startDownload(url.toString());
} }
/***************************************************************
* @brief 下载列表完成下载的回调函数
* @param
* @note 如果正在安装,则在新开的线程空间中等待上一个安装完
* @Sample usage:
**************************************************************/
void DownloadListWidget::httpFinished() // 完成下载 void DownloadListWidget::httpFinished() // 完成下载
{ {
isdownload = false; isdownload = false;
isBusy = false; isBusy = false;
downloaditemlist[nowDownload - 1]->readyInstall();
downloaditemlist[nowDownload - 1]->free = true; QtConcurrent::run([=]()
emit downloadFinished();
if (nowDownload < allDownload)
{ {
// 如果有排队则下载下一个 while (downloaditemlist[nowDownload - 1]->readyInstall() == -1)
qDebug() << "切换下一个下载...";
nowDownload += 1;
while (downloaditemlist[nowDownload - 1]->close)
{ {
nowDownload += 1; continue;
if (nowDownload >= allDownload)
{
nowDownload = allDownload;
return;
}
} }
QString fileName = downloaditemlist[nowDownload - 1]->getName();
startRequest(urList.at(nowDownload - 1), fileName); downloaditemlist[nowDownload - 1]->free = true;
} emit downloadFinished();
if (nowDownload < allDownload)
{
// 如果有排队则下载下一个
qDebug() << "切换下一个下载...";
nowDownload += 1;
while (downloaditemlist[nowDownload - 1]->close)
{
nowDownload += 1;
if (nowDownload >= allDownload)
{
nowDownload = allDownload;
return;
}
}
QString fileName = downloaditemlist[nowDownload - 1]->getName();
startRequest(urList.at(nowDownload - 1), fileName);
}
});
} }
void DownloadListWidget::updateDataReadProgress(QString speedInfo, qint64 bytesRead, qint64 totalBytes) void DownloadListWidget::updateDataReadProgress(QString speedInfo, qint64 bytesRead, qint64 totalBytes)
@@ -195,21 +208,7 @@ void DownloadListWidget::m_move(int x, int y)
move(x, y); move(x, y);
return; return;
} }
bool DownloadListWidget::eventFilter(QObject *watched, QEvent *event)
{
if (Q_NULLPTR == watched)
{
return false;
}
if (QEvent::ActivationChange == event->type())
{
if (QApplication::activeWindow() != this)
{
this->close();
}
}
return QWidget::eventFilter(watched, event);
}
void DownloadListWidget::mouseMoveEvent(QMouseEvent *event) void DownloadListWidget::mouseMoveEvent(QMouseEvent *event)
{ {
setGeometry(m_rect); setGeometry(m_rect);

View File

@@ -1,20 +1,19 @@
#ifndef DOWNLOADLISTWIDGET_H #ifndef DOWNLOADLISTWIDGET_H
#define DOWNLOADLISTWIDGET_H #define DOWNLOADLISTWIDGET_H
#include <DBlurEffectWidget>
#include <QWidget> #include <QWidget>
#include <QTimer> #include <QTimer>
#include <DBlurEffectWidget>
#include <QNetworkAccessManager>
#include <QDesktopServices>
#include "widgets/common/downloaditem.h"
#include "backend/sparkapi.h"
#include "backend/downloadworker.h"
#include "utils/utils.h"
DWIDGET_USE_NAMESPACE
namespace Ui { namespace Ui {
class DownloadListWidget; class DownloadListWidget;
} }
DWIDGET_USE_NAMESPACE
class DownloadItem;
class DownloadController;
class DownloadListWidget : public DBlurEffectWidget class DownloadListWidget : public DBlurEffectWidget
{ {
Q_OBJECT Q_OBJECT
@@ -27,7 +26,10 @@ public:
QList<QUrl> getUrlList(); QList<QUrl> getUrlList();
void m_move(int x, int y); void m_move(int x, int y);
explicit DownloadListWidget(QWidget *parent = nullptr); explicit DownloadListWidget(QWidget *parent = nullptr);
~DownloadListWidget(); ~DownloadListWidget() override;
protected:
void mouseMoveEvent(QMouseEvent *event) override;
private: private:
int isdownload = false; int isdownload = false;
@@ -48,13 +50,13 @@ private:
void clearItem(); void clearItem();
QRect m_rect; QRect m_rect;
Ui::DownloadListWidget *ui; Ui::DownloadListWidget *ui;
private slots:
bool eventFilter(QObject *, QEvent *);
void mouseMoveEvent(QMouseEvent *event);
void on_pushButton_clicked();
signals: signals:
void downloadFinished(); void downloadFinished();
void downloadProgress(int i); void downloadProgress(int i);
private slots:
void on_pushButton_clicked();
}; };
#endif // DOWNLOADLISTWIDGET_H #endif // DOWNLOADLISTWIDGET_H

View File

@@ -8,7 +8,7 @@ mkdir -p /tmp/aptss-conf/
echo "从服务器获取配置和镜像列表..." echo "从服务器获取配置和镜像列表..."
echo "Getting server and mirror lists..." echo "Getting server and mirror lists..."
echo echo
curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf" curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
chmod -R 755 /tmp/aptss-conf chmod -R 755 /tmp/aptss-conf
fi fi
@@ -21,10 +21,10 @@ mkdir -p /tmp/aptss-conf/
echo "从服务器获取配置和镜像列表..." echo "从服务器获取配置和镜像列表..."
echo "Getting server and mirror lists..." echo "Getting server and mirror lists..."
echo echo
curl --silent -o /tmp/aptss-conf/apt-fast.conf "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf" curl --silent -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
chmod -R 755 /tmp/aptss-conf chmod -R 755 /tmp/aptss-conf
sudo curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list" sudo curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://d.store.deepinos.org.cn/sparkstore.list"
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
#只更新星火源 #只更新星火源
@@ -69,23 +69,23 @@ mkdir -p /tmp/aptss-conf/
echo "从服务器获取配置和镜像列表..." echo "从服务器获取配置和镜像列表..."
echo "Getting server and mirror lists..." echo "Getting server and mirror lists..."
echo echo
curl --silent -o /tmp/aptss-conf/apt-fast.conf "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf" curl --silent -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
chmod -R 755 /tmp/aptss-conf chmod -R 755 /tmp/aptss-conf
sudo curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list" sudo curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://d.store.deepinos.org.cn/sparkstore.list"
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
#只更新星火源 #只更新星火源
elif [ "$1" = "update" ];then elif [ "$1" = "update" ];then
sudo curl --progress-bar -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list" sudo curl --progress-bar -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://d.store.deepinos.org.cn/sparkstore.list"
mkdir -p /tmp/aptss-conf/ mkdir -p /tmp/aptss-conf/
echo "从服务器获取配置和镜像列表..." echo "从服务器获取配置和镜像列表..."
echo "Getting server and mirror lists..." echo "Getting server and mirror lists..."
echo echo
curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf" curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "https://d.store.deepinos.org.cn/apt-fast.conf"
chmod -R 755 /tmp/aptss-conf chmod -R 755 /tmp/aptss-conf
### 额外一份拿来给aptss自动补全用 ### 额外一份拿来给aptss自动补全用
bwrap --dev-bind / / \ bwrap --dev-bind / / \

View File

@@ -54,7 +54,7 @@ fi
DEBPATH=`realpath $1` DEBPATH=`realpath $1`
if [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_Packages" ] && [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages" ];then if [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_Packages" ] && [ ! -e "/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages" ] && [ ! -e "/var/lib/apt/lists/mirrors.sdu.edu.cn_spark-store-repository_store_Packages" ];then
echo "接收星火仓库软件信息中..." echo "接收星火仓库软件信息中..."
aptss ssupdate aptss ssupdate
fi fi
@@ -64,9 +64,12 @@ fi
if [ -e "/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages" ];then if [ -e "/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages" ];then
PACKAGES_DATA_PATH="/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages" PACKAGES_DATA_PATH="/var/lib/apt/lists/d.store.deepinos.org.cn_store_Packages"
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是单目录仓库配置" echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是单目录仓库配置"
else elif [ -e "/var/lib/apt/lists/d.store.deepinos.org.cn_Packages" ];then
PACKAGES_DATA_PATH="/var/lib/apt/lists/d.store.deepinos.org.cn_Packages" PACKAGES_DATA_PATH="/var/lib/apt/lists/d.store.deepinos.org.cn_Packages"
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是根目录仓库配置" echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是根目录仓库配置"
else
PACKAGES_DATA_PATH="/var/lib/apt/lists/mirrors.sdu.edu.cn_spark-store-repository_store_Packages"
echo "星火仓库的Packages位置为 $PACKAGES_DATA_PATH是SDU镜像仓库配置"
fi fi

View File

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

View File

@@ -0,0 +1,12 @@
#!/bin/bash
TRANSHELL_CONTENT_CLOSE="关闭"
TRANSHELL_CONTENT_OPEN="开启"
TRANSHELL_CONTENT_WELCOME_AND_CHOOSE_ONE_TO_RUN="欢迎使用星火更新和安装设置工具\n请在以下操作中选择一个进行~"
TRANSHELL_CONTENT_OPTIONS="操作选项"
TRANSHELL_CONTENT_OPEN_OR_CLOSE_UPGRADE_CHECK="$text_update_open星火更新检测工具(如果开启则会在系统启动后自动检测更新。如有更新则会弹出通知)"
TRANSHELL_CONTENT_CHECK_FOR_UPDATE="查看可更新软件包列表"
TRANSHELL_CONTENT_EXIT="退出"
TRANSHELL_CONTENT_CLOSING_UPGRADE_CHECK="执行关闭自动更新检测,请授权"
TRANSHELL_CONTENT_CLOSED="已关闭"
TRANSHELL_CONTENT_OPENING_UPGRADE_CHECK="执行启动自动更新检测,请授权"
TRANSHELL_CONTENT_OPENED="已开启"

View File

@@ -0,0 +1,5 @@
#!/bin/bash
TRANSHELL_CONTENT_NETWORK_FAIL="网络错误为防止阻塞dpkg,停止"
TRANSHELL_CONTENT_UPDATE_ERROR_AND_WAIT_15_SEC="更新出现异常状况,等待十五秒"
TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_NOTIFY="星火更新提醒"
TRANSHELL_CONTENT_THERE_ARE_APPS_TO_UPGRADE="星火商店仓库中有$update_app_number个软件包可以更新啦请到星火商店的菜单处理"

View File

@@ -10,9 +10,9 @@
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.ui" line="244"/> <location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="171"/> <location filename="../src/pages/appintopage.cpp" line="173"/>
<location filename="../src/pages/appintopage.cpp" line="308"/> <location filename="../src/pages/appintopage.cpp" line="315"/>
<location filename="../src/pages/appintopage.cpp" line="416"/> <location filename="../src/pages/appintopage.cpp" line="430"/>
<source>Download</source> <source>Download</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -175,51 +175,51 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="45"/> <location filename="../src/pages/appintopage.cpp" line="47"/>
<source>Click Open</source> <source>Click Open</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="110"/> <location filename="../src/pages/appintopage.cpp" line="112"/>
<source>Developer Mode Disabled</source> <source>Developer Mode Disabled</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="156"/> <location filename="../src/pages/appintopage.cpp" line="158"/>
<location filename="../src/pages/appintopage.cpp" line="324"/> <location filename="../src/pages/appintopage.cpp" line="331"/>
<location filename="../src/pages/appintopage.cpp" line="386"/> <location filename="../src/pages/appintopage.cpp" line="403"/>
<source>Reinstall</source> <source>Reinstall</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="163"/> <location filename="../src/pages/appintopage.cpp" line="165"/>
<source>Upgrade</source> <source>Upgrade</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="313"/> <location filename="../src/pages/appintopage.cpp" line="320"/>
<location filename="../src/pages/appintopage.cpp" line="371"/> <location filename="../src/pages/appintopage.cpp" line="379"/>
<source>Install</source> <source>Install</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="318"/> <location filename="../src/pages/appintopage.cpp" line="325"/>
<source>Installing</source> <source>Installing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="420"/> <location filename="../src/pages/appintopage.cpp" line="434"/>
<location filename="../src/pages/appintopage.cpp" line="433"/> <location filename="../src/pages/appintopage.cpp" line="447"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="420"/> <location filename="../src/pages/appintopage.cpp" line="434"/>
<source>Uninstall succeeded</source> <source>Uninstall succeeded</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="433"/> <location filename="../src/pages/appintopage.cpp" line="447"/>
<source>The URL has been copied to the clipboard</source> <source>The URL has been copied to the clipboard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -240,12 +240,12 @@
<context> <context>
<name>DAboutDialog</name> <name>DAboutDialog</name>
<message> <message>
<location filename="../src/application.cpp" line="90"/> <location filename="../src/application.cpp" line="133"/>
<source>Version: %1</source> <source>Version: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/application.cpp" line="97"/> <location filename="../src/application.cpp" line="143"/>
<source>%1 is released under %2</source> <source>%1 is released under %2</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -299,59 +299,59 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="148"/> <location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/> <location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/> <location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="104"/> <location filename="../src/widgets/common/downloaditem.cpp" line="125"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="105"/> <location filename="../src/widgets/common/downloaditem.cpp" line="126"/>
<source>Installing</source> <source>Installing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="148"/> <location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
<source>Installation complete.</source> <source>Installation complete.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="149"/> <location filename="../src/widgets/common/downloaditem.cpp" line="214"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="150"/> <location filename="../src/widgets/common/downloaditem.cpp" line="215"/>
<source>Finish</source> <source>Finish</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="157"/> <location filename="../src/widgets/common/downloaditem.cpp" line="222"/>
<source>Retry</source> <source>Retry</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/> <location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
<source>Error happened in dpkg progress , you can try it again.</source> <source>Error happened in dpkg progress , you can try it again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="160"/> <location filename="../src/widgets/common/downloaditem.cpp" line="225"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="161"/> <location filename="../src/widgets/common/downloaditem.cpp" line="226"/>
<source>Error happened in dpkg progress , you can try it again</source> <source>Error happened in dpkg progress , you can try it again</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/> <location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
<source>dpkg progress had been abortedyou can retry installation.</source> <source>dpkg progress had been abortedyou can retry installation.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="168"/> <location filename="../src/widgets/common/downloaditem.cpp" line="233"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="169"/> <location filename="../src/widgets/common/downloaditem.cpp" line="234"/>
<source>dpkg progress had been abortedyou can retry installation</source> <source>dpkg progress had been abortedyou can retry installation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="189"/> <location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="190"/> <location filename="../src/widgets/common/downloaditem.cpp" line="145"/>
<source>Download canceled</source> <source>Download canceled</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -452,32 +452,33 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="165"/> <location filename="../src/mainwindow-dtk.cpp" line="170"/>
<source>Submit App</source> <source>Submit App</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="166"/> <location filename="../src/mainwindow-dtk.cpp" line="171"/>
<source>Submit App with client(Recommanded)</source> <source>Submit App with client(Recommanded)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="167"/> <location filename="../src/mainwindow-dtk.cpp" line="172"/>
<source>Settings</source> <source>Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="168"/> <location filename="../src/mainwindow-dtk.cpp" line="173"/>
<source>APP Upgrade and Install Settings</source> <source>APP Upgrade and Install Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="127"/> <location filename="../src/mainwindow-dtk.cpp" line="129"/>
<location filename="../src/mainwindow-dtk.cpp" line="224"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="132"/> <location filename="../src/mainwindow-dtk.cpp" line="134"/>
<source>Search or enter spk://</source> <source>Search or enter spk://</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -485,29 +486,29 @@
<context> <context>
<name>QObject</name> <name>QObject</name>
<message> <message>
<location filename="../src/application.cpp" line="28"/> <location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="29"/> <location filename="../src/application.cpp" line="34"/>
<location filename="../src/mainwindow-dtk.cpp" line="107"/> <location filename="../src/mainwindow-dtk.cpp" line="109"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/application.cpp" line="33"/> <location filename="../src/application.cpp" line="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source> <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/application.cpp" line="94"/> <location filename="../src/application.cpp" line="140"/>
<source>Spark Project</source> <source>Spark Project</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/downloadlistwidget.cpp" line="10"/> <location filename="../src/widgets/downloadlistwidget.cpp" line="17"/>
<source>Download list</source> <source>Download list</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="221"/> <location filename="../src/mainwindow-dtk.cpp" line="227"/>
<source>Show MainWindow</source> <source>Show MainWindow</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -618,12 +619,12 @@
<context> <context>
<name>TitleBarMenu</name> <name>TitleBarMenu</name>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="222"/> <location filename="../src/mainwindow-dtk.cpp" line="228"/>
<source>About</source> <source>About</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="223"/> <location filename="../src/mainwindow-dtk.cpp" line="229"/>
<source>Exit</source> <source>Exit</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

@@ -10,9 +10,9 @@
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.ui" line="244"/> <location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="171"/> <location filename="../src/pages/appintopage.cpp" line="173"/>
<location filename="../src/pages/appintopage.cpp" line="308"/> <location filename="../src/pages/appintopage.cpp" line="315"/>
<location filename="../src/pages/appintopage.cpp" line="416"/> <location filename="../src/pages/appintopage.cpp" line="430"/>
<source>Download</source> <source>Download</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -175,51 +175,51 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="45"/> <location filename="../src/pages/appintopage.cpp" line="47"/>
<source>Click Open</source> <source>Click Open</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="110"/> <location filename="../src/pages/appintopage.cpp" line="112"/>
<source>Developer Mode Disabled</source> <source>Developer Mode Disabled</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="156"/> <location filename="../src/pages/appintopage.cpp" line="158"/>
<location filename="../src/pages/appintopage.cpp" line="324"/> <location filename="../src/pages/appintopage.cpp" line="331"/>
<location filename="../src/pages/appintopage.cpp" line="386"/> <location filename="../src/pages/appintopage.cpp" line="403"/>
<source>Reinstall</source> <source>Reinstall</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="163"/> <location filename="../src/pages/appintopage.cpp" line="165"/>
<source>Upgrade</source> <source>Upgrade</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="313"/> <location filename="../src/pages/appintopage.cpp" line="320"/>
<location filename="../src/pages/appintopage.cpp" line="371"/> <location filename="../src/pages/appintopage.cpp" line="379"/>
<source>Install</source> <source>Install</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="318"/> <location filename="../src/pages/appintopage.cpp" line="325"/>
<source>Installing</source> <source>Installing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="420"/> <location filename="../src/pages/appintopage.cpp" line="434"/>
<location filename="../src/pages/appintopage.cpp" line="433"/> <location filename="../src/pages/appintopage.cpp" line="447"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="420"/> <location filename="../src/pages/appintopage.cpp" line="434"/>
<source>Uninstall succeeded</source> <source>Uninstall succeeded</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="433"/> <location filename="../src/pages/appintopage.cpp" line="447"/>
<source>The URL has been copied to the clipboard</source> <source>The URL has been copied to the clipboard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -240,12 +240,12 @@
<context> <context>
<name>DAboutDialog</name> <name>DAboutDialog</name>
<message> <message>
<location filename="../src/application.cpp" line="90"/> <location filename="../src/application.cpp" line="133"/>
<source>Version: %1</source> <source>Version: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/application.cpp" line="97"/> <location filename="../src/application.cpp" line="143"/>
<source>%1 is released under %2</source> <source>%1 is released under %2</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -299,59 +299,59 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="148"/> <location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/> <location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/> <location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="104"/> <location filename="../src/widgets/common/downloaditem.cpp" line="125"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="105"/> <location filename="../src/widgets/common/downloaditem.cpp" line="126"/>
<source>Installing</source> <source>Installing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="148"/> <location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
<source>Installation complete.</source> <source>Installation complete.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="149"/> <location filename="../src/widgets/common/downloaditem.cpp" line="214"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="150"/> <location filename="../src/widgets/common/downloaditem.cpp" line="215"/>
<source>Finish</source> <source>Finish</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="157"/> <location filename="../src/widgets/common/downloaditem.cpp" line="222"/>
<source>Retry</source> <source>Retry</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/> <location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
<source>Error happened in dpkg progress , you can try it again.</source> <source>Error happened in dpkg progress , you can try it again.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="160"/> <location filename="../src/widgets/common/downloaditem.cpp" line="225"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="161"/> <location filename="../src/widgets/common/downloaditem.cpp" line="226"/>
<source>Error happened in dpkg progress , you can try it again</source> <source>Error happened in dpkg progress , you can try it again</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/> <location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
<source>dpkg progress had been abortedyou can retry installation.</source> <source>dpkg progress had been abortedyou can retry installation.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="168"/> <location filename="../src/widgets/common/downloaditem.cpp" line="233"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="169"/> <location filename="../src/widgets/common/downloaditem.cpp" line="234"/>
<source>dpkg progress had been abortedyou can retry installation</source> <source>dpkg progress had been abortedyou can retry installation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="189"/> <location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="190"/> <location filename="../src/widgets/common/downloaditem.cpp" line="145"/>
<source>Download canceled</source> <source>Download canceled</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -452,32 +452,33 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="165"/> <location filename="../src/mainwindow-dtk.cpp" line="170"/>
<source>Submit App</source> <source>Submit App</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="166"/> <location filename="../src/mainwindow-dtk.cpp" line="171"/>
<source>Submit App with client(Recommanded)</source> <source>Submit App with client(Recommanded)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="167"/> <location filename="../src/mainwindow-dtk.cpp" line="172"/>
<source>Settings</source> <source>Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="168"/> <location filename="../src/mainwindow-dtk.cpp" line="173"/>
<source>APP Upgrade and Install Settings</source> <source>APP Upgrade and Install Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="127"/> <location filename="../src/mainwindow-dtk.cpp" line="129"/>
<location filename="../src/mainwindow-dtk.cpp" line="224"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="132"/> <location filename="../src/mainwindow-dtk.cpp" line="134"/>
<source>Search or enter spk://</source> <source>Search or enter spk://</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -485,29 +486,29 @@
<context> <context>
<name>QObject</name> <name>QObject</name>
<message> <message>
<location filename="../src/application.cpp" line="28"/> <location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="29"/> <location filename="../src/application.cpp" line="34"/>
<location filename="../src/mainwindow-dtk.cpp" line="107"/> <location filename="../src/mainwindow-dtk.cpp" line="109"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/application.cpp" line="33"/> <location filename="../src/application.cpp" line="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source> <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/application.cpp" line="94"/> <location filename="../src/application.cpp" line="140"/>
<source>Spark Project</source> <source>Spark Project</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/downloadlistwidget.cpp" line="10"/> <location filename="../src/widgets/downloadlistwidget.cpp" line="17"/>
<source>Download list</source> <source>Download list</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="221"/> <location filename="../src/mainwindow-dtk.cpp" line="227"/>
<source>Show MainWindow</source> <source>Show MainWindow</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -618,12 +619,12 @@
<context> <context>
<name>TitleBarMenu</name> <name>TitleBarMenu</name>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="222"/> <location filename="../src/mainwindow-dtk.cpp" line="228"/>
<source>About</source> <source>About</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="223"/> <location filename="../src/mainwindow-dtk.cpp" line="229"/>
<source>Exit</source> <source>Exit</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

@@ -10,9 +10,9 @@
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.ui" line="244"/> <location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="171"/> <location filename="../src/pages/appintopage.cpp" line="173"/>
<location filename="../src/pages/appintopage.cpp" line="308"/> <location filename="../src/pages/appintopage.cpp" line="315"/>
<location filename="../src/pages/appintopage.cpp" line="416"/> <location filename="../src/pages/appintopage.cpp" line="430"/>
<source>Download</source> <source>Download</source>
<translation></translation> <translation></translation>
</message> </message>
@@ -175,51 +175,51 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="45"/> <location filename="../src/pages/appintopage.cpp" line="47"/>
<source>Click Open</source> <source>Click Open</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="110"/> <location filename="../src/pages/appintopage.cpp" line="112"/>
<source>Developer Mode Disabled</source> <source>Developer Mode Disabled</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="156"/> <location filename="../src/pages/appintopage.cpp" line="158"/>
<location filename="../src/pages/appintopage.cpp" line="324"/> <location filename="../src/pages/appintopage.cpp" line="331"/>
<location filename="../src/pages/appintopage.cpp" line="386"/> <location filename="../src/pages/appintopage.cpp" line="403"/>
<source>Reinstall</source> <source>Reinstall</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="163"/> <location filename="../src/pages/appintopage.cpp" line="165"/>
<source>Upgrade</source> <source>Upgrade</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="313"/> <location filename="../src/pages/appintopage.cpp" line="320"/>
<location filename="../src/pages/appintopage.cpp" line="371"/> <location filename="../src/pages/appintopage.cpp" line="379"/>
<source>Install</source> <source>Install</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="318"/> <location filename="../src/pages/appintopage.cpp" line="325"/>
<source>Installing</source> <source>Installing</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="420"/> <location filename="../src/pages/appintopage.cpp" line="434"/>
<location filename="../src/pages/appintopage.cpp" line="433"/> <location filename="../src/pages/appintopage.cpp" line="447"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="420"/> <location filename="../src/pages/appintopage.cpp" line="434"/>
<source>Uninstall succeeded</source> <source>Uninstall succeeded</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/pages/appintopage.cpp" line="433"/> <location filename="../src/pages/appintopage.cpp" line="447"/>
<source>The URL has been copied to the clipboard</source> <source>The URL has been copied to the clipboard</source>
<translation></translation> <translation></translation>
</message> </message>
@@ -240,12 +240,12 @@
<context> <context>
<name>DAboutDialog</name> <name>DAboutDialog</name>
<message> <message>
<location filename="../src/application.cpp" line="90"/> <location filename="../src/application.cpp" line="133"/>
<source>Version: %1</source> <source>Version: %1</source>
<translation>%1</translation> <translation>%1</translation>
</message> </message>
<message> <message>
<location filename="../src/application.cpp" line="97"/> <location filename="../src/application.cpp" line="143"/>
<source>%1 is released under %2</source> <source>%1 is released under %2</source>
<translation>%1%2</translation> <translation>%1%2</translation>
</message> </message>
@@ -299,59 +299,59 @@
<translation>.</translation> <translation>.</translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="148"/> <location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/> <location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/> <location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="104"/> <location filename="../src/widgets/common/downloaditem.cpp" line="125"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="105"/> <location filename="../src/widgets/common/downloaditem.cpp" line="126"/>
<source>Installing</source> <source>Installing</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="148"/> <location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
<source>Installation complete.</source> <source>Installation complete.</source>
<translation>.</translation> <translation>.</translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="149"/> <location filename="../src/widgets/common/downloaditem.cpp" line="214"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="150"/> <location filename="../src/widgets/common/downloaditem.cpp" line="215"/>
<source>Finish</source> <source>Finish</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="157"/> <location filename="../src/widgets/common/downloaditem.cpp" line="222"/>
<source>Retry</source> <source>Retry</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="159"/> <location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
<source>Error happened in dpkg progress , you can try it again.</source> <source>Error happened in dpkg progress , you can try it again.</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="160"/> <location filename="../src/widgets/common/downloaditem.cpp" line="225"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="161"/> <location filename="../src/widgets/common/downloaditem.cpp" line="226"/>
<source>Error happened in dpkg progress , you can try it again</source> <source>Error happened in dpkg progress , you can try it again</source>
<translation>dpkg出现错误</translation> <translation>dpkg出现错误</translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="167"/> <location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
<source>dpkg progress had been abortedyou can retry installation.</source> <source>dpkg progress had been abortedyou can retry installation.</source>
<translation>dpkg进程被中断</translation> <translation>dpkg进程被中断</translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="168"/> <location filename="../src/widgets/common/downloaditem.cpp" line="233"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="169"/> <location filename="../src/widgets/common/downloaditem.cpp" line="234"/>
<source>dpkg progress had been abortedyou can retry installation</source> <source>dpkg progress had been abortedyou can retry installation</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/common/downloaditem.cpp" line="189"/> <location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="190"/> <location filename="../src/widgets/common/downloaditem.cpp" line="145"/>
<source>Download canceled</source> <source>Download canceled</source>
<translation></translation> <translation></translation>
</message> </message>
@@ -452,32 +452,33 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="165"/> <location filename="../src/mainwindow-dtk.cpp" line="170"/>
<source>Submit App</source> <source>Submit App</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="166"/> <location filename="../src/mainwindow-dtk.cpp" line="171"/>
<source>Submit App with client(Recommanded)</source> <source>Submit App with client(Recommanded)</source>
<translation>使稿</translation> <translation>使稿</translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="167"/> <location filename="../src/mainwindow-dtk.cpp" line="172"/>
<source>Settings</source> <source>Settings</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="168"/> <location filename="../src/mainwindow-dtk.cpp" line="173"/>
<source>APP Upgrade and Install Settings</source> <source>APP Upgrade and Install Settings</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="127"/> <location filename="../src/mainwindow-dtk.cpp" line="129"/>
<location filename="../src/mainwindow-dtk.cpp" line="224"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="132"/> <location filename="../src/mainwindow-dtk.cpp" line="134"/>
<source>Search or enter spk://</source> <source>Search or enter spk://</source>
<translation></translation> <translation></translation>
</message> </message>
@@ -485,29 +486,29 @@
<context> <context>
<name>QObject</name> <name>QObject</name>
<message> <message>
<location filename="../src/application.cpp" line="28"/> <location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="29"/> <location filename="../src/application.cpp" line="34"/>
<location filename="../src/mainwindow-dtk.cpp" line="107"/> <location filename="../src/mainwindow-dtk.cpp" line="109"/>
<source>Spark Store</source> <source>Spark Store</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/application.cpp" line="33"/> <location filename="../src/application.cpp" line="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source> <source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation> <translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation>
</message> </message>
<message> <message>
<location filename="../src/application.cpp" line="94"/> <location filename="../src/application.cpp" line="140"/>
<source>Spark Project</source> <source>Spark Project</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/widgets/downloadlistwidget.cpp" line="10"/> <location filename="../src/widgets/downloadlistwidget.cpp" line="17"/>
<source>Download list</source> <source>Download list</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="221"/> <location filename="../src/mainwindow-dtk.cpp" line="227"/>
<source>Show MainWindow</source> <source>Show MainWindow</source>
<translation></translation> <translation></translation>
</message> </message>
@@ -618,12 +619,12 @@
<context> <context>
<name>TitleBarMenu</name> <name>TitleBarMenu</name>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="222"/> <location filename="../src/mainwindow-dtk.cpp" line="228"/>
<source>About</source> <source>About</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../src/mainwindow-dtk.cpp" line="223"/> <location filename="../src/mainwindow-dtk.cpp" line="229"/>
<source>Exit</source> <source>Exit</source>
<translation>退</translation> <translation>退</translation>
</message> </message>

View File

@@ -0,0 +1,632 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_TW">
<context>
<name>AppIntoPage</name>
<message>
<location filename="../src/pages/appintopage.ui" line="14"/>
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="244"/>
<location filename="../src/pages/appintopage.cpp" line="173"/>
<location filename="../src/pages/appintopage.cpp" line="315"/>
<location filename="../src/pages/appintopage.cpp" line="430"/>
<source>Download</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="290"/>
<source>Uninstall</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="346"/>
<source>0</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="356"/>
<source>Download Times</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="410"/>
<location filename="../src/pages/appintopage.ui" line="413"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This app is developed by community user,we give this tag to honor those who contribute to the Linux Ecology&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Linux生态的贡献&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="416"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/community-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="435"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/ubuntu-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="448"/>
<location filename="../src/pages/appintopage.ui" line="451"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to UOS home 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;UOS家庭版 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="454"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/uos-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="467"/>
<location filename="../src/pages/appintopage.ui" line="470"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A deepin-wine2 app. Spark Store will automatically configure the wine kit for you.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation> deepin-wine2 wine环境</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="473"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine2-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="486"/>
<location filename="../src/pages/appintopage.ui" line="489"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;This is a DTK5 app,which means it would have better effect on Deepin Desktop Environment&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;DTK5应用使&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="492"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dtk-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="505"/>
<location filename="../src/pages/appintopage.ui" line="508"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;deepin 20&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="511"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/deepin-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="524"/>
<location filename="../src/pages/appintopage.ui" line="527"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;An Appimage to deb app.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Appimage转制应用.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="530"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/a2d-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="549"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/tags/dwine5-small.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="602"/>
<source>Share</source>
<translation>Spk共享链接</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="609"/>
<source>APP Feedback</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1068"/>
<source>Description</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="903"/>
<source>Screen capture</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="429"/>
<location filename="../src/pages/appintopage.ui" line="432"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Capable to Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Ubuntu 22.04&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="543"/>
<location filename="../src/pages/appintopage.ui" line="546"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;A Wine app.Spark Store will automatically configure the wine kit for you&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation> Wine wine环境</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="765"/>
<source>Introduction</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1161"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1190"/>
<source>Contributor</source>
<translation>稿</translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1197"/>
<source>Pkgname</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1303"/>
<source>Author</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1339"/>
<source>Size</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="1375"/>
<source>Website</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="47"/>
<source>Click Open</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="112"/>
<source>Developer Mode Disabled</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="158"/>
<location filename="../src/pages/appintopage.cpp" line="331"/>
<location filename="../src/pages/appintopage.cpp" line="403"/>
<source>Reinstall</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="165"/>
<source>Upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="320"/>
<location filename="../src/pages/appintopage.cpp" line="379"/>
<source>Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="325"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="434"/>
<location filename="../src/pages/appintopage.cpp" line="447"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="434"/>
<source>Uninstall succeeded</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="447"/>
<source>The URL has been copied to the clipboard</source>
<translation></translation>
</message>
</context>
<context>
<name>AppListPage</name>
<message>
<location filename="../src/pages/applistpage.ui" line="14"/>
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/applistpage.ui" line="60"/>
<source>about:blank</source>
<translation></translation>
</message>
</context>
<context>
<name>DAboutDialog</name>
<message>
<location filename="../src/application.cpp" line="133"/>
<source>Version: %1</source>
<translation>%1</translation>
</message>
<message>
<location filename="../src/application.cpp" line="143"/>
<source>%1 is released under %2</source>
<translation>%1%2</translation>
</message>
</context>
<context>
<name>DownloadItem</name>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="32"/>
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="74"/>
<source>icon</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="134"/>
<source>TextLabel</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="121"/>
<source>Name</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="226"/>
<source>Waiting to download</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="277"/>
<source>Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="296"/>
<source>Cancel</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.ui" line="315"/>
<source>Info</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="43"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="44"/>
<source>Download Complete.</source>
<translation>.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="125"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="126"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="213"/>
<source>Installation complete.</source>
<translation>.</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="214"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="215"/>
<source>Finish</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="222"/>
<source>Retry</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="224"/>
<source>Error happened in dpkg progress , you can try it again.</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="225"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="226"/>
<source>Error happened in dpkg progress , you can try it again</source>
<translation>dpkg出现错误</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="232"/>
<source>dpkg progress had been abortedyou can retry installation.</source>
<translation>dpkg进程被中断</translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="233"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="234"/>
<source>dpkg progress had been abortedyou can retry installation</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/common/downloaditem.cpp" line="144"/>
<location filename="../src/widgets/common/downloaditem.cpp" line="145"/>
<source>Download canceled</source>
<translation></translation>
</message>
</context>
<context>
<name>DownloadListWidget</name>
<message>
<location filename="../src/widgets/downloadlistwidget.ui" line="14"/>
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.ui" line="41"/>
<source>The list is currently empty. Go and download some softwares!</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.ui" line="116"/>
<source>Open download directory</source>
<translation></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../src/mainwindow-dtk.ui" line="14"/>
<source>MainWindow</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="166"/>
<source>Home</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="203"/>
<source>Network</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="231"/>
<source>Chat</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="259"/>
<source>Music</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="287"/>
<source>Video</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="315"/>
<source>Picture</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="343"/>
<source>Game</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="371"/>
<source>Office</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="399"/>
<source>Reading</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="427"/>
<source>Development</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="455"/>
<source>Tool</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="483"/>
<source>Theme</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="511"/>
<source>Other</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.ui" line="539"/>
<source>APP Upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="170"/>
<source>Submit App</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="171"/>
<source>Submit App with client(Recommanded)</source>
<translation>()</translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="172"/>
<source>Settings</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="173"/>
<source>APP Upgrade and Install Settings</source>
<translation> </translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="129"/>
<location filename="../src/mainwindow-dtk.cpp" line="224"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="134"/>
<source>Search or enter spk://</source>
<translation></translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../src/application.cpp" line="33"/>
<location filename="../src/application.cpp" line="34"/>
<location filename="../src/mainwindow-dtk.cpp" line="109"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/application.cpp" line="38"/>
<source>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;An appstore powered by community&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;Spark developers&lt;/span&gt;</source>
<translation>&lt;span style=&apos; font-size:10pt;font-weight:60;&apos;&gt;&lt;/span&gt;&lt;br/&gt;&lt;a href=&apos;https://www.spark-app.store/&apos;&gt;https://www.spark-app.store&lt;/a&gt;&lt;br/&gt;&lt;span style=&apos; font-size:12pt;&apos;&gt;星火计划开发者&lt;/span&gt;</translation>
</message>
<message>
<location filename="../src/application.cpp" line="140"/>
<source>Spark Project</source>
<translation></translation>
</message>
<message>
<location filename="../src/widgets/downloadlistwidget.cpp" line="17"/>
<source>Download list</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="227"/>
<source>Show MainWindow</source>
<translation></translation>
</message>
</context>
<context>
<name>SettingsPage</name>
<message>
<location filename="../src/pages/settingspage.ui" line="14"/>
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="91"/>
<source>Line Settings</source>
<translation>线</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="107"/>
<source>Choose Line:</source>
<translation>线</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="130"/>
<source>Refresh</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="143"/>
<source>Take effect when restart</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="185"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Check update for Spark Store. &lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="202"/>
<source>Update</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="195"/>
<source>Spark Store Update</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="230"/>
<source>Temp</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="243"/>
<source>Since the dictionary is at /tmp,It would be cleaned automatically when system reboot.</source>
<translation>/tmp下使</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="250"/>
<source>0B</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="257"/>
<source>Location/tmp/spark-store</source>
<translation>/tmp/spark-store</translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="277"/>
<source>Clean</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="290"/>
<source>Size:</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="297"/>
<source>Clear Web Cache</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="318"/>
<source>About us</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.ui" line="325"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;We are &lt;span style=&quot; font-weight:600;&quot;&gt;NOT&lt;/span&gt; the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &amp;quot;Spark Store&amp;quot;! &amp;quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. &lt;/p&gt;&lt;p&gt;We don&apos;t make a profit from this, all developers and maintainers don&apos;t get paid, and we rely on the community&apos;s donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. &lt;/p&gt;&lt;p&gt;Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. &lt;/p&gt;&lt;p&gt;If any part of the store infringes your rights, please tell us &amp;lt;jifengshenmo@outlook.com&amp;gt; we will remove the infringing content as soon as possible. &lt;/p&gt;&lt;p&gt;If you&apos;d like to get involved with us too, whether you&apos;re involved in development, design, pitching or submitting work, we welcome you to join us. &lt;/p&gt;&lt;p&gt;Connect us on Spark IM: &lt;a href=&quot;https://chat.shenmo.tech&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://chat.shenmo.tech&lt;br/&gt;&lt;/span&gt;&lt;/a&gt;Our QQ Group number:872690351&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;&lt;/span&gt;Linux/deepinSpark&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;使使&lt;/p&gt;&lt;p&gt; &amp;lt;jifengshenmo@outlook.com&amp;gt; &lt;/p&gt;&lt;p&gt;稿&lt;/p&gt;&lt;p&gt; Spark IM :&lt;a href=&quot;https://chat.shenmo.tech&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://chat.shenmo.tech&lt;br/&gt;&lt;/span&gt;&lt;/a&gt;QQ 872690351&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="213"/>
<source>Updating, please wait...</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="235"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/settingspage.cpp" line="235"/>
<source>Temporary cache was cleaned</source>
<translation></translation>
</message>
</context>
<context>
<name>TitleBarMenu</name>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="228"/>
<source>About</source>
<translation></translation>
</message>
<message>
<location filename="../src/mainwindow-dtk.cpp" line="229"/>
<source>Exit</source>
<translation>退</translation>
</message>
</context>
</TS>