diff --git a/src/components/download/DownloadStatusBar.svelte b/src/components/download/DownloadStatusBar.svelte new file mode 100644 index 00000000..3a461499 --- /dev/null +++ b/src/components/download/DownloadStatusBar.svelte @@ -0,0 +1,284 @@ + + +{#if visible} +
+{/if} + + diff --git a/src/lib/i18n/el.json b/src/lib/i18n/el.json index 5ecb6c95..8b84cd98 100644 --- a/src/lib/i18n/el.json +++ b/src/lib/i18n/el.json @@ -567,6 +567,16 @@ "copied": "Το αρχείο καταγραφής αντιγράφηκε", "copy_failed": "Αποτυχία αντιγραφής αρχείου καταγραφής", "empty": "Δεν υπάρχουν ακόμη γραμμές" + }, + "status_bar": { + "region_label": "Πρόοδος λήψεων", + "active": "{{count}} σε λήψη", + "queued": "{{count}} σε αναμονή", + "paused_all": "Όλες σε παύση", + "eta": "Απομένουν {{eta}}", + "open": "Προβολή λήψεων", + "indeterminate": "Λήψη σε εξέλιξη, άγνωστο συνολικό μέγεθος", + "complete": "Οι λήψεις ολοκληρώθηκαν" } }, "toast": { diff --git a/src/lib/i18n/en.json b/src/lib/i18n/en.json index 41efb90d..c66dcbb0 100644 --- a/src/lib/i18n/en.json +++ b/src/lib/i18n/en.json @@ -567,6 +567,16 @@ "copied": "Log copied to clipboard", "copy_failed": "Couldn't copy log", "empty": "No log lines yet" + }, + "status_bar": { + "region_label": "Download progress", + "active": "{{count}} downloading", + "queued": "{{count}} queued", + "paused_all": "All paused", + "eta": "ETA {{eta}}", + "open": "View downloads", + "indeterminate": "Downloading, total size unknown", + "complete": "Downloads complete" } }, "toast": { diff --git a/src/lib/i18n/es.json b/src/lib/i18n/es.json index 68fe53b7..b48d0153 100644 --- a/src/lib/i18n/es.json +++ b/src/lib/i18n/es.json @@ -567,6 +567,16 @@ "copied": "Registro copiado al portapapeles", "copy_failed": "No se pudo copiar el registro", "empty": "Aún no hay líneas en el registro" + }, + "status_bar": { + "region_label": "Progreso de descargas", + "active": "{{count}} descargando", + "queued": "{{count}} en cola", + "paused_all": "Todas en pausa", + "eta": "Quedan {{eta}}", + "open": "Ver descargas", + "indeterminate": "Descargando, tamaño total desconocido", + "complete": "Descargas completadas" } }, "toast": { diff --git a/src/lib/i18n/fa.json b/src/lib/i18n/fa.json index beb36529..c08f4f8e 100644 --- a/src/lib/i18n/fa.json +++ b/src/lib/i18n/fa.json @@ -567,6 +567,16 @@ "copied": "Log copied to clipboard", "copy_failed": "Couldn't copy log", "empty": "No log lines yet" + }, + "status_bar": { + "region_label": "پیشرفت دانلود", + "active": "{{count}} در حال دانلود", + "queued": "{{count}} در صف", + "paused_all": "همه متوقف شده", + "eta": "{{eta}} باقیمانده", + "open": "مشاهده دانلودها", + "indeterminate": "در حال دانلود، حجم کل نامشخص", + "complete": "دانلودها کامل شد" } }, "toast": { diff --git a/src/lib/i18n/fr.json b/src/lib/i18n/fr.json index d4456d52..36237692 100644 --- a/src/lib/i18n/fr.json +++ b/src/lib/i18n/fr.json @@ -567,6 +567,16 @@ "copied": "Journal copié", "copy_failed": "Impossible de copier le journal", "empty": "Aucune ligne dans le journal pour l'instant" + }, + "status_bar": { + "region_label": "Progression des téléchargements", + "active": "{{count}} en cours", + "queued": "{{count}} en file", + "paused_all": "Tout en pause", + "eta": "{{eta}} restant", + "open": "Voir les téléchargements", + "indeterminate": "Téléchargement, taille totale inconnue", + "complete": "Téléchargements terminés" } }, "toast": { diff --git a/src/lib/i18n/it.json b/src/lib/i18n/it.json index 029cf4f4..a0b79ab2 100644 --- a/src/lib/i18n/it.json +++ b/src/lib/i18n/it.json @@ -567,6 +567,16 @@ "copied": "Log copiato", "copy_failed": "Impossibile copiare il log", "empty": "Nessuna riga di log ancora" + }, + "status_bar": { + "region_label": "Avanzamento download", + "active": "{{count}} in download", + "queued": "{{count}} in coda", + "paused_all": "Tutti in pausa", + "eta": "{{eta}} rimanenti", + "open": "Vedi download", + "indeterminate": "Download in corso, dimensione totale sconosciuta", + "complete": "Download completati" } }, "toast": { diff --git a/src/lib/i18n/ja.json b/src/lib/i18n/ja.json index bba82dbe..b693fd27 100644 --- a/src/lib/i18n/ja.json +++ b/src/lib/i18n/ja.json @@ -567,6 +567,16 @@ "copied": "ログをコピーしました", "copy_failed": "ログをコピーできませんでした", "empty": "まだログがありません" + }, + "status_bar": { + "region_label": "ダウンロードの進行状況", + "active": "{{count}} 件ダウンロード中", + "queued": "{{count}} 件キュー待ち", + "paused_all": "すべて一時停止中", + "eta": "残り {{eta}}", + "open": "ダウンロードを表示", + "indeterminate": "ダウンロード中、合計サイズ不明", + "complete": "ダウンロード完了" } }, "toast": { diff --git a/src/lib/i18n/keys.ts b/src/lib/i18n/keys.ts index 1999db3c..b76ebf9e 100644 --- a/src/lib/i18n/keys.ts +++ b/src/lib/i18n/keys.ts @@ -230,6 +230,14 @@ export type TranslationKeys = | 'downloads.status.paused' | 'downloads.status.queued' | 'downloads.status.seeding' + | 'downloads.status_bar.active' + | 'downloads.status_bar.complete' + | 'downloads.status_bar.eta' + | 'downloads.status_bar.indeterminate' + | 'downloads.status_bar.open' + | 'downloads.status_bar.paused_all' + | 'downloads.status_bar.queued' + | 'downloads.status_bar.region_label' | 'downloads.stop' | 'downloads.sw.autofix' | 'downloads.sw.autofix_none' diff --git a/src/lib/i18n/pt.json b/src/lib/i18n/pt.json index 763edb6e..0a6a1765 100644 --- a/src/lib/i18n/pt.json +++ b/src/lib/i18n/pt.json @@ -567,6 +567,16 @@ "copied": "Log copiado", "copy_failed": "Não foi possível copiar o log", "empty": "Nenhuma linha no log ainda" + }, + "status_bar": { + "region_label": "Progresso dos downloads", + "active": "{{count}} baixando", + "queued": "{{count}} na fila", + "paused_all": "Todos pausados", + "eta": "Faltam {{eta}}", + "open": "Ver downloads", + "indeterminate": "Baixando, tamanho total desconhecido", + "complete": "Downloads concluídos" } }, "toast": { diff --git a/src/lib/i18n/ru.json b/src/lib/i18n/ru.json index 94aac135..b51dfda3 100644 --- a/src/lib/i18n/ru.json +++ b/src/lib/i18n/ru.json @@ -567,6 +567,16 @@ "copied": "Лог скопирован в буфер обмена", "copy_failed": "Не удалось скопировать лог", "empty": "Пока нет строк лога" + }, + "status_bar": { + "region_label": "Прогресс загрузок", + "active": "Загружается: {{count}}", + "queued": "В очереди: {{count}}", + "paused_all": "Все на паузе", + "eta": "Осталось {{eta}}", + "open": "Открыть загрузки", + "indeterminate": "Загрузка, общий размер неизвестен", + "complete": "Загрузки завершены" } }, "toast": { diff --git a/src/lib/i18n/zh-TW.json b/src/lib/i18n/zh-TW.json index bf63649a..97290092 100644 --- a/src/lib/i18n/zh-TW.json +++ b/src/lib/i18n/zh-TW.json @@ -567,6 +567,16 @@ "copied": "日誌已複製", "copy_failed": "無法複製日誌", "empty": "尚無日誌" + }, + "status_bar": { + "region_label": "下載進度", + "active": "{{count}} 個下載中", + "queued": "{{count}} 個佇列中", + "paused_all": "全部已暫停", + "eta": "剩餘 {{eta}}", + "open": "檢視下載", + "indeterminate": "正在下載,總大小未知", + "complete": "下載完成" } }, "toast": { diff --git a/src/lib/i18n/zh.json b/src/lib/i18n/zh.json index e0d9049c..6688246c 100644 --- a/src/lib/i18n/zh.json +++ b/src/lib/i18n/zh.json @@ -567,6 +567,16 @@ "copied": "日志已复制", "copy_failed": "无法复制日志", "empty": "暂无日志" + }, + "status_bar": { + "region_label": "下载进度", + "active": "{{count}} 个下载中", + "queued": "{{count}} 个排队中", + "paused_all": "全部已暂停", + "eta": "剩余 {{eta}}", + "open": "查看下载", + "indeterminate": "正在下载,总大小未知", + "complete": "下载完成" } }, "toast": { diff --git a/src/lib/stores/download-store.svelte.ts b/src/lib/stores/download-store.svelte.ts index 28969fa1..91b40065 100644 --- a/src/lib/stores/download-store.svelte.ts +++ b/src/lib/stores/download-store.svelte.ts @@ -56,12 +56,16 @@ export type SpeedPoint = { t: number; bps: number }; const SPEED_SMOOTHING = 0.3; const SPEED_HISTORY_MAX = 60; +const AGGREGATE_SAMPLE_MS = 900; let downloads = $state(new Map