From 34042d31cfc69261f6bdb84721a4d09d40e8373e Mon Sep 17 00:00:00 2001 From: zhaominyong Date: Tue, 22 Feb 2022 15:25:28 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=9F=E9=9A=8F=E4=B8=BB=E9=A2=98=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backup-daemon/databackupproxy.cpp | 2 + backup-daemon/deletebackupproxy.cpp | 15 +- backup-daemon/udiskdatabackupproxy.cpp | 2 + kybackup/aboutdialog.cpp | 17 +- kybackup/aboutdialog.h | 2 + kybackup/backuppointlistdialog.cpp | 8 +- kybackup/component/myiconbutton.cpp | 6 +- kybackup/component/ringsprogressbar.cpp | 4 +- kybackup/deletebackupdialog.cpp | 17 +- kybackup/deletebackupdialog.h | 2 + kybackup/globalbackupinfo.h | 11 + kybackup/kybackup.pro | 2 +- kybackup/main.cpp | 3 +- kybackup/module/managebackuppointlist.cpp | 12 + kybackup/module/operationlog.cpp | 16 +- kybackup/module/selectrestorepoint.cpp | 12 + kybackup/qt_zh_CN.ts | 988 +++++++++++----------- kybackup/resource/language/qt_zh_CN.qm | Bin 0 -> 29391 bytes 18 files changed, 596 insertions(+), 523 deletions(-) create mode 100644 kybackup/resource/language/qt_zh_CN.qm diff --git a/backup-daemon/databackupproxy.cpp b/backup-daemon/databackupproxy.cpp index ce4be3f..253274b 100755 --- a/backup-daemon/databackupproxy.cpp +++ b/backup-daemon/databackupproxy.cpp @@ -342,6 +342,8 @@ bool DataBackupProxy::recordBackupPoint() m_backupPoint.m_size = Utils::StringBySize(m_size); m_backupPoint.m_time = QDateTime::currentDateTime().toString("yy-MM-dd hh:mm:ss"); m_backupPoint.m_state = BACKUP_PARSE_STATE_FAIL_STRTING; + if (0 < m_backupWrapper.m_frontUid) + m_backupPoint.m_userId = QString::number(m_backupWrapper.m_frontUid); m_backupPoint.m_os = SystemInfo::m_os; m_backupPoint.m_arch = SystemInfo::m_arch; m_backupPoint.m_archdetect = SystemInfo::m_archDetect; diff --git a/backup-daemon/deletebackupproxy.cpp b/backup-daemon/deletebackupproxy.cpp index 04cd11b..b9e4dba 100755 --- a/backup-daemon/deletebackupproxy.cpp +++ b/backup-daemon/deletebackupproxy.cpp @@ -41,6 +41,14 @@ bool DeleteBackupProxy::deleteXmlBackupPoint() xmlPath.replace("//", "/"); ParseBackupList parse(xmlPath); + // 查询节点 + ParseBackupList::BackupPoint backupPoint = parse.findBackupPointByUuid(m_backupWrapper.m_uuid); + if ( int(BackupType::BACKUP_DATA) != backupPoint.m_type + && int(BackupType::INC_BACKUP_DATA) != backupPoint.m_type) { + m_backupWrapper.m_type = backupPoint.m_type; + } + + // 删除节点 if (parse.deleteItem(m_backupWrapper.m_uuid) != ParseBackupList::SUCCESS) { qCritical() << QString("failed to delete %1 from backuplist.xml!").arg(m_backupWrapper.m_uuid); emit workResult(false); @@ -69,6 +77,11 @@ void DeleteBackupProxy::deleteBackupPointDir() QProcess::execute("rm", args); QString time = QDateTime::currentDateTime().toString("yy-MM-dd hh:mm:ss"); - Utils::writeBackupLog(time + "," + m_backupWrapper.m_uuid + "," + QString::number(m_backupWrapper.m_type) + ",,," + QString::number(m_backupWrapper.m_frontUid)+ "," + m_backupWrapper.m_backupName); + if ( int(BackupType::BACKUP_DATA) == m_backupWrapper.m_type + || int(BackupType::INC_BACKUP_DATA) == m_backupWrapper.m_type) { + Utils::writeBackupLog(time + "," + m_backupWrapper.m_uuid + "," + QString::number(m_backupWrapper.m_type) + ",,," + QString::number(m_backupWrapper.m_frontUid)+ "," + m_backupWrapper.m_backupName); + } else { + Utils::writeBackupLog(time + "," + m_backupWrapper.m_uuid + "," + QString::number(m_backupWrapper.m_type) + ",,,," + m_backupWrapper.m_backupName); + } } diff --git a/backup-daemon/udiskdatabackupproxy.cpp b/backup-daemon/udiskdatabackupproxy.cpp index 88d2f68..271e683 100755 --- a/backup-daemon/udiskdatabackupproxy.cpp +++ b/backup-daemon/udiskdatabackupproxy.cpp @@ -278,6 +278,8 @@ bool UDiskDataBackupProxy::recordBackupPointToUdisk() m_backupPoint.m_size = Utils::StringBySize(m_size); m_backupPoint.m_time = QDateTime::currentDateTime().toString("yy-MM-dd hh:mm:ss"); m_backupPoint.m_state = BACKUP_PARSE_STATE_FAIL_STRTING; + if (0 < m_backupWrapper.m_frontUid) + m_backupPoint.m_userId = QString::number(m_backupWrapper.m_frontUid); m_backupPoint.m_os = SystemInfo::m_os; m_backupPoint.m_arch = SystemInfo::m_arch; m_backupPoint.m_archdetect = SystemInfo::m_archDetect; diff --git a/kybackup/aboutdialog.cpp b/kybackup/aboutdialog.cpp index 0a0b21c..f36d173 100755 --- a/kybackup/aboutdialog.cpp +++ b/kybackup/aboutdialog.cpp @@ -27,12 +27,7 @@ AboutDialog::AboutDialog(QWidget *parent) : hints.decorations = MWM_DECOR_BORDER; XAtomHelper::getInstance()->setWindowMotifHint(winId(), hints); - // 设置背景色 this->setAutoFillBackground(true); - QPalette palette = this->palette(); - palette.setColor(QPalette::Window, palette.color(QPalette::Base)); - this->setPalette(palette); - this->setFixedWidth(420); this->setMinimumHeight(420); QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); @@ -146,3 +141,15 @@ AboutDialog::~AboutDialog() { delete ui; } + + +void AboutDialog::paintEvent(QPaintEvent *event) +{ + // 设置背景色 + QPalette palette = this->palette(); + palette.setColor(QPalette::Window, palette.color(QPalette::Base)); + this->setPalette(palette); + QDialog::paintEvent(event); +} + + diff --git a/kybackup/aboutdialog.h b/kybackup/aboutdialog.h index 3656319..67b6c02 100755 --- a/kybackup/aboutdialog.h +++ b/kybackup/aboutdialog.h @@ -18,6 +18,8 @@ public: QString getBackupVersion(); + void paintEvent(QPaintEvent *event); + private: Ui::AboutDialog *ui; }; diff --git a/kybackup/backuppointlistdialog.cpp b/kybackup/backuppointlistdialog.cpp index 27550b7..4690cdb 100755 --- a/kybackup/backuppointlistdialog.cpp +++ b/kybackup/backuppointlistdialog.cpp @@ -84,18 +84,18 @@ BackupPointListDialog::BackupPointListDialog(QWidget *parent, bool isOnlyShowLoc // 列表为空时展示图片 m_labelEmpty = new QLabel(m_tableWidget); if (g_GSettingWrapper.isDarkTheme()) { - QPixmap pixmap(":/images/empty_dark.svg"); + QPixmap pixmap(":/images/empty_dark.png"); m_labelEmpty->setPixmap(pixmap); } else { - QPixmap pixmap(":/images/empty.svg"); + QPixmap pixmap(":/images/empty.png"); m_labelEmpty->setPixmap(pixmap); } connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::styleNameChanged, this, [=](bool isDark) { if (isDark) { - QPixmap pixmap(":/images/empty_dark.svg"); + QPixmap pixmap(":/images/empty_dark.png"); m_labelEmpty->setPixmap(pixmap); } else { - QPixmap pixmap(":/images/empty.svg"); + QPixmap pixmap(":/images/empty.png"); m_labelEmpty->setPixmap(pixmap); } }); diff --git a/kybackup/component/myiconbutton.cpp b/kybackup/component/myiconbutton.cpp index 93dc07c..a10f836 100755 --- a/kybackup/component/myiconbutton.cpp +++ b/kybackup/component/myiconbutton.cpp @@ -9,10 +9,10 @@ MyIconButton::MyIconButton(QWidget *parent) : QPushButton(parent) { - this->setCheckable(true); + this->setCheckable(false); m_iconButton = new QPushButton(this); - m_iconButton->setCheckable(true); + m_iconButton->setCheckable(false); m_iconButton->setFixedSize(QSize(24, 24)); m_iconButton->setFocusPolicy(Qt::NoFocus); m_iconButton->setFlat(true); @@ -61,7 +61,7 @@ void MyIconButton::setDesplayText(const QString &text) void MyIconButton::changePalette(bool checked) { - m_iconButton->setChecked(checked); + // m_iconButton->setChecked(checked); QPalette pal(m_textLabel->palette()); QIcon icon = QIcon::fromTheme(m_themeIconName, QIcon(m_defaultIconName)); QPixmap pix; diff --git a/kybackup/component/ringsprogressbar.cpp b/kybackup/component/ringsprogressbar.cpp index f485016..325145c 100755 --- a/kybackup/component/ringsprogressbar.cpp +++ b/kybackup/component/ringsprogressbar.cpp @@ -28,9 +28,9 @@ void RingsProgressbar::paintEvent(QPaintEvent *) QPen pen = p.pen(); p.setPen(Qt::NoPen); if (g_GSettingWrapper.isDarkTheme()) - p.setBrush(QBrush(QColor(COLOR_LIGHT_BLUE))); - else p.setBrush(QBrush(palette().button().color())); + else + p.setBrush(QBrush(QColor(COLOR_LIGHT_BLUE))); p.drawEllipse(outRect); p.setBrush(QBrush(QColor(COLOR_BLUE))); diff --git a/kybackup/deletebackupdialog.cpp b/kybackup/deletebackupdialog.cpp index 5889ad6..63eca4d 100755 --- a/kybackup/deletebackupdialog.cpp +++ b/kybackup/deletebackupdialog.cpp @@ -20,6 +20,7 @@ DeleteBackupDialog::DeleteBackupDialog(ParseBackupList::BackupPoint backupPonit, ui->setupUi(this); setMinimumSize(450, 138); setMaximumSize(450, 200); + this->setAutoFillBackground(true); // 添加窗管协议 MotifWmHints hints; @@ -29,12 +30,6 @@ DeleteBackupDialog::DeleteBackupDialog(ParseBackupList::BackupPoint backupPonit, XAtomHelper::getInstance()->setWindowMotifHint(winId(), hints); setWindowModality(Qt::WindowModal); - // 设置背景色 - this->setAutoFillBackground(true); - QPalette palette = this->palette(); - palette.setColor(QPalette::Window, palette.color(QPalette::Base)); - this->setPalette(palette); - // 设置标题栏 QHBoxLayout * titleLayout = new QHBoxLayout(); @@ -224,3 +219,13 @@ void DeleteBackupDialog::on_deleteBackup_end(bool result) m_pInterface = nullptr; } +void DeleteBackupDialog::paintEvent(QPaintEvent *event) +{ + // 设置背景色 + QPalette palette = this->palette(); + palette.setColor(QPalette::Window, palette.color(QPalette::Base)); + this->setPalette(palette); + QDialog::paintEvent(event); +} + + diff --git a/kybackup/deletebackupdialog.h b/kybackup/deletebackupdialog.h index 6d5ff1a..bc870b5 100755 --- a/kybackup/deletebackupdialog.h +++ b/kybackup/deletebackupdialog.h @@ -21,6 +21,8 @@ public: explicit DeleteBackupDialog(ParseBackupList::BackupPoint backupPonit, QWidget *parent = nullptr); ~DeleteBackupDialog(); + void paintEvent(QPaintEvent *event); + signals: void deleteFinished(bool result); diff --git a/kybackup/globalbackupinfo.h b/kybackup/globalbackupinfo.h index 8811124..95ea9e0 100755 --- a/kybackup/globalbackupinfo.h +++ b/kybackup/globalbackupinfo.h @@ -26,6 +26,15 @@ public: return m_isManager; } + // 设置当前登录用户id + void setCurUserId(QString curUserId) { + m_curUserId = curUserId; + } + // 当前登录用户id + QString curUserId() { + return m_curUserId; + } + // 设置是否以--restore参数启动的备份还原工具 void setHasArgRestore(bool hasArg_restore) { m_hasArg_restore = hasArg_restore; @@ -97,6 +106,8 @@ public: private: // 是否管理员 bool m_isManager = true; + // 当前登录用户id + QString m_curUserId; // 是否正在进行备份、还原等操作 bool m_isBusy = false; // 是否有备份分区 diff --git a/kybackup/kybackup.pro b/kybackup/kybackup.pro index c358058..0f4e713 100755 --- a/kybackup/kybackup.pro +++ b/kybackup/kybackup.pro @@ -132,7 +132,7 @@ TRANSLATIONS += qt_zh_CN.ts system(rm -f qt_zh_CN.qm) !system(lrelease qt_zh_CN.ts): error("Failed to generate qm") -system(cp qt_zh_CN.qm resource/language) +system(cp qt_zh_CN.qm resource/language/) RESOURCES += \ app.qrc diff --git a/kybackup/main.cpp b/kybackup/main.cpp index 540ac79..7c2d07b 100755 --- a/kybackup/main.cpp +++ b/kybackup/main.cpp @@ -133,11 +133,12 @@ bool isManager() return true; uid_t uid = getuid(); + QString sid = QString::number(uid); + GlobelBackupInfo::inst().setCurUserId(sid); // root用户 if (0 == uid) return true; - QString sid = QString::number(uid); QString userObject = "/org/freedesktop/Accounts/User" + sid; // 创建QDBusInterface diff --git a/kybackup/module/managebackuppointlist.cpp b/kybackup/module/managebackuppointlist.cpp index c218068..c5f9be3 100755 --- a/kybackup/module/managebackuppointlist.cpp +++ b/kybackup/module/managebackuppointlist.cpp @@ -87,6 +87,7 @@ void ManageBackupPointList::insertLines(const QListsetPixmap(pixmap); } else { - QPixmap pixmap(":/images/empty.svg"); + QPixmap pixmap(":/images/empty.png"); labelEmptyLogo->setPixmap(pixmap); } connect(GlobelBackupInfo::inst().getGlobalSignals(), &GlobalSignals::styleNameChanged, this, [=](bool isDark) { if (isDark) { - QPixmap pixmap(":/images/empty_dark.svg"); + QPixmap pixmap(":/images/empty_dark.png"); labelEmptyLogo->setPixmap(pixmap); } else { - QPixmap pixmap(":/images/empty.svg"); + QPixmap pixmap(":/images/empty.png"); labelEmptyLogo->setPixmap(pixmap); } }); @@ -121,6 +121,14 @@ void OperationLog::initOperationLogs(const QList& list) int indexOfRow = 0; for (const BackupWrapper& backupPoint : list) { + // 管理员可看自己用户进行的操作和无用户信息的数据备份(旧备份数据) + if (GlobelBackupInfo::inst().isManager() && (backupPoint.m_frontUid != -1) && backupPoint.m_frontUid != GlobelBackupInfo::inst().curUserId().toInt()) + continue ; + + // 标准用户只能看自己进行的操作 + if (!GlobelBackupInfo::inst().isManager() && backupPoint.m_frontUid != GlobelBackupInfo::inst().curUserId().toInt()) + continue ; + m_tableWidget->insertRow(indexOfRow); setItem(indexOfRow, 0, backupPoint.m_backupName); setItem(indexOfRow, 1, backupPoint.m_uuid); diff --git a/kybackup/module/selectrestorepoint.cpp b/kybackup/module/selectrestorepoint.cpp index a72edea..0c47db1 100755 --- a/kybackup/module/selectrestorepoint.cpp +++ b/kybackup/module/selectrestorepoint.cpp @@ -4,6 +4,7 @@ #include "component/mypushbutton.h" #include "../../common/utils.h" #include "messageboxutils.h" +#include "../globalbackupinfo.h" SelectRestorePoint::SelectRestorePoint(QWidget *parent, BackupPointType backupType, bool isOnlyShowLocal) : BackupPointListDialog(parent, isOnlyShowLocal), @@ -93,6 +94,17 @@ void SelectRestorePoint::insertLines(const QList & int(BackupType::INC_BACKUP_DATA) != backupPoint.m_type) continue; + // 数据备份需要用户隔离 + if (BackupPointType::DATA == m_backupType) { + // 管理员可看自己用户进行的数据备份和无用户信息的数据备份(旧备份数据) + if (GlobelBackupInfo::inst().isManager() && !backupPoint.m_userId.isEmpty() && backupPoint.m_userId != GlobelBackupInfo::inst().curUserId()) + continue ; + + // 标准用户只能看自己进行的操作 + if (!GlobelBackupInfo::inst().isManager() && backupPoint.m_userId != GlobelBackupInfo::inst().curUserId()) + continue ; + } + // 不展示未完成的备份点 if (BACKUP_PARSE_STATE_SUCCESS_STRTING != backupPoint.m_state) continue; diff --git a/kybackup/qt_zh_CN.ts b/kybackup/qt_zh_CN.ts index 0e6244c..40bf81c 100755 --- a/kybackup/qt_zh_CN.ts +++ b/kybackup/qt_zh_CN.ts @@ -9,27 +9,27 @@ 对话框 - + Close 关闭 - + Backup & Restore 备份还原 - + version: 版本: - + The backup tool is a tool that supports system backup and data backup. When the user data is damaged or the system is attacked, the tool can flexibly restore the status of the backup node. A lot of optimization and innovation have been carried out for domestic hardware and software platforms. 麒麟备份还原工具是一款支持系统备份还原和数据备份还原的工具,当用户数据损坏或系统遭受攻击时能够通过该工具灵活的还原到备份节点的状态。针对国产软硬件平台开展了大量的优化和创新。 - + Service & Support: %1 服务与支持团队:%1 @@ -50,32 +50,32 @@ 对话框 - + Backup Name 备份名称 - + UUID 备份标识 - + Backup Time 备份时间 - + Backup Size 备份大小 - + Position 备份位置 - + No Backup 无备份 @@ -83,343 +83,343 @@ DataBackup - + Data Backup 数据备份 - + Only files in the /home, /root, and /data directories can be backed up 仅支持备份/home、/root、/data目录下的文件 - + Only files in the /home, /root, and /data/usershare directories can be backed up 仅支持备份/home、/root、/data/usershare目录下的文件 - + Multi-Spot 多点还原 - + Security 安全可靠 - + Protect Data 防止数据丢失 - + Convenient 便捷快速 - + Start Backup 开始备份 - + Update Backup 备份更新 - - + + Backup Management >> 备份管理 >> - + Please select backup position 请选择备份位置 - - + + local default path : 本地默认路径: - - + + removable devices path : 移动设备: - - + + Select backup data 选择备份数据 - - + + Add 添加 - - + + Select 选择 - - + + Please select file to backup 请选择备份文件 - - - - + + + + Back 上一步 - - - - + + + + Next 下一步 - + Default backup location 默认备份位置 - - - - + + + + checking 环境检测 - - - - + + + + preparing 备份准备 - - - - + + + + backuping 备份中 - - - - + + + + finished 备份完成 - + Recheck 重新检测 - + Checking, wait a moment ... 正在检测,请稍等... - + Do not perform other operations during backup to avoid data loss 备份过程中不要做其它操作,以防数据丢失 - + Check whether the remaining capacity of the backup partition is sufficient 检测备份分区空间是否充足··· - + Check whether the remaining capacity of the removable device is sufficient 检测移动设备空间是否充足··· - + Check success 检测成功 - + The storage for backup is enough 备份空间充足 - + Make sure the computer is plugged in or the battery level is above 60% 请确保电脑已连接电源或电量超过60% - + Check failure 检测失败 - - + + Program lock failed, please retry 程序锁定失败,请重试 - - + + There may be other backups or restores being performed 可能有其它备份/还原等任务在执行 - - + + Unsupported task type 不支持的任务类型 - - + + No processing logic was found in the service 没有找到相应的处理逻辑 - - + + Failed to mount the backup partition 备份分区挂载失败 - - + + Check whether there is a backup partition 检查是否有备份分区 - + The filesystem of device is vfat format 移动设备的文件系统是vfat格式 - + Please change filesystem format to ext3、ext4 or ntfs 请换成ext3、ext4、ntfs等文件系统格式 - + The device is read only 移动设备是只读挂载的 - + Please chmod to rw 请修改为读写模式 - - + + The storage for backup is not enough 备份空间不足 - - + + Retry after release space 建议释放空间后重试 - - + + Other backup or restore task is being performed 其它备份还原等操作正在执行 - - + + Please try again later 请稍后重试 - + Backup Name 备份名称 - - + + Name already exists 名称已存在 - + Cancel 取消 - + Do not use computer in case of data loss 请勿使用电脑,以防数据丢失 - + Failed to create the backup point directory 创建备份目录失败 - + Please check backup partition permissions 请检查备份分区权限 - + The backup had been canceled 备份已取消 - + Re-initiate the backup if necessary 如需要可重新进行备份 - + An error occurred during backup 备份期间发生错误 - + Error messages refer to log file : /var/log/backup.log 错误信息请参考日志文件:/var/log/backup.log - + Home Page 返回首页 - + Retry 再试一次 - + The backup is successful 备份成功 - + The backup is failed 备份失败 @@ -427,221 +427,221 @@ DataRestore - + Data Restore 数据还原 - + Backed up first, then can be restored 必须先进行数据备份,否则无法进行数据还原操作 - + Fast Recovery 快速恢复 - + Security 安全可靠 - + Protect Data 解决数据丢失 - + Independent 自主操作 - + Start Restore 开始还原 - - - + + + checking 环境检测 - - - + + + restoring 还原中 - - - + + + finished 还原完成 - + Back 上一步 - + Next 下一步 - + Recheck 重新检测 - + Checking, wait a moment ... 正在检测,请稍等... - + Check whether the restore environment meets the requirements 检查恢复环境是否符合要求 - + Do not perform other operations during restore to avoid data loss 还原期间不要做其它操作,以防数据丢失 - + Check success 检测成功 - - + + Do not use computer in case of data loss 请勿使用电脑,以防数据丢失 - + Make sure the computer is plugged in or the battery level is above 60% 请确保电脑已连接电源或电量超过60% - + Check failure 检测失败 - - + + Program lock failed, please retry 程序锁定失败,请重试 - - + + There may be other backups or restores being performed 可能有其它备份/还原等任务在执行 - - + + Unsupported task type 不支持的任务类型 - - + + No processing logic was found in the service 没有找到相应的处理逻辑 - - + + The .user.txt file does not exist .user.txt文件不存在 - - - - - - + + + + + + Backup points may be corrupted 备份点可能被损坏 - - + + The .exclude.user.txt file does not exist .exclude.user.txt文件不存在 - - + + The backup point data directory does not exist 备份点数据目录不存在 - + Failed to rsync /boot/efi 同步/boot/efi失败 - + Check the mounting mode of the /boot/efi partition 请检查/boot/efi分区挂载方式 - + Failed to prepare the restore directory 还原目录准备失败 - + Refer to log :/var/log/backup.log for more information 更多信息请参考日志/var/log/backup.log - + An error occurred during restore 还原时发生错误 - + Error messages refer to log file : /var/log/backup.log 错误信息请参考日志文件:/var/log/backup.log - + Home Page 返回首页 - + Retry 再试一次 - + Reboot System 重启系统 - + Successfully restoring the data 数据还原成功 - + The system needs to reboot. Otherwise, some tools cannot be used. 系统需要重启,否则某些工具可能无法使用 - + Restoring the data failed 数据还原失败 @@ -654,43 +654,43 @@ 对话框 - - + + Please wait while data is being removed 正在删除数据,请稍候 - + Removing backup point... 正在删除备份点... - + Ok 确定 - + Other backup or restore task is being performed 其它备份还原等操作正在执行 - + Program lock failed, please retry 程序锁定失败,请重试 - + Unsupported task type 不支持的任务类型 - + Deleted backup successfully. 删除备份成功。 - + Failed to delete backup. 删除备份失败。 @@ -731,294 +731,294 @@ GhostImage - + Ghost Image Ghost镜像 - + A ghost image file can only be created after backup system to local disk 必须先进行本地系统备份,否则无法创建镜像文件 - + Simple 操作简单 - + Fast 创建速度快 - + Security 安全可靠 - + Timesaving 节省时间 - + Start Ghost 创建镜像 - + Please select storage location 请选择存储位置 - + local default path : 本地默认路径: - + removable devices path : 移动设备: - - + + Back 上一步 - - + + Next 下一步 - - - + + + checking 环境检测 - - - + + + ghosting 创建中 - - - + + + finished 创建完成 - + Recheck 重新检测 - + Checking, wait a moment ... 正在检测,请稍等... - + Check whether the conditions for creating an ghost image are met 检测是否具备制作Ghost镜像条件 - + Do not perform other operations during creating an ghost image to avoid data loss 制作Ghost镜像期间不要做其它操作,以防数据丢失 - + Check success 检测成功 - + The storage space is enough 存储空间充足 - + Make sure the computer is plugged in or the battery level is above 60% 请确保电脑已连接电源或电量超过60% - + Check failure 检测失败 - - + + Program lock failed, please retry 程序锁定失败,请重试 - - + + There may be other backups or restores being performed 可能有其它备份/还原等任务在执行 - - + + Unsupported task type 不支持的任务类型 - - + + No processing logic was found in the service 没有找到相应的处理逻辑 - - + + Failed to mount the backup partition 备份分区挂载失败 - - + + Check whether there is a backup partition 检查是否有备份分区 - - + + The filesystem of device is vfat format 移动设备的文件系统是vfat格式 - - + + Please change filesystem format to ext3、ext4 or ntfs 请换成ext3、ext4、ntfs等文件系统格式 - - + + The device is read only 移动设备是只读挂载的 - - + + Please chmod to rw 请修改为读写模式 - - + + The storage for ghost is not enough Ghost存储空间不足 - - - - + + + + Retry after release space 建议释放空间后重试 - - + + There is not enough space for temporary .kyimg file 没有足够的空间存放临时.kyimg文件 - - + + Other backup or restore task is being performed 其它备份还原等操作正在执行 - - + + Please try again later 请稍后重试 - - + + The backup node does not exist 相应的备份节点不存在 - - + + Check whether the backup point has been deleted 请检查备份点是否已经被删除 - + Cancel 取消 - + Do not use computer in case of data loss 请勿使用电脑,以防数据丢失 - + The data is being compressed to the local disk, please wait patiently... 正压缩数据到本地磁盘,请耐心等待... - + Transferring image file to mobile device, about to be completed... 正在传输image文件到移动设备,即将完成... - + The image creation had been canceled 已取消制作Ghost镜像 - + Re-initiate the image creation if necessary 如需要可以重新进行Ghost镜像制作 - + An error occurred during make ghost image 制作Ghost镜像时发生错误 - + Error messages refer to log file : /var/log/backup.log 错误信息请参考日志文件:/var/log/backup.log - + Home Page 返回首页 - + Retry 再试一次 - + Ghost image creation is successful Ghost镜像创建成功 - + You can view it in the directory : 可以在后面目录中查看: - + Ghost image creation is failed Ghost镜像创建失败 @@ -1026,8 +1026,8 @@ LeftsiderbarWidget - + Backup & Restore 备份还原 @@ -1050,37 +1050,33 @@ 关闭 - Theme - 主题 + 主题 - Auto - 跟随主题 + 跟随主题 - Light - 浅色主题 + 浅色主题 - Dark - 深色主题 + 深色主题 - + Help 帮助 - + About 关于 - + Exit 退出 @@ -1113,12 +1109,12 @@ 删除 - + backup finished 备份完成 - + backup unfinished 备份未完成 @@ -1126,72 +1122,72 @@ OperationLog - + No operation log 无操作日志 - + Backup Name 备份名称 - + UUID 备份标识 - + Operation 操作 - + Operation Time 操作时间 - + new system backup 新建系统备份 - + udpate system backup 增量系统备份 - + new data backup 新建数据备份 - + update data backup 更新数据备份 - + restore system 系统还原 - + restore retaining user data 保留用户数据还原 - + restore data 数据还原 - + delete backup 删除备份 - + make ghost image 制作ghost镜像 @@ -1209,12 +1205,12 @@ 出厂备份 - + Backup State 备份状态 - + PrefixPath @@ -1222,15 +1218,15 @@ - - - - - - + + + + + + - - + + Warning 警告 @@ -1245,19 +1241,19 @@ - - - - - - - - - + + + + + + + + + - - + + Ok 确定 @@ -1274,13 +1270,13 @@ - - - - + + + + - - + + Information 提示 @@ -1300,65 +1296,65 @@ 备份还原工具 - + An exception occurred when mounting backup partition. 挂载备份分区时发生错误。 - + Please check if the backup partition exists which can be created when you install the Operating System. 请检查备份还原分区是否存在,在安装操作系统时必须创建备份还原分区。 - + Failed to mount backup partition. 挂载备份分区失败。 - - + + It's busy, please wait 系统正忙,请稍等 - - + + Please select a backup file or directory 请选择一个备份文件或目录 - - - + + + Are you sure to cancel the operation? 确定取消当前操作? - - - + + + - - - + + + Cancel 取消 - - - + + + Continue 继续 - + Contains the user's home directory, which need to reboot after restoration. Are you sure to continue? 包含用户家目录,还原完成后需要重启系统。是否继续? - + Please select one backup to continue. 请选择一个备份再继续。 @@ -1368,29 +1364,29 @@ 是否确定删除此备份? - - + + Udisk Device: 移动设备: - - + + Local Disk: 本地磁盘: - + Do you want to continue? 是否继续? - + Other machine: 异机备份: - + Restore factory settings, your system user data will not be retained. Are you sure to continue? 恢复出厂设置,您的系统用户数据都将会消失。是否继续? @@ -1398,22 +1394,22 @@ SelectRestorePoint - + System Backup Information 系统备份信息 - + Data Backup Information 数据备份信息 - + Ok 确定 - + Udisk Device: 移动设备: @@ -1421,321 +1417,321 @@ SystemBackup - + System Backup 系统备份 - + Can be restored when files are damaged or lost 系统原始文件受损或丢失时可以进行还原 - + Multi-Spot 多还原点 - + Small Size 体积小 - + Security 安全保障 - + Simple 操作简单 - + Start Backup 开始备份 - - + + Backup Management >> 备份管理 >> - + Please select backup position 请选择备份位置 - + local default path : 本地默认路径: - + removable devices path : 移动设备: - - - + + + Back 上一步 - - - + + + Next 下一步 - - - - + + + + checking 环境检测 - - - - + + + + preparing 备份准备 - - - - + + + + backuping 备份中 - - - - + + + + finished 备份完成 - + Recheck 重新检测 - + Checking, wait a moment ... 正在检测,请稍等... - + Do not perform other operations during backup to avoid data loss 备份期间不要做其它操作,以防数据丢失 - + Check whether the remaining capacity of the backup partition is sufficient 检测备份分区空间是否充足··· - + Check whether the remaining capacity of the removable device is sufficient 检测移动设备空间是否充足··· - + Check success 检测成功 - + The storage for backup is enough 备份空间充足 - + Make sure the computer is plugged in or the battery level is above 60% 请确保电脑已连接电源或电量超过60% - + Check failure 检测失败 - - + + Program lock failed, please retry 程序锁定失败,请重试 - - + + There may be other backups or restores being performed 可能有其它备份/还原等任务在执行 - - + + Unsupported task type 不支持的任务类型 - - + + No processing logic was found in the service 没有找到相应的处理逻辑 - - + + Failed to mount the backup partition 备份分区挂载失败 - - + + Check whether there is a backup partition 检查是否有备份分区 - - + + The filesystem of device is vfat format 移动设备的文件系统是vfat格式 - - + + Please change filesystem format to ext3、ext4 or ntfs 请换成ext3、ext4、ntfs等文件系统格式 - - + + The device is read only 移动设备是只读挂载的 - - + + Please chmod to rw 请修改为读写模式 - - + + The storage for backup is not enough 备份空间不足 - - + + Retry after release space 建议释放空间后重试 - - + + Other backup or restore task is being performed 其它备份还原等操作正在执行 - - + + Please try again later 请稍后重试 - + Backup Name 备份名称 - - + + Name already exists 名称已存在 - + factory backup 出厂备份 - + Cancel 取消 - + Do not use computer in case of data loss 请勿使用电脑,以防数据丢失 - + Failed to create the backup point directory 创建备份目录失败 - + Please check backup partition permissions 请检查备份分区权限 - + The system is being compressed to the local disk, please wait patiently... 正压缩系统到本地磁盘,请耐心等待... - + Transferring image file to mobile device, about to be completed... 正在传输image文件到移动设备,即将完成... - + The backup had been canceled 已取消备份 - + Re-initiate the backup if necessary 如需要可重新进行备份 - - + + An error occurred during backup 备份时发生错误 - - + + Error messages refer to log file : /var/log/backup.log 错误信息请参考日志文件:/var/log/backup.log - + Home Page 返回首页 - + Retry 再试一次 - + The backup is successful 备份成功 - + The backup is failed 备份失败 @@ -1743,232 +1739,232 @@ SystemRestore - + System Restore 系统还原 - + You can restore the system to its previous state 在您遇到问题时可将系统还原到以前的状态 - + Simple 操作简单 - + Security 安全可靠 - + Repair 修复系统损坏 - + Independent 自主操作 - + Start Restore 开始还原 - + Factory Restore 出厂还原 - + Retaining User Data 保留用户数据 - - - + + + checking 环境检测 - - - + + + restoring 还原中 - - - + + + finished 还原完成 - + Back 上一步 - + Next 下一步 - + Recheck 重新检测 - + Checking, wait a moment ... 正在检测,请稍等... - + Check whether the restore environment meets the requirements 检查恢复环境是否符合要求 - + Do not perform other operations during restore to avoid data loss 还原期间不要做其它操作,以防数据丢失 - + Check success 检测成功 - + The system will reboot automatically after the restore is successful 还原成功后系统将自动重启 - + Make sure the computer is plugged in or the battery level is above 60% 请确保电脑已连接电源或电量超过60% - + Check failure 检测失败 - - + + Program lock failed, please retry 程序锁定失败,请重试 - - + + There may be other backups or restores being performed 可能有其它备份/还原等任务在执行 - - + + Unsupported task type 不支持的任务类型 - - + + No processing logic was found in the service 没有找到相应的处理逻辑 - - + + The .user.txt file does not exist .user.txt文件不存在 - - - - - - + + + + + + Backup points may be corrupted 备份点可能被损坏 - - + + The .exclude.user.txt file does not exist .exclude.user.txt文件不存在 - - + + The backup point data directory does not exist 备份点数据目录不存在 - - + + Failed to rsync /boot/efi 同步/boot/efi失败 - - + + Check the mounting mode of the /boot/efi partition 请检查/boot/efi分区挂载方式 - + Do not use computer in case of data loss 请勿使用电脑,以防数据丢失 - + Failed to prepare the restore directory 还原目录准备失败 - + Refer to log :/var/log/backup.log for more information 更多信息请参考日志/var/log/backup.log - + An error occurred during restore 还原时发生错误 - + Error messages refer to log file : /var/log/backup.log 错误信息请参考日志文件:/var/log/backup.log - + Home Page 返回首页 - + Retry 再试一次 - + Successfully restoring the system 系统还原成功 - + The system will automatically reboot 系统将自动重启 - + Restoring the system failed 系统还原失败 diff --git a/kybackup/resource/language/qt_zh_CN.qm b/kybackup/resource/language/qt_zh_CN.qm new file mode 100644 index 0000000000000000000000000000000000000000..d9b94c0e0a13d702e1f647e692ab99e826e9da6f GIT binary patch literal 29391 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 literal 0 HcmV?d00001