diff --git a/locales/de.json b/locales/de.json index b6ba9b2a..12aed4e5 100644 --- a/locales/de.json +++ b/locales/de.json @@ -645,6 +645,8 @@ "root": "Stammverzeichnis", "browseFolders": "Ordner durchsuchen:", "downloadAndSaveRecipe": "Herunterladen & Rezept speichern", + "importRecipeOnly": "Nur Rezept importieren", + "importAndDownload": "Importieren & Herunterladen", "downloadMissingLoras": "Fehlende LoRAs herunterladen", "saveRecipe": "Rezept speichern", "loraCountInfo": "({existing}/{total} in Bibliothek)", @@ -732,61 +734,61 @@ } }, "batchImport": { - "title": "[TODO: Translate] Batch Import Recipes", - "action": "[TODO: Translate] Batch Import", - "urlList": "[TODO: Translate] URL List", - "directory": "[TODO: Translate] Directory", - "urlDescription": "[TODO: Translate] 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.", - "urlsLabel": "[TODO: Translate] Image URLs or Local Paths", - "urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", - "urlsHint": "[TODO: Translate] Enter one URL or path per line", - "directoryPath": "[TODO: Translate] Directory Path", - "directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", - "browse": "[TODO: Translate] Browse", - "recursive": "[TODO: Translate] Include subdirectories", - "tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", - "tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", - "tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", - "skipNoMetadata": "[TODO: Translate] Skip images without metadata", - "skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", - "start": "[TODO: Translate] Start Import", - "startImport": "[TODO: Translate] Start Import", - "importing": "[TODO: Translate] Importing...", - "progress": "[TODO: Translate] Progress", - "total": "[TODO: Translate] Total", - "success": "[TODO: Translate] Success", - "failed": "[TODO: Translate] Failed", - "skipped": "[TODO: Translate] Skipped", - "current": "[TODO: Translate] Current", - "currentItem": "[TODO: Translate] Current", - "preparing": "[TODO: Translate] Preparing...", - "cancel": "[TODO: Translate] Cancel", - "cancelImport": "[TODO: Translate] Cancel", - "cancelled": "[TODO: Translate] Import cancelled", - "completed": "[TODO: Translate] Import completed", - "completedWithErrors": "[TODO: Translate] Completed with errors", - "completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", - "successCount": "[TODO: Translate] Successful", - "failedCount": "[TODO: Translate] Failed", - "skippedCount": "[TODO: Translate] Skipped", - "totalProcessed": "[TODO: Translate] Total processed", - "viewDetails": "[TODO: Translate] View Details", - "newImport": "[TODO: Translate] New Import", - "manualPathEntry": "[TODO: Translate] 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.", - "batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", - "backToParent": "[TODO: Translate] Back to parent directory", - "folders": "[TODO: Translate] Folders", - "folderCount": "[TODO: Translate] {count} folders", - "imageFiles": "[TODO: Translate] Image Files", - "images": "[TODO: Translate] images", - "imageCount": "[TODO: Translate] {count} images", - "selectFolder": "[TODO: Translate] Select This Folder", + "title": "Batch Import Recipes", + "action": "Batch Import", + "urlList": "URL List", + "directory": "Directory", + "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", + "directoryDescription": "Enter a directory path to import all images from that folder.", + "urlsLabel": "Image URLs or Local Paths", + "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", + "urlsHint": "Enter one URL or path per line", + "directoryPath": "Directory Path", + "directoryPlaceholder": "/path/to/images/folder", + "browse": "Browse", + "recursive": "Include subdirectories", + "tagsOptional": "Tags (optional, applied to all recipes)", + "tagsPlaceholder": "Enter tags separated by commas", + "tagsHint": "Tags will be added to all imported recipes", + "skipNoMetadata": "Skip images without metadata", + "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.", + "start": "Start Import", + "startImport": "Start Import", + "importing": "Importing...", + "progress": "Progress", + "total": "Total", + "success": "Success", + "failed": "Failed", + "skipped": "Skipped", + "current": "Current", + "currentItem": "Current", + "preparing": "Preparing...", + "cancel": "Cancel", + "cancelImport": "Cancel", + "cancelled": "Import cancelled", + "completed": "Import completed", + "completedWithErrors": "Completed with errors", + "completedSuccess": "Successfully imported {count} recipe(s)", + "successCount": "Successful", + "failedCount": "Failed", + "skippedCount": "Skipped", + "totalProcessed": "Total processed", + "viewDetails": "View Details", + "newImport": "New Import", + "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.", + "batchImportDirectorySelected": "Directory selected: {path}", + "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.", + "backToParent": "Back to parent directory", + "folders": "Folders", + "folderCount": "{count} folders", + "imageFiles": "Image Files", + "images": "images", + "imageCount": "{count} images", + "selectFolder": "Select This Folder", "errors": { - "enterUrls": "[TODO: Translate] Please enter at least one URL or path", - "enterDirectory": "[TODO: Translate] Please enter a directory path", - "startFailed": "[TODO: Translate] Failed to start import: {message}" + "enterUrls": "Please enter at least one URL or path", + "enterDirectory": "Please enter a directory path", + "startFailed": "Failed to start import: {message}" } } }, @@ -1495,16 +1497,17 @@ "processingError": "Verarbeitungsfehler: {message}", "folderBrowserError": "Fehler beim Laden des Ordner-Browsers: {message}", "recipeSaveFailed": "Fehler beim Speichern des Rezepts: {error}", + "recipeSaved": "Recipe saved successfully", "importFailed": "Import fehlgeschlagen: {message}", "folderTreeFailed": "Fehler beim Laden des Ordnerbaums", "folderTreeError": "Fehler beim Laden des Ordnerbaums", - "batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", - "batchImportCancelling": "[TODO: Translate] Cancelling batch import...", - "batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", - "batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", - "batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", - "batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", - "batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" + "batchImportFailed": "Failed to start batch import: {message}", + "batchImportCancelling": "Cancelling batch import...", + "batchImportCancelFailed": "Failed to cancel batch import: {message}", + "batchImportNoUrls": "Please enter at least one URL or file path", + "batchImportNoDirectory": "Please enter a directory path", + "batchImportBrowseFailed": "Failed to browse directory: {message}", + "batchImportDirectorySelected": "Directory selected: {path}" }, "models": { "noModelsSelected": "Keine Modelle ausgewählt", diff --git a/locales/en.json b/locales/en.json index 4504011b..0a1e83d2 100644 --- a/locales/en.json +++ b/locales/en.json @@ -645,6 +645,8 @@ "root": "Root", "browseFolders": "Browse Folders:", "downloadAndSaveRecipe": "Download & Save Recipe", + "importRecipeOnly": "Import Recipe Only", + "importAndDownload": "Import & Download", "downloadMissingLoras": "Download Missing LoRAs", "saveRecipe": "Save Recipe", "loraCountInfo": "({existing}/{total} in library)", @@ -1495,6 +1497,7 @@ "processingError": "Processing error: {message}", "folderBrowserError": "Error loading folder browser: {message}", "recipeSaveFailed": "Failed to save recipe: {error}", + "recipeSaved": "Recipe saved successfully", "importFailed": "Import failed: {message}", "folderTreeFailed": "Failed to load folder tree", "folderTreeError": "Error loading folder tree", diff --git a/locales/es.json b/locales/es.json index f57dfea4..09d8f516 100644 --- a/locales/es.json +++ b/locales/es.json @@ -645,6 +645,8 @@ "root": "Raíz", "browseFolders": "Explorar carpetas:", "downloadAndSaveRecipe": "Descargar y guardar receta", + "importRecipeOnly": "Importar solo la receta", + "importAndDownload": "Importar y descargar", "downloadMissingLoras": "Descargar LoRAs faltantes", "saveRecipe": "Guardar receta", "loraCountInfo": "({existing}/{total} en la biblioteca)", @@ -732,61 +734,61 @@ } }, "batchImport": { - "title": "[TODO: Translate] Batch Import Recipes", - "action": "[TODO: Translate] Batch Import", - "urlList": "[TODO: Translate] URL List", - "directory": "[TODO: Translate] Directory", - "urlDescription": "[TODO: Translate] 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.", - "urlsLabel": "[TODO: Translate] Image URLs or Local Paths", - "urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", - "urlsHint": "[TODO: Translate] Enter one URL or path per line", - "directoryPath": "[TODO: Translate] Directory Path", - "directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", - "browse": "[TODO: Translate] Browse", - "recursive": "[TODO: Translate] Include subdirectories", - "tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", - "tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", - "tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", - "skipNoMetadata": "[TODO: Translate] Skip images without metadata", - "skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", - "start": "[TODO: Translate] Start Import", - "startImport": "[TODO: Translate] Start Import", - "importing": "[TODO: Translate] Importing...", - "progress": "[TODO: Translate] Progress", - "total": "[TODO: Translate] Total", - "success": "[TODO: Translate] Success", - "failed": "[TODO: Translate] Failed", - "skipped": "[TODO: Translate] Skipped", - "current": "[TODO: Translate] Current", - "currentItem": "[TODO: Translate] Current", - "preparing": "[TODO: Translate] Preparing...", - "cancel": "[TODO: Translate] Cancel", - "cancelImport": "[TODO: Translate] Cancel", - "cancelled": "[TODO: Translate] Import cancelled", - "completed": "[TODO: Translate] Import completed", - "completedWithErrors": "[TODO: Translate] Completed with errors", - "completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", - "successCount": "[TODO: Translate] Successful", - "failedCount": "[TODO: Translate] Failed", - "skippedCount": "[TODO: Translate] Skipped", - "totalProcessed": "[TODO: Translate] Total processed", - "viewDetails": "[TODO: Translate] View Details", - "newImport": "[TODO: Translate] New Import", - "manualPathEntry": "[TODO: Translate] 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.", - "batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", - "backToParent": "[TODO: Translate] Back to parent directory", - "folders": "[TODO: Translate] Folders", - "folderCount": "[TODO: Translate] {count} folders", - "imageFiles": "[TODO: Translate] Image Files", - "images": "[TODO: Translate] images", - "imageCount": "[TODO: Translate] {count} images", - "selectFolder": "[TODO: Translate] Select This Folder", + "title": "Batch Import Recipes", + "action": "Batch Import", + "urlList": "URL List", + "directory": "Directory", + "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", + "directoryDescription": "Enter a directory path to import all images from that folder.", + "urlsLabel": "Image URLs or Local Paths", + "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", + "urlsHint": "Enter one URL or path per line", + "directoryPath": "Directory Path", + "directoryPlaceholder": "/path/to/images/folder", + "browse": "Browse", + "recursive": "Include subdirectories", + "tagsOptional": "Tags (optional, applied to all recipes)", + "tagsPlaceholder": "Enter tags separated by commas", + "tagsHint": "Tags will be added to all imported recipes", + "skipNoMetadata": "Skip images without metadata", + "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.", + "start": "Start Import", + "startImport": "Start Import", + "importing": "Importing...", + "progress": "Progress", + "total": "Total", + "success": "Success", + "failed": "Failed", + "skipped": "Skipped", + "current": "Current", + "currentItem": "Current", + "preparing": "Preparing...", + "cancel": "Cancel", + "cancelImport": "Cancel", + "cancelled": "Import cancelled", + "completed": "Import completed", + "completedWithErrors": "Completed with errors", + "completedSuccess": "Successfully imported {count} recipe(s)", + "successCount": "Successful", + "failedCount": "Failed", + "skippedCount": "Skipped", + "totalProcessed": "Total processed", + "viewDetails": "View Details", + "newImport": "New Import", + "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.", + "batchImportDirectorySelected": "Directory selected: {path}", + "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.", + "backToParent": "Back to parent directory", + "folders": "Folders", + "folderCount": "{count} folders", + "imageFiles": "Image Files", + "images": "images", + "imageCount": "{count} images", + "selectFolder": "Select This Folder", "errors": { - "enterUrls": "[TODO: Translate] Please enter at least one URL or path", - "enterDirectory": "[TODO: Translate] Please enter a directory path", - "startFailed": "[TODO: Translate] Failed to start import: {message}" + "enterUrls": "Please enter at least one URL or path", + "enterDirectory": "Please enter a directory path", + "startFailed": "Failed to start import: {message}" } } }, @@ -1495,16 +1497,17 @@ "processingError": "Error de procesamiento: {message}", "folderBrowserError": "Error cargando explorador de carpetas: {message}", "recipeSaveFailed": "Error al guardar receta: {error}", + "recipeSaved": "Recipe saved successfully", "importFailed": "Importación falló: {message}", "folderTreeFailed": "Error al cargar árbol de carpetas", "folderTreeError": "Error cargando árbol de carpetas", - "batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", - "batchImportCancelling": "[TODO: Translate] Cancelling batch import...", - "batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", - "batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", - "batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", - "batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", - "batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" + "batchImportFailed": "Failed to start batch import: {message}", + "batchImportCancelling": "Cancelling batch import...", + "batchImportCancelFailed": "Failed to cancel batch import: {message}", + "batchImportNoUrls": "Please enter at least one URL or file path", + "batchImportNoDirectory": "Please enter a directory path", + "batchImportBrowseFailed": "Failed to browse directory: {message}", + "batchImportDirectorySelected": "Directory selected: {path}" }, "models": { "noModelsSelected": "No hay modelos seleccionados", diff --git a/locales/fr.json b/locales/fr.json index d9231b56..7984452b 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -645,6 +645,8 @@ "root": "Racine", "browseFolders": "Parcourir les dossiers :", "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", "saveRecipe": "Sauvegarder la recipe", "loraCountInfo": "({existing}/{total} dans la bibliothèque)", @@ -732,61 +734,61 @@ } }, "batchImport": { - "title": "[TODO: Translate] Batch Import Recipes", - "action": "[TODO: Translate] Batch Import", - "urlList": "[TODO: Translate] URL List", - "directory": "[TODO: Translate] Directory", - "urlDescription": "[TODO: Translate] 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.", - "urlsLabel": "[TODO: Translate] Image URLs or Local Paths", - "urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", - "urlsHint": "[TODO: Translate] Enter one URL or path per line", - "directoryPath": "[TODO: Translate] Directory Path", - "directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", - "browse": "[TODO: Translate] Browse", - "recursive": "[TODO: Translate] Include subdirectories", - "tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", - "tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", - "tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", - "skipNoMetadata": "[TODO: Translate] Skip images without metadata", - "skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", - "start": "[TODO: Translate] Start Import", - "startImport": "[TODO: Translate] Start Import", - "importing": "[TODO: Translate] Importing...", - "progress": "[TODO: Translate] Progress", - "total": "[TODO: Translate] Total", - "success": "[TODO: Translate] Success", - "failed": "[TODO: Translate] Failed", - "skipped": "[TODO: Translate] Skipped", - "current": "[TODO: Translate] Current", - "currentItem": "[TODO: Translate] Current", - "preparing": "[TODO: Translate] Preparing...", - "cancel": "[TODO: Translate] Cancel", - "cancelImport": "[TODO: Translate] Cancel", - "cancelled": "[TODO: Translate] Import cancelled", - "completed": "[TODO: Translate] Import completed", - "completedWithErrors": "[TODO: Translate] Completed with errors", - "completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", - "successCount": "[TODO: Translate] Successful", - "failedCount": "[TODO: Translate] Failed", - "skippedCount": "[TODO: Translate] Skipped", - "totalProcessed": "[TODO: Translate] Total processed", - "viewDetails": "[TODO: Translate] View Details", - "newImport": "[TODO: Translate] New Import", - "manualPathEntry": "[TODO: Translate] 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.", - "batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", - "backToParent": "[TODO: Translate] Back to parent directory", - "folders": "[TODO: Translate] Folders", - "folderCount": "[TODO: Translate] {count} folders", - "imageFiles": "[TODO: Translate] Image Files", - "images": "[TODO: Translate] images", - "imageCount": "[TODO: Translate] {count} images", - "selectFolder": "[TODO: Translate] Select This Folder", + "title": "Batch Import Recipes", + "action": "Batch Import", + "urlList": "URL List", + "directory": "Directory", + "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", + "directoryDescription": "Enter a directory path to import all images from that folder.", + "urlsLabel": "Image URLs or Local Paths", + "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", + "urlsHint": "Enter one URL or path per line", + "directoryPath": "Directory Path", + "directoryPlaceholder": "/path/to/images/folder", + "browse": "Browse", + "recursive": "Include subdirectories", + "tagsOptional": "Tags (optional, applied to all recipes)", + "tagsPlaceholder": "Enter tags separated by commas", + "tagsHint": "Tags will be added to all imported recipes", + "skipNoMetadata": "Skip images without metadata", + "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.", + "start": "Start Import", + "startImport": "Start Import", + "importing": "Importing...", + "progress": "Progress", + "total": "Total", + "success": "Success", + "failed": "Failed", + "skipped": "Skipped", + "current": "Current", + "currentItem": "Current", + "preparing": "Preparing...", + "cancel": "Cancel", + "cancelImport": "Cancel", + "cancelled": "Import cancelled", + "completed": "Import completed", + "completedWithErrors": "Completed with errors", + "completedSuccess": "Successfully imported {count} recipe(s)", + "successCount": "Successful", + "failedCount": "Failed", + "skippedCount": "Skipped", + "totalProcessed": "Total processed", + "viewDetails": "View Details", + "newImport": "New Import", + "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.", + "batchImportDirectorySelected": "Directory selected: {path}", + "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.", + "backToParent": "Back to parent directory", + "folders": "Folders", + "folderCount": "{count} folders", + "imageFiles": "Image Files", + "images": "images", + "imageCount": "{count} images", + "selectFolder": "Select This Folder", "errors": { - "enterUrls": "[TODO: Translate] Please enter at least one URL or path", - "enterDirectory": "[TODO: Translate] Please enter a directory path", - "startFailed": "[TODO: Translate] Failed to start import: {message}" + "enterUrls": "Please enter at least one URL or path", + "enterDirectory": "Please enter a directory path", + "startFailed": "Failed to start import: {message}" } } }, @@ -1495,16 +1497,17 @@ "processingError": "Erreur de traitement : {message}", "folderBrowserError": "Erreur lors du chargement du navigateur de dossiers : {message}", "recipeSaveFailed": "Échec de la sauvegarde de la recipe : {error}", + "recipeSaved": "Recipe saved successfully", "importFailed": "Échec de l'importation : {message}", "folderTreeFailed": "Échec 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}", - "batchImportCancelling": "[TODO: Translate] Cancelling batch import...", - "batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", - "batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", - "batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", - "batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", - "batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" + "batchImportFailed": "Failed to start batch import: {message}", + "batchImportCancelling": "Cancelling batch import...", + "batchImportCancelFailed": "Failed to cancel batch import: {message}", + "batchImportNoUrls": "Please enter at least one URL or file path", + "batchImportNoDirectory": "Please enter a directory path", + "batchImportBrowseFailed": "Failed to browse directory: {message}", + "batchImportDirectorySelected": "Directory selected: {path}" }, "models": { "noModelsSelected": "Aucun modèle sélectionné", diff --git a/locales/he.json b/locales/he.json index dfe9ede9..ff645faa 100644 --- a/locales/he.json +++ b/locales/he.json @@ -645,6 +645,8 @@ "root": "שורש", "browseFolders": "דפדף בתיקיות:", "downloadAndSaveRecipe": "הורד ושמור מתכון", + "importRecipeOnly": "יבא רק מתכון", + "importAndDownload": "יבא והורד", "downloadMissingLoras": "הורד LoRAs חסרים", "saveRecipe": "שמור מתכון", "loraCountInfo": "({existing}/{total} בספרייה)", @@ -732,61 +734,61 @@ } }, "batchImport": { - "title": "[TODO: Translate] Batch Import Recipes", - "action": "[TODO: Translate] Batch Import", - "urlList": "[TODO: Translate] URL List", - "directory": "[TODO: Translate] Directory", - "urlDescription": "[TODO: Translate] 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.", - "urlsLabel": "[TODO: Translate] Image URLs or Local Paths", - "urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", - "urlsHint": "[TODO: Translate] Enter one URL or path per line", - "directoryPath": "[TODO: Translate] Directory Path", - "directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", - "browse": "[TODO: Translate] Browse", - "recursive": "[TODO: Translate] Include subdirectories", - "tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", - "tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", - "tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", - "skipNoMetadata": "[TODO: Translate] Skip images without metadata", - "skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", - "start": "[TODO: Translate] Start Import", - "startImport": "[TODO: Translate] Start Import", - "importing": "[TODO: Translate] Importing...", - "progress": "[TODO: Translate] Progress", - "total": "[TODO: Translate] Total", - "success": "[TODO: Translate] Success", - "failed": "[TODO: Translate] Failed", - "skipped": "[TODO: Translate] Skipped", - "current": "[TODO: Translate] Current", - "currentItem": "[TODO: Translate] Current", - "preparing": "[TODO: Translate] Preparing...", - "cancel": "[TODO: Translate] Cancel", - "cancelImport": "[TODO: Translate] Cancel", - "cancelled": "[TODO: Translate] Import cancelled", - "completed": "[TODO: Translate] Import completed", - "completedWithErrors": "[TODO: Translate] Completed with errors", - "completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", - "successCount": "[TODO: Translate] Successful", - "failedCount": "[TODO: Translate] Failed", - "skippedCount": "[TODO: Translate] Skipped", - "totalProcessed": "[TODO: Translate] Total processed", - "viewDetails": "[TODO: Translate] View Details", - "newImport": "[TODO: Translate] New Import", - "manualPathEntry": "[TODO: Translate] 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.", - "batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", - "backToParent": "[TODO: Translate] Back to parent directory", - "folders": "[TODO: Translate] Folders", - "folderCount": "[TODO: Translate] {count} folders", - "imageFiles": "[TODO: Translate] Image Files", - "images": "[TODO: Translate] images", - "imageCount": "[TODO: Translate] {count} images", - "selectFolder": "[TODO: Translate] Select This Folder", + "title": "Batch Import Recipes", + "action": "Batch Import", + "urlList": "URL List", + "directory": "Directory", + "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", + "directoryDescription": "Enter a directory path to import all images from that folder.", + "urlsLabel": "Image URLs or Local Paths", + "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", + "urlsHint": "Enter one URL or path per line", + "directoryPath": "Directory Path", + "directoryPlaceholder": "/path/to/images/folder", + "browse": "Browse", + "recursive": "Include subdirectories", + "tagsOptional": "Tags (optional, applied to all recipes)", + "tagsPlaceholder": "Enter tags separated by commas", + "tagsHint": "Tags will be added to all imported recipes", + "skipNoMetadata": "Skip images without metadata", + "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.", + "start": "Start Import", + "startImport": "Start Import", + "importing": "Importing...", + "progress": "Progress", + "total": "Total", + "success": "Success", + "failed": "Failed", + "skipped": "Skipped", + "current": "Current", + "currentItem": "Current", + "preparing": "Preparing...", + "cancel": "Cancel", + "cancelImport": "Cancel", + "cancelled": "Import cancelled", + "completed": "Import completed", + "completedWithErrors": "Completed with errors", + "completedSuccess": "Successfully imported {count} recipe(s)", + "successCount": "Successful", + "failedCount": "Failed", + "skippedCount": "Skipped", + "totalProcessed": "Total processed", + "viewDetails": "View Details", + "newImport": "New Import", + "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.", + "batchImportDirectorySelected": "Directory selected: {path}", + "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.", + "backToParent": "Back to parent directory", + "folders": "Folders", + "folderCount": "{count} folders", + "imageFiles": "Image Files", + "images": "images", + "imageCount": "{count} images", + "selectFolder": "Select This Folder", "errors": { - "enterUrls": "[TODO: Translate] Please enter at least one URL or path", - "enterDirectory": "[TODO: Translate] Please enter a directory path", - "startFailed": "[TODO: Translate] Failed to start import: {message}" + "enterUrls": "Please enter at least one URL or path", + "enterDirectory": "Please enter a directory path", + "startFailed": "Failed to start import: {message}" } } }, @@ -1495,16 +1497,17 @@ "processingError": "שגיאת עיבוד: {message}", "folderBrowserError": "שגיאה בטעינת דפדפן התיקיות: {message}", "recipeSaveFailed": "שמירת המתכון נכשלה: {error}", + "recipeSaved": "Recipe saved successfully", "importFailed": "הייבוא נכשל: {message}", "folderTreeFailed": "טעינת עץ התיקיות נכשלה", "folderTreeError": "שגיאה בטעינת עץ התיקיות", - "batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", - "batchImportCancelling": "[TODO: Translate] Cancelling batch import...", - "batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", - "batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", - "batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", - "batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", - "batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" + "batchImportFailed": "Failed to start batch import: {message}", + "batchImportCancelling": "Cancelling batch import...", + "batchImportCancelFailed": "Failed to cancel batch import: {message}", + "batchImportNoUrls": "Please enter at least one URL or file path", + "batchImportNoDirectory": "Please enter a directory path", + "batchImportBrowseFailed": "Failed to browse directory: {message}", + "batchImportDirectorySelected": "Directory selected: {path}" }, "models": { "noModelsSelected": "לא נבחרו מודלים", diff --git a/locales/ja.json b/locales/ja.json index 809c027e..035805e7 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -645,6 +645,8 @@ "root": "ルート", "browseFolders": "フォルダを参照:", "downloadAndSaveRecipe": "ダウンロード & レシピ保存", + "importRecipeOnly": "レシピのみインポート", + "importAndDownload": "インポートとダウンロード", "downloadMissingLoras": "不足しているLoRAをダウンロード", "saveRecipe": "レシピを保存", "loraCountInfo": "({existing}/{total} ライブラリ内)", @@ -732,61 +734,61 @@ } }, "batchImport": { - "title": "[TODO: Translate] Batch Import Recipes", - "action": "[TODO: Translate] Batch Import", - "urlList": "[TODO: Translate] URL List", - "directory": "[TODO: Translate] Directory", - "urlDescription": "[TODO: Translate] 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.", - "urlsLabel": "[TODO: Translate] Image URLs or Local Paths", - "urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", - "urlsHint": "[TODO: Translate] Enter one URL or path per line", - "directoryPath": "[TODO: Translate] Directory Path", - "directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", - "browse": "[TODO: Translate] Browse", - "recursive": "[TODO: Translate] Include subdirectories", - "tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", - "tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", - "tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", - "skipNoMetadata": "[TODO: Translate] Skip images without metadata", - "skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", - "start": "[TODO: Translate] Start Import", - "startImport": "[TODO: Translate] Start Import", - "importing": "[TODO: Translate] Importing...", - "progress": "[TODO: Translate] Progress", - "total": "[TODO: Translate] Total", - "success": "[TODO: Translate] Success", - "failed": "[TODO: Translate] Failed", - "skipped": "[TODO: Translate] Skipped", - "current": "[TODO: Translate] Current", - "currentItem": "[TODO: Translate] Current", - "preparing": "[TODO: Translate] Preparing...", - "cancel": "[TODO: Translate] Cancel", - "cancelImport": "[TODO: Translate] Cancel", - "cancelled": "[TODO: Translate] Import cancelled", - "completed": "[TODO: Translate] Import completed", - "completedWithErrors": "[TODO: Translate] Completed with errors", - "completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", - "successCount": "[TODO: Translate] Successful", - "failedCount": "[TODO: Translate] Failed", - "skippedCount": "[TODO: Translate] Skipped", - "totalProcessed": "[TODO: Translate] Total processed", - "viewDetails": "[TODO: Translate] View Details", - "newImport": "[TODO: Translate] New Import", - "manualPathEntry": "[TODO: Translate] 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.", - "batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", - "backToParent": "[TODO: Translate] Back to parent directory", - "folders": "[TODO: Translate] Folders", - "folderCount": "[TODO: Translate] {count} folders", - "imageFiles": "[TODO: Translate] Image Files", - "images": "[TODO: Translate] images", - "imageCount": "[TODO: Translate] {count} images", - "selectFolder": "[TODO: Translate] Select This Folder", + "title": "Batch Import Recipes", + "action": "Batch Import", + "urlList": "URL List", + "directory": "Directory", + "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", + "directoryDescription": "Enter a directory path to import all images from that folder.", + "urlsLabel": "Image URLs or Local Paths", + "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", + "urlsHint": "Enter one URL or path per line", + "directoryPath": "Directory Path", + "directoryPlaceholder": "/path/to/images/folder", + "browse": "Browse", + "recursive": "Include subdirectories", + "tagsOptional": "Tags (optional, applied to all recipes)", + "tagsPlaceholder": "Enter tags separated by commas", + "tagsHint": "Tags will be added to all imported recipes", + "skipNoMetadata": "Skip images without metadata", + "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.", + "start": "Start Import", + "startImport": "Start Import", + "importing": "Importing...", + "progress": "Progress", + "total": "Total", + "success": "Success", + "failed": "Failed", + "skipped": "Skipped", + "current": "Current", + "currentItem": "Current", + "preparing": "Preparing...", + "cancel": "Cancel", + "cancelImport": "Cancel", + "cancelled": "Import cancelled", + "completed": "Import completed", + "completedWithErrors": "Completed with errors", + "completedSuccess": "Successfully imported {count} recipe(s)", + "successCount": "Successful", + "failedCount": "Failed", + "skippedCount": "Skipped", + "totalProcessed": "Total processed", + "viewDetails": "View Details", + "newImport": "New Import", + "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.", + "batchImportDirectorySelected": "Directory selected: {path}", + "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.", + "backToParent": "Back to parent directory", + "folders": "Folders", + "folderCount": "{count} folders", + "imageFiles": "Image Files", + "images": "images", + "imageCount": "{count} images", + "selectFolder": "Select This Folder", "errors": { - "enterUrls": "[TODO: Translate] Please enter at least one URL or path", - "enterDirectory": "[TODO: Translate] Please enter a directory path", - "startFailed": "[TODO: Translate] Failed to start import: {message}" + "enterUrls": "Please enter at least one URL or path", + "enterDirectory": "Please enter a directory path", + "startFailed": "Failed to start import: {message}" } } }, @@ -1495,16 +1497,17 @@ "processingError": "処理エラー:{message}", "folderBrowserError": "フォルダブラウザの読み込みエラー:{message}", "recipeSaveFailed": "レシピの保存に失敗しました:{error}", + "recipeSaved": "Recipe saved successfully", "importFailed": "インポートに失敗しました:{message}", "folderTreeFailed": "フォルダツリーの読み込みに失敗しました", "folderTreeError": "フォルダツリー読み込みエラー", - "batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", - "batchImportCancelling": "[TODO: Translate] Cancelling batch import...", - "batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", - "batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", - "batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", - "batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", - "batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" + "batchImportFailed": "Failed to start batch import: {message}", + "batchImportCancelling": "Cancelling batch import...", + "batchImportCancelFailed": "Failed to cancel batch import: {message}", + "batchImportNoUrls": "Please enter at least one URL or file path", + "batchImportNoDirectory": "Please enter a directory path", + "batchImportBrowseFailed": "Failed to browse directory: {message}", + "batchImportDirectorySelected": "Directory selected: {path}" }, "models": { "noModelsSelected": "モデルが選択されていません", diff --git a/locales/ko.json b/locales/ko.json index 4152d93a..177ff18a 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -645,6 +645,8 @@ "root": "루트", "browseFolders": "폴더 탐색:", "downloadAndSaveRecipe": "다운로드 및 레시피 저장", + "importRecipeOnly": "레시피만 가져오기", + "importAndDownload": "가져오기 및 다운로드", "downloadMissingLoras": "누락된 LoRA 다운로드", "saveRecipe": "레시피 저장", "loraCountInfo": "({existing}/{total} 라이브러리에 있음)", @@ -732,61 +734,61 @@ } }, "batchImport": { - "title": "[TODO: Translate] Batch Import Recipes", - "action": "[TODO: Translate] Batch Import", - "urlList": "[TODO: Translate] URL List", - "directory": "[TODO: Translate] Directory", - "urlDescription": "[TODO: Translate] 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.", - "urlsLabel": "[TODO: Translate] Image URLs or Local Paths", - "urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", - "urlsHint": "[TODO: Translate] Enter one URL or path per line", - "directoryPath": "[TODO: Translate] Directory Path", - "directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", - "browse": "[TODO: Translate] Browse", - "recursive": "[TODO: Translate] Include subdirectories", - "tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", - "tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", - "tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", - "skipNoMetadata": "[TODO: Translate] Skip images without metadata", - "skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", - "start": "[TODO: Translate] Start Import", - "startImport": "[TODO: Translate] Start Import", - "importing": "[TODO: Translate] Importing...", - "progress": "[TODO: Translate] Progress", - "total": "[TODO: Translate] Total", - "success": "[TODO: Translate] Success", - "failed": "[TODO: Translate] Failed", - "skipped": "[TODO: Translate] Skipped", - "current": "[TODO: Translate] Current", - "currentItem": "[TODO: Translate] Current", - "preparing": "[TODO: Translate] Preparing...", - "cancel": "[TODO: Translate] Cancel", - "cancelImport": "[TODO: Translate] Cancel", - "cancelled": "[TODO: Translate] Import cancelled", - "completed": "[TODO: Translate] Import completed", - "completedWithErrors": "[TODO: Translate] Completed with errors", - "completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", - "successCount": "[TODO: Translate] Successful", - "failedCount": "[TODO: Translate] Failed", - "skippedCount": "[TODO: Translate] Skipped", - "totalProcessed": "[TODO: Translate] Total processed", - "viewDetails": "[TODO: Translate] View Details", - "newImport": "[TODO: Translate] New Import", - "manualPathEntry": "[TODO: Translate] 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.", - "batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", - "backToParent": "[TODO: Translate] Back to parent directory", - "folders": "[TODO: Translate] Folders", - "folderCount": "[TODO: Translate] {count} folders", - "imageFiles": "[TODO: Translate] Image Files", - "images": "[TODO: Translate] images", - "imageCount": "[TODO: Translate] {count} images", - "selectFolder": "[TODO: Translate] Select This Folder", + "title": "Batch Import Recipes", + "action": "Batch Import", + "urlList": "URL List", + "directory": "Directory", + "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", + "directoryDescription": "Enter a directory path to import all images from that folder.", + "urlsLabel": "Image URLs or Local Paths", + "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", + "urlsHint": "Enter one URL or path per line", + "directoryPath": "Directory Path", + "directoryPlaceholder": "/path/to/images/folder", + "browse": "Browse", + "recursive": "Include subdirectories", + "tagsOptional": "Tags (optional, applied to all recipes)", + "tagsPlaceholder": "Enter tags separated by commas", + "tagsHint": "Tags will be added to all imported recipes", + "skipNoMetadata": "Skip images without metadata", + "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.", + "start": "Start Import", + "startImport": "Start Import", + "importing": "Importing...", + "progress": "Progress", + "total": "Total", + "success": "Success", + "failed": "Failed", + "skipped": "Skipped", + "current": "Current", + "currentItem": "Current", + "preparing": "Preparing...", + "cancel": "Cancel", + "cancelImport": "Cancel", + "cancelled": "Import cancelled", + "completed": "Import completed", + "completedWithErrors": "Completed with errors", + "completedSuccess": "Successfully imported {count} recipe(s)", + "successCount": "Successful", + "failedCount": "Failed", + "skippedCount": "Skipped", + "totalProcessed": "Total processed", + "viewDetails": "View Details", + "newImport": "New Import", + "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.", + "batchImportDirectorySelected": "Directory selected: {path}", + "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.", + "backToParent": "Back to parent directory", + "folders": "Folders", + "folderCount": "{count} folders", + "imageFiles": "Image Files", + "images": "images", + "imageCount": "{count} images", + "selectFolder": "Select This Folder", "errors": { - "enterUrls": "[TODO: Translate] Please enter at least one URL or path", - "enterDirectory": "[TODO: Translate] Please enter a directory path", - "startFailed": "[TODO: Translate] Failed to start import: {message}" + "enterUrls": "Please enter at least one URL or path", + "enterDirectory": "Please enter a directory path", + "startFailed": "Failed to start import: {message}" } } }, @@ -1495,16 +1497,17 @@ "processingError": "처리 오류: {message}", "folderBrowserError": "폴더 브라우저 로딩 오류: {message}", "recipeSaveFailed": "레시피 저장 실패: {error}", + "recipeSaved": "Recipe saved successfully", "importFailed": "가져오기 실패: {message}", "folderTreeFailed": "폴더 트리 로딩 실패", "folderTreeError": "폴더 트리 로딩 오류", - "batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", - "batchImportCancelling": "[TODO: Translate] Cancelling batch import...", - "batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", - "batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", - "batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", - "batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", - "batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" + "batchImportFailed": "Failed to start batch import: {message}", + "batchImportCancelling": "Cancelling batch import...", + "batchImportCancelFailed": "Failed to cancel batch import: {message}", + "batchImportNoUrls": "Please enter at least one URL or file path", + "batchImportNoDirectory": "Please enter a directory path", + "batchImportBrowseFailed": "Failed to browse directory: {message}", + "batchImportDirectorySelected": "Directory selected: {path}" }, "models": { "noModelsSelected": "선택된 모델이 없습니다", diff --git a/locales/ru.json b/locales/ru.json index 1856fa99..309bad14 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -645,6 +645,8 @@ "root": "Корень", "browseFolders": "Обзор папок:", "downloadAndSaveRecipe": "Скачать и сохранить рецепт", + "importRecipeOnly": "Импортировать только рецепт", + "importAndDownload": "Импорт и скачивание", "downloadMissingLoras": "Скачать отсутствующие LoRAs", "saveRecipe": "Сохранить рецепт", "loraCountInfo": "({existing}/{total} в библиотеке)", @@ -732,61 +734,61 @@ } }, "batchImport": { - "title": "[TODO: Translate] Batch Import Recipes", - "action": "[TODO: Translate] Batch Import", - "urlList": "[TODO: Translate] URL List", - "directory": "[TODO: Translate] Directory", - "urlDescription": "[TODO: Translate] 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.", - "urlsLabel": "[TODO: Translate] Image URLs or Local Paths", - "urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", - "urlsHint": "[TODO: Translate] Enter one URL or path per line", - "directoryPath": "[TODO: Translate] Directory Path", - "directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", - "browse": "[TODO: Translate] Browse", - "recursive": "[TODO: Translate] Include subdirectories", - "tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", - "tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", - "tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", - "skipNoMetadata": "[TODO: Translate] Skip images without metadata", - "skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", - "start": "[TODO: Translate] Start Import", - "startImport": "[TODO: Translate] Start Import", - "importing": "[TODO: Translate] Importing...", - "progress": "[TODO: Translate] Progress", - "total": "[TODO: Translate] Total", - "success": "[TODO: Translate] Success", - "failed": "[TODO: Translate] Failed", - "skipped": "[TODO: Translate] Skipped", - "current": "[TODO: Translate] Current", - "currentItem": "[TODO: Translate] Current", - "preparing": "[TODO: Translate] Preparing...", - "cancel": "[TODO: Translate] Cancel", - "cancelImport": "[TODO: Translate] Cancel", - "cancelled": "[TODO: Translate] Import cancelled", - "completed": "[TODO: Translate] Import completed", - "completedWithErrors": "[TODO: Translate] Completed with errors", - "completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", - "successCount": "[TODO: Translate] Successful", - "failedCount": "[TODO: Translate] Failed", - "skippedCount": "[TODO: Translate] Skipped", - "totalProcessed": "[TODO: Translate] Total processed", - "viewDetails": "[TODO: Translate] View Details", - "newImport": "[TODO: Translate] New Import", - "manualPathEntry": "[TODO: Translate] 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.", - "batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", - "backToParent": "[TODO: Translate] Back to parent directory", - "folders": "[TODO: Translate] Folders", - "folderCount": "[TODO: Translate] {count} folders", - "imageFiles": "[TODO: Translate] Image Files", - "images": "[TODO: Translate] images", - "imageCount": "[TODO: Translate] {count} images", - "selectFolder": "[TODO: Translate] Select This Folder", + "title": "Batch Import Recipes", + "action": "Batch Import", + "urlList": "URL List", + "directory": "Directory", + "urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", + "directoryDescription": "Enter a directory path to import all images from that folder.", + "urlsLabel": "Image URLs or Local Paths", + "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", + "urlsHint": "Enter one URL or path per line", + "directoryPath": "Directory Path", + "directoryPlaceholder": "/path/to/images/folder", + "browse": "Browse", + "recursive": "Include subdirectories", + "tagsOptional": "Tags (optional, applied to all recipes)", + "tagsPlaceholder": "Enter tags separated by commas", + "tagsHint": "Tags will be added to all imported recipes", + "skipNoMetadata": "Skip images without metadata", + "skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.", + "start": "Start Import", + "startImport": "Start Import", + "importing": "Importing...", + "progress": "Progress", + "total": "Total", + "success": "Success", + "failed": "Failed", + "skipped": "Skipped", + "current": "Current", + "currentItem": "Current", + "preparing": "Preparing...", + "cancel": "Cancel", + "cancelImport": "Cancel", + "cancelled": "Import cancelled", + "completed": "Import completed", + "completedWithErrors": "Completed with errors", + "completedSuccess": "Successfully imported {count} recipe(s)", + "successCount": "Successful", + "failedCount": "Failed", + "skippedCount": "Skipped", + "totalProcessed": "Total processed", + "viewDetails": "View Details", + "newImport": "New Import", + "manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.", + "batchImportDirectorySelected": "Directory selected: {path}", + "batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.", + "backToParent": "Back to parent directory", + "folders": "Folders", + "folderCount": "{count} folders", + "imageFiles": "Image Files", + "images": "images", + "imageCount": "{count} images", + "selectFolder": "Select This Folder", "errors": { - "enterUrls": "[TODO: Translate] Please enter at least one URL or path", - "enterDirectory": "[TODO: Translate] Please enter a directory path", - "startFailed": "[TODO: Translate] Failed to start import: {message}" + "enterUrls": "Please enter at least one URL or path", + "enterDirectory": "Please enter a directory path", + "startFailed": "Failed to start import: {message}" } } }, @@ -1495,16 +1497,17 @@ "processingError": "Ошибка обработки: {message}", "folderBrowserError": "Ошибка загрузки браузера папок: {message}", "recipeSaveFailed": "Не удалось сохранить рецепт: {error}", + "recipeSaved": "Recipe saved successfully", "importFailed": "Импорт не удался: {message}", "folderTreeFailed": "Не удалось загрузить дерево папок", "folderTreeError": "Ошибка загрузки дерева папок", - "batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", - "batchImportCancelling": "[TODO: Translate] Cancelling batch import...", - "batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", - "batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", - "batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", - "batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", - "batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" + "batchImportFailed": "Failed to start batch import: {message}", + "batchImportCancelling": "Cancelling batch import...", + "batchImportCancelFailed": "Failed to cancel batch import: {message}", + "batchImportNoUrls": "Please enter at least one URL or file path", + "batchImportNoDirectory": "Please enter a directory path", + "batchImportBrowseFailed": "Failed to browse directory: {message}", + "batchImportDirectorySelected": "Directory selected: {path}" }, "models": { "noModelsSelected": "Модели не выбраны", diff --git a/locales/zh-CN.json b/locales/zh-CN.json index 50243c89..e6fbd385 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -645,6 +645,8 @@ "root": "根目录", "browseFolders": "浏览文件夹:", "downloadAndSaveRecipe": "下载并保存配方", + "importRecipeOnly": "仅导入配方", + "importAndDownload": "导入并下载", "downloadMissingLoras": "下载缺失的 LoRA", "saveRecipe": "保存配方", "loraCountInfo": "({existing}/{total} in library)", @@ -734,55 +736,55 @@ "batchImport": { "title": "批量导入配方", "action": "批量导入", - "urlList": "[TODO: Translate] URL List", - "directory": "[TODO: Translate] Directory", - "urlDescription": "[TODO: Translate] Enter image URLs or local file paths (one per line). Each will be imported as a recipe.", + "urlList": "URL 列表", + "directory": "目录", + "urlDescription": "输入图像 URL 或本地文件路径(每行一个)。每个都将作为配方导入。", "directoryDescription": "输入目录路径以导入该文件夹中的所有图片。", "urlsLabel": "图片 URL 或本地路径", "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", - "directoryPath": "[TODO: Translate] Directory Path", + "urlsHint": "每行输入一个 URL 或路径", + "directoryPath": "目录路径", "directoryPlaceholder": "/图片/文件夹/路径", - "browse": "[TODO: Translate] Browse", - "recursive": "[TODO: Translate] Include subdirectories", + "browse": "浏览", + "recursive": "包含子目录", "tagsOptional": "标签(可选,应用于所有配方)", - "tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", - "tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", + "tagsPlaceholder": "输入以逗号分隔的标签", + "tagsHint": "标签将被添加到所有导入的配方中", "skipNoMetadata": "跳过无元数据的图片", "skipNoMetadataHelp": "没有 LoRA 元数据的图片将自动跳过。", - "start": "[TODO: Translate] Start Import", + "start": "开始导入", "startImport": "开始导入", "importing": "正在导入配方...", "progress": "进度", - "total": "[TODO: Translate] Total", - "success": "[TODO: Translate] Success", - "failed": "[TODO: Translate] Failed", - "skipped": "[TODO: Translate] Skipped", - "current": "[TODO: Translate] Current", + "total": "总计", + "success": "成功", + "failed": "失败", + "skipped": "跳过", + "current": "当前", "currentItem": "当前", "preparing": "准备中...", - "cancel": "[TODO: Translate] Cancel", + "cancel": "取消", "cancelImport": "取消", "cancelled": "批量导入已取消", "completed": "导入完成", - "completedWithErrors": "[TODO: Translate] Completed with errors", + "completedWithErrors": "导入完成但有错误", "completedSuccess": "成功导入 {count} 个配方", "successCount": "成功", "failedCount": "失败", "skippedCount": "跳过", "totalProcessed": "总计处理", - "viewDetails": "[TODO: Translate] View Details", - "newImport": "[TODO: Translate] New Import", - "manualPathEntry": "[TODO: Translate] 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.", - "batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", - "backToParent": "[TODO: Translate] Back to parent directory", - "folders": "[TODO: Translate] Folders", - "folderCount": "[TODO: Translate] {count} folders", - "imageFiles": "[TODO: Translate] Image Files", - "images": "[TODO: Translate] images", - "imageCount": "[TODO: Translate] {count} images", - "selectFolder": "[TODO: Translate] Select This Folder", + "viewDetails": "查看详情", + "newImport": "新建导入", + "manualPathEntry": "请手动输入目录路径。此浏览器中文件浏览器不可用。", + "batchImportDirectorySelected": "已选择目录:{path}", + "batchImportManualEntryRequired": "文件浏览器不可用。请手动输入目录路径。", + "backToParent": "返回上级目录", + "folders": "文件夹", + "folderCount": "{count} 个文件夹", + "imageFiles": "图像文件", + "images": "图像", + "imageCount": "{count} 个图像", + "selectFolder": "选择此文件夹", "errors": { "enterUrls": "请至少输入一个 URL 或路径", "enterDirectory": "请输入目录路径", @@ -1495,16 +1497,17 @@ "processingError": "处理出错:{message}", "folderBrowserError": "加载文件夹浏览器出错:{message}", "recipeSaveFailed": "保存配方失败:{error}", + "recipeSaved": "配方保存成功", "importFailed": "导入失败:{message}", "folderTreeFailed": "加载文件夹树失败", "folderTreeError": "加载文件夹树出错", - "batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", - "batchImportCancelling": "[TODO: Translate] Cancelling batch import...", - "batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", - "batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", - "batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", - "batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", - "batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" + "batchImportFailed": "启动批量导入失败:{message}", + "batchImportCancelling": "正在取消批量导入...", + "batchImportCancelFailed": "取消批量导入失败:{message}", + "batchImportNoUrls": "请输入至少一个 URL 或文件路径", + "batchImportNoDirectory": "请输入目录路径", + "batchImportBrowseFailed": "浏览目录失败:{message}", + "batchImportDirectorySelected": "已选择目录:{path}" }, "models": { "noModelsSelected": "未选中模型", diff --git a/locales/zh-TW.json b/locales/zh-TW.json index a29a8d81..1918def3 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -645,6 +645,8 @@ "root": "根目錄", "browseFolders": "瀏覽資料夾:", "downloadAndSaveRecipe": "下載並儲存配方", + "importRecipeOnly": "僅匯入配方", + "importAndDownload": "匯入並下載", "downloadMissingLoras": "下載缺少的 LoRA", "saveRecipe": "儲存配方", "loraCountInfo": "(庫存 {existing}/{total})", @@ -732,61 +734,61 @@ } }, "batchImport": { - "title": "[TODO: Translate] Batch Import Recipes", - "action": "[TODO: Translate] Batch Import", - "urlList": "[TODO: Translate] URL List", - "directory": "[TODO: Translate] Directory", - "urlDescription": "[TODO: Translate] 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.", - "urlsLabel": "[TODO: Translate] Image URLs or Local Paths", - "urlsPlaceholder": "[TODO: Translate] https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", - "urlsHint": "[TODO: Translate] Enter one URL or path per line", - "directoryPath": "[TODO: Translate] Directory Path", - "directoryPlaceholder": "[TODO: Translate] /path/to/images/folder", - "browse": "[TODO: Translate] Browse", - "recursive": "[TODO: Translate] Include subdirectories", - "tagsOptional": "[TODO: Translate] Tags (optional, applied to all recipes)", - "tagsPlaceholder": "[TODO: Translate] Enter tags separated by commas", - "tagsHint": "[TODO: Translate] Tags will be added to all imported recipes", - "skipNoMetadata": "[TODO: Translate] Skip images without metadata", - "skipNoMetadataHelp": "[TODO: Translate] Images without LoRA metadata will be skipped automatically.", - "start": "[TODO: Translate] Start Import", - "startImport": "[TODO: Translate] Start Import", - "importing": "[TODO: Translate] Importing...", - "progress": "[TODO: Translate] Progress", - "total": "[TODO: Translate] Total", - "success": "[TODO: Translate] Success", - "failed": "[TODO: Translate] Failed", - "skipped": "[TODO: Translate] Skipped", - "current": "[TODO: Translate] Current", - "currentItem": "[TODO: Translate] Current", - "preparing": "[TODO: Translate] Preparing...", - "cancel": "[TODO: Translate] Cancel", - "cancelImport": "[TODO: Translate] Cancel", - "cancelled": "[TODO: Translate] Import cancelled", - "completed": "[TODO: Translate] Import completed", - "completedWithErrors": "[TODO: Translate] Completed with errors", - "completedSuccess": "[TODO: Translate] Successfully imported {count} recipe(s)", - "successCount": "[TODO: Translate] Successful", - "failedCount": "[TODO: Translate] Failed", - "skippedCount": "[TODO: Translate] Skipped", - "totalProcessed": "[TODO: Translate] Total processed", - "viewDetails": "[TODO: Translate] View Details", - "newImport": "[TODO: Translate] New Import", - "manualPathEntry": "[TODO: Translate] 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.", - "batchImportManualEntryRequired": "[TODO: Translate] File browser not available. Please enter the directory path manually.", - "backToParent": "[TODO: Translate] Back to parent directory", - "folders": "[TODO: Translate] Folders", - "folderCount": "[TODO: Translate] {count} folders", - "imageFiles": "[TODO: Translate] Image Files", - "images": "[TODO: Translate] images", - "imageCount": "[TODO: Translate] {count} images", - "selectFolder": "[TODO: Translate] Select This Folder", + "title": "批量匯入配方", + "action": "批量匯入", + "urlList": "URL 列表", + "directory": "目錄", + "urlDescription": "輸入圖像 URL 或本地檔案路徑(每行一個)。每個都將作為配方匯入。", + "directoryDescription": "輸入目錄路徑以匯入該資料夾中的所有圖像。", + "urlsLabel": "圖像 URL 或本地路徑", + "urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...", + "urlsHint": "每行輸入一個 URL 或路徑", + "directoryPath": "目錄路徑", + "directoryPlaceholder": "/path/to/images/folder", + "browse": "瀏覽", + "recursive": "包含子目錄", + "tagsOptional": "標籤(可選,應用於所有配方)", + "tagsPlaceholder": "輸入以逗號分隔的標籤", + "tagsHint": "標籤將被添加到所有匯入的配方中", + "skipNoMetadata": "跳過無元資料的圖像", + "skipNoMetadataHelp": "沒有 LoRA 元資料的圖像將被自動跳過。", + "start": "開始匯入", + "startImport": "開始匯入", + "importing": "匯入中...", + "progress": "進度", + "total": "總計", + "success": "成功", + "failed": "失敗", + "skipped": "跳過", + "current": "當前", + "currentItem": "當前項目", + "preparing": "準備中...", + "cancel": "取消", + "cancelImport": "取消匯入", + "cancelled": "匯入已取消", + "completed": "匯入完成", + "completedWithErrors": "匯入完成但有錯誤", + "completedSuccess": "成功匯入 {count} 個配方", + "successCount": "成功", + "failedCount": "失敗", + "skippedCount": "跳過", + "totalProcessed": "總計處理", + "viewDetails": "查看詳情", + "newImport": "新建匯入", + "manualPathEntry": "請手動輸入目錄路徑。此瀏覽器中檔案瀏覽器不可用。", + "batchImportDirectorySelected": "已選擇目錄:{path}", + "batchImportManualEntryRequired": "檔案瀏覽器不可用。請手動輸入目錄路徑。", + "backToParent": "返回上級目錄", + "folders": "資料夾", + "folderCount": "{count} 個資料夾", + "imageFiles": "圖像檔案", + "images": "圖像", + "imageCount": "{count} 個圖像", + "selectFolder": "選擇此資料夾", "errors": { - "enterUrls": "[TODO: Translate] Please enter at least one URL or path", - "enterDirectory": "[TODO: Translate] Please enter a directory path", - "startFailed": "[TODO: Translate] Failed to start import: {message}" + "enterUrls": "請輸入至少一個 URL 或路徑", + "enterDirectory": "請輸入目錄路徑", + "startFailed": "啟動匯入失敗:{message}" } } }, @@ -1495,16 +1497,17 @@ "processingError": "處理錯誤:{message}", "folderBrowserError": "載入資料夾瀏覽器錯誤:{message}", "recipeSaveFailed": "儲存配方失敗:{error}", + "recipeSaved": "配方儲存成功", "importFailed": "匯入失敗:{message}", "folderTreeFailed": "載入資料夾樹狀結構失敗", "folderTreeError": "載入資料夾樹狀結構錯誤", - "batchImportFailed": "[TODO: Translate] Failed to start batch import: {message}", - "batchImportCancelling": "[TODO: Translate] Cancelling batch import...", - "batchImportCancelFailed": "[TODO: Translate] Failed to cancel batch import: {message}", - "batchImportNoUrls": "[TODO: Translate] Please enter at least one URL or file path", - "batchImportNoDirectory": "[TODO: Translate] Please enter a directory path", - "batchImportBrowseFailed": "[TODO: Translate] Failed to browse directory: {message}", - "batchImportDirectorySelected": "[TODO: Translate] Directory selected: {path}" + "batchImportFailed": "啟動批量匯入失敗:{message}", + "batchImportCancelling": "正在取消批量匯入...", + "batchImportCancelFailed": "取消批量匯入失敗:{message}", + "batchImportNoUrls": "請輸入至少一個 URL 或檔案路徑", + "batchImportNoDirectory": "請輸入目錄路徑", + "batchImportBrowseFailed": "瀏覽目錄失敗:{message}", + "batchImportDirectorySelected": "已選擇目錄:{path}" }, "models": { "noModelsSelected": "未選擇模型", diff --git a/static/js/managers/ImportManager.js b/static/js/managers/ImportManager.js index e93b9174..435debd9 100644 --- a/static/js/managers/ImportManager.js +++ b/static/js/managers/ImportManager.js @@ -142,6 +142,28 @@ export class ImportManager { // Reset duplicate related properties 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) { @@ -261,11 +283,57 @@ export class ImportManager { this.loadDefaultPathSetting(); 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) { 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} `; + } 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() { this.stepManager.showStep('uploadStep'); @@ -426,12 +494,54 @@ export class ImportManager { const modalTitle = document.querySelector('#importModal h2'); if (modalTitle) modalTitle.textContent = translate('recipes.controls.import.downloadMissingLoras', {}, 'Download Missing LoRAs'); - // Update the save button text - const saveButton = document.querySelector('#locationStep .primary-btn'); - if (saveButton) saveButton.textContent = translate('recipes.controls.import.downloadMissingLoras', {}, 'Download Missing LoRAs'); + // Update button texts and show download count + const locationStep = document.getElementById('locationStep'); + if (!locationStep) return; + + const primaryBtn = locationStep.querySelector('.primary-btn'); + const backBtn = locationStep.querySelector('.secondary-btn'); + + // primaryBtn should be the "Import & Download" button + if (primaryBtn) { + const buttonText = translate('recipes.controls.import.importAndDownload', {}, 'Import & Download'); + primaryBtn.innerHTML = `${buttonText} (${recipeData.loras?.length || 0})`; + } + + // Hide the "Back" button in download-only mode + if (backBtn) { + backBtn.style.display = 'none'; + } + } - // Hide the back button - const backButton = document.querySelector('#locationStep .secondary-btn'); - if (backButton) backButton.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); } } diff --git a/static/js/managers/import/DownloadManager.js b/static/js/managers/import/DownloadManager.js index 4e4d1b41..8068ab2e 100644 --- a/static/js/managers/import/DownloadManager.js +++ b/static/js/managers/import/DownloadManager.js @@ -9,7 +9,7 @@ export class DownloadManager { this.importManager = importManager; } - async saveRecipe() { + async saveRecipe(skipDownload = false) { // Check if we're in download-only mode (for existing recipe) const isDownloadOnly = !!this.importManager.recipeId; @@ -20,7 +20,10 @@ export class DownloadManager { try { // 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 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; - if (this.importManager.downloadableLoRAs && this.importManager.downloadableLoRAs.length > 0) { + if (!skipDownload && this.importManager.downloadableLoRAs && this.importManager.downloadableLoRAs.length > 0) { await this.downloadMissingLoras(); } // Show success message if (isDownloadOnly) { - if (failedDownloads === 0) { + if (skipDownload) { + showToast('toast.recipes.recipeSaved', {}, 'success'); + } else if (failedDownloads === 0) { showToast('toast.loras.downloadSuccessful', {}, 'success'); } } else { diff --git a/static/js/managers/import/RecipeDataManager.js b/static/js/managers/import/RecipeDataManager.js index da11f25c..63668410 100644 --- a/static/js/managers/import/RecipeDataManager.js +++ b/static/js/managers/import/RecipeDataManager.js @@ -325,7 +325,8 @@ export class RecipeDataManager { } 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'); if (!nextButton || !actionsContainer) return; @@ -365,7 +366,7 @@ export class RecipeDataManager { 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( lora => !lora.existsLocally && !lora.isDeleted ).length; @@ -374,8 +375,16 @@ export class RecipeDataManager { nextButton.classList.remove('warning-btn'); 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 { + // Hide import only button and show save recipe + if (importOnlyBtn) { + importOnlyBtn.style.display = 'none'; + } nextButton.textContent = translate('recipes.controls.import.saveRecipe', {}, 'Save Recipe'); } } @@ -440,8 +449,11 @@ export class RecipeDataManager { // Store only downloadable LoRAs for the download step this.importManager.downloadableLoRAs = this.importManager.missingLoras; 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 { - // Otherwise, save the recipe directly + // No missing LoRAs at all, save the recipe directly this.importManager.saveRecipe(); } } diff --git a/templates/components/import_modal.html b/templates/components/import_modal.html index e952ccec..008db05f 100644 --- a/templates/components/import_modal.html +++ b/templates/components/import_modal.html @@ -92,9 +92,10 @@ - @@ -159,7 +160,7 @@