From 327da0465b506e487683e52d222a56255961c7be Mon Sep 17 00:00:00 2001 From: Will Miao Date: Sat, 19 Sep 2026 07:38:07 +0800 Subject: [PATCH] feat(settings): split overloaded Library tab into a new Organization tab Move download path templates, priority tags, and auto-organize exclusions out of the Library settings section into a dedicated Organization section, so Library keeps location-focused settings (roots, extra paths, example images, metadata) and Organization holds file-arrangement rules. Translated settings.nav.organization for all locales. --- docs/i18n-translation-guidelines.md | 26 +++ locales/de.json | 1 + locales/en.json | 1 + locales/es.json | 1 + locales/fr.json | 1 + locales/he.json | 1 + locales/ja.json | 1 + locales/ko.json | 1 + locales/ru.json | 1 + locales/zh-CN.json | 1 + locales/zh-TW.json | 1 + .../components/modals/settings/library.html | 216 ----------------- .../modals/settings/organization.html | 219 ++++++++++++++++++ .../components/modals/settings_modal.html | 2 + 14 files changed, 257 insertions(+), 216 deletions(-) create mode 100644 templates/components/modals/settings/organization.html diff --git a/docs/i18n-translation-guidelines.md b/docs/i18n-translation-guidelines.md index 0fb04977..4ef5219e 100644 --- a/docs/i18n-translation-guidelines.md +++ b/docs/i18n-translation-guidelines.md @@ -66,6 +66,11 @@ Locales: `en`, `zh-CN`, `zh-TW`, `ja`, `ko`, `fr`, `de`, `es`, `ru`, `he` (RTL). > section" — and re-translated in all 9 locales. The `on disk` phrase now survives only in > the ComfyUI variant (`descriptionComfyUI`). +> **Status (2026-09, settings Organization tab):** the settings modal split its overloaded +> Library tab, adding the single `settings.nav.organization` key (renderings in §2, +> "Settings Organization tab"). All 9 locales are translated, so the "no remaining +> placeholders" claim holds again. + --- ## 1. Hard rules (do not violate) @@ -371,6 +376,27 @@ clause (and its `—`) when the copy is edited. The `{name}` / `{count}` / `{mes `sidebar.createFolderResult.*`, `sidebar.deleteFolderResult.*` and `sidebar.renameFolderResult.*` are verbatim §1-R2 placeholders; `successWithFiles` is the only key carrying `{count}`. +### Settings Organization tab + +The settings modal's fourth nav tab groups everything about how files are arranged on +disk: download path templates, priority tags, and auto-organize exclusions. The label is +the **noun for arranging files**, matching each locale's existing +`settings.sections.autoOrganize` rendering minus the "auto": + +| Locale | `settings.nav.organization` | +|---|---| +| fr | Organisation | +| zh-CN | 整理 | +| zh-TW | 整理 | +| ja | 整理 | +| ko | 정리 | +| de | Organisation | +| es | Organización | +| ru | Организация | +| he | ארגון | + +zh-CN/zh-TW use 整理 ("tidying/arranging"), not 组织/組織 (an organization as a group). + ### Chip reordering (model tags / trigger words) Model tags and trigger-word chips share a single reorder affordance (drag the chip, or its diff --git a/locales/de.json b/locales/de.json index 7ad1b9c3..2ca2b2cf 100644 --- a/locales/de.json +++ b/locales/de.json @@ -383,6 +383,7 @@ "general": "Allgemein", "interface": "Oberfläche", "library": "Bibliothek", + "organization": "Organisation", "modelPaths": "Modellpfade" }, "search": { diff --git a/locales/en.json b/locales/en.json index ae4d2988..89f51c08 100644 --- a/locales/en.json +++ b/locales/en.json @@ -383,6 +383,7 @@ "general": "General", "interface": "Interface", "library": "Library", + "organization": "Organization", "modelPaths": "Model Paths" }, "search": { diff --git a/locales/es.json b/locales/es.json index 9e206a73..b10b029f 100644 --- a/locales/es.json +++ b/locales/es.json @@ -383,6 +383,7 @@ "general": "General", "interface": "Interfaz", "library": "Biblioteca", + "organization": "Organización", "modelPaths": "Rutas de modelos" }, "search": { diff --git a/locales/fr.json b/locales/fr.json index ea2713c1..6ca84f89 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -383,6 +383,7 @@ "general": "Général", "interface": "Interface", "library": "Bibliothèque", + "organization": "Organisation", "modelPaths": "Chemins de modèles" }, "search": { diff --git a/locales/he.json b/locales/he.json index 03e9fa97..734f964f 100644 --- a/locales/he.json +++ b/locales/he.json @@ -383,6 +383,7 @@ "general": "כללי", "interface": "ממשק", "library": "ספרייה", + "organization": "ארגון", "modelPaths": "נתיבי מודלים" }, "search": { diff --git a/locales/ja.json b/locales/ja.json index dbb657b4..9b07511a 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -383,6 +383,7 @@ "general": "一般", "interface": "インターフェース", "library": "ライブラリ", + "organization": "整理", "modelPaths": "モデルパス" }, "search": { diff --git a/locales/ko.json b/locales/ko.json index 54c6c109..64faec00 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -383,6 +383,7 @@ "general": "일반", "interface": "인터페이스", "library": "라이브러리", + "organization": "정리", "modelPaths": "모델 경로" }, "search": { diff --git a/locales/ru.json b/locales/ru.json index 280ce0e7..8c75284c 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -383,6 +383,7 @@ "general": "Общее", "interface": "Интерфейс", "library": "Библиотека", + "organization": "Организация", "modelPaths": "Пути к моделям" }, "search": { diff --git a/locales/zh-CN.json b/locales/zh-CN.json index 58818f24..36961351 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -383,6 +383,7 @@ "general": "通用", "interface": "界面", "library": "库", + "organization": "整理", "modelPaths": "模型路径" }, "search": { diff --git a/locales/zh-TW.json b/locales/zh-TW.json index 19e48ce2..d5114623 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -383,6 +383,7 @@ "general": "通用", "interface": "介面", "library": "模型庫", + "organization": "整理", "modelPaths": "模型路徑" }, "search": { diff --git a/templates/components/modals/settings/library.html b/templates/components/modals/settings/library.html index 0e5becbd..362c9324 100644 --- a/templates/components/modals/settings/library.html +++ b/templates/components/modals/settings/library.html @@ -1,15 +1,4 @@ {% import 'components/modals/settings/_macros.html' as sm with context %} -{% set template_preset_options = [ - ('', 'settings.downloadPathTemplates.templateOptions.flatStructure'), - ('{base_model}', 'settings.downloadPathTemplates.templateOptions.byBaseModel'), - ('{author}', 'settings.downloadPathTemplates.templateOptions.byAuthor'), - ('{first_tag}', 'settings.downloadPathTemplates.templateOptions.byFirstTag'), - ('{base_model}/{first_tag}', 'settings.downloadPathTemplates.templateOptions.baseModelFirstTag'), - ('{base_model}/{author}', 'settings.downloadPathTemplates.templateOptions.baseModelAuthor'), - ('{author}/{first_tag}', 'settings.downloadPathTemplates.templateOptions.authorFirstTag'), - ('{base_model}/{author}/{first_tag}', 'settings.downloadPathTemplates.templateOptions.baseModelAuthorFirstTag'), - ('custom', 'settings.downloadPathTemplates.templateOptions.customTemplate'), -] %}
@@ -187,192 +176,6 @@
- -
-
-

- {{ t('settings.downloadPathTemplates.title') }} - -

-
-
-
-
- {{ t('settings.downloadPathTemplates.availablePlaceholders') }} - {base_model} - {author} - {first_tag} - {model_name} - {version_name} -
-
-
- -
-
-
- -
-
- -
-
- -
-
- -
-
-
- -
-
- -
-
- -
-
- -
-
-
- -
-
- -
-
- -
-
- -
-
-
- -
-
- -
-
-
-
-
-
-
- - {{ sm.setting_toggle('skipPreviouslyDownloadedModelVersions', 'skip_previously_downloaded_model_versions', 'settings.skipPreviouslyDownloadedModelVersions.label', 'settings.skipPreviouslyDownloadedModelVersions.help') }} - -
-
-
- -
-
- -
-
- -
-
- - -
-
-
- - - - -
-
-
- - - - -
- - - -
- -
-
- -
-
-
- -
-
-
- -
-
-
-
-
-
-
{{ sm.subsection_header('settings.sections.versionScope') }} @@ -463,25 +266,6 @@
- -
- {{ sm.subsection_header('settings.sections.autoOrganize') }} - - -
-
-
- -
-
- -
-
-
-
{{ sm.subsection_header('settings.sections.metadata') }} diff --git a/templates/components/modals/settings/organization.html b/templates/components/modals/settings/organization.html new file mode 100644 index 00000000..3d1c7c99 --- /dev/null +++ b/templates/components/modals/settings/organization.html @@ -0,0 +1,219 @@ +{% import 'components/modals/settings/_macros.html' as sm with context %} +{% set template_preset_options = [ + ('', 'settings.downloadPathTemplates.templateOptions.flatStructure'), + ('{base_model}', 'settings.downloadPathTemplates.templateOptions.byBaseModel'), + ('{author}', 'settings.downloadPathTemplates.templateOptions.byAuthor'), + ('{first_tag}', 'settings.downloadPathTemplates.templateOptions.byFirstTag'), + ('{base_model}/{first_tag}', 'settings.downloadPathTemplates.templateOptions.baseModelFirstTag'), + ('{base_model}/{author}', 'settings.downloadPathTemplates.templateOptions.baseModelAuthor'), + ('{author}/{first_tag}', 'settings.downloadPathTemplates.templateOptions.authorFirstTag'), + ('{base_model}/{author}/{first_tag}', 'settings.downloadPathTemplates.templateOptions.baseModelAuthorFirstTag'), + ('custom', 'settings.downloadPathTemplates.templateOptions.customTemplate'), +] %} + +
+ +
+
+

+ {{ t('settings.downloadPathTemplates.title') }} + +

+
+
+
+
+ {{ t('settings.downloadPathTemplates.availablePlaceholders') }} + {base_model} + {author} + {first_tag} + {model_name} + {version_name} +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+
+ + {{ sm.setting_toggle('skipPreviouslyDownloadedModelVersions', 'skip_previously_downloaded_model_versions', 'settings.skipPreviouslyDownloadedModelVersions.label', 'settings.skipPreviouslyDownloadedModelVersions.help') }} + +
+
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+ + + + +
+
+
+ + + + +
+ + + +
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+ + +
+ {{ sm.subsection_header('settings.sections.autoOrganize') }} + + +
+
+
+ +
+
+ +
+
+
+
diff --git a/templates/components/modals/settings_modal.html b/templates/components/modals/settings_modal.html index 0cbab3df..d8032d35 100644 --- a/templates/components/modals/settings_modal.html +++ b/templates/components/modals/settings_modal.html @@ -36,6 +36,7 @@ + @@ -46,6 +47,7 @@ {% include 'components/modals/settings/general.html' %} {% include 'components/modals/settings/interface.html' %} {% include 'components/modals/settings/library.html' %} + {% include 'components/modals/settings/organization.html' %}