i18n(download): translate download root rules strings in all locales

Fill the 26 [TODO: Translate] placeholders per locale (24
settings.downloadRootRules.* keys + modals.download.routedByRule.*)
across zh-CN, zh-TW, ja, ko, fr, de, es, ru, he, following the
i18n guidelines: routing/root/base-model/tag terminology per §2,
R3 Latin model types and example token lists kept verbatim, R6
register, per-locale UI-label quoting in routedByRule, and fragment
style for the summary/chip strings. The es tag chip uses "Tag" (the
full "etiqueta" overflows the badge; the tooltip keeps the full term).

Source fix per R9/R7: en.json summary.selectBaseModels/enterTags used
U+2026 — now ASCII "..." (JS fallbacks and vitest assertions moved
with it; truncateMiddlePath's … stays, it is a path-elision character,
not a locale string).

Guidelines doc: new §2 "Download root rules feature" terminology
subsection + 2026-10 status entry.
This commit is contained in:
Will Miao
2026-10-10 08:15:35 +08:00
parent 7a76d44a20
commit 2e5f1db6df
13 changed files with 286 additions and 240 deletions
+46
View File
@@ -195,6 +195,17 @@ Locales: `en`, `zh-CN`, `zh-TW`, `ja`, `ko`, `fr`, `de`, `es`, `ru`, `he` (RTL).
> root** noun while translating (`library root` → `model root`, R5); the count-bearing
> `successMulti` uses the singular `success` key when only one copy was removed.
> **Status (2026-10, download root rules):** the Download Root Rules editor (Settings →
> Library, per model type) routes downloads to a non-default root by base model or tag
> match, and the download modal names the rule that matched. That added 26 keys —
> `settings.downloadRootRules.*` (24) and `modals.download.routedByRule.baseModel` /
> `.tag` — translated in all 9 locales (terminology in §2, "Download root rules
> feature"). One source fix came with the pass: `summary.selectBaseModels` /
> `summary.enterTags` used U+2026 `…`, which violates R7, so `en.json` now uses ASCII
> `...` (the JS fallback strings in `SettingsManager.js` moved with it). The `…` in
> `truncateMiddlePath` stays — it is a code-level path-elision character, not a locale
> string. No remaining `[TODO: Translate]` placeholders.
---
## 1. Hard rules (do not violate)
@@ -686,6 +697,41 @@ directly (model-type names, R3). The tooltip quotes the `modals.download.useDefa
label verbatim with each locale's UI-label quoting style (zh-CN “ ”, zh-TW/ja 「 」,
ko `' '`, fr « … », de „ … “, es/ru/he «…»).
### Download root rules feature (per-type routing by base model / tag)
The settings Library tab hosts an ordered rule list per model type
(`settings.downloadRootRules.*`) that sends a download to a non-default root folder when
the model's base model or tags match; the download modal names the rule that matched
(`modals.download.routedByRule.*`). Rules are checked in order, the **first match wins**,
and unmatched downloads fall back to the default root. "Routing" itself reuses the
Download routing feature row above (zh 路由, ja 振り分け, ko 라우팅, …).
| Term | Rendering |
|---|---|
| rule | zh-CN 规则 · zh-TW 規則 · ja ルール · ko 규칙 · fr règle · de Regel · es regla · ru правило · he כלל |
| root (folder) | reuse each locale's `sidebar.modelRoot` noun: zh-CN 根目录 · zh-TW 根目錄 · ja ルート · ko 루트 · fr racine · de Stammordner · es raíz · ru корневая папка · he שורש |
| default root | zh-CN 默认根目录 · zh-TW 預設根目錄 · ja デフォルトルート · ko 기본 루트 · fr racine par défaut · de Standard-Stammordner · es raíz predeterminada · ru корневая папка по умолчанию · he שורש ברירת המחדל |
| first match wins | zh-CN 首个命中的规则生效 · zh-TW 首個命中的規則生效 · ja 最初に一致したルールが適用 · ko 첫 번째로 일치하는 규칙이 적용 · fr la première correspondance l’emporte · de der erste Treffer gewinnt · es gana la primera coincidencia · ru срабатывает первое совпадение · he ההתאמה הראשונה מנצחת |
| unmatched (downloads) | zh-CN 未匹配 · zh-TW 未匹配 · ja 一致しない · ko 일치하지 않는 · fr sans correspondance · de ohne Treffer · es sin coincidencia · ru без совпадения · he ללא התאמה |
| routed by rule | zh-CN 已由规则路由 · zh-TW 已由規則路由 · ja ルールで振り分け · ko 규칙에 따라 라우팅됨 · fr routé par règle · de per Regel geroutet · es enrutado por regla · ru маршрут по правилу · he נותב לפי כלל |
- The match-type **chips** are tiny badges: `BM` stays Latin everywhere; the tag chip uses
the short tag noun (zh-CN 标签, zh-TW 標籤, ja タグ, ko 태그, fr/de Tag, ru Тег,
he תגית). **es uses `Tag` on the chip** (not "etiqueta") because the full noun
overflows the badge — the full term "Etiqueta" still appears in the `matchTypes.tag`
tooltip.
- `types.*` are model-type names (R3) and `tagPlaceholder` is an example token list (§6):
both stay byte-identical to `en.json` in every locale.
- `summary.*` are fragments inside the collapsed-row button — no trailing period, ASCII
`...` per R7. `summary.more` joins after the first two matches as `a, b, <more>`;
`{count}` may move (ru «ещё {count}», ja 「他 {count} 件」, zh-CN 还有 {count} 项,
zh-TW 還有 {count} 項).
- `routedByRule.*` quote the matched value with each locale's UI-label quoting style
(zh-CN “ ”, zh-TW/ja 「 」, ko `' '`, fr « … », de „ … “, es/ru/he «…»).
- Colon style in `defaultHint` / `saveFailed` / `routedByRule` follows each file's
existing majority: full-width `:` for zh-CN/zh-TW/ja, ASCII `:` for ko and the
Latin/Cyrillic/Hebrew locales (fr keeps its space before `:`).
### OpenModelDB feature
**OpenModelDB** is a brand name and stays Latin in every locale (R3, same as CivitAI /
+26 -26
View File
@@ -496,39 +496,39 @@
}
},
"downloadRootRules": {
"title": "[TODO: Translate] Download Root Rules",
"help": "[TODO: Translate] Route downloads to a different root folder based on the model's base model.",
"description": "[TODO: Translate] Rules are checked in order. First match wins; unmatched downloads use the default root.",
"defaultHint": "[TODO: Translate] Default: {root} — unmatched downloads go here",
"defaultSuffix": "[TODO: Translate] default",
"addBaseModelRule": "[TODO: Translate] Base model rule",
"addTagRule": "[TODO: Translate] Tag rule",
"removeRule": "[TODO: Translate] Remove rule",
"moveUp": "[TODO: Translate] Move up",
"moveDown": "[TODO: Translate] Move down",
"noRoots": "[TODO: Translate] No roots configured for this model type.",
"title": "Download-Root-Regeln",
"help": "Leitet Downloads anhand des Basismodells oder der Tags des Modells in einen anderen Stammordner.",
"description": "Regeln werden der Reihe nach geprüft. Der erste Treffer gewinnt; Downloads ohne Treffer verwenden den Standard-Stammordner.",
"defaultHint": "Standard: {root} — Downloads ohne Treffer landen hier",
"defaultSuffix": "Standard",
"addBaseModelRule": "Basismodell-Regel",
"addTagRule": "Tag-Regel",
"removeRule": "Regel entfernen",
"moveUp": "Nach oben",
"moveDown": "Nach unten",
"noRoots": "Für diesen Modelltyp sind keine Stammordner konfiguriert.",
"matchTypes": {
"baseModel": "[TODO: Translate] Base model",
"tag": "[TODO: Translate] Tag"
"baseModel": "Basismodell",
"tag": "Tag"
},
"matchTypeChips": {
"baseModel": "[TODO: Translate] BM",
"tag": "[TODO: Translate] Tag"
"baseModel": "BM",
"tag": "Tag"
},
"tagPlaceholder": "[TODO: Translate] character, style, realistic",
"tagPlaceholder": "character, style, realistic",
"summary": {
"selectBaseModels": "[TODO: Translate] Select base models…",
"enterTags": "[TODO: Translate] Enter tags…",
"more": "[TODO: Translate] +{count} more"
"selectBaseModels": "Basismodelle auswählen...",
"enterTags": "Tags eingeben...",
"more": "+{count} weitere"
},
"types": {
"loras": "[TODO: Translate] LoRA",
"checkpoints": "[TODO: Translate] Checkpoint",
"unet": "[TODO: Translate] Diffusion Model",
"embeddings": "[TODO: Translate] Embedding"
"loras": "LoRA",
"checkpoints": "Checkpoint",
"unet": "Diffusion Model",
"embeddings": "Embedding"
},
"validation": {
"saveFailed": "[TODO: Translate] Unable to save download root rules: {message}"
"saveFailed": "Download-Root-Regeln konnten nicht gespeichert werden: {message}"
}
},
"skipPreviouslyDownloadedModelVersions": {
@@ -1662,8 +1662,8 @@
"tooltip": "Automatisch aus den Modell-Metadaten erkannt. Wechseln Sie, wenn die Erkennung falsch war; ein Wechsel deaktiviert „Standardpfad verwenden“ für diesen Download."
},
"routedByRule": {
"baseModel": "[TODO: Translate] Routed by rule: base model \"{value}\"",
"tag": "[TODO: Translate] Routed by rule: tag \"{value}\""
"baseModel": "Per Regel geroutet: Basismodell „{value}“",
"tag": "Per Regel geroutet: Tag „{value}“"
},
"targetFolderPath": "Zielordnerpfad:",
"browseFolders": "Ordner durchsuchen:",
+2 -2
View File
@@ -517,8 +517,8 @@
},
"tagPlaceholder": "character, style, realistic",
"summary": {
"selectBaseModels": "Select base models…",
"enterTags": "Enter tags…",
"selectBaseModels": "Select base models...",
"enterTags": "Enter tags...",
"more": "+{count} more"
},
"types": {
+26 -26
View File
@@ -496,39 +496,39 @@
}
},
"downloadRootRules": {
"title": "[TODO: Translate] Download Root Rules",
"help": "[TODO: Translate] Route downloads to a different root folder based on the model's base model.",
"description": "[TODO: Translate] Rules are checked in order. First match wins; unmatched downloads use the default root.",
"defaultHint": "[TODO: Translate] Default: {root} — unmatched downloads go here",
"defaultSuffix": "[TODO: Translate] default",
"addBaseModelRule": "[TODO: Translate] Base model rule",
"addTagRule": "[TODO: Translate] Tag rule",
"removeRule": "[TODO: Translate] Remove rule",
"moveUp": "[TODO: Translate] Move up",
"moveDown": "[TODO: Translate] Move down",
"noRoots": "[TODO: Translate] No roots configured for this model type.",
"title": "Reglas de raíz de descarga",
"help": "Enruta las descargas a una carpeta raíz diferente según el modelo base o las etiquetas del modelo.",
"description": "Las reglas se comprueban en orden. Gana la primera coincidencia; las descargas sin coincidencia usan la raíz predeterminada.",
"defaultHint": "Predeterminada: {root} — las descargas sin coincidencia van aquí",
"defaultSuffix": "predeterminado",
"addBaseModelRule": "Regla de modelo base",
"addTagRule": "Regla de etiqueta",
"removeRule": "Eliminar regla",
"moveUp": "Subir",
"moveDown": "Bajar",
"noRoots": "No hay raíces configuradas para este tipo de modelo.",
"matchTypes": {
"baseModel": "[TODO: Translate] Base model",
"tag": "[TODO: Translate] Tag"
"baseModel": "Modelo base",
"tag": "Etiqueta"
},
"matchTypeChips": {
"baseModel": "[TODO: Translate] BM",
"tag": "[TODO: Translate] Tag"
"baseModel": "BM",
"tag": "Tag"
},
"tagPlaceholder": "[TODO: Translate] character, style, realistic",
"tagPlaceholder": "character, style, realistic",
"summary": {
"selectBaseModels": "[TODO: Translate] Select base models…",
"enterTags": "[TODO: Translate] Enter tags…",
"more": "[TODO: Translate] +{count} more"
"selectBaseModels": "Selecciona modelos base...",
"enterTags": "Introduce etiquetas...",
"more": "+{count} más"
},
"types": {
"loras": "[TODO: Translate] LoRA",
"checkpoints": "[TODO: Translate] Checkpoint",
"unet": "[TODO: Translate] Diffusion Model",
"embeddings": "[TODO: Translate] Embedding"
"loras": "LoRA",
"checkpoints": "Checkpoint",
"unet": "Diffusion Model",
"embeddings": "Embedding"
},
"validation": {
"saveFailed": "[TODO: Translate] Unable to save download root rules: {message}"
"saveFailed": "No se pudieron guardar las reglas de raíz de descarga: {message}"
}
},
"skipPreviouslyDownloadedModelVersions": {
@@ -1662,8 +1662,8 @@
"tooltip": "Detectado automáticamente a partir de los metadatos del modelo. Cámbialo si la detección fue incorrecta; cambiar desactiva «Usar ruta predeterminada» para esta descarga."
},
"routedByRule": {
"baseModel": "[TODO: Translate] Routed by rule: base model \"{value}\"",
"tag": "[TODO: Translate] Routed by rule: tag \"{value}\""
"baseModel": "Enrutado por regla: modelo base «{value}»",
"tag": "Enrutado por regla: etiqueta «{value}»"
},
"targetFolderPath": "Ruta de carpeta de destino:",
"browseFolders": "Explorar carpetas:",
+26 -26
View File
@@ -496,39 +496,39 @@
}
},
"downloadRootRules": {
"title": "[TODO: Translate] Download Root Rules",
"help": "[TODO: Translate] Route downloads to a different root folder based on the model's base model.",
"description": "[TODO: Translate] Rules are checked in order. First match wins; unmatched downloads use the default root.",
"defaultHint": "[TODO: Translate] Default: {root} — unmatched downloads go here",
"defaultSuffix": "[TODO: Translate] default",
"addBaseModelRule": "[TODO: Translate] Base model rule",
"addTagRule": "[TODO: Translate] Tag rule",
"removeRule": "[TODO: Translate] Remove rule",
"moveUp": "[TODO: Translate] Move up",
"moveDown": "[TODO: Translate] Move down",
"noRoots": "[TODO: Translate] No roots configured for this model type.",
"title": "Règles de racine de téléchargement",
"help": "Route les téléchargements vers un autre dossier racine en fonction du modèle de base ou des tags du modèle.",
"description": "Les règles sont vérifiées dans l’ordre. La première correspondance l’emporte ; les téléchargements sans correspondance utilisent la racine par défaut.",
"defaultHint": "Par défaut : {root} — les téléchargements sans correspondance arrivent ici",
"defaultSuffix": "par défaut",
"addBaseModelRule": "Règle de modèle de base",
"addTagRule": "Règle de tag",
"removeRule": "Supprimer la règle",
"moveUp": "Monter",
"moveDown": "Descendre",
"noRoots": "Aucune racine configurée pour ce type de modèle.",
"matchTypes": {
"baseModel": "[TODO: Translate] Base model",
"tag": "[TODO: Translate] Tag"
"baseModel": "Modèle de base",
"tag": "Tag"
},
"matchTypeChips": {
"baseModel": "[TODO: Translate] BM",
"tag": "[TODO: Translate] Tag"
"baseModel": "BM",
"tag": "Tag"
},
"tagPlaceholder": "[TODO: Translate] character, style, realistic",
"tagPlaceholder": "character, style, realistic",
"summary": {
"selectBaseModels": "[TODO: Translate] Select base models…",
"enterTags": "[TODO: Translate] Enter tags…",
"more": "[TODO: Translate] +{count} more"
"selectBaseModels": "Sélectionner des modèles de base...",
"enterTags": "Saisir des tags...",
"more": "+{count} de plus"
},
"types": {
"loras": "[TODO: Translate] LoRA",
"checkpoints": "[TODO: Translate] Checkpoint",
"unet": "[TODO: Translate] Diffusion Model",
"embeddings": "[TODO: Translate] Embedding"
"loras": "LoRA",
"checkpoints": "Checkpoint",
"unet": "Diffusion Model",
"embeddings": "Embedding"
},
"validation": {
"saveFailed": "[TODO: Translate] Unable to save download root rules: {message}"
"saveFailed": "Impossible d’enregistrer les règles de racine de téléchargement : {message}"
}
},
"skipPreviouslyDownloadedModelVersions": {
@@ -1662,8 +1662,8 @@
"tooltip": "Détecté automatiquement à partir des métadonnées du modèle. Changez si la détection est incorrecte ; changer désactive « Utiliser le chemin par défaut » pour ce téléchargement."
},
"routedByRule": {
"baseModel": "[TODO: Translate] Routed by rule: base model \"{value}\"",
"tag": "[TODO: Translate] Routed by rule: tag \"{value}\""
"baseModel": "Routé par règle : modèle de base « {value} »",
"tag": "Routé par règle : tag « {value} »"
},
"targetFolderPath": "Chemin du dossier cible :",
"browseFolders": "Parcourir les dossiers :",
+26 -26
View File
@@ -496,39 +496,39 @@
}
},
"downloadRootRules": {
"title": "[TODO: Translate] Download Root Rules",
"help": "[TODO: Translate] Route downloads to a different root folder based on the model's base model.",
"description": "[TODO: Translate] Rules are checked in order. First match wins; unmatched downloads use the default root.",
"defaultHint": "[TODO: Translate] Default: {root} — unmatched downloads go here",
"defaultSuffix": "[TODO: Translate] default",
"addBaseModelRule": "[TODO: Translate] Base model rule",
"addTagRule": "[TODO: Translate] Tag rule",
"removeRule": "[TODO: Translate] Remove rule",
"moveUp": "[TODO: Translate] Move up",
"moveDown": "[TODO: Translate] Move down",
"noRoots": "[TODO: Translate] No roots configured for this model type.",
"title": "כללי שורש להורדות",
"help": "מנתב הורדות לתיקיית שורש אחרת בהתאם למודל הבסיס או לתגיות של המודל.",
"description": "הכללים נבדקים לפי הסדר. ההתאמה הראשונה מנצחת; הורדות ללא התאמה משתמשות בשורש ברירת המחדל.",
"defaultHint": "ברירת מחדל: {root} — הורדות ללא התאמה מגיעות לכאן",
"defaultSuffix": "ברירת מחדל",
"addBaseModelRule": "כלל מודל בסיס",
"addTagRule": "כלל תגית",
"removeRule": "הסר כלל",
"moveUp": "הזז למעלה",
"moveDown": "הזז למטה",
"noRoots": "לא הוגדרו שורשים עבור סוג מודל זה.",
"matchTypes": {
"baseModel": "[TODO: Translate] Base model",
"tag": "[TODO: Translate] Tag"
"baseModel": "מודל בסיס",
"tag": "תגית"
},
"matchTypeChips": {
"baseModel": "[TODO: Translate] BM",
"tag": "[TODO: Translate] Tag"
"baseModel": "BM",
"tag": "תגית"
},
"tagPlaceholder": "[TODO: Translate] character, style, realistic",
"tagPlaceholder": "character, style, realistic",
"summary": {
"selectBaseModels": "[TODO: Translate] Select base models…",
"enterTags": "[TODO: Translate] Enter tags…",
"more": "[TODO: Translate] +{count} more"
"selectBaseModels": "בחר מודלי בסיס...",
"enterTags": "הזן תגיות...",
"more": "+{count} נוספים"
},
"types": {
"loras": "[TODO: Translate] LoRA",
"checkpoints": "[TODO: Translate] Checkpoint",
"unet": "[TODO: Translate] Diffusion Model",
"embeddings": "[TODO: Translate] Embedding"
"loras": "LoRA",
"checkpoints": "Checkpoint",
"unet": "Diffusion Model",
"embeddings": "Embedding"
},
"validation": {
"saveFailed": "[TODO: Translate] Unable to save download root rules: {message}"
"saveFailed": "לא ניתן לשמור את כללי השורש להורדות: {message}"
}
},
"skipPreviouslyDownloadedModelVersions": {
@@ -1662,8 +1662,8 @@
"tooltip": "זוהה אוטומטית ממטא-נתוני המודל. החלף אם הזיהוי שגוי; החלפה מכבה את «השתמש בנתיב ברירת מחדל» עבור הורדה זו."
},
"routedByRule": {
"baseModel": "[TODO: Translate] Routed by rule: base model \"{value}\"",
"tag": "[TODO: Translate] Routed by rule: tag \"{value}\""
"baseModel": "נותב לפי כלל: מודל בסיס «{value}»",
"tag": "נותב לפי כלל: תגית «{value}»"
},
"targetFolderPath": "נתיב תיקיית יעד:",
"browseFolders": "דפדף בתיקיות:",
+26 -26
View File
@@ -496,39 +496,39 @@
}
},
"downloadRootRules": {
"title": "[TODO: Translate] Download Root Rules",
"help": "[TODO: Translate] Route downloads to a different root folder based on the model's base model.",
"description": "[TODO: Translate] Rules are checked in order. First match wins; unmatched downloads use the default root.",
"defaultHint": "[TODO: Translate] Default: {root} — unmatched downloads go here",
"defaultSuffix": "[TODO: Translate] default",
"addBaseModelRule": "[TODO: Translate] Base model rule",
"addTagRule": "[TODO: Translate] Tag rule",
"removeRule": "[TODO: Translate] Remove rule",
"moveUp": "[TODO: Translate] Move up",
"moveDown": "[TODO: Translate] Move down",
"noRoots": "[TODO: Translate] No roots configured for this model type.",
"title": "ダウンロードルートのルール",
"help": "モデルのベースモデルまたはタグに基づいて、ダウンロードを別のルートフォルダに振り分けます。",
"description": "ルールは順番にチェックされます。最初に一致したルールが適用され、一致しないダウンロードはデフォルトルートを使用します。",
"defaultHint": "デフォルト:{root} — 一致しないダウンロードはここに保存されます",
"defaultSuffix": "デフォルト",
"addBaseModelRule": "ベースモデルルール",
"addTagRule": "タグルール",
"removeRule": "ルールを削除",
"moveUp": "上に移動",
"moveDown": "下に移動",
"noRoots": "このモデルタイプにはルートが設定されていません。",
"matchTypes": {
"baseModel": "[TODO: Translate] Base model",
"tag": "[TODO: Translate] Tag"
"baseModel": "ベースモデル",
"tag": "タグ"
},
"matchTypeChips": {
"baseModel": "[TODO: Translate] BM",
"tag": "[TODO: Translate] Tag"
"baseModel": "BM",
"tag": "タグ"
},
"tagPlaceholder": "[TODO: Translate] character, style, realistic",
"tagPlaceholder": "character, style, realistic",
"summary": {
"selectBaseModels": "[TODO: Translate] Select base models…",
"enterTags": "[TODO: Translate] Enter tags…",
"more": "[TODO: Translate] +{count} more"
"selectBaseModels": "ベースモデルを選択...",
"enterTags": "タグを入力...",
"more": "他 {count} 件"
},
"types": {
"loras": "[TODO: Translate] LoRA",
"checkpoints": "[TODO: Translate] Checkpoint",
"unet": "[TODO: Translate] Diffusion Model",
"embeddings": "[TODO: Translate] Embedding"
"loras": "LoRA",
"checkpoints": "Checkpoint",
"unet": "Diffusion Model",
"embeddings": "Embedding"
},
"validation": {
"saveFailed": "[TODO: Translate] Unable to save download root rules: {message}"
"saveFailed": "ダウンロードルートのルールを保存できませんでした:{message}"
}
},
"skipPreviouslyDownloadedModelVersions": {
@@ -1662,8 +1662,8 @@
"tooltip": "モデルのメタデータから自動検出されます。誤検出の場合は切り替えてください。切り替えると、このダウンロードでは「デフォルトパスを使用」がオフになります。"
},
"routedByRule": {
"baseModel": "[TODO: Translate] Routed by rule: base model \"{value}\"",
"tag": "[TODO: Translate] Routed by rule: tag \"{value}\""
"baseModel": "ルールで振り分け:ベースモデル「{value}」",
"tag": "ルールで振り分け:タグ「{value}」"
},
"targetFolderPath": "ターゲットフォルダパス:",
"browseFolders": "フォルダを参照:",
+26 -26
View File
@@ -496,39 +496,39 @@
}
},
"downloadRootRules": {
"title": "[TODO: Translate] Download Root Rules",
"help": "[TODO: Translate] Route downloads to a different root folder based on the model's base model.",
"description": "[TODO: Translate] Rules are checked in order. First match wins; unmatched downloads use the default root.",
"defaultHint": "[TODO: Translate] Default: {root} — unmatched downloads go here",
"defaultSuffix": "[TODO: Translate] default",
"addBaseModelRule": "[TODO: Translate] Base model rule",
"addTagRule": "[TODO: Translate] Tag rule",
"removeRule": "[TODO: Translate] Remove rule",
"moveUp": "[TODO: Translate] Move up",
"moveDown": "[TODO: Translate] Move down",
"noRoots": "[TODO: Translate] No roots configured for this model type.",
"title": "다운로드 루트 규칙",
"help": "모델의 베이스 모델 또는 태그에 따라 다운로드를 다른 루트 폴더로 라우팅합니다.",
"description": "규칙은 순서대로 확인됩니다. 첫 번째로 일치하는 규칙이 적용되며, 일치하지 않는 다운로드는 기본 루트를 사용합니다.",
"defaultHint": "기본값: {root} — 일치하지 않는 다운로드는 여기에 저장됩니다",
"defaultSuffix": "기본값",
"addBaseModelRule": "베이스 모델 규칙",
"addTagRule": "태그 규칙",
"removeRule": "규칙 제거",
"moveUp": "위로 이동",
"moveDown": "아래로 이동",
"noRoots": "이 모델 유형에 구성된 루트가 없습니다.",
"matchTypes": {
"baseModel": "[TODO: Translate] Base model",
"tag": "[TODO: Translate] Tag"
"baseModel": "베이스 모델",
"tag": "태그"
},
"matchTypeChips": {
"baseModel": "[TODO: Translate] BM",
"tag": "[TODO: Translate] Tag"
"baseModel": "BM",
"tag": "태그"
},
"tagPlaceholder": "[TODO: Translate] character, style, realistic",
"tagPlaceholder": "character, style, realistic",
"summary": {
"selectBaseModels": "[TODO: Translate] Select base models…",
"enterTags": "[TODO: Translate] Enter tags…",
"more": "[TODO: Translate] +{count} more"
"selectBaseModels": "베이스 모델 선택...",
"enterTags": "태그 입력...",
"more": "+{count}개 더"
},
"types": {
"loras": "[TODO: Translate] LoRA",
"checkpoints": "[TODO: Translate] Checkpoint",
"unet": "[TODO: Translate] Diffusion Model",
"embeddings": "[TODO: Translate] Embedding"
"loras": "LoRA",
"checkpoints": "Checkpoint",
"unet": "Diffusion Model",
"embeddings": "Embedding"
},
"validation": {
"saveFailed": "[TODO: Translate] Unable to save download root rules: {message}"
"saveFailed": "다운로드 루트 규칙을 저장할 수 없습니다: {message}"
}
},
"skipPreviouslyDownloadedModelVersions": {
@@ -1662,8 +1662,8 @@
"tooltip": "모델 메타데이터에서 자동으로 감지됩니다. 잘못 감지된 경우 전환하세요. 전환하면 이 다운로드에서 '기본 경로 사용'이 꺼집니다."
},
"routedByRule": {
"baseModel": "[TODO: Translate] Routed by rule: base model \"{value}\"",
"tag": "[TODO: Translate] Routed by rule: tag \"{value}\""
"baseModel": "규칙에 따라 라우팅됨: 베이스 모델 '{value}'",
"tag": "규칙에 따라 라우팅됨: 태그 '{value}'"
},
"targetFolderPath": "대상 폴더 경로:",
"browseFolders": "폴더 탐색:",
+26 -26
View File
@@ -496,39 +496,39 @@
}
},
"downloadRootRules": {
"title": "[TODO: Translate] Download Root Rules",
"help": "[TODO: Translate] Route downloads to a different root folder based on the model's base model.",
"description": "[TODO: Translate] Rules are checked in order. First match wins; unmatched downloads use the default root.",
"defaultHint": "[TODO: Translate] Default: {root} — unmatched downloads go here",
"defaultSuffix": "[TODO: Translate] default",
"addBaseModelRule": "[TODO: Translate] Base model rule",
"addTagRule": "[TODO: Translate] Tag rule",
"removeRule": "[TODO: Translate] Remove rule",
"moveUp": "[TODO: Translate] Move up",
"moveDown": "[TODO: Translate] Move down",
"noRoots": "[TODO: Translate] No roots configured for this model type.",
"title": "Правила корневых папок загрузки",
"help": "Направляет загрузки в другую корневую папку в зависимости от базовой модели или тегов модели.",
"description": "Правила проверяются по порядку. Срабатывает первое совпадение; загрузки без совпадения используют корневую папку по умолчанию.",
"defaultHint": "По умолчанию: {root} — загрузки без совпадения попадают сюда",
"defaultSuffix": "по умолчанию",
"addBaseModelRule": "Правило базовой модели",
"addTagRule": "Правило тега",
"removeRule": "Удалить правило",
"moveUp": "Вверх",
"moveDown": "Вниз",
"noRoots": "Для этого типа моделей не настроены корневые папки.",
"matchTypes": {
"baseModel": "[TODO: Translate] Base model",
"tag": "[TODO: Translate] Tag"
"baseModel": "Базовая модель",
"tag": "Тег"
},
"matchTypeChips": {
"baseModel": "[TODO: Translate] BM",
"tag": "[TODO: Translate] Tag"
"baseModel": "BM",
"tag": "Тег"
},
"tagPlaceholder": "[TODO: Translate] character, style, realistic",
"tagPlaceholder": "character, style, realistic",
"summary": {
"selectBaseModels": "[TODO: Translate] Select base models…",
"enterTags": "[TODO: Translate] Enter tags…",
"more": "[TODO: Translate] +{count} more"
"selectBaseModels": "Выберите базовые модели...",
"enterTags": "Введите теги...",
"more": "ещё {count}"
},
"types": {
"loras": "[TODO: Translate] LoRA",
"checkpoints": "[TODO: Translate] Checkpoint",
"unet": "[TODO: Translate] Diffusion Model",
"embeddings": "[TODO: Translate] Embedding"
"loras": "LoRA",
"checkpoints": "Checkpoint",
"unet": "Diffusion Model",
"embeddings": "Embedding"
},
"validation": {
"saveFailed": "[TODO: Translate] Unable to save download root rules: {message}"
"saveFailed": "Не удалось сохранить правила корневых папок загрузки: {message}"
}
},
"skipPreviouslyDownloadedModelVersions": {
@@ -1662,8 +1662,8 @@
"tooltip": "Определяется автоматически из метаданных модели. Переключите, если определение неверно; переключение отключает «Использовать путь по умолчанию» для этой загрузки."
},
"routedByRule": {
"baseModel": "[TODO: Translate] Routed by rule: base model \"{value}\"",
"tag": "[TODO: Translate] Routed by rule: tag \"{value}\""
"baseModel": "Маршрут по правилу: базовая модель «{value}»",
"tag": "Маршрут по правилу: тег «{value}»"
},
"targetFolderPath": "Путь к целевой папке:",
"browseFolders": "Обзор папок:",
+26 -26
View File
@@ -496,39 +496,39 @@
}
},
"downloadRootRules": {
"title": "[TODO: Translate] Download Root Rules",
"help": "[TODO: Translate] Route downloads to a different root folder based on the model's base model.",
"description": "[TODO: Translate] Rules are checked in order. First match wins; unmatched downloads use the default root.",
"defaultHint": "[TODO: Translate] Default: {root} — unmatched downloads go here",
"defaultSuffix": "[TODO: Translate] default",
"addBaseModelRule": "[TODO: Translate] Base model rule",
"addTagRule": "[TODO: Translate] Tag rule",
"removeRule": "[TODO: Translate] Remove rule",
"moveUp": "[TODO: Translate] Move up",
"moveDown": "[TODO: Translate] Move down",
"noRoots": "[TODO: Translate] No roots configured for this model type.",
"title": "下载根目录规则",
"help": "根据模型的基础模型或标签,将下载路由到其他根目录。",
"description": "规则按顺序检查,首个命中的规则生效;未匹配的下载使用默认根目录。",
"defaultHint": "默认:{root} — 未匹配的下载将保存到这里",
"defaultSuffix": "默认",
"addBaseModelRule": "基础模型规则",
"addTagRule": "标签规则",
"removeRule": "移除规则",
"moveUp": "上移",
"moveDown": "下移",
"noRoots": "此模型类型尚未配置根目录。",
"matchTypes": {
"baseModel": "[TODO: Translate] Base model",
"tag": "[TODO: Translate] Tag"
"baseModel": "基础模型",
"tag": "标签"
},
"matchTypeChips": {
"baseModel": "[TODO: Translate] BM",
"tag": "[TODO: Translate] Tag"
"baseModel": "BM",
"tag": "标签"
},
"tagPlaceholder": "[TODO: Translate] character, style, realistic",
"tagPlaceholder": "character, style, realistic",
"summary": {
"selectBaseModels": "[TODO: Translate] Select base models…",
"enterTags": "[TODO: Translate] Enter tags…",
"more": "[TODO: Translate] +{count} more"
"selectBaseModels": "选择基础模型...",
"enterTags": "输入标签...",
"more": "还有 {count} 项"
},
"types": {
"loras": "[TODO: Translate] LoRA",
"checkpoints": "[TODO: Translate] Checkpoint",
"unet": "[TODO: Translate] Diffusion Model",
"embeddings": "[TODO: Translate] Embedding"
"loras": "LoRA",
"checkpoints": "Checkpoint",
"unet": "Diffusion Model",
"embeddings": "Embedding"
},
"validation": {
"saveFailed": "[TODO: Translate] Unable to save download root rules: {message}"
"saveFailed": "无法保存下载根目录规则:{message}"
}
},
"skipPreviouslyDownloadedModelVersions": {
@@ -1662,8 +1662,8 @@
"tooltip": "根据模型元数据自动检测。如果检测结果有误,请切换;切换会为本次下载关闭“使用默认路径”。"
},
"routedByRule": {
"baseModel": "[TODO: Translate] Routed by rule: base model \"{value}\"",
"tag": "[TODO: Translate] Routed by rule: tag \"{value}\""
"baseModel": "已由规则路由:基础模型“{value}”",
"tag": "已由规则路由:标签“{value}”"
},
"targetFolderPath": "目标文件夹路径:",
"browseFolders": "浏览文件夹:",
+26 -26
View File
@@ -496,39 +496,39 @@
}
},
"downloadRootRules": {
"title": "[TODO: Translate] Download Root Rules",
"help": "[TODO: Translate] Route downloads to a different root folder based on the model's base model.",
"description": "[TODO: Translate] Rules are checked in order. First match wins; unmatched downloads use the default root.",
"defaultHint": "[TODO: Translate] Default: {root} — unmatched downloads go here",
"defaultSuffix": "[TODO: Translate] default",
"addBaseModelRule": "[TODO: Translate] Base model rule",
"addTagRule": "[TODO: Translate] Tag rule",
"removeRule": "[TODO: Translate] Remove rule",
"moveUp": "[TODO: Translate] Move up",
"moveDown": "[TODO: Translate] Move down",
"noRoots": "[TODO: Translate] No roots configured for this model type.",
"title": "下載根目錄規則",
"help": "根據模型的基礎模型或標籤,將下載路由到其他根目錄。",
"description": "規則依序檢查,首個命中的規則生效;未匹配的下載使用預設根目錄。",
"defaultHint": "預設:{root} — 未匹配的下載將儲存到這裡",
"defaultSuffix": "預設",
"addBaseModelRule": "基礎模型規則",
"addTagRule": "標籤規則",
"removeRule": "移除規則",
"moveUp": "上移",
"moveDown": "下移",
"noRoots": "此模型類型尚未設定根目錄。",
"matchTypes": {
"baseModel": "[TODO: Translate] Base model",
"tag": "[TODO: Translate] Tag"
"baseModel": "基礎模型",
"tag": "標籤"
},
"matchTypeChips": {
"baseModel": "[TODO: Translate] BM",
"tag": "[TODO: Translate] Tag"
"baseModel": "BM",
"tag": "標籤"
},
"tagPlaceholder": "[TODO: Translate] character, style, realistic",
"tagPlaceholder": "character, style, realistic",
"summary": {
"selectBaseModels": "[TODO: Translate] Select base models…",
"enterTags": "[TODO: Translate] Enter tags…",
"more": "[TODO: Translate] +{count} more"
"selectBaseModels": "選擇基礎模型...",
"enterTags": "輸入標籤...",
"more": "還有 {count} 項"
},
"types": {
"loras": "[TODO: Translate] LoRA",
"checkpoints": "[TODO: Translate] Checkpoint",
"unet": "[TODO: Translate] Diffusion Model",
"embeddings": "[TODO: Translate] Embedding"
"loras": "LoRA",
"checkpoints": "Checkpoint",
"unet": "Diffusion Model",
"embeddings": "Embedding"
},
"validation": {
"saveFailed": "[TODO: Translate] Unable to save download root rules: {message}"
"saveFailed": "無法儲存下載根目錄規則:{message}"
}
},
"skipPreviouslyDownloadedModelVersions": {
@@ -1662,8 +1662,8 @@
"tooltip": "根據模型中繼資料自動偵測。如果偵測結果有誤,請切換;切換會為本次下載關閉「使用預設路徑」。"
},
"routedByRule": {
"baseModel": "[TODO: Translate] Routed by rule: base model \"{value}\"",
"tag": "[TODO: Translate] Routed by rule: tag \"{value}\""
"baseModel": "已由規則路由:基礎模型「{value}」",
"tag": "已由規則路由:標籤「{value}」"
},
"targetFolderPath": "目標資料夾路徑:",
"browseFolders": "瀏覽資料夾:",
+2 -2
View File
@@ -4823,8 +4823,8 @@ export class SettingsManager {
if (!match.length) {
// Only drafts can be empty; persisted rules always have matches.
summaryEl.textContent = rule?.match_type === 'tag'
? translate('settings.downloadRootRules.summary.enterTags', {}, 'Enter tags…')
: translate('settings.downloadRootRules.summary.selectBaseModels', {}, 'Select base models…');
? translate('settings.downloadRootRules.summary.enterTags', {}, 'Enter tags...')
: translate('settings.downloadRootRules.summary.selectBaseModels', {}, 'Select base models...');
return;
}
if (match.length <= 2) {
@@ -719,12 +719,12 @@ describe('SettingsManager download root rules row layout', () => {
manager.addDownloadRootRule('loras', 'base_model');
expect(groupRows('loras')[0].querySelector('.download-root-rule-summary').textContent)
.toBe('Select base models…');
.toBe('Select base models...');
manager.removeDownloadRootRule('loras', 0, true);
manager.addDownloadRootRule('loras', 'tag');
expect(groupRows('loras')[0].querySelector('.download-root-rule-summary').textContent)
.toBe('Enter tags…');
.toBe('Enter tags...');
});
it('summarizes more than two matches as first two plus a count', () => {