[FIX]【共享文件】共享文件夹增加右键发送桌面快捷方式且重启后不会消失 [LINK]80310

This commit is contained in:
杨艳微 2022-05-20 05:26:23 +00:00 committed by Yue-Lan
parent 2da8319656
commit ba75a883ea
9 changed files with 440 additions and 110 deletions

View File

@ -24,6 +24,7 @@
#include "file-info.h"
//create link
#include "shared-file-link-operation.h"
#include <file-operation-manager.h>
#include <file-link-operation.h>
#include <file-info.h>
@ -51,6 +52,7 @@ MenuPluginManager::MenuPluginManager(QObject *parent) : QObject(parent)
{
registerPlugin(new CreateLinkInternalPlugin(this));
registerPlugin(new FileLabelInternalMenuPlugin(this));
registerPlugin(new CreateSharedFileLinkMenuPlugin(this));
}
MenuPluginManager::~MenuPluginManager()
@ -120,6 +122,9 @@ QList<QAction *> CreateLinkInternalPlugin::menuActions(MenuPluginInterface::Type
|| selectionUris.first().startsWith("trash:///")
|| selectionUris.first().startsWith("recent:///")
|| selectionUris.first().startsWith("mtp://")
|| selectionUris.first().startsWith("sftp://")
|| selectionUris.first().startsWith("ftp://")
|| selectionUris.first().startsWith("smb://")
|| originPath == desktopPath) {
return l;
}
@ -205,3 +210,48 @@ QList<QAction *> FileLabelInternalMenuPlugin::menuActions(MenuPluginInterface::T
}
return l;
}
CreateSharedFileLinkMenuPlugin::CreateSharedFileLinkMenuPlugin(QObject *parent) : QObject (parent)
{
}
QList<QAction *> CreateSharedFileLinkMenuPlugin::menuActions(MenuPluginInterface::Types types, const QString &uri, const QStringList &selectionUris)
{
QList<QAction *> l;
if (types == MenuPluginInterface::DesktopWindow || types == MenuPluginInterface::DirectoryView) {
if (selectionUris.count() == 1) {
auto select_file_info = FileInfo::fromUri(selectionUris[0]);
if(select_file_info->isSymbolLink())
return l;
QString str_cmp = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
str_cmp.insert(0, QString("file://"));
//在桌面文件夹中屏蔽 “发送到桌面快捷方式” 和 “创建链接到...” - Block "Create link to desktop" and "Create link to..." in the desktop folder
if(QString::compare(QUrl::fromPercentEncoding(uri.toLocal8Bit()), str_cmp))
{
QAction* createLinkToDesktop = new QAction(QIcon::fromTheme("emblem-link-symbolic"), tr("Create Link to Desktop"), nullptr);
auto info = FileInfo::fromUri(selectionUris.first());
QString desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
QString originPath = QUrl(selectionUris.first()).path();
//special type mountable, or isVirtual then return
if ( !selectionUris.first().startsWith("smb://")
&& !selectionUris.first().startsWith("ftp://")
&& !selectionUris.first().startsWith("sftp://") ) {
return l;
}
connect(createLinkToDesktop, &QAction::triggered, [=]() {
//QUrl src = selectionUris.first();
QString desktopUri = "file://" + desktopPath;
SharedFileLinkOperation *op = new SharedFileLinkOperation(selectionUris.first(), desktopUri);
op->setAutoDelete(true);
FileOperationManager::getInstance()->startOperation(op, false);
});
l<<createLinkToDesktop;
}
}
}
return l;
}

View File

@ -116,6 +116,40 @@ private:
bool m_enable = true;
};
class CreateSharedFileLinkMenuPlugin : public QObject, public MenuPluginInterface
{
Q_OBJECT
public:
explicit CreateSharedFileLinkMenuPlugin(QObject *parent);
PluginInterface::PluginType pluginType() override {
return PluginInterface::MenuPlugin;
}
const QString name() override {
return tr("Peony-Qt Share File menu Extension");
}
const QString description() override {
return tr("Tag with Menu.");
}
const QIcon icon() override {
return QIcon::fromTheme("emblem-symbolic-link");
}
void setEnable(bool enable) override {
m_enable = enable;
}
bool isEnable() override {
return m_enable;
}
QString testPlugin() override {
return "test create share file link label";
}
QList<QAction *> menuActions(Types types, const QString &uri, const QStringList &selectionUris) override;
private:
bool m_enable = true;
};
}
#endif // MENUPLUGINMANAGER_H

View File

@ -6,6 +6,7 @@ PKGCONFIG += gio-unix-2.0
HEADERS += \
$$PWD/file-node.h \
$$PWD/shared-file-link-operation.h \
$$PWD/xatom-helper.h \
$$PWD/file-operation.h \
$$PWD/file-node-reporter.h \
@ -28,6 +29,7 @@ HEADERS += \
SOURCES += \
$$PWD/file-node.cpp \
$$PWD/shared-file-link-operation.cpp \
$$PWD/xatom-helper.cpp \
$$PWD/file-operation.cpp \
$$PWD/file-node-reporter.cpp \

View File

@ -0,0 +1,106 @@
/*
* Peony-Qt's Library
*
* Copyright (C) 2022, KylinSoft Co., Ltd.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this library. If not, see <https://www.gnu.org/licenses/>.
*
* Authors: Yan Wei Yang <yangyanwei@kylinos.cn>
*
*/
#include "shared-file-link-operation.h"
#include "file-operation-manager.h"
#include "file-info.h"
#include "gerror-wrapper.h"
#include <gio/gdesktopappinfo.h>
#include <glib/gprintf.h>
#include <QUrl>
#include <QProcess>
#include <fcntl.h>
using namespace Peony;
SharedFileLinkOperation::SharedFileLinkOperation(QString srcUri, QString destDirUri, QObject *parent) : FileOperation (parent)
{
m_src_uri = srcUri;
QUrl url = srcUri;
auto fileInfo = FileInfo::fromUri(m_src_uri);
m_display_name = fileInfo->displayName();
auto fileName = m_display_name.isEmpty() ? url.fileName() : m_display_name;
//If it starts with a ".", add it directly to the end
if(fileName.startsWith('.')){
m_dest_uri = destDirUri + "/" + fileName + " - " + tr("Symbolic Link");
}else{
// Otherwise, add it directly to the front
m_dest_uri = destDirUri + "/" + tr("Symbolic Link") + " - " + fileName;
}
//m_dest_uri = QUrl::fromEncoded(m_dest_uri.toUtf8()).toDisplayString();
QStringList fake_uris;
fake_uris<<srcUri;
m_info = std::make_shared<FileOperationInfo>(fake_uris, destDirUri, FileOperationInfo::Link);
}
SharedFileLinkOperation::~SharedFileLinkOperation()
{
}
void SharedFileLinkOperation::run()
{
operationStarted();
createShareFilesSymbolicLink(m_src_uri);
operationFinished();
}
void SharedFileLinkOperation::createShareFilesSymbolicLink(QString &srcUri)
{
m_dest_uri += ".desktop";
QUrl url = m_dest_uri;
QString desktopfp = url.path();
g_autoptr (GError) error = nullptr;
GKeyFile* keyfile = g_key_file_new ();
g_key_file_set_value(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY, "true");
g_key_file_set_value(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_TYPE, "Application");
QUrl srcUrl = srcUri;
QString exec = "peony " + srcUri;
g_key_file_set_value(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, exec.toUtf8().constData());
g_key_file_set_value(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_ICON, "folder-remote");
QString fileName = url.fileName();
int index = fileName.lastIndexOf(".");
fileName.truncate(index);
if (!m_display_name.isEmpty()) {
fileName = m_display_name;
}
g_key_file_set_value(keyfile, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, fileName.toUtf8().constData());
g_key_file_set_value(keyfile, G_KEY_FILE_DESKTOP_GROUP, "X-Peony-CMD", "true");
// 可能会有路径重复的情况,后续需要做异常处理
g_key_file_save_to_file(keyfile, desktopfp.toUtf8().constData(), nullptr);
if (keyfile) {
g_key_file_free(keyfile);
}
g_autoptr(GFile) destFile = g_file_new_for_uri(m_dest_uri.toUtf8().constData());
if (destFile) {
mode_t mod = S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP;
g_file_set_attribute_uint32(destFile, G_FILE_ATTRIBUTE_UNIX_MODE, (guint32)mod, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, nullptr, nullptr);
}
}

View File

@ -0,0 +1,53 @@
/*
* Peony-Qt's Library
*
* Copyright (C) 2022, KylinSoft Co., Ltd.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this library. If not, see <https://www.gnu.org/licenses/>.
*
* Authors: Yan Wei Yang <yangyanwei@kylinos.cn>
*
*/
#ifndef SHAREDFILELINKOPERATION_H
#define SHAREDFILELINKOPERATION_H
#include "peony-core_global.h"
#include "file-operation.h"
namespace Peony {
class PEONYCORESHARED_EXPORT SharedFileLinkOperation : public FileOperation
{
Q_OBJECT
public:
SharedFileLinkOperation(QString srcUri, QString destDirUri, QObject *parent = nullptr);
~SharedFileLinkOperation() override;
std::shared_ptr<FileOperationInfo> getOperationInfo() override {
return m_info;
}
void run() override;
void createShareFilesSymbolicLink(QString &srcUri);
private:
QString m_src_uri = nullptr;
QString m_dest_uri = nullptr;
QString m_display_name = nullptr;
std::shared_ptr<FileOperationInfo> m_info = nullptr;
};
}
#endif // SHAREDFILELINKOPERATION_H

View File

@ -1002,7 +1002,9 @@ void DesktopIconView::openFileByUri(QString uri)
p.startDetached("peony", QStringList()<<strq<<"%U&");
#endif
} else {
FileLaunchManager::openAsync(uri, false, false);
if (!(info->isDesktopFile() && execSharedFileLink(uri))) {
FileLaunchManager::openAsync(uri, false, false);
}
}
this->clearSelection();
});
@ -2339,6 +2341,71 @@ void DesktopIconView::clearAllRestoreInfo()
m_resolution_item_rect.clear();
}
bool DesktopIconView::execSharedFileLink(const QString uri)
{
auto info = FileInfo::fromUri(uri);
if (info->isEmptyInfo()) {
FileInfoJob j(info);
j.querySync();
}
if (uri.endsWith(".desktop")) {
GKeyFile* key_file = g_key_file_new();
QUrl url = uri;
QString desktopfp = url.path();
g_key_file_load_from_file(key_file, desktopfp.toUtf8().constData(), G_KEY_FILE_KEEP_COMMENTS, nullptr);
GError* error = NULL;
if (g_key_file_has_key(key_file, G_KEY_FILE_DESKTOP_GROUP, "X-Peony-CMD", nullptr)) {
if (g_key_file_has_key(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, nullptr)) {
g_autofree char* val = g_key_file_get_value(key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, &error);
if (error) {
qWarning() << "get desktop file:" << uri << " name error:" << error->code << " -- " << error->message;
g_error_free(error);
error = nullptr;
} else {
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
QProcess p;
p.setProgram("peony");
QString str = val;
str = str.replace("peony ","");
p.setArguments(QStringList() << str);
qint64 pid;
p.startDetached(&pid);
// send startinfo to kwindowsystem
quint32 timeStamp = QX11Info::isPlatformX11() ? QX11Info::appUserTime() : 0;
KStartupInfoId startInfoId;
startInfoId.initId(KStartupInfo::createNewStartupIdForTimestamp(timeStamp));
startInfoId.setupStartupEnv();
KStartupInfoData data;
data.setHostname();
data.addPid(pid);
QRect rect = info.get()->property("iconGeometry").toRect();
if (rect.isValid()) {
data.setIconGeometry(rect);
}
data.setLaunchedBy(getpid());
KStartupInfo::sendStartup(startInfoId, data);
#else
QProcess p;
QString strq;
for (int i = 0;i < uri.length();++i) {
if(uri[i] == ' '){
strq += "%20";
}else{
strq += uri[i];
}
}
p.startDetached("peony", QStringList()<<strq<<"%U&");
#endif
return true;
}
}
}
}
return false;
}
static bool iconSizeLessThan (const QPair<QRect, QString>& p1, const QPair<QRect, QString>& p2)
{
if (p1.first.x() > p2.first.x())

View File

@ -106,6 +106,7 @@ public:
private:
QRect getScreenArea(QScreen* screen);
bool execSharedFileLink(const QString uri);
Q_SIGNALS:
void zoomLevelChanged(ZoomLevel level);

View File

@ -1227,7 +1227,7 @@ void TabWidget::addPage(const QString &uri, bool jumpTo)
connect(infoJob, &Peony::FileInfoJob::queryAsyncFinished, this, [=](){
QString rootDir = info.get()->uri();
if (!info.get()->isDir()) {
if (info.get()->uri().startsWith("file:///") && !info.get()->isDir()) {
rootDir = Peony::FileUtils::getParentUri(rootDir);
}

View File

@ -221,37 +221,37 @@
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="85"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="109"/>
<source>Completely erase(Time is longer, please confirm!)</source>
<translation>(,!)</translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="94"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="118"/>
<source>Cancel</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="95"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="119"/>
<source>OK</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="198"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="222"/>
<source>Data</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="932"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="956"/>
<source>Error</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="932"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="956"/>
<source>Block not existed!</source>
<translation>!</translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="964"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="988"/>
<source>Formatting. Do not close this window</source>
<translation>, </translation>
</message>
@ -927,17 +927,17 @@
<context>
<name>Peony::CreateLinkInternalPlugin</name>
<message>
<location filename="../../libpeony-qt/controls/menu/menu-plugin-manager.cpp" line="113"/>
<location filename="../../libpeony-qt/controls/menu/menu-plugin-manager.cpp" line="115"/>
<source>Create Link to Desktop</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/menu/menu-plugin-manager.cpp" line="136"/>
<location filename="../../libpeony-qt/controls/menu/menu-plugin-manager.cpp" line="141"/>
<source>Create Link to...</source>
<translation>...</translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/menu/menu-plugin-manager.cpp" line="139"/>
<location filename="../../libpeony-qt/controls/menu/menu-plugin-manager.cpp" line="144"/>
<source>Choose a Directory to Create Link</source>
<translation></translation>
</message>
@ -950,6 +950,14 @@
<translation type="vanished">.</translation>
</message>
</context>
<context>
<name>Peony::CreateSharedFileLinkMenuPlugin</name>
<message>
<location filename="../../libpeony-qt/controls/menu/menu-plugin-manager.cpp" line="233"/>
<source>Create Link to Desktop</source>
<translation></translation>
</message>
</context>
<context>
<name>Peony::CreateTemplateOperation</name>
<message>
@ -1129,12 +1137,12 @@
<translation type="vanished"></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/directory-view/view/icon-view/icon-view.cpp" line="289"/>
<location filename="../../libpeony-qt/controls/directory-view/view/icon-view/icon-view.cpp" line="290"/>
<source>warn</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/directory-view/view/icon-view/icon-view.cpp" line="289"/>
<location filename="../../libpeony-qt/controls/directory-view/view/icon-view/icon-view.cpp" line="290"/>
<source>This operation is not supported.</source>
<translation></translation>
</message>
@ -1153,12 +1161,12 @@
<translation type="vanished"></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/directory-view/view/list-view/list-view.cpp" line="483"/>
<location filename="../../libpeony-qt/controls/directory-view/view/list-view/list-view.cpp" line="484"/>
<source>warn</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/directory-view/view/list-view/list-view.cpp" line="483"/>
<location filename="../../libpeony-qt/controls/directory-view/view/list-view/list-view.cpp" line="484"/>
<source>This operation is not supported.</source>
<translation></translation>
</message>
@ -1370,18 +1378,18 @@
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="718"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="827"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="865"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1027"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1029"/>
<source>Copy</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1083"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1085"/>
<source>File:&quot;%1&quot; is not exist, did you moved or deleted it?</source>
<translation> %s </translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1103"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1112"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1105"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1114"/>
<source>Peony-Qt filesafe menu Extension</source>
<translation></translation>
</message>
@ -1391,7 +1399,7 @@
</message>
<message>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="731"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1031"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1033"/>
<source>Cut</source>
<translation></translation>
</message>
@ -1427,19 +1435,19 @@
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1009"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1010"/>
<source>Restore</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="765"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="822"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1017"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1018"/>
<source>Delete</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1082"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1084"/>
<source>Error</source>
<translation></translation>
</message>
@ -1515,13 +1523,13 @@
</message>
<message>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1000"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1020"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1021"/>
<source>Delete Permanently</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1000"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1020"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1021"/>
<source>Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again.</source>
<translation></translation>
</message>
@ -1530,12 +1538,12 @@
<translation type="vanished">(&amp;R)</translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1038"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1040"/>
<source>Clean All</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1054"/>
<location filename="../../libpeony-qt/controls/menu/directory-view-menu/directory-view-menu.cpp" line="1056"/>
<source>Open Parent Folder in New Window</source>
<translation></translation>
</message>
@ -1699,13 +1707,13 @@ Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd.</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="170"/>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="365"/>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="171"/>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="366"/>
<source>File copy error</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="373"/>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="374"/>
<source>Cannot opening file, permission denied!</source>
<translation></translation>
</message>
@ -1875,12 +1883,12 @@ Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd.</source>
<context>
<name>Peony::FileLabelInternalMenuPlugin</name>
<message>
<location filename="../../libpeony-qt/controls/menu/menu-plugin-manager.cpp" line="176"/>
<location filename="../../libpeony-qt/controls/menu/menu-plugin-manager.cpp" line="181"/>
<source>Add File Label...</source>
<translation>...</translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/menu/menu-plugin-manager.cpp" line="199"/>
<location filename="../../libpeony-qt/controls/menu/menu-plugin-manager.cpp" line="204"/>
<source>Delete All Label</source>
<translation></translation>
</message>
@ -2071,12 +2079,12 @@ Do you want to delete the link file?</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-move-operation.cpp" line="1083"/>
<location filename="../../libpeony-qt/file-operation/file-move-operation.cpp" line="1090"/>
<source>Invalid Operation.</source>
<translation>.</translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-move-operation.cpp" line="1098"/>
<location filename="../../libpeony-qt/file-operation/file-move-operation.cpp" line="1105"/>
<source>File delete error</source>
<translation></translation>
</message>
@ -2085,7 +2093,7 @@ Do you want to delete the link file?</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-move-operation.cpp" line="1100"/>
<location filename="../../libpeony-qt/file-operation/file-move-operation.cpp" line="1107"/>
<source>Invalid Operation</source>
<translation></translation>
</message>
@ -2281,8 +2289,8 @@ Do you want to delete the link file?</source>
<context>
<name>Peony::FileOperationInfo</name>
<message>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="710"/>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="712"/>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="718"/>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="720"/>
<source>Symbolic Link</source>
<translation></translation>
</message>
@ -2298,42 +2306,42 @@ Do you want to delete the link file?</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="185"/>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="189"/>
<source>Warn</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="185"/>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="189"/>
<source>&apos;%1&apos; is occupiedyou cannot operate!</source>
<translation>%1</translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="202"/>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="208"/>
<source>No, go to settings</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="203"/>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="209"/>
<source>Do you want to put selected %1 item(s) into trash?</source>
<translation> %1</translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="288"/>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="296"/>
<source>Can&apos;t delete.</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="289"/>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="297"/>
<source>You can&apos;t delete a file whenthe file is doing another operation</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="366"/>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="374"/>
<source>File Operation is Busy</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="367"/>
<location filename="../../libpeony-qt/file-operation/file-operation-manager.cpp" line="375"/>
<source>There have been one or more fileoperation(s) executing before. Youroperation will wait for executinguntil it/them done. If you really want to execute file operations parallelly anyway, you can change the default option &quot;Allow Parallel&quot; in option menu.</source>
<translation>, . , &quot;&quot;.</translation>
</message>
@ -2664,23 +2672,23 @@ Do you want to delete the link file?</source>
<name>Peony::GlobalSettings</name>
<message>
<location filename="../../libpeony-qt/global-settings.cpp" line="74"/>
<location filename="../../libpeony-qt/global-settings.cpp" line="298"/>
<location filename="../../libpeony-qt/global-settings.cpp" line="310"/>
<source>yyyy/MM/dd</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/global-settings.cpp" line="75"/>
<location filename="../../libpeony-qt/global-settings.cpp" line="291"/>
<location filename="../../libpeony-qt/global-settings.cpp" line="303"/>
<source>HH:mm:ss</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/global-settings.cpp" line="288"/>
<location filename="../../libpeony-qt/global-settings.cpp" line="300"/>
<source>AP hh:mm:ss</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/global-settings.cpp" line="301"/>
<location filename="../../libpeony-qt/global-settings.cpp" line="313"/>
<source>yyyy-MM-dd</source>
<translation></translation>
</message>
@ -3110,6 +3118,15 @@ Do you want to delete the link file?</source>
<translation>WPS文件</translation>
</message>
</context>
<context>
<name>Peony::SharedFileLinkOperation</name>
<message>
<location filename="../../libpeony-qt/file-operation/shared-file-link-operation.cpp" line="44"/>
<location filename="../../libpeony-qt/file-operation/shared-file-link-operation.cpp" line="47"/>
<source>Symbolic Link</source>
<translation></translation>
</message>
</context>
<context>
<name>Peony::SideBarFavoriteItem</name>
<message>
@ -3275,73 +3292,73 @@ Do you want to delete the link file?</source>
<translation type="vanished">(&amp;T)</translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="137"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="138"/>
<source>Sort Type</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="139"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="140"/>
<source>File Name</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="145"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="146"/>
<source>File Type</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="148"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="149"/>
<source>File Size</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="142"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="143"/>
<source>Modified Date</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="71"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="72"/>
<source>Open in New window</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="73"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="74"/>
<source>Open in new Tab</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="159"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="160"/>
<source>Ascending</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="155"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="156"/>
<source>Descending</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="189"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="345"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="190"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="347"/>
<source>Copy</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="192"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="193"/>
<source>Paste</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="195"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="196"/>
<source>Cut</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="198"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="199"/>
<source>Trash</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="215"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="216"/>
<source>Clean Trash</source>
<translation></translation>
</message>
@ -3350,62 +3367,62 @@ Do you want to delete the link file?</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="217"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="218"/>
<source>Delete Permanently</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="217"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="218"/>
<source>Are you sure that you want to delete these files? Once you start a deletion, the files deleting will never be restored again.</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="227"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="229"/>
<source>Restore</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="276"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="278"/>
<source>Options</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="279"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="281"/>
<source>Forbid Thumbnail</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="286"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="288"/>
<source>Show Hidden</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="293"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="295"/>
<source>Resident in Backend</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="294"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="296"/>
<source>Let the program still run after closing the last window. This will reduce the time for the next launch, but it will also consume resources in backend.</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="306"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="308"/>
<source>&amp;Help</source>
<translation>(&amp;H)</translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="312"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="314"/>
<source>&amp;About...</source>
<translation>...(&amp;A)</translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="314"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="316"/>
<source>Peony Qt</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="315"/>
<location filename="../../libpeony-qt/controls/tool-bar/tool-bar.cpp" line="317"/>
<source>Author:
Yue Lan &lt;lanyue@kylinos.cn&gt;
Meihong He &lt;hemeihong@kylinos.cn&gt;
@ -3604,27 +3621,27 @@ Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd.</source>
<translation type="vanished">使,使</translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="331"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="355"/>
<source>Format failed</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="333"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="357"/>
<source>YES</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="721"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="745"/>
<source>Formatting successful! But failed to set the device name.</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="730"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="754"/>
<source>qmesg_notify</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="719"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="743"/>
<source>Format operation has been finished successfully.</source>
<translation></translation>
</message>
@ -3633,35 +3650,35 @@ Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd.</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="730"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="754"/>
<source>Sorry, the format operation is failed!</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="738"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="762"/>
<source>Formatting this volume will erase all data on it. Please backup all retained data before formatting. Do you want to continue ?</source>
<translation>?</translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="719"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="721"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="740"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="743"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="745"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="764"/>
<source>format</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="742"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="766"/>
<source>begin format</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="744"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="768"/>
<source>close</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/sync-thread.cpp" line="41"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="660"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="684"/>
<source>File Manager</source>
<translation></translation>
</message>
@ -3670,14 +3687,14 @@ Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd.</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1381"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1390"/>
<source>Force unmount failed</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/model/side-bar-net-work-item.cpp" line="129"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1381"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="329"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1390"/>
<location filename="../../libpeony-qt/windows/format_dialog.cpp" line="353"/>
<source>Error: %1
</source>
<translation>: %1
@ -3685,32 +3702,32 @@ Copyright (C): 2019, Tianjin KYLIN Information Technology Co., Ltd.</source>
</message>
<message>
<location filename="../../libpeony-qt/model/side-bar-net-work-item.cpp" line="135"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1384"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1434"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1393"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1443"/>
<source>Data synchronization is complete,the device has been unmount successfully!</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/model/side-bar-net-work-item.cpp" line="124"/>
<location filename="../../libpeony-qt/model/side-bar-net-work-item.cpp" line="129"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1413"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1416"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1422"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1425"/>
<source>Unmount failed</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1401"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1410"/>
<source>Not authorized to perform operation.</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/model/side-bar-net-work-item.cpp" line="124"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1413"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1422"/>
<source>Unable to unmount it, you may need to close some programs, such as: GParted etc.</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1416"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1425"/>
<source>Error: %1
Do you want to unmount forcely?</source>
<translation>: %1
@ -3725,13 +3742,13 @@ Do you want to unmount forcely?</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../../libpeony-qt/volumeManager.cpp" line="912"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="921"/>
<source>The device has been mount successfully!</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1097"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1130"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1106"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1139"/>
<source>Data synchronization is complete and the device can be safely unplugged!</source>
<translation></translation>
</message>
@ -3744,9 +3761,9 @@ Do you want to unmount forcely?</source>
<translation type="vanished"></translation>
</message>
<message>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1092"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1124"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1401"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1101"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1133"/>
<location filename="../../libpeony-qt/volumeManager.cpp" line="1410"/>
<source>Eject failed</source>
<translation></translation>
</message>
@ -3859,10 +3876,10 @@ Do you want to unmount forcely?</source>
<translation></translation>
</message>
<message>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="280"/>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="297"/>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="313"/>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="489"/>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="281"/>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="298"/>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="314"/>
<location filename="../../libpeony-qt/file-operation/file-copy-operation.cpp" line="490"/>
<location filename="../../libpeony-qt/file-utils.cpp" line="155"/>
<location filename="../../libpeony-qt/file-utils.cpp" line="177"/>
<location filename="../../libpeony-qt/file-utils.cpp" line="199"/>