fix(backup): add user-state backup UI and storage

This commit is contained in:
Will Miao
2026-04-10 20:49:30 +08:00
parent 85b6c91192
commit 72f8e0d1be
25 changed files with 1825 additions and 9 deletions

View File

@@ -263,6 +263,7 @@
"videoSettings": "Video-Einstellungen",
"layoutSettings": "Layout-Einstellungen",
"misc": "Verschiedenes",
"backup": "Backups",
"folderSettings": "Standard-Roots",
"recipeSettings": "Rezepte",
"extraFolderPaths": "Zusätzliche Ordnerpfade",
@@ -324,6 +325,31 @@
"saveFailed": "Übersprungene Pfade konnten nicht gespeichert werden: {message}"
}
},
"backup": {
"autoEnabled": "Automatische Backups",
"autoEnabledHelp": "Erstellt einmal täglich einen lokalen Schnappschuss und behält die neuesten Schnappschüsse gemäß der Aufbewahrungsrichtlinie.",
"retention": "Aufbewahrungsanzahl",
"retentionHelp": "Wie viele automatische Schnappschüsse behalten werden, bevor ältere entfernt werden.",
"management": "Backup-Verwaltung",
"managementHelp": "Exportiere deinen aktuellen Benutzerstatus oder stelle ihn aus einem Backup-Archiv wieder her.",
"locationSummary": "Aktueller Backup-Speicherort",
"openFolderButton": "Backup-Ordner öffnen",
"openFolderSuccess": "Backup-Ordner geöffnet",
"openFolderFailed": "Backup-Ordner konnte nicht geöffnet werden",
"locationCopied": "Backup-Pfad in die Zwischenablage kopiert: {{path}}",
"locationClipboardFallback": "Backup-Pfad: {{path}}",
"exportButton": "Backup exportieren",
"exportSuccess": "Backup erfolgreich exportiert.",
"exportFailed": "Backup konnte nicht exportiert werden: {message}",
"importButton": "Backup importieren",
"importConfirm": "Dieses Backup importieren und den lokalen Benutzerstatus überschreiben?",
"importSuccess": "Backup erfolgreich importiert.",
"importFailed": "Backup konnte nicht importiert werden: {message}",
"latestSnapshot": "Neuester Schnappschuss",
"latestAutoSnapshot": "Neuester automatischer Schnappschuss",
"snapshotCount": "Gespeicherte Schnappschüsse",
"noneAvailable": "Noch keine Schnappschüsse vorhanden"
},
"downloadSkipBaseModels": {
"label": "Downloads für Basismodelle überspringen",
"help": "Gilt für alle Download-Abläufe. Hier können nur unterstützte Basismodelle ausgewählt werden.",

View File

@@ -263,6 +263,7 @@
"videoSettings": "Video Settings",
"layoutSettings": "Layout Settings",
"misc": "Miscellaneous",
"backup": "Backups",
"folderSettings": "Default Roots",
"recipeSettings": "Recipes",
"extraFolderPaths": "Extra Folder Paths",
@@ -324,6 +325,31 @@
"saveFailed": "Unable to save skip paths: {message}"
}
},
"backup": {
"autoEnabled": "Automatic backups",
"autoEnabledHelp": "Create a local snapshot once per day and keep the latest snapshots according to the retention policy.",
"retention": "Retention count",
"retentionHelp": "How many automatic snapshots to keep before older ones are pruned.",
"management": "Backup management",
"managementHelp": "Export your current user state or restore it from a backup archive.",
"locationSummary": "Current backup location",
"openFolderButton": "Open backup folder",
"openFolderSuccess": "Opened backup folder",
"openFolderFailed": "Failed to open backup folder",
"locationCopied": "Backup path copied to clipboard: {{path}}",
"locationClipboardFallback": "Backup path: {{path}}",
"exportButton": "Export backup",
"exportSuccess": "Backup exported successfully.",
"exportFailed": "Failed to export backup: {message}",
"importButton": "Import backup",
"importConfirm": "Import this backup and overwrite local user state?",
"importSuccess": "Backup imported successfully.",
"importFailed": "Failed to import backup: {message}",
"latestSnapshot": "Latest snapshot",
"latestAutoSnapshot": "Latest automatic snapshot",
"snapshotCount": "Saved snapshots",
"noneAvailable": "No snapshots yet"
},
"downloadSkipBaseModels": {
"label": "Skip downloads for base models",
"help": "When enabled, versions using the selected base models will be skipped.",

View File

@@ -263,6 +263,7 @@
"videoSettings": "Configuración de video",
"layoutSettings": "Configuración de diseño",
"misc": "Varios",
"backup": "Copias de seguridad",
"folderSettings": "Raíces predeterminadas",
"recipeSettings": "Recetas",
"extraFolderPaths": "Rutas de carpetas adicionales",
@@ -324,6 +325,31 @@
"saveFailed": "No se pudieron guardar las rutas a omitir: {message}"
}
},
"backup": {
"autoEnabled": "Copias de seguridad automáticas",
"autoEnabledHelp": "Crea una instantánea local una vez al día y conserva las más recientes según la política de retención.",
"retention": "Cantidad de retención",
"retentionHelp": "Cuántas instantáneas automáticas conservar antes de eliminar las antiguas.",
"management": "Gestión de copias",
"managementHelp": "Exporta tu estado de usuario actual o restáuralo desde un archivo de copia de seguridad.",
"locationSummary": "Ubicación actual de la copia",
"openFolderButton": "Abrir carpeta de copias",
"openFolderSuccess": "Carpeta de copias abierta",
"openFolderFailed": "No se pudo abrir la carpeta de copias",
"locationCopied": "Ruta de la copia copiada al portapapeles: {{path}}",
"locationClipboardFallback": "Ruta de la copia: {{path}}",
"exportButton": "Exportar copia",
"exportSuccess": "Copia exportada correctamente.",
"exportFailed": "No se pudo exportar la copia: {message}",
"importButton": "Importar copia",
"importConfirm": "¿Importar esta copia y sobrescribir el estado local del usuario?",
"importSuccess": "Copia importada correctamente.",
"importFailed": "No se pudo importar la copia: {message}",
"latestSnapshot": "Última instantánea",
"latestAutoSnapshot": "Última instantánea automática",
"snapshotCount": "Instantáneas guardadas",
"noneAvailable": "Aún no hay instantáneas"
},
"downloadSkipBaseModels": {
"label": "Omitir descargas para modelos base",
"help": "Se aplica a todos los flujos de descarga. Aquí solo se pueden seleccionar modelos base compatibles.",

View File

@@ -263,6 +263,7 @@
"videoSettings": "Paramètres vidéo",
"layoutSettings": "Paramètres d'affichage",
"misc": "Divers",
"backup": "Sauvegardes",
"folderSettings": "Racines par défaut",
"recipeSettings": "Recipes",
"extraFolderPaths": "Chemins de dossiers supplémentaires",
@@ -324,6 +325,31 @@
"saveFailed": "Impossible d'enregistrer les chemins à ignorer : {message}"
}
},
"backup": {
"autoEnabled": "Sauvegardes automatiques",
"autoEnabledHelp": "Crée un instantané local une fois par jour et conserve les plus récents selon la politique de rétention.",
"retention": "Nombre de rétention",
"retentionHelp": "Combien d'instantanés automatiques conserver avant de supprimer les plus anciens.",
"management": "Gestion des sauvegardes",
"managementHelp": "Exporte l'état actuel de l'utilisateur ou restaure-le depuis une archive de sauvegarde.",
"locationSummary": "Emplacement actuel des sauvegardes",
"openFolderButton": "Ouvrir le dossier de sauvegarde",
"openFolderSuccess": "Dossier de sauvegarde ouvert",
"openFolderFailed": "Impossible d'ouvrir le dossier de sauvegarde",
"locationCopied": "Chemin de sauvegarde copié dans le presse-papiers : {{path}}",
"locationClipboardFallback": "Chemin de sauvegarde : {{path}}",
"exportButton": "Exporter la sauvegarde",
"exportSuccess": "Sauvegarde exportée avec succès.",
"exportFailed": "Échec de l'export de la sauvegarde : {message}",
"importButton": "Importer la sauvegarde",
"importConfirm": "Importer cette sauvegarde et écraser l'état local de l'utilisateur ?",
"importSuccess": "Sauvegarde importée avec succès.",
"importFailed": "Échec de l'import de la sauvegarde : {message}",
"latestSnapshot": "Dernier instantané",
"latestAutoSnapshot": "Dernier instantané automatique",
"snapshotCount": "Instantanés enregistrés",
"noneAvailable": "Aucun instantané pour le moment"
},
"downloadSkipBaseModels": {
"label": "Ignorer les téléchargements pour certains modèles de base",
"help": "Sapplique à tous les flux de téléchargement. Seuls les modèles de base pris en charge peuvent être sélectionnés ici.",

View File

@@ -263,6 +263,7 @@
"videoSettings": "הגדרות וידאו",
"layoutSettings": "הגדרות פריסה",
"misc": "שונות",
"backup": "גיבויים",
"folderSettings": "תיקיות ברירת מחדל",
"recipeSettings": "מתכונים",
"extraFolderPaths": "נתיבי תיקיות נוספים",
@@ -324,6 +325,31 @@
"saveFailed": "לא ניתן לשמור נתיבי דילוג: {message}"
}
},
"backup": {
"autoEnabled": "גיבויים אוטומטיים",
"autoEnabledHelp": "יוצר צילום מצב מקומי פעם ביום ושומר את הצילומים האחרונים לפי מדיניות השמירה.",
"retention": "כמות שמירה",
"retentionHelp": "כמה צילומי מצב אוטומטיים לשמור לפני שמסירים ישנים.",
"management": "ניהול גיבויים",
"managementHelp": "ייצא את מצב המשתמש הנוכחי או שחזר אותו מארכיון גיבוי.",
"locationSummary": "מיקום הגיבוי הנוכחי",
"openFolderButton": "פתח את תיקיית הגיבויים",
"openFolderSuccess": "תיקיית הגיבויים נפתחה",
"openFolderFailed": "לא ניתן היה לפתוח את תיקיית הגיבויים",
"locationCopied": "נתיב הגיבוי הועתק ללוח: {{path}}",
"locationClipboardFallback": "נתיב הגיבוי: {{path}}",
"exportButton": "ייצא גיבוי",
"exportSuccess": "הגיבוי יוצא בהצלחה.",
"exportFailed": "נכשל ייצוא הגיבוי: {message}",
"importButton": "ייבא גיבוי",
"importConfirm": "לייבא את הגיבוי הזה ולדרוס את מצב המשתמש המקומי?",
"importSuccess": "הגיבוי יובא בהצלחה.",
"importFailed": "נכשל ייבוא הגיבוי: {message}",
"latestSnapshot": "צילום המצב האחרון",
"latestAutoSnapshot": "צילום המצב האוטומטי האחרון",
"snapshotCount": "צילומי מצב שמורים",
"noneAvailable": "עדיין אין צילומי מצב"
},
"downloadSkipBaseModels": {
"label": "דלג על הורדות עבור מודלי בסיס",
"help": "חל על כל תהליכי ההורדה. ניתן לבחור כאן רק מודלי בסיס נתמכים.",

View File

@@ -263,6 +263,7 @@
"videoSettings": "動画設定",
"layoutSettings": "レイアウト設定",
"misc": "その他",
"backup": "バックアップ",
"folderSettings": "デフォルトルート",
"recipeSettings": "レシピ",
"extraFolderPaths": "追加フォルダーパス",
@@ -324,6 +325,31 @@
"saveFailed": "スキップパスの保存に失敗しました:{message}"
}
},
"backup": {
"autoEnabled": "自動バックアップ",
"autoEnabledHelp": "1日1回ローカルのスナップショットを作成し、保持ポリシーに従って最新のものを残します。",
"retention": "保持数",
"retentionHelp": "古いものを削除する前に、何件の自動スナップショットを保持するかを指定します。",
"management": "バックアップ管理",
"managementHelp": "現在のユーザー状態をエクスポートするか、バックアップアーカイブから復元します。",
"locationSummary": "現在のバックアップ場所",
"openFolderButton": "バックアップフォルダを開く",
"openFolderSuccess": "バックアップフォルダを開きました",
"openFolderFailed": "バックアップフォルダを開けませんでした",
"locationCopied": "バックアップパスをクリップボードにコピーしました: {{path}}",
"locationClipboardFallback": "バックアップパス: {{path}}",
"exportButton": "バックアップをエクスポート",
"exportSuccess": "バックアップを正常にエクスポートしました。",
"exportFailed": "バックアップのエクスポートに失敗しました: {message}",
"importButton": "バックアップをインポート",
"importConfirm": "このバックアップをインポートして、ローカルのユーザー状態を上書きしますか?",
"importSuccess": "バックアップを正常にインポートしました。",
"importFailed": "バックアップのインポートに失敗しました: {message}",
"latestSnapshot": "最新のスナップショット",
"latestAutoSnapshot": "最新の自動スナップショット",
"snapshotCount": "保存済みスナップショット",
"noneAvailable": "まだスナップショットはありません"
},
"downloadSkipBaseModels": {
"label": "ベースモデルのダウンロードをスキップ",
"help": "すべてのダウンロードフローに適用されます。ここでは対応しているベースモデルのみ選択できます。",

View File

@@ -263,6 +263,7 @@
"videoSettings": "비디오 설정",
"layoutSettings": "레이아웃 설정",
"misc": "기타",
"backup": "백업",
"folderSettings": "기본 루트",
"recipeSettings": "레시피",
"extraFolderPaths": "추가 폴다 경로",
@@ -324,6 +325,31 @@
"saveFailed": "건너뛰기 경로를 저장할 수 없습니다: {message}"
}
},
"backup": {
"autoEnabled": "자동 백업",
"autoEnabledHelp": "하루에 한 번 로컬 스냅샷을 만들고 보존 정책에 따라 최신 스냅샷을 유지합니다.",
"retention": "보존 개수",
"retentionHelp": "오래된 자동 스냅샷을 삭제하기 전에 몇 개를 유지할지 지정합니다.",
"management": "백업 관리",
"managementHelp": "현재 사용자 상태를 내보내거나 백업 아카이브에서 복원합니다.",
"locationSummary": "현재 백업 위치",
"openFolderButton": "백업 폴더 열기",
"openFolderSuccess": "백업 폴더를 열었습니다",
"openFolderFailed": "백업 폴더를 열지 못했습니다",
"locationCopied": "백업 경로를 클립보드에 복사했습니다: {{path}}",
"locationClipboardFallback": "백업 경로: {{path}}",
"exportButton": "백업 내보내기",
"exportSuccess": "백업을 성공적으로 내보냈습니다.",
"exportFailed": "백업 내보내기에 실패했습니다: {message}",
"importButton": "백업 가져오기",
"importConfirm": "이 백업을 가져와서 로컬 사용자 상태를 덮어쓰시겠습니까?",
"importSuccess": "백업을 성공적으로 가져왔습니다.",
"importFailed": "백업 가져오기에 실패했습니다: {message}",
"latestSnapshot": "최근 스냅샷",
"latestAutoSnapshot": "최근 자동 스냅샷",
"snapshotCount": "저장된 스냅샷",
"noneAvailable": "아직 스냅샷이 없습니다"
},
"downloadSkipBaseModels": {
"label": "기본 모델 다운로드 건너뛰기",
"help": "모든 다운로드 흐름에 적용됩니다. 여기서는 지원되는 기본 모델만 선택할 수 있습니다.",

View File

@@ -263,6 +263,7 @@
"videoSettings": "Настройки видео",
"layoutSettings": "Настройки макета",
"misc": "Разное",
"backup": "Резервные копии",
"folderSettings": "Корневые папки",
"recipeSettings": "Рецепты",
"extraFolderPaths": "Дополнительные пути к папкам",
@@ -324,6 +325,31 @@
"saveFailed": "Не удалось сохранить пути для пропуска: {message}"
}
},
"backup": {
"autoEnabled": "Автоматические резервные копии",
"autoEnabledHelp": "Создаёт локальный снимок раз в день и хранит последние снимки согласно политике хранения.",
"retention": "Количество хранения",
"retentionHelp": "Сколько автоматических снимков сохранять перед удалением старых.",
"management": "Управление резервными копиями",
"managementHelp": "Экспортируйте текущее состояние пользователя или восстановите его из архива резервной копии.",
"locationSummary": "Текущее расположение резервных копий",
"openFolderButton": "Открыть папку резервных копий",
"openFolderSuccess": "Папка резервных копий открыта",
"openFolderFailed": "Не удалось открыть папку резервных копий",
"locationCopied": "Путь к резервной копии скопирован в буфер обмена: {{path}}",
"locationClipboardFallback": "Путь к резервной копии: {{path}}",
"exportButton": "Экспортировать резервную копию",
"exportSuccess": "Резервная копия успешно экспортирована.",
"exportFailed": "Не удалось экспортировать резервную копию: {message}",
"importButton": "Импортировать резервную копию",
"importConfirm": "Импортировать эту резервную копию и перезаписать локальное состояние пользователя?",
"importSuccess": "Резервная копия успешно импортирована.",
"importFailed": "Не удалось импортировать резервную копию: {message}",
"latestSnapshot": "Последний снимок",
"latestAutoSnapshot": "Последний автоматический снимок",
"snapshotCount": "Сохранённые снимки",
"noneAvailable": "Снимков пока нет"
},
"downloadSkipBaseModels": {
"label": "Пропускать загрузки для базовых моделей",
"help": "Применяется ко всем сценариям загрузки. Здесь можно выбрать только поддерживаемые базовые модели.",

View File

@@ -263,6 +263,7 @@
"videoSettings": "视频设置",
"layoutSettings": "布局设置",
"misc": "其他",
"backup": "备份",
"folderSettings": "默认根目录",
"recipeSettings": "配方",
"extraFolderPaths": "额外文件夹路径",
@@ -324,6 +325,31 @@
"saveFailed": "无法保存跳过路径:{message}"
}
},
"backup": {
"autoEnabled": "自动备份",
"autoEnabledHelp": "每天创建一次本地快照,并按保留策略保留最新快照。",
"retention": "保留数量",
"retentionHelp": "在删除旧快照之前,要保留多少个自动快照。",
"management": "备份管理",
"managementHelp": "导出当前用户状态,或从备份归档中恢复。",
"locationSummary": "当前备份位置",
"openFolderButton": "打开备份文件夹",
"openFolderSuccess": "已打开备份文件夹",
"openFolderFailed": "无法打开备份文件夹",
"locationCopied": "备份路径已复制到剪贴板:{{path}}",
"locationClipboardFallback": "备份路径:{{path}}",
"exportButton": "导出备份",
"exportSuccess": "备份导出成功。",
"exportFailed": "备份导出失败:{message}",
"importButton": "导入备份",
"importConfirm": "导入此备份并覆盖本地用户状态吗?",
"importSuccess": "备份导入成功。",
"importFailed": "备份导入失败:{message}",
"latestSnapshot": "最近快照",
"latestAutoSnapshot": "最近自动快照",
"snapshotCount": "已保存快照",
"noneAvailable": "还没有快照"
},
"downloadSkipBaseModels": {
"label": "跳过这些基础模型的下载",
"help": "适用于所有下载流程。这里只能选择受支持的基础模型。",

View File

@@ -263,6 +263,7 @@
"videoSettings": "影片設定",
"layoutSettings": "版面設定",
"misc": "其他",
"backup": "備份",
"folderSettings": "預設根目錄",
"recipeSettings": "配方",
"extraFolderPaths": "額外資料夾路徑",
@@ -324,6 +325,31 @@
"saveFailed": "無法儲存跳過路徑:{message}"
}
},
"backup": {
"autoEnabled": "自動備份",
"autoEnabledHelp": "每天建立一次本地快照,並依保留政策保留最新快照。",
"retention": "保留數量",
"retentionHelp": "在刪除舊快照之前,要保留多少自動快照。",
"management": "備份管理",
"managementHelp": "匯出目前的使用者狀態,或從備份封存中還原。",
"locationSummary": "目前備份位置",
"openFolderButton": "開啟備份資料夾",
"openFolderSuccess": "已開啟備份資料夾",
"openFolderFailed": "無法開啟備份資料夾",
"locationCopied": "備份路徑已複製到剪貼簿:{{path}}",
"locationClipboardFallback": "備份路徑:{{path}}",
"exportButton": "匯出備份",
"exportSuccess": "備份匯出成功。",
"exportFailed": "備份匯出失敗:{message}",
"importButton": "匯入備份",
"importConfirm": "要匯入此備份並覆寫本機使用者狀態嗎?",
"importSuccess": "備份匯入成功。",
"importFailed": "備份匯入失敗:{message}",
"latestSnapshot": "最近快照",
"latestAutoSnapshot": "最近自動快照",
"snapshotCount": "已儲存快照",
"noneAvailable": "目前還沒有快照"
},
"downloadSkipBaseModels": {
"label": "跳過這些基礎模型的下載",
"help": "適用於所有下載流程。這裡只能選擇受支援的基礎模型。",