From 3661b11b70f910f02f3e90fc84e9aaa9cf4b0857 Mon Sep 17 00:00:00 2001 From: Will Miao Date: Mon, 17 Nov 2025 20:02:26 +0800 Subject: [PATCH] feat(i18n): add update flag strategy settings Add new "updateFlags" section to settings navigation and implement update flag strategy configuration. The strategy allows users to choose when update badges appear: - Match updates by base model (only show when new release shares same base model) - Flag any available update (show whenever newer version exists) Includes translations for English, German, Spanish, and French locales. --- locales/de.json | 10 +++- locales/en.json | 9 ++++ locales/es.json | 9 ++++ locales/fr.json | 53 +++++++++++-------- locales/he.json | 9 ++++ locales/ja.json | 53 +++++++++++-------- locales/ko.json | 53 +++++++++++-------- locales/ru.json | 53 +++++++++++-------- locales/zh-CN.json | 53 +++++++++++-------- locales/zh-TW.json | 53 +++++++++++-------- py/routes/handlers/misc_handlers.py | 1 + py/services/base_model_service.py | 2 +- py/services/settings_manager.py | 2 +- static/js/managers/SettingsManager.js | 11 ++-- static/js/state/index.js | 1 + .../components/modals/settings_modal.html | 21 ++++++++ 16 files changed, 253 insertions(+), 140 deletions(-) diff --git a/locales/de.json b/locales/de.json index ad01fa97..15b4cf47 100644 --- a/locales/de.json +++ b/locales/de.json @@ -230,6 +230,7 @@ "priorityTags": "Prioritäts-Tags", "downloadPathTemplates": "Download-Pfad-Vorlagen", "exampleImages": "Beispielbilder", + "updateFlags": "Update-Markierungen", "misc": "Verschiedenes", "metadataArchive": "Metadaten-Archiv-Datenbank", "storageLocation": "Einstellungsort", @@ -271,7 +272,6 @@ "hover": "Bei Hover anzeigen" }, "cardInfoDisplayHelp": "Wählen Sie, wann Modellinformationen und Aktionsschaltflächen angezeigt werden sollen", - "modelCardFooterAction": "Aktion der Modellkarten-Schaltfläche", "modelCardFooterActionOptions": { "exampleImages": "Beispielbilder öffnen", @@ -365,6 +365,14 @@ "download": "Herunterladen", "restartRequired": "Neustart erforderlich" }, + "updateFlagStrategy": { + "label": "Strategie für Update-Markierungen", + "help": "Entscheide, ob Update-Badges nur dann erscheinen, wenn eine neue Version dasselbe Basismodell wie deine lokalen Dateien verwendet, oder sobald es irgendein neueres Release für dieses Modell gibt.", + "options": { + "sameBase": "Updates nach Basismodell abgleichen", + "any": "Jede verfügbare Aktualisierung markieren" + } + }, "misc": { "includeTriggerWords": "Trigger Words in LoRA-Syntax einschließen", "includeTriggerWordsHelp": "Trainierte Trigger Words beim Kopieren der LoRA-Syntax in die Zwischenablage einschließen" diff --git a/locales/en.json b/locales/en.json index 97aad0fc..7ac844da 100644 --- a/locales/en.json +++ b/locales/en.json @@ -230,6 +230,7 @@ "priorityTags": "Priority Tags", "downloadPathTemplates": "Download Path Templates", "exampleImages": "Example Images", + "updateFlags": "Update Flags", "misc": "Misc.", "metadataArchive": "Metadata Archive Database", "storageLocation": "Settings Location", @@ -364,6 +365,14 @@ "download": "Download", "restartRequired": "Requires restart" }, + "updateFlagStrategy": { + "label": "Update Flag Strategy", + "help": "Decide whether update badges should only appear when a new release shares the same base model as your local files or whenever any newer version exists for that model.", + "options": { + "sameBase": "Match updates by base model", + "any": "Flag any available update" + } + }, "misc": { "includeTriggerWords": "Include Trigger Words in LoRA Syntax", "includeTriggerWordsHelp": "Include trained trigger words when copying LoRA syntax to clipboard" diff --git a/locales/es.json b/locales/es.json index 56de455e..89333ca8 100644 --- a/locales/es.json +++ b/locales/es.json @@ -230,6 +230,7 @@ "priorityTags": "Etiquetas prioritarias", "downloadPathTemplates": "Plantillas de rutas de descarga", "exampleImages": "Imágenes de ejemplo", + "updateFlags": "Indicadores de actualización", "misc": "Varios", "metadataArchive": "Base de datos de archivo de metadatos", "storageLocation": "Ubicación de ajustes", @@ -364,6 +365,14 @@ "download": "Descargar", "restartRequired": "Requiere reinicio" }, + "updateFlagStrategy": { + "label": "Estrategia de indicadores de actualización", + "help": "Decide si las insignias de actualización deben mostrarse solo cuando una nueva versión comparte el mismo modelo base que tus archivos locales o siempre que exista cualquier versión más reciente de ese modelo.", + "options": { + "sameBase": "Coincidir actualizaciones por modelo base", + "any": "Marcar cualquier actualización disponible" + } + }, "misc": { "includeTriggerWords": "Incluir palabras clave en la sintaxis de LoRA", "includeTriggerWordsHelp": "Incluir palabras clave entrenadas al copiar la sintaxis de LoRA al portapapeles" diff --git a/locales/fr.json b/locales/fr.json index aa8af106..cf3c8ce3 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -227,13 +227,14 @@ "videoSettings": "Paramètres vidéo", "layoutSettings": "Paramètres d'affichage", "folderSettings": "Paramètres des dossiers", + "priorityTags": "Étiquettes prioritaires", "downloadPathTemplates": "Modèles de chemin de téléchargement", "exampleImages": "Images d'exemple", + "updateFlags": "Indicateurs de mise à jour", "misc": "Divers", "metadataArchive": "Base de données d'archive des métadonnées", "storageLocation": "Emplacement des paramètres", - "proxySettings": "Paramètres du proxy", - "priorityTags": "Étiquettes prioritaires" + "proxySettings": "Paramètres du proxy" }, "storage": { "locationLabel": "Mode portable", @@ -297,6 +298,26 @@ "defaultEmbeddingRootHelp": "Définir le répertoire racine embedding par défaut pour les téléchargements, imports et déplacements", "noDefault": "Aucun par défaut" }, + "priorityTags": { + "title": "Étiquettes prioritaires", + "description": "Personnalisez l'ordre de priorité des étiquettes pour chaque type de modèle (par ex. : character, concept, style(toon|toon_style))", + "placeholder": "character, concept, style(toon|toon_style)", + "helpLinkLabel": "Ouvrir l'aide sur les étiquettes prioritaires", + "modelTypes": { + "lora": "LoRA", + "checkpoint": "Checkpoint", + "embedding": "Embedding" + }, + "saveSuccess": "Étiquettes prioritaires mises à jour.", + "saveError": "Échec de la mise à jour des étiquettes prioritaires.", + "loadingSuggestions": "Chargement des suggestions...", + "validation": { + "missingClosingParen": "L'entrée {index} n'a pas de parenthèse fermante.", + "missingCanonical": "L'entrée {index} doit inclure un nom d'étiquette canonique.", + "duplicateCanonical": "L'étiquette canonique \"{tag}\" apparaît plusieurs fois.", + "unknown": "Configuration d'étiquettes prioritaires invalide." + } + }, "downloadPathTemplates": { "title": "Modèles de chemin de téléchargement", "help": "Configurer les structures de dossiers pour différents types de modèles lors du téléchargement depuis Civitai.", @@ -344,6 +365,14 @@ "download": "Télécharger", "restartRequired": "Redémarrage requis" }, + "updateFlagStrategy": { + "label": "Stratégie des indicateurs de mise à jour", + "help": "Choisissez si les badges de mise à jour doivent apparaître uniquement lorsqu’une nouvelle version partage le même modèle de base que vos fichiers locaux, ou dès qu’il existe une version plus récente pour ce modèle.", + "options": { + "sameBase": "Faire correspondre les mises à jour par modèle de base", + "any": "Signaler n’importe quelle mise à jour disponible" + } + }, "misc": { "includeTriggerWords": "Inclure les mots-clés dans la syntaxe LoRA", "includeTriggerWordsHelp": "Inclure les mots-clés d'entraînement lors de la copie de la syntaxe LoRA dans le presse-papiers" @@ -389,26 +418,6 @@ "proxyPassword": "Mot de passe (optionnel)", "proxyPasswordPlaceholder": "mot_de_passe", "proxyPasswordHelp": "Mot de passe pour l'authentification proxy (si nécessaire)" - }, - "priorityTags": { - "title": "Étiquettes prioritaires", - "description": "Personnalisez l'ordre de priorité des étiquettes pour chaque type de modèle (par ex. : character, concept, style(toon|toon_style))", - "placeholder": "character, concept, style(toon|toon_style)", - "helpLinkLabel": "Ouvrir l'aide sur les étiquettes prioritaires", - "modelTypes": { - "lora": "LoRA", - "checkpoint": "Checkpoint", - "embedding": "Embedding" - }, - "saveSuccess": "Étiquettes prioritaires mises à jour.", - "saveError": "Échec de la mise à jour des étiquettes prioritaires.", - "loadingSuggestions": "Chargement des suggestions...", - "validation": { - "missingClosingParen": "L'entrée {index} n'a pas de parenthèse fermante.", - "missingCanonical": "L'entrée {index} doit inclure un nom d'étiquette canonique.", - "duplicateCanonical": "L'étiquette canonique \"{tag}\" apparaît plusieurs fois.", - "unknown": "Configuration d'étiquettes prioritaires invalide." - } } }, "loras": { diff --git a/locales/he.json b/locales/he.json index 0cb19801..ac9571c6 100644 --- a/locales/he.json +++ b/locales/he.json @@ -229,6 +229,7 @@ "folderSettings": "הגדרות תיקייה", "downloadPathTemplates": "תבניות נתיב הורדה", "exampleImages": "תמונות דוגמה", + "updateFlags": "תגי עדכון", "misc": "שונות", "metadataArchive": "מסד נתונים של ארכיון מטא-דאטה", "storageLocation": "מיקום ההגדרות", @@ -344,6 +345,14 @@ "download": "הורד", "restartRequired": "דורש הפעלה מחדש" }, + "updateFlagStrategy": { + "label": "אסטרטגיית תגי עדכון", + "help": "בחרו אם תוויות העדכון יוצגו רק כאשר גרסה חדשה חולקת את אותו דגם בסיס כמו הקבצים המקומיים שלכם או בכל מקרה שבו קיימת גרסה חדשה עבור אותו דגם.", + "options": { + "sameBase": "התאמת עדכונים לפי דגם בסיס", + "any": "תוויות לכל עדכון זמין" + } + }, "misc": { "includeTriggerWords": "כלול מילות טריגר בתחביר LoRA", "includeTriggerWordsHelp": "כלול מילות טריגר מאומנות בעת העתקת תחביר LoRA ללוח" diff --git a/locales/ja.json b/locales/ja.json index 66b1b5ff..ad5b300f 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -227,13 +227,14 @@ "videoSettings": "動画設定", "layoutSettings": "レイアウト設定", "folderSettings": "フォルダ設定", + "priorityTags": "優先タグ", "downloadPathTemplates": "ダウンロードパステンプレート", "exampleImages": "例画像", + "updateFlags": "アップデートフラグ", "misc": "その他", "metadataArchive": "メタデータアーカイブデータベース", "storageLocation": "設定の場所", - "proxySettings": "プロキシ設定", - "priorityTags": "優先タグ" + "proxySettings": "プロキシ設定" }, "storage": { "locationLabel": "ポータブルモード", @@ -297,6 +298,26 @@ "defaultEmbeddingRootHelp": "ダウンロード、インポート、移動用のデフォルトembeddingルートディレクトリを設定", "noDefault": "デフォルトなし" }, + "priorityTags": { + "title": "優先タグ", + "description": "各モデルタイプのタグ優先順位をカスタマイズします (例: character, concept, style(toon|toon_style))", + "placeholder": "character, concept, style(toon|toon_style)", + "helpLinkLabel": "優先タグのヘルプを開く", + "modelTypes": { + "lora": "LoRA", + "checkpoint": "チェックポイント", + "embedding": "埋め込み" + }, + "saveSuccess": "優先タグを更新しました。", + "saveError": "優先タグの更新に失敗しました。", + "loadingSuggestions": "候補を読み込み中...", + "validation": { + "missingClosingParen": "エントリ {index} に閉じ括弧がありません。", + "missingCanonical": "エントリ {index} には正規タグ名を含める必要があります。", + "duplicateCanonical": "正規タグ \"{tag}\" が複数回登場しています。", + "unknown": "無効な優先タグ設定です。" + } + }, "downloadPathTemplates": { "title": "ダウンロードパステンプレート", "help": "Civitaiからダウンロードする際の異なるモデルタイプのフォルダ構造を設定します。", @@ -344,6 +365,14 @@ "download": "ダウンロード", "restartRequired": "再起動が必要" }, + "updateFlagStrategy": { + "label": "アップデートフラグの表示戦略", + "help": "新リリースがローカルファイルと同じベースモデルを共有する場合にのみ更新バッジを表示するか、そのモデルに新しいバージョンがあれば常に表示するかを決めます。", + "options": { + "sameBase": "ベースモデルで更新をマッチ", + "any": "利用可能な更新すべてを表示" + } + }, "misc": { "includeTriggerWords": "LoRA構文にトリガーワードを含める", "includeTriggerWordsHelp": "LoRA構文をクリップボードにコピーする際、学習済みトリガーワードを含めます" @@ -389,26 +418,6 @@ "proxyPassword": "パスワード(任意)", "proxyPasswordPlaceholder": "パスワード", "proxyPasswordHelp": "プロキシ認証用のパスワード(必要な場合)" - }, - "priorityTags": { - "title": "優先タグ", - "description": "各モデルタイプのタグ優先順位をカスタマイズします (例: character, concept, style(toon|toon_style))", - "placeholder": "character, concept, style(toon|toon_style)", - "helpLinkLabel": "優先タグのヘルプを開く", - "modelTypes": { - "lora": "LoRA", - "checkpoint": "チェックポイント", - "embedding": "埋め込み" - }, - "saveSuccess": "優先タグを更新しました。", - "saveError": "優先タグの更新に失敗しました。", - "loadingSuggestions": "候補を読み込み中...", - "validation": { - "missingClosingParen": "エントリ {index} に閉じ括弧がありません。", - "missingCanonical": "エントリ {index} には正規タグ名を含める必要があります。", - "duplicateCanonical": "正規タグ \"{tag}\" が複数回登場しています。", - "unknown": "無効な優先タグ設定です。" - } } }, "loras": { diff --git a/locales/ko.json b/locales/ko.json index e735b42d..2fef79b2 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -227,13 +227,14 @@ "videoSettings": "비디오 설정", "layoutSettings": "레이아웃 설정", "folderSettings": "폴더 설정", + "priorityTags": "우선순위 태그", "downloadPathTemplates": "다운로드 경로 템플릿", "exampleImages": "예시 이미지", + "updateFlags": "업데이트 표시", "misc": "기타", "metadataArchive": "메타데이터 아카이브 데이터베이스", "storageLocation": "설정 위치", - "proxySettings": "프록시 설정", - "priorityTags": "우선순위 태그" + "proxySettings": "프록시 설정" }, "storage": { "locationLabel": "휴대용 모드", @@ -297,6 +298,26 @@ "defaultEmbeddingRootHelp": "다운로드, 가져오기 및 이동을 위한 기본 Embedding 루트 디렉토리를 설정합니다", "noDefault": "기본값 없음" }, + "priorityTags": { + "title": "우선순위 태그", + "description": "모델 유형별 태그 우선순위를 사용자 지정합니다(예: character, concept, style(toon|toon_style)).", + "placeholder": "character, concept, style(toon|toon_style)", + "helpLinkLabel": "우선순위 태그 도움말 열기", + "modelTypes": { + "lora": "LoRA", + "checkpoint": "체크포인트", + "embedding": "임베딩" + }, + "saveSuccess": "우선순위 태그가 업데이트되었습니다.", + "saveError": "우선순위 태그를 업데이트하지 못했습니다.", + "loadingSuggestions": "추천을 불러오는 중...", + "validation": { + "missingClosingParen": "{index}번째 항목에 닫는 괄호가 없습니다.", + "missingCanonical": "{index}번째 항목에는 정식 태그 이름이 포함되어야 합니다.", + "duplicateCanonical": "정식 태그 \"{tag}\"가 여러 번 나타납니다.", + "unknown": "잘못된 우선순위 태그 구성입니다." + } + }, "downloadPathTemplates": { "title": "다운로드 경로 템플릿", "help": "Civitai에서 다운로드할 때 다양한 모델 유형의 폴더 구조를 구성합니다.", @@ -344,6 +365,14 @@ "download": "다운로드", "restartRequired": "재시작 필요" }, + "updateFlagStrategy": { + "label": "업데이트 표시 전략", + "help": "새 릴리스가 로컬 파일과 동일한 베이스 모델을 공유할 때만 업데이트 배지를 표시할지, 또는 해당 모델에 사용 가능한 새 버전이 있으면 항상 표시할지 결정합니다.", + "options": { + "sameBase": "베이스 모델로 업데이트 일치", + "any": "사용 가능한 모든 업데이트 표시" + } + }, "misc": { "includeTriggerWords": "LoRA 문법에 트리거 단어 포함", "includeTriggerWordsHelp": "LoRA 문법을 클립보드에 복사할 때 학습된 트리거 단어를 포함합니다" @@ -389,26 +418,6 @@ "proxyPassword": "비밀번호 (선택사항)", "proxyPasswordPlaceholder": "password", "proxyPasswordHelp": "프록시 인증에 필요한 비밀번호 (필요한 경우)" - }, - "priorityTags": { - "title": "우선순위 태그", - "description": "모델 유형별 태그 우선순위를 사용자 지정합니다(예: character, concept, style(toon|toon_style)).", - "placeholder": "character, concept, style(toon|toon_style)", - "helpLinkLabel": "우선순위 태그 도움말 열기", - "modelTypes": { - "lora": "LoRA", - "checkpoint": "체크포인트", - "embedding": "임베딩" - }, - "saveSuccess": "우선순위 태그가 업데이트되었습니다.", - "saveError": "우선순위 태그를 업데이트하지 못했습니다.", - "loadingSuggestions": "추천을 불러오는 중...", - "validation": { - "missingClosingParen": "{index}번째 항목에 닫는 괄호가 없습니다.", - "missingCanonical": "{index}번째 항목에는 정식 태그 이름이 포함되어야 합니다.", - "duplicateCanonical": "정식 태그 \"{tag}\"가 여러 번 나타납니다.", - "unknown": "잘못된 우선순위 태그 구성입니다." - } } }, "loras": { diff --git a/locales/ru.json b/locales/ru.json index 158a9fb8..2d739730 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -227,13 +227,14 @@ "videoSettings": "Настройки видео", "layoutSettings": "Настройки макета", "folderSettings": "Настройки папок", + "priorityTags": "Приоритетные теги", "downloadPathTemplates": "Шаблоны путей загрузки", "exampleImages": "Примеры изображений", + "updateFlags": "Метки обновлений", "misc": "Разное", "metadataArchive": "Архив метаданных", "storageLocation": "Расположение настроек", - "proxySettings": "Настройки прокси", - "priorityTags": "Приоритетные теги" + "proxySettings": "Настройки прокси" }, "storage": { "locationLabel": "Портативный режим", @@ -297,6 +298,26 @@ "defaultEmbeddingRootHelp": "Установить корневую папку embedding по умолчанию для загрузок, импорта и перемещений", "noDefault": "Не задано" }, + "priorityTags": { + "title": "Приоритетные теги", + "description": "Настройте порядок приоритетов тегов для каждого типа моделей (например, character, concept, style(toon|toon_style)).", + "placeholder": "character, concept, style(toon|toon_style)", + "helpLinkLabel": "Открыть справку по приоритетным тегам", + "modelTypes": { + "lora": "LoRA", + "checkpoint": "Чекпойнт", + "embedding": "Эмбеддинг" + }, + "saveSuccess": "Приоритетные теги обновлены.", + "saveError": "Не удалось обновить приоритетные теги.", + "loadingSuggestions": "Загрузка подсказок...", + "validation": { + "missingClosingParen": "В записи {index} отсутствует закрывающая скобка.", + "missingCanonical": "Запись {index} должна содержать каноническое имя тега.", + "duplicateCanonical": "Канонический тег \"{tag}\" встречается более одного раза.", + "unknown": "Недопустимая конфигурация приоритетных тегов." + } + }, "downloadPathTemplates": { "title": "Шаблоны путей загрузки", "help": "Настройте структуру папок для разных типов моделей при загрузке с Civitai.", @@ -344,6 +365,14 @@ "download": "Загрузить", "restartRequired": "Требует перезапуска" }, + "updateFlagStrategy": { + "label": "Стратегия меток обновлений", + "help": "Выберите, отображать ли значки обновления только когда новая версия имеет тот же базовый модель, что и локальные файлы, или всегда при наличии любого нового релиза для этой модели.", + "options": { + "sameBase": "Совпадение обновлений по базовой модели", + "any": "Отмечать любые доступные обновления" + } + }, "misc": { "includeTriggerWords": "Включать триггерные слова в синтаксис LoRA", "includeTriggerWordsHelp": "Включать обученные триггерные слова при копировании синтаксиса LoRA в буфер обмена" @@ -389,26 +418,6 @@ "proxyPassword": "Пароль (необязательно)", "proxyPasswordPlaceholder": "пароль", "proxyPasswordHelp": "Пароль для аутентификации на прокси (если требуется)" - }, - "priorityTags": { - "title": "Приоритетные теги", - "description": "Настройте порядок приоритетов тегов для каждого типа моделей (например, character, concept, style(toon|toon_style)).", - "placeholder": "character, concept, style(toon|toon_style)", - "helpLinkLabel": "Открыть справку по приоритетным тегам", - "modelTypes": { - "lora": "LoRA", - "checkpoint": "Чекпойнт", - "embedding": "Эмбеддинг" - }, - "saveSuccess": "Приоритетные теги обновлены.", - "saveError": "Не удалось обновить приоритетные теги.", - "loadingSuggestions": "Загрузка подсказок...", - "validation": { - "missingClosingParen": "В записи {index} отсутствует закрывающая скобка.", - "missingCanonical": "Запись {index} должна содержать каноническое имя тега.", - "duplicateCanonical": "Канонический тег \"{tag}\" встречается более одного раза.", - "unknown": "Недопустимая конфигурация приоритетных тегов." - } } }, "loras": { diff --git a/locales/zh-CN.json b/locales/zh-CN.json index f1fd9cd9..1742ab69 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -227,13 +227,14 @@ "videoSettings": "视频设置", "layoutSettings": "布局设置", "folderSettings": "文件夹设置", + "priorityTags": "优先标签", "downloadPathTemplates": "下载路径模板", "exampleImages": "示例图片", + "updateFlags": "更新标记", "misc": "其他", "metadataArchive": "元数据归档数据库", "storageLocation": "设置位置", - "proxySettings": "代理设置", - "priorityTags": "优先标签" + "proxySettings": "代理设置" }, "storage": { "locationLabel": "便携模式", @@ -297,6 +298,26 @@ "defaultEmbeddingRootHelp": "设置下载、导入和移动时的默认 Embedding 根目录", "noDefault": "无默认" }, + "priorityTags": { + "title": "优先标签", + "description": "为每种模型类型自定义标签优先级顺序 (例如: character, concept, style(toon|toon_style))", + "placeholder": "character, concept, style(toon|toon_style)", + "helpLinkLabel": "打开优先标签帮助", + "modelTypes": { + "lora": "LoRA", + "checkpoint": "Checkpoint", + "embedding": "Embedding" + }, + "saveSuccess": "优先标签已更新。", + "saveError": "优先标签更新失败。", + "loadingSuggestions": "正在加载建议...", + "validation": { + "missingClosingParen": "条目 {index} 缺少右括号。", + "missingCanonical": "条目 {index} 必须包含规范标签名称。", + "duplicateCanonical": "规范标签 \"{tag}\" 出现多次。", + "unknown": "优先标签配置无效。" + } + }, "downloadPathTemplates": { "title": "下载路径模板", "help": "配置从 Civitai 下载不同模型类型的文件夹结构。", @@ -344,6 +365,14 @@ "download": "下载", "restartRequired": "需要重启" }, + "updateFlagStrategy": { + "label": "更新标记策略", + "help": "决定更新徽章是否仅在新版本与本地文件共享相同基础模型时显示,或只要该模型有任何更新版本就显示。", + "options": { + "sameBase": "按基础模型匹配更新", + "any": "显示任何可用更新" + } + }, "misc": { "includeTriggerWords": "复制 LoRA 语法时包含触发词", "includeTriggerWordsHelp": "复制 LoRA 语法到剪贴板时包含训练触发词" @@ -389,26 +418,6 @@ "proxyPassword": "密码 (可选)", "proxyPasswordPlaceholder": "密码", "proxyPasswordHelp": "代理认证的密码 (如果需要)" - }, - "priorityTags": { - "title": "优先标签", - "description": "为每种模型类型自定义标签优先级顺序 (例如: character, concept, style(toon|toon_style))", - "placeholder": "character, concept, style(toon|toon_style)", - "helpLinkLabel": "打开优先标签帮助", - "modelTypes": { - "lora": "LoRA", - "checkpoint": "Checkpoint", - "embedding": "Embedding" - }, - "saveSuccess": "优先标签已更新。", - "saveError": "优先标签更新失败。", - "loadingSuggestions": "正在加载建议...", - "validation": { - "missingClosingParen": "条目 {index} 缺少右括号。", - "missingCanonical": "条目 {index} 必须包含规范标签名称。", - "duplicateCanonical": "规范标签 \"{tag}\" 出现多次。", - "unknown": "优先标签配置无效。" - } } }, "loras": { diff --git a/locales/zh-TW.json b/locales/zh-TW.json index c5301fb0..c8404531 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -227,13 +227,14 @@ "videoSettings": "影片設定", "layoutSettings": "版面設定", "folderSettings": "資料夾設定", + "priorityTags": "優先標籤", "downloadPathTemplates": "下載路徑範本", "exampleImages": "範例圖片", + "updateFlags": "更新標記", "misc": "其他", "metadataArchive": "中繼資料封存資料庫", "storageLocation": "設定位置", - "proxySettings": "代理設定", - "priorityTags": "優先標籤" + "proxySettings": "代理設定" }, "storage": { "locationLabel": "可攜式模式", @@ -297,6 +298,26 @@ "defaultEmbeddingRootHelp": "設定下載、匯入和移動時的預設 Embedding 根目錄", "noDefault": "未設定預設" }, + "priorityTags": { + "title": "優先標籤", + "description": "為每種模型類型自訂標籤的優先順序 (例如: character, concept, style(toon|toon_style))", + "placeholder": "character, concept, style(toon|toon_style)", + "helpLinkLabel": "開啟優先標籤說明", + "modelTypes": { + "lora": "LoRA", + "checkpoint": "Checkpoint", + "embedding": "Embedding" + }, + "saveSuccess": "優先標籤已更新。", + "saveError": "更新優先標籤失敗。", + "loadingSuggestions": "正在載入建議...", + "validation": { + "missingClosingParen": "項目 {index} 缺少右括號。", + "missingCanonical": "項目 {index} 必須包含正規標籤名稱。", + "duplicateCanonical": "正規標籤 \"{tag}\" 出現多於一次。", + "unknown": "優先標籤設定無效。" + } + }, "downloadPathTemplates": { "title": "下載路徑範本", "help": "設定從 Civitai 下載時不同模型類型的資料夾結構。", @@ -344,6 +365,14 @@ "download": "下載", "restartRequired": "需要重新啟動" }, + "updateFlagStrategy": { + "label": "更新標記策略", + "help": "決定更新徽章是否僅在新版本與本地檔案共享相同基礎模型時顯示,或只要該模型有任何更新版本就顯示。", + "options": { + "sameBase": "依基礎模型匹配更新", + "any": "顯示任何可用更新" + } + }, "misc": { "includeTriggerWords": "在 LoRA 語法中包含觸發詞", "includeTriggerWordsHelp": "複製 LoRA 語法到剪貼簿時包含訓練觸發詞" @@ -389,26 +418,6 @@ "proxyPassword": "密碼(選填)", "proxyPasswordPlaceholder": "password", "proxyPasswordHelp": "代理驗證所需的密碼(如有需要)" - }, - "priorityTags": { - "title": "優先標籤", - "description": "為每種模型類型自訂標籤的優先順序 (例如: character, concept, style(toon|toon_style))", - "placeholder": "character, concept, style(toon|toon_style)", - "helpLinkLabel": "開啟優先標籤說明", - "modelTypes": { - "lora": "LoRA", - "checkpoint": "Checkpoint", - "embedding": "Embedding" - }, - "saveSuccess": "優先標籤已更新。", - "saveError": "更新優先標籤失敗。", - "loadingSuggestions": "正在載入建議...", - "validation": { - "missingClosingParen": "項目 {index} 缺少右括號。", - "missingCanonical": "項目 {index} 必須包含正規標籤名稱。", - "duplicateCanonical": "正規標籤 \"{tag}\" 出現多於一次。", - "unknown": "優先標籤設定無效。" - } } }, "loras": { diff --git a/py/routes/handlers/misc_handlers.py b/py/routes/handlers/misc_handlers.py index b7750ce1..1e00ab75 100644 --- a/py/routes/handlers/misc_handlers.py +++ b/py/routes/handlers/misc_handlers.py @@ -201,6 +201,7 @@ class SettingsHandler: "priority_tags", "model_card_footer_action", "model_name_display", + "update_flag_strategy", ) _PROXY_KEYS = {"proxy_enabled", "proxy_host", "proxy_port", "proxy_username", "proxy_password", "proxy_type"} diff --git a/py/services/base_model_service.py b/py/services/base_model_service.py index a9d1fa09..2fd393ec 100644 --- a/py/services/base_model_service.py +++ b/py/services/base_model_service.py @@ -271,7 +271,7 @@ class BaseModelService(ABC): if isinstance(strategy_value, str) and strategy_value.strip(): strategy = strategy_value.strip().lower() else: - strategy = "any" + strategy = "same_base" same_base_mode = strategy == "same_base" records = None diff --git a/py/services/settings_manager.py b/py/services/settings_manager.py index 6ff96c4b..03b628da 100644 --- a/py/services/settings_manager.py +++ b/py/services/settings_manager.py @@ -61,7 +61,7 @@ DEFAULT_SETTINGS: Dict[str, Any] = { "priority_tags": DEFAULT_PRIORITY_TAG_CONFIG.copy(), "model_name_display": "model_name", "model_card_footer_action": "example_images", - "update_flag_strategy": "any", + "update_flag_strategy": "same_base", } diff --git a/static/js/managers/SettingsManager.js b/static/js/managers/SettingsManager.js index 705afc43..7a6b02ca 100644 --- a/static/js/managers/SettingsManager.js +++ b/static/js/managers/SettingsManager.js @@ -412,6 +412,11 @@ export class SettingsManager { modelNameDisplaySelect.value = state.global.settings.model_name_display || 'model_name'; } + const updateFlagStrategySelect = document.getElementById('updateFlagStrategy'); + if (updateFlagStrategySelect) { + updateFlagStrategySelect.value = state.global.settings.update_flag_strategy || 'same_base'; + } + // Set optimize example images setting const optimizeExampleImagesCheckbox = document.getElementById('optimizeExampleImages'); if (optimizeExampleImagesCheckbox) { @@ -1334,11 +1339,7 @@ export class SettingsManager { showToast('toast.settings.settingsUpdated', { setting: settingKey.replace(/_/g, ' ') }, 'success'); - if (settingKey === 'model_name_display') { - this.reloadContent(); - } - - if (settingKey === 'model_card_footer_action') { + if (settingKey === 'model_name_display' || settingKey === 'model_card_footer_action' || settingKey === 'update_flag_strategy') { this.reloadContent(); } } catch (error) { diff --git a/static/js/state/index.js b/static/js/state/index.js index ee54c066..b8157f66 100644 --- a/static/js/state/index.js +++ b/static/js/state/index.js @@ -33,6 +33,7 @@ const DEFAULT_SETTINGS_BASE = Object.freeze({ include_trigger_words: false, compact_mode: false, priority_tags: { ...DEFAULT_PRIORITY_TAG_CONFIG }, + update_flag_strategy: 'same_base', }); export function createDefaultSettings() { diff --git a/templates/components/modals/settings_modal.html b/templates/components/modals/settings_modal.html index 4b40e976..3efcea9a 100644 --- a/templates/components/modals/settings_modal.html +++ b/templates/components/modals/settings_modal.html @@ -320,6 +320,27 @@ + +
+

{{ t('settings.sections.updateFlags') }}

+
+
+
+ +
+
+ +
+
+
+ {{ t('settings.updateFlagStrategy.help') }} +
+
+
+

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