feat(import): add import-only option for recipes without downloading missing LoRAs

Add dual-button design in recipe import flow:
- Details step: [Import Recipe Only] [Import & Download]
- Location step: [Back] [Import & Download] (removed redundant Import Only)

Changes:
- templates/components/import_modal.html: Add secondary button for import-only
- static/js/managers/ImportManager.js: Add saveRecipeOnlyFromDetails() method
- static/js/managers/import/RecipeDataManager.js: Update button state management
- static/js/managers/import/DownloadManager.js: Support skipDownload flag
- locales/*.json: Complete all translation TODOs

Closes #868
This commit is contained in:
Will Miao
2026-03-25 11:56:34 +08:00
parent 8b85e083e2
commit e97648c70b
14 changed files with 700 additions and 542 deletions

View File

@@ -645,6 +645,8 @@
"root": "Stammverzeichnis", "root": "Stammverzeichnis",
"browseFolders": "Ordner durchsuchen:", "browseFolders": "Ordner durchsuchen:",
"downloadAndSaveRecipe": "Herunterladen & Rezept speichern", "downloadAndSaveRecipe": "Herunterladen & Rezept speichern",
"importRecipeOnly": "Nur Rezept importieren",
"importAndDownload": "Importieren & Herunterladen",
"downloadMissingLoras": "Fehlende LoRAs herunterladen", "downloadMissingLoras": "Fehlende LoRAs herunterladen",
"saveRecipe": "Rezept speichern", "saveRecipe": "Rezept speichern",
"loraCountInfo": "({existing}/{total} in Bibliothek)", "loraCountInfo": "({existing}/{total} in Bibliothek)",
@@ -732,61 +734,61 @@
} }
}, },
"batchImport": { "batchImport": {
"title": "[TODO: Translate] Batch Import Recipes", "title": "Batch Import Recipes",
"action": "[TODO: Translate] Batch Import", "action": "Batch Import",
"urlList": "[TODO: Translate] URL List", "urlList": "URL List",
"directory": "[TODO: Translate] Directory", "directory": "Directory",
"urlDescription": "[TODO: Translate] Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.",
"directoryDescription": "[TODO: Translate] Enter a directory path to import all images from that folder.", "directoryDescription": "Enter a directory path to import all images from that folder.",
"urlsLabel": "[TODO: Translate] Image URLs or Local Paths", "urlsLabel": "Image URLs or Local Paths",
"urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "[TODO: Translate] Enter one URL or path per line", "urlsHint": "Enter one URL or path per line",
"directoryPath": "[TODO: Translate] Directory Path", "directoryPath": "Directory Path",
"directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", "directoryPlaceholder": "/path/to/images/folder",
"browse": "[TODO: Translate] Browse", "browse": "Browse",
"recursive": "[TODO: Translate] Include subdirectories", "recursive": "Include subdirectories",
"tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", "tagsOptional": "Tags (optional, applied to all recipes)",
"tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", "tagsPlaceholder": "Enter tags separated by commas",
"tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", "tagsHint": "Tags will be added to all imported recipes",
"skipNoMetadata": "[TODO: Translate] Skip images without metadata", "skipNoMetadata": "Skip images without metadata",
"skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.",
"start": "[TODO: Translate] Start Import", "start": "Start Import",
"startImport": "[TODO: Translate] Start Import", "startImport": "Start Import",
"importing": "[TODO: Translate] Importing...", "importing": "Importing...",
"progress": "[TODO: Translate] Progress", "progress": "Progress",
"total": "[TODO: Translate] Total", "total": "Total",
"success": "[TODO: Translate] Success", "success": "Success",
"failed": "[TODO: Translate] Failed", "failed": "Failed",
"skipped": "[TODO: Translate] Skipped", "skipped": "Skipped",
"current": "[TODO: Translate] Current", "current": "Current",
"currentItem": "[TODO: Translate] Current", "currentItem": "Current",
"preparing": "[TODO: Translate] Preparing...", "preparing": "Preparing...",
"cancel": "[TODO: Translate] Cancel", "cancel": "Cancel",
"cancelImport": "[TODO: Translate] Cancel", "cancelImport": "Cancel",
"cancelled": "[TODO: Translate] Import cancelled", "cancelled": "Import cancelled",
"completed": "[TODO: Translate] Import completed", "completed": "Import completed",
"completedWithErrors": "[TODO: Translate] Completed with errors", "completedWithErrors": "Completed with errors",
"completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", "completedSuccess": "Successfully imported {count} recipe(s)",
"successCount": "[TODO: Translate] Successful", "successCount": "Successful",
"failedCount": "[TODO: Translate] Failed", "failedCount": "Failed",
"skippedCount": "[TODO: Translate] Skipped", "skippedCount": "Skipped",
"totalProcessed": "[TODO: Translate] Total processed", "totalProcessed": "Total processed",
"viewDetails": "[TODO: Translate] View Details", "viewDetails": "View Details",
"newImport": "[TODO: Translate] New Import", "newImport": "New Import",
"manualPathEntry": "[TODO: Translate] Please enter the directory path manually. File browser is not available in this browser.", "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {name}. You may need to enter the full path manually.", "batchImportDirectorySelected": "Directory selected: {path}",
"batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.",
"backToParent": "[TODO: Translate] Back to parent directory", "backToParent": "Back to parent directory",
"folders": "[TODO: Translate] Folders", "folders": "Folders",
"folderCount": "[TODO: Translate] {count} folders", "folderCount": "{count} folders",
"imageFiles": "[TODO: Translate] Image Files", "imageFiles": "Image Files",
"images": "[TODO: Translate] images", "images": "images",
"imageCount": "[TODO: Translate] {count} images", "imageCount": "{count} images",
"selectFolder": "[TODO: Translate] Select This Folder", "selectFolder": "Select This Folder",
"errors": { "errors": {
"enterUrls": "[TODO: Translate] Please enter at least one URL or path", "enterUrls": "Please enter at least one URL or path",
"enterDirectory": "[TODO: Translate] Please enter a directory path", "enterDirectory": "Please enter a directory path",
"startFailed": "[TODO: Translate] Failed to start import: {message}" "startFailed": "Failed to start import: {message}"
} }
} }
}, },
@@ -1495,16 +1497,17 @@
"processingError": "Verarbeitungsfehler: {message}", "processingError": "Verarbeitungsfehler: {message}",
"folderBrowserError": "Fehler beim Laden des Ordner-Browsers: {message}", "folderBrowserError": "Fehler beim Laden des Ordner-Browsers: {message}",
"recipeSaveFailed": "Fehler beim Speichern des Rezepts: {error}", "recipeSaveFailed": "Fehler beim Speichern des Rezepts: {error}",
"recipeSaved": "Recipe saved successfully",
"importFailed": "Import fehlgeschlagen: {message}", "importFailed": "Import fehlgeschlagen: {message}",
"folderTreeFailed": "Fehler beim Laden des Ordnerbaums", "folderTreeFailed": "Fehler beim Laden des Ordnerbaums",
"folderTreeError": "Fehler beim Laden des Ordnerbaums", "folderTreeError": "Fehler beim Laden des Ordnerbaums",
"batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", "batchImportFailed": "Failed to start batch import: {message}",
"batchImportCancelling": "[TODO: Translate] Cancelling batch import...", "batchImportCancelling": "Cancelling batch import...",
"batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", "batchImportCancelFailed": "Failed to cancel batch import: {message}",
"batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", "batchImportNoUrls": "Please enter at least one URL or file path",
"batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", "batchImportNoDirectory": "Please enter a directory path",
"batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", "batchImportBrowseFailed": "Failed to browse directory: {message}",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" "batchImportDirectorySelected": "Directory selected: {path}"
}, },
"models": { "models": {
"noModelsSelected": "Keine Modelle ausgewählt", "noModelsSelected": "Keine Modelle ausgewählt",

View File

@@ -645,6 +645,8 @@
"root": "Root", "root": "Root",
"browseFolders": "Browse Folders:", "browseFolders": "Browse Folders:",
"downloadAndSaveRecipe": "Download & Save Recipe", "downloadAndSaveRecipe": "Download & Save Recipe",
"importRecipeOnly": "Import Recipe Only",
"importAndDownload": "Import & Download",
"downloadMissingLoras": "Download Missing LoRAs", "downloadMissingLoras": "Download Missing LoRAs",
"saveRecipe": "Save Recipe", "saveRecipe": "Save Recipe",
"loraCountInfo": "({existing}/{total} in library)", "loraCountInfo": "({existing}/{total} in library)",
@@ -1495,6 +1497,7 @@
"processingError": "Processing error: {message}", "processingError": "Processing error: {message}",
"folderBrowserError": "Error loading folder browser: {message}", "folderBrowserError": "Error loading folder browser: {message}",
"recipeSaveFailed": "Failed to save recipe: {error}", "recipeSaveFailed": "Failed to save recipe: {error}",
"recipeSaved": "Recipe saved successfully",
"importFailed": "Import failed: {message}", "importFailed": "Import failed: {message}",
"folderTreeFailed": "Failed to load folder tree", "folderTreeFailed": "Failed to load folder tree",
"folderTreeError": "Error loading folder tree", "folderTreeError": "Error loading folder tree",

View File

@@ -645,6 +645,8 @@
"root": "Raíz", "root": "Raíz",
"browseFolders": "Explorar carpetas:", "browseFolders": "Explorar carpetas:",
"downloadAndSaveRecipe": "Descargar y guardar receta", "downloadAndSaveRecipe": "Descargar y guardar receta",
"importRecipeOnly": "Importar solo la receta",
"importAndDownload": "Importar y descargar",
"downloadMissingLoras": "Descargar LoRAs faltantes", "downloadMissingLoras": "Descargar LoRAs faltantes",
"saveRecipe": "Guardar receta", "saveRecipe": "Guardar receta",
"loraCountInfo": "({existing}/{total} en la biblioteca)", "loraCountInfo": "({existing}/{total} en la biblioteca)",
@@ -732,61 +734,61 @@
} }
}, },
"batchImport": { "batchImport": {
"title": "[TODO: Translate] Batch Import Recipes", "title": "Batch Import Recipes",
"action": "[TODO: Translate] Batch Import", "action": "Batch Import",
"urlList": "[TODO: Translate] URL List", "urlList": "URL List",
"directory": "[TODO: Translate] Directory", "directory": "Directory",
"urlDescription": "[TODO: Translate] Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.",
"directoryDescription": "[TODO: Translate] Enter a directory path to import all images from that folder.", "directoryDescription": "Enter a directory path to import all images from that folder.",
"urlsLabel": "[TODO: Translate] Image URLs or Local Paths", "urlsLabel": "Image URLs or Local Paths",
"urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "[TODO: Translate] Enter one URL or path per line", "urlsHint": "Enter one URL or path per line",
"directoryPath": "[TODO: Translate] Directory Path", "directoryPath": "Directory Path",
"directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", "directoryPlaceholder": "/path/to/images/folder",
"browse": "[TODO: Translate] Browse", "browse": "Browse",
"recursive": "[TODO: Translate] Include subdirectories", "recursive": "Include subdirectories",
"tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", "tagsOptional": "Tags (optional, applied to all recipes)",
"tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", "tagsPlaceholder": "Enter tags separated by commas",
"tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", "tagsHint": "Tags will be added to all imported recipes",
"skipNoMetadata": "[TODO: Translate] Skip images without metadata", "skipNoMetadata": "Skip images without metadata",
"skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.",
"start": "[TODO: Translate] Start Import", "start": "Start Import",
"startImport": "[TODO: Translate] Start Import", "startImport": "Start Import",
"importing": "[TODO: Translate] Importing...", "importing": "Importing...",
"progress": "[TODO: Translate] Progress", "progress": "Progress",
"total": "[TODO: Translate] Total", "total": "Total",
"success": "[TODO: Translate] Success", "success": "Success",
"failed": "[TODO: Translate] Failed", "failed": "Failed",
"skipped": "[TODO: Translate] Skipped", "skipped": "Skipped",
"current": "[TODO: Translate] Current", "current": "Current",
"currentItem": "[TODO: Translate] Current", "currentItem": "Current",
"preparing": "[TODO: Translate] Preparing...", "preparing": "Preparing...",
"cancel": "[TODO: Translate] Cancel", "cancel": "Cancel",
"cancelImport": "[TODO: Translate] Cancel", "cancelImport": "Cancel",
"cancelled": "[TODO: Translate] Import cancelled", "cancelled": "Import cancelled",
"completed": "[TODO: Translate] Import completed", "completed": "Import completed",
"completedWithErrors": "[TODO: Translate] Completed with errors", "completedWithErrors": "Completed with errors",
"completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", "completedSuccess": "Successfully imported {count} recipe(s)",
"successCount": "[TODO: Translate] Successful", "successCount": "Successful",
"failedCount": "[TODO: Translate] Failed", "failedCount": "Failed",
"skippedCount": "[TODO: Translate] Skipped", "skippedCount": "Skipped",
"totalProcessed": "[TODO: Translate] Total processed", "totalProcessed": "Total processed",
"viewDetails": "[TODO: Translate] View Details", "viewDetails": "View Details",
"newImport": "[TODO: Translate] New Import", "newImport": "New Import",
"manualPathEntry": "[TODO: Translate] Please enter the directory path manually. File browser is not available in this browser.", "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {name}. You may need to enter the full path manually.", "batchImportDirectorySelected": "Directory selected: {path}",
"batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.",
"backToParent": "[TODO: Translate] Back to parent directory", "backToParent": "Back to parent directory",
"folders": "[TODO: Translate] Folders", "folders": "Folders",
"folderCount": "[TODO: Translate] {count} folders", "folderCount": "{count} folders",
"imageFiles": "[TODO: Translate] Image Files", "imageFiles": "Image Files",
"images": "[TODO: Translate] images", "images": "images",
"imageCount": "[TODO: Translate] {count} images", "imageCount": "{count} images",
"selectFolder": "[TODO: Translate] Select This Folder", "selectFolder": "Select This Folder",
"errors": { "errors": {
"enterUrls": "[TODO: Translate] Please enter at least one URL or path", "enterUrls": "Please enter at least one URL or path",
"enterDirectory": "[TODO: Translate] Please enter a directory path", "enterDirectory": "Please enter a directory path",
"startFailed": "[TODO: Translate] Failed to start import: {message}" "startFailed": "Failed to start import: {message}"
} }
} }
}, },
@@ -1495,16 +1497,17 @@
"processingError": "Error de procesamiento: {message}", "processingError": "Error de procesamiento: {message}",
"folderBrowserError": "Error cargando explorador de carpetas: {message}", "folderBrowserError": "Error cargando explorador de carpetas: {message}",
"recipeSaveFailed": "Error al guardar receta: {error}", "recipeSaveFailed": "Error al guardar receta: {error}",
"recipeSaved": "Recipe saved successfully",
"importFailed": "Importación falló: {message}", "importFailed": "Importación falló: {message}",
"folderTreeFailed": "Error al cargar árbol de carpetas", "folderTreeFailed": "Error al cargar árbol de carpetas",
"folderTreeError": "Error cargando árbol de carpetas", "folderTreeError": "Error cargando árbol de carpetas",
"batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", "batchImportFailed": "Failed to start batch import: {message}",
"batchImportCancelling": "[TODO: Translate] Cancelling batch import...", "batchImportCancelling": "Cancelling batch import...",
"batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", "batchImportCancelFailed": "Failed to cancel batch import: {message}",
"batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", "batchImportNoUrls": "Please enter at least one URL or file path",
"batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", "batchImportNoDirectory": "Please enter a directory path",
"batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", "batchImportBrowseFailed": "Failed to browse directory: {message}",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" "batchImportDirectorySelected": "Directory selected: {path}"
}, },
"models": { "models": {
"noModelsSelected": "No hay modelos seleccionados", "noModelsSelected": "No hay modelos seleccionados",

View File

@@ -645,6 +645,8 @@
"root": "Racine", "root": "Racine",
"browseFolders": "Parcourir les dossiers :", "browseFolders": "Parcourir les dossiers :",
"downloadAndSaveRecipe": "Télécharger et sauvegarder la recipe", "downloadAndSaveRecipe": "Télécharger et sauvegarder la recipe",
"importRecipeOnly": "Importer uniquement la recette",
"importAndDownload": "Importer et télécharger",
"downloadMissingLoras": "Télécharger les LoRAs manquants", "downloadMissingLoras": "Télécharger les LoRAs manquants",
"saveRecipe": "Sauvegarder la recipe", "saveRecipe": "Sauvegarder la recipe",
"loraCountInfo": "({existing}/{total} dans la bibliothèque)", "loraCountInfo": "({existing}/{total} dans la bibliothèque)",
@@ -732,61 +734,61 @@
} }
}, },
"batchImport": { "batchImport": {
"title": "[TODO: Translate] Batch Import Recipes", "title": "Batch Import Recipes",
"action": "[TODO: Translate] Batch Import", "action": "Batch Import",
"urlList": "[TODO: Translate] URL List", "urlList": "URL List",
"directory": "[TODO: Translate] Directory", "directory": "Directory",
"urlDescription": "[TODO: Translate] Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.",
"directoryDescription": "[TODO: Translate] Enter a directory path to import all images from that folder.", "directoryDescription": "Enter a directory path to import all images from that folder.",
"urlsLabel": "[TODO: Translate] Image URLs or Local Paths", "urlsLabel": "Image URLs or Local Paths",
"urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "[TODO: Translate] Enter one URL or path per line", "urlsHint": "Enter one URL or path per line",
"directoryPath": "[TODO: Translate] Directory Path", "directoryPath": "Directory Path",
"directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", "directoryPlaceholder": "/path/to/images/folder",
"browse": "[TODO: Translate] Browse", "browse": "Browse",
"recursive": "[TODO: Translate] Include subdirectories", "recursive": "Include subdirectories",
"tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", "tagsOptional": "Tags (optional, applied to all recipes)",
"tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", "tagsPlaceholder": "Enter tags separated by commas",
"tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", "tagsHint": "Tags will be added to all imported recipes",
"skipNoMetadata": "[TODO: Translate] Skip images without metadata", "skipNoMetadata": "Skip images without metadata",
"skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.",
"start": "[TODO: Translate] Start Import", "start": "Start Import",
"startImport": "[TODO: Translate] Start Import", "startImport": "Start Import",
"importing": "[TODO: Translate] Importing...", "importing": "Importing...",
"progress": "[TODO: Translate] Progress", "progress": "Progress",
"total": "[TODO: Translate] Total", "total": "Total",
"success": "[TODO: Translate] Success", "success": "Success",
"failed": "[TODO: Translate] Failed", "failed": "Failed",
"skipped": "[TODO: Translate] Skipped", "skipped": "Skipped",
"current": "[TODO: Translate] Current", "current": "Current",
"currentItem": "[TODO: Translate] Current", "currentItem": "Current",
"preparing": "[TODO: Translate] Preparing...", "preparing": "Preparing...",
"cancel": "[TODO: Translate] Cancel", "cancel": "Cancel",
"cancelImport": "[TODO: Translate] Cancel", "cancelImport": "Cancel",
"cancelled": "[TODO: Translate] Import cancelled", "cancelled": "Import cancelled",
"completed": "[TODO: Translate] Import completed", "completed": "Import completed",
"completedWithErrors": "[TODO: Translate] Completed with errors", "completedWithErrors": "Completed with errors",
"completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", "completedSuccess": "Successfully imported {count} recipe(s)",
"successCount": "[TODO: Translate] Successful", "successCount": "Successful",
"failedCount": "[TODO: Translate] Failed", "failedCount": "Failed",
"skippedCount": "[TODO: Translate] Skipped", "skippedCount": "Skipped",
"totalProcessed": "[TODO: Translate] Total processed", "totalProcessed": "Total processed",
"viewDetails": "[TODO: Translate] View Details", "viewDetails": "View Details",
"newImport": "[TODO: Translate] New Import", "newImport": "New Import",
"manualPathEntry": "[TODO: Translate] Please enter the directory path manually. File browser is not available in this browser.", "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {name}. You may need to enter the full path manually.", "batchImportDirectorySelected": "Directory selected: {path}",
"batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.",
"backToParent": "[TODO: Translate] Back to parent directory", "backToParent": "Back to parent directory",
"folders": "[TODO: Translate] Folders", "folders": "Folders",
"folderCount": "[TODO: Translate] {count} folders", "folderCount": "{count} folders",
"imageFiles": "[TODO: Translate] Image Files", "imageFiles": "Image Files",
"images": "[TODO: Translate] images", "images": "images",
"imageCount": "[TODO: Translate] {count} images", "imageCount": "{count} images",
"selectFolder": "[TODO: Translate] Select This Folder", "selectFolder": "Select This Folder",
"errors": { "errors": {
"enterUrls": "[TODO: Translate] Please enter at least one URL or path", "enterUrls": "Please enter at least one URL or path",
"enterDirectory": "[TODO: Translate] Please enter a directory path", "enterDirectory": "Please enter a directory path",
"startFailed": "[TODO: Translate] Failed to start import: {message}" "startFailed": "Failed to start import: {message}"
} }
} }
}, },
@@ -1495,16 +1497,17 @@
"processingError": "Erreur de traitement : {message}", "processingError": "Erreur de traitement : {message}",
"folderBrowserError": "Erreur lors du chargement du navigateur de dossiers : {message}", "folderBrowserError": "Erreur lors du chargement du navigateur de dossiers : {message}",
"recipeSaveFailed": "Échec de la sauvegarde de la recipe : {error}", "recipeSaveFailed": "Échec de la sauvegarde de la recipe : {error}",
"recipeSaved": "Recipe saved successfully",
"importFailed": "Échec de l'importation : {message}", "importFailed": "Échec de l'importation : {message}",
"folderTreeFailed": "Échec du chargement de l'arborescence des dossiers", "folderTreeFailed": "Échec du chargement de l'arborescence des dossiers",
"folderTreeError": "Erreur lors du chargement de l'arborescence des dossiers", "folderTreeError": "Erreur lors du chargement de l'arborescence des dossiers",
"batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", "batchImportFailed": "Failed to start batch import: {message}",
"batchImportCancelling": "[TODO: Translate] Cancelling batch import...", "batchImportCancelling": "Cancelling batch import...",
"batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", "batchImportCancelFailed": "Failed to cancel batch import: {message}",
"batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", "batchImportNoUrls": "Please enter at least one URL or file path",
"batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", "batchImportNoDirectory": "Please enter a directory path",
"batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", "batchImportBrowseFailed": "Failed to browse directory: {message}",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" "batchImportDirectorySelected": "Directory selected: {path}"
}, },
"models": { "models": {
"noModelsSelected": "Aucun modèle sélectionné", "noModelsSelected": "Aucun modèle sélectionné",

View File

@@ -645,6 +645,8 @@
"root": "שורש", "root": "שורש",
"browseFolders": "דפדף בתיקיות:", "browseFolders": "דפדף בתיקיות:",
"downloadAndSaveRecipe": "הורד ושמור מתכון", "downloadAndSaveRecipe": "הורד ושמור מתכון",
"importRecipeOnly": "יבא רק מתכון",
"importAndDownload": "יבא והורד",
"downloadMissingLoras": "הורד LoRAs חסרים", "downloadMissingLoras": "הורד LoRAs חסרים",
"saveRecipe": "שמור מתכון", "saveRecipe": "שמור מתכון",
"loraCountInfo": "({existing}/{total} בספרייה)", "loraCountInfo": "({existing}/{total} בספרייה)",
@@ -732,61 +734,61 @@
} }
}, },
"batchImport": { "batchImport": {
"title": "[TODO: Translate] Batch Import Recipes", "title": "Batch Import Recipes",
"action": "[TODO: Translate] Batch Import", "action": "Batch Import",
"urlList": "[TODO: Translate] URL List", "urlList": "URL List",
"directory": "[TODO: Translate] Directory", "directory": "Directory",
"urlDescription": "[TODO: Translate] Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.",
"directoryDescription": "[TODO: Translate] Enter a directory path to import all images from that folder.", "directoryDescription": "Enter a directory path to import all images from that folder.",
"urlsLabel": "[TODO: Translate] Image URLs or Local Paths", "urlsLabel": "Image URLs or Local Paths",
"urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "[TODO: Translate] Enter one URL or path per line", "urlsHint": "Enter one URL or path per line",
"directoryPath": "[TODO: Translate] Directory Path", "directoryPath": "Directory Path",
"directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", "directoryPlaceholder": "/path/to/images/folder",
"browse": "[TODO: Translate] Browse", "browse": "Browse",
"recursive": "[TODO: Translate] Include subdirectories", "recursive": "Include subdirectories",
"tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", "tagsOptional": "Tags (optional, applied to all recipes)",
"tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", "tagsPlaceholder": "Enter tags separated by commas",
"tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", "tagsHint": "Tags will be added to all imported recipes",
"skipNoMetadata": "[TODO: Translate] Skip images without metadata", "skipNoMetadata": "Skip images without metadata",
"skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.",
"start": "[TODO: Translate] Start Import", "start": "Start Import",
"startImport": "[TODO: Translate] Start Import", "startImport": "Start Import",
"importing": "[TODO: Translate] Importing...", "importing": "Importing...",
"progress": "[TODO: Translate] Progress", "progress": "Progress",
"total": "[TODO: Translate] Total", "total": "Total",
"success": "[TODO: Translate] Success", "success": "Success",
"failed": "[TODO: Translate] Failed", "failed": "Failed",
"skipped": "[TODO: Translate] Skipped", "skipped": "Skipped",
"current": "[TODO: Translate] Current", "current": "Current",
"currentItem": "[TODO: Translate] Current", "currentItem": "Current",
"preparing": "[TODO: Translate] Preparing...", "preparing": "Preparing...",
"cancel": "[TODO: Translate] Cancel", "cancel": "Cancel",
"cancelImport": "[TODO: Translate] Cancel", "cancelImport": "Cancel",
"cancelled": "[TODO: Translate] Import cancelled", "cancelled": "Import cancelled",
"completed": "[TODO: Translate] Import completed", "completed": "Import completed",
"completedWithErrors": "[TODO: Translate] Completed with errors", "completedWithErrors": "Completed with errors",
"completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", "completedSuccess": "Successfully imported {count} recipe(s)",
"successCount": "[TODO: Translate] Successful", "successCount": "Successful",
"failedCount": "[TODO: Translate] Failed", "failedCount": "Failed",
"skippedCount": "[TODO: Translate] Skipped", "skippedCount": "Skipped",
"totalProcessed": "[TODO: Translate] Total processed", "totalProcessed": "Total processed",
"viewDetails": "[TODO: Translate] View Details", "viewDetails": "View Details",
"newImport": "[TODO: Translate] New Import", "newImport": "New Import",
"manualPathEntry": "[TODO: Translate] Please enter the directory path manually. File browser is not available in this browser.", "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {name}. You may need to enter the full path manually.", "batchImportDirectorySelected": "Directory selected: {path}",
"batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.",
"backToParent": "[TODO: Translate] Back to parent directory", "backToParent": "Back to parent directory",
"folders": "[TODO: Translate] Folders", "folders": "Folders",
"folderCount": "[TODO: Translate] {count} folders", "folderCount": "{count} folders",
"imageFiles": "[TODO: Translate] Image Files", "imageFiles": "Image Files",
"images": "[TODO: Translate] images", "images": "images",
"imageCount": "[TODO: Translate] {count} images", "imageCount": "{count} images",
"selectFolder": "[TODO: Translate] Select This Folder", "selectFolder": "Select This Folder",
"errors": { "errors": {
"enterUrls": "[TODO: Translate] Please enter at least one URL or path", "enterUrls": "Please enter at least one URL or path",
"enterDirectory": "[TODO: Translate] Please enter a directory path", "enterDirectory": "Please enter a directory path",
"startFailed": "[TODO: Translate] Failed to start import: {message}" "startFailed": "Failed to start import: {message}"
} }
} }
}, },
@@ -1495,16 +1497,17 @@
"processingError": "שגיאת עיבוד: {message}", "processingError": "שגיאת עיבוד: {message}",
"folderBrowserError": "שגיאה בטעינת דפדפן התיקיות: {message}", "folderBrowserError": "שגיאה בטעינת דפדפן התיקיות: {message}",
"recipeSaveFailed": "שמירת המתכון נכשלה: {error}", "recipeSaveFailed": "שמירת המתכון נכשלה: {error}",
"recipeSaved": "Recipe saved successfully",
"importFailed": "הייבוא נכשל: {message}", "importFailed": "הייבוא נכשל: {message}",
"folderTreeFailed": "טעינת עץ התיקיות נכשלה", "folderTreeFailed": "טעינת עץ התיקיות נכשלה",
"folderTreeError": "שגיאה בטעינת עץ התיקיות", "folderTreeError": "שגיאה בטעינת עץ התיקיות",
"batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", "batchImportFailed": "Failed to start batch import: {message}",
"batchImportCancelling": "[TODO: Translate] Cancelling batch import...", "batchImportCancelling": "Cancelling batch import...",
"batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", "batchImportCancelFailed": "Failed to cancel batch import: {message}",
"batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", "batchImportNoUrls": "Please enter at least one URL or file path",
"batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", "batchImportNoDirectory": "Please enter a directory path",
"batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", "batchImportBrowseFailed": "Failed to browse directory: {message}",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" "batchImportDirectorySelected": "Directory selected: {path}"
}, },
"models": { "models": {
"noModelsSelected": "לא נבחרו מודלים", "noModelsSelected": "לא נבחרו מודלים",

View File

@@ -645,6 +645,8 @@
"root": "ルート", "root": "ルート",
"browseFolders": "フォルダを参照:", "browseFolders": "フォルダを参照:",
"downloadAndSaveRecipe": "ダウンロード & レシピ保存", "downloadAndSaveRecipe": "ダウンロード & レシピ保存",
"importRecipeOnly": "レシピのみインポート",
"importAndDownload": "インポートとダウンロード",
"downloadMissingLoras": "不足しているLoRAをダウンロード", "downloadMissingLoras": "不足しているLoRAをダウンロード",
"saveRecipe": "レシピを保存", "saveRecipe": "レシピを保存",
"loraCountInfo": "{existing}/{total} ライブラリ内)", "loraCountInfo": "{existing}/{total} ライブラリ内)",
@@ -732,61 +734,61 @@
} }
}, },
"batchImport": { "batchImport": {
"title": "[TODO: Translate] Batch Import Recipes", "title": "Batch Import Recipes",
"action": "[TODO: Translate] Batch Import", "action": "Batch Import",
"urlList": "[TODO: Translate] URL List", "urlList": "URL List",
"directory": "[TODO: Translate] Directory", "directory": "Directory",
"urlDescription": "[TODO: Translate] Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.",
"directoryDescription": "[TODO: Translate] Enter a directory path to import all images from that folder.", "directoryDescription": "Enter a directory path to import all images from that folder.",
"urlsLabel": "[TODO: Translate] Image URLs or Local Paths", "urlsLabel": "Image URLs or Local Paths",
"urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "[TODO: Translate] Enter one URL or path per line", "urlsHint": "Enter one URL or path per line",
"directoryPath": "[TODO: Translate] Directory Path", "directoryPath": "Directory Path",
"directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", "directoryPlaceholder": "/path/to/images/folder",
"browse": "[TODO: Translate] Browse", "browse": "Browse",
"recursive": "[TODO: Translate] Include subdirectories", "recursive": "Include subdirectories",
"tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", "tagsOptional": "Tags (optional, applied to all recipes)",
"tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", "tagsPlaceholder": "Enter tags separated by commas",
"tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", "tagsHint": "Tags will be added to all imported recipes",
"skipNoMetadata": "[TODO: Translate] Skip images without metadata", "skipNoMetadata": "Skip images without metadata",
"skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.",
"start": "[TODO: Translate] Start Import", "start": "Start Import",
"startImport": "[TODO: Translate] Start Import", "startImport": "Start Import",
"importing": "[TODO: Translate] Importing...", "importing": "Importing...",
"progress": "[TODO: Translate] Progress", "progress": "Progress",
"total": "[TODO: Translate] Total", "total": "Total",
"success": "[TODO: Translate] Success", "success": "Success",
"failed": "[TODO: Translate] Failed", "failed": "Failed",
"skipped": "[TODO: Translate] Skipped", "skipped": "Skipped",
"current": "[TODO: Translate] Current", "current": "Current",
"currentItem": "[TODO: Translate] Current", "currentItem": "Current",
"preparing": "[TODO: Translate] Preparing...", "preparing": "Preparing...",
"cancel": "[TODO: Translate] Cancel", "cancel": "Cancel",
"cancelImport": "[TODO: Translate] Cancel", "cancelImport": "Cancel",
"cancelled": "[TODO: Translate] Import cancelled", "cancelled": "Import cancelled",
"completed": "[TODO: Translate] Import completed", "completed": "Import completed",
"completedWithErrors": "[TODO: Translate] Completed with errors", "completedWithErrors": "Completed with errors",
"completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", "completedSuccess": "Successfully imported {count} recipe(s)",
"successCount": "[TODO: Translate] Successful", "successCount": "Successful",
"failedCount": "[TODO: Translate] Failed", "failedCount": "Failed",
"skippedCount": "[TODO: Translate] Skipped", "skippedCount": "Skipped",
"totalProcessed": "[TODO: Translate] Total processed", "totalProcessed": "Total processed",
"viewDetails": "[TODO: Translate] View Details", "viewDetails": "View Details",
"newImport": "[TODO: Translate] New Import", "newImport": "New Import",
"manualPathEntry": "[TODO: Translate] Please enter the directory path manually. File browser is not available in this browser.", "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {name}. You may need to enter the full path manually.", "batchImportDirectorySelected": "Directory selected: {path}",
"batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.",
"backToParent": "[TODO: Translate] Back to parent directory", "backToParent": "Back to parent directory",
"folders": "[TODO: Translate] Folders", "folders": "Folders",
"folderCount": "[TODO: Translate] {count} folders", "folderCount": "{count} folders",
"imageFiles": "[TODO: Translate] Image Files", "imageFiles": "Image Files",
"images": "[TODO: Translate] images", "images": "images",
"imageCount": "[TODO: Translate] {count} images", "imageCount": "{count} images",
"selectFolder": "[TODO: Translate] Select This Folder", "selectFolder": "Select This Folder",
"errors": { "errors": {
"enterUrls": "[TODO: Translate] Please enter at least one URL or path", "enterUrls": "Please enter at least one URL or path",
"enterDirectory": "[TODO: Translate] Please enter a directory path", "enterDirectory": "Please enter a directory path",
"startFailed": "[TODO: Translate] Failed to start import: {message}" "startFailed": "Failed to start import: {message}"
} }
} }
}, },
@@ -1495,16 +1497,17 @@
"processingError": "処理エラー:{message}", "processingError": "処理エラー:{message}",
"folderBrowserError": "フォルダブラウザの読み込みエラー:{message}", "folderBrowserError": "フォルダブラウザの読み込みエラー:{message}",
"recipeSaveFailed": "レシピの保存に失敗しました:{error}", "recipeSaveFailed": "レシピの保存に失敗しました:{error}",
"recipeSaved": "Recipe saved successfully",
"importFailed": "インポートに失敗しました:{message}", "importFailed": "インポートに失敗しました:{message}",
"folderTreeFailed": "フォルダツリーの読み込みに失敗しました", "folderTreeFailed": "フォルダツリーの読み込みに失敗しました",
"folderTreeError": "フォルダツリー読み込みエラー", "folderTreeError": "フォルダツリー読み込みエラー",
"batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", "batchImportFailed": "Failed to start batch import: {message}",
"batchImportCancelling": "[TODO: Translate] Cancelling batch import...", "batchImportCancelling": "Cancelling batch import...",
"batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", "batchImportCancelFailed": "Failed to cancel batch import: {message}",
"batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", "batchImportNoUrls": "Please enter at least one URL or file path",
"batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", "batchImportNoDirectory": "Please enter a directory path",
"batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", "batchImportBrowseFailed": "Failed to browse directory: {message}",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" "batchImportDirectorySelected": "Directory selected: {path}"
}, },
"models": { "models": {
"noModelsSelected": "モデルが選択されていません", "noModelsSelected": "モデルが選択されていません",

View File

@@ -645,6 +645,8 @@
"root": "루트", "root": "루트",
"browseFolders": "폴더 탐색:", "browseFolders": "폴더 탐색:",
"downloadAndSaveRecipe": "다운로드 및 레시피 저장", "downloadAndSaveRecipe": "다운로드 및 레시피 저장",
"importRecipeOnly": "레시피만 가져오기",
"importAndDownload": "가져오기 및 다운로드",
"downloadMissingLoras": "누락된 LoRA 다운로드", "downloadMissingLoras": "누락된 LoRA 다운로드",
"saveRecipe": "레시피 저장", "saveRecipe": "레시피 저장",
"loraCountInfo": "({existing}/{total} 라이브러리에 있음)", "loraCountInfo": "({existing}/{total} 라이브러리에 있음)",
@@ -732,61 +734,61 @@
} }
}, },
"batchImport": { "batchImport": {
"title": "[TODO: Translate] Batch Import Recipes", "title": "Batch Import Recipes",
"action": "[TODO: Translate] Batch Import", "action": "Batch Import",
"urlList": "[TODO: Translate] URL List", "urlList": "URL List",
"directory": "[TODO: Translate] Directory", "directory": "Directory",
"urlDescription": "[TODO: Translate] Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.",
"directoryDescription": "[TODO: Translate] Enter a directory path to import all images from that folder.", "directoryDescription": "Enter a directory path to import all images from that folder.",
"urlsLabel": "[TODO: Translate] Image URLs or Local Paths", "urlsLabel": "Image URLs or Local Paths",
"urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "[TODO: Translate] Enter one URL or path per line", "urlsHint": "Enter one URL or path per line",
"directoryPath": "[TODO: Translate] Directory Path", "directoryPath": "Directory Path",
"directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", "directoryPlaceholder": "/path/to/images/folder",
"browse": "[TODO: Translate] Browse", "browse": "Browse",
"recursive": "[TODO: Translate] Include subdirectories", "recursive": "Include subdirectories",
"tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", "tagsOptional": "Tags (optional, applied to all recipes)",
"tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", "tagsPlaceholder": "Enter tags separated by commas",
"tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", "tagsHint": "Tags will be added to all imported recipes",
"skipNoMetadata": "[TODO: Translate] Skip images without metadata", "skipNoMetadata": "Skip images without metadata",
"skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.",
"start": "[TODO: Translate] Start Import", "start": "Start Import",
"startImport": "[TODO: Translate] Start Import", "startImport": "Start Import",
"importing": "[TODO: Translate] Importing...", "importing": "Importing...",
"progress": "[TODO: Translate] Progress", "progress": "Progress",
"total": "[TODO: Translate] Total", "total": "Total",
"success": "[TODO: Translate] Success", "success": "Success",
"failed": "[TODO: Translate] Failed", "failed": "Failed",
"skipped": "[TODO: Translate] Skipped", "skipped": "Skipped",
"current": "[TODO: Translate] Current", "current": "Current",
"currentItem": "[TODO: Translate] Current", "currentItem": "Current",
"preparing": "[TODO: Translate] Preparing...", "preparing": "Preparing...",
"cancel": "[TODO: Translate] Cancel", "cancel": "Cancel",
"cancelImport": "[TODO: Translate] Cancel", "cancelImport": "Cancel",
"cancelled": "[TODO: Translate] Import cancelled", "cancelled": "Import cancelled",
"completed": "[TODO: Translate] Import completed", "completed": "Import completed",
"completedWithErrors": "[TODO: Translate] Completed with errors", "completedWithErrors": "Completed with errors",
"completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", "completedSuccess": "Successfully imported {count} recipe(s)",
"successCount": "[TODO: Translate] Successful", "successCount": "Successful",
"failedCount": "[TODO: Translate] Failed", "failedCount": "Failed",
"skippedCount": "[TODO: Translate] Skipped", "skippedCount": "Skipped",
"totalProcessed": "[TODO: Translate] Total processed", "totalProcessed": "Total processed",
"viewDetails": "[TODO: Translate] View Details", "viewDetails": "View Details",
"newImport": "[TODO: Translate] New Import", "newImport": "New Import",
"manualPathEntry": "[TODO: Translate] Please enter the directory path manually. File browser is not available in this browser.", "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {name}. You may need to enter the full path manually.", "batchImportDirectorySelected": "Directory selected: {path}",
"batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.",
"backToParent": "[TODO: Translate] Back to parent directory", "backToParent": "Back to parent directory",
"folders": "[TODO: Translate] Folders", "folders": "Folders",
"folderCount": "[TODO: Translate] {count} folders", "folderCount": "{count} folders",
"imageFiles": "[TODO: Translate] Image Files", "imageFiles": "Image Files",
"images": "[TODO: Translate] images", "images": "images",
"imageCount": "[TODO: Translate] {count} images", "imageCount": "{count} images",
"selectFolder": "[TODO: Translate] Select This Folder", "selectFolder": "Select This Folder",
"errors": { "errors": {
"enterUrls": "[TODO: Translate] Please enter at least one URL or path", "enterUrls": "Please enter at least one URL or path",
"enterDirectory": "[TODO: Translate] Please enter a directory path", "enterDirectory": "Please enter a directory path",
"startFailed": "[TODO: Translate] Failed to start import: {message}" "startFailed": "Failed to start import: {message}"
} }
} }
}, },
@@ -1495,16 +1497,17 @@
"processingError": "처리 오류: {message}", "processingError": "처리 오류: {message}",
"folderBrowserError": "폴더 브라우저 로딩 오류: {message}", "folderBrowserError": "폴더 브라우저 로딩 오류: {message}",
"recipeSaveFailed": "레시피 저장 실패: {error}", "recipeSaveFailed": "레시피 저장 실패: {error}",
"recipeSaved": "Recipe saved successfully",
"importFailed": "가져오기 실패: {message}", "importFailed": "가져오기 실패: {message}",
"folderTreeFailed": "폴더 트리 로딩 실패", "folderTreeFailed": "폴더 트리 로딩 실패",
"folderTreeError": "폴더 트리 로딩 오류", "folderTreeError": "폴더 트리 로딩 오류",
"batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", "batchImportFailed": "Failed to start batch import: {message}",
"batchImportCancelling": "[TODO: Translate] Cancelling batch import...", "batchImportCancelling": "Cancelling batch import...",
"batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", "batchImportCancelFailed": "Failed to cancel batch import: {message}",
"batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", "batchImportNoUrls": "Please enter at least one URL or file path",
"batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", "batchImportNoDirectory": "Please enter a directory path",
"batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", "batchImportBrowseFailed": "Failed to browse directory: {message}",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" "batchImportDirectorySelected": "Directory selected: {path}"
}, },
"models": { "models": {
"noModelsSelected": "선택된 모델이 없습니다", "noModelsSelected": "선택된 모델이 없습니다",

View File

@@ -645,6 +645,8 @@
"root": "Корень", "root": "Корень",
"browseFolders": "Обзор папок:", "browseFolders": "Обзор папок:",
"downloadAndSaveRecipe": "Скачать и сохранить рецепт", "downloadAndSaveRecipe": "Скачать и сохранить рецепт",
"importRecipeOnly": "Импортировать только рецепт",
"importAndDownload": "Импорт и скачивание",
"downloadMissingLoras": "Скачать отсутствующие LoRAs", "downloadMissingLoras": "Скачать отсутствующие LoRAs",
"saveRecipe": "Сохранить рецепт", "saveRecipe": "Сохранить рецепт",
"loraCountInfo": "({existing}/{total} в библиотеке)", "loraCountInfo": "({existing}/{total} в библиотеке)",
@@ -732,61 +734,61 @@
} }
}, },
"batchImport": { "batchImport": {
"title": "[TODO: Translate] Batch Import Recipes", "title": "Batch Import Recipes",
"action": "[TODO: Translate] Batch Import", "action": "Batch Import",
"urlList": "[TODO: Translate] URL List", "urlList": "URL List",
"directory": "[TODO: Translate] Directory", "directory": "Directory",
"urlDescription": "[TODO: Translate] Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.",
"directoryDescription": "[TODO: Translate] Enter a directory path to import all images from that folder.", "directoryDescription": "Enter a directory path to import all images from that folder.",
"urlsLabel": "[TODO: Translate] Image URLs or Local Paths", "urlsLabel": "Image URLs or Local Paths",
"urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "[TODO: Translate] Enter one URL or path per line", "urlsHint": "Enter one URL or path per line",
"directoryPath": "[TODO: Translate] Directory Path", "directoryPath": "Directory Path",
"directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", "directoryPlaceholder": "/path/to/images/folder",
"browse": "[TODO: Translate] Browse", "browse": "Browse",
"recursive": "[TODO: Translate] Include subdirectories", "recursive": "Include subdirectories",
"tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", "tagsOptional": "Tags (optional, applied to all recipes)",
"tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", "tagsPlaceholder": "Enter tags separated by commas",
"tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", "tagsHint": "Tags will be added to all imported recipes",
"skipNoMetadata": "[TODO: Translate] Skip images without metadata", "skipNoMetadata": "Skip images without metadata",
"skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.",
"start": "[TODO: Translate] Start Import", "start": "Start Import",
"startImport": "[TODO: Translate] Start Import", "startImport": "Start Import",
"importing": "[TODO: Translate] Importing...", "importing": "Importing...",
"progress": "[TODO: Translate] Progress", "progress": "Progress",
"total": "[TODO: Translate] Total", "total": "Total",
"success": "[TODO: Translate] Success", "success": "Success",
"failed": "[TODO: Translate] Failed", "failed": "Failed",
"skipped": "[TODO: Translate] Skipped", "skipped": "Skipped",
"current": "[TODO: Translate] Current", "current": "Current",
"currentItem": "[TODO: Translate] Current", "currentItem": "Current",
"preparing": "[TODO: Translate] Preparing...", "preparing": "Preparing...",
"cancel": "[TODO: Translate] Cancel", "cancel": "Cancel",
"cancelImport": "[TODO: Translate] Cancel", "cancelImport": "Cancel",
"cancelled": "[TODO: Translate] Import cancelled", "cancelled": "Import cancelled",
"completed": "[TODO: Translate] Import completed", "completed": "Import completed",
"completedWithErrors": "[TODO: Translate] Completed with errors", "completedWithErrors": "Completed with errors",
"completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", "completedSuccess": "Successfully imported {count} recipe(s)",
"successCount": "[TODO: Translate] Successful", "successCount": "Successful",
"failedCount": "[TODO: Translate] Failed", "failedCount": "Failed",
"skippedCount": "[TODO: Translate] Skipped", "skippedCount": "Skipped",
"totalProcessed": "[TODO: Translate] Total processed", "totalProcessed": "Total processed",
"viewDetails": "[TODO: Translate] View Details", "viewDetails": "View Details",
"newImport": "[TODO: Translate] New Import", "newImport": "New Import",
"manualPathEntry": "[TODO: Translate] Please enter the directory path manually. File browser is not available in this browser.", "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {name}. You may need to enter the full path manually.", "batchImportDirectorySelected": "Directory selected: {path}",
"batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.",
"backToParent": "[TODO: Translate] Back to parent directory", "backToParent": "Back to parent directory",
"folders": "[TODO: Translate] Folders", "folders": "Folders",
"folderCount": "[TODO: Translate] {count} folders", "folderCount": "{count} folders",
"imageFiles": "[TODO: Translate] Image Files", "imageFiles": "Image Files",
"images": "[TODO: Translate] images", "images": "images",
"imageCount": "[TODO: Translate] {count} images", "imageCount": "{count} images",
"selectFolder": "[TODO: Translate] Select This Folder", "selectFolder": "Select This Folder",
"errors": { "errors": {
"enterUrls": "[TODO: Translate] Please enter at least one URL or path", "enterUrls": "Please enter at least one URL or path",
"enterDirectory": "[TODO: Translate] Please enter a directory path", "enterDirectory": "Please enter a directory path",
"startFailed": "[TODO: Translate] Failed to start import: {message}" "startFailed": "Failed to start import: {message}"
} }
} }
}, },
@@ -1495,16 +1497,17 @@
"processingError": "Ошибка обработки: {message}", "processingError": "Ошибка обработки: {message}",
"folderBrowserError": "Ошибка загрузки браузера папок: {message}", "folderBrowserError": "Ошибка загрузки браузера папок: {message}",
"recipeSaveFailed": "Не удалось сохранить рецепт: {error}", "recipeSaveFailed": "Не удалось сохранить рецепт: {error}",
"recipeSaved": "Recipe saved successfully",
"importFailed": "Импорт не удался: {message}", "importFailed": "Импорт не удался: {message}",
"folderTreeFailed": "Не удалось загрузить дерево папок", "folderTreeFailed": "Не удалось загрузить дерево папок",
"folderTreeError": "Ошибка загрузки дерева папок", "folderTreeError": "Ошибка загрузки дерева папок",
"batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", "batchImportFailed": "Failed to start batch import: {message}",
"batchImportCancelling": "[TODO: Translate] Cancelling batch import...", "batchImportCancelling": "Cancelling batch import...",
"batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", "batchImportCancelFailed": "Failed to cancel batch import: {message}",
"batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", "batchImportNoUrls": "Please enter at least one URL or file path",
"batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", "batchImportNoDirectory": "Please enter a directory path",
"batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", "batchImportBrowseFailed": "Failed to browse directory: {message}",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" "batchImportDirectorySelected": "Directory selected: {path}"
}, },
"models": { "models": {
"noModelsSelected": "Модели не выбраны", "noModelsSelected": "Модели не выбраны",

View File

@@ -645,6 +645,8 @@
"root": "根目录", "root": "根目录",
"browseFolders": "浏览文件夹:", "browseFolders": "浏览文件夹:",
"downloadAndSaveRecipe": "下载并保存配方", "downloadAndSaveRecipe": "下载并保存配方",
"importRecipeOnly": "仅导入配方",
"importAndDownload": "导入并下载",
"downloadMissingLoras": "下载缺失的 LoRA", "downloadMissingLoras": "下载缺失的 LoRA",
"saveRecipe": "保存配方", "saveRecipe": "保存配方",
"loraCountInfo": "({existing}/{total} in library)", "loraCountInfo": "({existing}/{total} in library)",
@@ -734,55 +736,55 @@
"batchImport": { "batchImport": {
"title": "批量导入配方", "title": "批量导入配方",
"action": "批量导入", "action": "批量导入",
"urlList": "[TODO: Translate] URL List", "urlList": "URL 列表",
"directory": "[TODO: Translate] Directory", "directory": "目录",
"urlDescription": "[TODO: Translate] Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", "urlDescription": "输入图像 URL 或本地文件路径(每行一个)。每个都将作为配方导入。",
"directoryDescription": "输入目录路径以导入该文件夹中的所有图片。", "directoryDescription": "输入目录路径以导入该文件夹中的所有图片。",
"urlsLabel": "图片 URL 或本地路径", "urlsLabel": "图片 URL 或本地路径",
"urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "[TODO: Translate] Enter one URL or path per line", "urlsHint": "每行输入一个 URL 或路径",
"directoryPath": "[TODO: Translate] Directory Path", "directoryPath": "目录路径",
"directoryPlaceholder": "/图片/文件夹/路径", "directoryPlaceholder": "/图片/文件夹/路径",
"browse": "[TODO: Translate] Browse", "browse": "浏览",
"recursive": "[TODO: Translate] Include subdirectories", "recursive": "包含子目录",
"tagsOptional": "标签(可选,应用于所有配方)", "tagsOptional": "标签(可选,应用于所有配方)",
"tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", "tagsPlaceholder": "输入以逗号分隔的标签",
"tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", "tagsHint": "标签将被添加到所有导入的配方中",
"skipNoMetadata": "跳过无元数据的图片", "skipNoMetadata": "跳过无元数据的图片",
"skipNoMetadataHelp": "没有 LoRA 元数据的图片将自动跳过。", "skipNoMetadataHelp": "没有 LoRA 元数据的图片将自动跳过。",
"start": "[TODO: Translate] Start Import", "start": "开始导入",
"startImport": "开始导入", "startImport": "开始导入",
"importing": "正在导入配方...", "importing": "正在导入配方...",
"progress": "进度", "progress": "进度",
"total": "[TODO: Translate] Total", "total": "总计",
"success": "[TODO: Translate] Success", "success": "成功",
"failed": "[TODO: Translate] Failed", "failed": "失败",
"skipped": "[TODO: Translate] Skipped", "skipped": "跳过",
"current": "[TODO: Translate] Current", "current": "当前",
"currentItem": "当前", "currentItem": "当前",
"preparing": "准备中...", "preparing": "准备中...",
"cancel": "[TODO: Translate] Cancel", "cancel": "取消",
"cancelImport": "取消", "cancelImport": "取消",
"cancelled": "批量导入已取消", "cancelled": "批量导入已取消",
"completed": "导入完成", "completed": "导入完成",
"completedWithErrors": "[TODO: Translate] Completed with errors", "completedWithErrors": "导入完成但有错误",
"completedSuccess": "成功导入 {count} 个配方", "completedSuccess": "成功导入 {count} 个配方",
"successCount": "成功", "successCount": "成功",
"failedCount": "失败", "failedCount": "失败",
"skippedCount": "跳过", "skippedCount": "跳过",
"totalProcessed": "总计处理", "totalProcessed": "总计处理",
"viewDetails": "[TODO: Translate] View Details", "viewDetails": "查看详情",
"newImport": "[TODO: Translate] New Import", "newImport": "新建导入",
"manualPathEntry": "[TODO: Translate] Please enter the directory path manually. File browser is not available in this browser.", "manualPathEntry": "请手动输入目录路径。此浏览器中文件浏览器不可用。",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {name}. You may need to enter the full path manually.", "batchImportDirectorySelected": "已选择目录:{path}",
"batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", "batchImportManualEntryRequired": "文件浏览器不可用。请手动输入目录路径。",
"backToParent": "[TODO: Translate] Back to parent directory", "backToParent": "返回上级目录",
"folders": "[TODO: Translate] Folders", "folders": "文件夹",
"folderCount": "[TODO: Translate] {count} folders", "folderCount": "{count} 个文件夹",
"imageFiles": "[TODO: Translate] Image Files", "imageFiles": "图像文件",
"images": "[TODO: Translate] images", "images": "图像",
"imageCount": "[TODO: Translate] {count} images", "imageCount": "{count} 个图像",
"selectFolder": "[TODO: Translate] Select This Folder", "selectFolder": "选择此文件夹",
"errors": { "errors": {
"enterUrls": "请至少输入一个 URL 或路径", "enterUrls": "请至少输入一个 URL 或路径",
"enterDirectory": "请输入目录路径", "enterDirectory": "请输入目录路径",
@@ -1495,16 +1497,17 @@
"processingError": "处理出错:{message}", "processingError": "处理出错:{message}",
"folderBrowserError": "加载文件夹浏览器出错:{message}", "folderBrowserError": "加载文件夹浏览器出错:{message}",
"recipeSaveFailed": "保存配方失败:{error}", "recipeSaveFailed": "保存配方失败:{error}",
"recipeSaved": "配方保存成功",
"importFailed": "导入失败:{message}", "importFailed": "导入失败:{message}",
"folderTreeFailed": "加载文件夹树失败", "folderTreeFailed": "加载文件夹树失败",
"folderTreeError": "加载文件夹树出错", "folderTreeError": "加载文件夹树出错",
"batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", "batchImportFailed": "启动批量导入失败:{message}",
"batchImportCancelling": "[TODO: Translate] Cancelling batch import...", "batchImportCancelling": "正在取消批量导入...",
"batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", "batchImportCancelFailed": "取消批量导入失败:{message}",
"batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", "batchImportNoUrls": "请输入至少一个 URL 或文件路径",
"batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", "batchImportNoDirectory": "请输入目录路径",
"batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", "batchImportBrowseFailed": "浏览目录失败:{message}",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" "batchImportDirectorySelected": "已选择目录:{path}"
}, },
"models": { "models": {
"noModelsSelected": "未选中模型", "noModelsSelected": "未选中模型",

View File

@@ -645,6 +645,8 @@
"root": "根目錄", "root": "根目錄",
"browseFolders": "瀏覽資料夾:", "browseFolders": "瀏覽資料夾:",
"downloadAndSaveRecipe": "下載並儲存配方", "downloadAndSaveRecipe": "下載並儲存配方",
"importRecipeOnly": "僅匯入配方",
"importAndDownload": "匯入並下載",
"downloadMissingLoras": "下載缺少的 LoRA", "downloadMissingLoras": "下載缺少的 LoRA",
"saveRecipe": "儲存配方", "saveRecipe": "儲存配方",
"loraCountInfo": "(庫存 {existing}/{total}", "loraCountInfo": "(庫存 {existing}/{total}",
@@ -732,61 +734,61 @@
} }
}, },
"batchImport": { "batchImport": {
"title": "[TODO: Translate] Batch Import Recipes", "title": "批量匯入配方",
"action": "[TODO: Translate] Batch Import", "action": "批量匯入",
"urlList": "[TODO: Translate] URL List", "urlList": "URL 列表",
"directory": "[TODO: Translate] Directory", "directory": "目錄",
"urlDescription": "[TODO: Translate] Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", "urlDescription": "輸入圖像 URL 或本地檔案路徑(每行一個)。每個都將作為配方匯入。",
"directoryDescription": "[TODO: Translate] Enter a directory path to import all images from that folder.", "directoryDescription": "輸入目錄路徑以匯入該資料夾中的所有圖像。",
"urlsLabel": "[TODO: Translate] Image URLs or Local Paths", "urlsLabel": "圖像 URL 或本地路徑",
"urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "[TODO: Translate] Enter one URL or path per line", "urlsHint": "每行輸入一個 URL 或路徑",
"directoryPath": "[TODO: Translate] Directory Path", "directoryPath": "目錄路徑",
"directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", "directoryPlaceholder": "/path/to/images/folder",
"browse": "[TODO: Translate] Browse", "browse": "瀏覽",
"recursive": "[TODO: Translate] Include subdirectories", "recursive": "包含子目錄",
"tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", "tagsOptional": "標籤(可選,應用於所有配方)",
"tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", "tagsPlaceholder": "輸入以逗號分隔的標籤",
"tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", "tagsHint": "標籤將被添加到所有匯入的配方中",
"skipNoMetadata": "[TODO: Translate] Skip images without metadata", "skipNoMetadata": "跳過無元資料的圖像",
"skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", "skipNoMetadataHelp": "沒有 LoRA 元資料的圖像將被自動跳過。",
"start": "[TODO: Translate] Start Import", "start": "開始匯入",
"startImport": "[TODO: Translate] Start Import", "startImport": "開始匯入",
"importing": "[TODO: Translate] Importing...", "importing": "匯入中...",
"progress": "[TODO: Translate] Progress", "progress": "進度",
"total": "[TODO: Translate] Total", "total": "總計",
"success": "[TODO: Translate] Success", "success": "成功",
"failed": "[TODO: Translate] Failed", "failed": "失敗",
"skipped": "[TODO: Translate] Skipped", "skipped": "跳過",
"current": "[TODO: Translate] Current", "current": "當前",
"currentItem": "[TODO: Translate] Current", "currentItem": "當前項目",
"preparing": "[TODO: Translate] Preparing...", "preparing": "準備中...",
"cancel": "[TODO: Translate] Cancel", "cancel": "取消",
"cancelImport": "[TODO: Translate] Cancel", "cancelImport": "取消匯入",
"cancelled": "[TODO: Translate] Import cancelled", "cancelled": "匯入已取消",
"completed": "[TODO: Translate] Import completed", "completed": "匯入完成",
"completedWithErrors": "[TODO: Translate] Completed with errors", "completedWithErrors": "匯入完成但有錯誤",
"completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", "completedSuccess": "成功匯入 {count} 個配方",
"successCount": "[TODO: Translate] Successful", "successCount": "成功",
"failedCount": "[TODO: Translate] Failed", "failedCount": "失敗",
"skippedCount": "[TODO: Translate] Skipped", "skippedCount": "跳過",
"totalProcessed": "[TODO: Translate] Total processed", "totalProcessed": "總計處理",
"viewDetails": "[TODO: Translate] View Details", "viewDetails": "查看詳情",
"newImport": "[TODO: Translate] New Import", "newImport": "新建匯入",
"manualPathEntry": "[TODO: Translate] Please enter the directory path manually. File browser is not available in this browser.", "manualPathEntry": "請手動輸入目錄路徑。此瀏覽器中檔案瀏覽器不可用。",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {name}. You may need to enter the full path manually.", "batchImportDirectorySelected": "已選擇目錄:{path}",
"batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", "batchImportManualEntryRequired": "檔案瀏覽器不可用。請手動輸入目錄路徑。",
"backToParent": "[TODO: Translate] Back to parent directory", "backToParent": "返回上級目錄",
"folders": "[TODO: Translate] Folders", "folders": "資料夾",
"folderCount": "[TODO: Translate] {count} folders", "folderCount": "{count} 個資料夾",
"imageFiles": "[TODO: Translate] Image Files", "imageFiles": "圖像檔案",
"images": "[TODO: Translate] images", "images": "圖像",
"imageCount": "[TODO: Translate] {count} images", "imageCount": "{count} 個圖像",
"selectFolder": "[TODO: Translate] Select This Folder", "selectFolder": "選擇此資料夾",
"errors": { "errors": {
"enterUrls": "[TODO: Translate] Please enter at least one URL or path", "enterUrls": "請輸入至少一個 URL 或路徑",
"enterDirectory": "[TODO: Translate] Please enter a directory path", "enterDirectory": "請輸入目錄路徑",
"startFailed": "[TODO: Translate] Failed to start import: {message}" "startFailed": "啟動匯入失敗:{message}"
} }
} }
}, },
@@ -1495,16 +1497,17 @@
"processingError": "處理錯誤:{message}", "processingError": "處理錯誤:{message}",
"folderBrowserError": "載入資料夾瀏覽器錯誤:{message}", "folderBrowserError": "載入資料夾瀏覽器錯誤:{message}",
"recipeSaveFailed": "儲存配方失敗:{error}", "recipeSaveFailed": "儲存配方失敗:{error}",
"recipeSaved": "配方儲存成功",
"importFailed": "匯入失敗:{message}", "importFailed": "匯入失敗:{message}",
"folderTreeFailed": "載入資料夾樹狀結構失敗", "folderTreeFailed": "載入資料夾樹狀結構失敗",
"folderTreeError": "載入資料夾樹狀結構錯誤", "folderTreeError": "載入資料夾樹狀結構錯誤",
"batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", "batchImportFailed": "啟動批量匯入失敗:{message}",
"batchImportCancelling": "[TODO: Translate] Cancelling batch import...", "batchImportCancelling": "正在取消批量匯入...",
"batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", "batchImportCancelFailed": "取消批量匯入失敗:{message}",
"batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", "batchImportNoUrls": "請輸入至少一個 URL 或檔案路徑",
"batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", "batchImportNoDirectory": "請輸入目錄路徑",
"batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", "batchImportBrowseFailed": "瀏覽目錄失敗:{message}",
"batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" "batchImportDirectorySelected": "已選擇目錄:{path}"
}, },
"models": { "models": {
"noModelsSelected": "未選擇模型", "noModelsSelected": "未選擇模型",

View File

@@ -142,6 +142,28 @@ export class ImportManager {
// Reset duplicate related properties // Reset duplicate related properties
this.duplicateRecipes = []; this.duplicateRecipes = [];
// Reset button visibility in location step
this.resetLocationStepButtons();
}
resetLocationStepButtons() {
// Reset buttons to default state
const locationStep = document.getElementById('locationStep');
if (!locationStep) return;
const backBtn = locationStep.querySelector('.secondary-btn');
const primaryBtn = locationStep.querySelector('.primary-btn');
// Back button - show
if (backBtn) {
backBtn.style.display = 'inline-block';
}
// Primary button - reset text
if (primaryBtn) {
primaryBtn.textContent = translate('recipes.controls.import.downloadAndSaveRecipe', {}, 'Download & Save Recipe');
}
} }
toggleImportMode(mode) { toggleImportMode(mode) {
@@ -261,11 +283,57 @@ export class ImportManager {
this.loadDefaultPathSetting(); this.loadDefaultPathSetting();
this.updateTargetPath(); this.updateTargetPath();
// Update download button with missing LoRA count (if any)
if (this.missingLoras && this.missingLoras.length > 0) {
this.updateDownloadButtonCount();
this.updateImportButtonsVisibility(true);
} else {
this.updateImportButtonsVisibility(false);
}
} catch (error) { } catch (error) {
showToast('toast.recipes.importFailed', { message: error.message }, 'error'); showToast('toast.recipes.importFailed', { message: error.message }, 'error');
} }
} }
updateImportButtonsVisibility(hasMissingLoras) {
// Update primary button text based on whether there are missing LoRAs
const locationStep = document.getElementById('locationStep');
if (!locationStep) return;
const backBtn = locationStep.querySelector('.secondary-btn');
const primaryBtn = locationStep.querySelector('.primary-btn');
// Back button - always show
if (backBtn) {
backBtn.style.display = 'inline-block';
}
// Update primary button text
if (primaryBtn) {
const downloadCountSpan = locationStep.querySelector('#downloadLoraCount');
if (hasMissingLoras) {
// Rebuild button content to ensure proper structure
const buttonText = translate('recipes.controls.import.importAndDownload', {}, 'Import & Download');
primaryBtn.innerHTML = `${buttonText} <span id="downloadLoraCount"></span>`;
} else {
primaryBtn.textContent = translate('recipes.controls.import.downloadAndSaveRecipe', {}, 'Download & Save Recipe');
}
}
}
updateDownloadButtonCount() {
// Update the download count badge on the primary button
const locationStep = document.getElementById('locationStep');
if (!locationStep) return;
const downloadCountSpan = locationStep.querySelector('#downloadLoraCount');
if (downloadCountSpan) {
const missingCount = this.missingLoras?.length || 0;
downloadCountSpan.textContent = missingCount > 0 ? `(${missingCount})` : '';
}
}
backToUpload() { backToUpload() {
this.stepManager.showStep('uploadStep'); this.stepManager.showStep('uploadStep');
@@ -426,12 +494,54 @@ export class ImportManager {
const modalTitle = document.querySelector('#importModal h2'); const modalTitle = document.querySelector('#importModal h2');
if (modalTitle) modalTitle.textContent = translate('recipes.controls.import.downloadMissingLoras', {}, 'Download Missing LoRAs'); if (modalTitle) modalTitle.textContent = translate('recipes.controls.import.downloadMissingLoras', {}, 'Download Missing LoRAs');
// Update the save button text // Update button texts and show download count
const saveButton = document.querySelector('#locationStep .primary-btn'); const locationStep = document.getElementById('locationStep');
if (saveButton) saveButton.textContent = translate('recipes.controls.import.downloadMissingLoras', {}, 'Download Missing LoRAs'); if (!locationStep) return;
// Hide the back button const primaryBtn = locationStep.querySelector('.primary-btn');
const backButton = document.querySelector('#locationStep .secondary-btn'); const backBtn = locationStep.querySelector('.secondary-btn');
if (backButton) backButton.style.display = 'none';
// primaryBtn should be the "Import & Download" button
if (primaryBtn) {
const buttonText = translate('recipes.controls.import.importAndDownload', {}, 'Import & Download');
primaryBtn.innerHTML = `${buttonText} <span id="downloadLoraCount">(${recipeData.loras?.length || 0})</span>`;
}
// Hide the "Back" button in download-only mode
if (backBtn) {
backBtn.style.display = 'none';
}
}
saveRecipeWithoutDownload() {
// Call save recipe with skip download flag
return this.downloadManager.saveRecipe(true);
}
async saveRecipeOnlyFromDetails() {
// Validate recipe name first
if (!this.recipeName) {
showToast('toast.recipes.enterRecipeName', {}, 'error');
return;
}
// Mark deleted LoRAs as excluded
if (this.recipeData && this.recipeData.loras) {
this.recipeData.loras.forEach(lora => {
if (lora.isDeleted) {
lora.exclude = true;
}
});
}
// Update missing LoRAs list
this.missingLoras = this.recipeData.loras.filter(lora =>
!lora.existsLocally && !lora.isDeleted);
// For import only, we don't need downloadableLoRAs
this.downloadableLoRAs = [];
// Save recipe without downloading
await this.downloadManager.saveRecipe(true);
} }
} }

View File

@@ -9,7 +9,7 @@ export class DownloadManager {
this.importManager = importManager; this.importManager = importManager;
} }
async saveRecipe() { async saveRecipe(skipDownload = false) {
// Check if we're in download-only mode (for existing recipe) // Check if we're in download-only mode (for existing recipe)
const isDownloadOnly = !!this.importManager.recipeId; const isDownloadOnly = !!this.importManager.recipeId;
@@ -20,7 +20,10 @@ export class DownloadManager {
try { try {
// Show progress indicator // Show progress indicator
this.importManager.loadingManager.showSimpleLoading(isDownloadOnly ? translate('recipes.controls.import.downloadingLoras', {}, 'Downloading LoRAs...') : translate('recipes.controls.import.savingRecipe', {}, 'Saving recipe...')); const loadingMessage = skipDownload
? translate('recipes.controls.import.savingRecipe', {}, 'Saving recipe...')
: (isDownloadOnly ? translate('recipes.controls.import.downloadingLoras', {}, 'Downloading LoRAs...') : translate('recipes.controls.import.savingRecipe', {}, 'Saving recipe...'));
this.importManager.loadingManager.showSimpleLoading(loadingMessage);
// Only send the complete recipe to save if not in download-only mode // Only send the complete recipe to save if not in download-only mode
if (!isDownloadOnly) { if (!isDownloadOnly) {
@@ -98,15 +101,17 @@ export class DownloadManager {
} }
} }
// Check if we need to download LoRAs // Check if we need to download LoRAs (skip if skipDownload is true)
let failedDownloads = 0; let failedDownloads = 0;
if (this.importManager.downloadableLoRAs && this.importManager.downloadableLoRAs.length > 0) { if (!skipDownload && this.importManager.downloadableLoRAs && this.importManager.downloadableLoRAs.length > 0) {
await this.downloadMissingLoras(); await this.downloadMissingLoras();
} }
// Show success message // Show success message
if (isDownloadOnly) { if (isDownloadOnly) {
if (failedDownloads === 0) { if (skipDownload) {
showToast('toast.recipes.recipeSaved', {}, 'success');
} else if (failedDownloads === 0) {
showToast('toast.loras.downloadSuccessful', {}, 'success'); showToast('toast.loras.downloadSuccessful', {}, 'success');
} }
} else { } else {

View File

@@ -325,7 +325,8 @@ export class RecipeDataManager {
} }
updateNextButtonState() { updateNextButtonState() {
const nextButton = document.querySelector('#detailsStep .primary-btn'); const nextButton = document.getElementById('nextBtn');
const importOnlyBtn = document.getElementById('importOnlyBtn');
const actionsContainer = document.querySelector('#detailsStep .modal-actions'); const actionsContainer = document.querySelector('#detailsStep .modal-actions');
if (!nextButton || !actionsContainer) return; if (!nextButton || !actionsContainer) return;
@@ -365,7 +366,7 @@ export class RecipeDataManager {
buttonsContainer.parentNode.insertBefore(warningContainer, buttonsContainer); buttonsContainer.parentNode.insertBefore(warningContainer, buttonsContainer);
} }
// Check for duplicates but don't change button actions // Check for downloadable missing LoRAs
const missingNotDeleted = this.importManager.recipeData.loras.filter( const missingNotDeleted = this.importManager.recipeData.loras.filter(
lora => !lora.existsLocally && !lora.isDeleted lora => !lora.existsLocally && !lora.isDeleted
).length; ).length;
@@ -374,8 +375,16 @@ export class RecipeDataManager {
nextButton.classList.remove('warning-btn'); nextButton.classList.remove('warning-btn');
if (missingNotDeleted > 0) { if (missingNotDeleted > 0) {
nextButton.textContent = translate('recipes.controls.import.downloadMissingLoras', {}, 'Download Missing LoRAs'); // Show import only button and update primary button
if (importOnlyBtn) {
importOnlyBtn.style.display = 'inline-block';
}
nextButton.textContent = translate('recipes.controls.import.importAndDownload', {}, 'Import & Download') + ` (${missingNotDeleted})`;
} else { } else {
// Hide import only button and show save recipe
if (importOnlyBtn) {
importOnlyBtn.style.display = 'none';
}
nextButton.textContent = translate('recipes.controls.import.saveRecipe', {}, 'Save Recipe'); nextButton.textContent = translate('recipes.controls.import.saveRecipe', {}, 'Save Recipe');
} }
} }
@@ -440,8 +449,11 @@ export class RecipeDataManager {
// Store only downloadable LoRAs for the download step // Store only downloadable LoRAs for the download step
this.importManager.downloadableLoRAs = this.importManager.missingLoras; this.importManager.downloadableLoRAs = this.importManager.missingLoras;
this.importManager.proceedToLocation(); this.importManager.proceedToLocation();
} else if (this.importManager.missingLoras.length === 0 && this.importManager.recipeData.loras.some(l => !l.existsLocally)) {
// All missing LoRAs are deleted, save recipe without download
this.importManager.saveRecipe();
} else { } else {
// Otherwise, save the recipe directly // No missing LoRAs at all, save the recipe directly
this.importManager.saveRecipe(); this.importManager.saveRecipe();
} }
} }

View File

@@ -92,9 +92,10 @@
<!-- Duplicate recipes will be populated here --> <!-- Duplicate recipes will be populated here -->
</div> </div>
<div class="modal-actions"> <div class="modal-actions" id="detailsStepActions">
<button class="secondary-btn" onclick="importManager.backToUpload()">{{ t('common.actions.back') }}</button> <button class="secondary-btn" onclick="importManager.backToUpload()">{{ t('common.actions.back') }}</button>
<button class="primary-btn" onclick="importManager.proceedFromDetails()">{{ t('common.actions.next') }}</button> <button class="secondary-btn" id="importOnlyBtn" onclick="importManager.saveRecipeOnlyFromDetails()" style="display: none;">{{ t('recipes.controls.import.importRecipeOnly') }}</button>
<button class="primary-btn" id="nextBtn" onclick="importManager.proceedFromDetails()">{{ t('common.actions.next') }}</button>
</div> </div>
</div> </div>
@@ -159,7 +160,7 @@
<div class="modal-actions"> <div class="modal-actions">
<button class="secondary-btn" onclick="importManager.backToDetails()">{{ t('common.actions.back') }}</button> <button class="secondary-btn" onclick="importManager.backToDetails()">{{ t('common.actions.back') }}</button>
<button class="primary-btn" onclick="importManager.saveRecipe()">{{ t('recipes.controls.import.downloadAndSaveRecipe') }}</button> <button class="primary-btn" onclick="importManager.saveRecipe()">{{ t('recipes.controls.import.importAndDownload') }} <span id="downloadLoraCount"></span></button>
</div> </div>
</div> </div>
</div> </div>