diff --git a/electron/electron-down.js b/electron/electron-down.js index 1ef300a6f..696ff0bed 100644 --- a/electron/electron-down.js +++ b/electron/electron-down.js @@ -11,17 +11,18 @@ const store = new Store(); const downloadManager = new DownloadManager(); let downloadWindow = null; -function initialize(options = {}) { +function initialize(onStarted= null) { // 下载配置 electronDl({ showBadge: false, showProgressBar: false, - ...options, - onStarted: (item) => { downloadManager.add(item); syncDownloadItems(); + if (typeof onStarted === 'function') { + onStarted(item) + } }, onCancel: (item) => { downloadManager.refresh(item.getSavePath()) @@ -110,11 +111,406 @@ function getLanguagePack(codeOrPack) { return codeOrPack; } const code = (codeOrPack || 'zh').toString(); - return { - code, - title: '下载管理器', - // todo - } + const packs = { + zh: { + // 语言设置 + locale: 'zh-CN', + title: '下载管理器', + + // 界面文本 + searchPlaceholder: '搜索文件名或链接...', + noItems: '暂无任务', + noSearchResult: '未找到匹配的结果', + + // 操作按钮 + refresh: '刷新', + removeAll: "清空历史", + copyLink: '复制链接', + resume: '继续', + pause: '暂停', + cancel: '取消', + remove: '删除', + showInFolder: '显示在文件夹', + + // 状态文本 + progressing: '下载中', + completed: '已完成', + cancelled: '已取消', + interrupted: '失败', + paused: '已暂停', + + // 成功消息 + copied: "已复制", + refreshSuccess: '刷新成功', + + // 确认对话框 + confirmCancel: '确定要取消此下载任务并删除记录吗?', + confirmRemove: '确定要从历史记录中删除此项吗?', + confirmRemoveAll: '确定要清空下载历史吗?', + + // 错误消息 + copyFailed: '复制失败: ', + pauseFailed: '暂停失败: ', + resumeFailed: '继续失败: ', + removeFailed: '删除失败: ', + removeAllFailed: '清空失败: ', + openFailed: '打开文件失败: ', + showFailed: '显示文件失败: ', + }, + 'zh-CHT': { + locale: 'zh-TW', + title: '下載管理器', + + // 界面文本 + searchPlaceholder: '搜尋檔案名稱或連結...', + noItems: '暫無任務', + noSearchResult: '未找到匹配的結果', + + // 操作按钮 + refresh: '重新整理', + removeAll: "清空歷史", + copyLink: '複製連結', + resume: '繼續', + pause: '暫停', + cancel: '取消', + remove: '刪除', + showInFolder: '顯示在資料夾', + + // 状态文本 + progressing: '下載中', + completed: '已完成', + cancelled: '已取消', + interrupted: '失敗', + paused: '已暫停', + + // 成功消息 + copied: "已複製", + refreshSuccess: '重新整理成功', + + // 确认对话框 + confirmCancel: '確定要取消此下載任務並刪除記錄嗎?', + confirmRemove: '確定要從歷史記錄中刪除此項嗎?', + confirmRemoveAll: '確定要清空下載歷史嗎?', + + // 错误消息 + copyFailed: '複製失敗: ', + pauseFailed: '暫停失敗: ', + resumeFailed: '繼續失敗: ', + removeFailed: '刪除失敗: ', + removeAllFailed: '清空失敗: ', + openFailed: '開啟檔案失敗: ', + showFailed: '顯示檔案失敗: ', + }, + en: { + locale: 'en-US', + title: 'Download Manager', + + // 界面文本 + searchPlaceholder: 'Search filename or link...', + noItems: 'No tasks', + noSearchResult: 'No matching results found', + + // 操作按钮 + refresh: 'Refresh', + removeAll: "Clear History", + copyLink: 'Copy Link', + resume: 'Resume', + pause: 'Pause', + cancel: 'Cancel', + remove: 'Remove', + showInFolder: 'Show in Folder', + + // 状态文本 + progressing: 'Downloading', + completed: 'Completed', + cancelled: 'Cancelled', + interrupted: 'Failed', + paused: 'Paused', + + // 成功消息 + copied: "Copied", + refreshSuccess: 'Refresh successful', + + // 确认对话框 + confirmCancel: 'Are you sure you want to cancel this download task and delete the record?', + confirmRemove: 'Are you sure you want to remove this item from history?', + confirmRemoveAll: 'Are you sure you want to clear download history?', + + // 错误消息 + copyFailed: 'Copy failed: ', + pauseFailed: 'Pause failed: ', + resumeFailed: 'Resume failed: ', + removeFailed: 'Remove failed: ', + removeAllFailed: 'Clear failed: ', + openFailed: 'Open file failed: ', + showFailed: 'Show file failed: ', + }, + ko: { + locale: 'ko-KR', + title: '다운로드 관리자', + + // 界面文本 + searchPlaceholder: '파일명 또는 링크 검색...', + noItems: '작업 없음', + noSearchResult: '일치하는 결과를 찾을 수 없습니다', + + // 操作按钮 + refresh: '새로고침', + removeAll: "기록 지우기", + copyLink: '링크 복사', + resume: '계속', + pause: '일시정지', + cancel: '취소', + remove: '삭제', + showInFolder: '폴더에서 보기', + + // 状态文本 + progressing: '다운로드 중', + completed: '완료됨', + cancelled: '취소됨', + interrupted: '실패', + paused: '일시정지됨', + + // 成功消息 + copied: "복사됨", + refreshSuccess: '새로고침 성공', + + // 确认对话框 + confirmCancel: '이 다운로드 작업을 취소하고 기록을 삭제하시겠습니까?', + confirmRemove: '기록에서 이 항목을 삭제하시겠습니까?', + confirmRemoveAll: '다운로드 기록을 지우시겠습니까?', + + // 错误消息 + copyFailed: '복사 실패: ', + pauseFailed: '일시정지 실패: ', + resumeFailed: '계속 실패: ', + removeFailed: '삭제 실패: ', + removeAllFailed: '지우기 실패: ', + openFailed: '파일 열기 실패: ', + showFailed: '파일 표시 실패: ', + }, + ja: { + locale: 'ja-JP', + title: 'ダウンロードマネージャー', + + // 界面文本 + searchPlaceholder: 'ファイル名またはリンクを検索...', + noItems: 'タスクがありません', + noSearchResult: '一致する結果が見つかりません', + + // 操作按钮 + refresh: '更新', + removeAll: "履歴をクリア", + copyLink: 'リンクをコピー', + resume: '再開', + pause: '一時停止', + cancel: 'キャンセル', + remove: '削除', + showInFolder: 'フォルダで表示', + + // 状态文本 + progressing: 'ダウンロード中', + completed: '完了', + cancelled: 'キャンセル済み', + interrupted: '失敗', + paused: '一時停止中', + + // 成功消息 + copied: "コピーしました", + refreshSuccess: '更新が完了しました', + + // 确认对话框 + confirmCancel: 'このダウンロードタスクをキャンセルして記録を削除しますか?', + confirmRemove: '履歴からこの項目を削除しますか?', + confirmRemoveAll: 'ダウンロード履歴をクリアしますか?', + + // 错误消息 + copyFailed: 'コピーに失敗しました: ', + pauseFailed: '一時停止に失敗しました: ', + resumeFailed: '再開に失敗しました: ', + removeFailed: '削除に失敗しました: ', + removeAllFailed: 'クリアに失敗しました: ', + openFailed: 'ファイルを開けませんでした: ', + showFailed: 'ファイルの表示に失敗しました: ', + }, + de: { + locale: 'de-DE', + title: 'Download-Manager', + + // 界面文本 + searchPlaceholder: 'Dateiname oder Link suchen...', + noItems: 'Keine Aufgaben', + noSearchResult: 'Keine übereinstimmenden Ergebnisse gefunden', + + // 操作按钮 + refresh: 'Aktualisieren', + removeAll: "Verlauf löschen", + copyLink: 'Link kopieren', + resume: 'Fortsetzen', + pause: 'Pause', + cancel: 'Abbrechen', + remove: 'Entfernen', + showInFolder: 'Im Ordner anzeigen', + + // 状态文本 + progressing: 'Wird heruntergeladen', + completed: 'Abgeschlossen', + cancelled: 'Abgebrochen', + interrupted: 'Fehlgeschlagen', + paused: 'Pausiert', + + // 成功消息 + copied: "Kopiert", + refreshSuccess: 'Erfolgreich aktualisiert', + + // 确认对话框 + confirmCancel: 'Sind Sie sicher, dass Sie diese Download-Aufgabe abbrechen und den Eintrag löschen möchten?', + confirmRemove: 'Sind Sie sicher, dass Sie diesen Eintrag aus dem Verlauf entfernen möchten?', + confirmRemoveAll: 'Sind Sie sicher, dass Sie den Download-Verlauf löschen möchten?', + + // 错误消息 + copyFailed: 'Kopieren fehlgeschlagen: ', + pauseFailed: 'Pause fehlgeschlagen: ', + resumeFailed: 'Fortsetzen fehlgeschlagen: ', + removeFailed: 'Entfernen fehlgeschlagen: ', + removeAllFailed: 'Löschen fehlgeschlagen: ', + openFailed: 'Datei öffnen fehlgeschlagen: ', + showFailed: 'Datei anzeigen fehlgeschlagen: ', + }, + fr: { + locale: 'fr-FR', + title: 'Gestionnaire de téléchargements', + + // 界面文本 + searchPlaceholder: 'Rechercher nom de fichier ou lien...', + noItems: 'Aucune tâche', + noSearchResult: 'Aucun résultat correspondant trouvé', + + // 操作按钮 + refresh: 'Actualiser', + removeAll: "Effacer l'historique", + copyLink: 'Copier le lien', + resume: 'Reprendre', + pause: 'Pause', + cancel: 'Annuler', + remove: 'Supprimer', + showInFolder: 'Afficher dans le dossier', + + // 状态文本 + progressing: 'Téléchargement en cours', + completed: 'Terminé', + cancelled: 'Annulé', + interrupted: 'Échoué', + paused: 'En pause', + + // 成功消息 + copied: "Copié", + refreshSuccess: 'Actualisation réussie', + + // 确认对话框 + confirmCancel: 'Êtes-vous sûr de vouloir annuler cette tâche de téléchargement et supprimer l\'enregistrement ?', + confirmRemove: 'Êtes-vous sûr de vouloir supprimer cet élément de l\'historique ?', + confirmRemoveAll: 'Êtes-vous sûr de vouloir effacer l\'historique des téléchargements ?', + + // 错误消息 + copyFailed: 'Échec de la copie : ', + pauseFailed: 'Échec de la pause : ', + resumeFailed: 'Échec de la reprise : ', + removeFailed: 'Échec de la suppression : ', + removeAllFailed: 'Échec de l\'effacement : ', + openFailed: 'Échec de l\'ouverture du fichier : ', + showFailed: 'Échec de l\'affichage du fichier : ', + }, + id: { + locale: 'id-ID', + title: 'Manajer Unduhan', + + // 界面文本 + searchPlaceholder: 'Cari nama file atau tautan...', + noItems: 'Tidak ada tugas', + noSearchResult: 'Tidak ada hasil yang cocok ditemukan', + + // 操作按钮 + refresh: 'Segarkan', + removeAll: "Hapus Riwayat", + copyLink: 'Salin Tautan', + resume: 'Lanjutkan', + pause: 'Jeda', + cancel: 'Batal', + remove: 'Hapus', + showInFolder: 'Tampilkan di Folder', + + // 状态文本 + progressing: 'Mengunduh', + completed: 'Selesai', + cancelled: 'Dibatalkan', + interrupted: 'Gagal', + paused: 'Dijeda', + + // 成功消息 + copied: "Disalin", + refreshSuccess: 'Berhasil disegarkan', + + // 确认对话框 + confirmCancel: 'Apakah Anda yakin ingin membatalkan tugas unduhan ini dan menghapus catatan?', + confirmRemove: 'Apakah Anda yakin ingin menghapus item ini dari riwayat?', + confirmRemoveAll: 'Apakah Anda yakin ingin menghapus riwayat unduhan?', + + // 错误消息 + copyFailed: 'Gagal menyalin: ', + pauseFailed: 'Gagal menjeda: ', + resumeFailed: 'Gagal melanjutkan: ', + removeFailed: 'Gagal menghapus: ', + removeAllFailed: 'Gagal menghapus: ', + openFailed: 'Gagal membuka file: ', + showFailed: 'Gagal menampilkan file: ', + }, + ru: { + locale: 'ru-RU', + title: 'Менеджер загрузок', + + // 界面文本 + searchPlaceholder: 'Поиск имени файла или ссылки...', + noItems: 'Нет задач', + noSearchResult: 'Совпадающих результатов не найдено', + + // 操作按钮 + refresh: 'Обновить', + removeAll: "Очистить историю", + copyLink: 'Копировать ссылку', + resume: 'Возобновить', + pause: 'Пауза', + cancel: 'Отмена', + remove: 'Удалить', + showInFolder: 'Показать в папке', + + // 状态文本 + progressing: 'Загружается', + completed: 'Завершено', + cancelled: 'Отменено', + interrupted: 'Ошибка', + paused: 'На паузе', + + // 成功消息 + copied: "Скопировано", + refreshSuccess: 'Успешно обновлено', + + // 确认对话框 + confirmCancel: 'Вы уверены, что хотите отменить эту задачу загрузки и удалить запись?', + confirmRemove: 'Вы уверены, что хотите удалить этот элемент из истории?', + confirmRemoveAll: 'Вы уверены, что хотите очистить историю загрузок?', + + // 错误消息 + copyFailed: 'Ошибка копирования: ', + pauseFailed: 'Ошибка паузы: ', + resumeFailed: 'Ошибка возобновления: ', + removeFailed: 'Ошибка удаления: ', + removeAllFailed: 'Ошибка очистки: ', + openFailed: 'Ошибка открытия файла: ', + showFailed: 'Ошибка отображения файла: ', + } + }; + return packs[code] || packs.zh; } async function open(language = 'zh', theme = 'light') { diff --git a/electron/electron.js b/electron/electron.js index 6d07f4d7c..036ed7c64 100644 --- a/electron/electron.js +++ b/electron/electron.js @@ -124,7 +124,11 @@ if (!fs.existsSync(cacheDir)) { } // 初始化下载 -electronDown.initialize() +electronDown.initialize(() => { + if (mainWindow) { + mainWindow.webContents.send("openDownloadWindow", {}) + } +}) /** * 启动web服务 diff --git a/electron/package.json b/electron/package.json index 127fa5248..08bd55012 100755 --- a/electron/package.json +++ b/electron/package.json @@ -26,7 +26,6 @@ "url": "https://github.com/kuaifan/dootask.git" }, "devDependencies": { - "@dootask/electron-dl": "^4.0.0-rc.2", "@electron-forge/cli": "^7.8.3", "@electron-forge/maker-deb": "^7.8.3", "@electron-forge/maker-rpm": "^7.8.3", @@ -43,6 +42,7 @@ "ora": "^4.1.1" }, "dependencies": { + "@dootask/electron-dl": "^4.0.0-rc.2", "axios": "^1.11.0", "crc": "^3.8.0", "dayjs": "^1.11.13", @@ -80,6 +80,7 @@ "render/**/*", "public/**/*", "utils/**/*", + "electron-down.js", "electron-menu.js", "electron-preload.js", "electron.js" diff --git a/electron/render/download/index.html b/electron/render/download/index.html index cd7d8bfd1..6feb6ba3f 100644 --- a/electron/render/download/index.html +++ b/electron/render/download/index.html @@ -138,7 +138,7 @@ items: [], lang: { // 语言设置 - locale: 'zh', + locale: 'zh-CN', title: '下载管理器', // 界面文本 @@ -437,19 +437,7 @@ formatTime(timestamp) { if (!timestamp) return ''; const date = new Date(timestamp * 1000); - const locales = { - "zh": "zh-CN", - "zh-CHT": "zh-TW", - "en": "en-US", - "ko": "ko-KR", - "ja": "ja-JP", - "de": "de-DE", - "fr": "fr-FR", - "id": "id-ID", - "ru": "ru-RU" - }; - const locale = locales[this.lang?.locale] || this.lang?.locale || locales['en']; - return date.toLocaleString(locale, { + return date.toLocaleString(this.lang?.locale || "zh-CN", { year: 'numeric', month: '2-digit', day: '2-digit', diff --git a/electron/utils/download.js b/electron/utils/download.js index 8c024ff6d..339a64c40 100644 --- a/electron/utils/download.js +++ b/electron/utils/download.js @@ -1,3 +1,4 @@ +const path = require("path"); const loger = require("electron-log"); const Store = require('electron-store'); const utils = require("./index"); @@ -32,7 +33,7 @@ class DownloadManager { */ convert(downloadItem) { return { - filename: downloadItem.getFilename(), + filename: path.basename(downloadItem.getSavePath()) || downloadItem.getFilename(), path: downloadItem.getSavePath(), url: downloadItem.getURL(), urls: downloadItem.getURLChain(), diff --git a/resources/assets/js/App.vue b/resources/assets/js/App.vue index 56158f045..872ddfab2 100755 --- a/resources/assets/js/App.vue +++ b/resources/assets/js/App.vue @@ -149,7 +149,7 @@ export default { }, computed: { - ...mapState(['ws', 'themeConf', 'windowOrientation', 'safeAreaSize', 'isFirstPage', 'mobileTabbar']), + ...mapState(['ws', 'themeConf', 'windowOrientation', 'safeAreaSize', 'isFirstPage', 'mobileTabbar', 'themeName']), statusColor({routeName, windowLandscape}) { if (!routeName) { @@ -615,6 +615,13 @@ export default { this.$Electron.listener('systemThemeChanged', _ => { this.autoTheme() }) + this.$Electron.listener('openDownloadWindow', _ => { + $A.Electron.request({ + action: 'openDownloadWindow', + language: languageName, + theme: this.themeName, + }); + }) $A.bindScreenshotKey(this.$store.state.cacheKeyboard); // this.$Electron.sendMessage('setMenuLanguage', { diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index 66bf9d426..a92aff363 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -469,11 +469,6 @@ export default { action: 'createDownload', url }); - $A.Electron.request({ - action: 'openDownloadWindow', - language: languageName, - theme: state.themeName, - }); } else if ($A.isEEUIApp) { $A.eeuiAppOpenWeb(url); } else {