feat(torrent): complete lifecycle controls and diagnostics

- add durable Torrent telemetry, availability, sharing, relocation, and web-seed workflows\n- fence queue ownership, lifecycle recovery, persistence, and native control races\n- add localized UI, generated bindings, regression coverage, and smoke validation
This commit is contained in:
NimBold
2026-08-04 01:18:24 +03:30
parent 55a905df14
commit 579a8f7f80
33 changed files with 3505 additions and 139 deletions
+49 -6
View File
@@ -96,6 +96,7 @@ const uk = {
completed: 'Завершено',
failed: 'Помилка',
retrying: 'Повторна спроба',
moving: 'Переміщення даних',
},
values: {
processing: 'Обробка…',
@@ -288,11 +289,16 @@ const uk = {
torrentPieceProgressSummary: '{{completed}} із {{total}} частин завершено · по {{size}} на частину',
torrentPieceProgressMap: 'Карта завершення частин торрента',
torrentWebSeeds: 'Вебсіди торента',
torrentWebSeedsHint: 'Один рядок на сід у форматі індекс файлу|HTTP(S)-URI. Firelink сам розгортає шляхи багатофайлових торентів.',
torrentWebSeedsPlaceholder: '0|https://дзеркало.example/torrent/',
torrentWebSeedsHint: 'Додайте одну базову HTTP(S)-адресу для кожного файлу торента. Firelink сам розгорне шляхи багатофайлового торента.',
torrentWebSeedsApply: 'Застосувати вебсіди',
torrentWebSeedsLoading: 'Застосування…',
torrentWebSeedsFailed: 'Не вдалося перевірити або застосувати вебсіди торента.',
torrentWebSeedsEmpty: 'Вебсіди не налаштовано.',
torrentWebSeedsFile: 'Файл',
torrentWebSeedsUri: 'Базова HTTP(S)-адреса',
torrentWebSeedsAdd: 'Додати вебсід',
torrentWebSeedsRemove: 'Видалити вебсід',
torrentWebSeedsInvalid: 'Кожен рядок вебсіду має містити дійсний файл торента й базову HTTP(S)-адресу без облікових даних або фрагмента.',
torrentPeerCount: '{{total}} пірів · {{seeders}} сідів',
torrentPeerDownload: 'Завантаження',
torrentPeerUpload: 'Віддача',
@@ -300,12 +306,22 @@ const uk = {
torrentPeerAmChoking: 'Firelink обмежує',
torrentPeerChoking: 'Пір обмежує',
torrentPeerShowing: 'Показано {{shown}} із {{total}} пірів.',
torrentStatistics: 'Статистика торента',
torrentUploaded: 'Віддано',
torrentRatio: 'Коефіцієнт',
torrentSeededDuration: 'Час роздачі',
torrentConnectedPeers: 'Піри',
torrentSeeders: 'Сіди',
torrentUploadSpeed: 'Швидкість віддачі',
seconds: 'секунд',
torrentStopTimeout: 'Зупиняти торрент без швидкості через',
torrentStopTimeoutHint: 'Aria2 зупинить цей торрент після вказаної кількості секунд поспіль зі швидкістю 0 Б/с. 0 вимикає правило; зміни застосовуються під час запуску або повторної спроби.',
torrentStopTimeoutInvalid: 'Тайм-аут зупинки торрента має бути цілим числом від 0 до 604800 секунд',
torrentPrioritizePiece: 'Пріоритет частин торрента',
torrentPrioritizePieceHint: 'Необов’язкова політика попереднього перегляду Aria2: початок, кінець або обидва варіанти; для кожного можна вказати розмір, наприклад 1M. Застосовується під час запуску або повторної спроби.',
torrentPrioritizePiece: 'Пріоритет перших/останніх частин для попереднього перегляду',
torrentPrioritizePieceHead: 'Пріоритет перших частин',
torrentPrioritizePieceTail: 'Пріоритет останніх частин',
torrentPrioritizePieceSize: 'Розмір діапазону попереднього перегляду',
torrentPrioritizePieceHint: 'Необов’язкова політика попереднього перегляду. Кожен увімкнений діапазон за замовчуванням має розмір 1M і застосовується під час запуску або повторної спроби.',
torrentPrioritizePieceInvalid: 'Пріоритет частин торрента має містити початок і/або кінець із необов’язковим розміром від 1K до 1024M',
torrentEncryptionPolicy: 'Політика шифрування Torrent',
torrentFileAllocation: 'Виділення місця для файлів Torrent',
@@ -314,6 +330,28 @@ const uk = {
torrentFileAllocationHint: 'Попереднє виділення резервує місце до передачі; виділення за потреби не робить початкового резервування.',
torrentEncryptionPolicyHint: 'Застосовується під час запуску або повторної спроби Torrent. Виберіть одну політику, щоб параметри handshake і шифрування payload залишалися узгодженими.',
torrentDetails: 'Відомості про Torrent',
torrentCopyMagnet: 'Копіювати magnet-посилання',
torrentExportMetadata: 'Експортувати .torrent',
torrentMagnetCopied: 'Magnet-посилання лише з ідентифікатором скопійовано.',
torrentMagnetCopyFailed: 'Не вдалося скопіювати magnet-посилання.',
torrentMetadataExported: 'Метадані Torrent експортовано.',
torrentMetadataExportFailed: 'Не вдалося експортувати метадані Torrent.',
torrentMove: 'Перемістити дані…',
torrentMoveLoading: 'Переміщення…',
torrentMoveCancel: 'Скасувати переміщення',
torrentMoveCancelRequested: 'Запит на скасування надіслано…',
torrentMoveConfirm: 'Перемістити керовані дані Torrent до цієї папки? Наявні файли не перезаписуються.',
torrentMoveCompleted: 'Дані Torrent переміщено.',
torrentMoveFailed: 'Не вдалося перемістити дані Torrent.',
torrentAvailability: 'Доступність рою',
torrentAvailabilityRefresh: 'Оновити',
torrentAvailabilityLoading: 'Завантаження доступності…',
torrentAvailabilityUnavailable: 'Доступність доступна для активного або призупиненого Torrent.',
torrentAvailabilityFailed: 'Не вдалося прочитати доступність Torrent.',
torrentAvailabilityHint: 'Показано лише агреговані копії; ідентифікатори пірів і сирі бітові поля не розкриваються.',
torrentAvailabilitySummary: '{{availability}} доступних копій · {{peers}} підключених пірів · {{pieces}} частин',
torrentAvailabilityMap: 'Мапа доступності рою Torrent',
torrentAvailabilityBucket: 'Щонайменше {{copies}} копій у цьому діапазоні',
torrentDetailsLoading: 'Завантаження відомостей про Torrent…',
torrentDetailsUnavailable: 'Відомості про Torrent недоступні.',
torrentDetailsDisplayName: 'Назва',
@@ -513,12 +551,14 @@ const uk = {
moveOneFailed: 'Не вдалося перемістити завантаження до черги',
copyAddressesFailed: 'Не вдалося скопіювати адреси',
copyAddressFailed: 'Не вдалося скопіювати адресу',
copyMagnetFailed: 'Не вдалося скопіювати magnet-посилання',
copyPathFailed: 'Не вдалося скопіювати шлях до файлу',
missingFileName: 'Ім\'я файлу відсутнє',
redownloadFailed: 'Не вдалося повторно завантажити',
startResume: 'Запустити/Відновити',
addToQueue: 'Додати до черги',
copyAddress: 'Скопіювати адресу',
copyMagnet: 'Копіювати magnet-посилання',
remove: 'Видалити',
open: 'Відкрити',
showInFolder: 'Показати в папці',
@@ -603,8 +643,11 @@ const uk = {
torrentStopTimeout: 'Зупиняти торрент без швидкості через',
torrentStopTimeoutHint: 'Aria2 зупинить цей торрент після вказаної кількості секунд поспіль зі швидкістю 0 Б/с. 0 вимикає правило.',
torrentStopTimeoutInvalid: 'Тайм-аут зупинки торрента має бути цілим числом від 0 до 604800 секунд',
torrentPrioritizePiece: 'Пріоритет частин торрента',
torrentPrioritizePieceHint: 'Зберігається разом із торрентом і застосовується під час наступного запуску або повторної спроби. Укажіть початок, кінець або обидва варіанти з розміром K чи M.',
torrentPrioritizePiece: 'Пріоритет перших/останніх частин для попереднього перегляду',
torrentPrioritizePieceHead: 'Пріоритет перших частин',
torrentPrioritizePieceTail: 'Пріоритет останніх частин',
torrentPrioritizePieceSize: 'Розмір діапазону попереднього перегляду',
torrentPrioritizePieceHint: 'Виберіть перші, останні частини або обидва варіанти для попереднього перегляду. Кожен увімкнений діапазон за замовчуванням має розмір 1M і застосовується під час наступного запуску або повторної спроби.',
torrentPrioritizePieceInvalid: 'Пріоритет частин торрента має містити початок і/або кінець із необов’язковим розміром від 1K до 1024M',
torrentEncryptionPolicy: 'Політика шифрування Torrent',
torrentEncryptionPolicyHint: 'Зберігається разом із Torrent і застосовується під час наступного запуску або повторної спроби. Вибрана політика узгоджує параметри шифрування Aria2.',