feat(sidebar): manage folders that live under several model roots

The sidebar's folder tree merges every model root into one relative-path
namespace, but folder operations turned a node into a path by prefixing
default_*_root. A folder living under another root failed to delete with
"Folder no longer exists" (recipes under the primary lora root while
default_lora_root is the extra one), and where the same relative folder
exists in both roots the operation silently hit the other copy — 14 of the
16 top-level folders in the reporting library are shared, so guessing a root
was never safe.

Backend:
* ModelMoveService.resolve_folder() and GET /api/lm/{prefix}/resolve-folder
  answer which directories a library-relative folder maps to
  (folder_path/root/is_symlink), in scanner root order, skipping directories
  no root holds and refusing absolute or climbing paths.
* delete_folder/rename_folder tag a vanished directory with code "missing"
  so the sidebar can tell "this node is stale, refresh" from a failed
  operation.

Frontend:
* _resolveFolderCandidates() is the single place that turns a node into
  absolute paths: default root first, the old root-prefix fallback only
  while a single root is configured, and an explicit unresolved error for a
  multi-root library — nothing is guessed silently any more.
* One copy keeps the single-target modal, which now names the resolved
  absolute path. Several copies render one checkbox row per copy, each
  dry-run against the delete guard ("no models" / "contains N model
  file(s)..." / a deletion is still pending / no longer exists / symbolic
  link): a blocked copy is unticked, disabled and explained, the button
  reads "Delete N folders", every ticked copy is deleted and guarded on its
  own, and a partial failure is reported without discarding the successes.
* Rows are built once per open and only their status text is updated, so
  ticking a box no longer rebuilds the list, steals focus or resizes the
  modal mid-click; the action row keeps a fixed button width.
* Rename offers a root picker in its inline row, create inherits the
  parent's root when the parent resolves to exactly one directory, and the
  undo restores every copy a delete removed.

i18n: 26 new keys (sidebar.deleteFolderModal.*, .deleteFolderResult.*,
.renameFolderResult.*, .folderRoot.*, .folderResult.*) translated in all 9
locales, with the en wording normalized to the established "model root" noun
(it had said "library root") and the new terminology recorded in
docs/i18n-translation-guidelines.md.

Verified: pytest 3686 passed, vitest 1473 passed (86 in the folder-management
suite), pytest tests/i18n 20 passed, sync_translation_keys.py --dry-run
clean. A sandboxed standalone instance with two roots confirmed that deleting
one copy leaves the node in place, that the twin's model card survives the
purge, and that deleting both copies and undoing restores both directories.
This commit is contained in:
Will Miao
2026-10-06 17:14:07 +08:00
parent 5ebf5aeccc
commit 2dcaf6a30e
23 changed files with 2220 additions and 180 deletions
+31 -3
View File
@@ -1409,9 +1409,16 @@
"notEmptyMessage": "Dieser Ordner enthält noch Modelle. Löschen oder verschieben Sie diese zuerst — beim Löschen eines Ordners werden Modelldateien niemals mitgelöscht.",
"notEmptyMessageCount": "Dieser Ordner enthält noch {count} Modelldatei(en). Löschen oder verschieben Sie diese zuerst — beim Löschen eines Ordners werden Modelldateien niemals mitgelöscht.",
"notEmptyMessageExcluded": "Dieser Ordner enthält noch {count} Modelldatei(en), davon {excluded} von der Bibliothek ausgeschlossen. Heben Sie den Ausschluss unter „Ausgeschlossene Modelle verwalten“ auf und löschen Sie sie zuerst — beim Löschen eines Ordners werden Modelldateien niemals mitgelöscht.",
"missingTitle": "Ordner nicht gefunden",
"missingMessage": "Dieser Ordner existiert nicht mehr auf dem Datenträger. Aktualisieren Sie die Seitenleiste und versuchen Sie es erneut.",
"symlinkTitle": "Ordner ist ein symbolischer Link",
"symlinkMessage": "Alle Kopien dieses Ordners sind symbolische Links; entfernen Sie den Link oder sein Ziel außerhalb von LoRA Manager.",
"busyTitle": "Eine Löschung steht noch aus",
"checking": "Ordnerinhalt wird geprüft...",
"confirm": "Ordner löschen"
"confirm": "Ordner löschen",
"confirmMulti": "{count} Ordner löschen",
"deleting": "Wird gelöscht...",
"keptNote": "Nicht angehakte Kopien lassen diesen Ordner in der Seitenleiste bestehen."
},
"deleteFolderResult": {
"success": "Ordner \"{name}\" gelöscht",
@@ -1422,7 +1429,10 @@
"notEmptyWithCount": "Dieser Ordner enthält noch {count} Modelldatei(en). Aktualisieren Sie die Seitenleiste und versuchen Sie es erneut.",
"busy": "In diesem Ordner steht noch eine Löschung aus. Warten Sie, bis das Zeitfenster für das Rückgängigmachen abgelaufen ist.",
"unsupported": "Das Löschen von Ordnern wird auf dieser Seite nicht unterstützt",
"noRoot": "Es ist kein Modell-Stammverzeichnis konfiguriert"
"missing": "Dieser Ordner existiert nicht mehr auf dem Datenträger. Aktualisieren Sie die Seitenleiste und versuchen Sie es erneut.",
"symlink": "Dieser Ordner ist ein symbolischer Link; er kann nicht über die Seitenleiste gelöscht werden.",
"successMulti": "Ordner \"{name}\" aus {count} Modell-Stammverzeichnissen gelöscht",
"partial": "{count} von {total} Kopien gelöscht — {failed} konnten nicht gelöscht werden. Aktualisieren Sie die Seitenleiste und versuchen Sie es erneut."
},
"renameFolder": "Ordner umbenennen",
"renameFolderResult": {
@@ -1431,7 +1441,25 @@
"targetExists": "Ein Ordner mit diesem Namen ist hier bereits vorhanden",
"busy": "In diesem Ordner steht noch eine Löschung aus. Warten Sie, bis das Zeitfenster für das Rückgängigmachen abgelaufen ist.",
"unsupported": "Das Umbenennen von Ordnern wird auf dieser Seite nicht unterstützt",
"noRoot": "Es ist kein Modell-Stammverzeichnis konfiguriert"
"missing": "Dieser Ordner existiert nicht mehr auf dem Datenträger. Aktualisieren Sie die Seitenleiste und versuchen Sie es erneut.",
"symlink": "Dieser Ordner ist ein symbolischer Link; er kann nicht über die Seitenleiste umbenannt werden."
},
"folderRoot": {
"chooseTitle": "Dieser Ordner existiert in mehreren Modell-Stammverzeichnissen",
"symlinkOption": "symbolischer Link",
"rootsHint": "Wählen Sie die Modell-Stammverzeichnisse, aus denen dieser Ordner gelöscht werden soll:",
"checkingStatus": "wird geprüft...",
"okStatus": "keine Modelle",
"notEmptyStatus": "enthält {count} Modelldatei(en) — löschen oder verschieben Sie diese zuerst",
"notEmptyExcludedStatus": "enthält {count} Modelldatei(en), davon {excluded} von der Bibliothek ausgeschlossen",
"busyStatus": "eine Löschung steht noch aus",
"missingStatus": "existiert nicht mehr auf dem Datenträger",
"symlinkStatus": "symbolischer Link — hier nicht löschbar",
"unknownStatus": "konnte nicht geprüft werden",
"deletedStatus": "gelöscht"
},
"folderResult": {
"unresolved": "Es konnte nicht ermittelt werden, welches Modell-Stammverzeichnis diesen Ordner enthält. Aktualisieren Sie die Seitenleiste und versuchen Sie es erneut."
},
"dragDrop": {
"unableToResolveRoot": "Zielpfad für das Verschieben konnte nicht ermittelt werden.",
+31 -3
View File
@@ -1409,9 +1409,16 @@
"notEmptyMessage": "This folder still contains models. Delete or move them first — deleting a folder never cascades over model files.",
"notEmptyMessageCount": "This folder still contains {count} model file(s). Delete or move them first — deleting a folder never cascades over model files.",
"notEmptyMessageExcluded": "This folder still contains {count} model file(s), {excluded} of them excluded from the library. Un-exclude them in Manage Excluded Models and delete them first — deleting a folder never cascades over model files.",
"missingTitle": "Folder not found",
"missingMessage": "This folder no longer exists on disk. Refresh the sidebar and try again.",
"symlinkTitle": "Folder is a symbolic link",
"symlinkMessage": "Every copy of this folder is a symbolic link; remove the link or its target outside LoRA Manager.",
"busyTitle": "A deletion is still pending",
"checking": "Checking the folder contents...",
"confirm": "Delete folder"
"confirm": "Delete folder",
"confirmMulti": "Delete {count} folders",
"deleting": "Deleting...",
"keptNote": "Unchecked copies keep this folder in the sidebar."
},
"deleteFolderResult": {
"success": "Folder \"{name}\" deleted",
@@ -1422,7 +1429,10 @@
"notEmptyWithCount": "This folder still contains {count} model file(s). Refresh the sidebar and try again.",
"busy": "A deletion is still pending inside this folder. Wait for the undo window to expire.",
"unsupported": "Folder deletion is not supported on this page",
"noRoot": "No model root is configured"
"missing": "This folder no longer exists on disk. Refresh the sidebar and try again.",
"symlink": "This folder is a symbolic link; it cannot be deleted from the sidebar.",
"successMulti": "Folder \"{name}\" deleted from {count} model roots",
"partial": "Deleted {count} of {total} copies — {failed} could not be deleted. Refresh the sidebar and retry."
},
"renameFolder": "Rename folder",
"renameFolderResult": {
@@ -1431,7 +1441,25 @@
"targetExists": "A folder with that name already exists here",
"busy": "A deletion is still pending inside this folder. Wait for the undo window to expire.",
"unsupported": "Folder renaming is not supported on this page",
"noRoot": "No model root is configured"
"missing": "This folder no longer exists on disk. Refresh the sidebar and try again.",
"symlink": "This folder is a symbolic link; it cannot be renamed from the sidebar."
},
"folderRoot": {
"chooseTitle": "This folder exists in more than one model root",
"symlinkOption": "symbolic link",
"rootsHint": "Select the model roots to delete this folder from:",
"checkingStatus": "checking...",
"okStatus": "no models",
"notEmptyStatus": "contains {count} model file(s) — delete or move them first",
"notEmptyExcludedStatus": "contains {count} model file(s), {excluded} of them excluded from the library",
"busyStatus": "a deletion is still pending",
"missingStatus": "no longer exists on disk",
"symlinkStatus": "symbolic link — cannot be deleted here",
"unknownStatus": "could not be checked",
"deletedStatus": "deleted"
},
"folderResult": {
"unresolved": "Could not determine which model root holds this folder. Refresh the sidebar and try again."
},
"dragDrop": {
"unableToResolveRoot": "Unable to determine destination path for move.",
+31 -3
View File
@@ -1409,9 +1409,16 @@
"notEmptyMessage": "Esta carpeta aún contiene modelos. Elimínalos o muévelos primero — eliminar una carpeta nunca elimina los archivos de modelo en cascada.",
"notEmptyMessageCount": "Esta carpeta aún contiene {count} archivo(s) de modelo. Elimínalos o muévelos primero — eliminar una carpeta nunca elimina los archivos de modelo en cascada.",
"notEmptyMessageExcluded": "Esta carpeta aún contiene {count} archivo(s) de modelo, de los cuales {excluded} están excluidos de la biblioteca. Anula su exclusión en «Gestionar modelos excluidos» y elimínalos primero — eliminar una carpeta nunca elimina los archivos de modelo en cascada.",
"missingTitle": "Carpeta no encontrada",
"missingMessage": "Esta carpeta ya no existe en el disco. Actualiza la barra lateral e inténtalo de nuevo.",
"symlinkTitle": "La carpeta es un enlace simbólico",
"symlinkMessage": "Todas las copias de esta carpeta son enlaces simbólicos; elimina el enlace o su destino fuera de LoRA Manager.",
"busyTitle": "Todavía hay una eliminación pendiente",
"checking": "Comprobando el contenido de la carpeta...",
"confirm": "Eliminar carpeta"
"confirm": "Eliminar carpeta",
"confirmMulti": "Eliminar {count} carpetas",
"deleting": "Eliminando...",
"keptNote": "Las copias no marcadas mantienen esta carpeta en la barra lateral."
},
"deleteFolderResult": {
"success": "Carpeta \"{name}\" eliminada",
@@ -1422,7 +1429,10 @@
"notEmptyWithCount": "Esta carpeta aún contiene {count} archivo(s) de modelo. Actualiza la barra lateral e inténtalo de nuevo.",
"busy": "Todavía hay una eliminación pendiente dentro de esta carpeta. Espera a que caduque la ventana de deshacer.",
"unsupported": "La eliminación de carpetas no es compatible con esta página",
"noRoot": "No hay ninguna raíz de modelo configurada"
"missing": "Esta carpeta ya no existe en el disco. Actualiza la barra lateral e inténtalo de nuevo.",
"symlink": "Esta carpeta es un enlace simbólico; no se puede eliminar desde la barra lateral.",
"successMulti": "Carpeta \"{name}\" eliminada de {count} raíces de modelo",
"partial": "Se eliminaron {count} de {total} copias — {failed} no se pudieron eliminar. Actualiza la barra lateral e inténtalo de nuevo."
},
"renameFolder": "Cambiar nombre de la carpeta",
"renameFolderResult": {
@@ -1431,7 +1441,25 @@
"targetExists": "Ya existe una carpeta con ese nombre aquí",
"busy": "Todavía hay una eliminación pendiente dentro de esta carpeta. Espera a que caduque la ventana de deshacer.",
"unsupported": "El cambio de nombre de carpetas no es compatible con esta página",
"noRoot": "No hay ninguna raíz de modelo configurada"
"missing": "Esta carpeta ya no existe en el disco. Actualiza la barra lateral e inténtalo de nuevo.",
"symlink": "Esta carpeta es un enlace simbólico; no se puede cambiar el nombre desde la barra lateral."
},
"folderRoot": {
"chooseTitle": "Esta carpeta existe en más de una raíz de modelo",
"symlinkOption": "enlace simbólico",
"rootsHint": "Selecciona las raíces de modelo desde las que eliminar esta carpeta:",
"checkingStatus": "comprobando...",
"okStatus": "sin modelos",
"notEmptyStatus": "contiene {count} archivo(s) de modelo — elimínalos o muévelos primero",
"notEmptyExcludedStatus": "contiene {count} archivo(s) de modelo, de los cuales {excluded} están excluidos de la biblioteca",
"busyStatus": "todavía hay una eliminación pendiente",
"missingStatus": "ya no existe en el disco",
"symlinkStatus": "enlace simbólico — no se puede eliminar aquí",
"unknownStatus": "no se pudo comprobar",
"deletedStatus": "eliminada"
},
"folderResult": {
"unresolved": "No se pudo determinar qué raíz de modelo contiene esta carpeta. Actualiza la barra lateral e inténtalo de nuevo."
},
"dragDrop": {
"unableToResolveRoot": "No se puede determinar la ruta de destino para el movimiento.",
+31 -3
View File
@@ -1409,9 +1409,16 @@
"notEmptyMessage": "Ce dossier contient encore des modèles. Supprimez-les ou déplacez-les d’abord — la suppression d’un dossier n’entraîne jamais celle des fichiers de modèles.",
"notEmptyMessageCount": "Ce dossier contient encore {count} fichier(s) de modèle. Supprimez-les ou déplacez-les d’abord — la suppression d’un dossier n’entraîne jamais celle des fichiers de modèles.",
"notEmptyMessageExcluded": "Ce dossier contient encore {count} fichier(s) de modèle, dont {excluded} sont exclus de la bibliothèque. Annulez leur exclusion dans « Gérer les modèles exclus » et supprimez-les d’abord — la suppression d’un dossier n’entraîne jamais celle des fichiers de modèles.",
"missingTitle": "Dossier introuvable",
"missingMessage": "Ce dossier n’existe plus sur le disque. Actualisez la barre latérale et réessayez.",
"symlinkTitle": "Le dossier est un lien symbolique",
"symlinkMessage": "Toutes les copies de ce dossier sont des liens symboliques ; supprimez le lien ou sa cible en dehors de LoRA Manager.",
"busyTitle": "Une suppression est encore en attente",
"checking": "Vérification du contenu du dossier...",
"confirm": "Supprimer le dossier"
"confirm": "Supprimer le dossier",
"confirmMulti": "Supprimer {count} dossiers",
"deleting": "Suppression...",
"keptNote": "Les copies non cochées maintiennent ce dossier dans la barre latérale."
},
"deleteFolderResult": {
"success": "Dossier \"{name}\" supprimé",
@@ -1422,7 +1429,10 @@
"notEmptyWithCount": "Ce dossier contient encore {count} fichier(s) de modèle. Actualisez la barre latérale et réessayez.",
"busy": "Une suppression est encore en attente dans ce dossier. Attendez la fin de la fenêtre d’annulation.",
"unsupported": "La suppression de dossiers n’est pas prise en charge sur cette page",
"noRoot": "Aucune racine de modèle n’est configurée"
"missing": "Ce dossier n’existe plus sur le disque. Actualisez la barre latérale et réessayez.",
"symlink": "Ce dossier est un lien symbolique ; il ne peut pas être supprimé depuis la barre latérale.",
"successMulti": "Dossier \"{name}\" supprimé de {count} racines de modèle",
"partial": "{count} copie(s) sur {total} supprimée(s) — {failed} en échec. Actualisez la barre latérale et réessayez."
},
"renameFolder": "Renommer le dossier",
"renameFolderResult": {
@@ -1431,7 +1441,25 @@
"targetExists": "Un dossier portant ce nom existe déjà ici",
"busy": "Une suppression est encore en attente dans ce dossier. Attendez la fin de la fenêtre d’annulation.",
"unsupported": "Le renommage de dossiers n’est pas pris en charge sur cette page",
"noRoot": "Aucune racine de modèle n’est configurée"
"missing": "Ce dossier n’existe plus sur le disque. Actualisez la barre latérale et réessayez.",
"symlink": "Ce dossier est un lien symbolique ; il ne peut pas être renommé depuis la barre latérale."
},
"folderRoot": {
"chooseTitle": "Ce dossier existe dans plusieurs racines de modèle",
"symlinkOption": "lien symbolique",
"rootsHint": "Sélectionnez les racines de modèle d’où supprimer ce dossier :",
"checkingStatus": "vérification...",
"okStatus": "aucun modèle",
"notEmptyStatus": "contient {count} fichier(s) de modèle — supprimez-les ou déplacez-les d’abord",
"notEmptyExcludedStatus": "contient {count} fichier(s) de modèle, dont {excluded} exclus de la bibliothèque",
"busyStatus": "une suppression est encore en attente",
"missingStatus": "n’existe plus sur le disque",
"symlinkStatus": "lien symbolique — impossible à supprimer ici",
"unknownStatus": "vérification impossible",
"deletedStatus": "supprimé"
},
"folderResult": {
"unresolved": "Impossible de déterminer quelle racine de modèle contient ce dossier. Actualisez la barre latérale et réessayez."
},
"dragDrop": {
"unableToResolveRoot": "Impossible de déterminer le chemin de destination pour le déplacement.",
+31 -3
View File
@@ -1409,9 +1409,16 @@
"notEmptyMessage": "בתיקייה זו עדיין יש מודלים. מחק או העבר אותם תחילה — מחיקת תיקייה לעולם אינה מוחקת קובצי מודלים.",
"notEmptyMessageCount": "בתיקייה זו עדיין יש {count} קובצי מודלים. מחק או העבר אותם תחילה — מחיקת תיקייה לעולם אינה מוחקת קובצי מודלים.",
"notEmptyMessageExcluded": "בתיקייה זו עדיין יש {count} קובצי מודלים, שמהם {excluded} מוחרגים מהספרייה. בטל את ההחרגה ב«ניהול מודלים מוחרגים» ומחק אותם תחילה — מחיקת תיקייה לעולם אינה מוחקת קובצי מודלים.",
"missingTitle": "התיקייה לא נמצאה",
"missingMessage": "תיקייה זו אינה קיימת עוד בדיסק. רענן את סרגל הצד ונסה שוב.",
"symlinkTitle": "התיקייה היא קישור סמלי",
"symlinkMessage": "כל העותקים של תיקייה זו הם קישורים סמליים; מחק את הקישור או את היעד שלו מחוץ ל-LoRA Manager.",
"busyTitle": "מחיקה עדיין ממתינה",
"checking": "בודק את תוכן התיקייה...",
"confirm": "מחק תיקייה"
"confirm": "מחק תיקייה",
"confirmMulti": "מחק {count} תיקיות",
"deleting": "מוחק...",
"keptNote": "עותקים שלא סומנו ישאירו את התיקייה הזו בסרגל הצד."
},
"deleteFolderResult": {
"success": "התיקייה \"{name}\" נמחקה",
@@ -1422,7 +1429,10 @@
"notEmptyWithCount": "בתיקייה זו עדיין יש {count} קובצי מודלים. רענן את סרגל הצד ונסה שוב.",
"busy": "מחיקה עדיין ממתינה בתיקייה זו. המתן לסיום חלון הביטול.",
"unsupported": "מחיקת תיקיות אינה נתמכת בדף זה",
"noRoot": "לא הוגדר שורש מודלים"
"missing": "תיקייה זו אינה קיימת עוד בדיסק. רענן את סרגל הצד ונסה שוב.",
"symlink": "תיקייה זו היא קישור סמלי; לא ניתן למחוק אותה מסרגל הצד.",
"successMulti": "התיקייה \"{name}\" נמחקה מ-{count} שורשי מודלים",
"partial": "נמחקו {count} מתוך {total} עותקים — {failed} לא נמחקו. רענן את סרגל הצד ונסה שוב."
},
"renameFolder": "שנה שם תיקייה",
"renameFolderResult": {
@@ -1431,7 +1441,25 @@
"targetExists": "תיקייה בשם זה כבר קיימת כאן",
"busy": "מחיקה עדיין ממתינה בתיקייה זו. המתן לסיום חלון הביטול.",
"unsupported": "שינוי שם תיקיות אינו נתמך בדף זה",
"noRoot": "לא הוגדר שורש מודלים"
"missing": "תיקייה זו אינה קיימת עוד בדיסק. רענן את סרגל הצד ונסה שוב.",
"symlink": "תיקייה זו היא קישור סמלי; לא ניתן לשנות את שמה מסרגל הצד."
},
"folderRoot": {
"chooseTitle": "תיקייה זו קיימת ביותר משורש מודלים אחד",
"symlinkOption": "קישור סמלי",
"rootsHint": "בחר את שורשי המודלים שמהם למחוק את התיקייה הזו:",
"checkingStatus": "בודק...",
"okStatus": "אין מודלים",
"notEmptyStatus": "מכיל {count} קובצי מודלים — מחק או העבר אותם תחילה",
"notEmptyExcludedStatus": "מכיל {count} קובצי מודלים, שמהם {excluded} מוחרגים מהספרייה",
"busyStatus": "מחיקה עדיין ממתינה",
"missingStatus": "אינו קיים עוד בדיסק",
"symlinkStatus": "קישור סמלי — לא ניתן למחוק כאן",
"unknownStatus": "לא ניתן היה לבדוק",
"deletedStatus": "נמחקה"
},
"folderResult": {
"unresolved": "לא ניתן לקבוע באיזה שורש מודלים נמצאת התיקייה הזו. רענן את סרגל הצד ונסה שוב."
},
"dragDrop": {
"unableToResolveRoot": "לא ניתן לקבוע את נתיב היעד להעברה.",
+31 -3
View File
@@ -1409,9 +1409,16 @@
"notEmptyMessage": "このフォルダにはまだモデルがあります。先に削除するか移動してください —— フォルダを削除してもモデルファイルがまとめて削除されることはありません。",
"notEmptyMessageCount": "このフォルダにはまだ {count} 個のモデルファイルがあります。先に削除するか移動してください —— フォルダを削除してもモデルファイルがまとめて削除されることはありません。",
"notEmptyMessageExcluded": "このフォルダにはまだ {count} 個のモデルファイルがあり、そのうち {excluded} 個はライブラリから除外されています。「除外モデルを管理」で除外を解除してから削除してください —— フォルダを削除してもモデルファイルがまとめて削除されることはありません。",
"missingTitle": "フォルダが見つかりません",
"missingMessage": "このフォルダはディスク上に存在しません。サイドバーを再読み込みしてからもう一度お試しください。",
"symlinkTitle": "フォルダがシンボリックリンクです",
"symlinkMessage": "このフォルダのすべてのコピーがシンボリックリンクです。LoRA Manager の外でリンクまたはそのリンク先を削除してください。",
"busyTitle": "保留中の削除があります",
"checking": "フォルダの内容を確認しています...",
"confirm": "フォルダを削除"
"confirm": "フォルダを削除",
"confirmMulti": "{count} 個のフォルダを削除",
"deleting": "削除しています...",
"keptNote": "チェックを外したコピーがあると、このフォルダはサイドバーに残ります。"
},
"deleteFolderResult": {
"success": "フォルダ \"{name}\" を削除しました",
@@ -1422,7 +1429,10 @@
"notEmptyWithCount": "このフォルダにはまだ {count} 個のモデルファイルがあります。サイドバーを再読み込みしてからもう一度お試しください。",
"busy": "このフォルダ内に保留中の削除があります。取り消し可能な時間が過ぎるまでお待ちください。",
"unsupported": "このページではフォルダを削除できません",
"noRoot": "モデルルートが設定されていません"
"missing": "このフォルダはディスク上に存在しません。サイドバーを再読み込みしてからもう一度お試しください。",
"symlink": "このフォルダはシンボリックリンクです。サイドバーからは削除できません。",
"successMulti": "{count} 個のモデルルートからフォルダ \"{name}\" を削除しました",
"partial": "{total} 個のコピーのうち {count} 個を削除しました —— {failed} 個は削除できませんでした。サイドバーを再読み込みしてからもう一度お試しください。"
},
"renameFolder": "フォルダ名を変更",
"renameFolderResult": {
@@ -1431,7 +1441,25 @@
"targetExists": "同じ名前のフォルダが既に存在します",
"busy": "このフォルダ内に保留中の削除があります。取り消し可能な時間が過ぎるまでお待ちください。",
"unsupported": "このページではフォルダ名を変更できません",
"noRoot": "モデルルートが設定されていません"
"missing": "このフォルダはディスク上に存在しません。サイドバーを再読み込みしてからもう一度お試しください。",
"symlink": "このフォルダはシンボリックリンクです。サイドバーからはフォルダ名を変更できません。"
},
"folderRoot": {
"chooseTitle": "このフォルダは複数のモデルルートに存在します",
"symlinkOption": "シンボリックリンク",
"rootsHint": "このフォルダを削除するモデルルートを選択してください:",
"checkingStatus": "確認しています...",
"okStatus": "モデルなし",
"notEmptyStatus": "モデルファイルが {count} 個あります —— 先に削除するか移動してください",
"notEmptyExcludedStatus": "モデルファイルが {count} 個あり、そのうち {excluded} 個はライブラリから除外されています",
"busyStatus": "保留中の削除があります",
"missingStatus": "ディスク上に存在しません",
"symlinkStatus": "シンボリックリンク —— ここからは削除できません",
"unknownStatus": "確認できませんでした",
"deletedStatus": "削除しました"
},
"folderResult": {
"unresolved": "このフォルダがどのモデルルートにあるかを特定できませんでした。サイドバーを再読み込みしてからもう一度お試しください。"
},
"dragDrop": {
"unableToResolveRoot": "移動先のパスを特定できません。",
+31 -3
View File
@@ -1409,9 +1409,16 @@
"notEmptyMessage": "이 폴더에는 아직 모델이 있습니다. 먼저 해당 모델을 삭제하거나 이동하세요 —— 폴더를 삭제해도 모델 파일이 함께 삭제되지는 않습니다.",
"notEmptyMessageCount": "이 폴더에는 아직 모델 파일이 {count}개 있습니다. 먼저 해당 모델을 삭제하거나 이동하세요 —— 폴더를 삭제해도 모델 파일이 함께 삭제되지는 않습니다.",
"notEmptyMessageExcluded": "이 폴더에는 아직 모델 파일이 {count}개 있으며, 그중 {excluded}개는 라이브러리에서 제외되어 있습니다. '제외된 모델 관리'에서 제외를 해제한 뒤 먼저 삭제하세요 —— 폴더를 삭제해도 모델 파일이 함께 삭제되지는 않습니다.",
"missingTitle": "폴더를 찾을 수 없습니다",
"missingMessage": "이 폴더는 디스크에 더 이상 존재하지 않습니다. 사이드바를 새로 고친 후 다시 시도하세요.",
"symlinkTitle": "폴더가 심볼릭 링크입니다",
"symlinkMessage": "이 폴더의 모든 복사본이 심볼릭 링크입니다. LoRA Manager 외부에서 링크 또는 그 대상을 삭제하세요.",
"busyTitle": "대기 중인 삭제 작업이 있습니다",
"checking": "폴더 내용을 확인하는 중...",
"confirm": "폴더 삭제"
"confirm": "폴더 삭제",
"confirmMulti": "폴더 {count}개 삭제",
"deleting": "삭제하는 중...",
"keptNote": "선택하지 않은 복사본이 있으면 이 폴더가 사이드바에 계속 표시됩니다."
},
"deleteFolderResult": {
"success": "\"{name}\" 폴더를 삭제했습니다",
@@ -1422,7 +1429,10 @@
"notEmptyWithCount": "이 폴더에는 아직 모델 파일이 {count}개 있습니다. 사이드바를 새로 고친 후 다시 시도하세요.",
"busy": "이 폴더에 아직 대기 중인 삭제 작업이 있습니다. 되돌리기 시간이 끝날 때까지 기다리세요.",
"unsupported": "이 페이지에서는 폴더를 삭제할 수 없습니다",
"noRoot": "모델 루트가 설정되지 않았습니다"
"missing": "이 폴더는 디스크에 더 이상 존재하지 않습니다. 사이드바를 새로 고친 후 다시 시도하세요.",
"symlink": "이 폴더는 심볼릭 링크이므로 사이드바에서 삭제할 수 없습니다.",
"successMulti": "모델 루트 {count}개에서 \"{name}\" 폴더를 삭제했습니다",
"partial": "복사본 {total}개 중 {count}개를 삭제했습니다 —— {failed}개는 삭제하지 못했습니다. 사이드바를 새로 고친 후 다시 시도하세요."
},
"renameFolder": "폴더 이름 바꾸기",
"renameFolderResult": {
@@ -1431,7 +1441,25 @@
"targetExists": "같은 이름의 폴더가 이미 있습니다",
"busy": "이 폴더에 아직 대기 중인 삭제 작업이 있습니다. 되돌리기 시간이 끝날 때까지 기다리세요.",
"unsupported": "이 페이지에서는 폴더 이름을 바꿀 수 없습니다",
"noRoot": "모델 루트가 설정되지 않았습니다"
"missing": "이 폴더는 디스크에 더 이상 존재하지 않습니다. 사이드바를 새로 고친 후 다시 시도하세요.",
"symlink": "이 폴더는 심볼릭 링크이므로 사이드바에서 이름을 바꿀 수 없습니다."
},
"folderRoot": {
"chooseTitle": "이 폴더는 여러 모델 루트에 존재합니다",
"symlinkOption": "심볼릭 링크",
"rootsHint": "이 폴더를 삭제할 모델 루트를 선택하세요:",
"checkingStatus": "확인하는 중...",
"okStatus": "모델 없음",
"notEmptyStatus": "모델 파일이 {count}개 있습니다 —— 먼저 삭제하거나 이동하세요",
"notEmptyExcludedStatus": "모델 파일이 {count}개 있으며, 그중 {excluded}개는 라이브러리에서 제외되어 있습니다",
"busyStatus": "대기 중인 삭제 작업이 있습니다",
"missingStatus": "디스크에 존재하지 않습니다",
"symlinkStatus": "심볼릭 링크 —— 여기에서는 삭제할 수 없습니다",
"unknownStatus": "확인할 수 없습니다",
"deletedStatus": "삭제됨"
},
"folderResult": {
"unresolved": "이 폴더가 어느 모델 루트에 있는지 확인할 수 없습니다. 사이드바를 새로 고친 후 다시 시도하세요."
},
"dragDrop": {
"unableToResolveRoot": "이동할 대상 경로를 확인할 수 없습니다.",
+31 -3
View File
@@ -1409,9 +1409,16 @@
"notEmptyMessage": "В этой папке ещё есть модели. Сначала удалите или переместите их — удаление папки никогда не затрагивает файлы моделей.",
"notEmptyMessageCount": "В этой папке ещё есть {count} файл(ов) модели. Сначала удалите или переместите их — удаление папки никогда не затрагивает файлы моделей.",
"notEmptyMessageExcluded": "В этой папке ещё есть {count} файл(ов) модели, из них {excluded} исключены из библиотеки. Снимите исключение в разделе «Управление исключёнными моделями» и удалите их — удаление папки никогда не затрагивает файлы моделей.",
"missingTitle": "Папка не найдена",
"missingMessage": "Эта папка больше не существует на диске. Обновите боковую панель и повторите попытку.",
"symlinkTitle": "Папка является символической ссылкой",
"symlinkMessage": "Все копии этой папки являются символическими ссылками; удалите ссылку или её цель вне LoRA Manager.",
"busyTitle": "Удаление всё ещё отложено",
"checking": "Проверка содержимого папки...",
"confirm": "Удалить папку"
"confirm": "Удалить папку",
"confirmMulti": "Удалить папки ({count})",
"deleting": "Удаление...",
"keptNote": "Неотмеченные копии оставят эту папку в боковой панели."
},
"deleteFolderResult": {
"success": "Папка \"{name}\" удалена",
@@ -1422,7 +1429,10 @@
"notEmptyWithCount": "В этой папке ещё есть {count} файл(ов) модели. Обновите боковую панель и повторите попытку.",
"busy": "В этой папке всё ещё есть отложенное удаление. Дождитесь окончания окна отмены.",
"unsupported": "Удаление папок не поддерживается на этой странице",
"noRoot": "Корневая папка моделей не настроена"
"missing": "Эта папка больше не существует на диске. Обновите боковую панель и повторите попытку.",
"symlink": "Эта папка является символической ссылкой; её нельзя удалить из боковой панели.",
"successMulti": "Папка \"{name}\" удалена из {count} корневых папок моделей",
"partial": "Удалено {count} из {total} копий — не удалось удалить {failed}. Обновите боковую панель и повторите попытку."
},
"renameFolder": "Переименовать папку",
"renameFolderResult": {
@@ -1431,7 +1441,25 @@
"targetExists": "Папка с таким именем уже существует здесь",
"busy": "В этой папке всё ещё есть отложенное удаление. Дождитесь окончания окна отмены.",
"unsupported": "Переименование папок не поддерживается на этой странице",
"noRoot": "Корневая папка моделей не настроена"
"missing": "Эта папка больше не существует на диске. Обновите боковую панель и повторите попытку.",
"symlink": "Эта папка является символической ссылкой; её нельзя переименовать из боковой панели."
},
"folderRoot": {
"chooseTitle": "Эта папка существует в нескольких корневых папках моделей",
"symlinkOption": "символическая ссылка",
"rootsHint": "Выберите корневые папки моделей, из которых нужно удалить эту папку:",
"checkingStatus": "проверка...",
"okStatus": "моделей нет",
"notEmptyStatus": "содержит {count} файл(ов) модели — сначала удалите или переместите их",
"notEmptyExcludedStatus": "содержит {count} файл(ов) модели, из них {excluded} исключены из библиотеки",
"busyStatus": "удаление всё ещё отложено",
"missingStatus": "больше не существует на диске",
"symlinkStatus": "символическая ссылка — здесь удалить нельзя",
"unknownStatus": "не удалось проверить",
"deletedStatus": "удалено"
},
"folderResult": {
"unresolved": "Не удалось определить, в какой корневой папке моделей находится эта папка. Обновите боковую панель и повторите попытку."
},
"dragDrop": {
"unableToResolveRoot": "Не удалось определить путь назначения для перемещения.",
+31 -3
View File
@@ -1409,9 +1409,16 @@
"notEmptyMessage": "该文件夹中仍有模型,请先删除或移出这些模型 —— 删除文件夹不会级联删除模型文件。",
"notEmptyMessageCount": "该文件夹中仍有 {count} 个模型文件,请先删除或移出这些模型 —— 删除文件夹不会级联删除模型文件。",
"notEmptyMessageExcluded": "该文件夹中仍有 {count} 个模型文件,其中 {excluded} 个已从模型库中排除。请先在“管理已排除的模型”中取消排除并删除它们 —— 删除文件夹不会级联删除模型文件。",
"missingTitle": "未找到文件夹",
"missingMessage": "该文件夹在磁盘上已不存在,请刷新侧边栏后重试。",
"symlinkTitle": "文件夹是符号链接",
"symlinkMessage": "该文件夹的每一份副本都是符号链接;请在 LoRA Manager 之外删除该链接或其指向的目标。",
"busyTitle": "仍有删除操作待处理",
"checking": "正在检查文件夹内容...",
"confirm": "删除文件夹"
"confirm": "删除文件夹",
"confirmMulti": "删除 {count} 个文件夹",
"deleting": "正在删除...",
"keptNote": "未勾选的副本会让该文件夹继续显示在侧边栏中。"
},
"deleteFolderResult": {
"success": "已删除文件夹 \"{name}\"",
@@ -1422,7 +1429,10 @@
"notEmptyWithCount": "该文件夹中仍有 {count} 个模型文件。请刷新侧边栏后重试。",
"busy": "该文件夹内仍有待处理的删除操作,请等待撤销窗口结束。",
"unsupported": "此页面不支持删除文件夹",
"noRoot": "未配置模型根目录"
"missing": "该文件夹在磁盘上已不存在,请刷新侧边栏后重试。",
"symlink": "该文件夹是符号链接,无法从侧边栏中删除。",
"successMulti": "已从 {count} 个模型根目录中删除文件夹 \"{name}\"",
"partial": "已删除 {total} 份副本中的 {count} 份 —— {failed} 份无法删除。请刷新侧边栏后重试。"
},
"renameFolder": "重命名文件夹",
"renameFolderResult": {
@@ -1431,7 +1441,25 @@
"targetExists": "此处已存在同名文件夹",
"busy": "该文件夹内仍有待处理的删除操作,请等待撤销窗口结束。",
"unsupported": "此页面不支持重命名文件夹",
"noRoot": "未配置模型根目录"
"missing": "该文件夹在磁盘上已不存在,请刷新侧边栏后重试。",
"symlink": "该文件夹是符号链接,无法从侧边栏中重命名。"
},
"folderRoot": {
"chooseTitle": "该文件夹存在于多个模型根目录中",
"symlinkOption": "符号链接",
"rootsHint": "选择要从中删除该文件夹的模型根目录:",
"checkingStatus": "正在检查...",
"okStatus": "无模型",
"notEmptyStatus": "包含 {count} 个模型文件 —— 请先删除或移出这些模型",
"notEmptyExcludedStatus": "包含 {count} 个模型文件,其中 {excluded} 个已从模型库中排除",
"busyStatus": "仍有删除操作待处理",
"missingStatus": "磁盘上已不存在",
"symlinkStatus": "符号链接 —— 无法在此删除",
"unknownStatus": "无法检查",
"deletedStatus": "已删除"
},
"folderResult": {
"unresolved": "无法确定该文件夹位于哪个模型根目录。请刷新侧边栏后重试。"
},
"dragDrop": {
"unableToResolveRoot": "无法确定移动的目标路径。",
+31 -3
View File
@@ -1409,9 +1409,16 @@
"notEmptyMessage": "該資料夾中仍有模型,請先刪除或移出這些模型 —— 刪除資料夾不會串聯刪除模型檔案。",
"notEmptyMessageCount": "該資料夾中仍有 {count} 個模型檔案,請先刪除或移出這些模型 —— 刪除資料夾不會串聯刪除模型檔案。",
"notEmptyMessageExcluded": "該資料夾中仍有 {count} 個模型檔案,其中 {excluded} 個已從模型庫中排除。請先在「管理已排除的模型」中取消排除並刪除它們 —— 刪除資料夾不會串聯刪除模型檔案。",
"missingTitle": "未找到資料夾",
"missingMessage": "該資料夾在磁碟上已不存在,請重新整理側邊欄後再試。",
"symlinkTitle": "資料夾是符號連結",
"symlinkMessage": "該資料夾的每一份副本都是符號連結;請在 LoRA Manager 之外刪除該連結或其指向的目標。",
"busyTitle": "仍有刪除操作待處理",
"checking": "正在檢查資料夾內容...",
"confirm": "刪除資料夾"
"confirm": "刪除資料夾",
"confirmMulti": "刪除 {count} 個資料夾",
"deleting": "正在刪除...",
"keptNote": "未勾選的副本會讓該資料夾繼續顯示在側邊欄中。"
},
"deleteFolderResult": {
"success": "已刪除資料夾 \"{name}\"",
@@ -1422,7 +1429,10 @@
"notEmptyWithCount": "該資料夾中仍有 {count} 個模型檔案。請重新整理側邊欄後再試。",
"busy": "該資料夾內仍有待處理的刪除操作,請等待復原時間結束。",
"unsupported": "此頁面不支援刪除資料夾",
"noRoot": "未設定模型根目錄"
"missing": "該資料夾在磁碟上已不存在,請重新整理側邊欄後再試。",
"symlink": "該資料夾是符號連結,無法從側邊欄中刪除。",
"successMulti": "已從 {count} 個模型根目錄中刪除資料夾 \"{name}\"",
"partial": "已刪除 {total} 份副本中的 {count} 份 —— {failed} 份無法刪除。請重新整理側邊欄後再試。"
},
"renameFolder": "重新命名資料夾",
"renameFolderResult": {
@@ -1431,7 +1441,25 @@
"targetExists": "此處已存在同名資料夾",
"busy": "該資料夾內仍有待處理的刪除操作,請等待復原時間結束。",
"unsupported": "此頁面不支援重新命名資料夾",
"noRoot": "未設定模型根目錄"
"missing": "該資料夾在磁碟上已不存在,請重新整理側邊欄後再試。",
"symlink": "該資料夾是符號連結,無法從側邊欄中重新命名。"
},
"folderRoot": {
"chooseTitle": "該資料夾存在於多個模型根目錄中",
"symlinkOption": "符號連結",
"rootsHint": "選擇要從中刪除該資料夾的模型根目錄:",
"checkingStatus": "正在檢查...",
"okStatus": "無模型",
"notEmptyStatus": "包含 {count} 個模型檔案 —— 請先刪除或移出這些模型",
"notEmptyExcludedStatus": "包含 {count} 個模型檔案,其中 {excluded} 個已從模型庫中排除",
"busyStatus": "仍有刪除操作待處理",
"missingStatus": "磁碟上已不存在",
"symlinkStatus": "符號連結 —— 無法在此刪除",
"unknownStatus": "無法檢查",
"deletedStatus": "已刪除"
},
"folderResult": {
"unresolved": "無法確定該資料夾位於哪個模型根目錄。請重新整理側邊欄後再試。"
},
"dragDrop": {
"unableToResolveRoot": "無法確定移動的目標路徑。",