Compare commits

..

12 Commits

Author SHA1 Message Date
Will Miao fc9088bfd6 feat(recipes): restore Copy Recipe Syntax button in recipe modal header
- Add an icon-only copy button next to Send to ComfyUI in the header
  actions row, styled as a textless variant of the neighboring pill
  buttons
- Restore fetchAndCopyRecipeSyntax() wiring against the existing
  /api/lm/recipe/{id}/syntax endpoint (context menu action unaffected)
- Add recipes.actions.copyRecipeSyntax i18n key, reusing the existing
  per-locale translations of the identical context menu string
- Sync modal test fixtures and add copySyntax tests
2026-08-29 17:05:31 +08:00
Will Miao 675421ea84 fix(recipes): render reconnect form for hash-invalid LoRAs in recipe modal
The Reconnect action button was rendered for both deleted and hash-invalid
(Unresolvable Hash) LoRA entries, but the .lora-reconnect-container input
form was only rendered for deleted ones. Clicking Reconnect on a
hash-invalid item silently did nothing because showReconnectInput() could
not find the container. Align the container render condition with the
button condition, and extend the resource-items test to assert the form
opens on click.
2026-08-29 16:49:50 +08:00
Will Miao 2ff98ae089 docs(i18n): defer non-en translations until UI wording is final
[TODO: Translate] placeholders are now the sanctioned intermediate state
during feature development; translate all pending keys in one pass only
when the feature owner asks. R8 notes the exemption so placeholders are
not 'fixed' prematurely.
2026-08-29 16:41:53 +08:00
Will Miao c972c755fc fix(recipes): distinguish unobtainable LoRAs in recipe status and skip them in syntax
The recipe card pill counted LoRAs deleted from the source (isDeleted) as
available, showing a green 'ready 2/2' for recipes that cannot be fully
reproduced. LoRAs with an unresolvable hash (hashInvalid) were counted as
missing/downloadable even though downloads always fail, and recipe syntax
generation emitted broken tokens for them.

- Four-state status on RecipeCard pill and RecipeTab badge: ready (all in
  library), missing (downloadable, red, keeps the action cue), partial
  (unobtainable entries skipped when used, amber, fa-circle-minus),
  unavailable (nothing usable, gray, fa-ban)
- Pill numerator is now the real in-library count; tooltips spell out
  missing vs unavailable (deleted from source or unresolvable hash)
- get_recipe_syntax_tokens skips hashInvalid entries like deleted ones
  instead of emitting tokens pointing at nonexistent files
- Bulk missing-download manager and recipe context menu exclude
  hashInvalid LoRAs, matching the modal's per-item download block
- New locale keys loraStatus.missingAndUnavailable/partial/noneUsable,
  translated for all 9 non-en locales
2026-08-29 16:41:48 +08:00
Will Miao ebe3df7d22 docs(i18n): mark guidelines as the post-sweep target state; translate de playlist title
§3/§5/§6 now describe the resolved state (regression watch-list instead of a
to-do list), §4 documents the single intentional placeholder deviation
(mappingsUpdated drops {plural} where '<noun>s' cannot be appended). de
help.updateVlogs.playlistTitle translated.
2026-08-29 12:49:38 +08:00
Will Miao be44a75b74 fix(i18n): punctuation polish — ASCII colons/parens, '...' ellipsis, fr apostrophe
- fullwidth ':{message}/{error}' in fr/de/es/ru/he toasts -> ASCII
  (fr keeps the spaced ' : ' convention)
- fullwidth parens in bulk skip/resume count labels -> ASCII
- ru modals.download.selectHfFiles trailing fullwidth colon -> ASCII
- '…' -> '...' in all 9 locales (project style)
- fr header.filter.allowSellingGeneratedContentTooltip: d"images -> d'images
2026-08-29 12:48:05 +08:00
Will Miao fd1227d3b8 fix(i18n): translate banners, license labels, doctor UI and remaining leftovers
- banners.communitySupport.* (title/content/CTA/learnMore): 8 locales (zh-CN done)
- modals.model.license.noImageSell/noRentCivit/noRent/noSell: all 9 locales
- globalContextMenu.fetchMissingLicenses.*: 7 locales
- doctor.* issue titles, action labels, conflicts/version labels + es title
- toasts/settings: libraryLoadFailed/libraryActivateFailed, moveFailed,
  restartRequired, recipeSaved across locales; fr recipes storage path strings;
  zh-CN import lora count; ru/ko Recipe Manager init title
- checkpoints.modelTypes.diffusion_model translated in 7 locales (ja/ko keep
  the English loanword, consistent with their model-type names)
2026-08-29 12:47:17 +08:00
Will Miao 3a9e02137d fix(i18n): translate the batch-import UI for fr/de/es/ru/he/ja/ko
The whole recipes.batchImport section (~54 keys) and the
toast.recipes.batchImport* toasts (~8 keys) were byte-identical to en.json.
Translated using the normalized terminology (Recipe/Rezept/receta/рецепт/
מתכון/レシピ/레시피, bulk names: groupé/Massenimport/por lotes/пакетный/
בכמות גדולה/一括/일괄). URL/path placeholders stay as-is; identical words
(French 'Total', 'images') are legitimately unchanged.
2026-08-29 12:45:04 +08:00
Will Miao d8a2be8edc fix(i18n): normalize terminology and register across all locales
One term = one rendering per language; the mandatory fixes (see
docs/i18n-translation-guidelines.md §2/§5):
- fr: recette(s) -> Recipe(s) per glossary decision; checkpoint literal
  'Point de contrôle'/'hachage'/'étiquettes'/'dupliquées'/'mode lot' unified
- de: leftover English 'Recipe' -> Rezept; Basis-Modell -> Basismodell;
  Modelldaten -> Metadaten; bulk action label; du -> Sie (formal)
- es: 'Punto(s) de control' -> Checkpoint(s); flujo de trabajo -> workflow;
  palabras clave -> palabras de activación; preset -> preajuste; bulk -> por lotes
- ru: Контрольные точки/Чекпойнт -> Checkpoint; Эмбеддинг -> Embedding;
  запрос -> промпт (prompt sense only); рабочий процесс -> workflow; хэш -> хеш;
  безпотерьного typo
- he: נקודות ביקורת -> Checkpoint(s) (was literal road checkpoint); הטמעות ->
  Embedding; האש/גיבוב -> hash (האש reads as 'the fire'); הנחיה -> פרומפט;
  מטא-דאטה -> מטא-נתונים; דגם -> מודל; bulk feature name unified
- ja: チェックポイント/checkpoint -> Checkpoint; バルクモード -> 一括モード;
  recipe counter 個 -> 件; leftover English Recipe Manager translated
- ko: 체크포인트 -> Checkpoint; 임베딩 -> Embedding; 기본 모델 -> 베이스 모델;
  워크플로우 -> 워크플로; 벌크 모드 -> 일괄 모드; Checkpoint을 -> Checkpoint를
- zh-CN: 食谱 -> 配方; 检查点 -> Checkpoint; 基模型 -> 基础模型; 您 -> 你
- zh-TW: 食譜 -> 配方; 檢查點 -> Checkpoint; 你 -> 您 (18 keys)
2026-08-29 12:42:32 +08:00
Will Miao 1c46b2e8c3 fix(i18n): normalize CivitAI brand casing and civitai.red URL placeholders
- en.json: 49 values used 'Civitai' (lowercase 'ai'); normalize to the
  official 'CivitAI' casing and mirror in all 9 locales (key names like
  relinkCivitai/civitaiApiKey intentionally untouched)
- modals.relinkCivitai.helpText.format4: fix 'CivitArchive' typo -> 'CivArchive'
  in all locales (mirrored from en.json)
- recipes.controls.import.urlPlaceholder / modals.relinkCivitai.urlPlaceholder:
  restore the dropped 'https://civitai.red/...' alternative in 8 locales
  (zh-CN already had it)
2026-08-29 12:37:30 +08:00
Will Miao 3c3ac49f2f fix(i18n): correct stale help texts, inverted ko tag logic and placeholder contracts
- viewLocalTooltip: all 9 locales said 'coming soon'; describe the actual
  action (show local versions on main page)
- settings.downloadSkipBaseModels.help / hideEarlyAccessUpdates.help /
  aiProvider.apiBaseHelp: retranslate all locales to the current en wording
  (previous translations described an older source string)
- ko header.filter.tagLogicAny: 'all tags match' was inverted and identical
  to tagLogicAll; fix zh-TW typo 票籤 -> 標籤
- modals.checkUpdates.title/message: restore {typePlural} in zh-CN/zh-TW/ja/ko
- zh-CN recipes.controls.import.downloadLocationPreview: drop invented {path}
  (caller passes no params; it rendered literally)
- zh-TW toast.controls.refreshFailed: restore {action} placeholder
- toast.settings.mappingsUpdated: drop English-inflection {plural} where '<noun>s'
  would corrupt the noun (zh-CN/zh-TW/ja/ko/de/ru/he); caller passes hardcoded 's'
2026-08-29 12:36:18 +08:00
Will Miao 1a1be95a64 docs(i18n): add translation guidelines with per-locale term conventions
Audit of all 10 locale files found recipe/checkpoint mistranslations,
inverted ko tag logic, stale help texts, placeholder contract deviations,
and untranslated feature blocks. Document the conventions (R1-R9), per-
language term maps, confusion hot-spots, and the translation workflow so
future agents and translators follow the established decisions (e.g. keep
'Recipe' untranslated in French, use 配方 in Chinese).
2026-08-29 12:16:52 +08:00
27 changed files with 2451 additions and 1632 deletions
+5
View File
@@ -72,6 +72,11 @@ python scripts/sync_translation_keys.py
Locale files are in `locales/` (en, zh-CN, zh-TW, ja, ko, fr, de, es, ru, he).
**Before translating anything, read `docs/i18n-translation-guidelines.md`** — it defines the
term conventions (e.g. "Recipe" stays untranslated in French, 配方 in Chinese; model-type and
brand names are never translated), per-locale preferred renderings, placeholder rules, and
the known confusion hot-spots.
## Code Style
### Python
+368
View File
@@ -0,0 +1,368 @@
# i18n Translation Guidelines
This document is the canonical set of conventions for translating LoRA Manager UI strings.
It applies to **human translators and AI agents** alike. Read it before editing anything in
`locales/`.
Source of truth: `locales/en.json` (10 locales, 1810 leaf keys; all locales share the exact
same key structure).
Locales: `en`, `zh-CN`, `zh-TW`, `ja`, `ko`, `fr`, `de`, `es`, `ru`, `he` (RTL).
> **Status (2026-08 sweep):** a full audit was executed and the terminology, placeholder,
> stale-text, and untranslated-block fixes described in §2–§6 were applied across all locales
> (commits `3c3ac49f` … `fd1227d3`). The tables below are now the **normative target state**,
> not a to-do list — future edits should preserve these renderings and only add what is new.
---
## 1. Hard rules (do not violate)
### R1 — Key structure is sacred
- Only `locales/en.json` may add/remove/rename keys. All other locales must keep the exact
same nested key set. `tests/i18n/test_i18n.py` enforces this.
- When a new UI string is added to `en.json`, run
`python scripts/sync_translation_keys.py` (adds the missing keys to all locales with
placeholder copies), then translate the newly added keys in every locale.
- Never reorder, re-indent, or reformat a locale file "for tidiness". The sync script
preserves formatting; manual reformatting creates noisy diffs.
### R2 — Placeholders and HTML must be preserved verbatim
- `{name}`-style placeholders must appear in the translation exactly as in `en.json`.
Do not invent placeholders the source string does not have — the caller may not pass them
(example bug: `zh-CN recipes.controls.import.downloadLocationPreview` added `{path}`; the
template renders this key with no parameters, so the literal text `{path}` shows in the UI).
- `{{...}}` in a locale value is an escaped literal brace — keep it identical.
- Keep embedded HTML tags (e.g. `<strong>...</strong>`, `<code>...</code>`) intact.
You may move the tag around the sentence if the target language needs different word order.
### R3 — Never translate or transliterate these
- Model types: **LoRA, Checkpoint, Embedding, Diffusion Model**
- Products/brands: **LoRA Manager, ComfyUI, CivitAI, CivArchive, HuggingFace, Ko-fi**
- Ecosystem names: **LyCORIS, DoRA**, trigger-adjacent jargon **Prompt, Workflow**
(these are used as-is in the target-language SD community; see §2 per-language policy)
- Theme names: **Nord, Midnight, Monokai, Dracula, Solarized**
### R4 — The "Recipe" convention (the most important domain term)
Product intent: a *Recipe* records a **LoRA combination + generation parameters**
(prompt, seed, sampler, …) that reproduces an image style. The metaphor is a **cooking
recipe** — "follow it and you get a similar dish". It is **not** a menu, not a dish list,
not a prescription.
Decision per language — translate only into a word whose everyday primary meaning is a
cooking recipe; where that word would mislead users, **keep the English "Recipe(s)"**:
| Locale | Use | Never use |
|---|---|---|
| fr | **Recipe / Recipes** (keep English) | recette(s) — cooking reading is secondary and it was explicitly judged misleading |
| zh-CN / zh-TW | 配方 | 食谱 (reads as "food cookbook") |
| ja | レシピ | — (leftover English "Recipe" in `initialization.recipes.title` / `toast.recipes.recipeSaved` → translate) |
| ko | 레시피 | — |
| de | Rezept / Rezepte | — (cooking meaning dominant; prescription reading acceptable) |
| es | receta / recetas | — (cooking meaning dominant) |
| ru | рецепт / рецепты | — (leftover English "Recipe" in `initialization.recipes.title` / `toast.recipes.recipeSaved` → translate) |
| he | מתכון / מתכונים | — (cooking meaning dominant) |
Whatever the choice, **one concept = one noun within a locale**. Currently violated in:
- `fr` — "Recipe" (~97 keys, incl. nav) mixed with "recette" (~58 keys)
- `zh-CN` / `zh-TW` — 配方 (126/122 keys) mixed with 食谱 / 食譜 (14/17 keys, all in the
*rematch* flow: `globalContextMenu.rematchRecipes.*`, `toast.recipes.rematch*`)
- `de` — "Rezept" (136 keys) mixed with leftover English "Recipe" (5 keys)
- `ja` / `ru` — leftover English "Recipe" in `initialization.recipes.title` ("Recipe Manager
zu initialisieren" / «Инициализация Recipe Manager») and `toast.recipes.recipeSaved`
### R5 — One term, one rendering (within each locale)
Same source word must not be translated several ways in one file. Known offender areas
(see §5 for the full fix list): recipe, Checkpoint, Embedding, prompt, base model, preset,
workflow, hash, metadata, tags, bulk. Every locale currently mixes variants of at least one
of these — pick the preferred form in the §2 tables and normalize.
### R6 — Register consistency
- `zh-CN` / `zh-TW`: pick 你 or 您 once. Do not mix (zh-CN has 44×你 + 5×您; zh-TW has
27×您 + 18×你).
- `de`: pick "du" or "Sie" once (currently 143×Sie + ~7×du).
- `es`: pick "tú" or "usted" once.
### R7 — Punctuation per script
- Full-width punctuation `:()` is correct **only in CJK locales** (zh-CN, zh-TW, ja, ko).
- Latin/Cyrillic/Hebrew locales must use ASCII `: ()` — full-width colons leaked in there
are machine-translation artifacts. Known: `fr toast.recipes.createError/createFailed`,
`es toast.recipes.createError/createFailed` (e.g. "…de la receta" should be "…de la receta:").
- `fr` apostrophes must be U+2019 `'` / ASCII `'`, never a straight double quote:
`fr header.filter.allowSellingGeneratedContentTooltip` currently reads
`vendre d"images` → fix to `d'images`. Do not mix `'` and `'` in one file (fr has 299 vs 15).
- Ellipsis: use ASCII `...` (project style). Don't introduce `…`.
- Keep the sentence-ending period/omission consistent with the source string where the
language allows it.
- `he` is RTL: mix of Hebrew and Latin scripts is normal; keep Latin term ordering natural.
### R8 — No untranslated English leftovers
Full sentences left byte-identical to `en.json` are bugs (brand names and URL placeholders
are the exception). Every locale has them; see §6 for the per-locale checklist.
`[TODO: Translate]` placeholders are the sanctioned intermediate state during feature
development (see §7) — do not "fix" them unless the feature owner asked for translations.
### R9 — Mirror the source even when the source is wrong
If `en.json` itself contains an inconsistency (e.g. the `Civitai` vs `CivitAI` casing split,
or the `CivitArchive` typo in `modals.relinkCivitai.helpText.format4`), translate/transcribe
it as-is in your locale and instead **fix the source** in `en.json` (then propagate by
re-syncing and re-translating affected keys). Do not silently diverge in one locale only.
---
## 2. Per-language term maps
Preferred rendering per term. "Fix" means the locale currently contains the wrong variant
and must be normalized. `en` = keep the English word as-is.
### fr
| Term | Use | Fix |
|---|---|---|
| recipe | Recipe(s) | Replace all "recette(s)" (58 keys, e.g. `recipes.actions.deleteRecipeWithShortcut`, `toast.recipes.rematchComplete`) with "Recipe(s)" |
| Checkpoint | Checkpoint | `statistics.modelTypes.checkpoint` = "Point de contrôle" → "Checkpoint" |
| trigger words | mot(s)-clé(s) | unify: `modals.model.triggerWords.editWord` uses "mot déclencheur" — pick one |
| prompt / negative prompt | Prompt / prompt négatif | — |
| base model | modèle(s) de base | — |
| preset | préréglage | unify: `modals.model.usageTips.addPresetParameter` "prédéfini", `toast.presets.restored` "par défaut" |
| hash | hash | `conflictConfirm.message` "hachage" → "hash" |
| tags | tags | `settings.sections.priorityTags` "Étiquettes" → "Tags" |
| metadata | métadonnées | `loras.controls.refresh.fullTooltip` keeps English "metadata" |
| duplicates | doublon(s) | unify with "dupliqué(e)s" |
| bulk | groupé(e) | unify with "par lot / mode lot" variants |
### de
| Term | Use | Fix |
|---|---|---|
| recipe | Rezept/Rezepte | 5 leftover English "Recipe" keys → Rezept (e.g. `globalContextMenu.repairRecipes.label`, `toast.recipes.recipeSaved`) |
| base model | pick Basis-Modell or Basismodell | currently 27× hyphenated vs 15× closed |
| metadata | Metadaten | 4 keys use "Modelldaten" (`onboarding.steps.fetch.title/content`) → Metadaten |
| bulk | pick Massen- or Sammelmodus | `loras.controls.bulk.action` = "Massen" reads as "crowds" — use "Massenbearbeitung"/"Mehrfachauswahl" |
| register | Sie (formal) | 7 keys use "du/dein" (`settings.backup.managementHelp`, `modals.checkUpdates.message/tip`, `doctor.footer`, …) |
### es
| Term | Use | Fix |
|---|---|---|
| recipe | receta(s) | — |
| Checkpoint | Checkpoint | 5 statistics keys "Punto(s) de control" → "Checkpoints" (`statistics.metrics.checkpoints`, `statistics.insights.unusedCheckpoints.*`, `statistics.modelTypes.checkpoint`) |
| trigger words | palabra(s) de activación | 2 keys already use it; ~15 keys "palabra(s) clave" (reads as search keyword) → unify |
| base model | modelo base | — |
| preset | preajuste | 3 keys keep English "preset", 1 "preestablecido" → preajuste |
| workflow | pick flujo de trabajo or workflow | currently 21× "flujo de trabajo" vs 10× "workflow" |
| bulk | masivo / por lotes | unify; "Batch Import" → traducción |
| tags | etiquetas | — |
### ru
| Term | Use | Fix |
|---|---|---|
| recipe | рецепт(ы) | English leftovers: `initialization.recipes.title`, `recipes.batchImport.*`, `toast.recipes.recipeSaved` → translate |
| Checkpoint | Checkpoint (recommended) | 3 variants today: "Checkpoint" (17 keys), «Чекпойнт», «Контрольная точка» (statistics, 6 keys) — statistics MUST drop «Контрольная точка» |
| Embedding | Embedding | «Эмбеддинг» variant exists in `settings.priorityTags.modelTypes.embedding` — unify |
| prompt | промпт | 8 keys use «запрос» (reads as "database/HTTP request") → «промпт» |
| base model | базовая модель | — |
| preset | пресет | `header.theme.presets` "Предустановки" → пресеты |
| workflow | Workflow (recommended) | «рабочий процесс» used in 4 keys — unify |
| hash | pick хеш or хэш | both spellings co-occur |
| tag(s) | тег(и) | — |
| typos | — | `settings.misc.loraSyntaxFormatHelp`: «безпотерьного» → «беспотерьного» |
### he
| Term | Use | Fix |
|---|---|---|
| recipe | מתכון / מתכונים | — |
| Checkpoint | Checkpoint | 5 statistics keys «נקודת/נקודות ביקורת» (road/security checkpoint) → "Checkpoint(s)" (`statistics.metrics.checkpoints`, `statistics.modelTypes.checkpoint`, `statistics.insights.unusedCheckpoints.*`) |
| Embedding | Embedding | `statistics` keys use הטמעות → Embedding |
| prompt | pick הנחיה or פרומפט | 9 keys הנחיה vs 3 פרומפט — unify (recommend פרומפט, SD-community loanword) |
| preset | קביעה מראש | `header.filter.presetOverwriteConfirm` uses פריסט → unify |
| hash | pick one of האש / גיבוב / hash | 3 variants co-occur — unify (recommend hash or גיבוב) |
| metadata | pick מטא-דאטה or מטא-נתונים | 38 vs 17 keys — unify |
| model | מודל | 13 keys use דגם/דגמים — unify |
| bulk | pick one of 5 variants | 5 different renderings ("כמות גדולה", "המוני", "קבוצתי", "אצווה", …) — unify; `loras.controls.bulk.action` "כמות גדולה" reads as "large quantity" |
### ja
| Term | Use | Fix |
|---|---|---|
| recipe | レシピ | `initialization.recipes.title` keeps English "Recipe Manager" — translate to レシピマネージャー |
| Checkpoint | Checkpoint or チェックポイント (pick one) | 3 variants: Checkpoint (~14), checkpoint lowercase (4), チェックポイント (4, e.g. `settings.priorityTags.modelTypes.checkpoint`) |
| Embedding | Embedding | 4 keys lowercase "embedding" mid-sentence |
| bulk | 一括 | `modals.checkUpdates.tip` "バルクモード" → 一括モード |
| recipe counter | 件 or 個 | `repairRecipes.success` uses 件, `.cancelled` uses 個 — unify |
### ko
| Term | Use | Fix |
|---|---|---|
| recipe | 레시피 | — |
| Checkpoint | Checkpoint (recommended) | 4 keys transliterate 체크포인트 (`settings.priorityTags.modelTypes.checkpoint`, `toast.recipes.missingCheckpointPath/missingCheckpointInfo/downloadCheckpointFailed`) |
| Embedding | Embedding | 3 keys 임베딩 (`settings.priorityTags.modelTypes.embedding`, `uiHelpers.nodeSelector.embedding`) |
| base model | 베이스 모델 | 6 keys «기본 모델» read as "default model" → 베이스 모델 (`settings.downloadSkipBaseModels.*`, `toast.loras.downloadSkippedByBaseModel`) |
| workflow | pick 워크플로 or 워크플로우 | 26 vs 6 keys — unify |
| bulk | 일괄 | `modals.checkUpdates.tip` "벌크 모드" → 일괄 모드 |
| tag logic | — | `header.filter.tagLogicAny` = "모든 태그 일치 (OR)" is **inverted** (should be "하나 이상의 태그 일치") and identical to `tagLogicAll` |
| particle | — | `modelCard.sendToWorkflow.checkpointNotImplemented`: "Checkpoint을" → "Checkpoint를" |
### zh-CN / zh-TW
| Term | zh-CN | zh-TW |
|---|---|---|
| recipe | 配方 (fix 食谱 → 配方, 14 keys in rematch flow) | 配方 (fix 食譜 → 配方, 17 keys in rematch flow) |
| Checkpoint | Checkpoint (fix 检查点 → Checkpoint, 5 keys: `toast.recipes.missingCheckpointPath/missingCheckpointInfo/downloadCheckpointFailed`, `modelCard.actions.checkpointNameCopied`, `modelCard.sendToWorkflow.checkpointNotImplemented`) | Checkpoint (fix 檢查點 → Checkpoint, 4 keys: `modelCard.actions.copyCheckpointName`, `toast.recipes.missing*`×2, `toast.recipes.downloadCheckpointFailed`) |
| base model | 基础模型 (fix 基模型 → 基础模型, 3 keys in `modals.model.versions.filters.*`) | 基礎模型 ✓ consistent |
| prompt | 提示词 ✓ | 提示詞 ✓ |
| preset | 预设 ✓ | 預設 ✓ |
| workflow | 工作流 ✓ | 工作流 ✓ |
| trigger words | 触发词 ✓ | 觸發詞 ✓ |
| hash | 哈希 (哈希值 variant OK) | 雜湊 ✓ |
| register | 你 (fix 5×您 → 你) | 您 (fix 18×你 → 您) |
---
## 3. Cross-cutting confusion hot-spots (must-fix list)
All items below were **resolved** in the 2026-08 sweep — treat them as a regression
watch-list: do not reintroduce these renderings.
1. **Checkpoint rendered as a literal security/road checkpoint** — fr, es, ru, he, zh-CN,
zh-TW all had 46 keys in the `statistics.*` domain reading as "control point"; reverted
to "Checkpoint".
2. **"recipe" variants that break the one-noun rule** — fr "recette" → "Recipe", zh
食谱/食譜 → 配方, de/ja/ru leftover English "Recipe" translated.
3. **ko `header.filter.tagLogicAny`** — was inverted ("모든 태그 일치 (OR)") and identical
to `tagLogicAll`; now "어느 하나의 태그와 일치 (OR)".
4. **ja `modals.model.versions.actions.viewLocalTooltip`** — was the stale "近日対応予定"
("coming soon"); all 9 locales now describe the actual action.
5. **Stale help texts**`settings.downloadSkipBaseModels.help`,
`settings.aiProvider.apiBaseHelp`, `settings.hideEarlyAccessUpdates.help` retranslated
in all locales to the current `en.json` wording.
6. **en.json source bugs** (fixed in source, then mirrored):
- "Civitai" → "CivitAI" brand casing (values only; key names `relinkCivitai` etc. keep
their lowercase form and must not be renamed)
- `modals.relinkCivitai.helpText.format4` "CivitArchive" typo → "CivArchive"
- `zh-CN recipes.controls.import.downloadLocationPreview` invented `{path}` removed
---
## 4. Placeholder contract deviations (current)
`{...}` token sets must match `en.json` per key. All deviations found in the 2026-08 sweep
were fixed, with one *intentional* exception:
**`toast.settings.mappingsUpdated`** — the caller passes a hardcoded English inflection
(`plural: count !== 1 ? 's' : ''`). Languages that cannot build a plural by appending that
`s` (zh-CN/zh-TW, ja, ko, de, ru, he) **drop `{plural}`** and render a count-friendly form
(`({count})` or a measure word); fr and es keep it (`mappage{plural}`, `mapeo{plural}`).
```python
# keep a copy of this rule next to the key if it ever moves:
# fr/es: "... ({count} mappage{plural})"
# de/ru/he: "... ({count})"
# zh-CN: "{count} 条映射)" / zh-TW: "{count} 個對應)" / ja: "{count} マッピング)"
```
Do NOT add `{...}` tokens the source lacks (the caller will not supply them, and the literal
text renders in the UI), and do NOT rename source tokens (`{typePlural}` stays `{typePlural}`).
---
## 5. One term, one rendering — offender matrix
Cross-locale summary of §2 inconsistencies. "✓" = already consistent. All ✗ cells were
resolved in the 2026-08 sweep; the row shows the single rendering now in force per locale.
| Term | fr | de | es | ru | he | ja | ko | zh-CN | zh-TW |
|---|---|---|---|---|---|---|---|---|---|
| recipe | Recipe | Rezept | receta | рецепт | מתכון | レシピ | 레시피 | 配方 | 配方 |
| Checkpoint | Checkpoint | Checkpoint | Checkpoint | Checkpoint | Checkpoint | Checkpoint | Checkpoint | Checkpoint | Checkpoint |
| Embedding | Embedding | Embedding | Embedding | Embedding | Embedding | Embedding | Embedding | Embedding | Embedding |
| prompt | Prompt | Prompt | prompt | промпт | פרומפט | プロンプト | 프롬프트 | 提示词 | 提示詞 |
| base model | modèle de base | Basismodell | modelo base | базовая модель | מודל בסיס | ベースモデル | 베이스 모델 | 基础模型 | 基礎模型 |
| preset | préréglage | Voreinstellung | preajuste | пресет | קביעה מראש | プリセット | 프리셋 | 预设 | 預設 |
| workflow | Workflow | Workflow | workflow | Workflow | workflow | ワークフロー | 워크플로 | 工作流 | 工作流 |
| hash | hash | Hash | hash | хеш | hash | ハッシュ | 해시 | 哈希 | 雜湊 |
| metadata | métadonnées | Metadaten | metadatos | метаданные | מטא-נתונים | メタデータ | 메타데이터 | 元数据 | 中繼資料 |
| tags | Tags | Tags | etiquetas | теги | תגיות | タグ | 태그 | 标签 | 標籤 |
| duplicates | en double | Duplikate | duplicados | дубликаты | כפילויות | 重複 | 중복 | 重复项 | 重複項 |
| bulk | groupé | Massen- | por lotes | пакетный | בכמות גדולה | 一括 | 일괄 | 批量 | 批量 |
Watch: ja/ko keep the model-type names **Checkpoint/Embedding** and `Diffusion Model` in
Latin (consistent with their model-type sections) — do not transliterate them as
チェックポイント/체크포인트.
---
## 6. Untranslated English leftovers (status)
Values byte-identical to `en.json` that are actual UI sentences are bugs (brand names and
URL placeholders are the exception). As of the 2026-08 sweep, **all previously untranslated
blocks are translated** in every locale: `recipes.batchImport.*` + `toast.recipes.batchImport*`
(fr/de/es/ru/he/ja/ko), `banners.communitySupport.*`, `modals.model.license.*`,
`globalContextMenu.fetchMissingLicenses.*`, the `doctor.*` issue/action/label subset,
`toast.settings.libraryLoadFailed` / `libraryActivateFailed`, `toast.api.moveFailed`,
`settings.extraFolderPaths.restartRequired`, `toast.recipes.recipeSaved`,
`sidebar.dragDrop.moveUnsupported`, `checkpoints.modelTypes.diffusion_model`
(ja/ko keep the English loanword), `initialization.recipes.title`.
The only values that remain intentionally identical to `en.json` are non-translatable:
URL/path placeholders (`https://…`, `C:/…`), numeric presets (`5 (1080p), 6 (2K), 8 (4K)`),
example token lists (`character, concept, style(toon|toon_style)`), service/provider names
(`CivitAI → CivArchive → Archive DB`), and the external playlist title
(`help.updateVlogs.playlistTitle`, de: translated to "LoRA Manager-Update-Playlist").
Rule for `uiHelpers.workflow.noPromptTargets`: the second line (`Mark as → Send Prompt
Target`) quotes literal ComfyUI context-menu items — keep those menu labels in English in
every locale because that is what the user actually sees in ComfyUI.
License labels (`modals.model.license.*`): the restriction labels are now translated in all
locales (the sibling `creditRequired` has always been translated).
---
## 7. Workflow for agents and translators
### Adding a new UI string
1. Add the key to `locales/en.json` only.
2. Run `python scripts/sync_translation_keys.py` — it inserts the key into the other 9
locales (as a `[TODO: Translate]` placeholder) preserving formatting.
3. **During feature development, stop here.** While the UI copy is still in flux, leave the
`[TODO: Translate]` placeholders as-is — translating churning strings into 9 locales is
wasted work. Placeholders are a normal intermediate state, not a bug.
4. Once the wording is final and the feature owner explicitly asks for translations,
translate **all** pending `[TODO: Translate]` keys in every locale (not just the latest
feature's), applying §1–§3 (placeholders verbatim, Recipe rule, term maps, register).
Find pending keys with: `grep -c "TODO: Translate" locales/*.json`
5. If the new string contains new terminology, extend §2 tables.
### Fixing a translation bug
1. Locate the key (dotted path) in the relevant locale file.
2. Check the corresponding `en.json` value and the actual caller (grep `static/js` or
`web/comfyui` for the key) to learn which placeholders are passed.
3. Fix trivially; for normalization sweeps (e.g. "recette" → "Recipe"), do it file-wide for
the offending keys only — do not touch unrelated lines.
4. If the bug is in `en.json` itself (R9), fix the source first, then re-sync and update all
locales.
### Verification
```bash
pytest tests/i18n/test_i18n.py # key parity + JSON validity + JS key references
python scripts/sync_translation_keys.py --dry-run # shows which keys would change; add --verbose for per-key detail
npm test # frontend tests incl. i18n helpers
```
`pytest tests/i18n` only checks structure. Quality conventions in this document are not
machine-enforced — a human/agent review pass is required.
### Anti-patterns checklist
- [ ] Placeholders `{x}` / `{{x}}` differ from `en.json`
- [ ] Same source term translated 2+ ways in the same file (see §5)
- [ ] "Checkpoint" became a literal checkpoint; "recipe" became menu/prescription/food-cookbook
- [ ] Brand names translated or transliterated (LoRA, CivitAI, ComfyUI, …)
- [ ] Latin locale using full-width `:()`; fr using `"` as apostrophe
- [ ] Mixed 你/您, du/Sie, tú/usted
- [ ] Full English sentences left behind (see §6)
- [ ] Register/typos/mojibake; source string is stale vs `en.json` (compare semantics, not
just words)
+197 -193
View File
@@ -66,12 +66,12 @@
},
"steps": {
"fetch": {
"title": "Modelldaten abrufen",
"content": "Klicken Sie auf die Schaltfläche <strong>Abrufen</strong>, um Modelldaten und Vorschaubilder von Civitai herunterzuladen."
"title": "Metadaten abrufen",
"content": "Klicken Sie auf die Schaltfläche <strong>Abrufen</strong>, um Metadaten und Vorschaubilder von CivitAI herunterzuladen."
},
"download": {
"title": "Neue Modelle herunterladen",
"content": "Verwenden Sie die Schaltfläche <strong>Herunterladen</strong>, um Modelle direkt über Civitai-URLs herunterzuladen."
"content": "Verwenden Sie die Schaltfläche <strong>Herunterladen</strong>, um Modelle direkt über CivitAI-URLs herunterzuladen."
},
"bulk": {
"title": "Massenoperationen",
@@ -83,7 +83,7 @@
},
"filter": {
"title": "Modelle filtern",
"content": "Verwenden Sie Filter, um Modelle nach Basis-Modelltyp (SD1.5, SDXL, Flux usw.) oder bestimmten Tags einzugrenzen."
"content": "Verwenden Sie Filter, um Modelle nach Basismodelltyp (SD1.5, SDXL, Flux usw.) oder bestimmten Tags einzugrenzen."
},
"breadcrumb": {
"title": "Breadcrumb-Navigation",
@@ -103,8 +103,8 @@
"actions": {
"addToFavorites": "Zu Favoriten hinzufügen",
"removeFromFavorites": "Aus Favoriten entfernen",
"viewOnCivitai": "Auf Civitai anzeigen",
"notAvailableFromCivitai": "Nicht auf Civitai verfügbar",
"viewOnCivitai": "Auf CivitAI anzeigen",
"notAvailableFromCivitai": "Nicht auf CivitAI verfügbar",
"viewOnHuggingFace": "Auf Hugging Face ansehen",
"sendToWorkflow": "An ComfyUI senden (Klick: Anhängen, Shift+Klick: Ersetzen)",
"copyLoRASyntax": "LoRA-Syntax kopieren",
@@ -137,7 +137,7 @@
"exampleImages": {
"checkError": "Fehler beim Überprüfen der Beispielbilder",
"missingHash": "Fehlende Modell-Hash-Informationen.",
"noRemoteImagesAvailable": "Keine Remote-Beispielbilder für dieses Modell auf Civitai verfügbar"
"noRemoteImagesAvailable": "Keine Remote-Beispielbilder für dieses Modell auf CivitAI verfügbar"
},
"badges": {
"update": "Update",
@@ -173,18 +173,18 @@
"error": "Fehler beim Bereinigen der Beispielbild-Ordner: {message}"
},
"fetchMissingLicenses": {
"label": "Refresh license metadata",
"loading": "Refreshing license metadata for {typePlural}...",
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
"label": "Lizenzmetadaten aktualisieren",
"loading": "Lizenzmetadaten für {typePlural} werden aktualisiert...",
"success": "Lizenzmetadaten für {count} {typePlural} aktualisiert",
"none": "Alle {typePlural} verfügen bereits über Lizenzmetadaten",
"error": "Lizenzmetadaten für {typePlural} konnten nicht aktualisiert werden: {message}"
},
"repairRecipes": {
"label": "Recipe-Daten reparieren",
"loading": "Recipe-Daten werden repariert...",
"label": "Rezept-Daten reparieren",
"loading": "Rezept-Daten werden repariert...",
"success": "{count} Rezepte erfolgreich repariert.",
"cancelled": "Reparatur abgebrochen. {count} Rezepte wurden repariert.",
"error": "Recipe-Reparatur fehlgeschlagen: {message}"
"error": "Rezept-Reparatur fehlgeschlagen: {message}"
},
"rematchRecipes": {
"label": "Rezepte lokalen Modellen neu zuordnen",
@@ -242,7 +242,7 @@
"presetDeleteConfirmClick": "Zum Bestätigen erneut klicken",
"presetOverwriteConfirm": "Voreinstellung \"{name}\" existiert bereits. Überschreiben?",
"presetNamePlaceholder": "Voreinstellungsname...",
"baseModel": "Basis-Modell",
"baseModel": "Basismodell",
"baseModelSearchPlaceholder": "Basismodelle durchsuchen...",
"modelTags": "Tags",
"modelTypes": "Modelltypen",
@@ -290,15 +290,15 @@
}
},
"settings": {
"civitaiApiKey": "Civitai API Key",
"civitaiApiKeyPlaceholder": "Geben Sie Ihren Civitai API Key ein",
"civitaiApiKeyHelp": "Wird für die Authentifizierung beim Herunterladen von Modellen von Civitai verwendet",
"civitaiApiKey": "CivitAI API Key",
"civitaiApiKeyPlaceholder": "Geben Sie Ihren CivitAI API Key ein",
"civitaiApiKeyHelp": "Wird für die Authentifizierung beim Herunterladen von Modellen von CivitAI verwendet",
"civitaiApiKeyConfigured": "Konfiguriert",
"civitaiApiKeyNotConfigured": "Nicht konfiguriert",
"civitaiApiKeySet": "Einrichten",
"civitaiHost": {
"label": "Civitai-Host",
"help": "Wählen Sie aus, welche Civitai-Seite geöffnet wird, wenn Sie „View on Civitai“-Links verwenden.",
"label": "CivitAI-Host",
"help": "Wählen Sie aus, welche CivitAI-Seite geöffnet wird, wenn Sie „View on CivitAI“-Links verwenden.",
"options": {
"com": "civitai.com (nur SFW)",
"red": "civitai.red (uneingeschränkt)"
@@ -319,8 +319,8 @@
},
"aria2HelpLink": "Erfahren Sie, wie Sie das aria2-Download-Backend einrichten",
"civitaiHostBanner": {
"title": "Civitai-Host-Einstellung verfügbar",
"content": "Civitai verwendet jetzt civitai.com für SFW-Inhalte und civitai.red für uneingeschränkte Inhalte. In den Einstellungen können Sie ändern, welche Seite standardmäßig geöffnet wird.",
"title": "CivitAI-Host-Einstellung verfügbar",
"content": "CivitAI verwendet jetzt civitai.com für SFW-Inhalte und civitai.red für uneingeschränkte Inhalte. In den Einstellungen können Sie ändern, welche Seite standardmäßig geöffnet wird.",
"openSettings": "Einstellungen öffnen"
},
"openSettingsFileLocation": {
@@ -406,8 +406,8 @@
"retention": "Aufbewahrungsanzahl",
"retentionHelp": "Wie viele automatische Schnappschüsse behalten werden, bevor ältere entfernt werden.",
"management": "Backup-Verwaltung",
"managementHelp": "Exportiere deinen aktuellen Benutzerstatus oder stelle ihn aus einem Backup-Archiv wieder her.",
"scopeHelp": "Sichert deine Einstellungen, den Downloadverlauf und den Status der Modellaktualisierung. Modelldateien und neu erzeugbare Caches sind nicht enthalten.",
"managementHelp": "Exportieren Sie Ihren aktuellen Benutzerstatus oder stellen Sie ihn aus einem Backup-Archiv wieder her.",
"scopeHelp": "Sichert Ihre Einstellungen, den Downloadverlauf und den Status der Modellaktualisierung. Modelldateien und neu erzeugbare Caches sind nicht enthalten.",
"locationSummary": "Aktueller Backup-Speicherort",
"openFolderButton": "Backup-Ordner öffnen",
"openFolderSuccess": "Backup-Ordner geöffnet",
@@ -428,7 +428,7 @@
},
"downloadSkipBaseModels": {
"label": "Downloads für Basismodelle überspringen",
"help": "Gilt für alle Download-Abläufe. Hier können nur unterstützte Basismodelle ausgewählt werden.",
"help": "Wenn aktiviert, werden Versionen, die die ausgewählten Basismodelle verwenden, übersprungen.",
"searchPlaceholder": "Basismodelle filtern...",
"empty": "Keine Basismodelle entsprechen der aktuellen Suche.",
"summary": {
@@ -450,7 +450,7 @@
},
"layoutSettings": {
"groupByModel": "Nach Modell gruppieren",
"groupByModelHelp": "Wenn aktiviert, wird nur die neueste Version jedes Civitai-Modells als einzelne Karte angezeigt. Ältere Versionen werden ausgeblendet.",
"groupByModelHelp": "Wenn aktiviert, wird nur die neueste Version jedes CivitAI-Modells als einzelne Karte angezeigt. Ältere Versionen werden ausgeblendet.",
"displayDensity": "Anzeige-Dichte",
"displayDensityOptions": {
"default": "Standard",
@@ -517,7 +517,7 @@
"extraFolderPaths": {
"title": "Zusätzliche Ordnerpfade",
"description": "Zusätzliche Modellstammverzeichnisse, die ausschließlich für LoRA Manager gelten. Laden Sie Modelle von Speicherorten außerhalb der Standardordner von ComfyUI ideal für große Bibliotheken, die ComfyUI sonst verlangsamen würden.",
"restartRequired": "Requires restart to take effect",
"restartRequired": "Neustart erforderlich, damit die Änderung wirksam wird",
"modelTypes": {
"lora": "LoRA-Pfade",
"checkpoint": "Checkpoint-Pfade",
@@ -555,17 +555,17 @@
},
"downloadPathTemplates": {
"title": "Download-Pfad-Vorlagen",
"help": "Konfigurieren Sie Ordnerstrukturen für verschiedene Modelltypen beim Herunterladen von Civitai.",
"help": "Konfigurieren Sie Ordnerstrukturen für verschiedene Modelltypen beim Herunterladen von CivitAI.",
"availablePlaceholders": "Verfügbare Platzhalter:",
"templateOptions": {
"flatStructure": "Flache Struktur",
"byBaseModel": "Nach Basis-Modell",
"byBaseModel": "Nach Basismodell",
"byAuthor": "Nach Autor",
"byFirstTag": "Nach erstem Tag",
"baseModelFirstTag": "Basis-Modell + Erster Tag",
"baseModelAuthor": "Basis-Modell + Autor",
"baseModelFirstTag": "Basismodell + Erster Tag",
"baseModelAuthor": "Basismodell + Autor",
"authorFirstTag": "Autor + Erster Tag",
"baseModelAuthorFirstTag": "Basis-Modell + Autor + Erster Tag",
"baseModelAuthorFirstTag": "Basismodell + Autor + Erster Tag",
"customTemplate": "Benutzerdefinierte Vorlage"
},
"customTemplatePlaceholder": "Benutzerdefinierte Vorlage eingeben (z.B. {base_model}/{author}/{first_tag})",
@@ -574,10 +574,10 @@
"checkpoint": "Checkpoint",
"embedding": "Embedding"
},
"baseModelPathMappings": "Basis-Modell-Pfad-Zuordnungen",
"baseModelPathMappingsHelp": "Passen Sie Ordnernamen für spezifische Basis-Modelle an (z.B. \"Flux.1 D\" → \"flux\")",
"baseModelPathMappings": "Basismodell-Pfad-Zuordnungen",
"baseModelPathMappingsHelp": "Passen Sie Ordnernamen für spezifische Basismodelle an (z.B. \"Flux.1 D\" → \"flux\")",
"addMapping": "Zuordnung hinzufügen",
"selectBaseModel": "Basis-Modell auswählen",
"selectBaseModel": "Basismodell auswählen",
"customPathPlaceholder": "Benutzerdefinierter Pfad (z.B. flux)",
"removeMapping": "Zuordnung entfernen",
"validation": {
@@ -592,7 +592,7 @@
"exampleImages": {
"downloadLocation": "Download-Speicherort",
"downloadLocationPlaceholder": "Ordnerpfad für Beispielbilder eingeben",
"downloadLocationHelp": "Geben Sie den Ordnerpfad ein, wo Beispielbilder von Civitai gespeichert werden",
"downloadLocationHelp": "Geben Sie den Ordnerpfad ein, wo Beispielbilder von CivitAI gespeichert werden",
"autoDownload": "Beispielbilder automatisch herunterladen",
"autoDownloadHelp": "Beispielbilder automatisch für Modelle herunterladen, die keine haben (erfordert gesetzten Download-Speicherort)",
"openMode": "Aktion für Beispielbilder öffnen",
@@ -617,7 +617,7 @@
},
"versionGrouping": {
"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.",
"help": "Entscheiden Sie, ob Update-Badges nur dann erscheinen, wenn eine neue Version dasselbe Basismodell wie Ihre 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"
@@ -625,7 +625,7 @@
},
"hideEarlyAccessUpdates": {
"label": "Früher Zugriff Updates ausblenden",
"help": "Nur Early-Access-Updates"
"help": "Wenn aktiviert, zeigen Modelle mit ausschließlich Early-Access-Updates kein Abzeichen „Update verfügbar“."
},
"hidePaidUpdates": {
"label": "Bezahlte Updates ausblenden",
@@ -647,7 +647,7 @@
},
"metadataArchive": {
"enableArchiveDb": "Metadaten-Archiv-Datenbank aktivieren",
"enableArchiveDbHelp": "Verwenden Sie eine lokale Datenbank, um auf Metadaten von Modellen zuzugreifen, die von Civitai gelöscht wurden.",
"enableArchiveDbHelp": "Verwenden Sie eine lokale Datenbank, um auf Metadaten von Modellen zuzugreifen, die von CivitAI gelöscht wurden.",
"status": "Status",
"statusAvailable": "Verfügbar",
"statusUnavailable": "Nicht verfügbar",
@@ -708,7 +708,7 @@
"custom": "Benutzerdefiniert (OpenAI-kompatibel)"
},
"apiBase": "API-Basis-URL",
"apiBaseHelp": "Die Basis-URL für die LLM-API (z.B. https://api.openai.com/v1). Leer lassen, um die Anbietervoreinstellung zu verwenden.",
"apiBaseHelp": "Die Basis-URL für die LLM-API. Wählen Sie eine Voreinstellung oder geben Sie eine benutzerdefinierte URL ein. Die Dropdown-Liste zeigt Voreinstellungen für alle unterstützten Anbieter.",
"apiBasePlaceholder": "https://api.openai.com/v1",
"apiKey": "API-Schlüssel",
"apiKeyHelp": "Ihr LLM-API-Schlüssel. Wird lokal gespeichert und niemals an einen anderen Server außer Ihrem gewählten LLM-Anbieter gesendet.",
@@ -750,7 +750,7 @@
"fullTooltip": "Alle Modelldetails aus Metadatendateien neu laden nutzen, wenn die Bibliothek veraltet wirkt oder nach manuellen Änderungen."
},
"fetch": {
"title": "Metadaten von Civitai abrufen",
"title": "Metadaten von CivitAI abrufen",
"action": "Abrufen"
},
"download": {
@@ -759,7 +759,7 @@
},
"bulk": {
"title": "Massenoperationen",
"action": "Massen"
"action": "Massenbearbeitung"
},
"duplicates": {
"title": "Duplikate finden",
@@ -782,7 +782,7 @@
"selectedSuffix": "ausgewählt",
"viewSelected": "Auswahl anzeigen",
"addTags": "Allen Tags hinzufügen",
"setBaseModel": "Basis-Modell für alle festlegen",
"setBaseModel": "Basismodell für alle festlegen",
"setContentRating": "Inhaltsbewertung für alle festlegen",
"copyAll": "Alle Syntax kopieren",
"refreshAll": "Alle Metadaten aktualisieren",
@@ -803,8 +803,8 @@
"downloadMissingExamples": "Fehlende herunterladen",
"reprocessExamples": "Alle erneut verarbeiten",
"clear": "Auswahl löschen",
"skipMetadataRefreshCount": "Überspringen{count} Modelle",
"resumeMetadataRefreshCount": "Fortsetzen{count} Modelle",
"skipMetadataRefreshCount": "Überspringen({count} Modelle)",
"resumeMetadataRefreshCount": "Fortsetzen({count} Modelle)",
"sendToWorkflow": "An Workflow senden",
"sections": {
"workflow": "Workflow",
@@ -825,10 +825,10 @@
"enrichHfAgent": "HF-Metadaten mit KI anreichern"
},
"contextMenu": {
"refreshMetadata": "Civitai-Daten aktualisieren",
"refreshMetadata": "CivitAI-Daten aktualisieren",
"checkUpdates": "Updates prüfen",
"linkModel": "Modell verknüpfen",
"linkCivitai": "Mit Civitai neu verknüpfen",
"linkCivitai": "Mit CivitAI neu verknüpfen",
"linkHuggingFace": "Mit HuggingFace verknüpfen",
"copySyntax": "LoRA-Syntax kopieren",
"copyFilename": "Modell-Dateiname kopieren",
@@ -860,6 +860,7 @@
"actions": {
"sendCheckpoint": "Send to ComfyUI",
"sendRecipe": "Send to ComfyUI",
"copyRecipeSyntax": "Rezept-Syntax kopieren",
"deleteRecipeWithShortcut": "Rezept löschen (Del)"
},
"navigation": {
@@ -883,23 +884,26 @@
"loraStatus": {
"none": "Keine LoRAs in diesem Rezept",
"allAvailable": "Alle LoRAs verfügbar - Einsatzbereit",
"missing": "{missing} von {total} LoRAs fehlen"
"missing": "{missing} von {total} LoRAs fehlen",
"missingAndUnavailable": "{missing} von {total} LoRAs fehlen, {unavailable} nicht verfügbar (von der Quelle gelöscht oder Hash nicht auflösbar)",
"partial": "{unavailable} von {total} LoRAs nicht verfügbar (von der Quelle gelöscht oder Hash nicht auflösbar) - werden bei Verwendung des Rezepts übersprungen",
"noneUsable": "Keine verwendbaren LoRAs - {unavailable} von {total} von der Quelle gelöscht oder Hash nicht auflösbar"
},
"resources": {
"inLibrary": "In Bibliothek",
"notInLibrary": "Nicht in Bibliothek",
"deleted": "Gelöscht",
"hashInvalid": "Nicht auflösbarer Hash",
"inLibraryTooltip": "Dieses Modell ist in deiner lokalen Bibliothek vorhanden",
"notInLibraryTooltip": "Dieses Modell ist nicht in deiner Bibliothek",
"inLibraryTooltip": "Dieses Modell ist in Ihrer lokalen Bibliothek vorhanden",
"notInLibraryTooltip": "Dieses Modell ist nicht in Ihrer Bibliothek",
"deletedTooltip": "Dieses LoRA wurde an der Quelle gelöscht und kann nicht mehr heruntergeladen werden",
"hashInvalidTooltip": "Dieser LoRA-Hash kann auf CivitAI nicht aufgelöst werden - das Modell wurde möglicherweise aktualisiert",
"download": "Herunterladen",
"downloadLoraTooltip": "Dieses LoRA herunterladen",
"preparingDownload": "Download wird vorbereitet",
"preparingDownload": "Download wird vorbereitet...",
"reconnect": "Neu verknüpfen",
"reconnectTooltip": "Mit einem lokalen LoRA neu verknüpfen",
"viewOnCivitai": "Auf Civitai anzeigen",
"viewOnCivitai": "Auf CivitAI anzeigen",
"openLoraDetails": "{name} in der LoRA-Bibliothek anzeigen",
"openCheckpointDetails": "{name} in der Modellbibliothek anzeigen"
},
@@ -911,7 +915,7 @@
"dropZoneHint": "Bild hierher ziehen, aus der Zwischenablage einfügen oder klicken zum Durchsuchen",
"orDivider": "oder Bild per Drag & Drop / Einfügen hinzufügen",
"imageUrlOrPath": "Bild-URL oder Dateipfad:",
"urlPlaceholder": "https://civitai.com/images/... oder C:/pfad/zu/bild.png",
"urlPlaceholder": "https://civitai.com/images/... oder https://civitai.red/images/... oder C:/pfad/zu/bild.png",
"fetchImage": "Bild abrufen",
"recipeName": "Rezeptname",
"recipeNamePlaceholder": "Rezeptname eingeben",
@@ -940,7 +944,7 @@
"downloadingLoras": "LoRAs werden heruntergeladen...",
"savingRecipe": "Rezept wird gespeichert...",
"startingDownload": "Download für LoRA {current}/{total} wird gestartet",
"deletedFromCivitai": "Von Civitai gelöscht",
"deletedFromCivitai": "Von CivitAI gelöscht",
"inLibrary": "In Bibliothek",
"notInLibrary": "Nicht in Bibliothek",
"earlyAccessRequired": "Dieses LoRA erfordert eine Early Access-Zahlung zum Herunterladen.",
@@ -1042,63 +1046,63 @@
}
},
"batchImport": {
"title": "Batch Import Recipes",
"action": "Batch Import",
"urlList": "URL List",
"directory": "Directory",
"urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.",
"directoryDescription": "Enter a directory path to import all images from that folder.",
"urlsLabel": "Image URLs or Local Paths",
"title": "Massenimport von Rezepten",
"action": "Massenimport",
"urlList": "URL-Liste",
"directory": "Verzeichnis",
"urlDescription": "Geben Sie Bild-URLs oder lokale Dateipfade ein (eine pro Zeile). Jeder Eintrag wird als Rezept importiert.",
"directoryDescription": "Geben Sie einen Verzeichnispfad ein, um alle Bilder aus diesem Ordner zu importieren.",
"urlsLabel": "Bild-URLs oder lokale Pfade",
"urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "Enter one URL or path per line",
"directoryPath": "Directory Path",
"urlsHint": "Eine URL oder ein Pfad pro Zeile",
"directoryPath": "Verzeichnispfad",
"directoryPlaceholder": "/path/to/images/folder",
"browse": "Browse",
"recursive": "Include subdirectories",
"tagsOptional": "Tags (optional, applied to all recipes)",
"tagsPlaceholder": "Enter tags separated by commas",
"tagsHint": "Tags will be added to all imported recipes",
"skipNoMetadata": "Skip images without metadata",
"skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.",
"start": "Start Import",
"startImport": "Start Import",
"importing": "Importing...",
"rateLimitedSlowdown": "Ratenlimit — wird verlangsamt",
"rateLimitedHint": "Einige Einträge wurden aufgrund von Ratenlimits des Metadaten-Anbieters übersprungen. Führen Sie den Import später erneut aus, um sie zu wiederholen.",
"progress": "Progress",
"total": "Total",
"success": "Success",
"failed": "Failed",
"skipped": "Skipped",
"current": "Current",
"currentItem": "Current",
"preparing": "Preparing...",
"cancel": "Cancel",
"cancelImport": "Cancel",
"cancelled": "Import cancelled",
"completed": "Import completed",
"completedWithErrors": "Completed with errors",
"completedSuccess": "Successfully imported {count} recipe(s)",
"successCount": "Successful",
"failedCount": "Failed",
"skippedCount": "Skipped",
"totalProcessed": "Total processed",
"viewDetails": "View Details",
"newImport": "New Import",
"manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.",
"batchImportDirectorySelected": "Directory selected: {path}",
"batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.",
"backToParent": "Back to parent directory",
"folders": "Folders",
"folderCount": "{count} folders",
"imageFiles": "Image Files",
"images": "images",
"imageCount": "{count} images",
"selectFolder": "Select This Folder",
"browse": "Durchsuchen",
"recursive": "Unterordner einbeziehen",
"tagsOptional": "Tags (optional, auf alle Rezepte angewendet)",
"tagsPlaceholder": "Tags durch Kommas getrennt eingeben",
"tagsHint": "Tags werden allen importierten Rezepten hinzugefügt",
"skipNoMetadata": "Bilder ohne Metadaten überspringen",
"skipNoMetadataHelp": "Bilder ohne LoRA-Metadaten werden automatisch übersprungen.",
"start": "Import starten",
"startImport": "Import starten",
"importing": "Importiere...",
"rateLimitedSlowdown": "Ratenlimit erreicht — wird verlangsamt...",
"rateLimitedHint": "Einige Elemente wurden wegen Ratenlimits des Metadatenanbieters übersprungen. Führen Sie den Import später erneut aus, um es zu wiederholen.",
"progress": "Fortschritt",
"total": "Gesamt",
"success": "Erfolgreich",
"failed": "Fehlgeschlagen",
"skipped": "Übersprungen",
"current": "Aktuell",
"currentItem": "Aktuell",
"preparing": "Wird vorbereitet...",
"cancel": "Abbrechen",
"cancelImport": "Abbrechen",
"cancelled": "Import abgebrochen",
"completed": "Import abgeschlossen",
"completedWithErrors": "Mit Fehlern abgeschlossen",
"completedSuccess": "{count} Rezept(e) erfolgreich importiert",
"successCount": "Erfolgreich",
"failedCount": "Fehlgeschlagen",
"skippedCount": "Übersprungen",
"totalProcessed": "Gesamt verarbeitet",
"viewDetails": "Details anzeigen",
"newImport": "Neuer Import",
"manualPathEntry": "Bitte geben Sie den Verzeichnispfad manuell ein. Der Dateibrowser ist in diesem Browser nicht verfügbar.",
"batchImportDirectorySelected": "Verzeichnis ausgewählt: {path}",
"batchImportManualEntryRequired": "Dateibrowser nicht verfügbar. Bitte geben Sie den Verzeichnispfad manuell ein.",
"backToParent": "Zum übergeordneten Verzeichnis",
"folders": "Ordner",
"folderCount": "{count} Ordner",
"imageFiles": "Bilddateien",
"images": "Bilder",
"imageCount": "{count} Bilder",
"selectFolder": "Diesen Ordner auswählen",
"errors": {
"enterUrls": "Please enter at least one URL or path",
"enterDirectory": "Please enter a directory path",
"startFailed": "Failed to start import: {message}"
"enterUrls": "Bitte geben Sie mindestens eine URL oder einen Pfad ein",
"enterDirectory": "Bitte geben Sie einen Verzeichnispfad ein",
"startFailed": "Import konnte nicht gestartet werden: {message}"
}
}
},
@@ -1106,7 +1110,7 @@
"title": "Checkpoint-Modelle",
"modelTypes": {
"checkpoint": "Checkpoint",
"diffusion_model": "Diffusion Model"
"diffusion_model": "Diffusionsmodell"
},
"contextMenu": {
"moveToOtherTypeFolder": "In {otherType}-Ordner verschieben",
@@ -1228,7 +1232,7 @@
},
"charts": {
"collectionOverview": "Sammlungsübersicht",
"baseModelDistribution": "Basis-Modell-Verteilung",
"baseModelDistribution": "Basismodell-Verteilung",
"usageTrends": "Nutzungstrends (Letzte 30 Tage)",
"usageDistribution": "Nutzungsverteilung",
"date": "Datum",
@@ -1268,7 +1272,7 @@
"download": {
"title": "Modell von URL herunterladen",
"titleWithType": "{type} von URL herunterladen",
"civitaiUrl": "Civitai URL:",
"civitaiUrl": "CivitAI URL:",
"placeholder": "https://civitai.com/models/...",
"urlHint": "Geben Sie eine CivitAI-, CivArchive- oder Hugging Face-URL pro Zeile ein. Unterstützt mehrere URLs für den Batch-Download.",
"selectHfFiles": "Datei(en) zum Herunterladen aus diesem Repository auswählen:",
@@ -1303,7 +1307,7 @@
"inLibrary": "In Bibliothek"
},
"errors": {
"invalidUrl": "Ungültiges Civitai URL-Format",
"invalidUrl": "Ungültiges CivitAI URL-Format",
"noVersions": "Keine Versionen für dieses Modell verfügbar",
"mixedSources": "CivitAI- und Hugging Face-URLs können nicht in derselben Charge gemischt werden.",
"noModelFiles": "In diesem Repository wurden keine Modelldateien gefunden."
@@ -1366,7 +1370,7 @@
"clearCache": {
"title": "Cache-Dateien löschen",
"message": "Sind Sie sicher, dass Sie alle Cache-Dateien löschen möchten?",
"description": "Dies entfernt alle zwischengespeicherten Modelldaten. Das System muss beim nächsten Start den Cache neu aufbauen, was je nach Größe Ihrer Modellsammlung einige Zeit dauern kann.",
"description": "Dies entfernt alle zwischengespeicherten Metadaten. Das System muss beim nächsten Start den Cache neu aufbauen, was je nach Größe Ihrer Modellsammlung einige Zeit dauern kann.",
"action": "Cache löschen"
},
"bulkDelete": {
@@ -1383,8 +1387,8 @@
},
"checkUpdates": {
"title": "Alle {typePlural} auf Updates prüfen?",
"message": "Damit werden alle {typePlural} in deiner Bibliothek auf Updates geprüft. Bei großen Sammlungen kann das etwas länger dauern.",
"tip": "Du möchtest in Etappen prüfen? Wechsle in den Sammelmodus, wähle die benötigten Modelle aus und nutze anschließend \"Auswahl auf Updates prüfen\".",
"message": "Damit werden alle {typePlural} in Ihrer Bibliothek auf Updates geprüft. Bei großen Sammlungen kann das etwas länger dauern.",
"tip": "Möchten Sie in Etappen prüfen? Wechseln Sie in den Massenmodus, wählen Sie die benötigten Modelle aus und nutzen Sie anschließend \"Auswahl auf Updates prüfen\".",
"action": "Alles prüfen"
},
"bulkAddTags": {
@@ -1398,11 +1402,11 @@
"saveChanges": "Änderungen speichern"
},
"bulkBaseModel": {
"title": "Basis-Modell für mehrere Modelle festlegen",
"description": "Basis-Modell festlegen für",
"title": "Basismodell für mehrere Modelle festlegen",
"description": "Basismodell festlegen für",
"models": "Modelle",
"selectBaseModel": "Basis-Modell auswählen",
"save": "Basis-Modell aktualisieren",
"selectBaseModel": "Basismodell auswählen",
"save": "Basismodell aktualisieren",
"cancel": "Abbrechen"
},
"bulkDownloadMissingLoras": {
@@ -1417,7 +1421,7 @@
"title": "Lokale Beispielbilder",
"message": "Keine lokalen Beispielbilder für dieses Modell gefunden. Ansichtsoptionen:",
"downloadOption": {
"title": "Von Civitai herunterladen",
"title": "Von CivitAI herunterladen",
"description": "Remote-Beispiele lokal speichern für Offline-Nutzung und schnelleres Laden"
},
"importOption": {
@@ -1444,7 +1448,7 @@
"confirmAction": "Speichern & Verknüpfen"
},
"relinkCivitai": {
"title": "Mit Civitai neu verknüpfen",
"title": "Mit CivitAI neu verknüpfen",
"warning": "Warnung:",
"warningText": "Dies ist eine potentiell destruktive Operation. Das Neu-Verknüpfen wird:",
"warningList": {
@@ -1453,15 +1457,15 @@
"unintendedConsequences": "Möglicherweise andere unbeabsichtigte Folgen haben"
},
"proceedText": "Fahren Sie nur fort, wenn Sie sicher sind, dass Sie das wollen.",
"urlLabel": "Civitai-Modell-URL:",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"urlLabel": "CivitAI-Modell-URL:",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890 oder https://civitai.red/models/12345/model-name?modelVersionId=67890",
"helpText": {
"title": "Fügen Sie eine beliebige Civitai- oder CivitArchive-Modell-URL ein. Unterstützte Formate:",
"title": "Fügen Sie eine beliebige CivitAI- oder CivitArchive-Modell-URL ein. Unterstützte Formate:",
"format1": "https://civitai.com/models/12345",
"format2": "https://civitai.com/models/12345?modelVersionId=67890",
"format3": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"note": "Hinweis: Wenn keine modelVersionId angegeben ist, wird die neueste Version verwendet.",
"format4": "https://civarchive.com/models/12345 (CivitArchive)"
"format4": "https://civarchive.com/models/12345 (CivArchive)"
},
"confirmAction": "Neu-Verknüpfung bestätigen"
},
@@ -1469,10 +1473,10 @@
"actions": {
"editModelName": "Modellname bearbeiten",
"editFileName": "Dateiname bearbeiten",
"editBaseModel": "Basis-Modell bearbeiten",
"editBaseModel": "Basismodell bearbeiten",
"editVersionName": "Versionsname bearbeiten",
"viewOnCivitai": "Auf Civitai anzeigen",
"viewOnCivitaiText": "Auf Civitai anzeigen",
"viewOnCivitai": "Auf CivitAI anzeigen",
"viewOnCivitaiText": "Auf CivitAI anzeigen",
"viewOnHuggingFace": "Auf Hugging Face ansehen",
"viewOnHuggingFaceText": "Auf Hugging Face ansehen",
"viewCreatorProfile": "Ersteller-Profil anzeigen",
@@ -1495,7 +1499,7 @@
"version": "Version",
"fileName": "Dateiname",
"location": "Speicherort",
"baseModel": "Basis-Modell",
"baseModel": "Basismodell",
"size": "Größe",
"hashes": "Hashes",
"unknown": "Unbekannt",
@@ -1504,7 +1508,7 @@
"notesHint": "Enter zum Speichern, Shift+Enter für neue Zeile",
"addNotesPlaceholder": "Fügen Sie hier Ihre Notizen hinzu...",
"aboutThisVersion": "Über diese Version",
"baseModelSearchPlaceholder": "Basismodell suchen",
"baseModelSearchPlaceholder": "Basismodell suchen...",
"baseModelSuggested": "Vorschlag",
"baseModelNoMatch": "Keine passenden Basismodelle"
},
@@ -1573,10 +1577,10 @@
"noNext": "Kein weiteres Modell verfügbar"
},
"license": {
"noImageSell": "No selling generated content",
"noRentCivit": "No Civitai generation",
"noRent": "No generation services",
"noSell": "No selling models",
"noImageSell": "Kein Verkauf generierter Bilder",
"noRentCivit": "Keine CivitAI-Generierung",
"noRent": "Keine Generierungsdienste",
"noSell": "Kein Verkauf von Modellen",
"creditRequired": "Ersteller-Angabe erforderlich",
"noDerivatives": "Keine gemeinsamen Zusammenführungen",
"noReLicense": "Gleiche Berechtigungen erforderlich",
@@ -1639,33 +1643,33 @@
"newer": "Neuere Version",
"newerTooltip": "Diese Version ist neuer als Ihre neueste lokale Version",
"earlyAccess": "Früher Zugriff",
"earlyAccessTooltip": "Für diese Version ist derzeit Civitai Early Access erforderlich",
"earlyAccessTooltip": "Für diese Version ist derzeit CivitAI Early Access erforderlich",
"paid": "Bezahlt",
"paidTooltip": "Diese Version erfordert eine Zahlung zum Herunterladen",
"ignored": "Ignoriert",
"ignoredTooltip": "Für diese Version sind Update-Benachrichtigungen deaktiviert",
"onSiteOnly": "Nur On-Site",
"onSiteOnlyTooltip": "Diese Version ist nur für die On-Site-Generierung auf Civitai verfügbar"
"onSiteOnlyTooltip": "Diese Version ist nur für die On-Site-Generierung auf CivitAI verfügbar"
},
"actions": {
"download": "Herunterladen",
"downloadTooltip": "Diese Version herunterladen",
"downloadChooseFilesTooltip": "Auswählen, welche Dateien heruntergeladen werden sollen",
"downloadEarlyAccessTooltip": "Diese Early-Access-Version von Civitai herunterladen",
"downloadPaidTooltip": "Diese bezahlte Version von Civitai herunterladen",
"downloadNotAllowedTooltip": "Diese Version ist nur für die On-Site-Generierung auf Civitai verfügbar",
"downloadEarlyAccessTooltip": "Diese Early-Access-Version von CivitAI herunterladen",
"downloadPaidTooltip": "Diese bezahlte Version von CivitAI herunterladen",
"downloadNotAllowedTooltip": "Diese Version ist nur für die On-Site-Generierung auf CivitAI verfügbar",
"delete": "Löschen",
"deleteTooltip": "Diese lokale Version löschen",
"ignore": "Ignorieren",
"unignore": "Ignorierung aufheben",
"ignoreTooltip": "Update-Benachrichtigungen für diese Version ignorieren",
"unignoreTooltip": "Update-Benachrichtigungen für diese Version fortsetzen",
"viewVersionOnCivitai": "Version auf Civitai anzeigen",
"viewVersionOnCivitai": "Version auf CivitAI anzeigen",
"earlyAccessTooltip": "Erfordert Early-Access-Kauf",
"resumeModelUpdates": "Aktualisierungen für dieses Modell fortsetzen",
"ignoreModelUpdates": "Aktualisierungen für dieses Modell ignorieren",
"viewLocalVersions": "Alle lokalen Versionen anzeigen",
"viewLocalTooltip": "Demnächst verfügbar"
"viewLocalTooltip": "Alle lokalen Versionen dieses Modells auf der Hauptseite anzeigen"
},
"filters": {
"label": "Basisfilter",
@@ -1681,7 +1685,7 @@
},
"empty": "Noch keine Versionshistorie für dieses Modell vorhanden.",
"error": "Versionen konnten nicht geladen werden.",
"missingModelId": "Für dieses Modell ist keine Civitai-Model-ID vorhanden.",
"missingModelId": "Für dieses Modell ist keine CivitAI-Model-ID vorhanden.",
"hfGroupInfo": "Dies ist eine HuggingFace-Modellgruppe. Öffnen Sie die Bibliothek, um alle Versionen im Raster zu sehen.",
"confirm": {
"delete": "Diese Version aus Ihrer Bibliothek löschen?"
@@ -1760,19 +1764,19 @@
},
"statistics": {
"title": "Statistiken werden initialisiert",
"message": "Modelldaten für Statistiken werden verarbeitet. Dies kann einige Minuten dauern..."
"message": "Metadaten für Statistiken werden verarbeitet. Dies kann einige Minuten dauern..."
},
"tips": {
"title": "Tipps & Tricks",
"civitai": {
"title": "Civitai-Integration",
"description": "Verbinden Sie Ihr Civitai-Konto: Besuchen Sie Profil-Avatar → Einstellungen → API-Schlüssel → API-Schlüssel hinzufügen, dann fügen Sie ihn in die LoRA Manager-Einstellungen ein.",
"alt": "Civitai API-Setup"
"title": "CivitAI-Integration",
"description": "Verbinden Sie Ihr CivitAI-Konto: Besuchen Sie Profil-Avatar → Einstellungen → API-Schlüssel → API-Schlüssel hinzufügen, dann fügen Sie ihn in die LoRA Manager-Einstellungen ein.",
"alt": "CivitAI API-Setup"
},
"download": {
"title": "Einfacher Download",
"description": "Verwenden Sie Civitai-URLs, um schnell neue Modelle herunterzuladen und zu installieren.",
"alt": "Civitai-Download"
"description": "Verwenden Sie CivitAI-URLs, um schnell neue Modelle herunterzuladen und zu installieren.",
"alt": "CivitAI-Download"
},
"recipes": {
"title": "Rezepte speichern",
@@ -1781,7 +1785,7 @@
},
"filter": {
"title": "Schnelle Filterung",
"description": "Filtern Sie Modelle nach Tags oder Basis-Modelltyp mit der Filter-Schaltfläche in der Kopfzeile.",
"description": "Filtern Sie Modelle nach Tags oder Basismodelltyp mit der Filter-Schaltfläche in der Kopfzeile.",
"alt": "Modelle filtern"
},
"search": {
@@ -1868,7 +1872,7 @@
"updateVlogs": {
"title": "Neueste Updates",
"watchOnYouTube": "Auf YouTube ansehen",
"playlistTitle": "LoRA Manager Updates Playlist",
"playlistTitle": "LoRA Manager-Update-Playlist",
"playlistDescription": "Sehen Sie alle Update-Videos mit den neuesten Funktionen und Verbesserungen."
},
"documentation": {
@@ -1956,7 +1960,7 @@
"submitGithubIssue": "GitHub Issue einreichen",
"joinDiscord": "Discord beitreten",
"youtubeChannel": "YouTube-Kanal",
"civitaiProfile": "Civitai-Profil",
"civitaiProfile": "CivitAI-Profil",
"supportKofi": "Auf Ko-fi unterstützen",
"supportPatreon": "Auf Patreon unterstützen"
},
@@ -2028,8 +2032,8 @@
"noRecipeId": "Keine Rezept-ID verfügbar",
"sendToWorkflowFailed": "Fehler beim Senden des Rezepts an den Workflow: {message}",
"copyFailed": "Fehler beim Kopieren der Rezept-Syntax: {message}",
"createError": "Fehler beim Erstellen des Rezepts{message}",
"createFailed": "Fehler beim Erstellen des Rezepts{error}",
"createError": "Fehler beim Erstellen des Rezepts: {message}",
"createFailed": "Fehler beim Erstellen des Rezepts: {error}",
"createMissingData": "Erforderliche Daten zum Erstellen des Rezepts fehlen",
"created": "Rezept erfolgreich erstellt",
"noMissingLoras": "Keine fehlenden LoRAs zum Herunterladen",
@@ -2064,18 +2068,18 @@
"processingError": "Verarbeitungsfehler: {message}",
"folderBrowserError": "Fehler beim Laden des Ordner-Browsers: {message}",
"recipeSaveFailed": "Fehler beim Speichern des Rezepts: {error}",
"recipeSaved": "Recipe saved successfully",
"recipeSaved": "Rezept erfolgreich gespeichert",
"importFailed": "Import fehlgeschlagen: {message}",
"folderTreeFailed": "Fehler beim Laden des Ordnerbaums",
"folderTreeError": "Fehler beim Laden des Ordnerbaums",
"batchImportFailed": "Failed to start batch import: {message}",
"batchImportCancelling": "Cancelling batch import...",
"batchImportCancelFailed": "Failed to cancel batch import: {message}",
"batchImportNoUrls": "Please enter at least one URL or file path",
"batchImportNoDirectory": "Please enter a directory path",
"batchImportRateLimited": "Ratenlimit des Metadaten-Anbieters erreicht — Anfragen werden verlangsamt und einige Einträge können übersprungen werden. Sie können den Import später erneut ausführen.",
"batchImportBrowseFailed": "Failed to browse directory: {message}",
"batchImportDirectorySelected": "Directory selected: {path}",
"batchImportFailed": "Massenimport konnte nicht gestartet werden: {message}",
"batchImportCancelling": "Massenimport wird abgebrochen...",
"batchImportCancelFailed": "Massenimport konnte nicht abgebrochen werden: {message}",
"batchImportNoUrls": "Bitte geben Sie mindestens eine URL oder einen Dateipfad ein",
"batchImportNoDirectory": "Bitte geben Sie einen Verzeichnispfad ein",
"batchImportRateLimited": "Ratenlimit des Metadatenanbieters erreicht — Anfragen werden verlangsamt und einige Elemente können übersprungen werden. Sie können den Import später erneut ausführen.",
"batchImportBrowseFailed": "Ordner konnte nicht durchsucht werden: {message}",
"batchImportDirectorySelected": "Verzeichnis ausgewählt: {path}",
"noRecipesSelected": "Keine Rezepte ausgewählt",
"repairBulkComplete": "Reparatur abgeschlossen: {repaired} repariert, {skipped} übersprungen (von {total})",
"repairBulkSkipped": "Keine Reparatur für die {total} ausgewählten Rezepte erforderlich",
@@ -2107,13 +2111,13 @@
"nameCannotBeEmpty": "Modellname darf nicht leer sein",
"nameUpdatedSuccessfully": "Modellname erfolgreich aktualisiert",
"nameUpdateFailed": "Fehler beim Aktualisieren des Modellnamens",
"baseModelUpdated": "Basis-Modell erfolgreich aktualisiert",
"baseModelUpdateFailed": "Fehler beim Aktualisieren des Basis-Modells",
"baseModelNotSelected": "Bitte ein Basis-Modell auswählen",
"bulkBaseModelUpdating": "Basis-Modell wird für {count} Modell(e) aktualisiert...",
"bulkBaseModelUpdateSuccess": "Basis-Modell erfolgreich für {count} Modell(e) aktualisiert",
"baseModelUpdated": "Basismodell erfolgreich aktualisiert",
"baseModelUpdateFailed": "Fehler beim Aktualisieren des Basismodells",
"baseModelNotSelected": "Bitte ein Basismodell auswählen",
"bulkBaseModelUpdating": "Basismodell wird für {count} Modell(e) aktualisiert...",
"bulkBaseModelUpdateSuccess": "Basismodell erfolgreich für {count} Modell(e) aktualisiert",
"bulkBaseModelUpdatePartial": "{success} Modelle aktualisiert, {failed} fehlgeschlagen",
"bulkBaseModelUpdateFailed": "Aktualisierung des Basis-Modells für ausgewählte Modelle fehlgeschlagen",
"bulkBaseModelUpdateFailed": "Aktualisierung des Basismodells für ausgewählte Modelle fehlgeschlagen",
"skipMetadataRefreshUpdating": "Aktualisiere Metadaten-Aktualisierungs-Flag für {count} Modell(e)...",
"skipMetadataRefreshSet": "Metadaten-Aktualisierung für {count} Modell(e) übersprungen",
"skipMetadataRefreshCleared": "Metadaten-Aktualisierung für {count} Modell(e) fortgesetzt",
@@ -2131,8 +2135,8 @@
"bulkUpdatesChecking": "Ausgewählte {type}-Modelle werden auf Updates geprüft...",
"bulkUpdatesSuccess": "Updates für {count} ausgewählte {type}-Modelle verfügbar",
"bulkUpdatesNone": "Keine Updates für ausgewählte {type}-Modelle gefunden",
"bulkUpdatesMissing": "Ausgewählte {type}-Modelle sind nicht mit Civitai-Updates verknüpft",
"bulkUpdatesPartialMissing": "{missing} ausgewählte {type}-Modelle ohne Civitai-Verknüpfung übersprungen",
"bulkUpdatesMissing": "Ausgewählte {type}-Modelle sind nicht mit CivitAI-Updates verknüpft",
"bulkUpdatesPartialMissing": "{missing} ausgewählte {type}-Modelle ohne CivitAI-Verknüpfung übersprungen",
"bulkUpdatesFailed": "Updates für ausgewählte {type}-Modelle konnten nicht geprüft werden: {message}",
"invalidCharactersRemoved": "Ungültige Zeichen aus Dateiname entfernt",
"filenameCannotBeEmpty": "Dateiname darf nicht leer sein",
@@ -2161,9 +2165,9 @@
"checkpointRootsFailed": "Fehler beim Laden der Checkpoint-Stammverzeichnisse: {message}",
"unetRootsFailed": "Fehler beim Laden der Diffusion-Modell-Stammverzeichnisse: {message}",
"embeddingRootsFailed": "Fehler beim Laden der Embedding-Stammverzeichnisse: {message}",
"mappingsUpdated": "Basis-Modell-Pfad-Zuordnungen aktualisiert ({count} Zuordnung{plural})",
"mappingsCleared": "Basis-Modell-Pfad-Zuordnungen gelöscht",
"mappingSaveFailed": "Fehler beim Speichern der Basis-Modell-Zuordnungen: {message}",
"mappingsUpdated": "Basismodell-Pfad-Zuordnungen aktualisiert ({count})",
"mappingsCleared": "Basismodell-Pfad-Zuordnungen gelöscht",
"mappingSaveFailed": "Fehler beim Speichern der Basismodell-Zuordnungen: {message}",
"downloadTemplatesUpdated": "Download-Pfad-Vorlagen aktualisiert",
"downloadTemplatesFailed": "Fehler beim Speichern der Download-Pfad-Vorlagen: {message}",
"recipesPathUpdated": "Rezepte-Speicherpfad aktualisiert",
@@ -2172,8 +2176,8 @@
"compactModeToggled": "Kompakt-Modus {state}",
"settingSaveFailed": "Fehler beim Speichern der Einstellung: {message}",
"displayDensitySet": "Anzeige-Dichte auf {density} gesetzt",
"libraryLoadFailed": "Failed to load libraries: {message}",
"libraryActivateFailed": "Failed to activate library: {message}",
"libraryLoadFailed": "Bibliotheken konnten nicht geladen werden: {message}",
"libraryActivateFailed": "Bibliothek konnte nicht aktiviert werden: {message}",
"languageChangeFailed": "Fehler beim Ändern der Sprache: {message}",
"cacheCleared": "Cache-Dateien wurden erfolgreich gelöscht. Cache wird bei der nächsten Aktion neu aufgebaut.",
"cacheClearFailed": "Fehler beim Löschen des Caches: {error}",
@@ -2258,7 +2262,7 @@
"contextMenu": {
"contentRatingSet": "Inhaltsbewertung auf {level} gesetzt",
"contentRatingFailed": "Fehler beim Setzen der Inhaltsbewertung: {message}",
"relinkSuccess": "Modell erfolgreich mit Civitai neu verknüpft",
"relinkSuccess": "Modell erfolgreich mit CivitAI neu verknüpft",
"relinkFailed": "Fehler: {message}",
"linkHfSuccess": "Modell erfolgreich mit HuggingFace verknüpft",
"linkHfFailed": "Fehler: {message}",
@@ -2322,7 +2326,7 @@
"bulkMoveSuccess": "{successCount} {type}s erfolgreich verschoben",
"exampleImagesDownloadSuccess": "Beispielbilder erfolgreich heruntergeladen!",
"exampleImagesDownloadFailed": "Fehler beim Herunterladen der Beispielbilder: {message}",
"moveFailed": "Failed to move item: {message}",
"moveFailed": "Element konnte nicht verschoben werden: {message}",
"copiedToClipboard": "In die Zwischenablage kopiert",
"downloadStarted": "Download gestartet"
},
@@ -2338,7 +2342,7 @@
"title": "Doktor",
"buttonTitle": "Diagnose und häufige Fehlerbehebungen ausführen",
"loading": "Umgebung wird geprüft...",
"footer": "Exportiere ein Diagnosepaket, falls das Problem nach der Reparatur weiterhin besteht.",
"footer": "Exportieren Sie ein Diagnosepaket, falls das Problem nach der Reparatur weiterhin besteht.",
"summary": {
"idle": "Führe eine Überprüfung von Einstellungen, Cache-Integrität und UI-Konsistenz durch.",
"ok": "Keine aktiven Probleme wurden in der aktuellen Umgebung gefunden.",
@@ -2352,29 +2356,29 @@
},
"issues": {
"civitai_api_key": {
"title": "Civitai API Key"
"title": "CivitAI-API-Schlüssel"
},
"cache_health": {
"title": "Model Cache Health"
"title": "Zustand des Modell-Caches"
},
"filename_conflicts": {
"title": "Duplicate Filename Conflicts"
"title": "Konflikte durch doppelte Dateinamen"
},
"ui_version": {
"title": "UI Version"
"title": "UI-Version"
}
},
"actions": {
"runAgain": "Erneut ausführen",
"exportBundle": "Paket exportieren",
"open-settings": "Open Settings",
"open-settings-syntax-format": "Switch to Full Path Syntax",
"repair-cache": "Rebuild Cache",
"resolve-filename-conflicts": "Resolve Conflicts",
"reload-page": "Reload UI"
"open-settings": "Einstellungen öffnen",
"open-settings-syntax-format": "Zur Vollpfad-Syntax wechseln",
"repair-cache": "Cache neu aufbauen",
"resolve-filename-conflicts": "Konflikte auflösen",
"reload-page": "UI neu laden"
},
"labels": {
"conflicts": "Conflicts",
"conflicts": "Konflikte",
"version": "Version"
},
"toast": {
@@ -2405,10 +2409,10 @@
"seconds": "Sekunden"
},
"communitySupport": {
"title": "Keep LoRA Manager Thriving with Your Support ❤️",
"content": "LoRA Manager is a passion project maintained full-time by a solo developer. Your support on Ko-fi helps cover development costs, keeps new updates coming, and unlocks a license key for the LM Civitai Extension as a thank-you gift. Every contribution truly makes a difference.",
"supportCta": "Support on Ko-fi",
"learnMore": "LM Civitai Extension Tutorial"
"title": "Halten Sie LoRA Manager mit Ihrer Unterstützung am Leben ❤️",
"content": "LoRA Manager ist ein Herzensprojekt, das in Vollzeit von einem einzelnen Entwickler gepflegt wird. Ihre Unterstützung auf Ko-fi deckt Entwicklungskosten, ermöglicht neue Updates und gibt Ihnen als Dankeschön einen Lizenzschlüssel für die LM CivitAI-Erweiterung. Jeder Beitrag macht einen echten Unterschied.",
"supportCta": "Auf Ko-fi unterstützen",
"learnMore": "Tutorial zur LM CivitAI-Erweiterung"
},
"cacheHealth": {
"corrupted": {
+55 -51
View File
@@ -67,11 +67,11 @@
"steps": {
"fetch": {
"title": "Fetch Models Metadata",
"content": "Click the <strong>Fetch</strong> button to download model metadata and preview images from Civitai."
"content": "Click the <strong>Fetch</strong> button to download model metadata and preview images from CivitAI."
},
"download": {
"title": "Download New Models",
"content": "Use the <strong>Download</strong> button to download models directly from Civitai URLs."
"content": "Use the <strong>Download</strong> button to download models directly from CivitAI URLs."
},
"bulk": {
"title": "Bulk Operations",
@@ -103,8 +103,8 @@
"actions": {
"addToFavorites": "Add to favorites",
"removeFromFavorites": "Remove from favorites",
"viewOnCivitai": "View on Civitai",
"notAvailableFromCivitai": "Not available from Civitai",
"viewOnCivitai": "View on CivitAI",
"notAvailableFromCivitai": "Not available from CivitAI",
"viewOnHuggingFace": "View on Hugging Face",
"sendToWorkflow": "Send to ComfyUI (Click: Append, Shift+Click: Replace)",
"copyLoRASyntax": "Copy LoRA Syntax",
@@ -137,7 +137,7 @@
"exampleImages": {
"checkError": "Error checking for example images",
"missingHash": "Missing model hash information.",
"noRemoteImagesAvailable": "No remote example images available for this model on Civitai"
"noRemoteImagesAvailable": "No remote example images available for this model on CivitAI"
},
"badges": {
"update": "Update",
@@ -290,15 +290,15 @@
}
},
"settings": {
"civitaiApiKey": "Civitai API Key",
"civitaiApiKeyPlaceholder": "Enter your Civitai API key",
"civitaiApiKeyHelp": "Used for authentication when downloading models from Civitai",
"civitaiApiKey": "CivitAI API Key",
"civitaiApiKeyPlaceholder": "Enter your CivitAI API key",
"civitaiApiKeyHelp": "Used for authentication when downloading models from CivitAI",
"civitaiApiKeyConfigured": "Configured",
"civitaiApiKeyNotConfigured": "Not configured",
"civitaiApiKeySet": "Set up",
"civitaiHost": {
"label": "Civitai host",
"help": "Choose which Civitai site opens when using View on Civitai links.",
"label": "CivitAI host",
"help": "Choose which CivitAI site opens when using View on CivitAI links.",
"options": {
"com": "civitai.com (SFW)",
"red": "civitai.red (unrestricted)"
@@ -319,8 +319,8 @@
},
"aria2HelpLink": "Learn how to set up the aria2 download backend",
"civitaiHostBanner": {
"title": "Civitai host preference available",
"content": "Civitai now uses civitai.com for SFW content and civitai.red for unrestricted content. You can change which site opens by default in Settings.",
"title": "CivitAI host preference available",
"content": "CivitAI now uses civitai.com for SFW content and civitai.red for unrestricted content. You can change which site opens by default in Settings.",
"openSettings": "Open Settings"
},
"openSettingsFileLocation": {
@@ -450,7 +450,7 @@
},
"layoutSettings": {
"groupByModel": "Group by Model",
"groupByModelHelp": "When enabled, only the latest version of each Civitai model is shown as a single card. Older versions are hidden.",
"groupByModelHelp": "When enabled, only the latest version of each CivitAI model is shown as a single card. Older versions are hidden.",
"displayDensity": "Display Density",
"displayDensityOptions": {
"default": "Default",
@@ -555,7 +555,7 @@
},
"downloadPathTemplates": {
"title": "Download Path Templates",
"help": "Configure folder structures for different model types when downloading from Civitai.",
"help": "Configure folder structures for different model types when downloading from CivitAI.",
"availablePlaceholders": "Available placeholders:",
"templateOptions": {
"flatStructure": "Flat Structure",
@@ -592,7 +592,7 @@
"exampleImages": {
"downloadLocation": "Download Location",
"downloadLocationPlaceholder": "Enter folder path for example images",
"downloadLocationHelp": "Enter the folder path where example images from Civitai will be saved",
"downloadLocationHelp": "Enter the folder path where example images from CivitAI will be saved",
"autoDownload": "Auto Download Example Images",
"autoDownloadHelp": "Automatically download example images for models that don't have them (requires download location to be set)",
"openMode": "Open Example Images Action",
@@ -647,7 +647,7 @@
},
"metadataArchive": {
"enableArchiveDb": "Enable Metadata Archive Database",
"enableArchiveDbHelp": "Use a local database to access metadata for models that have been deleted from Civitai.",
"enableArchiveDbHelp": "Use a local database to access metadata for models that have been deleted from CivitAI.",
"status": "Status",
"statusAvailable": "Available",
"statusUnavailable": "Not Available",
@@ -750,7 +750,7 @@
"fullTooltip": "Reload all model details from metadata files—use if the library looks out of date or after manual edits."
},
"fetch": {
"title": "Fetch metadata from Civitai",
"title": "Fetch metadata from CivitAI",
"action": "Fetch"
},
"download": {
@@ -825,10 +825,10 @@
"enrichHfAgent": "Enrich HF Metadata (AI)"
},
"contextMenu": {
"refreshMetadata": "Refresh Civitai Data",
"refreshMetadata": "Refresh CivitAI Data",
"checkUpdates": "Check Updates",
"linkModel": "Link Model",
"linkCivitai": "Link to Civitai",
"linkCivitai": "Link to CivitAI",
"linkHuggingFace": "Link to HuggingFace",
"copySyntax": "Copy LoRA Syntax",
"copyFilename": "Copy Model Filename",
@@ -860,6 +860,7 @@
"actions": {
"sendCheckpoint": "Send to ComfyUI",
"sendRecipe": "Send to ComfyUI",
"copyRecipeSyntax": "Copy Recipe Syntax",
"deleteRecipeWithShortcut": "Delete recipe (Del)"
},
"navigation": {
@@ -883,7 +884,10 @@
"loraStatus": {
"none": "No LoRAs in this recipe",
"allAvailable": "All LoRAs available - Ready to use",
"missing": "{missing} of {total} LoRAs missing"
"missing": "{missing} of {total} LoRAs missing",
"missingAndUnavailable": "{missing} of {total} LoRAs missing, {unavailable} unavailable (deleted from source or unresolvable hash)",
"partial": "{unavailable} of {total} LoRAs unavailable (deleted from source or unresolvable hash) - skipped when recipe is used",
"noneUsable": "No usable LoRAs - {unavailable} of {total} deleted from source or unresolvable hash"
},
"resources": {
"inLibrary": "In Library",
@@ -899,7 +903,7 @@
"preparingDownload": "Preparing download...",
"reconnect": "Reconnect",
"reconnectTooltip": "Reconnect with a local LoRA",
"viewOnCivitai": "View on Civitai",
"viewOnCivitai": "View on CivitAI",
"openLoraDetails": "View {name} in the LoRA library",
"openCheckpointDetails": "View {name} in the model library"
},
@@ -940,7 +944,7 @@
"downloadingLoras": "Downloading LoRAs...",
"savingRecipe": "Saving recipe...",
"startingDownload": "Starting download for LoRA {current}/{total}",
"deletedFromCivitai": "Deleted from Civitai",
"deletedFromCivitai": "Deleted from CivitAI",
"inLibrary": "In Library",
"notInLibrary": "Not in Library",
"earlyAccessRequired": "This LoRA requires early access payment to download.",
@@ -1268,7 +1272,7 @@
"download": {
"title": "Download Model from URL",
"titleWithType": "Download {type} from URL",
"civitaiUrl": "Civitai URL(s):",
"civitaiUrl": "CivitAI URL(s):",
"placeholder": "https://civitai.com/models/...",
"urlHint": "Enter one CivitAI, CivArchive, or Hugging Face URL per line. Supports multiple URLs for batch download.",
"selectHfFiles": "Select file(s) to download from this repository:",
@@ -1303,7 +1307,7 @@
"inLibrary": "In Library"
},
"errors": {
"invalidUrl": "Invalid Civitai URL format",
"invalidUrl": "Invalid CivitAI URL format",
"noVersions": "No versions available for this model",
"mixedSources": "Cannot mix CivitAI and Hugging Face URLs in the same batch.",
"noModelFiles": "No model files found in this repository."
@@ -1417,7 +1421,7 @@
"title": "Local Example Images",
"message": "No local example images found for this model. View options:",
"downloadOption": {
"title": "Download from Civitai",
"title": "Download from CivitAI",
"description": "Save remote examples locally for offline use and faster loading"
},
"importOption": {
@@ -1444,7 +1448,7 @@
"confirmAction": "Save & Link"
},
"relinkCivitai": {
"title": "Re-link to Civitai",
"title": "Re-link to CivitAI",
"warning": "Warning:",
"warningText": "This is a potentially destructive operation. Re-linking will:",
"warningList": {
@@ -1453,15 +1457,15 @@
"unintendedConsequences": "May have other unintended consequences"
},
"proceedText": "Only proceed if you're sure this is what you want.",
"urlLabel": "Civitai Model URL:",
"urlLabel": "CivitAI Model URL:",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890 or https://civitai.red/models/12345/model-name?modelVersionId=67890",
"helpText": {
"title": "Paste any Civitai or CivitArchive model URL. Supported formats:",
"title": "Paste any CivitAI or CivitArchive model URL. Supported formats:",
"format1": "https://civitai.com/models/12345",
"format2": "https://civitai.com/models/12345?modelVersionId=67890",
"format3": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"note": "Note: If no modelVersionId is provided, the latest version will be used.",
"format4": "https://civarchive.com/models/12345 (CivitArchive)"
"format4": "https://civarchive.com/models/12345 (CivArchive)"
},
"confirmAction": "Confirm Re-link"
},
@@ -1471,8 +1475,8 @@
"editFileName": "Edit file name",
"editBaseModel": "Edit base model",
"editVersionName": "Edit version name",
"viewOnCivitai": "View on Civitai",
"viewOnCivitaiText": "View on Civitai",
"viewOnCivitai": "View on CivitAI",
"viewOnCivitaiText": "View on CivitAI",
"viewOnHuggingFace": "View on Hugging Face",
"viewOnHuggingFaceText": "View on Hugging Face",
"viewCreatorProfile": "View Creator Profile",
@@ -1574,7 +1578,7 @@
},
"license": {
"noImageSell": "No selling generated content",
"noRentCivit": "No Civitai generation",
"noRentCivit": "No CivitAI generation",
"noRent": "No generation services",
"noSell": "No selling models",
"creditRequired": "Creator credit required",
@@ -1639,28 +1643,28 @@
"newer": "Newer Version",
"newerTooltip": "This version is newer than your latest local version",
"earlyAccess": "Early Access",
"earlyAccessTooltip": "This version currently requires Civitai early access",
"earlyAccessTooltip": "This version currently requires CivitAI early access",
"paid": "Paid",
"paidTooltip": "This version requires payment to download",
"ignored": "Ignored",
"ignoredTooltip": "Update notifications are disabled for this version",
"onSiteOnly": "On-Site Only",
"onSiteOnlyTooltip": "This version is only available for on-site generation on Civitai"
"onSiteOnlyTooltip": "This version is only available for on-site generation on CivitAI"
},
"actions": {
"download": "Download",
"downloadTooltip": "Download this version",
"downloadChooseFilesTooltip": "Choose which files to download",
"downloadEarlyAccessTooltip": "Download this early access version from Civitai",
"downloadPaidTooltip": "Download this paid version from Civitai",
"downloadNotAllowedTooltip": "This version is only available for on-site generation on Civitai",
"downloadEarlyAccessTooltip": "Download this early access version from CivitAI",
"downloadPaidTooltip": "Download this paid version from CivitAI",
"downloadNotAllowedTooltip": "This version is only available for on-site generation on CivitAI",
"delete": "Delete",
"deleteTooltip": "Delete this local version",
"ignore": "Ignore",
"unignore": "Unignore",
"ignoreTooltip": "Ignore update notifications for this version",
"unignoreTooltip": "Resume update notifications for this version",
"viewVersionOnCivitai": "View version on Civitai",
"viewVersionOnCivitai": "View version on CivitAI",
"earlyAccessTooltip": "Requires early access purchase",
"resumeModelUpdates": "Resume updates for this model",
"ignoreModelUpdates": "Ignore updates for this model",
@@ -1681,7 +1685,7 @@
},
"empty": "No version history available for this model yet.",
"error": "Failed to load versions.",
"missingModelId": "This model is missing a Civitai model id.",
"missingModelId": "This model is missing a CivitAI model id.",
"hfGroupInfo": "This is a HuggingFace model group. Open the library to see all versions in the grid.",
"confirm": {
"delete": "Delete this version from your library?"
@@ -1765,14 +1769,14 @@
"tips": {
"title": "Tips & Tricks",
"civitai": {
"title": "Civitai Integration",
"description": "Connect your Civitai account: Visit Profile Avatar → Settings → API Keys → Add API Key, then paste it in Lora Manager settings.",
"alt": "Civitai API Setup"
"title": "CivitAI Integration",
"description": "Connect your CivitAI account: Visit Profile Avatar → Settings → API Keys → Add API Key, then paste it in Lora Manager settings.",
"alt": "CivitAI API Setup"
},
"download": {
"title": "Easy Download",
"description": "Use Civitai URLs to quickly download and install new models.",
"alt": "Civitai Download"
"description": "Use CivitAI URLs to quickly download and install new models.",
"alt": "CivitAI Download"
},
"recipes": {
"title": "Save Recipes",
@@ -1956,7 +1960,7 @@
"submitGithubIssue": "Submit GitHub Issue",
"joinDiscord": "Join Discord",
"youtubeChannel": "YouTube Channel",
"civitaiProfile": "Civitai Profile",
"civitaiProfile": "CivitAI Profile",
"supportKofi": "Support on Ko-fi",
"supportPatreon": "Support on Patreon"
},
@@ -2131,8 +2135,8 @@
"bulkUpdatesChecking": "Checking selected {type}(s) for updates...",
"bulkUpdatesSuccess": "Updates available for {count} selected {type}(s)",
"bulkUpdatesNone": "No updates found for selected {type}(s)",
"bulkUpdatesMissing": "Selected {type}(s) are not linked to Civitai updates",
"bulkUpdatesPartialMissing": "Skipped {missing} selected {type}(s) without Civitai links",
"bulkUpdatesMissing": "Selected {type}(s) are not linked to CivitAI updates",
"bulkUpdatesPartialMissing": "Skipped {missing} selected {type}(s) without CivitAI links",
"bulkUpdatesFailed": "Failed to check updates for selected {type}(s): {message}",
"invalidCharactersRemoved": "Invalid characters removed from filename",
"filenameCannotBeEmpty": "File name cannot be empty",
@@ -2258,7 +2262,7 @@
"contextMenu": {
"contentRatingSet": "Content rating set to {level}",
"contentRatingFailed": "Failed to set content rating: {message}",
"relinkSuccess": "Model successfully re-linked to Civitai",
"relinkSuccess": "Model successfully re-linked to CivitAI",
"relinkFailed": "Error: {message}",
"linkHfSuccess": "Model successfully linked to HuggingFace",
"linkHfFailed": "Error: {message}",
@@ -2352,7 +2356,7 @@
},
"issues": {
"civitai_api_key": {
"title": "Civitai API Key"
"title": "CivitAI API Key"
},
"cache_health": {
"title": "Model Cache Health"
@@ -2406,9 +2410,9 @@
},
"communitySupport": {
"title": "Keep LoRA Manager Thriving with Your Support ❤️",
"content": "LoRA Manager is a passion project maintained full-time by a solo developer. Your support on Ko-fi helps cover development costs, keeps new updates coming, and unlocks a license key for the LM Civitai Extension as a thank-you gift. Every contribution truly makes a difference.",
"content": "LoRA Manager is a passion project maintained full-time by a solo developer. Your support on Ko-fi helps cover development costs, keeps new updates coming, and unlocks a license key for the LM CivitAI Extension as a thank-you gift. Every contribution truly makes a difference.",
"supportCta": "Support on Ko-fi",
"learnMore": "LM Civitai Extension Tutorial"
"learnMore": "LM CivitAI Extension Tutorial"
},
"cacheHealth": {
"corrupted": {
+202 -198
View File
@@ -67,15 +67,15 @@
"steps": {
"fetch": {
"title": "Obtener metadatos de modelos",
"content": "Haz clic en el botón <strong>Obtener</strong> para descargar metadatos y vistas previas de modelos desde Civitai."
"content": "Haz clic en el botón <strong>Obtener</strong> para descargar metadatos y vistas previas de modelos desde CivitAI."
},
"download": {
"title": "Descargar nuevos modelos",
"content": "Usa el botón <strong>Descargar</strong> para descargar modelos directamente desde URLs de Civitai."
"content": "Usa el botón <strong>Descargar</strong> para descargar modelos directamente desde URLs de CivitAI."
},
"bulk": {
"title": "Operaciones masivas",
"content": "Entra en modo masivo haciendo clic en este botón o presionando <span class=\"onboarding-shortcut\">B</span>. Selecciona varios modelos y realiza operaciones por lotes. Usa <span class=\"onboarding-shortcut\">Ctrl+A</span> para seleccionar todos los modelos visibles."
"title": "Operaciones por lotes",
"content": "Entra en el modo por lotes haciendo clic en este botón o presionando <span class=\"onboarding-shortcut\">B</span>. Selecciona varios modelos y realiza operaciones por lotes. Usa <span class=\"onboarding-shortcut\">Ctrl+A</span> para seleccionar todos los modelos visibles."
},
"searchOptions": {
"title": "Opciones de búsqueda",
@@ -103,8 +103,8 @@
"actions": {
"addToFavorites": "Añadir a favoritos",
"removeFromFavorites": "Eliminar de favoritos",
"viewOnCivitai": "Ver en Civitai",
"notAvailableFromCivitai": "No disponible en Civitai",
"viewOnCivitai": "Ver en CivitAI",
"notAvailableFromCivitai": "No disponible en CivitAI",
"viewOnHuggingFace": "Ver en Hugging Face",
"sendToWorkflow": "Enviar a ComfyUI (Clic: Añadir, Shift+Clic: Reemplazar)",
"copyLoRASyntax": "Copiar sintaxis de LoRA",
@@ -131,13 +131,13 @@
"updateFailed": "Error al actualizar estado de favoritos"
},
"sendToWorkflow": {
"checkpointNotImplemented": "Enviar checkpoint al flujo de trabajo - función por implementar",
"checkpointNotImplemented": "Enviar checkpoint al workflow - función por implementar",
"missingPath": "No se puede determinar la ruta del modelo para esta tarjeta"
},
"exampleImages": {
"checkError": "Error al verificar imágenes de ejemplo",
"missingHash": "Falta información del hash del modelo.",
"noRemoteImagesAvailable": "No hay imágenes de ejemplo remotas disponibles para este modelo en Civitai"
"noRemoteImagesAvailable": "No hay imágenes de ejemplo remotas disponibles para este modelo en CivitAI"
},
"badges": {
"update": "Actualización",
@@ -173,11 +173,11 @@
"error": "No se pudieron limpiar las carpetas de imágenes de ejemplo: {message}"
},
"fetchMissingLicenses": {
"label": "Refresh license metadata",
"loading": "Refreshing license metadata for {typePlural}...",
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
"label": "Actualizar metadatos de licencia",
"loading": "Actualizando metadatos de licencia de los {typePlural}...",
"success": "Metadatos de licencia actualizados para {count} {typePlural}",
"none": "Todos los {typePlural} ya tienen metadatos de licencia",
"error": "No se pudieron actualizar los metadatos de licencia de los {typePlural}: {message}"
},
"repairRecipes": {
"label": "Reparar datos de recetas",
@@ -290,15 +290,15 @@
}
},
"settings": {
"civitaiApiKey": "Clave API de Civitai",
"civitaiApiKeyPlaceholder": "Introduce tu clave API de Civitai",
"civitaiApiKeyHelp": "Utilizada para autenticación al descargar modelos de Civitai",
"civitaiApiKey": "Clave API de CivitAI",
"civitaiApiKeyPlaceholder": "Introduce tu clave API de CivitAI",
"civitaiApiKeyHelp": "Utilizada para autenticación al descargar modelos de CivitAI",
"civitaiApiKeyConfigured": "Configurado",
"civitaiApiKeyNotConfigured": "No configurado",
"civitaiApiKeySet": "Configurar",
"civitaiHost": {
"label": "Host de Civitai",
"help": "Elige qué sitio de Civitai se abre al usar los enlaces de \"View on Civitai\".",
"label": "Host de CivitAI",
"help": "Elige qué sitio de CivitAI se abre al usar los enlaces de \"View on CivitAI\".",
"options": {
"com": "civitai.com (solo SFW)",
"red": "civitai.red (sin restricciones)"
@@ -319,8 +319,8 @@
},
"aria2HelpLink": "Aprende a configurar el backend de descarga aria2",
"civitaiHostBanner": {
"title": "Preferencia de host de Civitai disponible",
"content": "Civitai ahora usa civitai.com para contenido SFW y civitai.red para contenido sin restricciones. Puedes cambiar en Ajustes qué sitio se abre por defecto.",
"title": "Preferencia de host de CivitAI disponible",
"content": "CivitAI ahora usa civitai.com para contenido SFW y civitai.red para contenido sin restricciones. Puedes cambiar en Ajustes qué sitio se abre por defecto.",
"openSettings": "Abrir ajustes"
},
"openSettingsFileLocation": {
@@ -428,7 +428,7 @@
},
"downloadSkipBaseModels": {
"label": "Omitir descargas para modelos base",
"help": "Se aplica a todos los flujos de descarga. Aquí solo se pueden seleccionar modelos base compatibles.",
"help": "Cuando está activado, se omitirán las versiones que usen los modelos base seleccionados.",
"searchPlaceholder": "Filtrar modelos base...",
"empty": "Ningún modelo base coincide con la búsqueda actual.",
"summary": {
@@ -450,7 +450,7 @@
},
"layoutSettings": {
"groupByModel": "Agrupar por modelo",
"groupByModelHelp": "Cuando está activado, solo se muestra la versión más reciente de cada modelo de Civitai como una tarjeta única. Las versiones anteriores están ocultas.",
"groupByModelHelp": "Cuando está activado, solo se muestra la versión más reciente de cada modelo de CivitAI como una tarjeta única. Las versiones anteriores están ocultas.",
"displayDensity": "Densidad de visualización",
"displayDensityOptions": {
"default": "Predeterminado",
@@ -517,7 +517,7 @@
"extraFolderPaths": {
"title": "Rutas de carpetas adicionales",
"description": "Rutas raíz de modelos adicionales exclusivas para LoRA Manager. Cargue modelos desde ubicaciones fuera de las carpetas estándar de ComfyUI, ideal para bibliotecas grandes que de otro modo ralentizarían ComfyUI.",
"restartRequired": "Requires restart to take effect",
"restartRequired": "Requiere reiniciar para que surta efecto",
"modelTypes": {
"lora": "Rutas de LoRA",
"checkpoint": "Rutas de Checkpoint",
@@ -555,7 +555,7 @@
},
"downloadPathTemplates": {
"title": "Plantillas de rutas de descarga",
"help": "Configurar estructuras de carpetas para diferentes tipos de modelos al descargar de Civitai.",
"help": "Configurar estructuras de carpetas para diferentes tipos de modelos al descargar de CivitAI.",
"availablePlaceholders": "Marcadores de posición disponibles:",
"templateOptions": {
"flatStructure": "Estructura plana",
@@ -592,7 +592,7 @@
"exampleImages": {
"downloadLocation": "Ubicación de descarga",
"downloadLocationPlaceholder": "Introduce la ruta de la carpeta para imágenes de ejemplo",
"downloadLocationHelp": "Introduce la ruta de la carpeta donde se guardarán las imágenes de ejemplo de Civitai",
"downloadLocationHelp": "Introduce la ruta de la carpeta donde se guardarán las imágenes de ejemplo de CivitAI",
"autoDownload": "Descargar automáticamente imágenes de ejemplo",
"autoDownloadHelp": "Descargar automáticamente imágenes de ejemplo para modelos que no las tengan (requiere que se establezca la ubicación de descarga)",
"openMode": "Acción al abrir imágenes de ejemplo",
@@ -625,7 +625,7 @@
},
"hideEarlyAccessUpdates": {
"label": "Ocultar actualizaciones de acceso temprano",
"help": "Solo actualizaciones de acceso temprano"
"help": "Cuando está activado, los modelos que solo tengan actualizaciones de acceso temprano no mostrarán la insignia «Actualización disponible»."
},
"hidePaidUpdates": {
"label": "Ocultar actualizaciones de pago",
@@ -636,8 +636,8 @@
"useNewStyleHelp": "Mostrar permisos de licencia con indicadores de color (nuevo estilo) o solo iconos de restricción (estilo clásico). Refleja el diseño actual de CivitAI."
},
"misc": {
"includeTriggerWords": "Incluir palabras clave en la sintaxis de LoRA",
"includeTriggerWordsHelp": "Incluir palabras clave entrenadas al copiar la sintaxis de LoRA al portapapeles",
"includeTriggerWords": "Incluir palabras de activación en la sintaxis de LoRA",
"includeTriggerWordsHelp": "Incluir palabras de activación entrenadas al copiar la sintaxis de LoRA al portapapeles",
"loraSyntaxFormat": "Formato de sintaxis LoRA",
"loraSyntaxFormatHelp": "Formato de sintaxis LoRA. El formato completo incluye la ruta de la subcarpeta (<lora:style/anime/x:1.0>) para una resolución de modelo sin pérdidas. El formato heredado usa solo el nombre del archivo (<lora:x:1.0>) — convención A1111, puede ser ambiguo con nombres de archivo duplicados entre carpetas.",
"loraSyntaxFormatOptions": {
@@ -647,7 +647,7 @@
},
"metadataArchive": {
"enableArchiveDb": "Habilitar base de datos de archivo de metadatos",
"enableArchiveDbHelp": "Utiliza una base de datos local para acceder a metadatos de modelos que han sido eliminados de Civitai.",
"enableArchiveDbHelp": "Utiliza una base de datos local para acceder a metadatos de modelos que han sido eliminados de CivitAI.",
"status": "Estado",
"statusAvailable": "Disponible",
"statusUnavailable": "No disponible",
@@ -708,7 +708,7 @@
"custom": "Personalizado (compatible con OpenAI)"
},
"apiBase": "URL base de la API",
"apiBaseHelp": "La URL base para la API LLM (p.ej. https://api.openai.com/v1). Déjelo vacío para usar el valor predeterminado del proveedor.",
"apiBaseHelp": "La URL base para la API LLM. Seleccione un preajuste o introduzca una URL personalizada. El menú desplegable muestra los preajustes de todos los proveedores compatibles.",
"apiBasePlaceholder": "https://api.openai.com/v1",
"apiKey": "Clave de API",
"apiKeyHelp": "Su clave de API del proveedor LLM. Se almacena localmente y nunca se envía a ningún servidor excepto a su proveedor LLM elegido.",
@@ -750,7 +750,7 @@
"fullTooltip": "Vuelve a cargar todos los detalles desde los archivos de metadatos; úsalo si la biblioteca parece desactualizada o tras ediciones manuales."
},
"fetch": {
"title": "Obtener metadatos de Civitai",
"title": "Obtener metadatos de CivitAI",
"action": "Obtener"
},
"download": {
@@ -758,8 +758,8 @@
"action": "Descargar"
},
"bulk": {
"title": "Operaciones masivas",
"action": "Masivo"
"title": "Operaciones por lotes",
"action": "Por lotes"
},
"duplicates": {
"title": "Buscar duplicados",
@@ -803,8 +803,8 @@
"downloadMissingExamples": "Descargar faltantes",
"reprocessExamples": "Reprocesar todo",
"clear": "Limpiar selección",
"skipMetadataRefreshCount": "Omitir{count} modelos",
"resumeMetadataRefreshCount": "Reanudar{count} modelos",
"skipMetadataRefreshCount": "Omitir({count} modelos)",
"resumeMetadataRefreshCount": "Reanudar({count} modelos)",
"sendToWorkflow": "Enviar al workflow",
"sections": {
"workflow": "Workflow",
@@ -825,16 +825,16 @@
"enrichHfAgent": "Enriquecer metadatos HF (IA)"
},
"contextMenu": {
"refreshMetadata": "Actualizar datos de Civitai",
"refreshMetadata": "Actualizar datos de CivitAI",
"checkUpdates": "Comprobar actualizaciones",
"linkModel": "Vincular modelo",
"linkCivitai": "Re-vincular a Civitai",
"linkCivitai": "Re-vincular a CivitAI",
"linkHuggingFace": "Vincular a HuggingFace",
"copySyntax": "Copiar sintaxis de LoRA",
"copyFilename": "Copiar nombre de archivo del modelo",
"copyRecipeSyntax": "Copiar sintaxis de receta",
"sendToWorkflowAppend": "Enviar al flujo de trabajo (Añadir)",
"sendToWorkflowReplace": "Enviar al flujo de trabajo (Reemplazar)",
"sendToWorkflowAppend": "Enviar al workflow (Añadir)",
"sendToWorkflowReplace": "Enviar al workflow (Reemplazar)",
"openExamples": "Abrir carpeta de ejemplos",
"downloadExamples": "Descargar imágenes de ejemplo",
"downloadMissingExamples": "Descargar faltantes",
@@ -860,6 +860,7 @@
"actions": {
"sendCheckpoint": "Enviar a ComfyUI",
"sendRecipe": "Enviar a ComfyUI",
"copyRecipeSyntax": "Copiar sintaxis de receta",
"deleteRecipeWithShortcut": "Eliminar receta (Del)"
},
"navigation": {
@@ -883,7 +884,10 @@
"loraStatus": {
"none": "No hay LoRAs en esta receta",
"allAvailable": "Todos los LoRAs disponibles - Listo para usar",
"missing": "Faltan {missing} de {total} LoRAs"
"missing": "Faltan {missing} de {total} LoRAs",
"missingAndUnavailable": "Faltan {missing} de {total} LoRAs, {unavailable} no disponibles (eliminados de la fuente o hash no resoluble)",
"partial": "{unavailable} de {total} LoRAs no disponibles (eliminados de la fuente o hash no resoluble) - se omiten al usar la receta",
"noneUsable": "No hay LoRAs utilizables - {unavailable} de {total} eliminados de la fuente o hash no resoluble"
},
"resources": {
"inLibrary": "En la biblioteca",
@@ -896,10 +900,10 @@
"hashInvalidTooltip": "Este hash de LoRA no se puede resolver en CivitAI - el modelo puede haber sido actualizado",
"download": "Descargar",
"downloadLoraTooltip": "Descargar este LoRA",
"preparingDownload": "Preparando descarga",
"preparingDownload": "Preparando descarga...",
"reconnect": "Reconectar",
"reconnectTooltip": "Reconectar con un LoRA local",
"viewOnCivitai": "Ver en Civitai",
"viewOnCivitai": "Ver en CivitAI",
"openLoraDetails": "Ver {name} en la biblioteca de LoRAs",
"openCheckpointDetails": "Ver {name} en la biblioteca de modelos"
},
@@ -911,7 +915,7 @@
"dropZoneHint": "Arrastra y suelta una imagen aquí, pégala desde el portapapeles o haz clic para examinar",
"orDivider": "o arrastra y suelta / pega una imagen",
"imageUrlOrPath": "URL de imagen o ruta de archivo:",
"urlPlaceholder": "https://civitai.com/images/... o C:/ruta/a/imagen.png",
"urlPlaceholder": "https://civitai.com/images/... o https://civitai.red/images/... o C:/ruta/a/imagen.png",
"fetchImage": "Obtener imagen",
"recipeName": "Nombre de receta",
"recipeNamePlaceholder": "Introduce nombre de receta",
@@ -940,7 +944,7 @@
"downloadingLoras": "Descargando LoRAs...",
"savingRecipe": "Guardando receta...",
"startingDownload": "Iniciando descarga para LoRA {current}/{total}",
"deletedFromCivitai": "Eliminado de Civitai",
"deletedFromCivitai": "Eliminado de CivitAI",
"inLibrary": "En la biblioteca",
"notInLibrary": "No en la biblioteca",
"earlyAccessRequired": "Este LoRA requiere pago de acceso temprano para descargar.",
@@ -1013,7 +1017,7 @@
},
"sendRecipe": {
"missingId": "No se puede enviar la receta: Falta ID de receta",
"failed": "Error al enviar receta al flujo de trabajo"
"failed": "Error al enviar receta al workflow"
},
"viewLoras": {
"missingId": "No se pueden ver LoRAs: Falta ID de receta",
@@ -1042,63 +1046,63 @@
}
},
"batchImport": {
"title": "Batch Import Recipes",
"action": "Batch Import",
"urlList": "URL List",
"directory": "Directory",
"urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.",
"directoryDescription": "Enter a directory path to import all images from that folder.",
"urlsLabel": "Image URLs or Local Paths",
"title": "Importación por lotes de recetas",
"action": "Importar por lotes",
"urlList": "Lista de URL",
"directory": "Directorio",
"urlDescription": "Introduzca URL de imágenes o rutas de archivo locales (una por línea). Cada una se importará como receta.",
"directoryDescription": "Introduzca una ruta de directorio para importar todas las imágenes de esa carpeta.",
"urlsLabel": "URL de imágenes o rutas locales",
"urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "Enter one URL or path per line",
"directoryPath": "Directory Path",
"urlsHint": "Introduzca una URL o ruta por línea",
"directoryPath": "Ruta del directorio",
"directoryPlaceholder": "/path/to/images/folder",
"browse": "Browse",
"recursive": "Include subdirectories",
"tagsOptional": "Tags (optional, applied to all recipes)",
"tagsPlaceholder": "Enter tags separated by commas",
"tagsHint": "Tags will be added to all imported recipes",
"skipNoMetadata": "Skip images without metadata",
"skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.",
"start": "Start Import",
"startImport": "Start Import",
"importing": "Importing...",
"rateLimitedSlowdown": "Límite de velocidad — ralentizando",
"rateLimitedHint": "Algunos elementos se omitieron debido a los límites de velocidad del proveedor de metadatos. Vuelve a ejecutar la importación más tarde para reintentarlos.",
"progress": "Progress",
"browse": "Examinar",
"recursive": "Incluir subdirectorios",
"tagsOptional": "Etiquetas (opcional, se aplican a todas las recetas)",
"tagsPlaceholder": "Introduzca etiquetas separadas por comas",
"tagsHint": "Las etiquetas se añadirán a todas las recetas importadas",
"skipNoMetadata": "Omitir imágenes sin metadatos",
"skipNoMetadataHelp": "Las imágenes sin metadatos de LoRA se omitirán automáticamente.",
"start": "Iniciar importación",
"startImport": "Iniciar importación",
"importing": "Importando...",
"rateLimitedSlowdown": "Límite de tasa alcanzado: ralentizando...",
"rateLimitedHint": "Algunos elementos se omitieron por límites de tasa del proveedor de metadatos. Vuelva a ejecutar la importación más tarde para reintentarlos.",
"progress": "Progreso",
"total": "Total",
"success": "Success",
"failed": "Failed",
"skipped": "Skipped",
"current": "Current",
"currentItem": "Current",
"preparing": "Preparing...",
"cancel": "Cancel",
"cancelImport": "Cancel",
"cancelled": "Import cancelled",
"completed": "Import completed",
"completedWithErrors": "Completed with errors",
"completedSuccess": "Successfully imported {count} recipe(s)",
"successCount": "Successful",
"failedCount": "Failed",
"skippedCount": "Skipped",
"totalProcessed": "Total processed",
"viewDetails": "View Details",
"newImport": "New Import",
"manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.",
"batchImportDirectorySelected": "Directory selected: {path}",
"batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.",
"backToParent": "Back to parent directory",
"folders": "Folders",
"folderCount": "{count} folders",
"imageFiles": "Image Files",
"images": "images",
"imageCount": "{count} images",
"selectFolder": "Select This Folder",
"success": "Correctos",
"failed": "Fallidos",
"skipped": "Omitidos",
"current": "Actual",
"currentItem": "Actual",
"preparing": "Preparando...",
"cancel": "Cancelar",
"cancelImport": "Cancelar",
"cancelled": "Importación cancelada",
"completed": "Importación completada",
"completedWithErrors": "Completada con errores",
"completedSuccess": "{count} receta(s) importada(s) correctamente",
"successCount": "Correctos",
"failedCount": "Fallidos",
"skippedCount": "Omitidos",
"totalProcessed": "Total procesado",
"viewDetails": "Ver detalles",
"newImport": "Nueva importación",
"manualPathEntry": "Introduzca la ruta del directorio manualmente. El selector de archivos no está disponible en este navegador.",
"batchImportDirectorySelected": "Directorio seleccionado: {path}",
"batchImportManualEntryRequired": "Selector de archivos no disponible. Introduzca la ruta del directorio manualmente.",
"backToParent": "Directorio principal",
"folders": "Carpetas",
"folderCount": "{count} carpetas",
"imageFiles": "Archivos de imagen",
"images": "imágenes",
"imageCount": "{count} imágenes",
"selectFolder": "Seleccionar esta carpeta",
"errors": {
"enterUrls": "Please enter at least one URL or path",
"enterDirectory": "Please enter a directory path",
"startFailed": "Failed to start import: {message}"
"enterUrls": "Introduzca al menos una URL o ruta",
"enterDirectory": "Introduzca una ruta de directorio",
"startFailed": "No se pudo iniciar la importación: {message}"
}
}
},
@@ -1106,11 +1110,11 @@
"title": "Modelos checkpoint",
"modelTypes": {
"checkpoint": "Checkpoint",
"diffusion_model": "Diffusion Model"
"diffusion_model": "Modelo de difusión"
},
"contextMenu": {
"moveToOtherTypeFolder": "Mover a la carpeta {otherType}",
"sendToWorkflow": "Enviar al flujo de trabajo"
"sendToWorkflow": "Enviar al workflow"
}
},
"embeddings": {
@@ -1165,7 +1169,7 @@
"totalGenerations": "Generaciones totales",
"usageRate": "Tasa de uso",
"loras": "LoRAs",
"checkpoints": "Puntos de control",
"checkpoints": "Checkpoints",
"embeddings": "Embeddings",
"uniqueTags": "Etiquetas únicas",
"unusedModels": "Modelos no usados",
@@ -1199,9 +1203,9 @@
},
"unusedCheckpoints": {
"detected": {
"title": "Puntos de control no utilizados detectados",
"description": "El {percent}% de tus puntos de control ({count}/{total}) nunca se han utilizado.",
"suggestion": "Revisa y considera eliminar los puntos de control que ya no necesites."
"title": "Checkpoints no utilizados detectados",
"description": "El {percent}% de tus Checkpoints ({count}/{total}) nunca se han utilizado.",
"suggestion": "Revisa y considera eliminar los Checkpoints que ya no necesites."
}
},
"unusedEmbeddings": {
@@ -1243,7 +1247,7 @@
"lora": "LoRA",
"locon": "LyCORIS",
"dora": "DoRA",
"checkpoint": "Punto de control",
"checkpoint": "Checkpoint",
"diffusion_model": "Modelo de difusión",
"embedding": "Embeddings"
},
@@ -1268,7 +1272,7 @@
"download": {
"title": "Descargar modelo desde URL",
"titleWithType": "Descargar {type} desde URL",
"civitaiUrl": "URL de Civitai:",
"civitaiUrl": "URL de CivitAI:",
"placeholder": "https://civitai.com/models/...",
"urlHint": "Ingrese una URL de CivitAI, CivArchive o Hugging Face por línea. Admite múltiples URLs para descarga por lotes.",
"selectHfFiles": "Seleccione el/los archivo(s) para descargar de este repositorio:",
@@ -1303,7 +1307,7 @@
"inLibrary": "En la biblioteca"
},
"errors": {
"invalidUrl": "Formato de URL de Civitai inválido",
"invalidUrl": "Formato de URL de CivitAI inválido",
"noVersions": "No hay versiones disponibles para este modelo",
"mixedSources": "No se pueden mezclar URL de CivitAI y Hugging Face en el mismo lote.",
"noModelFiles": "No se encontraron archivos de modelo en este repositorio."
@@ -1417,7 +1421,7 @@
"title": "Imágenes de ejemplo locales",
"message": "No se encontraron imágenes de ejemplo locales para este modelo. Opciones de visualización:",
"downloadOption": {
"title": "Descargar de Civitai",
"title": "Descargar de CivitAI",
"description": "Guardar ejemplos remotos localmente para uso sin conexión y carga más rápida"
},
"importOption": {
@@ -1444,7 +1448,7 @@
"confirmAction": "Guardar y vincular"
},
"relinkCivitai": {
"title": "Re-vincular a Civitai",
"title": "Re-vincular a CivitAI",
"warning": "Advertencia:",
"warningText": "Esta es una operación potencialmente destructiva. Re-vincular hará:",
"warningList": {
@@ -1453,15 +1457,15 @@
"unintendedConsequences": "Puede tener otras consecuencias no deseadas"
},
"proceedText": "Solo procede si estás seguro de que esto es lo que quieres.",
"urlLabel": "URL del modelo de Civitai:",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"urlLabel": "URL del modelo de CivitAI:",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890 o https://civitai.red/models/12345/model-name?modelVersionId=67890",
"helpText": {
"title": "Pega cualquier URL de modelo de Civitai o CivitArchive. Formatos soportados:",
"title": "Pega cualquier URL de modelo de CivitAI o CivitArchive. Formatos soportados:",
"format1": "https://civitai.com/models/12345",
"format2": "https://civitai.com/models/12345?modelVersionId=67890",
"format3": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"note": "Nota: Si no se proporciona modelVersionId, se usará la versión más reciente.",
"format4": "https://civarchive.com/models/12345 (CivitArchive)"
"format4": "https://civarchive.com/models/12345 (CivArchive)"
},
"confirmAction": "Confirmar re-vinculación"
},
@@ -1471,8 +1475,8 @@
"editFileName": "Editar nombre de archivo",
"editBaseModel": "Editar modelo base",
"editVersionName": "Editar nombre de versión",
"viewOnCivitai": "Ver en Civitai",
"viewOnCivitaiText": "Ver en Civitai",
"viewOnCivitai": "Ver en CivitAI",
"viewOnCivitaiText": "Ver en CivitAI",
"viewOnHuggingFace": "Ver en Hugging Face",
"viewOnHuggingFaceText": "Ver en Hugging Face",
"viewCreatorProfile": "Ver perfil del creador",
@@ -1504,7 +1508,7 @@
"notesHint": "Presiona Enter para guardar, Shift+Enter para nueva línea",
"addNotesPlaceholder": "Añade tus notas aquí...",
"aboutThisVersion": "Acerca de esta versión",
"baseModelSearchPlaceholder": "Buscar modelo base",
"baseModelSearchPlaceholder": "Buscar modelo base...",
"baseModelSuggested": "Sugerido",
"baseModelNoMatch": "No hay modelos base que coincidan"
},
@@ -1515,7 +1519,7 @@
"showLess": "Mostrar menos"
},
"usageTips": {
"addPresetParameter": "Añadir parámetro preestablecido...",
"addPresetParameter": "Añadir parámetro preajustado...",
"strengthMin": "Fuerza mínima",
"strengthMax": "Fuerza máxima",
"strengthRange": "Rango de fuerza",
@@ -1528,18 +1532,18 @@
},
"triggerWords": {
"label": "Palabras clave",
"noTriggerWordsNeeded": "No se necesita palabra clave",
"edit": "Editar palabras clave",
"noTriggerWordsNeeded": "No se necesita palabra de activación",
"edit": "Editar palabras de activación",
"cancel": "Cancelar edición",
"save": "Guardar cambios",
"addPlaceholder": "Escribe para añadir o haz clic en sugerencias de abajo",
"editWord": "Editar palabra de activación",
"editPlaceholder": "Editar palabra de activación",
"copyWord": "Copiar palabra clave",
"deleteWord": "Eliminar palabra clave",
"copyWord": "Copiar palabra de activación",
"deleteWord": "Eliminar palabra de activación",
"suggestions": {
"noSuggestions": "No hay sugerencias disponibles",
"noTrainedWords": "No se encontraron palabras entrenadas o tokens de clase en este modelo. Puedes introducir palabras clave manualmente.",
"noTrainedWords": "No se encontraron palabras entrenadas o tokens de clase en este modelo. Puedes introducir palabras de activación manualmente.",
"classToken": "Token de clase",
"classTokenDescription": "Añadir a tu prompt para mejores resultados",
"wordSuggestions": "Sugerencias de palabras",
@@ -1573,10 +1577,10 @@
"noNext": "No hay siguiente modelo disponible"
},
"license": {
"noImageSell": "No selling generated content",
"noRentCivit": "No Civitai generation",
"noRent": "No generation services",
"noSell": "No selling models",
"noImageSell": "No vender contenido generado",
"noRentCivit": "Sin generación en CivitAI",
"noRent": "Sin servicios de generación",
"noSell": "No vender modelos",
"creditRequired": "Crédito del creador requerido",
"noDerivatives": "No se permiten fusiones",
"noReLicense": "Se requieren mismos permisos",
@@ -1639,33 +1643,33 @@
"newer": "Versión más reciente",
"newerTooltip": "Esta versión es más reciente que tu última versión local",
"earlyAccess": "Acceso temprano",
"earlyAccessTooltip": "Esta versión requiere actualmente acceso temprano de Civitai",
"earlyAccessTooltip": "Esta versión requiere actualmente acceso temprano de CivitAI",
"paid": "De pago",
"paidTooltip": "Esta versión requiere pago para descargarse",
"ignored": "Ignorada",
"ignoredTooltip": "Las notificaciones de actualización están desactivadas para esta versión",
"onSiteOnly": "Solo en Sitio",
"onSiteOnlyTooltip": "Esta versión solo está disponible para generación en el sitio de Civitai"
"onSiteOnlyTooltip": "Esta versión solo está disponible para generación en el sitio de CivitAI"
},
"actions": {
"download": "Descargar",
"downloadTooltip": "Descargar esta versión",
"downloadChooseFilesTooltip": "Elegir qué archivos descargar",
"downloadEarlyAccessTooltip": "Descargar esta versión de acceso temprano desde Civitai",
"downloadPaidTooltip": "Descargar esta versión de pago desde Civitai",
"downloadNotAllowedTooltip": "Esta versión solo está disponible para generación en el sitio de Civitai",
"downloadEarlyAccessTooltip": "Descargar esta versión de acceso temprano desde CivitAI",
"downloadPaidTooltip": "Descargar esta versión de pago desde CivitAI",
"downloadNotAllowedTooltip": "Esta versión solo está disponible para generación en el sitio de CivitAI",
"delete": "Eliminar",
"deleteTooltip": "Eliminar esta versión local",
"ignore": "Ignorar",
"unignore": "Dejar de ignorar",
"ignoreTooltip": "Ignorar las notificaciones de actualización de esta versión",
"unignoreTooltip": "Reanudar las notificaciones de actualización de esta versión",
"viewVersionOnCivitai": "Ver versión en Civitai",
"viewVersionOnCivitai": "Ver versión en CivitAI",
"earlyAccessTooltip": "Requiere compra de acceso temprano",
"resumeModelUpdates": "Reanudar actualizaciones para este modelo",
"ignoreModelUpdates": "Ignorar actualizaciones para este modelo",
"viewLocalVersions": "Ver todas las versiones locales",
"viewLocalTooltip": "Disponible pronto"
"viewLocalTooltip": "Mostrar todas las versiones locales de este modelo en la página principal"
},
"filters": {
"label": "Filtro base",
@@ -1681,7 +1685,7 @@
},
"empty": "Aún no hay historial de versiones para este modelo.",
"error": "No se pudieron cargar las versiones.",
"missingModelId": "Este modelo no tiene un ID de modelo de Civitai.",
"missingModelId": "Este modelo no tiene un ID de modelo de CivitAI.",
"hfGroupInfo": "Este es un grupo de modelos de HuggingFace. Abra la biblioteca para ver todas las versiones en la cuadrícula.",
"confirm": {
"delete": "¿Eliminar esta versión de tu biblioteca?"
@@ -1765,14 +1769,14 @@
"tips": {
"title": "Consejos y trucos",
"civitai": {
"title": "Integración con Civitai",
"description": "Conecta tu cuenta de Civitai: Visita Avatar de perfil → Configuración → Claves API → Añadir clave API, luego pégala en la configuración del gestor de LoRA.",
"alt": "Configuración de API de Civitai"
"title": "Integración con CivitAI",
"description": "Conecta tu cuenta de CivitAI: Visita Avatar de perfil → Configuración → Claves API → Añadir clave API, luego pégala en la configuración del gestor de LoRA.",
"alt": "Configuración de API de CivitAI"
},
"download": {
"title": "Descarga fácil",
"description": "Usa URLs de Civitai para descargar e instalar rápidamente nuevos modelos.",
"alt": "Descarga de Civitai"
"description": "Usa URLs de CivitAI para descargar e instalar rápidamente nuevos modelos.",
"alt": "Descarga de CivitAI"
},
"recipes": {
"title": "Guardar recetas",
@@ -1808,27 +1812,27 @@
},
"lora": {
"syntaxCopied": "Sintaxis de LoRA copiada al portapapeles",
"syntaxCopiedNoTriggerWords": "Sintaxis de LoRA copiada al portapapeles (no se encontraron palabras clave)",
"syntaxCopiedWithTriggerWords": "Sintaxis de LoRA con palabras clave copiada al portapapeles",
"syntaxCopiedWithTriggerWordGroups": "Sintaxis de LoRA con grupos de palabras clave copiada al portapapeles"
"syntaxCopiedNoTriggerWords": "Sintaxis de LoRA copiada al portapapeles (no se encontraron palabras de activación)",
"syntaxCopiedWithTriggerWords": "Sintaxis de LoRA con palabras de activación copiada al portapapeles",
"syntaxCopiedWithTriggerWordGroups": "Sintaxis de LoRA con grupos de palabras de activación copiada al portapapeles"
},
"workflow": {
"noSupportedNodes": "No se encontraron nodos de destino compatibles en el flujo de trabajo",
"noSupportedNodes": "No se encontraron nodos de destino compatibles en el workflow",
"communicationFailed": "Error al comunicarse con ComfyUI",
"loraAdded": "LoRA añadido al flujo de trabajo",
"loraReplaced": "LoRA reemplazado en el flujo de trabajo",
"loraFailedToSend": "Error al enviar LoRA al flujo de trabajo",
"recipeAdded": "Receta añadida al flujo de trabajo",
"recipeReplaced": "Receta reemplazada en el flujo de trabajo",
"recipeFailedToSend": "Error al enviar receta al flujo de trabajo",
"noMatchingNodes": "No hay nodos compatibles disponibles en el flujo de trabajo actual",
"loraAdded": "LoRA añadido al workflow",
"loraReplaced": "LoRA reemplazado en el workflow",
"loraFailedToSend": "Error al enviar LoRA al workflow",
"recipeAdded": "Receta añadida al workflow",
"recipeReplaced": "Receta reemplazada en el workflow",
"recipeFailedToSend": "Error al enviar receta al workflow",
"noMatchingNodes": "No hay nodos compatibles disponibles en el workflow actual",
"noPromptTargets": "No hay destinos de prompt compatibles en el workflow.\nHaz clic derecho en un nodo de ComfyUI → Marcar como → Destino de envío de prompt",
"noTargetNodeSelected": "No se ha seleccionado ningún nodo de destino",
"modelUpdated": "Modelo actualizado en el flujo de trabajo",
"modelUpdated": "Modelo actualizado en el workflow",
"modelFailed": "Error al actualizar nodo de modelo",
"embeddingAdded": "Embedding añadido al flujo de trabajo",
"embeddingAdded": "Embedding añadido al workflow",
"embeddingFailed": "Error al añadir el embedding",
"promptSent": "Prompt enviado al flujo de trabajo",
"promptSent": "Prompt enviado al workflow",
"promptFailed": "Error al enviar el prompt"
},
"nodeSelector": {
@@ -1956,7 +1960,7 @@
"submitGithubIssue": "Enviar issue en GitHub",
"joinDiscord": "Unirse a Discord",
"youtubeChannel": "Canal de YouTube",
"civitaiProfile": "Perfil de Civitai",
"civitaiProfile": "Perfil de CivitAI",
"supportKofi": "Apoyar en Ko-fi",
"supportPatreon": "Apoyar en Patreon"
},
@@ -1983,7 +1987,7 @@
"toast": {
"general": {
"cannotInteractStandalone": "No se puede interactuar con ComfyUI en modo independiente",
"failedWorkflowInfo": "Error al obtener información del flujo de trabajo",
"failedWorkflowInfo": "Error al obtener información del workflow",
"pageInitFailed": "Error al inicializar la página de {pageType}. Por favor recarga.",
"statisticsLoadFailed": "Error al cargar datos de estadísticas"
},
@@ -1992,7 +1996,7 @@
"noLorasSelected": "No hay LoRAs seleccionados",
"missingDataForLoras": "Faltan datos para {count} LoRAs",
"noValidLorasToCopy": "No hay LoRAs válidos para copiar",
"sendOnlyForLoras": "Enviar al flujo de trabajo solo está disponible para LoRAs",
"sendOnlyForLoras": "Enviar al workflow solo está disponible para LoRAs",
"noValidLorasToSend": "No hay LoRAs válidos para enviar",
"downloadSuccessful": "LoRAs descargados exitosamente",
"allDownloadSuccessful": "Todos los {count} LoRAs descargados exitosamente",
@@ -2026,10 +2030,10 @@
"negativePromptUpdated": "Prompt negativo actualizado exitosamente",
"promptEditorHint": "Presiona Enter para guardar, Shift+Enter para nueva línea",
"noRecipeId": "No hay ID de receta disponible",
"sendToWorkflowFailed": "Error al enviar la receta al flujo de trabajo: {message}",
"sendToWorkflowFailed": "Error al enviar la receta al workflow: {message}",
"copyFailed": "Error copiando sintaxis de receta: {message}",
"createError": "Error al crear la receta{message}",
"createFailed": "Error al crear la receta{error}",
"createError": "Error al crear la receta: {message}",
"createFailed": "Error al crear la receta: {error}",
"createMissingData": "Faltan datos necesarios para crear la receta",
"created": "Receta creada exitosamente",
"noMissingLoras": "No hay LoRAs faltantes para descargar",
@@ -2042,8 +2046,8 @@
"reconnectFailed": "Error reconectando LoRA: {message}",
"noPromptToSend": "No hay prompt para enviar",
"cannotSend": "No se puede enviar receta: Falta ID de receta",
"sendFailed": "Error al enviar receta al flujo de trabajo",
"sendError": "Error enviando receta al flujo de trabajo",
"sendFailed": "Error al enviar receta al workflow",
"sendError": "Error enviando receta al workflow",
"missingCheckpointPath": "Ruta del checkpoint no disponible",
"missingCheckpointInfo": "Falta información del checkpoint",
"downloadCheckpointFailed": "Error al descargar el checkpoint: {message}",
@@ -2064,18 +2068,18 @@
"processingError": "Error de procesamiento: {message}",
"folderBrowserError": "Error cargando explorador de carpetas: {message}",
"recipeSaveFailed": "Error al guardar receta: {error}",
"recipeSaved": "Recipe saved successfully",
"recipeSaved": "Receta guardada correctamente",
"importFailed": "Importación falló: {message}",
"folderTreeFailed": "Error al cargar árbol de carpetas",
"folderTreeError": "Error cargando árbol de carpetas",
"batchImportFailed": "Failed to start batch import: {message}",
"batchImportCancelling": "Cancelling batch import...",
"batchImportCancelFailed": "Failed to cancel batch import: {message}",
"batchImportNoUrls": "Please enter at least one URL or file path",
"batchImportNoDirectory": "Please enter a directory path",
"batchImportRateLimited": "Se alcanzó el límite de velocidad del proveedor de metadatos las solicitudes se están ralentizando y algunos elementos pueden omitirse. Puedes volver a ejecutar la importación más tarde.",
"batchImportBrowseFailed": "Failed to browse directory: {message}",
"batchImportDirectorySelected": "Directory selected: {path}",
"batchImportFailed": "No se pudo iniciar la importación por lotes: {message}",
"batchImportCancelling": "Cancelando la importación por lotes...",
"batchImportCancelFailed": "No se pudo cancelar la importación por lotes: {message}",
"batchImportNoUrls": "Introduzca al menos una URL o ruta de archivo",
"batchImportNoDirectory": "Introduzca una ruta de directorio",
"batchImportRateLimited": "Se alcanzó el límite de tasa del proveedor de metadatos: las solicitudes se ralentizan y algunos elementos pueden omitirse. Puede volver a ejecutar la importación más tarde.",
"batchImportBrowseFailed": "No se pudo examinar el directorio: {message}",
"batchImportDirectorySelected": "Directorio seleccionado: {path}",
"noRecipesSelected": "No se han seleccionado recetas",
"repairBulkComplete": "Reparación completa: {repaired} reparadas, {skipped} omitidas (de {total})",
"repairBulkSkipped": "No se necesita reparación para ninguna de las {total} recetas seleccionadas",
@@ -2131,8 +2135,8 @@
"bulkUpdatesChecking": "Comprobando actualizaciones para {type} seleccionados...",
"bulkUpdatesSuccess": "Actualizaciones disponibles para {count} {type} seleccionados",
"bulkUpdatesNone": "No se encontraron actualizaciones para los {type} seleccionados",
"bulkUpdatesMissing": "Los {type} seleccionados no están vinculados a actualizaciones de Civitai",
"bulkUpdatesPartialMissing": "Se omitieron {missing} {type} seleccionados sin enlace de Civitai",
"bulkUpdatesMissing": "Los {type} seleccionados no están vinculados a actualizaciones de CivitAI",
"bulkUpdatesPartialMissing": "Se omitieron {missing} {type} seleccionados sin enlace de CivitAI",
"bulkUpdatesFailed": "Error al comprobar actualizaciones para los {type} seleccionados: {message}",
"invalidCharactersRemoved": "Caracteres inválidos eliminados del nombre de archivo",
"filenameCannotBeEmpty": "El nombre de archivo no puede estar vacío",
@@ -2172,8 +2176,8 @@
"compactModeToggled": "Modo compacto {state}",
"settingSaveFailed": "Error al guardar configuración: {message}",
"displayDensitySet": "Densidad de visualización establecida a {density}",
"libraryLoadFailed": "Failed to load libraries: {message}",
"libraryActivateFailed": "Failed to activate library: {message}",
"libraryLoadFailed": "No se pudieron cargar las bibliotecas: {message}",
"libraryActivateFailed": "No se pudo activar la biblioteca: {message}",
"languageChangeFailed": "Error al cambiar idioma: {message}",
"cacheCleared": "Archivos de caché limpiados exitosamente. La caché se reconstruirá en la próxima acción.",
"cacheClearFailed": "Error al limpiar caché: {error}",
@@ -2189,8 +2193,8 @@
"created": "Preajuste \"{name}\" creado",
"deleted": "Preajuste \"{name}\" eliminado",
"applied": "Preajuste \"{name}\" aplicado",
"overwritten": "Preset \"{name}\" sobrescrito",
"restored": "Presets predeterminados restaurados"
"overwritten": "Preajuste \"{name}\" sobrescrito",
"restored": "Preajustes predeterminados restaurados"
},
"error": {
"presetNameEmpty": "El nombre del preajuste no puede estar vacío",
@@ -2218,11 +2222,11 @@
},
"triggerWords": {
"loadFailed": "No se pudieron cargar palabras entrenadas",
"tooLong": "La palabra clave no debe exceder 500 palabras",
"tooMany": "Máximo 100 palabras clave permitidas",
"alreadyExists": "Esta palabra clave ya existe",
"tooLong": "La palabra de activación no debe exceder 500 palabras",
"tooMany": "Máximo 100 palabras de activación permitidas",
"alreadyExists": "Esta palabra de activación ya existe",
"updateSuccess": "Palabras clave actualizadas exitosamente",
"updateFailed": "Error al actualizar palabras clave",
"updateFailed": "Error al actualizar palabras de activación",
"copyFailed": "Error al copiar"
},
"undo": {
@@ -2258,7 +2262,7 @@
"contextMenu": {
"contentRatingSet": "Clasificación de contenido establecida a {level}",
"contentRatingFailed": "Error al establecer clasificación de contenido: {message}",
"relinkSuccess": "Modelo re-vinculado exitosamente a Civitai",
"relinkSuccess": "Modelo re-vinculado exitosamente a CivitAI",
"relinkFailed": "Error: {message}",
"linkHfSuccess": "Modelo vinculado a HuggingFace exitosamente",
"linkHfFailed": "Error: {message}",
@@ -2322,7 +2326,7 @@
"bulkMoveSuccess": "Movidos exitosamente {successCount} {type}s",
"exampleImagesDownloadSuccess": "¡Imágenes de ejemplo descargadas exitosamente!",
"exampleImagesDownloadFailed": "Error al descargar imágenes de ejemplo: {message}",
"moveFailed": "Failed to move item: {message}",
"moveFailed": "No se pudo mover el elemento: {message}",
"copiedToClipboard": "Copiado al portapapeles",
"downloadStarted": "Descarga iniciada"
},
@@ -2335,7 +2339,7 @@
},
"doctor": {
"kicker": "Diagnósticos del sistema",
"title": "Doctor",
"title": "Diagnóstico",
"buttonTitle": "Ejecutar diagnósticos y correcciones comunes",
"loading": "Comprobando el entorno...",
"footer": "Exporta un paquete de diagnóstico si el problema persiste después de la reparación.",
@@ -2352,30 +2356,30 @@
},
"issues": {
"civitai_api_key": {
"title": "Civitai API Key"
"title": "Clave API de CivitAI"
},
"cache_health": {
"title": "Model Cache Health"
"title": "Estado de la caché de modelos"
},
"filename_conflicts": {
"title": "Duplicate Filename Conflicts"
"title": "Conflictos de nombres de archivo duplicados"
},
"ui_version": {
"title": "UI Version"
"title": "Versión de la interfaz"
}
},
"actions": {
"runAgain": "Ejecutar de nuevo",
"exportBundle": "Exportar paquete",
"open-settings": "Open Settings",
"open-settings-syntax-format": "Switch to Full Path Syntax",
"repair-cache": "Rebuild Cache",
"resolve-filename-conflicts": "Resolve Conflicts",
"reload-page": "Reload UI"
"open-settings": "Abrir ajustes",
"open-settings-syntax-format": "Cambiar a la sintaxis de ruta completa",
"repair-cache": "Reconstruir caché",
"resolve-filename-conflicts": "Resolver conflictos",
"reload-page": "Recargar la interfaz"
},
"labels": {
"conflicts": "Conflicts",
"version": "Version"
"conflicts": "Conflictos",
"version": "Versión"
},
"toast": {
"loadFailed": "Error al cargar los diagnósticos: {message}",
@@ -2405,10 +2409,10 @@
"seconds": "segundos"
},
"communitySupport": {
"title": "Keep LoRA Manager Thriving with Your Support ❤️",
"content": "LoRA Manager is a passion project maintained full-time by a solo developer. Your support on Ko-fi helps cover development costs, keeps new updates coming, and unlocks a license key for the LM Civitai Extension as a thank-you gift. Every contribution truly makes a difference.",
"supportCta": "Support on Ko-fi",
"learnMore": "LM Civitai Extension Tutorial"
"title": "Mantén LoRA Manager vivo con tu apoyo ❤️",
"content": "LoRA Manager es un proyecto apasionado mantenido a tiempo completo por un desarrollador en solitario. Tu apoyo en Ko-fi ayuda a cubrir los costes de desarrollo, mantiene las nuevas actualizaciones y desbloquea una clave de licencia para la extensión LM CivitAI como regalo de agradecimiento. Cada contribución marca una diferencia real.",
"supportCta": "Apoyar en Ko-fi",
"learnMore": "Tutorial de la extensión LM CivitAI"
},
"cacheHealth": {
"corrupted": {
+231 -227
View File
@@ -67,15 +67,15 @@
"steps": {
"fetch": {
"title": "Récupérer les métadonnées des modèles",
"content": "Cliquez sur le bouton <strong>Récupérer</strong> pour télécharger les métadonnées et les images d'aperçu des modèles depuis Civitai."
"content": "Cliquez sur le bouton <strong>Récupérer</strong> pour télécharger les métadonnées et les images d'aperçu des modèles depuis CivitAI."
},
"download": {
"title": "Télécharger de nouveaux modèles",
"content": "Utilisez le bouton <strong>Télécharger</strong> pour télécharger des modèles directement à partir des URLs Civitai."
"content": "Utilisez le bouton <strong>Télécharger</strong> pour télécharger des modèles directement à partir des URLs CivitAI."
},
"bulk": {
"title": "Opérations groupées",
"content": "Activez le mode groupé en cliquant sur ce bouton ou en appuyant sur <span class=\"onboarding-shortcut\">B</span>. Sélectionnez plusieurs modèles et effectuez des opérations par lot. Utilisez <span class=\"onboarding-shortcut\">Ctrl+A</span> pour sélectionner tous les modèles visibles."
"content": "Activez le mode groupé en cliquant sur ce bouton ou en appuyant sur <span class=\"onboarding-shortcut\">B</span>. Sélectionnez plusieurs modèles et effectuez des opérations groupées. Utilisez <span class=\"onboarding-shortcut\">Ctrl+A</span> pour sélectionner tous les modèles visibles."
},
"searchOptions": {
"title": "Options de recherche",
@@ -103,8 +103,8 @@
"actions": {
"addToFavorites": "Ajouter aux favoris",
"removeFromFavorites": "Retirer des favoris",
"viewOnCivitai": "Voir sur Civitai",
"notAvailableFromCivitai": "Non disponible sur Civitai",
"viewOnCivitai": "Voir sur CivitAI",
"notAvailableFromCivitai": "Non disponible sur CivitAI",
"viewOnHuggingFace": "Voir sur Hugging Face",
"sendToWorkflow": "Envoyer vers ComfyUI (Clic: Ajouter, Maj+Clic: Remplacer)",
"copyLoRASyntax": "Copier la syntaxe LoRA",
@@ -136,8 +136,8 @@
},
"exampleImages": {
"checkError": "Erreur lors de la vérification des images d'exemple",
"missingHash": "Informations de hachage du modèle manquantes.",
"noRemoteImagesAvailable": "Aucune image d'exemple distante disponible pour ce modèle sur Civitai"
"missingHash": "Informations de hash du modèle manquantes.",
"noRemoteImagesAvailable": "Aucune image d'exemple distante disponible pour ce modèle sur CivitAI"
},
"badges": {
"update": "Mise à jour",
@@ -173,28 +173,28 @@
"error": "Échec du nettoyage des dossiers d'images d'exemple : {message}"
},
"fetchMissingLicenses": {
"label": "Refresh license metadata",
"loading": "Refreshing license metadata for {typePlural}...",
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
"label": "Actualiser les métadonnées de licence",
"loading": "Actualisation des métadonnées de licence pour les {typePlural}...",
"success": "Métadonnées de licence mises à jour pour {count} {typePlural}",
"none": "Tous les {typePlural} possèdent déjà des métadonnées de licence",
"error": "Échec de l'actualisation des métadonnées de licence pour les {typePlural} : {message}"
},
"repairRecipes": {
"label": "Réparer les données de recettes",
"loading": "Réparation des données de recettes...",
"success": "{count} recettes réparées avec succès.",
"cancelled": "Réparation annulée. {count} recettes ont été réparées.",
"error": "Échec de la réparation des recettes : {message}"
"label": "Réparer les données de Recipes",
"loading": "Réparation des données de Recipes...",
"success": "{count} Recipes réparées avec succès.",
"cancelled": "Réparation annulée. {count} Recipes ont été réparées.",
"error": "Échec de la réparation des Recipes : {message}"
},
"rematchRecipes": {
"label": "Réassocier les recettes aux modèles locaux",
"loading": "Réassociation des recettes aux modèles locaux...",
"success": "{entries} entrées associées dans {recipes} recettes",
"successErrors": "{entries} entrées associées dans {recipes} recettes, {failures} échecs",
"allFailed": "Échec de la réassociation de {failures} recettes sur {total}",
"noMatch": "Aucune correspondance locale trouvée pour {entries} entrées dans {recipes} recettes",
"cancelled": "Réassociation annulée. {recipes} recettes mises à jour ({entries} entrées)",
"error": "Échec de la réassociation des recettes : {message}"
"label": "Réassocier les Recipes aux modèles locaux",
"loading": "Réassociation des Recipes aux modèles locaux...",
"success": "{entries} entrées associées dans {recipes} Recipes",
"successErrors": "{entries} entrées associées dans {recipes} Recipes, {failures} échecs",
"allFailed": "Échec de la réassociation de {failures} Recipes sur {total}",
"noMatch": "Aucune correspondance locale trouvée pour {entries} entrées dans {recipes} Recipes",
"cancelled": "Réassociation annulée. {recipes} Recipes mises à jour ({entries} entrées)",
"error": "Échec de la réassociation des Recipes : {message}"
},
"manageExcludedModels": {
"label": "Gérer les modèles exclus"
@@ -249,7 +249,7 @@
"license": "Licence",
"noCreditRequired": "Crédit non requis",
"allowSellingGeneratedContent": "Vente autorisée",
"allowSellingGeneratedContentTooltip": "Autoriser la vente d\"images générées",
"allowSellingGeneratedContentTooltip": "Autoriser la vente d'images générées",
"noCreditRequiredTooltip": "Utiliser le modèle sans créditer le créateur",
"noTags": "Aucun tag",
"tagSearchPlaceholder": "Rechercher des tags...",
@@ -290,15 +290,15 @@
}
},
"settings": {
"civitaiApiKey": "Clé API Civitai",
"civitaiApiKeyPlaceholder": "Entrez votre clé API Civitai",
"civitaiApiKeyHelp": "Utilisée pour l'authentification lors du téléchargement de modèles depuis Civitai",
"civitaiApiKey": "Clé API CivitAI",
"civitaiApiKeyPlaceholder": "Entrez votre clé API CivitAI",
"civitaiApiKeyHelp": "Utilisée pour l'authentification lors du téléchargement de modèles depuis CivitAI",
"civitaiApiKeyConfigured": "Configuré",
"civitaiApiKeyNotConfigured": "Non configuré",
"civitaiApiKeySet": "Configurer",
"civitaiHost": {
"label": "Hôte Civitai",
"help": "Choisissez quel site Civitai s'ouvre lorsque vous utilisez les liens « View on Civitai ».",
"label": "Hôte CivitAI",
"help": "Choisissez quel site CivitAI s'ouvre lorsque vous utilisez les liens « View on CivitAI ».",
"options": {
"com": "civitai.com (SFW uniquement)",
"red": "civitai.red (sans restriction)"
@@ -319,8 +319,8 @@
},
"aria2HelpLink": "Apprenez à configurer le backend de téléchargement aria2",
"civitaiHostBanner": {
"title": "Préférence dhôte Civitai disponible",
"content": "Civitai utilise désormais civitai.com pour le contenu SFW et civitai.red pour le contenu sans restriction. Vous pouvez modifier dans les paramètres le site ouvert par défaut.",
"title": "Préférence dhôte CivitAI disponible",
"content": "CivitAI utilise désormais civitai.com pour le contenu SFW et civitai.red pour le contenu sans restriction. Vous pouvez modifier dans les paramètres le site ouvert par défaut.",
"openSettings": "Ouvrir les paramètres"
},
"openSettingsFileLocation": {
@@ -343,7 +343,7 @@
"recipeSettings": "Recipes",
"extraFolderPaths": "Chemins de dossiers supplémentaires",
"downloadPathTemplates": "Modèles de chemin de téléchargement",
"priorityTags": "Étiquettes prioritaires",
"priorityTags": "Tags prioritaires",
"versionScope": "Indicateurs de mise à jour",
"exampleImages": "Images d'exemple",
"autoOrganize": "Organisation automatique",
@@ -428,7 +428,7 @@
},
"downloadSkipBaseModels": {
"label": "Ignorer les téléchargements pour certains modèles de base",
"help": "Sapplique à tous les flux de téléchargement. Seuls les modèles de base pris en charge peuvent être sélectionnés ici.",
"help": "Lorsqu'elle est activée, les versions utilisant les modèles de base sélectionnés seront ignorées.",
"searchPlaceholder": "Filtrer les modèles de base...",
"empty": "Aucun modèle de base ne correspond à la recherche actuelle.",
"summary": {
@@ -450,7 +450,7 @@
},
"layoutSettings": {
"groupByModel": "Grouper par modèle",
"groupByModelHelp": "Lorsque activé, seule la version la plus récente de chaque modèle Civitai s'affiche sous forme de carte unique. Les versions plus anciennes sont masquées.",
"groupByModelHelp": "Lorsque activé, seule la version la plus récente de chaque modèle CivitAI s'affiche sous forme de carte unique. Les versions plus anciennes sont masquées.",
"displayDensity": "Densité d'affichage",
"displayDensityOptions": {
"default": "Par défaut",
@@ -464,8 +464,8 @@
"compact": "7 (1080p), 8 (2K), 10 (4K)"
},
"displayDensityWarning": "Attention : Des densités plus élevées peuvent causer des problèmes de performance sur les systèmes avec des ressources limitées.",
"recipesLayout": "Disposition des recettes",
"recipesLayoutHelp": "Choisissez comment les cartes de recettes sont organisées : une grille uniforme ou une disposition masonry (style Pinterest) qui préserve le rapport d'aspect de chaque image.",
"recipesLayout": "Disposition des Recipes",
"recipesLayoutHelp": "Choisissez comment les cartes de Recipes sont organisées : une grille uniforme ou une disposition masonry (style Pinterest) qui préserve le rapport d'aspect de chaque image.",
"recipesLayoutOptions": {
"grid": "Grille",
"masonry": "Masonry"
@@ -493,7 +493,7 @@
},
"modelNameDisplayHelp": "Choisissez ce qui doit être affiché dans le pied de page de la carte du modèle",
"cardBlurAmount": "Flou de superposition des cartes",
"cardBlurAmountHelp": "Ajustez l'intensité du flou des superpositions d'en-tête et de pied de page sur les cartes de modèles et de recettes (0 = aucun flou, 20 = flou maximal)."
"cardBlurAmountHelp": "Ajustez l'intensité du flou des superpositions d'en-tête et de pied de page sur les cartes de modèles et de Recipes (0 = aucun flou, 20 = flou maximal)."
},
"folderSettings": {
"activeLibrary": "Bibliothèque active",
@@ -508,16 +508,16 @@
"defaultUnetRootHelp": "Définir le répertoire racine Diffusion Model (UNET) par défaut pour les téléchargements, imports et déplacements",
"defaultEmbeddingRoot": "Racine Embedding",
"defaultEmbeddingRootHelp": "Définir le répertoire racine embedding par défaut pour les téléchargements, imports et déplacements",
"recipesPath": "Recipes Storage Path",
"recipesPathHelp": "Optional custom directory for stored recipes. Leave empty to use the first LoRA root's recipes folder.",
"recipesPath": "Chemin de stockage des Recipes",
"recipesPathHelp": "Dossier personnalisé facultatif pour les Recipes enregistrées. Laissez vide pour utiliser le dossier recipes de la première racine LoRA.",
"recipesPathPlaceholder": "/path/to/recipes",
"recipesPathMigrating": "Migrating recipes storage...",
"recipesPathMigrating": "Migration du stockage des Recipes en cours...",
"noDefault": "Aucun par défaut"
},
"extraFolderPaths": {
"title": "Chemins de dossiers supplémentaires",
"description": "Chemins racine de modèles supplémentaires exclusifs à LoRA Manager. Chargez des modèles depuis des emplacements en dehors des dossiers standard de ComfyUI, idéal pour les grandes bibliothèques qui ralentiraient autrement ComfyUI.",
"restartRequired": "Requires restart to take effect",
"restartRequired": "Un redémarrage est requis pour appliquer les changements",
"modelTypes": {
"lora": "Chemins LoRA",
"checkpoint": "Chemins Checkpoint",
@@ -534,28 +534,28 @@
}
},
"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))",
"title": "Tags prioritaires",
"description": "Personnalisez l'ordre de priorité des tags 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",
"helpLinkLabel": "Ouvrir l'aide sur les tags prioritaires",
"modelTypes": {
"lora": "LoRA",
"checkpoint": "Checkpoint",
"embedding": "Embedding"
},
"saveSuccess": "Étiquettes prioritaires mises à jour.",
"saveError": "Échec de la mise à jour des étiquettes prioritaires.",
"saveSuccess": "Tags prioritaires mis à jour.",
"saveError": "Échec de la mise à jour des tags 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."
"missingCanonical": "L'entrée {index} doit inclure un nom de tag canonique.",
"duplicateCanonical": "Le tag canonique \"{tag}\" apparaît plusieurs fois.",
"unknown": "Configuration de tags 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.",
"help": "Configurer les structures de dossiers pour différents types de modèles lors du téléchargement depuis CivitAI.",
"availablePlaceholders": "Espaces réservés disponibles :",
"templateOptions": {
"flatStructure": "Structure plate",
@@ -592,7 +592,7 @@
"exampleImages": {
"downloadLocation": "Emplacement de téléchargement",
"downloadLocationPlaceholder": "Entrez le chemin du dossier pour les images d'exemple",
"downloadLocationHelp": "Entrez le chemin du dossier où les images d'exemple de Civitai seront sauvegardées",
"downloadLocationHelp": "Entrez le chemin du dossier où les images d'exemple de CivitAI seront sauvegardées",
"autoDownload": "Téléchargement automatique des images d'exemple",
"autoDownloadHelp": "Télécharger automatiquement les images d'exemple pour les modèles qui n'en ont pas (nécessite que l'emplacement de téléchargement soit défini)",
"openMode": "Action douverture des images dexemple",
@@ -625,7 +625,7 @@
},
"hideEarlyAccessUpdates": {
"label": "Masquer les mises à jour en accès anticipé",
"help": "Seulement les mises à jour en accès anticipé"
"help": "Lorsqu'elle est activée, les modèles qui n'ont que des mises à jour en accès anticipé n'afficheront pas le badge « Mise à jour disponible »."
},
"hidePaidUpdates": {
"label": "Masquer les mises à jour payantes",
@@ -647,7 +647,7 @@
},
"metadataArchive": {
"enableArchiveDb": "Activer la base de données d'archive des métadonnées",
"enableArchiveDbHelp": "Utiliser une base de données locale pour accéder aux métadonnées des modèles supprimés de Civitai.",
"enableArchiveDbHelp": "Utiliser une base de données locale pour accéder aux métadonnées des modèles supprimés de CivitAI.",
"status": "Statut",
"statusAvailable": "Disponible",
"statusUnavailable": "Non disponible",
@@ -708,7 +708,7 @@
"custom": "Personnalisé (compatible OpenAI)"
},
"apiBase": "URL de base de l'API",
"apiBaseHelp": "L'URL de base pour l'API LLM (ex. https://api.openai.com/v1). Laissez vide pour utiliser le fournisseur par défaut.",
"apiBaseHelp": "L'URL de base pour l'API LLM. Sélectionnez un préréglage ou saisissez une URL personnalisée. La liste déroulante affiche les préréglages de tous les fournisseurs pris en charge.",
"apiBasePlaceholder": "https://api.openai.com/v1",
"apiKey": "Clé API",
"apiKeyHelp": "Votre clé API du fournisseur LLM. Stockée localement, jamais envoyée à un serveur autre que votre fournisseur LLM choisi.",
@@ -747,10 +747,10 @@
"refresh": {
"title": "Actualiser la liste des modèles",
"full": "Reconstruire le cache",
"fullTooltip": "Recharge tous les détails des modèles depuis les fichiers metadata — à utiliser si la bibliothèque paraît obsolète ou après des modifications manuelles."
"fullTooltip": "Recharge tous les détails des modèles depuis les fichiers de métadonnées — à utiliser si la bibliothèque paraît obsolète ou après des modifications manuelles."
},
"fetch": {
"title": "Récupérer les métadonnées depuis Civitai",
"title": "Récupérer les métadonnées depuis CivitAI",
"action": "Récupérer"
},
"download": {
@@ -803,8 +803,8 @@
"downloadMissingExamples": "Télécharger les manquantes",
"reprocessExamples": "Tout retraiter",
"clear": "Effacer la sélection",
"skipMetadataRefreshCount": "Ignorer{count} modèles",
"resumeMetadataRefreshCount": "Reprendre{count} modèles",
"skipMetadataRefreshCount": "Ignorer({count} modèles)",
"resumeMetadataRefreshCount": "Reprendre({count} modèles)",
"sendToWorkflow": "Envoyer au workflow",
"sections": {
"workflow": "Workflow",
@@ -825,10 +825,10 @@
"enrichHfAgent": "Enrichir les métadonnées HF (IA)"
},
"contextMenu": {
"refreshMetadata": "Actualiser les données Civitai",
"refreshMetadata": "Actualiser les données CivitAI",
"checkUpdates": "Vérifier les mises à jour",
"linkModel": "Lier le modèle",
"linkCivitai": "Relier à nouveau à Civitai",
"linkCivitai": "Relier à nouveau à CivitAI",
"linkHuggingFace": "Lier à HuggingFace",
"copySyntax": "Copier la syntaxe LoRA",
"copyFilename": "Copier le nom de fichier du modèle",
@@ -860,10 +860,11 @@
"actions": {
"sendCheckpoint": "Envoyer vers ComfyUI",
"sendRecipe": "Envoyer vers ComfyUI",
"deleteRecipeWithShortcut": "Supprimer la recette (Del)"
"copyRecipeSyntax": "Copier la syntaxe de la recipe",
"deleteRecipeWithShortcut": "Supprimer la Recipe (Del)"
},
"navigation": {
"label": "Navigation des recettes",
"label": "Navigation des Recipes",
"previousWithShortcut": "Recette précédente (←)",
"nextWithShortcut": "Recette suivante (→)"
},
@@ -871,7 +872,7 @@
"sendWorkflow": "Envoyer le workflow vers ComfyUI",
"sent": "Workflow envoyé vers ComfyUI",
"sendFailed": "Échec de l'envoi du workflow vers ComfyUI",
"noWorkflow": "Aucun workflow intégré trouvé dans cette recette"
"noWorkflow": "Aucun workflow intégré trouvé dans cette Recipe"
},
"status": {
"ready": "Prêt à l'emploi",
@@ -881,9 +882,12 @@
"downloadMissingTooltip": "Cliquer pour télécharger les LoRAs manquants"
},
"loraStatus": {
"none": "Aucun LoRA dans cette recette",
"none": "Aucun LoRA dans cette Recipe",
"allAvailable": "Tous les LoRAs sont disponibles - Prêt à l'emploi",
"missing": "{missing} LoRA(s) manquant(s) sur {total}"
"missing": "{missing} LoRA(s) manquant(s) sur {total}",
"missingAndUnavailable": "{missing} LoRA(s) manquant(s) sur {total}, {unavailable} indisponible(s) (supprimé(s) de la source ou hash irrésolvable)",
"partial": "{unavailable} LoRA(s) indisponible(s) sur {total} (supprimé(s) de la source ou hash irrésolvable) - ignoré(s) lors de l'utilisation de la Recipe",
"noneUsable": "Aucun LoRA utilisable - {unavailable} sur {total} supprimé(s) de la source ou hash irrésolvable"
},
"resources": {
"inLibrary": "Dans la bibliothèque",
@@ -896,10 +900,10 @@
"hashInvalidTooltip": "Ce hash de LoRA ne peut pas être résolu sur CivitAI - le modèle a peut-être été mis à jour",
"download": "Télécharger",
"downloadLoraTooltip": "Télécharger ce LoRA",
"preparingDownload": "Préparation du téléchargement",
"preparingDownload": "Préparation du téléchargement...",
"reconnect": "Reconnecter",
"reconnectTooltip": "Reconnecter avec un LoRA local",
"viewOnCivitai": "Voir sur Civitai",
"viewOnCivitai": "Voir sur CivitAI",
"openLoraDetails": "Voir {name} dans la bibliothèque LoRA",
"openCheckpointDetails": "Voir {name} dans la bibliothèque de modèles"
},
@@ -911,7 +915,7 @@
"dropZoneHint": "Glissez-déposez une image ici, collez-la depuis le presse-papiers ou cliquez pour parcourir",
"orDivider": "ou glissez-déposez / collez une image",
"imageUrlOrPath": "URL d'image ou chemin de fichier :",
"urlPlaceholder": "https://civitai.com/images/... ou C:/chemin/vers/image.png",
"urlPlaceholder": "https://civitai.com/images/... ou https://civitai.red/images/... ou C:/chemin/vers/image.png",
"fetchImage": "Récupérer l'image",
"recipeName": "Nom de la recipe",
"recipeNamePlaceholder": "Entrez le nom de la recipe",
@@ -930,7 +934,7 @@
"root": "Racine",
"browseFolders": "Parcourir les dossiers :",
"downloadAndSaveRecipe": "Télécharger et sauvegarder la recipe",
"importRecipeOnly": "Importer uniquement la recette",
"importRecipeOnly": "Importer uniquement la Recipe",
"importAndDownload": "Importer et télécharger",
"downloadMissingLoras": "Télécharger les LoRAs manquants",
"saveRecipe": "Sauvegarder la recipe",
@@ -940,7 +944,7 @@
"downloadingLoras": "Téléchargement des LoRAs...",
"savingRecipe": "Sauvegarde de la recipe...",
"startingDownload": "Début du téléchargement pour le LoRA {current}/{total}",
"deletedFromCivitai": "Supprimé de Civitai",
"deletedFromCivitai": "Supprimé de CivitAI",
"inLibrary": "Dans la bibliothèque",
"notInLibrary": "Pas dans la bibliothèque",
"earlyAccessRequired": "Ce LoRA nécessite un paiement d'accès anticipé pour le téléchargement.",
@@ -963,7 +967,7 @@
}
},
"sort": {
"title": "Trier les recettes par...",
"title": "Trier les Recipes par...",
"name": "Nom",
"nameAsc": "A - Z",
"nameDesc": "Z - A",
@@ -987,13 +991,13 @@
"action": "Favoris"
},
"layout": {
"title": "Disposition des recettes",
"title": "Disposition des Recipes",
"grid": "Disposition en grille",
"masonry": "Disposition masonry (style Pinterest, préserve le rapport d'aspect de l'image)"
}
},
"duplicates": {
"finding": "Recherche de recettes en doublon...",
"finding": "Recherche de Recipes en doublon...",
"found": "Trouvé {count} groupes de doublons",
"noGroups": "Aucun groupe de doublons trouvé avec le critère de correspondance actuel",
"keepLatest": "Garder les dernières versions",
@@ -1002,8 +1006,8 @@
"basis": {
"loraCombo": "Correspondance : combinaison de LoRA",
"loraComboAndPrompt": "Correspondance : combinaison de LoRA + prompt",
"hintLoraCombo": "Les recettes avec les mêmes LoRAs et des forces identiques sont regroupées.",
"hintPromptIncluded": "Les recettes ne sont regroupées que si elles utilisent les mêmes LoRAs avec des forces identiques ET ont le même prompt."
"hintLoraCombo": "Les Recipes avec les mêmes LoRAs et des forces identiques sont regroupées.",
"hintPromptIncluded": "Les Recipes ne sont regroupées que si elles utilisent les mêmes LoRAs avec des forces identiques ET ont le même prompt."
}
},
"contextMenu": {
@@ -1027,78 +1031,78 @@
"prepareError": "Erreur lors de la préparation des LoRAs pour le téléchargement : {message}"
},
"repair": {
"starting": "Réparation des métadonnées de la recette...",
"success": "Métadonnées de la recette réparées avec succès",
"starting": "Réparation des métadonnées de la Recipe...",
"success": "Métadonnées de la Recipe réparées avec succès",
"skipped": "Recette déjà à la version la plus récente, aucune réparation nécessaire",
"failed": "Échec de la réparation de la recette : {message}",
"missingId": "Impossible de réparer la recette : ID de recette manquant"
"failed": "Échec de la réparation de la Recipe : {message}",
"missingId": "Impossible de réparer la Recipe : ID de Recipe manquant"
},
"reimport": {
"starting": "Ré-import de la recette depuis la source...",
"starting": "Ré-import de la Recipe depuis la source...",
"success": "Recette ré-importée avec succès",
"noSourceUrl": "La recette n'a pas d'URL source, ré-import impossible",
"failed": "Échec du ré-import de la recette : {message}",
"missingId": "Impossible de ré-importer la recette : ID de recette manquant"
"noSourceUrl": "La Recipe n'a pas d'URL source, ré-import impossible",
"failed": "Échec du ré-import de la Recipe : {message}",
"missingId": "Impossible de ré-importer la Recipe : ID de Recipe manquant"
}
},
"batchImport": {
"title": "Batch Import Recipes",
"action": "Batch Import",
"urlList": "URL List",
"directory": "Directory",
"urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.",
"directoryDescription": "Enter a directory path to import all images from that folder.",
"urlsLabel": "Image URLs or Local Paths",
"title": "Import groupé de Recipes",
"action": "Import groupé",
"urlList": "Liste d'URL",
"directory": "Dossier",
"urlDescription": "Saisissez des URL d'images ou des chemins de fichiers locaux (un par ligne). Chacun sera importé comme Recipe.",
"directoryDescription": "Saisissez un chemin de dossier pour importer toutes les images de ce dossier.",
"urlsLabel": "URL d'images ou chemins locaux",
"urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "Enter one URL or path per line",
"directoryPath": "Directory Path",
"urlsHint": "Saisissez une URL ou un chemin par ligne",
"directoryPath": "Chemin du dossier",
"directoryPlaceholder": "/path/to/images/folder",
"browse": "Browse",
"recursive": "Include subdirectories",
"tagsOptional": "Tags (optional, applied to all recipes)",
"tagsPlaceholder": "Enter tags separated by commas",
"tagsHint": "Tags will be added to all imported recipes",
"skipNoMetadata": "Skip images without metadata",
"skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.",
"start": "Start Import",
"startImport": "Start Import",
"importing": "Importing...",
"rateLimitedSlowdown": "Limitation de débit — ralentissement",
"rateLimitedHint": "Certains éléments ont été ignorés en raison des limites de débit du fournisseur de métadonnées. Relancez l'importation plus tard pour les réessayer.",
"progress": "Progress",
"browse": "Parcourir",
"recursive": "Inclure les sous-dossiers",
"tagsOptional": "Tags (facultatif, appliqués à toutes les Recipes)",
"tagsPlaceholder": "Saisissez les tags séparés par des virgules",
"tagsHint": "Les tags seront ajoutés à toutes les Recipes importées",
"skipNoMetadata": "Ignorer les images sans métadonnées",
"skipNoMetadataHelp": "Les images sans métadonnées LoRA seront ignorées automatiquement.",
"start": "Démarrer l'import",
"startImport": "Démarrer l'import",
"importing": "Import en cours...",
"rateLimitedSlowdown": "Limite de débit atteinte — ralentissement...",
"rateLimitedHint": "Certains éléments ont été ignorés en raison des limites de débit du fournisseur de métadonnées. Relancez l'import plus tard pour réessayer.",
"progress": "Progression",
"total": "Total",
"success": "Success",
"failed": "Failed",
"skipped": "Skipped",
"current": "Current",
"currentItem": "Current",
"preparing": "Preparing...",
"cancel": "Cancel",
"cancelImport": "Cancel",
"cancelled": "Import cancelled",
"completed": "Import completed",
"completedWithErrors": "Completed with errors",
"completedSuccess": "Successfully imported {count} recipe(s)",
"successCount": "Successful",
"failedCount": "Failed",
"skippedCount": "Skipped",
"totalProcessed": "Total processed",
"viewDetails": "View Details",
"newImport": "New Import",
"manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.",
"batchImportDirectorySelected": "Directory selected: {path}",
"batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.",
"backToParent": "Back to parent directory",
"folders": "Folders",
"folderCount": "{count} folders",
"imageFiles": "Image Files",
"success": "Réussis",
"failed": "Échecs",
"skipped": "Ignorés",
"current": "En cours",
"currentItem": "En cours",
"preparing": "Préparation...",
"cancel": "Annuler",
"cancelImport": "Annuler",
"cancelled": "Import annulé",
"completed": "Import terminé",
"completedWithErrors": "Terminé avec des erreurs",
"completedSuccess": "{count} Recipe(s) importée(s) avec succès",
"successCount": "Réussis",
"failedCount": "Échecs",
"skippedCount": "Ignorés",
"totalProcessed": "Total traité",
"viewDetails": "Voir les détails",
"newImport": "Nouvel import",
"manualPathEntry": "Veuillez saisir le chemin du dossier manuellement. Le sélecteur de fichiers n'est pas disponible dans ce navigateur.",
"batchImportDirectorySelected": "Dossier sélectionné : {path}",
"batchImportManualEntryRequired": "Sélecteur de fichiers indisponible. Veuillez saisir le chemin du dossier manuellement.",
"backToParent": "Dossier parent",
"folders": "Dossiers",
"folderCount": "{count} dossiers",
"imageFiles": "Fichiers image",
"images": "images",
"imageCount": "{count} images",
"selectFolder": "Select This Folder",
"selectFolder": "Sélectionner ce dossier",
"errors": {
"enterUrls": "Please enter at least one URL or path",
"enterDirectory": "Please enter a directory path",
"startFailed": "Failed to start import: {message}"
"enterUrls": "Veuillez saisir au moins une URL ou un chemin",
"enterDirectory": "Veuillez saisir un chemin de dossier",
"startFailed": "Échec du démarrage de l'import : {message}"
}
}
},
@@ -1106,7 +1110,7 @@
"title": "Modèles Checkpoint",
"modelTypes": {
"checkpoint": "Checkpoint",
"diffusion_model": "Diffusion Model"
"diffusion_model": "Modèle de diffusion"
},
"contextMenu": {
"moveToOtherTypeFolder": "Déplacer vers le dossier {otherType}",
@@ -1243,7 +1247,7 @@
"lora": "LoRA",
"locon": "LyCORIS",
"dora": "DoRA",
"checkpoint": "Point de contrôle",
"checkpoint": "Checkpoint",
"diffusion_model": "Modèle de diffusion",
"embedding": "Embeddings"
},
@@ -1268,7 +1272,7 @@
"download": {
"title": "Télécharger un modèle depuis une URL",
"titleWithType": "Télécharger {type} depuis une URL",
"civitaiUrl": "URL Civitai :",
"civitaiUrl": "URL CivitAI :",
"placeholder": "https://civitai.com/models/...",
"urlHint": "Entrez une URL CivitAI, CivArchive ou Hugging Face par ligne. Prend en charge plusieurs URL pour le téléchargement par lot.",
"selectHfFiles": "Sélectionnez le(s) fichier(s) à télécharger depuis ce dépôt :",
@@ -1303,7 +1307,7 @@
"inLibrary": "Dans la bibliothèque"
},
"errors": {
"invalidUrl": "Format d'URL Civitai invalide",
"invalidUrl": "Format d'URL CivitAI invalide",
"noVersions": "Aucune version disponible pour ce modèle",
"mixedSources": "Impossible de mélanger les URL CivitAI et Hugging Face dans le même lot.",
"noModelFiles": "Aucun fichier de modèle trouvé dans ce dépôt."
@@ -1354,13 +1358,13 @@
"message": "Êtes-vous sûr de vouloir exclure ce modèle ? Les modèles exclus n'apparaîtront pas dans les recherches ou listes de modèles."
},
"deleteDuplicateRecipes": {
"title": "Supprimer les recipes dupliquées",
"message": "Êtes-vous sûr de vouloir supprimer les recipes dupliquées sélectionnées ?",
"title": "Supprimer les Recipes en double",
"message": "Êtes-vous sûr de vouloir supprimer les Recipes en double sélectionnées ?",
"countMessage": "recipes seront définitivement supprimées."
},
"deleteDuplicateModels": {
"title": "Supprimer les modèles dupliqués",
"message": "Êtes-vous sûr de vouloir supprimer les modèles dupliqués sélectionnés ?",
"title": "Supprimer les modèles en double",
"message": "Êtes-vous sûr de vouloir supprimer les modèles en double sélectionnés ?",
"countMessage": "modèles seront définitivement supprimés."
},
"clearCache": {
@@ -1384,7 +1388,7 @@
"checkUpdates": {
"title": "Vérifier les mises à jour pour tous les {typePlural} ?",
"message": "Cette action vérifie les mises à jour pour tous les {typePlural} de votre bibliothèque. Les grandes collections peuvent prendre un peu plus de temps.",
"tip": "Besoin de procéder par étapes ? Passez en mode lot, sélectionnez les modèles souhaités puis utilisez \"Vérifier les mises à jour pour la sélection\".",
"tip": "Besoin de procéder par étapes ? Passez en mode groupé, sélectionnez les modèles souhaités puis utilisez \"Vérifier les mises à jour pour la sélection\".",
"action": "Tout vérifier"
},
"bulkAddTags": {
@@ -1407,7 +1411,7 @@
},
"bulkDownloadMissingLoras": {
"title": "Télécharger les LoRAs manquants",
"message": "{uniqueCount} LoRAs manquants uniques trouvés (sur un total de {totalCount} dans les recettes sélectionnées).",
"message": "{uniqueCount} LoRAs manquants uniques trouvés (sur un total de {totalCount} dans les Recipes sélectionnées).",
"previewTitle": "LoRAs à télécharger :",
"moreItems": "...et {count} de plus",
"note": "Les fichiers seront téléchargés en utilisant les modèles de chemins par défaut. Cela peut prendre un certain temps selon le nombre de LoRAs.",
@@ -1417,7 +1421,7 @@
"title": "Images d'exemple locales",
"message": "Aucune image d'exemple locale trouvée pour ce modèle. Options d'affichage :",
"downloadOption": {
"title": "Télécharger depuis Civitai",
"title": "Télécharger depuis CivitAI",
"description": "Sauvegarder les exemples distants localement pour un usage hors ligne et un chargement plus rapide"
},
"importOption": {
@@ -1444,7 +1448,7 @@
"confirmAction": "Enregistrer & lier"
},
"relinkCivitai": {
"title": "Relier à nouveau à Civitai",
"title": "Relier à nouveau à CivitAI",
"warning": "Attention :",
"warningText": "Il s'agit d'une opération potentiellement destructrice. Relier à nouveau va :",
"warningList": {
@@ -1453,15 +1457,15 @@
"unintendedConsequences": "Peut avoir d'autres conséquences non prévues"
},
"proceedText": "Ne procédez que si vous êtes sûr que c'est ce que vous voulez.",
"urlLabel": "URL du modèle Civitai :",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"urlLabel": "URL du modèle CivitAI :",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890 ou https://civitai.red/models/12345/model-name?modelVersionId=67890",
"helpText": {
"title": "Collez n'importe quelle URL de modèle Civitai ou CivitArchive. Formats supportés :",
"title": "Collez n'importe quelle URL de modèle CivitAI ou CivitArchive. Formats supportés :",
"format1": "https://civitai.com/models/12345",
"format2": "https://civitai.com/models/12345?modelVersionId=67890",
"format3": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"note": "Note : Si aucun modelVersionId n'est fourni, la dernière version sera utilisée.",
"format4": "https://civarchive.com/models/12345 (CivitArchive)"
"format4": "https://civarchive.com/models/12345 (CivArchive)"
},
"confirmAction": "Confirmer la re-liaison"
},
@@ -1471,8 +1475,8 @@
"editFileName": "Modifier le nom de fichier",
"editBaseModel": "Modifier le modèle de base",
"editVersionName": "Modifier le nom de la version",
"viewOnCivitai": "Voir sur Civitai",
"viewOnCivitaiText": "Voir sur Civitai",
"viewOnCivitai": "Voir sur CivitAI",
"viewOnCivitaiText": "Voir sur CivitAI",
"viewOnHuggingFace": "Voir sur Hugging Face",
"viewOnHuggingFaceText": "Voir sur Hugging Face",
"viewCreatorProfile": "Voir le profil du créateur",
@@ -1504,7 +1508,7 @@
"notesHint": "Appuyez sur Entrée pour sauvegarder, Maj+Entrée pour nouvelle ligne",
"addNotesPlaceholder": "Ajoutez vos notes ici...",
"aboutThisVersion": "À propos de cette version",
"baseModelSearchPlaceholder": "Rechercher un modèle de base",
"baseModelSearchPlaceholder": "Rechercher un modèle de base...",
"baseModelSuggested": "Suggéré",
"baseModelNoMatch": "Aucun modèle de base correspondant"
},
@@ -1515,7 +1519,7 @@
"showLess": "Afficher moins"
},
"usageTips": {
"addPresetParameter": "Ajouter un paramètre prédéfini...",
"addPresetParameter": "Ajouter un paramètre préréglé...",
"strengthMin": "Force Min",
"strengthMax": "Force Max",
"strengthRange": "Gamme de force",
@@ -1533,8 +1537,8 @@
"cancel": "Annuler la modification",
"save": "Sauvegarder les modifications",
"addPlaceholder": "Tapez pour ajouter ou cliquez sur les suggestions ci-dessous",
"editWord": "Modifier le mot déclencheur",
"editPlaceholder": "Modifier le mot déclencheur",
"editWord": "Modifier le mot-clé",
"editPlaceholder": "Modifier le mot-clé",
"copyWord": "Copier le mot-clé",
"deleteWord": "Supprimer le mot-clé",
"suggestions": {
@@ -1573,10 +1577,10 @@
"noNext": "Aucun modèle suivant"
},
"license": {
"noImageSell": "No selling generated content",
"noRentCivit": "No Civitai generation",
"noRent": "No generation services",
"noSell": "No selling models",
"noImageSell": "Vente d'images générées interdite",
"noRentCivit": "Aucune génération via CivitAI",
"noRent": "Aucun service de génération",
"noSell": "Vente de modèles interdite",
"creditRequired": "Crédit du créateur requis",
"noDerivatives": "Pas de fusion de partage",
"noReLicense": "Mêmes autorisations requises",
@@ -1639,33 +1643,33 @@
"newer": "Version plus récente",
"newerTooltip": "Cette version est plus récente que votre dernière version locale",
"earlyAccess": "Accès anticipé",
"earlyAccessTooltip": "Cette version nécessite actuellement l'accès anticipé Civitai",
"earlyAccessTooltip": "Cette version nécessite actuellement l'accès anticipé CivitAI",
"paid": "Payant",
"paidTooltip": "Cette version nécessite un paiement pour être téléchargée",
"ignored": "Ignorée",
"ignoredTooltip": "Les notifications de mise à jour sont désactivées pour cette version",
"onSiteOnly": "Uniquement sur Site",
"onSiteOnlyTooltip": "Cette version n'est disponible que pour la génération sur le site Civitai"
"onSiteOnlyTooltip": "Cette version n'est disponible que pour la génération sur le site CivitAI"
},
"actions": {
"download": "Télécharger",
"downloadTooltip": "Télécharger cette version",
"downloadChooseFilesTooltip": "Choisir les fichiers à télécharger",
"downloadEarlyAccessTooltip": "Télécharger cette version en accès anticipé depuis Civitai",
"downloadPaidTooltip": "Télécharger cette version payante depuis Civitai",
"downloadNotAllowedTooltip": "Cette version n'est disponible que pour la génération sur le site Civitai",
"downloadEarlyAccessTooltip": "Télécharger cette version en accès anticipé depuis CivitAI",
"downloadPaidTooltip": "Télécharger cette version payante depuis CivitAI",
"downloadNotAllowedTooltip": "Cette version n'est disponible que pour la génération sur le site CivitAI",
"delete": "Supprimer",
"deleteTooltip": "Supprimer cette version locale",
"ignore": "Ignorer",
"unignore": "Ne plus ignorer",
"ignoreTooltip": "Ignorer les notifications de mise à jour pour cette version",
"unignoreTooltip": "Reprendre les notifications de mise à jour pour cette version",
"viewVersionOnCivitai": "Voir la version sur Civitai",
"viewVersionOnCivitai": "Voir la version sur CivitAI",
"earlyAccessTooltip": "Nécessite l'achat de l'accès anticipé",
"resumeModelUpdates": "Reprendre les mises à jour pour ce modèle",
"ignoreModelUpdates": "Ignorer les mises à jour pour ce modèle",
"viewLocalVersions": "Voir toutes les versions locales",
"viewLocalTooltip": "Bientôt disponible"
"viewLocalTooltip": "Afficher toutes les versions locales de ce modèle sur la page principale"
},
"filters": {
"label": "Filtre de base",
@@ -1681,7 +1685,7 @@
},
"empty": "Aucun historique de versions n'est disponible pour ce modèle pour le moment.",
"error": "Échec du chargement des versions.",
"missingModelId": "Ce modèle ne possède pas d'identifiant de modèle Civitai.",
"missingModelId": "Ce modèle ne possède pas d'identifiant de modèle CivitAI.",
"hfGroupInfo": "Ceci est un groupe de modèles HuggingFace. Ouvrez la bibliothèque pour voir toutes les versions dans la grille.",
"confirm": {
"delete": "Supprimer cette version de votre bibliothèque ?"
@@ -1765,14 +1769,14 @@
"tips": {
"title": "Astuces et conseils",
"civitai": {
"title": "Intégration Civitai",
"description": "Connectez votre compte Civitai : Visitez Avatar de profil → Paramètres → Clés API → Ajouter une clé API, puis collez-la dans les paramètres du gestionnaire LoRA.",
"alt": "Configuration API Civitai"
"title": "Intégration CivitAI",
"description": "Connectez votre compte CivitAI : Visitez Avatar de profil → Paramètres → Clés API → Ajouter une clé API, puis collez-la dans les paramètres du gestionnaire LoRA.",
"alt": "Configuration API CivitAI"
},
"download": {
"title": "Téléchargement facile",
"description": "Utilisez les URLs Civitai pour télécharger et installer rapidement de nouveaux modèles.",
"alt": "Téléchargement Civitai"
"description": "Utilisez les URLs CivitAI pour télécharger et installer rapidement de nouveaux modèles.",
"alt": "Téléchargement CivitAI"
},
"recipes": {
"title": "Sauvegarder les recipes",
@@ -1956,7 +1960,7 @@
"submitGithubIssue": "Soumettre un problème sur GitHub",
"joinDiscord": "Rejoindre Discord",
"youtubeChannel": "Chaîne YouTube",
"civitaiProfile": "Profil Civitai",
"civitaiProfile": "Profil CivitAI",
"supportKofi": "Soutenir sur Ko-fi",
"supportPatreon": "Soutenir sur Patreon"
},
@@ -2026,15 +2030,15 @@
"negativePromptUpdated": "Prompt négatif mis à jour avec succès",
"promptEditorHint": "Appuyez sur Entrée pour sauvegarder, Maj+Entrée pour nouvelle ligne",
"noRecipeId": "Aucun ID de recipe disponible",
"sendToWorkflowFailed": "Échec de l'envoi de la recette vers le workflow : {message}",
"sendToWorkflowFailed": "Échec de l'envoi de la Recipe vers le workflow : {message}",
"copyFailed": "Erreur lors de la copie de la syntaxe de la recipe : {message}",
"createError": "Erreur lors de la création du Recipe {message}",
"createFailed": "Échec de la création du Recipe {error}",
"createError": "Erreur lors de la création du Recipe : {message}",
"createFailed": "Échec de la création du Recipe : {error}",
"createMissingData": "Données requises manquantes pour créer le Recipe",
"created": "Recipe créé avec succès",
"noMissingLoras": "Aucun LoRA manquant à télécharger",
"noPreviousRecipe": "Aucune recette précédente",
"noNextRecipe": "Aucune recette suivante",
"noPreviousRecipe": "Aucune Recipe précédente",
"noNextRecipe": "Aucune Recipe suivante",
"missingLorasInfoFailed": "Échec de l'obtention des informations pour les LoRAs manquants",
"preparingForDownloadFailed": "Erreur lors de la préparation des LoRAs pour le téléchargement",
"enterLoraName": "Veuillez entrer un nom ou une syntaxe LoRA",
@@ -2064,37 +2068,37 @@
"processingError": "Erreur de traitement : {message}",
"folderBrowserError": "Erreur lors du chargement du navigateur de dossiers : {message}",
"recipeSaveFailed": "Échec de la sauvegarde de la recipe : {error}",
"recipeSaved": "Recipe saved successfully",
"recipeSaved": "Recipe enregistrée avec succès",
"importFailed": "Échec de l'importation : {message}",
"folderTreeFailed": "Échec du chargement de l'arborescence des dossiers",
"folderTreeError": "Erreur lors du chargement de l'arborescence des dossiers",
"batchImportFailed": "Failed to start batch import: {message}",
"batchImportCancelling": "Cancelling batch import...",
"batchImportCancelFailed": "Failed to cancel batch import: {message}",
"batchImportNoUrls": "Please enter at least one URL or file path",
"batchImportNoDirectory": "Please enter a directory path",
"batchImportRateLimited": "Limite de débit du fournisseur de métadonnées atteinte — les requêtes sont ralenties et certains éléments peuvent être ignorés. Vous pouvez relancer l'importation plus tard.",
"batchImportBrowseFailed": "Failed to browse directory: {message}",
"batchImportDirectorySelected": "Directory selected: {path}",
"noRecipesSelected": "Aucune recette sélectionnée",
"batchImportFailed": "Échec du démarrage de l'import groupé : {message}",
"batchImportCancelling": "Annulation de l'import groupé...",
"batchImportCancelFailed": "Échec de l'annulation de l'import groupé : {message}",
"batchImportNoUrls": "Veuillez saisir au moins une URL ou un chemin de fichier",
"batchImportNoDirectory": "Veuillez saisir un chemin de dossier",
"batchImportRateLimited": "Limite de débit du fournisseur de métadonnées atteinte — les requêtes sont ralenties et certains éléments peuvent être ignorés. Vous pouvez relancer l'import plus tard.",
"batchImportBrowseFailed": "Échec de la navigation dans le dossier : {message}",
"batchImportDirectorySelected": "Dossier sélectionné : {path}",
"noRecipesSelected": "Aucune Recipe sélectionnée",
"repairBulkComplete": "Réparation terminée : {repaired} réparée(s), {skipped} ignorée(s) (sur {total})",
"repairBulkSkipped": "Aucune réparation nécessaire parmi les {total} recettes sélectionnées",
"repairBulkFailed": "Échec de la réparation des recettes sélectionnées : {message}",
"rematchComplete": "{entries} entrées associées dans {recipes} recettes",
"rematchCompleteErrors": "{entries} entrées associées dans {recipes} recettes, {failures} échecs",
"rematchAllFailed": "Échec de la réassociation de {failures} recettes sélectionnées sur {total}",
"rematchUnmatched": "Aucune correspondance locale trouvée pour {entries} entrées dans {recipes} recettes",
"rematchSkipped": "Aucune des {total} recettes sélectionnées ne nécessite de réassociation",
"rematchFailed": "Échec de la réassociation des recettes sélectionnées : {message}",
"reimporting": "Ré-import de la recette depuis la source...",
"repairBulkSkipped": "Aucune réparation nécessaire parmi les {total} Recipes sélectionnées",
"repairBulkFailed": "Échec de la réparation des Recipes sélectionnées : {message}",
"rematchComplete": "{entries} entrées associées dans {recipes} Recipes",
"rematchCompleteErrors": "{entries} entrées associées dans {recipes} Recipes, {failures} échecs",
"rematchAllFailed": "Échec de la réassociation de {failures} Recipes sélectionnées sur {total}",
"rematchUnmatched": "Aucune correspondance locale trouvée pour {entries} entrées dans {recipes} Recipes",
"rematchSkipped": "Aucune des {total} Recipes sélectionnées ne nécessite de réassociation",
"rematchFailed": "Échec de la réassociation des Recipes sélectionnées : {message}",
"reimporting": "Ré-import de la Recipe depuis la source...",
"reimportSuccess": "Recette ré-importée avec succès",
"reimportBulkComplete": "Ré-import terminé : {completed} ré-importé(s), {failed} échec(s) (sur {total})",
"reimportBulkFailed": "Échec du ré-import de certaines recettes",
"noMissingLorasInSelection": "Aucun LoRA manquant trouvé dans les recettes sélectionnées",
"reimportBulkFailed": "Échec du ré-import de certaines Recipes",
"noMissingLorasInSelection": "Aucun LoRA manquant trouvé dans les Recipes sélectionnées",
"noLoraRootConfigured": "Aucun répertoire racine LoRA configuré. Veuillez définir un répertoire racine LoRA par défaut dans les paramètres.",
"workflowSent": "Workflow envoyé vers ComfyUI",
"workflowSendFailed": "Échec de l'envoi du workflow vers ComfyUI: {error}",
"workflowNoWorkflow": "Aucun workflow intégré trouvé dans cette recette"
"workflowNoWorkflow": "Aucun workflow intégré trouvé dans cette Recipe"
},
"models": {
"noModelsSelected": "Aucun modèle sélectionné",
@@ -2131,8 +2135,8 @@
"bulkUpdatesChecking": "Vérification des mises à jour pour les {type} sélectionnés...",
"bulkUpdatesSuccess": "Mises à jour disponibles pour {count} {type} sélectionnés",
"bulkUpdatesNone": "Aucune mise à jour trouvée pour les {type} sélectionnés",
"bulkUpdatesMissing": "Les {type} sélectionnés ne sont pas liés aux mises à jour Civitai",
"bulkUpdatesPartialMissing": "{missing} {type} sélectionnés sans lien Civitai ignorés",
"bulkUpdatesMissing": "Les {type} sélectionnés ne sont pas liés aux mises à jour CivitAI",
"bulkUpdatesPartialMissing": "{missing} {type} sélectionnés sans lien CivitAI ignorés",
"bulkUpdatesFailed": "Échec de la vérification des mises à jour pour les {type} sélectionnés : {message}",
"invalidCharactersRemoved": "Caractères invalides supprimés du nom de fichier",
"filenameCannotBeEmpty": "Le nom de fichier ne peut pas être vide",
@@ -2166,14 +2170,14 @@
"mappingSaveFailed": "Échec de la sauvegarde des mappages de modèle de base : {message}",
"downloadTemplatesUpdated": "Modèles de chemin de téléchargement mis à jour",
"downloadTemplatesFailed": "Échec de la sauvegarde des modèles de chemin de téléchargement : {message}",
"recipesPathUpdated": "Recipes storage path updated",
"recipesPathSaveFailed": "Failed to update recipes storage path: {message}",
"recipesPathUpdated": "Chemin de stockage des Recipes mis à jour",
"recipesPathSaveFailed": "Échec de la mise à jour du chemin de stockage des Recipes : {message}",
"settingsUpdated": "Paramètres mis à jour : {setting}",
"compactModeToggled": "Mode compact {state}",
"settingSaveFailed": "Échec de la sauvegarde du paramètre : {message}",
"displayDensitySet": "Densité d'affichage définie sur {density}",
"libraryLoadFailed": "Failed to load libraries: {message}",
"libraryActivateFailed": "Failed to activate library: {message}",
"libraryLoadFailed": "Échec du chargement des bibliothèques : {message}",
"libraryActivateFailed": "Échec de l'activation de la bibliothèque : {message}",
"languageChangeFailed": "Échec du changement de langue : {message}",
"cacheCleared": "Les fichiers de cache ont été vidés avec succès. Le cache sera reconstruit à la prochaine action.",
"cacheClearFailed": "Échec du vidage du cache : {error}",
@@ -2190,7 +2194,7 @@
"deleted": "Préréglage \"{name}\" supprimé",
"applied": "Préréglage \"{name}\" appliqué",
"overwritten": "Préréglage \"{name}\" remplacé",
"restored": "Paramètres par défaut restaurés"
"restored": "Préréglages par défaut restaurés"
},
"error": {
"presetNameEmpty": "Le nom du préréglage ne peut pas être vide",
@@ -2258,7 +2262,7 @@
"contextMenu": {
"contentRatingSet": "Classification du contenu définie sur {level}",
"contentRatingFailed": "Échec de la définition de la classification du contenu : {message}",
"relinkSuccess": "Modèle relié à Civitai avec succès",
"relinkSuccess": "Modèle relié à CivitAI avec succès",
"relinkFailed": "Erreur : {message}",
"linkHfSuccess": "Modèle lié à HuggingFace avec succès",
"linkHfFailed": "Erreur : {message}",
@@ -2322,7 +2326,7 @@
"bulkMoveSuccess": "{successCount} {type}s déplacés avec succès",
"exampleImagesDownloadSuccess": "Images d'exemple téléchargées avec succès !",
"exampleImagesDownloadFailed": "Échec du téléchargement des images d'exemple : {message}",
"moveFailed": "Failed to move item: {message}",
"moveFailed": "Échec du déplacement de l'élément : {message}",
"copiedToClipboard": "Copié dans le presse-papiers",
"downloadStarted": "Téléchargement démarré"
},
@@ -2352,29 +2356,29 @@
},
"issues": {
"civitai_api_key": {
"title": "Civitai API Key"
"title": "Clé API CivitAI"
},
"cache_health": {
"title": "Model Cache Health"
"title": "État du cache de modèles"
},
"filename_conflicts": {
"title": "Duplicate Filename Conflicts"
"title": "Conflits de noms de fichiers en double"
},
"ui_version": {
"title": "UI Version"
"title": "Version de l'interface"
}
},
"actions": {
"runAgain": "Relancer",
"exportBundle": "Exporter le lot",
"open-settings": "Open Settings",
"open-settings-syntax-format": "Switch to Full Path Syntax",
"repair-cache": "Rebuild Cache",
"resolve-filename-conflicts": "Resolve Conflicts",
"reload-page": "Reload UI"
"open-settings": "Ouvrir les paramètres",
"open-settings-syntax-format": "Passer à la syntaxe de chemin complet",
"repair-cache": "Reconstruire le cache",
"resolve-filename-conflicts": "Résoudre les conflits",
"reload-page": "Recharger l'interface"
},
"labels": {
"conflicts": "Conflicts",
"conflicts": "Conflits",
"version": "Version"
},
"toast": {
@@ -2389,7 +2393,7 @@
},
"conflictConfirm": {
"title": "Résoudre les conflits de noms de fichiers",
"message": "Renommer en ajoutant un hachage de 4 caractères à chaque nom de fichier en double.",
"message": "Renommer en ajoutant un hash de 4 caractères à chaque nom de fichier en double.",
"note": "Cette opération renomme les fichiers sur le disque. Les références de modèle dans les workflows existants peuvent nécessiter une mise à jour si vous utilisez le format de syntaxe A1111.",
"detail": "Exemple : <code>filename_v1.2</code> → <code>filename_v1.2-ab3c</code>",
"impact": "Renommera <strong>{count}</strong> fichier(s) dans <strong>{groups}</strong> groupe(s) de doublons",
@@ -2405,10 +2409,10 @@
"seconds": "secondes"
},
"communitySupport": {
"title": "Keep LoRA Manager Thriving with Your Support ❤️",
"content": "LoRA Manager is a passion project maintained full-time by a solo developer. Your support on Ko-fi helps cover development costs, keeps new updates coming, and unlocks a license key for the LM Civitai Extension as a thank-you gift. Every contribution truly makes a difference.",
"supportCta": "Support on Ko-fi",
"learnMore": "LM Civitai Extension Tutorial"
"title": "Soutenez l'avenir de LoRA Manager ❤️",
"content": "LoRA Manager est un projet passion mené à plein temps par un développeur solo. Votre soutien sur Ko-fi aide à couvrir les coûts de développement, à publier de nouvelles mises à jour et débloque une clé de licence pour l'extension LM CivitAI en guise de remerciement. Chaque contribution compte vraiment.",
"supportCta": "Soutenir sur Ko-fi",
"learnMore": "Tutoriel de l'extension LM CivitAI"
},
"cacheHealth": {
"corrupted": {
+237 -233
View File
File diff suppressed because it is too large Load Diff
+159 -155
View File
@@ -67,11 +67,11 @@
"steps": {
"fetch": {
"title": "モデルメタデータの取得",
"content": "<strong>取得</strong>ボタンをクリックして、Civitaiからモデルのメタデータとプレビュー画像をダウンロードします。"
"content": "<strong>取得</strong>ボタンをクリックして、CivitAIからモデルのメタデータとプレビュー画像をダウンロードします。"
},
"download": {
"title": "新しいモデルのダウンロード",
"content": "<strong>ダウンロード</strong>ボタンを使って、CivitaiのURLから直接モデルをダウンロードできます。"
"content": "<strong>ダウンロード</strong>ボタンを使って、CivitAIのURLから直接モデルをダウンロードできます。"
},
"bulk": {
"title": "一括操作",
@@ -103,17 +103,17 @@
"actions": {
"addToFavorites": "お気に入りに追加",
"removeFromFavorites": "お気に入りから削除",
"viewOnCivitai": "Civitaiで表示",
"notAvailableFromCivitai": "Civitaiでは利用できません",
"viewOnCivitai": "CivitAIで表示",
"notAvailableFromCivitai": "CivitAIでは利用できません",
"viewOnHuggingFace": "Hugging Face で見る",
"sendToWorkflow": "ComfyUIに送信(クリック:追加、Shift+クリック:置換)",
"copyLoRASyntax": "LoRA構文をコピー",
"checkpointNameCopied": "checkpointの名前をコピーしました",
"checkpointNameCopied": "Checkpointの名前をコピーしました",
"toggleBlur": "ぼかしの切り替え",
"show": "表示",
"openExampleImages": "例画像フォルダを開く",
"replacePreview": "プレビューを置換",
"copyCheckpointName": "checkpoint名をコピー",
"copyCheckpointName": "Checkpoint名をコピー",
"copyEmbeddingName": "embedding名をコピー",
"embeddingNameCopied": "Embedding構文をコピーしました",
"sendCheckpointToWorkflow": "ComfyUIに送信",
@@ -131,13 +131,13 @@
"updateFailed": "お気に入り状態の更新に失敗しました"
},
"sendToWorkflow": {
"checkpointNotImplemented": "checkpointをワークフローに送信 - 実装予定の機能",
"checkpointNotImplemented": "Checkpointをワークフローに送信 - 実装予定の機能",
"missingPath": "このカードのモデルパスを特定できません"
},
"exampleImages": {
"checkError": "例画像の確認中にエラーが発生しました",
"missingHash": "モデルハッシュ情報がありません。",
"noRemoteImagesAvailable": "このモデルのCivitaiでのリモート例画像は利用できません"
"noRemoteImagesAvailable": "このモデルのCivitAIでのリモート例画像は利用できません"
},
"badges": {
"update": "アップデート",
@@ -160,7 +160,7 @@
},
"checkModelUpdates": {
"label": "アップデートを確認",
"loading": "{type} のアップデートを確認中",
"loading": "{type} のアップデートを確認中...",
"success": "{type} のアップデートが {count} 件見つかりました",
"none": "すべての {type} は最新です",
"error": "{type} のアップデート確認に失敗しました: {message}"
@@ -173,17 +173,17 @@
"error": "例画像フォルダのクリーンアップに失敗しました:{message}"
},
"fetchMissingLicenses": {
"label": "Refresh license metadata",
"loading": "Refreshing license metadata for {typePlural}...",
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
"label": "ライセンスメタデータを更新",
"loading": "{typePlural}のライセンスメタデータを更新中...",
"success": "{count} 件の{typePlural}のライセンスメタデータを更新しました",
"none": "すべての{typePlural}には既にライセンスメタデータがあります",
"error": "{typePlural}のライセンスメタデータを更新できませんでした: {message}"
},
"repairRecipes": {
"label": "レシピデータの修復",
"loading": "レシピデータを修復中...",
"success": "{count} 件のレシピを正常に修復しました。",
"cancelled": "修復がキャンセルされました。{count}のレシピが修復されました。",
"cancelled": "修復がキャンセルされました。{count}のレシピが修復されました。",
"error": "レシピの修復に失敗しました: {message}"
},
"rematchRecipes": {
@@ -290,15 +290,15 @@
}
},
"settings": {
"civitaiApiKey": "Civitai APIキー",
"civitaiApiKeyPlaceholder": "Civitai APIキーを入力してください",
"civitaiApiKeyHelp": "Civitaiからモデルをダウンロードするときの認証に使用されます",
"civitaiApiKey": "CivitAI APIキー",
"civitaiApiKeyPlaceholder": "CivitAI APIキーを入力してください",
"civitaiApiKeyHelp": "CivitAIからモデルをダウンロードするときの認証に使用されます",
"civitaiApiKeyConfigured": "設定済み",
"civitaiApiKeyNotConfigured": "未設定",
"civitaiApiKeySet": "設定",
"civitaiHost": {
"label": "Civitai ホスト",
"help": "「View on Civitai」リンクを使うときに開く Civitai サイトを選択します。",
"label": "CivitAI ホスト",
"help": "「View on CivitAI」リンクを使うときに開く CivitAI サイトを選択します。",
"options": {
"com": "civitai.comSFW のみ)",
"red": "civitai.red(制限なし)"
@@ -319,8 +319,8 @@
},
"aria2HelpLink": "aria2 ダウンロードバックエンドの設定方法",
"civitaiHostBanner": {
"title": "Civitai ホスト設定を利用できます",
"content": "Civitai は現在、SFW コンテンツには civitai.com、制限なしコンテンツには civitai.red を使用しています。設定で既定で開くサイトを変更できます。",
"title": "CivitAI ホスト設定を利用できます",
"content": "CivitAI は現在、SFW コンテンツには civitai.com、制限なしコンテンツには civitai.red を使用しています。設定で既定で開くサイトを変更できます。",
"openSettings": "設定を開く"
},
"openSettingsFileLocation": {
@@ -428,7 +428,7 @@
},
"downloadSkipBaseModels": {
"label": "ベースモデルのダウンロードをスキップ",
"help": "すべてのダウンロードフローに適用されます。ここでは対応しているベースモデルのみ選択できます。",
"help": "有効にすると、選択したベースモデルを使用するバージョンはスキップされます。",
"searchPlaceholder": "ベースモデルを絞り込む...",
"empty": "現在の検索に一致するベースモデルはありません。",
"summary": {
@@ -450,7 +450,7 @@
},
"layoutSettings": {
"groupByModel": "モデルでグループ化",
"groupByModelHelp": "有効にすると、各Civitaiモデルの最新バージョンのみが1枚のカードとして表示され、古いバージョンは非表示になります。",
"groupByModelHelp": "有効にすると、各CivitAIモデルの最新バージョンのみが1枚のカードとして表示され、古いバージョンは非表示になります。",
"displayDensity": "表示密度",
"displayDensityOptions": {
"default": "デフォルト",
@@ -503,7 +503,7 @@
"defaultLoraRoot": "LoRAルート",
"defaultLoraRootHelp": "ダウンロード、インポート、移動用のデフォルトLoRAルートディレクトリを設定",
"defaultCheckpointRoot": "Checkpointルート",
"defaultCheckpointRootHelp": "ダウンロード、インポート、移動用のデフォルトcheckpointルートディレクトリを設定",
"defaultCheckpointRootHelp": "ダウンロード、インポート、移動用のデフォルトCheckpointルートディレクトリを設定",
"defaultUnetRoot": "Diffusion Modelルート",
"defaultUnetRootHelp": "ダウンロード、インポート、移動用のデフォルトDiffusion Model (UNET)ルートディレクトリを設定",
"defaultEmbeddingRoot": "Embeddingルート",
@@ -517,7 +517,7 @@
"extraFolderPaths": {
"title": "追加フォルダーパス",
"description": "LoRA Manager専用の追加モデルルートパス。ComfyUIの標準フォルダー外の場所からモデルを読み込みます。ComfyUIの動作を低下させる可能性のある大規模ライブラリに最適です。",
"restartRequired": "Requires restart to take effect",
"restartRequired": "変更を有効にするには再起動が必要です",
"modelTypes": {
"lora": "LoRAパス",
"checkpoint": "Checkpointパス",
@@ -529,8 +529,8 @@
"saveError": "追加フォルダーパスの更新に失敗しました: {message}",
"validation": {
"duplicatePath": "このパスはすでに設定されています",
"checkpointUnetOverlap": "checkpoints と diffusion models に同じパスは使用できません:{paths}",
"checkpointUnetOverlapInline": "このパスは別のモデルタイプですでに使用されています。checkpoints と diffusion models には別々のフォルダを使用してください。"
"checkpointUnetOverlap": "Checkpoints と diffusion models に同じパスは使用できません:{paths}",
"checkpointUnetOverlapInline": "このパスは別のモデルタイプですでに使用されています。Checkpoints と diffusion models には別々のフォルダを使用してください。"
}
},
"priorityTags": {
@@ -540,7 +540,7 @@
"helpLinkLabel": "優先タグのヘルプを開く",
"modelTypes": {
"lora": "LoRA",
"checkpoint": "チェックポイント",
"checkpoint": "Checkpoint",
"embedding": "埋め込み"
},
"saveSuccess": "優先タグを更新しました。",
@@ -555,7 +555,7 @@
},
"downloadPathTemplates": {
"title": "ダウンロードパステンプレート",
"help": "Civitaiからダウンロードする際の異なるモデルタイプのフォルダ構造を設定します。",
"help": "CivitAIからダウンロードする際の異なるモデルタイプのフォルダ構造を設定します。",
"availablePlaceholders": "利用可能なプレースホルダー:",
"templateOptions": {
"flatStructure": "フラット構造",
@@ -592,7 +592,7 @@
"exampleImages": {
"downloadLocation": "ダウンロード場所",
"downloadLocationPlaceholder": "例画像のフォルダパスを入力",
"downloadLocationHelp": "Civitaiからの例画像を保存するフォルダパスを入力してください",
"downloadLocationHelp": "CivitAIからの例画像を保存するフォルダパスを入力してください",
"autoDownload": "例画像の自動ダウンロード",
"autoDownloadHelp": "例画像がないモデルの例画像を自動的にダウンロードします(ダウンロード場所の設定が必要)",
"openMode": "サンプル画像を開く動作",
@@ -625,7 +625,7 @@
},
"hideEarlyAccessUpdates": {
"label": "早期アクセス更新を非表示",
"help": "早期アクセスのみの更新"
"help": "有効にすると、早期アクセス更新のみのモデルには「更新あり」バッジが表示されません。"
},
"hidePaidUpdates": {
"label": "有料更新を非表示",
@@ -647,7 +647,7 @@
},
"metadataArchive": {
"enableArchiveDb": "メタデータアーカイブデータベースを有効化",
"enableArchiveDbHelp": "Civitaiから削除されたモデルのメタデータにアクセスするためにローカルデータベースを使用します。",
"enableArchiveDbHelp": "CivitAIから削除されたモデルのメタデータにアクセスするためにローカルデータベースを使用します。",
"status": "ステータス",
"statusAvailable": "利用可能",
"statusUnavailable": "利用不可",
@@ -708,7 +708,7 @@
"custom": "カスタム(OpenAI 互換)"
},
"apiBase": "APIベースURL",
"apiBaseHelp": "LLM APIのベースURL(例:https://api.openai.com/v1)。空の場合はプロバイダーのデフォルトが使用されます。",
"apiBaseHelp": "LLM APIのベースURL。プリセットを選択するか、カスタムURLを入力してください。ドロップダウンには対応しているすべてのプロバイダーのプリセットが表示されます。",
"apiBasePlaceholder": "https://api.openai.com/v1",
"apiKey": "APIキー",
"apiKeyHelp": "LLMプロバイダーのAPIキー。ローカルに保存され、選択したLLMプロバイダー以外のサーバーに送信されることはありません。",
@@ -750,7 +750,7 @@
"fullTooltip": "メタデータファイルから全モデル情報を再読み込みします。リストが古いと感じるときや手動編集後に使用してください。"
},
"fetch": {
"title": "Civitaiからメタデータを取得",
"title": "CivitAIからメタデータを取得",
"action": "取得"
},
"download": {
@@ -825,10 +825,10 @@
"enrichHfAgent": "HF メタデータをAIで補完"
},
"contextMenu": {
"refreshMetadata": "Civitaiデータを更新",
"refreshMetadata": "CivitAIデータを更新",
"checkUpdates": "更新確認",
"linkModel": "モデルをリンク",
"linkCivitai": "Civitai にリンク",
"linkCivitai": "CivitAI にリンク",
"linkHuggingFace": "HuggingFace にリンク",
"copySyntax": "LoRA構文をコピー",
"copyFilename": "モデルファイル名をコピー",
@@ -860,6 +860,7 @@
"actions": {
"sendCheckpoint": "ComfyUIへ送信",
"sendRecipe": "ComfyUIへ送信",
"copyRecipeSyntax": "レシピ構文をコピー",
"deleteRecipeWithShortcut": "レシピを削除(Del"
},
"navigation": {
@@ -883,7 +884,10 @@
"loraStatus": {
"none": "このレシピにはLoRAがありません",
"allAvailable": "すべてのLoRAが利用可能 - 使用可能",
"missing": "{total} 件中 {missing} 件のLoRAが不足"
"missing": "{total} 件中 {missing} 件のLoRAが不足",
"missingAndUnavailable": "{total} 件中 {missing} 件のLoRAが不足、{unavailable} 件は利用不可(ソースから削除済みかハッシュを解決できません)",
"partial": "{total} 件中 {unavailable} 件のLoRAが利用不可(ソースから削除済みかハッシュを解決できません)- レシピ使用時はスキップされます",
"noneUsable": "使用可能なLoRAがありません - {total} 件中 {unavailable} 件がソースから削除済みかハッシュを解決できません"
},
"resources": {
"inLibrary": "ライブラリ内",
@@ -896,10 +900,10 @@
"hashInvalidTooltip": "このLoRAハッシュはCivitAIで解決できません - モデルが更新された可能性があります",
"download": "ダウンロード",
"downloadLoraTooltip": "この LoRA をダウンロード",
"preparingDownload": "ダウンロードを準備中",
"preparingDownload": "ダウンロードを準備中...",
"reconnect": "再接続",
"reconnectTooltip": "ローカルの LoRA と再接続",
"viewOnCivitai": "Civitai で表示",
"viewOnCivitai": "CivitAI で表示",
"openLoraDetails": "LoRA ライブラリで {name} を表示",
"openCheckpointDetails": "モデルライブラリで {name} を表示"
},
@@ -911,7 +915,7 @@
"dropZoneHint": "画像をここにドラッグ&ドロップ、クリップボードから貼り付け、またはクリックして参照",
"orDivider": "または画像をドラッグ&ドロップ / 貼り付け",
"imageUrlOrPath": "画像URLまたはファイルパス:",
"urlPlaceholder": "https://civitai.com/images/... または C:/path/to/image.png",
"urlPlaceholder": "https://civitai.com/images/... または https://civitai.red/images/... または C:/path/to/image.png",
"fetchImage": "画像を取得",
"recipeName": "レシピ名",
"recipeNamePlaceholder": "レシピ名を入力",
@@ -940,7 +944,7 @@
"downloadingLoras": "LoRAをダウンロード中...",
"savingRecipe": "レシピを保存中...",
"startingDownload": "LoRA {current}/{total} のダウンロードを開始",
"deletedFromCivitai": "Civitaiから削除済み",
"deletedFromCivitai": "CivitAIから削除済み",
"inLibrary": "ライブラリ内",
"notInLibrary": "ライブラリ外",
"earlyAccessRequired": "このLoRAはダウンロードにアーリーアクセス料金が必要です。",
@@ -1042,63 +1046,63 @@
}
},
"batchImport": {
"title": "Batch Import Recipes",
"action": "Batch Import",
"urlList": "URL List",
"directory": "Directory",
"urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.",
"directoryDescription": "Enter a directory path to import all images from that folder.",
"urlsLabel": "Image URLs or Local Paths",
"title": "レシピを一括インポート",
"action": "一括インポート",
"urlList": "URLリスト",
"directory": "フォルダ",
"urlDescription": "画像URLまたはローカルファイルパスを入力してください(1行に1つ)。それぞれがレシピとしてインポートされます。",
"directoryDescription": "フォルダパスを入力すると、そのフォルダ内のすべての画像がインポートされます。",
"urlsLabel": "画像URLまたはローカルパス",
"urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "Enter one URL or path per line",
"directoryPath": "Directory Path",
"urlsHint": "1行に1つのURLまたはパスを入力",
"directoryPath": "フォルダパス",
"directoryPlaceholder": "/path/to/images/folder",
"browse": "Browse",
"recursive": "Include subdirectories",
"tagsOptional": "Tags (optional, applied to all recipes)",
"tagsPlaceholder": "Enter tags separated by commas",
"tagsHint": "Tags will be added to all imported recipes",
"skipNoMetadata": "Skip images without metadata",
"skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.",
"start": "Start Import",
"startImport": "Start Import",
"importing": "Importing...",
"rateLimitedSlowdown": "レート制限 — 速度を落としています",
"rateLimitedHint": "メタデータプロバイダーのレート制限により一部のアイテムがスキップされました。後でインポートを実行すると再試行できます。",
"progress": "Progress",
"total": "Total",
"success": "Success",
"failed": "Failed",
"skipped": "Skipped",
"current": "Current",
"currentItem": "Current",
"preparing": "Preparing...",
"cancel": "Cancel",
"cancelImport": "Cancel",
"cancelled": "Import cancelled",
"completed": "Import completed",
"completedWithErrors": "Completed with errors",
"completedSuccess": "Successfully imported {count} recipe(s)",
"successCount": "Successful",
"failedCount": "Failed",
"skippedCount": "Skipped",
"totalProcessed": "Total processed",
"viewDetails": "View Details",
"newImport": "New Import",
"manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.",
"batchImportDirectorySelected": "Directory selected: {path}",
"batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.",
"backToParent": "Back to parent directory",
"folders": "Folders",
"folderCount": "{count} folders",
"imageFiles": "Image Files",
"images": "images",
"imageCount": "{count} images",
"selectFolder": "Select This Folder",
"browse": "参照",
"recursive": "サブフォルダを含める",
"tagsOptional": "タグ(任意、すべてのレシピに適用)",
"tagsPlaceholder": "タグをカンマ区切りで入力",
"tagsHint": "タグはインポートされたすべてのレシピに追加されます",
"skipNoMetadata": "メタデータのない画像をスキップ",
"skipNoMetadataHelp": "LoRAメタデータのない画像は自動的にスキップされます。",
"start": "インポートを開始",
"startImport": "インポートを開始",
"importing": "インポート中...",
"rateLimitedSlowdown": "レート制限 — 速度を落としています...",
"rateLimitedHint": "メタデータプロバイダーのレート制限により一部の項目がスキップされました。後でもう一度インポートを実行して再試行してください。",
"progress": "進捗",
"total": "合計",
"success": "成功",
"failed": "失敗",
"skipped": "スキップ",
"current": "現在",
"currentItem": "現在",
"preparing": "準備中...",
"cancel": "キャンセル",
"cancelImport": "キャンセル",
"cancelled": "インポートがキャンセルされました",
"completed": "インポートが完了しました",
"completedWithErrors": "エラーありで完了",
"completedSuccess": "{count} 件のレシピを正常にインポートしました",
"successCount": "成功",
"failedCount": "失敗",
"skippedCount": "スキップ",
"totalProcessed": "処理済みの合計",
"viewDetails": "詳細を見る",
"newImport": "新しいインポート",
"manualPathEntry": "フォルダパスを手動で入力してください。このブラウザではファイルブラウザは利用できません。",
"batchImportDirectorySelected": "選択されたフォルダ: {path}",
"batchImportManualEntryRequired": "ファイルブラウザが利用できません。フォルダパスを手動で入力してください。",
"backToParent": "親フォルダに戻る",
"folders": "フォルダ",
"folderCount": "{count} 個のフォルダ",
"imageFiles": "画像ファイル",
"images": "画像",
"imageCount": "{count} 枚の画像",
"selectFolder": "このフォルダを選択",
"errors": {
"enterUrls": "Please enter at least one URL or path",
"enterDirectory": "Please enter a directory path",
"startFailed": "Failed to start import: {message}"
"enterUrls": "URLまたはパスを少なくとも1つ入力してください",
"enterDirectory": "フォルダパスを入力してください",
"startFailed": "インポートを開始できませんでした: {message}"
}
}
},
@@ -1268,7 +1272,7 @@
"download": {
"title": "URLからモデルをダウンロード",
"titleWithType": "URLから{type}をダウンロード",
"civitaiUrl": "Civitai URL",
"civitaiUrl": "CivitAI URL",
"placeholder": "https://civitai.com/models/...",
"urlHint": "1行に1つのCivitAI、CivArchive、またはHugging Face URLを入力してください。複数のURLを一括ダウンロードできます。",
"selectHfFiles": "このリポジトリからダウンロードするファイルを選択してください:",
@@ -1303,7 +1307,7 @@
"inLibrary": "ライブラリ内"
},
"errors": {
"invalidUrl": "無効なCivitai URL形式",
"invalidUrl": "無効なCivitAI URL形式",
"noVersions": "このモデルの利用可能なバージョンがありません",
"mixedSources": "同じバッチ内でCivitAIとHugging FaceのURLを混在させることはできません。",
"noModelFiles": "このリポジトリにモデルファイルが見つかりませんでした。"
@@ -1382,9 +1386,9 @@
"action": "すべて削除"
},
"checkUpdates": {
"title": "すべての{type}の更新を確認しますか?",
"message": "ライブラリ内のすべての{type}で更新を確認します。コレクションが大きい場合は時間がかかることがあります。",
"tip": "少しずつ確認したい場合はバルクモードに切り替え、必要なモデルを選んで「選択項目の更新を確認」を使ってください。",
"title": "すべての{typePlural}の更新を確認しますか?",
"message": "ライブラリ内のすべての{typePlural}で更新を確認します。コレクションが大きい場合は時間がかかることがあります。",
"tip": "少しずつ確認したい場合は一括モードに切り替え、必要なモデルを選んで「選択項目の更新を確認」を使ってください。",
"action": "すべて確認"
},
"bulkAddTags": {
@@ -1417,7 +1421,7 @@
"title": "ローカル例画像",
"message": "このモデルのローカル例画像が見つかりませんでした。表示オプション:",
"downloadOption": {
"title": "Civitaiからダウンロード",
"title": "CivitAIからダウンロード",
"description": "リモート例画像をローカルに保存して、オフライン使用と高速読み込みを可能にします"
},
"importOption": {
@@ -1444,7 +1448,7 @@
"confirmAction": "保存&リンク"
},
"relinkCivitai": {
"title": "Civitaiに再リンク",
"title": "CivitAIに再リンク",
"warning": "警告:",
"warningText": "これは破壊的な操作になる可能性があります。再リンクは以下を行います:",
"warningList": {
@@ -1453,15 +1457,15 @@
"unintendedConsequences": "その他の意図しない結果を引き起こす可能性"
},
"proceedText": "これが本当に必要な場合のみ続行してください。",
"urlLabel": "CivitaiモデルURL",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"urlLabel": "CivitAIモデルURL",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890 または https://civitai.red/models/12345/model-name?modelVersionId=67890",
"helpText": {
"title": "CivitaiまたはCivitArchiveのモデルURLを貼り付けてください。対応形式:",
"title": "CivitAIまたはCivitArchiveのモデルURLを貼り付けてください。対応形式:",
"format1": "https://civitai.com/models/12345",
"format2": "https://civitai.com/models/12345?modelVersionId=67890",
"format3": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"note": "注:modelVersionIdが提供されていない場合、最新バージョンが使用されます。",
"format4": "https://civarchive.com/models/12345 (CivitArchive)"
"format4": "https://civarchive.com/models/12345 (CivArchive)"
},
"confirmAction": "再リンクを確認"
},
@@ -1471,8 +1475,8 @@
"editFileName": "ファイル名を編集",
"editBaseModel": "ベースモデルを編集",
"editVersionName": "バージョン名を編集",
"viewOnCivitai": "Civitaiで表示",
"viewOnCivitaiText": "Civitaiで表示",
"viewOnCivitai": "CivitAIで表示",
"viewOnCivitaiText": "CivitAIで表示",
"viewOnHuggingFace": "Hugging Face で見る",
"viewOnHuggingFaceText": "Hugging Face で見る",
"viewCreatorProfile": "作成者プロフィールを表示",
@@ -1504,7 +1508,7 @@
"notesHint": "Enterで保存、Shift+Enterで改行",
"addNotesPlaceholder": "メモをここに追加...",
"aboutThisVersion": "このバージョンについて",
"baseModelSearchPlaceholder": "ベースモデルを検索",
"baseModelSearchPlaceholder": "ベースモデルを検索...",
"baseModelSuggested": "おすすめ",
"baseModelNoMatch": "該当するベースモデルがありません"
},
@@ -1573,10 +1577,10 @@
"noNext": "次のモデルがありません"
},
"license": {
"noImageSell": "No selling generated content",
"noRentCivit": "No Civitai generation",
"noRent": "No generation services",
"noSell": "No selling models",
"noImageSell": "生成画像の販売禁止",
"noRentCivit": "CivitAIでの生成不可",
"noRent": "生成サービス不可",
"noSell": "モデルの販売禁止",
"creditRequired": "作成者のクレジットが必要",
"noDerivatives": "共有マージ不可",
"noReLicense": "同じ権限が必要",
@@ -1639,33 +1643,33 @@
"newer": "新しいバージョン",
"newerTooltip": "このバージョンはローカルの最新バージョンより新しいです",
"earlyAccess": "早期アクセス",
"earlyAccessTooltip": "このバージョンは現在 Civitai の早期アクセスが必要です",
"earlyAccessTooltip": "このバージョンは現在 CivitAI の早期アクセスが必要です",
"paid": "有料",
"paidTooltip": "このバージョンのダウンロードには支払いが必要です",
"ignored": "無視中",
"ignoredTooltip": "このバージョンの更新通知は無効です",
"onSiteOnly": "サイト内のみ",
"onSiteOnlyTooltip": "このバージョンはCivitaiサイト内でのみ利用可能で、ダウンロードはできません"
"onSiteOnlyTooltip": "このバージョンはCivitAIサイト内でのみ利用可能で、ダウンロードはできません"
},
"actions": {
"download": "ダウンロード",
"downloadTooltip": "このバージョンをダウンロード",
"downloadChooseFilesTooltip": "ダウンロードするファイルを選択",
"downloadEarlyAccessTooltip": "Civitai からこの早期アクセス版をダウンロード",
"downloadPaidTooltip": "Civitai からこの有料バージョンをダウンロード",
"downloadNotAllowedTooltip": "このバージョンはCivitaiサイト内でのみ利用可能で、ダウンロードはできません",
"downloadEarlyAccessTooltip": "CivitAI からこの早期アクセス版をダウンロード",
"downloadPaidTooltip": "CivitAI からこの有料バージョンをダウンロード",
"downloadNotAllowedTooltip": "このバージョンはCivitAIサイト内でのみ利用可能で、ダウンロードはできません",
"delete": "削除",
"deleteTooltip": "このローカルバージョンを削除",
"ignore": "無視",
"unignore": "無視を解除",
"ignoreTooltip": "このバージョンの更新通知を無視",
"unignoreTooltip": "このバージョンの更新通知を再開",
"viewVersionOnCivitai": "Civitai でバージョンを表示",
"viewVersionOnCivitai": "CivitAI でバージョンを表示",
"earlyAccessTooltip": "早期アクセス購入が必要",
"resumeModelUpdates": "このモデルの更新を再開",
"ignoreModelUpdates": "このモデルの更新を無視",
"viewLocalVersions": "ローカルの全バージョンを表示",
"viewLocalTooltip": "近日対応予定"
"viewLocalTooltip": "このモデルのすべてのローカルバージョンをメインページで表示"
},
"filters": {
"label": "ベースフィルター",
@@ -1681,7 +1685,7 @@
},
"empty": "このモデルにはまだバージョン履歴がありません。",
"error": "バージョンの読み込みに失敗しました。",
"missingModelId": "このモデルにはCivitaiのモデルIDがありません。",
"missingModelId": "このモデルにはCivitAIのモデルIDがありません。",
"hfGroupInfo": "これは HuggingFace モデルグループです。ライブラリを開いてグリッドですべてのバージョンを表示してください。",
"confirm": {
"delete": "このバージョンをライブラリから削除しますか?"
@@ -1748,14 +1752,14 @@
},
"checkpoints": {
"title": "Checkpoint Managerを初期化中",
"message": "checkpointキャッシュをスキャンして構築中。数分かかる場合があります..."
"message": "Checkpointキャッシュをスキャンして構築中。数分かかる場合があります..."
},
"embeddings": {
"title": "Embedding Managerを初期化中",
"message": "embeddingキャッシュをスキャンして構築中。数分かかる場合があります..."
},
"recipes": {
"title": "Recipe Managerを初期化中",
"title": "レシピマネージャーを初期化中",
"message": "レシピを読み込んで処理中。数分かかる場合があります..."
},
"statistics": {
@@ -1765,14 +1769,14 @@
"tips": {
"title": "ヒント&コツ",
"civitai": {
"title": "Civitai統合",
"description": "Civitaiアカウントを接続:プロフィールアバター → 設定 → APIキー → APIキーを追加し、LoRA Manager設定に貼り付けてください。",
"alt": "Civitai API設定"
"title": "CivitAI統合",
"description": "CivitAIアカウントを接続:プロフィールアバター → 設定 → APIキー → APIキーを追加し、LoRA Manager設定に貼り付けてください。",
"alt": "CivitAI API設定"
},
"download": {
"title": "簡単ダウンロード",
"description": "Civitai URLを使用して新しいモデルを素早くダウンロードしてインストールできます。",
"alt": "Civitaiダウンロード"
"description": "CivitAI URLを使用して新しいモデルを素早くダウンロードしてインストールできます。",
"alt": "CivitAIダウンロード"
},
"recipes": {
"title": "レシピを保存",
@@ -1956,7 +1960,7 @@
"submitGithubIssue": "GitHub Issueを提出",
"joinDiscord": "Discordに参加",
"youtubeChannel": "YouTubeチャンネル",
"civitaiProfile": "Civitaiプロフィール",
"civitaiProfile": "CivitAIプロフィール",
"supportKofi": "Ko-fiでサポート",
"supportPatreon": "Patreonでサポート"
},
@@ -2044,9 +2048,9 @@
"cannotSend": "レシピを送信できません:レシピIDがありません",
"sendFailed": "レシピのワークフローへの送信に失敗しました",
"sendError": "レシピのワークフロー送信エラー",
"missingCheckpointPath": "チェックポイントのパスがありません",
"missingCheckpointInfo": "チェックポイント情報が不足しています",
"downloadCheckpointFailed": "チェックポイントのダウンロードに失敗しました: {message}",
"missingCheckpointPath": "Checkpointのパスがありません",
"missingCheckpointInfo": "Checkpoint情報が不足しています",
"downloadCheckpointFailed": "Checkpointのダウンロードに失敗しました: {message}",
"missingLoraDownloadInfo": "この LoRA のダウンロード情報がありません",
"hashNotFoundOnCivitai": "このLoRAハッシュはCivitAIで解決できません - モデルが更新されたか、ハッシュが無効な可能性があります",
"downloadLoraFailed": "LoRA のダウンロードに失敗しました: {message}",
@@ -2064,18 +2068,18 @@
"processingError": "処理エラー:{message}",
"folderBrowserError": "フォルダブラウザの読み込みエラー:{message}",
"recipeSaveFailed": "レシピの保存に失敗しました:{error}",
"recipeSaved": "Recipe saved successfully",
"recipeSaved": "レシピを保存しました",
"importFailed": "インポートに失敗しました:{message}",
"folderTreeFailed": "フォルダツリーの読み込みに失敗しました",
"folderTreeError": "フォルダツリー読み込みエラー",
"batchImportFailed": "Failed to start batch import: {message}",
"batchImportCancelling": "Cancelling batch import...",
"batchImportCancelFailed": "Failed to cancel batch import: {message}",
"batchImportNoUrls": "Please enter at least one URL or file path",
"batchImportNoDirectory": "Please enter a directory path",
"batchImportRateLimited": "メタデータプロバイダーのレート制限に達しました — リクエストが低速化され、一部のアイテムがスキップされる可能性があります。後でインポートを再実行できます。",
"batchImportBrowseFailed": "Failed to browse directory: {message}",
"batchImportDirectorySelected": "Directory selected: {path}",
"batchImportFailed": "一括インポートを開始できませんでした: {message}",
"batchImportCancelling": "一括インポートをキャンセルしています...",
"batchImportCancelFailed": "一括インポートをキャンセルできませんでした: {message}",
"batchImportNoUrls": "URLまたはファイルパスを少なくとも1つ入力してください",
"batchImportNoDirectory": "フォルダパスを入力してください",
"batchImportRateLimited": "メタデータプロバイダーのレート制限に達しました — リクエストが遅延され、一部の項目がスキップされる場合があります。後でインポートを再実行できます。",
"batchImportBrowseFailed": "フォルダを参照できませんでした: {message}",
"batchImportDirectorySelected": "選択されたフォルダ: {path}",
"noRecipesSelected": "レシピが選択されていません",
"repairBulkComplete": "修復完了:{repaired} 件修復、{skipped} 件スキップ(合計 {total} 件)",
"repairBulkSkipped": "選択した {total} 件のレシピは修復不要です",
@@ -2131,8 +2135,8 @@
"bulkUpdatesChecking": "選択された{type}の更新を確認しています...",
"bulkUpdatesSuccess": "{count} 件の選択された{type}に利用可能な更新があります",
"bulkUpdatesNone": "選択された{type}には更新が見つかりませんでした",
"bulkUpdatesMissing": "選択された{type}はCivitaiの更新にリンクされていません",
"bulkUpdatesPartialMissing": "Civitaiリンクがない{missing} 件の{type}をスキップしました",
"bulkUpdatesMissing": "選択された{type}はCivitAIの更新にリンクされていません",
"bulkUpdatesPartialMissing": "CivitAIリンクがない{missing} 件の{type}をスキップしました",
"bulkUpdatesFailed": "選択された{type}の更新確認に失敗しました: {message}",
"invalidCharactersRemoved": "ファイル名から無効な文字が削除されました",
"filenameCannotBeEmpty": "ファイル名を空にすることはできません",
@@ -2158,10 +2162,10 @@
},
"settings": {
"loraRootsFailed": "LoRAルートの読み込みに失敗しました:{message}",
"checkpointRootsFailed": "checkpointルートの読み込みに失敗しました:{message}",
"checkpointRootsFailed": "Checkpointルートの読み込みに失敗しました:{message}",
"unetRootsFailed": "Diffusion Modelルートの読み込みに失敗しました:{message}",
"embeddingRootsFailed": "embeddingルートの読み込みに失敗しました:{message}",
"mappingsUpdated": "ベースモデルパスマッピングが更新されました({count} マッピング{plural}",
"mappingsUpdated": "ベースモデルパスマッピングが更新されました({count} マッピング)",
"mappingsCleared": "ベースモデルパスマッピングがクリアされました",
"mappingSaveFailed": "ベースモデルマッピングの保存に失敗しました:{message}",
"downloadTemplatesUpdated": "ダウンロードパステンプレートが更新されました",
@@ -2172,8 +2176,8 @@
"compactModeToggled": "コンパクトモード {state}",
"settingSaveFailed": "設定の保存に失敗しました:{message}",
"displayDensitySet": "表示密度が {density} に設定されました",
"libraryLoadFailed": "Failed to load libraries: {message}",
"libraryActivateFailed": "Failed to activate library: {message}",
"libraryLoadFailed": "ライブラリを読み込めませんでした: {message}",
"libraryActivateFailed": "ライブラリをアクティブ化できませんでした: {message}",
"languageChangeFailed": "言語の変更に失敗しました:{message}",
"cacheCleared": "キャッシュファイルが正常にクリアされました。次回のアクションでキャッシュが再構築されます。",
"cacheClearFailed": "キャッシュのクリアに失敗しました:{error}",
@@ -2258,7 +2262,7 @@
"contextMenu": {
"contentRatingSet": "コンテンツレーティングが {level} に設定されました",
"contentRatingFailed": "コンテンツレーティングの設定に失敗しました:{message}",
"relinkSuccess": "モデルがCivitaiに正常に再リンクされました",
"relinkSuccess": "モデルがCivitAIに正常に再リンクされました",
"relinkFailed": "エラー:{message}",
"linkHfSuccess": "モデルを HuggingFace にリンクしました",
"linkHfFailed": "エラー:{message}",
@@ -2322,7 +2326,7 @@
"bulkMoveSuccess": "{successCount} {type}が正常に移動されました",
"exampleImagesDownloadSuccess": "例画像が正常にダウンロードされました!",
"exampleImagesDownloadFailed": "例画像のダウンロードに失敗しました:{message}",
"moveFailed": "Failed to move item: {message}",
"moveFailed": "アイテムを移動できませんでした: {message}",
"copiedToClipboard": "クリップボードにコピーしました",
"downloadStarted": "ダウンロードを開始しました"
},
@@ -2352,7 +2356,7 @@
},
"issues": {
"civitai_api_key": {
"title": "Civitai API キー"
"title": "CivitAI API キー"
},
"cache_health": {
"title": "モデルキャッシュの健全性"
@@ -2405,10 +2409,10 @@
"seconds": "秒"
},
"communitySupport": {
"title": "Keep LoRA Manager Thriving with Your Support ❤️",
"content": "LoRA Manager is a passion project maintained full-time by a solo developer. Your support on Ko-fi helps cover development costs, keeps new updates coming, and unlocks a license key for the LM Civitai Extension as a thank-you gift. Every contribution truly makes a difference.",
"supportCta": "Support on Ko-fi",
"learnMore": "LM Civitai Extension Tutorial"
"title": "あなたのサポートで LoRA Manager は成長し続けます ❤️",
"content": "LoRA Managerは一人の開発者がフルタイムで維持している情熱的なプロジェクトです。Ko-fiでのご支援は開発費用のカバーや新機能のリリースに役立ち、お礼としてLM CivitAI拡張機能のライセンスキーもご提供します。すべてのご寄付が大きな違いを生みます。",
"supportCta": "Ko-fiでサポート",
"learnMore": "LM CivitAI拡張機能チュートリアル"
},
"cacheHealth": {
"corrupted": {
+162 -158
View File
@@ -67,11 +67,11 @@
"steps": {
"fetch": {
"title": "모델 메타데이터 가져오기",
"content": "<strong>가져오기</strong> 버튼을 클릭하여 Civitai에서 모델 메타데이터와 미리보기 이미지를 다운로드하세요."
"content": "<strong>가져오기</strong> 버튼을 클릭하여 CivitAI에서 모델 메타데이터와 미리보기 이미지를 다운로드하세요."
},
"download": {
"title": "새 모델 다운로드",
"content": "<strong>다운로드</strong> 버튼을 사용하여 Civitai URL에서 모델을 직접 다운로드하세요."
"content": "<strong>다운로드</strong> 버튼을 사용하여 CivitAI URL에서 모델을 직접 다운로드하세요."
},
"bulk": {
"title": "일괄 작업",
@@ -103,8 +103,8 @@
"actions": {
"addToFavorites": "즐겨찾기에 추가",
"removeFromFavorites": "즐겨찾기에서 제거",
"viewOnCivitai": "Civitai에서 보기",
"notAvailableFromCivitai": "Civitai에서 사용할 수 없음",
"viewOnCivitai": "CivitAI에서 보기",
"notAvailableFromCivitai": "CivitAI에서 사용할 수 없음",
"viewOnHuggingFace": "Hugging Face에서 보기",
"sendToWorkflow": "ComfyUI로 전송 (클릭: 추가, Shift+클릭: 교체)",
"copyLoRASyntax": "LoRA 문법 복사",
@@ -131,13 +131,13 @@
"updateFailed": "즐겨찾기 상태 업데이트 실패"
},
"sendToWorkflow": {
"checkpointNotImplemented": "Checkpoint 워크플로로 전송 - 구현 예정 기능",
"checkpointNotImplemented": "Checkpoint 워크플로로 전송 - 구현 예정 기능",
"missingPath": "이 카드의 모델 경로를 확인할 수 없습니다"
},
"exampleImages": {
"checkError": "예시 이미지 확인 중 오류",
"missingHash": "모델 해시 정보가 없습니다.",
"noRemoteImagesAvailable": "Civitai에서 이 모델의 원격 예시 이미지를 사용할 수 없습니다"
"noRemoteImagesAvailable": "CivitAI에서 이 모델의 원격 예시 이미지를 사용할 수 없습니다"
},
"badges": {
"update": "업데이트",
@@ -173,11 +173,11 @@
"error": "예시 이미지 폴더 정리에 실패했습니다: {message}"
},
"fetchMissingLicenses": {
"label": "Refresh license metadata",
"loading": "Refreshing license metadata for {typePlural}...",
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
"label": "라이선스 메타데이터 새로고침",
"loading": "{typePlural}의 라이선스 메타데이터를 새로고침하는 중...",
"success": "{count}개의 {typePlural} 라이선스 메타데이터를 업데이트했습니다",
"none": "모든 {typePlural}에 이미 라이선스 메타데이터가 있습니다",
"error": "{typePlural}의 라이선스 메타데이터를 새로고침하지 못했습니다: {message}"
},
"repairRecipes": {
"label": "레시피 데이터 복구",
@@ -259,7 +259,7 @@
"clearAll": "모든 필터 지우기",
"any": "아무",
"all": "모두",
"tagLogicAny": "모든 태그 일치 (OR)",
"tagLogicAny": "어느 하나의 태그 일치 (OR)",
"tagLogicAll": "모든 태그 일치 (AND)",
"loraAvailability": "LoRA 가용성",
"availabilityReady": "바로 사용 가능",
@@ -290,15 +290,15 @@
}
},
"settings": {
"civitaiApiKey": "Civitai API 키",
"civitaiApiKeyPlaceholder": "Civitai API 키를 입력하세요",
"civitaiApiKeyHelp": "Civitai에서 모델을 다운로드할 때 인증에 사용됩니다",
"civitaiApiKey": "CivitAI API 키",
"civitaiApiKeyPlaceholder": "CivitAI API 키를 입력하세요",
"civitaiApiKeyHelp": "CivitAI에서 모델을 다운로드할 때 인증에 사용됩니다",
"civitaiApiKeyConfigured": "설정됨",
"civitaiApiKeyNotConfigured": "설정되지 않음",
"civitaiApiKeySet": "설정",
"civitaiHost": {
"label": "Civitai 호스트",
"help": "\"View on Civitai\" 링크를 사용할 때 어떤 Civitai 사이트를 열지 선택합니다.",
"label": "CivitAI 호스트",
"help": "\"View on CivitAI\" 링크를 사용할 때 어떤 CivitAI 사이트를 열지 선택합니다.",
"options": {
"com": "civitai.com(SFW 전용)",
"red": "civitai.red(무제한)"
@@ -319,8 +319,8 @@
},
"aria2HelpLink": "aria2 다운로드 백엔드 설정 방법 알아보기",
"civitaiHostBanner": {
"title": "Civitai 호스트 기본 설정 사용 가능",
"content": "이제 Civitai는 SFW 콘텐츠에 civitai.com을, 무제한 콘텐츠에 civitai.red를 사용합니다. 설정에서 기본으로 열 사이트를 변경할 수 있습니다.",
"title": "CivitAI 호스트 기본 설정 사용 가능",
"content": "이제 CivitAI는 SFW 콘텐츠에 civitai.com을, 무제한 콘텐츠에 civitai.red를 사용합니다. 설정에서 기본으로 열 사이트를 변경할 수 있습니다.",
"openSettings": "설정 열기"
},
"openSettingsFileLocation": {
@@ -427,10 +427,10 @@
"noneAvailable": "아직 스냅샷이 없습니다"
},
"downloadSkipBaseModels": {
"label": "기본 모델 다운로드 건너뛰기",
"help": "모든 다운로드 흐름에 적용됩니다. 여기서는 지원되는 기본 모델만 선택할 수 있습니다.",
"searchPlaceholder": "기본 모델 필터링...",
"empty": "현재 검색과 일치하는 기본 모델이 없습니다.",
"label": "베이스 모델 다운로드 건너뛰기",
"help": "활성화하면 선택한 베이스 모델을 사용하는 버전은 건너뜁니다.",
"searchPlaceholder": "베이스 모델 필터링...",
"empty": "현재 검색과 일치하는 베이스 모델이 없습니다.",
"summary": {
"none": "선택 없음",
"count": "{count}개 선택됨"
@@ -441,7 +441,7 @@
"clear": "지우기"
},
"validation": {
"saveFailed": "제외된 기본 모델을 저장할 수 없습니다: {message}"
"saveFailed": "제외된 베이스 모델을 저장할 수 없습니다: {message}"
}
},
"skipPreviouslyDownloadedModelVersions": {
@@ -450,7 +450,7 @@
},
"layoutSettings": {
"groupByModel": "모델별 그룹화",
"groupByModelHelp": "활성화하면 각 Civitai 모델의 최신 버전만 단일 카드로 표시되며, 이전 버전은 숨겨집니다.",
"groupByModelHelp": "활성화하면 각 CivitAI 모델의 최신 버전만 단일 카드로 표시되며, 이전 버전은 숨겨집니다.",
"displayDensity": "표시 밀도",
"displayDensityOptions": {
"default": "기본",
@@ -517,7 +517,7 @@
"extraFolderPaths": {
"title": "추가 폴다 경로",
"description": "LoRA Manager 전용 추가 모델 루트 경로입니다. ComfyUI의 표준 폴더 외부 위치에서 모델을 로드하여 대규모 라이브러리로 인한 성능 저하를 방지합니다.",
"restartRequired": "Requires restart to take effect",
"restartRequired": "변경 사항을 적용하려면 재시작이 필요합니다",
"modelTypes": {
"lora": "LoRA 경로",
"checkpoint": "Checkpoint 경로",
@@ -540,8 +540,8 @@
"helpLinkLabel": "우선순위 태그 도움말 열기",
"modelTypes": {
"lora": "LoRA",
"checkpoint": "체크포인트",
"embedding": "임베딩"
"checkpoint": "Checkpoint",
"embedding": "Embedding"
},
"saveSuccess": "우선순위 태그가 업데이트되었습니다.",
"saveError": "우선순위 태그를 업데이트하지 못했습니다.",
@@ -555,7 +555,7 @@
},
"downloadPathTemplates": {
"title": "다운로드 경로 템플릿",
"help": "Civitai에서 다운로드할 때 다양한 모델 유형의 폴더 구조를 구성합니다.",
"help": "CivitAI에서 다운로드할 때 다양한 모델 유형의 폴더 구조를 구성합니다.",
"availablePlaceholders": "사용 가능한 플레이스홀더:",
"templateOptions": {
"flatStructure": "플랫 구조",
@@ -592,7 +592,7 @@
"exampleImages": {
"downloadLocation": "다운로드 위치",
"downloadLocationPlaceholder": "예시 이미지 폴더 경로를 입력하세요",
"downloadLocationHelp": "Civitai의 예시 이미지가 저장될 폴더 경로를 입력하세요",
"downloadLocationHelp": "CivitAI의 예시 이미지가 저장될 폴더 경로를 입력하세요",
"autoDownload": "예시 이미지 자동 다운로드",
"autoDownloadHelp": "예시 이미지가 없는 모델의 예시 이미지를 자동으로 다운로드합니다 (다운로드 위치 설정 필요)",
"openMode": "예시 이미지 열기 동작",
@@ -625,7 +625,7 @@
},
"hideEarlyAccessUpdates": {
"label": "얼리 액세스 업데이트 숨기기",
"help": "얼리 액세스 업데이트만"
"help": "활성화하면 얼리 액세스 업데이트만 있는 모델에는 '업데이트 가능' 배지가 표시되지 않습니다."
},
"hidePaidUpdates": {
"label": "유료 업데이트 숨기기",
@@ -647,7 +647,7 @@
},
"metadataArchive": {
"enableArchiveDb": "메타데이터 아카이브 데이터베이스 활성화",
"enableArchiveDbHelp": "Civitai에서 삭제된 모델의 메타데이터에 접근하기 위해 로컬 데이터베이스를 사용합니다.",
"enableArchiveDbHelp": "CivitAI에서 삭제된 모델의 메타데이터에 접근하기 위해 로컬 데이터베이스를 사용합니다.",
"status": "상태",
"statusAvailable": "사용 가능",
"statusUnavailable": "사용 불가",
@@ -708,7 +708,7 @@
"custom": "사용자 정의 (OpenAI 호환)"
},
"apiBase": "API 기본 URL",
"apiBaseHelp": "LLM API의 기본 URL입니다 (예: https://api.openai.com/v1). 비워두면 제공자 기본값이 사용됩니다.",
"apiBaseHelp": "LLM API의 기본 URL입니다. 프리셋을 선택하거나 사용자 정의 URL을 입력하세요. 드롭다운에 지원되는 모든 제공자의 프리셋이 표시됩니다.",
"apiBasePlaceholder": "https://api.openai.com/v1",
"apiKey": "API 키",
"apiKeyHelp": "LLM 제공자의 API 키입니다. 로컬에 저장되며 선택한 LLM 제공자 외의 서버로 전송되지 않습니다.",
@@ -750,7 +750,7 @@
"fullTooltip": "메타데이터 파일에서 모든 모델 정보를 다시 불러옵니다. 라이브러리가 오래되어 보이거나 수동 수정 후에 사용하세요."
},
"fetch": {
"title": "Civitai에서 메타데이터 가져오기",
"title": "CivitAI에서 메타데이터 가져오기",
"action": "가져오기"
},
"download": {
@@ -805,9 +805,9 @@
"clear": "선택 지우기",
"skipMetadataRefreshCount": "건너뛰기({count}개 모델)",
"resumeMetadataRefreshCount": "재개({count}개 모델)",
"sendToWorkflow": "워크플로로 보내기",
"sendToWorkflow": "워크플로로 보내기",
"sections": {
"workflow": "워크플로",
"workflow": "워크플로",
"metadata": "메타데이터",
"attributes": "속성",
"organize": "정리",
@@ -825,10 +825,10 @@
"enrichHfAgent": "HF AI로 메타데이터 보강"
},
"contextMenu": {
"refreshMetadata": "Civitai 데이터 새로고침",
"refreshMetadata": "CivitAI 데이터 새로고침",
"checkUpdates": "업데이트 확인",
"linkModel": "모델 연결",
"linkCivitai": "Civitai에 연결",
"linkCivitai": "CivitAI에 연결",
"linkHuggingFace": "HuggingFace에 연결",
"copySyntax": "LoRA 문법 복사",
"copyFilename": "모델 파일명 복사",
@@ -860,6 +860,7 @@
"actions": {
"sendCheckpoint": "ComfyUI로 보내기",
"sendRecipe": "ComfyUI로 보내기",
"copyRecipeSyntax": "레시피 문법 복사",
"deleteRecipeWithShortcut": "레시피 삭제(Del)"
},
"navigation": {
@@ -883,7 +884,10 @@
"loraStatus": {
"none": "이 레시피에는 LoRA가 없습니다",
"allAvailable": "모든 LoRA 사용 가능 - 바로 사용 가능",
"missing": "총 {total}개 중 {missing}개 LoRA 누락"
"missing": "총 {total}개 중 {missing}개 LoRA 누락",
"missingAndUnavailable": "총 {total}개 중 {missing}개 LoRA 누락, {unavailable}개 사용 불가(소스에서 삭제되었거나 해시를 확인할 수 없음)",
"partial": "총 {total}개 중 {unavailable}개 LoRA 사용 불가(소스에서 삭제되었거나 해시를 확인할 수 없음) - 레시피 사용 시 건너뜁니다",
"noneUsable": "사용 가능한 LoRA가 없습니다 - 총 {total}개 중 {unavailable}개가 소스에서 삭제되었거나 해시를 확인할 수 없습니다"
},
"resources": {
"inLibrary": "라이브러리에 있음",
@@ -896,10 +900,10 @@
"hashInvalidTooltip": "이 LoRA 해시는 CivitAI에서 해석할 수 없습니다 - 모델이 업데이트되었을 수 있습니다",
"download": "다운로드",
"downloadLoraTooltip": "이 LoRA 다운로드",
"preparingDownload": "다운로드 준비 중",
"preparingDownload": "다운로드 준비 중...",
"reconnect": "다시 연결",
"reconnectTooltip": "로컬 LoRA와 다시 연결",
"viewOnCivitai": "Civitai에서 보기",
"viewOnCivitai": "CivitAI에서 보기",
"openLoraDetails": "LoRA 라이브러리에서 {name} 보기",
"openCheckpointDetails": "모델 라이브러리에서 {name} 보기"
},
@@ -911,7 +915,7 @@
"dropZoneHint": "이미지를 여기에 끌어다 놓거나, 클립보드에서 붙여넣거나, 클릭하여 찾아보세요",
"orDivider": "또는 이미지를 끌어다 놓기 / 붙여넣기",
"imageUrlOrPath": "이미지 URL 또는 파일 경로:",
"urlPlaceholder": "https://civitai.com/images/... 또는 C:/path/to/image.png",
"urlPlaceholder": "https://civitai.com/images/... 또는 https://civitai.red/images/... 또는 C:/path/to/image.png",
"fetchImage": "이미지 가져오기",
"recipeName": "레시피 이름",
"recipeNamePlaceholder": "레시피 이름을 입력하세요",
@@ -940,7 +944,7 @@
"downloadingLoras": "LoRA 다운로드 중...",
"savingRecipe": "레시피 저장 중...",
"startingDownload": "LoRA {current}/{total} 다운로드 시작",
"deletedFromCivitai": "Civitai에서 삭제됨",
"deletedFromCivitai": "CivitAI에서 삭제됨",
"inLibrary": "라이브러리에 있음",
"notInLibrary": "라이브러리에 없음",
"earlyAccessRequired": "이 LoRA는 얼리 액세스 결제가 필요합니다.",
@@ -1042,63 +1046,63 @@
}
},
"batchImport": {
"title": "Batch Import Recipes",
"action": "Batch Import",
"urlList": "URL List",
"directory": "Directory",
"urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.",
"directoryDescription": "Enter a directory path to import all images from that folder.",
"urlsLabel": "Image URLs or Local Paths",
"title": "레시피 일괄 가져오기",
"action": "일괄 가져오기",
"urlList": "URL 목록",
"directory": "폴더",
"urlDescription": "이미지 URL 또는 로컬 파일 경로를 입력하세요 (줄당 하나). 각 항목은 레시피로 가져옵니다.",
"directoryDescription": "폴더 경로를 입력하면 해당 폴더의 모든 이미지를 가져옵니다.",
"urlsLabel": "이미지 URL 또는 로컬 경로",
"urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "Enter one URL or path per line",
"directoryPath": "Directory Path",
"urlsHint": "줄당 URL 또는 경로 하나를 입력하세요",
"directoryPath": "폴더 경로",
"directoryPlaceholder": "/path/to/images/folder",
"browse": "Browse",
"recursive": "Include subdirectories",
"tagsOptional": "Tags (optional, applied to all recipes)",
"tagsPlaceholder": "Enter tags separated by commas",
"tagsHint": "Tags will be added to all imported recipes",
"skipNoMetadata": "Skip images without metadata",
"skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.",
"start": "Start Import",
"startImport": "Start Import",
"importing": "Importing...",
"rateLimitedSlowdown": "속도 제한 — 속도를 줄이는 중…",
"browse": "찾아보기",
"recursive": "하위 폴더 포함",
"tagsOptional": "태그 (선택 사항, 모든 레시피에 적용)",
"tagsPlaceholder": "쉼표로 구분된 태그 입력",
"tagsHint": "태그가 가져온 모든 레시피에 추가됩니다",
"skipNoMetadata": "메타데이터 없는 이미지 건너뛰기",
"skipNoMetadataHelp": "LoRA 메타데이터가 없는 이미지는 자동으로 건너뜁니다.",
"start": "가져오기 시작",
"startImport": "가져오기 시작",
"importing": "가져오는 중...",
"rateLimitedSlowdown": "속도 제한 — 느려지고 있습니다...",
"rateLimitedHint": "메타데이터 제공자의 속도 제한으로 일부 항목이 건너뛰어졌습니다. 나중에 가져오기를 다시 실행하여 재시도하세요.",
"progress": "Progress",
"total": "Total",
"success": "Success",
"failed": "Failed",
"skipped": "Skipped",
"current": "Current",
"currentItem": "Current",
"preparing": "Preparing...",
"cancel": "Cancel",
"cancelImport": "Cancel",
"cancelled": "Import cancelled",
"completed": "Import completed",
"completedWithErrors": "Completed with errors",
"completedSuccess": "Successfully imported {count} recipe(s)",
"successCount": "Successful",
"failedCount": "Failed",
"skippedCount": "Skipped",
"totalProcessed": "Total processed",
"viewDetails": "View Details",
"newImport": "New Import",
"manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.",
"batchImportDirectorySelected": "Directory selected: {path}",
"batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.",
"backToParent": "Back to parent directory",
"folders": "Folders",
"folderCount": "{count} folders",
"imageFiles": "Image Files",
"images": "images",
"imageCount": "{count} images",
"selectFolder": "Select This Folder",
"progress": "진행률",
"total": "전체",
"success": "성공",
"failed": "실패",
"skipped": "건너뜀",
"current": "현재",
"currentItem": "현재",
"preparing": "준비 중...",
"cancel": "취소",
"cancelImport": "취소",
"cancelled": "가져오기가 취소되었습니다",
"completed": "가져오기가 완료되었습니다",
"completedWithErrors": "오류와 함께 완료됨",
"completedSuccess": "{count}개의 레시피를 성공적으로 가져왔습니다",
"successCount": "성공",
"failedCount": "실패",
"skippedCount": "건너뜀",
"totalProcessed": "처리된 전체",
"viewDetails": "세부 정보 보기",
"newImport": "새 가져오기",
"manualPathEntry": "폴더 경로를 직접 입력하세요. 이 브라우저에서는 파일 브라우저를 사용할 수 없습니다.",
"batchImportDirectorySelected": "선택한 폴더: {path}",
"batchImportManualEntryRequired": "파일 브라우저를 사용할 수 없습니다. 폴더 경로를 직접 입력하세요.",
"backToParent": "상위 폴더로",
"folders": "폴더",
"folderCount": "폴더 {count}",
"imageFiles": "이미지 파일",
"images": "이미지",
"imageCount": "이미지 {count}",
"selectFolder": "이 폴더 선택",
"errors": {
"enterUrls": "Please enter at least one URL or path",
"enterDirectory": "Please enter a directory path",
"startFailed": "Failed to start import: {message}"
"enterUrls": "URL 또는 경로를 하나 이상 입력하세요",
"enterDirectory": "폴더 경로를 입력하세요",
"startFailed": "가져오기를 시작하지 못했습니다: {message}"
}
}
},
@@ -1110,7 +1114,7 @@
},
"contextMenu": {
"moveToOtherTypeFolder": "{otherType} 폴더로 이동",
"sendToWorkflow": "워크플로로 전송"
"sendToWorkflow": "워크플로로 전송"
}
},
"embeddings": {
@@ -1268,7 +1272,7 @@
"download": {
"title": "URL에서 모델 다운로드",
"titleWithType": "URL에서 {type} 다운로드",
"civitaiUrl": "Civitai URL:",
"civitaiUrl": "CivitAI URL:",
"placeholder": "https://civitai.com/models/...",
"urlHint": "한 줄에 하나의 CivitAI, CivArchive 또는 Hugging Face URL을 입력하세요. 여러 URL을 일괄 다운로드할 수 있습니다.",
"selectHfFiles": "이 저장소에서 다운로드할 파일을 선택하세요:",
@@ -1303,7 +1307,7 @@
"inLibrary": "라이브러리에 있음"
},
"errors": {
"invalidUrl": "잘못된 Civitai URL 형식",
"invalidUrl": "잘못된 CivitAI URL 형식",
"noVersions": "이 모델에 사용 가능한 버전이 없습니다",
"mixedSources": "동일한 배치에서 CivitAI와 Hugging Face URL을 혼합할 수 없습니다.",
"noModelFiles": "이 저장소에서 모델 파일을 찾을 수 없습니다."
@@ -1382,9 +1386,9 @@
"action": "모두 삭제"
},
"checkUpdates": {
"title": "{type} 전체 업데이트를 확인할까요?",
"message": "라이브러리에 있는 모든 {type}의 업데이트를 확인합니다. 컬렉션이 클수록 시간이 조금 더 걸릴 수 있습니다.",
"tip": "나눠서 진행하고 싶다면 벌크 모드로 전환해 필요한 모델만 선택한 뒤 \"선택 항목 업데이트 확인\"을 사용하세요.",
"title": "{typePlural} 전체 업데이트를 확인할까요?",
"message": "라이브러리에 있는 모든 {typePlural}의 업데이트를 확인합니다. 컬렉션이 클수록 시간이 조금 더 걸릴 수 있습니다.",
"tip": "나눠서 진행하고 싶다면 일괄 모드로 전환해 필요한 모델만 선택한 뒤 \"선택 항목 업데이트 확인\"을 사용하세요.",
"action": "전체 확인"
},
"bulkAddTags": {
@@ -1417,7 +1421,7 @@
"title": "로컬 예시 이미지",
"message": "이 모델의 로컬 예시 이미지를 찾을 수 없습니다. 보기 옵션:",
"downloadOption": {
"title": "Civitai에서 다운로드",
"title": "CivitAI에서 다운로드",
"description": "오프라인 사용 및 빠른 로딩을 위해 원격 예시를 로컬에 저장"
},
"importOption": {
@@ -1444,7 +1448,7 @@
"confirmAction": "저장 및 연결"
},
"relinkCivitai": {
"title": "Civitai에 다시 연결",
"title": "CivitAI에 다시 연결",
"warning": "경고:",
"warningText": "이것은 잠재적으로 파괴적인 작업입니다. 다시 연결하면:",
"warningList": {
@@ -1453,15 +1457,15 @@
"unintendedConsequences": "기타 의도하지 않은 결과가 있을 수 있음"
},
"proceedText": "원하는 작업이 확실한 경우에만 진행하세요.",
"urlLabel": "Civitai 모델 URL:",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"urlLabel": "CivitAI 모델 URL:",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890 또는 https://civitai.red/models/12345/model-name?modelVersionId=67890",
"helpText": {
"title": "Civitai 또는 CivitArchive 모델 URL을 붙여넣으세요. 지원되는 형식:",
"title": "CivitAI 또는 CivitArchive 모델 URL을 붙여넣으세요. 지원되는 형식:",
"format1": "https://civitai.com/models/12345",
"format2": "https://civitai.com/models/12345?modelVersionId=67890",
"format3": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"note": "참고: modelVersionId가 제공되지 않으면 최신 버전이 사용됩니다.",
"format4": "https://civarchive.com/models/12345 (CivitArchive)"
"format4": "https://civarchive.com/models/12345 (CivArchive)"
},
"confirmAction": "다시 연결 확인"
},
@@ -1471,8 +1475,8 @@
"editFileName": "파일명 편집",
"editBaseModel": "베이스 모델 편집",
"editVersionName": "버전명 편집",
"viewOnCivitai": "Civitai에서 보기",
"viewOnCivitaiText": "Civitai에서 보기",
"viewOnCivitai": "CivitAI에서 보기",
"viewOnCivitaiText": "CivitAI에서 보기",
"viewOnHuggingFace": "Hugging Face에서 보기",
"viewOnHuggingFaceText": "Hugging Face에서 보기",
"viewCreatorProfile": "제작자 프로필 보기",
@@ -1504,7 +1508,7 @@
"notesHint": "Enter로 저장, Shift+Enter로 줄바꿈",
"addNotesPlaceholder": "메모를 여기에 추가하세요...",
"aboutThisVersion": "이 버전에 대해",
"baseModelSearchPlaceholder": "베이스 모델 검색",
"baseModelSearchPlaceholder": "베이스 모델 검색...",
"baseModelSuggested": "추천",
"baseModelNoMatch": "일치하는 베이스 모델 없음"
},
@@ -1573,10 +1577,10 @@
"noNext": "다음 모델이 없습니다"
},
"license": {
"noImageSell": "No selling generated content",
"noRentCivit": "No Civitai generation",
"noRent": "No generation services",
"noSell": "No selling models",
"noImageSell": "생성 콘텐츠 판매 금지",
"noRentCivit": "CivitAI 생성 불가",
"noRent": "생성 서비스 불가",
"noSell": "모델 판매 금지",
"creditRequired": "제작자 크레딧 필요",
"noDerivatives": "공유 병합 불가",
"noReLicense": "동일한 권한 필요",
@@ -1639,33 +1643,33 @@
"newer": "최신 버전",
"newerTooltip": "이 버전은 로컬의 최신 버전보다 더 새롭습니다",
"earlyAccess": "얼리 액세스",
"earlyAccessTooltip": "이 버전은 현재 Civitai 얼리 액세스가 필요합니다",
"earlyAccessTooltip": "이 버전은 현재 CivitAI 얼리 액세스가 필요합니다",
"paid": "유료",
"paidTooltip": "이 버전은 다운로드하려면 결제가 필요합니다",
"ignored": "무시됨",
"ignoredTooltip": "이 버전은 업데이트 알림이 비활성화되어 있습니다",
"onSiteOnly": "사이트 내 전용",
"onSiteOnlyTooltip": "이 버전은 Civitai 사이트 내에서만 사용 가능하며 다운로드할 수 없습니다"
"onSiteOnlyTooltip": "이 버전은 CivitAI 사이트 내에서만 사용 가능하며 다운로드할 수 없습니다"
},
"actions": {
"download": "다운로드",
"downloadTooltip": "이 버전 다운로드",
"downloadChooseFilesTooltip": "다운로드할 파일 선택",
"downloadEarlyAccessTooltip": "Civitai에서 이 얼리 액세스 버전 다운로드",
"downloadPaidTooltip": "Civitai에서 이 유료 버전 다운로드",
"downloadNotAllowedTooltip": "이 버전은 Civitai 사이트 내에서만 사용 가능하며 다운로드할 수 없습니다",
"downloadEarlyAccessTooltip": "CivitAI에서 이 얼리 액세스 버전 다운로드",
"downloadPaidTooltip": "CivitAI에서 이 유료 버전 다운로드",
"downloadNotAllowedTooltip": "이 버전은 CivitAI 사이트 내에서만 사용 가능하며 다운로드할 수 없습니다",
"delete": "삭제",
"deleteTooltip": "이 로컬 버전 삭제",
"ignore": "무시",
"unignore": "무시 해제",
"ignoreTooltip": "이 버전의 업데이트 알림 무시",
"unignoreTooltip": "이 버전의 업데이트 알림 다시 받기",
"viewVersionOnCivitai": "Civitai에서 버전 보기",
"viewVersionOnCivitai": "CivitAI에서 버전 보기",
"earlyAccessTooltip": "얼리 액세스 구매 필요",
"resumeModelUpdates": "이 모델 업데이트 재개",
"ignoreModelUpdates": "이 모델 업데이트 무시",
"viewLocalVersions": "로컬 버전 모두 보기",
"viewLocalTooltip": "곧 제공 예정"
"viewLocalTooltip": "이 모델의 모든 로컬 버전을 메인 페이지에 표시"
},
"filters": {
"label": "기본 필터",
@@ -1681,7 +1685,7 @@
},
"empty": "이 모델에는 아직 버전 기록이 없습니다.",
"error": "버전을 불러오지 못했습니다.",
"missingModelId": "이 모델에는 Civitai 모델 ID가 없습니다.",
"missingModelId": "이 모델에는 CivitAI 모델 ID가 없습니다.",
"hfGroupInfo": "HuggingFace 모델 그룹입니다. 라이브러리를 열어 그리드에서 모든 버전을 확인하세요.",
"confirm": {
"delete": "이 버전을 라이브러리에서 삭제하시겠습니까?"
@@ -1755,7 +1759,7 @@
"message": "Embedding 캐시를 스캔하고 구축하고 있습니다. 몇 분이 걸릴 수 있습니다..."
},
"recipes": {
"title": "Recipe Manager 초기화 중",
"title": "레시피 매니저 초기화 중",
"message": "레시피를 로딩하고 처리하고 있습니다. 몇 분이 걸릴 수 있습니다..."
},
"statistics": {
@@ -1765,14 +1769,14 @@
"tips": {
"title": "팁 & 요령",
"civitai": {
"title": "Civitai 통합",
"description": "Civitai 계정 연결: 프로필 아바타 → 설정 → API 키 → API 키 추가를 방문한 후 LoRA Manager 설정에 붙여넣으세요.",
"alt": "Civitai API 설정"
"title": "CivitAI 통합",
"description": "CivitAI 계정 연결: 프로필 아바타 → 설정 → API 키 → API 키 추가를 방문한 후 LoRA Manager 설정에 붙여넣으세요.",
"alt": "CivitAI API 설정"
},
"download": {
"title": "간편 다운로드",
"description": "Civitai URL을 사용하여 새로운 모델을 빠르게 다운로드하고 설치하세요.",
"alt": "Civitai 다운로드"
"description": "CivitAI URL을 사용하여 새로운 모델을 빠르게 다운로드하고 설치하세요.",
"alt": "CivitAI 다운로드"
},
"recipes": {
"title": "레시피 저장",
@@ -1822,7 +1826,7 @@
"recipeReplaced": "레시피가 워크플로에서 교체되었습니다",
"recipeFailedToSend": "레시피를 워크플로로 전송하지 못했습니다",
"noMatchingNodes": "현재 워크플로에서 호환되는 노드가 없습니다",
"noPromptTargets": "워크플로에 호환되는 프롬프트 타겟이 없습니다.\nComfyUI에서 노드를 우클릭 → Mark as → Send Prompt Target",
"noPromptTargets": "워크플로에 호환되는 프롬프트 타겟이 없습니다.\nComfyUI에서 노드를 우클릭 → Mark as → Send Prompt Target",
"noTargetNodeSelected": "대상 노드가 선택되지 않았습니다",
"modelUpdated": "모델이 워크플로에서 업데이트되었습니다",
"modelFailed": "모델 노드 업데이트 실패",
@@ -1834,7 +1838,7 @@
"nodeSelector": {
"recipe": "레시피",
"lora": "LoRA",
"embedding": "임베딩",
"embedding": "Embedding",
"prompt": "프롬프트",
"replace": "교체",
"append": "추가",
@@ -1956,7 +1960,7 @@
"submitGithubIssue": "GitHub 이슈 제출",
"joinDiscord": "Discord 참여",
"youtubeChannel": "YouTube 채널",
"civitaiProfile": "Civitai 프로필",
"civitaiProfile": "CivitAI 프로필",
"supportKofi": "Ko-fi에서 지원",
"supportPatreon": "Patreon에서 지원"
},
@@ -2002,7 +2006,7 @@
"pleaseSelectFile": "파일을 하나 이상 선택해주세요",
"versionExists": "이 버전은 이미 라이브러리에 있습니다",
"downloadCompleted": "다운로드가 성공적으로 완료되었습니다",
"downloadSkippedByBaseModel": "기본 모델 {baseModel}이(가) 제외되어 다운로드를 건너뛰었습니다",
"downloadSkippedByBaseModel": "베이스 모델 {baseModel}이(가) 제외되어 다운로드를 건너뛰었습니다",
"autoOrganizeSuccess": "{count}개의 {type}에 대해 자동 정리가 성공적으로 완료되었습니다",
"autoOrganizePartialSuccess": "자동 정리 완료: 전체 {total}개 중 {success}개 이동, {failures}개 실패",
"autoOrganizeFailed": "자동 정리 실패: {error}",
@@ -2026,7 +2030,7 @@
"negativePromptUpdated": "네거티브 프롬프트가 성공적으로 업데이트되었습니다",
"promptEditorHint": "Enter 키를 눌러 저장, Shift+Enter로 새 줄",
"noRecipeId": "사용 가능한 레시피 ID가 없습니다",
"sendToWorkflowFailed": "워크플로에 레시피 보내기 실패: {message}",
"sendToWorkflowFailed": "워크플로에 레시피 보내기 실패: {message}",
"copyFailed": "레시피 문법 복사 오류: {message}",
"createError": "레시피 생성 중 오류 발생:{message}",
"createFailed": "레시피 생성 실패:{error}",
@@ -2044,9 +2048,9 @@
"cannotSend": "레시피를 전송할 수 없습니다: 레시피 ID 누락",
"sendFailed": "레시피를 워크플로로 전송하는데 실패했습니다",
"sendError": "레시피를 워크플로로 전송하는 중 오류",
"missingCheckpointPath": "체크포인트 경로를 사용할 수 없습니다",
"missingCheckpointInfo": "체크포인트 정보가 부족합니다",
"downloadCheckpointFailed": "체크포인트 다운로드 실패: {message}",
"missingCheckpointPath": "Checkpoint 경로를 사용할 수 없습니다",
"missingCheckpointInfo": "Checkpoint 정보가 부족합니다",
"downloadCheckpointFailed": "Checkpoint 다운로드 실패: {message}",
"missingLoraDownloadInfo": "이 LoRA의 다운로드 정보가 없습니다",
"hashNotFoundOnCivitai": "이 LoRA 해시는 CivitAI에서 해석할 수 없습니다 - 모델이 업데이트되었거나 해시가 유효하지 않을 수 있습니다",
"downloadLoraFailed": "LoRA 다운로드 실패: {message}",
@@ -2064,18 +2068,18 @@
"processingError": "처리 오류: {message}",
"folderBrowserError": "폴더 브라우저 로딩 오류: {message}",
"recipeSaveFailed": "레시피 저장 실패: {error}",
"recipeSaved": "Recipe saved successfully",
"recipeSaved": "레시피가 저장되었습니다",
"importFailed": "가져오기 실패: {message}",
"folderTreeFailed": "폴더 트리 로딩 실패",
"folderTreeError": "폴더 트리 로딩 오류",
"batchImportFailed": "Failed to start batch import: {message}",
"batchImportCancelling": "Cancelling batch import...",
"batchImportCancelFailed": "Failed to cancel batch import: {message}",
"batchImportNoUrls": "Please enter at least one URL or file path",
"batchImportNoDirectory": "Please enter a directory path",
"batchImportRateLimited": "메타데이터 제공자 속도 제한 도달했습니다 — 요청이 느려지고 일부 항목이 건너뛰어질 수 있습니다. 나중에 가져오기를 다시 실행할 수 있습니다.",
"batchImportBrowseFailed": "Failed to browse directory: {message}",
"batchImportDirectorySelected": "Directory selected: {path}",
"batchImportFailed": "일괄 가져오기를 시작하지 못했습니다: {message}",
"batchImportCancelling": "일괄 가져오기를 취소하는 중...",
"batchImportCancelFailed": "일괄 가져오기를 취소하지 못했습니다: {message}",
"batchImportNoUrls": "URL 또는 파일 경로를 하나 이상 입력하세요",
"batchImportNoDirectory": "폴더 경로를 입력하세요",
"batchImportRateLimited": "메타데이터 제공자 속도 제한 도달 — 요청이 느려지고 일부 항목이 건너뛰어질 수 있습니다. 나중에 가져오기를 다시 실행할 수 있습니다.",
"batchImportBrowseFailed": "폴더를 찾아보지 못했습니다: {message}",
"batchImportDirectorySelected": "선택한 폴더: {path}",
"noRecipesSelected": "선택한 레시피가 없습니다",
"repairBulkComplete": "복구 완료: {repaired}개 복구, {skipped}개 건너뜀 (총 {total}개)",
"repairBulkSkipped": "선택한 {total}개 레시피는 복구가 필요하지 않습니다",
@@ -2131,8 +2135,8 @@
"bulkUpdatesChecking": "선택한 {type}의 업데이트를 확인하는 중...",
"bulkUpdatesSuccess": "선택한 {count}개의 {type}에 사용할 수 있는 업데이트가 있습니다",
"bulkUpdatesNone": "선택한 {type}에 대한 업데이트가 없습니다",
"bulkUpdatesMissing": "선택한 {type}이 Civitai 업데이트에 연결되어 있지 않습니다",
"bulkUpdatesPartialMissing": "Civitai 링크가 없는 {missing}개의 {type}을 건너뛰었습니다",
"bulkUpdatesMissing": "선택한 {type}이 CivitAI 업데이트에 연결되어 있지 않습니다",
"bulkUpdatesPartialMissing": "CivitAI 링크가 없는 {missing}개의 {type}을 건너뛰었습니다",
"bulkUpdatesFailed": "선택한 {type}의 업데이트 확인에 실패했습니다: {message}",
"invalidCharactersRemoved": "파일명에서 잘못된 문자가 제거되었습니다",
"filenameCannotBeEmpty": "파일 이름은 비어있을 수 없습니다",
@@ -2172,8 +2176,8 @@
"compactModeToggled": "컴팩트 모드 {state}",
"settingSaveFailed": "설정 저장 실패: {message}",
"displayDensitySet": "표시 밀도가 {density}로 설정되었습니다",
"libraryLoadFailed": "Failed to load libraries: {message}",
"libraryActivateFailed": "Failed to activate library: {message}",
"libraryLoadFailed": "라이브러리를 불러오지 못했습니다: {message}",
"libraryActivateFailed": "라이브러리를 활성화하지 못했습니다: {message}",
"languageChangeFailed": "언어 변경 실패: {message}",
"cacheCleared": "캐시 파일이 성공적으로 지워졌습니다. 다음 작업 시 캐시가 재구축됩니다.",
"cacheClearFailed": "캐시 지우기 실패: {error}",
@@ -2258,7 +2262,7 @@
"contextMenu": {
"contentRatingSet": "콘텐츠 등급이 {level}로 설정되었습니다",
"contentRatingFailed": "콘텐츠 등급 설정 실패: {message}",
"relinkSuccess": "모델이 Civitai에 성공적으로 다시 연결되었습니다",
"relinkSuccess": "모델이 CivitAI에 성공적으로 다시 연결되었습니다",
"relinkFailed": "오류: {message}",
"linkHfSuccess": "모델이 HuggingFace에 연결되었습니다",
"linkHfFailed": "오류: {message}",
@@ -2322,7 +2326,7 @@
"bulkMoveSuccess": "{successCount}개 {type}이(가) 성공적으로 이동되었습니다",
"exampleImagesDownloadSuccess": "예시 이미지가 성공적으로 다운로드되었습니다!",
"exampleImagesDownloadFailed": "예시 이미지 다운로드 실패: {message}",
"moveFailed": "Failed to move item: {message}",
"moveFailed": "항목을 이동하지 못했습니다: {message}",
"copiedToClipboard": "클립보드에 복사됨",
"downloadStarted": "다운로드 시작됨"
},
@@ -2352,7 +2356,7 @@
},
"issues": {
"civitai_api_key": {
"title": "Civitai API 키"
"title": "CivitAI API 키"
},
"cache_health": {
"title": "모델 캐시 상태"
@@ -2390,7 +2394,7 @@
"conflictConfirm": {
"title": "파일명 충돌 해결",
"message": "중복 파일명에 4자리 해시를 추가하여 이름을 변경합니다.",
"note": "이 작업은 디스크에 있는 파일의 이름을 변경합니다. A1111 구문 형식을 사용하는 경우 기존 워크플로의 모델 참조를 업데이트해야 할 수 있습니다.",
"note": "이 작업은 디스크에 있는 파일의 이름을 변경합니다. A1111 구문 형식을 사용하는 경우 기존 워크플로의 모델 참조를 업데이트해야 할 수 있습니다.",
"detail": "예시: <code>filename_v1.2</code> → <code>filename_v1.2-ab3c</code>",
"impact": "<strong>{groups}</strong>개 중복 그룹에서 <strong>{count}</strong>개 파일 이름을 변경합니다",
"confirm": "파일 이름 변경",
@@ -2405,10 +2409,10 @@
"seconds": "초"
},
"communitySupport": {
"title": "Keep LoRA Manager Thriving with Your Support ❤️",
"content": "LoRA Manager is a passion project maintained full-time by a solo developer. Your support on Ko-fi helps cover development costs, keeps new updates coming, and unlocks a license key for the LM Civitai Extension as a thank-you gift. Every contribution truly makes a difference.",
"supportCta": "Support on Ko-fi",
"learnMore": "LM Civitai Extension Tutorial"
"title": "여러분의 지원으로 LoRA Manager가 계속 성장합니다 ❤️",
"content": "LoRA Manager는 한 명의 개발자가 전담으로 유지하는 열정적인 프로젝트입니다. Ko-fi에서의 지원은 개발 비용을 충당하고 새로운 업데이트를 제공하는 데 도움이 되며, 감사의 의미로 LM CivitAI 확장 기능의 라이선스 키를 드립니다. 모든 기여가 실질적인 차이를 만듭니다.",
"supportCta": "Ko-fi에서 지원하기",
"learnMore": "LM CivitAI 확장 기능 튜토리얼"
},
"cacheHealth": {
"corrupted": {
+181 -177
View File
@@ -67,11 +67,11 @@
"steps": {
"fetch": {
"title": "Получить метаданные моделей",
"content": "Нажмите кнопку <strong>Получить</strong>, чтобы загрузить метаданные моделей и изображения превью с Civitai."
"content": "Нажмите кнопку <strong>Получить</strong>, чтобы загрузить метаданные моделей и изображения превью с CivitAI."
},
"download": {
"title": "Загрузить новые модели",
"content": "Используйте кнопку <strong>Загрузить</strong> для скачивания моделей напрямую по URL Civitai."
"content": "Используйте кнопку <strong>Загрузить</strong> для скачивания моделей напрямую по URL CivitAI."
},
"bulk": {
"title": "Массовые операции",
@@ -103,8 +103,8 @@
"actions": {
"addToFavorites": "Добавить в избранное",
"removeFromFavorites": "Удалить из избранного",
"viewOnCivitai": "Посмотреть на Civitai",
"notAvailableFromCivitai": "Недоступно на Civitai",
"viewOnCivitai": "Посмотреть на CivitAI",
"notAvailableFromCivitai": "Недоступно на CivitAI",
"viewOnHuggingFace": "Открыть Hugging Face",
"sendToWorkflow": "Отправить в ComfyUI (Клик: Добавить, Shift+Клик: Заменить)",
"copyLoRASyntax": "Копировать синтаксис LoRA",
@@ -137,7 +137,7 @@
"exampleImages": {
"checkError": "Ошибка проверки примеров изображений",
"missingHash": "Отсутствует хеш модели.",
"noRemoteImagesAvailable": "Нет удаленных примеров изображений для этой модели на Civitai"
"noRemoteImagesAvailable": "Нет удаленных примеров изображений для этой модели на CivitAI"
},
"badges": {
"update": "Обновление",
@@ -173,11 +173,11 @@
"error": "Не удалось очистить папки с примерами изображений: {message}"
},
"fetchMissingLicenses": {
"label": "Refresh license metadata",
"loading": "Refreshing license metadata for {typePlural}...",
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
"label": "Обновить метаданные лицензии",
"loading": "Обновление метаданных лицензии для {typePlural}...",
"success": "Обновлены метаданные лицензии для {count} {typePlural}",
"none": "У всех {typePlural} уже есть метаданные лицензии",
"error": "Не удалось обновить метаданные лицензии для {typePlural}: {message}"
},
"repairRecipes": {
"label": "Восстановить данные рецептов",
@@ -226,7 +226,7 @@
"title": "Название рецепта",
"loraName": "Имя файла LoRA",
"loraModel": "Название модели LoRA",
"prompt": "Запрос"
"prompt": "Промпт"
}
},
"filter": {
@@ -271,7 +271,7 @@
"switchToLight": "Переключить на светлую тему",
"switchToDark": "Переключить на тёмную тему",
"switchToAuto": "Переключить на автоматическую тему",
"presets": "Предустановки тем",
"presets": "Пресеты тем",
"default": "По умолчанию",
"nord": "Nord",
"midnight": "Midnight",
@@ -290,15 +290,15 @@
}
},
"settings": {
"civitaiApiKey": "Ключ API Civitai",
"civitaiApiKeyPlaceholder": "Введите ваш ключ API Civitai",
"civitaiApiKeyHelp": "Используется для аутентификации при загрузке моделей с Civitai",
"civitaiApiKey": "Ключ API CivitAI",
"civitaiApiKeyPlaceholder": "Введите ваш ключ API CivitAI",
"civitaiApiKeyHelp": "Используется для аутентификации при загрузке моделей с CivitAI",
"civitaiApiKeyConfigured": "Настроен",
"civitaiApiKeyNotConfigured": "Не настроен",
"civitaiApiKeySet": "Настроить",
"civitaiHost": {
"label": "Хост Civitai",
"help": "Выберите, какой сайт Civitai будет открываться при использовании ссылок «View on Civitai».",
"label": "Хост CivitAI",
"help": "Выберите, какой сайт CivitAI будет открываться при использовании ссылок «View on CivitAI».",
"options": {
"com": "civitai.com (только SFW)",
"red": "civitai.red (без ограничений)"
@@ -319,8 +319,8 @@
},
"aria2HelpLink": "Узнайте, как настроить сервер загрузки aria2",
"civitaiHostBanner": {
"title": "Доступна настройка хоста Civitai",
"content": "Теперь Civitai использует civitai.com для контента SFW и civitai.red для контента без ограничений. В настройках можно изменить, какой сайт открывать по умолчанию.",
"title": "Доступна настройка хоста CivitAI",
"content": "Теперь CivitAI использует civitai.com для контента SFW и civitai.red для контента без ограничений. В настройках можно изменить, какой сайт открывать по умолчанию.",
"openSettings": "Открыть настройки"
},
"openSettingsFileLocation": {
@@ -428,7 +428,7 @@
},
"downloadSkipBaseModels": {
"label": "Пропускать загрузки для базовых моделей",
"help": "Применяется ко всем сценариям загрузки. Здесь можно выбрать только поддерживаемые базовые модели.",
"help": "При включении версии, использующие выбранные базовые модели, будут пропущены.",
"searchPlaceholder": "Фильтровать базовые модели...",
"empty": "Нет базовых моделей, соответствующих текущему поиску.",
"summary": {
@@ -450,7 +450,7 @@
},
"layoutSettings": {
"groupByModel": "Группировать по модели",
"groupByModelHelp": "При включении отображается только последняя версия каждой модели Civitai в виде одной карточки. Старые версии скрыты.",
"groupByModelHelp": "При включении отображается только последняя версия каждой модели CivitAI в виде одной карточки. Старые версии скрыты.",
"displayDensity": "Плотность отображения",
"displayDensityOptions": {
"default": "По умолчанию",
@@ -517,7 +517,7 @@
"extraFolderPaths": {
"title": "Дополнительные пути к папкам",
"description": "Дополнительные корневые пути моделей, эксклюзивные для LoRA Manager. Загружайте модели из расположений за пределами стандартных папок ComfyUI — идеально подходит для больших библиотек, которые иначе замедлили бы ComfyUI.",
"restartRequired": "Requires restart to take effect",
"restartRequired": "Требуется перезапуск, чтобы изменения вступили в силу",
"modelTypes": {
"lora": "Пути LoRA",
"checkpoint": "Пути Checkpoint",
@@ -540,8 +540,8 @@
"helpLinkLabel": "Открыть справку по приоритетным тегам",
"modelTypes": {
"lora": "LoRA",
"checkpoint": "Чекпойнт",
"embedding": "Эмбеддинг"
"checkpoint": "Checkpoint",
"embedding": "Embedding"
},
"saveSuccess": "Приоритетные теги обновлены.",
"saveError": "Не удалось обновить приоритетные теги.",
@@ -555,7 +555,7 @@
},
"downloadPathTemplates": {
"title": "Шаблоны путей загрузки",
"help": "Настройте структуру папок для разных типов моделей при загрузке с Civitai.",
"help": "Настройте структуру папок для разных типов моделей при загрузке с CivitAI.",
"availablePlaceholders": "Доступные заполнители:",
"templateOptions": {
"flatStructure": "Плоская структура",
@@ -592,7 +592,7 @@
"exampleImages": {
"downloadLocation": "Место загрузки",
"downloadLocationPlaceholder": "Введите путь к папке для примеров изображений",
"downloadLocationHelp": "Введите путь к папке, где будут сохраняться примеры изображений с Civitai",
"downloadLocationHelp": "Введите путь к папке, где будут сохраняться примеры изображений с CivitAI",
"autoDownload": "Автозагрузка примеров изображений",
"autoDownloadHelp": "Автоматически загружать примеры изображений для моделей, у которых их нет (требует настройки места загрузки)",
"openMode": "Действие открытия примеров изображений",
@@ -625,7 +625,7 @@
},
"hideEarlyAccessUpdates": {
"label": "Скрыть обновления раннего доступа",
"help": "Только обновления раннего доступа"
"help": "При включении модели, у которых есть только обновления раннего доступа, не будут показывать значок «Доступно обновление»."
},
"hidePaidUpdates": {
"label": "Скрывать платные обновления",
@@ -639,7 +639,7 @@
"includeTriggerWords": "Включать триггерные слова в синтаксис LoRA",
"includeTriggerWordsHelp": "Включать обученные триггерные слова при копировании синтаксиса LoRA в буфер обмена",
"loraSyntaxFormat": "Формат синтаксиса LoRA",
"loraSyntaxFormatHelp": "Формат синтаксиса LoRA. Полный путь включает подпапку (<lora:style/anime/x:1.0>) для безпотерьного разрешения модели. Устаревший использует только имя файла (<lora:x:1.0>) — соглашение A1111, может быть неоднозначным при дублировании имён файлов в разных папках.",
"loraSyntaxFormatHelp": "Формат синтаксиса LoRA. Полный путь включает подпапку (<lora:style/anime/x:1.0>) для беспотерьного разрешения модели. Устаревший использует только имя файла (<lora:x:1.0>) — соглашение A1111, может быть неоднозначным при дублировании имён файлов в разных папках.",
"loraSyntaxFormatOptions": {
"full": "Полный путь (подпапка/имя)",
"legacy": "Устаревший A1111 (только имя)"
@@ -647,7 +647,7 @@
},
"metadataArchive": {
"enableArchiveDb": "Включить архив метаданных",
"enableArchiveDbHelp": "Использовать локальную базу данных для доступа к метаданным моделей, удалённых с Civitai.",
"enableArchiveDbHelp": "Использовать локальную базу данных для доступа к метаданным моделей, удалённых с CivitAI.",
"status": "Статус",
"statusAvailable": "Доступно",
"statusUnavailable": "Недоступно",
@@ -708,7 +708,7 @@
"custom": "Пользовательский (совместимый с OpenAI)"
},
"apiBase": "Базовый URL API",
"apiBaseHelp": "Базовый URL для LLM API (например, https://api.openai.com/v1). Оставьте пустым, чтобы использовать значение по умолчанию.",
"apiBaseHelp": "Базовый URL для LLM API. Выберите пресет или введите свой URL. В раскрывающемся списке отображаются пресеты для всех поддерживаемых провайдеров.",
"apiBasePlaceholder": "https://api.openai.com/v1",
"apiKey": "API-ключ",
"apiKeyHelp": "Ваш API-ключ поставщика LLM. Хранится локально и никогда не отправляется на другие серверы, кроме выбранного поставщика LLM.",
@@ -750,7 +750,7 @@
"fullTooltip": "Перечитывает все данные моделей из файлов метаданных — используйте, если библиотека выглядит устаревшей или после ручных правок."
},
"fetch": {
"title": "Получить метаданные с Civitai",
"title": "Получить метаданные с CivitAI",
"action": "Получить"
},
"download": {
@@ -803,8 +803,8 @@
"downloadMissingExamples": "Скачать недостающие",
"reprocessExamples": "Обработать всё заново",
"clear": "Очистить выбор",
"skipMetadataRefreshCount": "Пропустить{count} моделей",
"resumeMetadataRefreshCount": "Возобновить{count} моделей",
"skipMetadataRefreshCount": "Пропустить({count} моделей)",
"resumeMetadataRefreshCount": "Возобновить({count} моделей)",
"sendToWorkflow": "Отправить в Workflow",
"sections": {
"workflow": "Workflow",
@@ -825,10 +825,10 @@
"enrichHfAgent": "Обогатить HF метаданные (ИИ)"
},
"contextMenu": {
"refreshMetadata": "Обновить данные Civitai",
"refreshMetadata": "Обновить данные CivitAI",
"checkUpdates": "Проверить обновления",
"linkModel": "Связать модель",
"linkCivitai": "Пересвязать с Civitai",
"linkCivitai": "Пересвязать с CivitAI",
"linkHuggingFace": "Связать с HuggingFace",
"copySyntax": "Копировать синтаксис LoRA",
"copyFilename": "Копировать имя файла модели",
@@ -860,6 +860,7 @@
"actions": {
"sendCheckpoint": "Отправить в ComfyUI",
"sendRecipe": "Отправить в ComfyUI",
"copyRecipeSyntax": "Копировать синтаксис рецепта",
"deleteRecipeWithShortcut": "Удалить рецепт (Del)"
},
"navigation": {
@@ -883,23 +884,26 @@
"loraStatus": {
"none": "В этом рецепте нет LoRAs",
"allAvailable": "Все LoRAs доступны - Готово к использованию",
"missing": "Отсутствует {missing} из {total} LoRAs"
"missing": "Отсутствует {missing} из {total} LoRAs",
"missingAndUnavailable": "Отсутствует {missing} из {total} LoRAs, {unavailable} недоступны (удалены из источника или хеш не разрешается)",
"partial": "{unavailable} из {total} LoRAs недоступны (удалены из источника или хеш не разрешается) - будут пропущены при использовании рецепта",
"noneUsable": "Нет доступных LoRAs - {unavailable} из {total} удалены из источника или хеш не разрешается"
},
"resources": {
"inLibrary": "В библиотеке",
"notInLibrary": "Не в библиотеке",
"deleted": "Удалено",
"hashInvalid": "Нераспознанный хэш",
"hashInvalid": "Нераспознанный хеш",
"inLibraryTooltip": "Эта модель есть в вашей локальной библиотеке",
"notInLibraryTooltip": "Этой модели нет в вашей библиотеке",
"deletedTooltip": "Этот LoRA был удалён из источника и больше недоступен для скачивания",
"hashInvalidTooltip": "Этот хэш LoRA не удаётся распознать на CivitAI - возможно, модель была обновлена",
"hashInvalidTooltip": "Этот хеш LoRA не удаётся распознать на CivitAI - возможно, модель была обновлена",
"download": "Скачать",
"downloadLoraTooltip": "Скачать этот LoRA",
"preparingDownload": "Подготовка к скачиванию",
"preparingDownload": "Подготовка к скачиванию...",
"reconnect": "Переподключить",
"reconnectTooltip": "Переподключить к локальному LoRA",
"viewOnCivitai": "Открыть на Civitai",
"viewOnCivitai": "Открыть на CivitAI",
"openLoraDetails": "Открыть {name} в библиотеке LoRA",
"openCheckpointDetails": "Открыть {name} в библиотеке моделей"
},
@@ -911,7 +915,7 @@
"dropZoneHint": "Перетащите изображение сюда, вставьте из буфера обмена или нажмите для выбора",
"orDivider": "или перетащите / вставьте изображение",
"imageUrlOrPath": "URL изображения или путь к файлу:",
"urlPlaceholder": "https://civitai.com/images/... или C:/path/to/image.png",
"urlPlaceholder": "https://civitai.com/images/... или https://civitai.red/images/... или C:/path/to/image.png",
"fetchImage": "Получить изображение",
"recipeName": "Название рецепта",
"recipeNamePlaceholder": "Введите название рецепта",
@@ -940,7 +944,7 @@
"downloadingLoras": "Загрузка LoRAs...",
"savingRecipe": "Сохранение рецепта...",
"startingDownload": "Начало загрузки LoRA {current}/{total}",
"deletedFromCivitai": "Удалено с Civitai",
"deletedFromCivitai": "Удалено с CivitAI",
"inLibrary": "В библиотеке",
"notInLibrary": "Не в библиотеке",
"earlyAccessRequired": "Для загрузки этой LoRA требуется платный ранний доступ.",
@@ -998,12 +1002,12 @@
"noGroups": "Дубликатов с текущим критерием не найдено",
"keepLatest": "Оставить последние версии",
"deleteSelected": "Удалить выбранные",
"includePromptLabel": "Учитывать запрос при поиске дубликатов",
"includePromptLabel": "Учитывать промпт при поиске дубликатов",
"basis": {
"loraCombo": "Критерий: комбинация LoRA",
"loraComboAndPrompt": "Критерий: комбинация LoRA + запрос",
"loraComboAndPrompt": "Критерий: комбинация LoRA + промпт",
"hintLoraCombo": "Рецепты с одинаковыми LoRA и одинаковой силой группируются вместе.",
"hintPromptIncluded": "Рецепты группируются только при одинаковых LoRA с одинаковой силой И одинаковом запросе."
"hintPromptIncluded": "Рецепты группируются только при одинаковых LoRA с одинаковой силой И одинаковом промпте."
}
},
"contextMenu": {
@@ -1042,63 +1046,63 @@
}
},
"batchImport": {
"title": "Batch Import Recipes",
"action": "Batch Import",
"urlList": "URL List",
"directory": "Directory",
"urlDescription": "Enter image URLs or local file paths (one per line). Each will be imported as a recipe.",
"directoryDescription": "Enter a directory path to import all images from that folder.",
"urlsLabel": "Image URLs or Local Paths",
"title": "Пакетный импорт рецептов",
"action": "Пакетный импорт",
"urlList": "Список URL",
"directory": "Папка",
"urlDescription": "Введите URL изображений или локальные пути к файлам (по одному на строку). Каждый будет импортирован как рецепт.",
"directoryDescription": "Введите путь к папке, чтобы импортировать все изображения из неё.",
"urlsLabel": "URL изображений или локальные пути",
"urlsPlaceholder": "https://civitai.com/images/...\nhttps://civitai.com/images/...\nC:/path/to/image.png\n...",
"urlsHint": "Enter one URL or path per line",
"directoryPath": "Directory Path",
"urlsHint": "Один URL или путь на строку",
"directoryPath": "Путь к папке",
"directoryPlaceholder": "/path/to/images/folder",
"browse": "Browse",
"recursive": "Include subdirectories",
"tagsOptional": "Tags (optional, applied to all recipes)",
"tagsPlaceholder": "Enter tags separated by commas",
"tagsHint": "Tags will be added to all imported recipes",
"skipNoMetadata": "Skip images without metadata",
"skipNoMetadataHelp": "Images without LoRA metadata will be skipped automatically.",
"start": "Start Import",
"startImport": "Start Import",
"importing": "Importing...",
"rateLimitedSlowdown": "Ограничение частоты запросов — замедление",
"browse": "Обзор",
"recursive": "Включая подпапки",
"tagsOptional": "Теги (необязательно, применяются ко всем рецептам)",
"tagsPlaceholder": "Введите теги через запятую",
"tagsHint": "Теги будут добавлены ко всем импортированным рецептам",
"skipNoMetadata": "Пропускать изображения без метаданных",
"skipNoMetadataHelp": "Изображения без метаданных LoRA будут пропущены автоматически.",
"start": "Начать импорт",
"startImport": "Начать импорт",
"importing": "Импорт...",
"rateLimitedSlowdown": "Ограничение частоты запросов — замедление...",
"rateLimitedHint": "Некоторые элементы были пропущены из-за ограничений частоты запросов поставщика метаданных. Повторите импорт позже, чтобы повторить попытку.",
"progress": "Progress",
"total": "Total",
"success": "Success",
"failed": "Failed",
"skipped": "Skipped",
"current": "Current",
"currentItem": "Current",
"preparing": "Preparing...",
"cancel": "Cancel",
"cancelImport": "Cancel",
"cancelled": "Import cancelled",
"completed": "Import completed",
"completedWithErrors": "Completed with errors",
"completedSuccess": "Successfully imported {count} recipe(s)",
"successCount": "Successful",
"failedCount": "Failed",
"skippedCount": "Skipped",
"totalProcessed": "Total processed",
"viewDetails": "View Details",
"newImport": "New Import",
"manualPathEntry": "Please enter the directory path manually. File browser is not available in this browser.",
"batchImportDirectorySelected": "Directory selected: {path}",
"batchImportManualEntryRequired": "File browser not available. Please enter the directory path manually.",
"backToParent": "Back to parent directory",
"folders": "Folders",
"folderCount": "{count} folders",
"imageFiles": "Image Files",
"images": "images",
"imageCount": "{count} images",
"selectFolder": "Select This Folder",
"progress": "Прогресс",
"total": "Всего",
"success": "Успешно",
"failed": "Ошибок",
"skipped": "Пропущено",
"current": "Текущий",
"currentItem": "Текущий",
"preparing": "Подготовка...",
"cancel": "Отмена",
"cancelImport": "Отмена",
"cancelled": "Импорт отменён",
"completed": "Импорт завершён",
"completedWithErrors": "Завершено с ошибками",
"completedSuccess": "Успешно импортировано рецептов: {count}",
"successCount": "Успешно",
"failedCount": "Ошибок",
"skippedCount": "Пропущено",
"totalProcessed": "Всего обработано",
"viewDetails": "Подробнее",
"newImport": "Новый импорт",
"manualPathEntry": "Введите путь к папке вручную. Выбор файлов недоступен в этом браузере.",
"batchImportDirectorySelected": "Выбрана папка: {path}",
"batchImportManualEntryRequired": "Выбор файлов недоступен. Введите путь к папке вручную.",
"backToParent": "В родительскую папку",
"folders": "Папки",
"folderCount": "Папки: {count}",
"imageFiles": "Файлы изображений",
"images": "изображения",
"imageCount": "Изображения: {count}",
"selectFolder": "Выбрать эту папку",
"errors": {
"enterUrls": "Please enter at least one URL or path",
"enterDirectory": "Please enter a directory path",
"startFailed": "Failed to start import: {message}"
"enterUrls": "Введите хотя бы один URL или путь",
"enterDirectory": "Введите путь к папке",
"startFailed": "Не удалось начать импорт: {message}"
}
}
},
@@ -1106,7 +1110,7 @@
"title": "Модели Checkpoint",
"modelTypes": {
"checkpoint": "Checkpoint",
"diffusion_model": "Diffusion Model"
"diffusion_model": "Диффузионная модель"
},
"contextMenu": {
"moveToOtherTypeFolder": "Переместить в папку {otherType}",
@@ -1165,8 +1169,8 @@
"totalGenerations": "Всего генераций",
"usageRate": "Коэффициент использования",
"loras": "LoRA",
"checkpoints": "Контрольные точки",
"embeddings": "Эмбеддинги",
"checkpoints": "Checkpoints",
"embeddings": "Embeddings",
"uniqueTags": "Уникальные теги",
"unusedModels": "Неиспользуемые модели",
"avgUsesPerModel": "Сред. использований/модель"
@@ -1199,9 +1203,9 @@
},
"unusedCheckpoints": {
"detected": {
"title": "Обнаружены неиспользуемые контрольные точки",
"description": "{percent}% ваших контрольных точек ({count}/{total}) никогда не использовались.",
"suggestion": "Проверьте и удалите ненужные контрольные точки."
"title": "Обнаружены неиспользуемые Checkpoints",
"description": "{percent}% ваших Checkpoints ({count}/{total}) никогда не использовались.",
"suggestion": "Проверьте и удалите ненужные Checkpoints."
}
},
"unusedEmbeddings": {
@@ -1243,9 +1247,9 @@
"lora": "LoRA",
"locon": "LyCORIS",
"dora": "DoRA",
"checkpoint": "Контрольная точка",
"checkpoint": "Checkpoint",
"diffusion_model": "Диффузионная модель",
"embedding": "Эмбеддинги"
"embedding": "Embeddings"
},
"placeholders": {
"loading": "Загрузка...",
@@ -1268,10 +1272,10 @@
"download": {
"title": "Скачать модель по URL",
"titleWithType": "Скачать {type} по URL",
"civitaiUrl": "Civitai URL:",
"civitaiUrl": "CivitAI URL:",
"placeholder": "https://civitai.com/models/...",
"urlHint": "Введите один URL CivitAI, CivArchive или Hugging Face в каждой строке. Поддерживает несколько URL для пакетной загрузки.",
"selectHfFiles": "Выберите файл(ы) для загрузки из этого репозитория",
"selectHfFiles": "Выберите файл(ы) для загрузки из этого репозитория:",
"selectAll": "Выбрать все",
"fetchingRepoFiles": "Получение файлов репозитория...",
"locationPreview": "Предпросмотр места загрузки",
@@ -1303,7 +1307,7 @@
"inLibrary": "В библиотеке"
},
"errors": {
"invalidUrl": "Неверный формат URL Civitai",
"invalidUrl": "Неверный формат URL CivitAI",
"noVersions": "Нет доступных версий для этой модели",
"mixedSources": "Нельзя смешивать URL-адреса CivitAI и Hugging Face в одном пакете.",
"noModelFiles": "В этом репозитории не найдено файлов моделей."
@@ -1417,7 +1421,7 @@
"title": "Локальные примеры изображений",
"message": "Локальные примеры изображений для этой модели не найдены. Варианты просмотра:",
"downloadOption": {
"title": "Скачать с Civitai",
"title": "Скачать с CivitAI",
"description": "Сохранить удаленные примеры локально для использования офлайн и более быстрой загрузки"
},
"importOption": {
@@ -1444,7 +1448,7 @@
"confirmAction": "Сохранить и связать"
},
"relinkCivitai": {
"title": "Пересвязать с Civitai",
"title": "Пересвязать с CivitAI",
"warning": "Предупреждение:",
"warningText": "Это потенциально разрушительная операция. Пересвязывание:",
"warningList": {
@@ -1453,15 +1457,15 @@
"unintendedConsequences": "Может иметь другие непредвиденные последствия"
},
"proceedText": "Продолжайте только если вы уверены, что это то, что вам нужно.",
"urlLabel": "URL модели Civitai:",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"urlLabel": "URL модели CivitAI:",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890 или https://civitai.red/models/12345/model-name?modelVersionId=67890",
"helpText": {
"title": "Вставьте любой URL модели Civitai или CivitArchive. Поддерживаемые форматы:",
"title": "Вставьте любой URL модели CivitAI или CivitArchive. Поддерживаемые форматы:",
"format1": "https://civitai.com/models/12345",
"format2": "https://civitai.com/models/12345?modelVersionId=67890",
"format3": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"note": "Примечание: Если modelVersionId не указан, будет использована последняя версия.",
"format4": "https://civarchive.com/models/12345 (CivitArchive)"
"format4": "https://civarchive.com/models/12345 (CivArchive)"
},
"confirmAction": "Подтвердить пересвязывание"
},
@@ -1471,15 +1475,15 @@
"editFileName": "Редактировать имя файла",
"editBaseModel": "Редактировать базовую модель",
"editVersionName": "Редактировать название версии",
"viewOnCivitai": "Посмотреть на Civitai",
"viewOnCivitaiText": "Посмотреть на Civitai",
"viewOnCivitai": "Посмотреть на CivitAI",
"viewOnCivitaiText": "Посмотреть на CivitAI",
"viewOnHuggingFace": "Открыть Hugging Face",
"viewOnHuggingFaceText": "Открыть Hugging Face",
"viewCreatorProfile": "Посмотреть профиль создателя",
"openFileLocation": "Открыть расположение файла",
"sendToWorkflow": "Отправить в ComfyUI",
"sendToWorkflowText": "Отправить в ComfyUI",
"copyHash": "Копировать хэш",
"copyHash": "Копировать хеш",
"deleteModelWithShortcut": "Удалить модель (Del)"
},
"openFileLocation": {
@@ -1504,7 +1508,7 @@
"notesHint": "Нажмите Enter для сохранения, Shift+Enter для новой строки",
"addNotesPlaceholder": "Добавьте ваши заметки здесь...",
"aboutThisVersion": "Об этой версии",
"baseModelSearchPlaceholder": "Поиск базовой модели",
"baseModelSearchPlaceholder": "Поиск базовой модели...",
"baseModelSuggested": "Предполагаемые",
"baseModelNoMatch": "Нет подходящих базовых моделей"
},
@@ -1573,10 +1577,10 @@
"noNext": "Следующая модель отсутствует"
},
"license": {
"noImageSell": "No selling generated content",
"noRentCivit": "No Civitai generation",
"noRent": "No generation services",
"noSell": "No selling models",
"noImageSell": "Продажа сгенерированных изображений запрещена",
"noRentCivit": "Генерация через CivitAI запрещена",
"noRent": "Сервисы генерации запрещены",
"noSell": "Продажа моделей запрещена",
"creditRequired": "Требуется указание авторства",
"noDerivatives": "Запрет на совместное использование производных работ",
"noReLicense": "Требуются те же права",
@@ -1639,33 +1643,33 @@
"newer": "Более новая версия",
"newerTooltip": "Эта версия новее вашей последней локальной версии",
"earlyAccess": "Ранний доступ",
"earlyAccessTooltip": "Для этой версии сейчас требуется ранний доступ Civitai",
"earlyAccessTooltip": "Для этой версии сейчас требуется ранний доступ CivitAI",
"paid": "Платная",
"paidTooltip": "Скачивание этой версии платное",
"ignored": "Игнорируется",
"ignoredTooltip": "Уведомления об обновлениях для этой версии отключены",
"onSiteOnly": "Только на Сайте",
"onSiteOnlyTooltip": "Эта версия доступна только для генерации на сайте Civitai"
"onSiteOnlyTooltip": "Эта версия доступна только для генерации на сайте CivitAI"
},
"actions": {
"download": "Скачать",
"downloadTooltip": "Скачать эту версию",
"downloadChooseFilesTooltip": "Выбрать файлы для скачивания",
"downloadEarlyAccessTooltip": "Скачать эту версию раннего доступа с Civitai",
"downloadPaidTooltip": "Скачать эту платную версию с Civitai",
"downloadNotAllowedTooltip": "Эта версия доступна только для генерации на сайте Civitai",
"downloadEarlyAccessTooltip": "Скачать эту версию раннего доступа с CivitAI",
"downloadPaidTooltip": "Скачать эту платную версию с CivitAI",
"downloadNotAllowedTooltip": "Эта версия доступна только для генерации на сайте CivitAI",
"delete": "Удалить",
"deleteTooltip": "Удалить эту локальную версию",
"ignore": "Игнорировать",
"unignore": "Перестать игнорировать",
"ignoreTooltip": "Игнорировать уведомления об обновлениях для этой версии",
"unignoreTooltip": "Возобновить уведомления об обновлениях для этой версии",
"viewVersionOnCivitai": "Посмотреть версию на Civitai",
"viewVersionOnCivitai": "Посмотреть версию на CivitAI",
"earlyAccessTooltip": "Требуется покупка раннего доступа",
"resumeModelUpdates": "Возобновить обновления для этой модели",
"ignoreModelUpdates": "Игнорировать обновления для этой модели",
"viewLocalVersions": "Показать все локальные версии",
"viewLocalTooltip": "Скоро появится"
"viewLocalTooltip": "Показать все локальные версии этой модели на главной странице"
},
"filters": {
"label": "Фильтр по базе",
@@ -1681,7 +1685,7 @@
},
"empty": "Для этой модели пока нет истории версий.",
"error": "Не удалось загрузить версии.",
"missingModelId": "У этой модели отсутствует идентификатор модели Civitai.",
"missingModelId": "У этой модели отсутствует идентификатор модели CivitAI.",
"hfGroupInfo": "Это группа моделей HuggingFace. Откройте библиотеку, чтобы увидеть все версии в сетке.",
"confirm": {
"delete": "Удалить эту версию из библиотеки?"
@@ -1755,7 +1759,7 @@
"message": "Сканирование и построение кэша embedding. Это может занять несколько минут..."
},
"recipes": {
"title": "Инициализация Recipe Manager",
"title": "Инициализация менеджера рецептов",
"message": "Загрузка и обработка рецептов. Это может занять несколько минут..."
},
"statistics": {
@@ -1765,14 +1769,14 @@
"tips": {
"title": "Советы и хитрости",
"civitai": {
"title": "Интеграция с Civitai",
"description": "Подключите ваш аккаунт Civitai: Перейдите в Аватар профиля → Настройки → API ключи → Добавить API ключ, затем вставьте его в настройки Lora Manager.",
"alt": "Настройка API Civitai"
"title": "Интеграция с CivitAI",
"description": "Подключите ваш аккаунт CivitAI: Перейдите в Аватар профиля → Настройки → API ключи → Добавить API ключ, затем вставьте его в настройки Lora Manager.",
"alt": "Настройка API CivitAI"
},
"download": {
"title": "Легкая загрузка",
"description": "Используйте URL Civitai для быстрой загрузки и установки новых моделей.",
"alt": "Загрузка с Civitai"
"description": "Используйте URL CivitAI для быстрой загрузки и установки новых моделей.",
"alt": "Загрузка с CivitAI"
},
"recipes": {
"title": "Сохранение рецептов",
@@ -1828,14 +1832,14 @@
"modelFailed": "Не удалось обновить узел модели",
"embeddingAdded": "Embedding добавлен в workflow",
"embeddingFailed": "Не удалось добавить embedding",
"promptSent": "Запрос отправлен в workflow",
"promptFailed": "Не удалось отправить запрос"
"promptSent": "Промпт отправлен в workflow",
"promptFailed": "Не удалось отправить промпт"
},
"nodeSelector": {
"recipe": "Рецепт",
"lora": "LoRA",
"embedding": "Эмбеддинг",
"prompt": "Запрос",
"embedding": "Embedding",
"prompt": "Промпт",
"replace": "Заменить",
"append": "Добавить",
"selectTargetNode": "Выберите целевой узел",
@@ -1956,7 +1960,7 @@
"submitGithubIssue": "Создать issue на GitHub",
"joinDiscord": "Присоединиться к Discord",
"youtubeChannel": "YouTube канал",
"civitaiProfile": "Профиль на Civitai",
"civitaiProfile": "Профиль на CivitAI",
"supportKofi": "Поддержать на Ko-fi",
"supportPatreon": "Поддержать на Patreon"
},
@@ -2026,10 +2030,10 @@
"negativePromptUpdated": "Негативный промпт успешно обновлён",
"promptEditorHint": "Нажмите Enter для сохранения, Shift+Enter для новой строки",
"noRecipeId": "ID рецепта недоступен",
"sendToWorkflowFailed": "Не удалось отправить рецепт в рабочий процесс: {message}",
"sendToWorkflowFailed": "Не удалось отправить рецепт в workflow: {message}",
"copyFailed": "Ошибка копирования синтаксиса рецепта: {message}",
"createError": "Ошибка при создании рецепта{message}",
"createFailed": "Не удалось создать рецепт{error}",
"createError": "Ошибка при создании рецепта: {message}",
"createFailed": "Не удалось создать рецепт: {error}",
"createMissingData": "Отсутствуют необходимые данные для создания рецепта",
"created": "Рецепт успешно создан",
"noMissingLoras": "Нет отсутствующих LoRAs для загрузки",
@@ -2040,7 +2044,7 @@
"enterLoraName": "Пожалуйста, введите название LoRA или синтаксис",
"reconnectedSuccessfully": "LoRA успешно переподключена",
"reconnectFailed": "Ошибка переподключения LoRA: {message}",
"noPromptToSend": "Нет запроса для отправки",
"noPromptToSend": "Нет промпта для отправки",
"cannotSend": "Невозможно отправить рецепт: отсутствует ID рецепта",
"sendFailed": "Не удалось отправить рецепт в workflow",
"sendError": "Ошибка отправки рецепта в workflow",
@@ -2048,7 +2052,7 @@
"missingCheckpointInfo": "Отсутствуют данные о чекпойнте",
"downloadCheckpointFailed": "Не удалось скачать чекпойнт: {message}",
"missingLoraDownloadInfo": "Нет информации для скачивания этого LoRA",
"hashNotFoundOnCivitai": "Этот хэш LoRA не удаётся распознать на CivitAI - возможно, модель была обновлена или хэш недействителен",
"hashNotFoundOnCivitai": "Этот хеш LoRA не удаётся распознать на CivitAI - возможно, модель была обновлена или хеш недействителен",
"downloadLoraFailed": "Не удалось скачать LoRA: {message}",
"cannotDelete": "Невозможно удалить рецепт: отсутствует ID рецепта",
"deleteConfirmationError": "Ошибка отображения подтверждения удаления",
@@ -2064,18 +2068,18 @@
"processingError": "Ошибка обработки: {message}",
"folderBrowserError": "Ошибка загрузки браузера папок: {message}",
"recipeSaveFailed": "Не удалось сохранить рецепт: {error}",
"recipeSaved": "Recipe saved successfully",
"recipeSaved": "Рецепт успешно сохранён",
"importFailed": "Импорт не удался: {message}",
"folderTreeFailed": "Не удалось загрузить дерево папок",
"folderTreeError": "Ошибка загрузки дерева папок",
"batchImportFailed": "Failed to start batch import: {message}",
"batchImportCancelling": "Cancelling batch import...",
"batchImportCancelFailed": "Failed to cancel batch import: {message}",
"batchImportNoUrls": "Please enter at least one URL or file path",
"batchImportNoDirectory": "Please enter a directory path",
"batchImportFailed": "Не удалось начать пакетный импорт: {message}",
"batchImportCancelling": "Отмена пакетного импорта...",
"batchImportCancelFailed": "Не удалось отменить пакетный импорт: {message}",
"batchImportNoUrls": "Введите хотя бы один URL или путь к файлу",
"batchImportNoDirectory": "Введите путь к папке",
"batchImportRateLimited": "Достигнуто ограничение частоты запросов поставщика метаданных — запросы замедляются, некоторые элементы могут быть пропущены. Вы можете повторить импорт позже.",
"batchImportBrowseFailed": "Failed to browse directory: {message}",
"batchImportDirectorySelected": "Directory selected: {path}",
"batchImportBrowseFailed": "Не удалось открыть папку: {message}",
"batchImportDirectorySelected": "Выбрана папка: {path}",
"noRecipesSelected": "Рецепты не выбраны",
"repairBulkComplete": "Восстановление завершено: {repaired} восстановлено, {skipped} пропущено (из {total})",
"repairBulkSkipped": "Ни один из {total} выбранных рецептов не требует восстановления",
@@ -2131,8 +2135,8 @@
"bulkUpdatesChecking": "Проверка обновлений для выбранных {type}...",
"bulkUpdatesSuccess": "Доступны обновления для {count} выбранных {type}",
"bulkUpdatesNone": "Обновления для выбранных {type} не найдены",
"bulkUpdatesMissing": "Выбранные {type} не привязаны к обновлениям Civitai",
"bulkUpdatesPartialMissing": "Пропущено {missing} выбранных {type} без привязки Civitai",
"bulkUpdatesMissing": "Выбранные {type} не привязаны к обновлениям CivitAI",
"bulkUpdatesPartialMissing": "Пропущено {missing} выбранных {type} без привязки CivitAI",
"bulkUpdatesFailed": "Не удалось проверить обновления для выбранных {type}: {message}",
"invalidCharactersRemoved": "Недопустимые символы удалены из имени файла",
"filenameCannotBeEmpty": "Имя файла не может быть пустым",
@@ -2161,7 +2165,7 @@
"checkpointRootsFailed": "Не удалось загрузить корни checkpoint: {message}",
"unetRootsFailed": "Не удалось загрузить корни Diffusion Model: {message}",
"embeddingRootsFailed": "Не удалось загрузить корни embedding: {message}",
"mappingsUpdated": "Сопоставления путей базовых моделей обновлены ({count} сопоставлени{plural})",
"mappingsUpdated": "Сопоставления путей базовых моделей обновлены ({count})",
"mappingsCleared": "Сопоставления путей базовых моделей очищены",
"mappingSaveFailed": "Не удалось сохранить сопоставления базовых моделей: {message}",
"downloadTemplatesUpdated": "Шаблоны путей загрузки обновлены",
@@ -2172,8 +2176,8 @@
"compactModeToggled": "Компактный режим {state}",
"settingSaveFailed": "Не удалось сохранить настройку: {message}",
"displayDensitySet": "Плотность отображения установлена на {density}",
"libraryLoadFailed": "Failed to load libraries: {message}",
"libraryActivateFailed": "Failed to activate library: {message}",
"libraryLoadFailed": "Не удалось загрузить библиотеки: {message}",
"libraryActivateFailed": "Не удалось активировать библиотеку: {message}",
"languageChangeFailed": "Не удалось изменить язык: {message}",
"cacheCleared": "Файлы кэша успешно очищены. Кэш будет пересобран при следующем действии.",
"cacheClearFailed": "Не удалось очистить кэш: {error}",
@@ -2258,7 +2262,7 @@
"contextMenu": {
"contentRatingSet": "Рейтинг контента установлен на {level}",
"contentRatingFailed": "Не удалось установить рейтинг контента: {message}",
"relinkSuccess": "Модель успешно пересвязана с Civitai",
"relinkSuccess": "Модель успешно пересвязана с CivitAI",
"relinkFailed": "Ошибка: {message}",
"linkHfSuccess": "Модель успешно связана с HuggingFace",
"linkHfFailed": "Ошибка: {message}",
@@ -2322,7 +2326,7 @@
"bulkMoveSuccess": "Успешно перемещено {successCount} {type}s",
"exampleImagesDownloadSuccess": "Примеры изображений успешно загружены!",
"exampleImagesDownloadFailed": "Не удалось загрузить примеры изображений: {message}",
"moveFailed": "Failed to move item: {message}",
"moveFailed": "Не удалось переместить элемент: {message}",
"copiedToClipboard": "Скопировано в буфер обмена",
"downloadStarted": "Загрузка начата"
},
@@ -2352,30 +2356,30 @@
},
"issues": {
"civitai_api_key": {
"title": "Civitai API Key"
"title": "Ключ API CivitAI"
},
"cache_health": {
"title": "Model Cache Health"
"title": "Состояние кэша моделей"
},
"filename_conflicts": {
"title": "Duplicate Filename Conflicts"
"title": "Конфликты дублирующихся имён файлов"
},
"ui_version": {
"title": "UI Version"
"title": "Версия интерфейса"
}
},
"actions": {
"runAgain": "Запустить снова",
"exportBundle": "Экспортировать пакет",
"open-settings": "Open Settings",
"open-settings-syntax-format": "Switch to Full Path Syntax",
"repair-cache": "Rebuild Cache",
"resolve-filename-conflicts": "Resolve Conflicts",
"reload-page": "Reload UI"
"open-settings": "Открыть настройки",
"open-settings-syntax-format": "Переключиться на полные пути",
"repair-cache": "Пересобрать кэш",
"resolve-filename-conflicts": "Разрешить конфликты",
"reload-page": "Перезагрузить интерфейс"
},
"labels": {
"conflicts": "Conflicts",
"version": "Version"
"conflicts": "Конфликты",
"version": "Версия"
},
"toast": {
"loadFailed": "Не удалось загрузить диагностику: {message}",
@@ -2405,10 +2409,10 @@
"seconds": "секунд"
},
"communitySupport": {
"title": "Keep LoRA Manager Thriving with Your Support ❤️",
"content": "LoRA Manager is a passion project maintained full-time by a solo developer. Your support on Ko-fi helps cover development costs, keeps new updates coming, and unlocks a license key for the LM Civitai Extension as a thank-you gift. Every contribution truly makes a difference.",
"supportCta": "Support on Ko-fi",
"learnMore": "LM Civitai Extension Tutorial"
"title": "Поддержите развитие LoRA Manager ❤️",
"content": "LoRA Manager — это проект по призванию, которым в полную силу занимается один разработчик. Ваша поддержка на Ko-fi помогает покрывать расходы на разработку, обеспечивает новые обновления и даёт лицензионный ключ для расширения LM CivitAI в качестве благодарности. Каждый вклад действительно важен.",
"supportCta": "Поддержать на Ko-fi",
"learnMore": "Руководство по расширению LM CivitAI"
},
"cacheHealth": {
"corrupted": {
+99 -95
View File
@@ -67,11 +67,11 @@
"steps": {
"fetch": {
"title": "获取模型元数据",
"content": "点击 <strong>获取</strong> 按钮,从 Civitai 下载模型元数据和预览图片。"
"content": "点击 <strong>获取</strong> 按钮,从 CivitAI 下载模型元数据和预览图片。"
},
"download": {
"title": "下载新模型",
"content": "使用 <strong>下载</strong> 按钮,可直接通过 Civitai URL 下载模型。"
"content": "使用 <strong>下载</strong> 按钮,可直接通过 CivitAI URL 下载模型。"
},
"bulk": {
"title": "批量操作",
@@ -103,12 +103,12 @@
"actions": {
"addToFavorites": "添加到收藏",
"removeFromFavorites": "从收藏移除",
"viewOnCivitai": "在 Civitai 查看",
"notAvailableFromCivitai": "Civitai 上不可用",
"viewOnCivitai": "在 CivitAI 查看",
"notAvailableFromCivitai": "CivitAI 上不可用",
"viewOnHuggingFace": "在 Hugging Face 查看",
"sendToWorkflow": "发送到 ComfyUI(点击:追加,Shift+点击:替换)",
"copyLoRASyntax": "复制 LoRA 语法",
"checkpointNameCopied": "检查点名称已复制",
"checkpointNameCopied": "Checkpoint 名称已复制",
"toggleBlur": "切换模糊",
"show": "显示",
"openExampleImages": "打开示例图片文件夹",
@@ -131,13 +131,13 @@
"updateFailed": "收藏状态更新失败"
},
"sendToWorkflow": {
"checkpointNotImplemented": "发送检查点到工作流 - 功能待实现",
"checkpointNotImplemented": "发送Checkpoint到工作流 - 功能待实现",
"missingPath": "无法确定此卡片的模型路径"
},
"exampleImages": {
"checkError": "检查示例图片时出错",
"missingHash": "缺少模型哈希信息。",
"noRemoteImagesAvailable": "此模型在 Civitai 上没有远程示例图片"
"noRemoteImagesAvailable": "此模型在 CivitAI 上没有远程示例图片"
},
"badges": {
"update": "更新",
@@ -187,14 +187,14 @@
"error": "配方修复失败:{message}"
},
"rematchRecipes": {
"label": "将食谱重新匹配到本地模型",
"loading": "正在将食谱重新匹配到本地模型...",
"success": "已匹配 {entries} 个条目,涉及 {recipes} 个食谱",
"successErrors": "已匹配 {entries} 个条目,涉及 {recipes} 个食谱{failures} 个失败",
"allFailed": "{failures}/{total} 个食谱重新匹配失败",
"noMatch": "在 {recipes} 个食谱中未找到 {entries} 个条目的本地匹配",
"cancelled": "已取消重新匹配。{recipes} 个食谱已更新({entries} 个条目)。",
"error": "食谱重新匹配失败:{message}"
"label": "将配方重新匹配到本地模型",
"loading": "正在将配方重新匹配到本地模型...",
"success": "已匹配 {entries} 个条目,涉及 {recipes} 个配方",
"successErrors": "已匹配 {entries} 个条目,涉及 {recipes} 个配方{failures} 个失败",
"allFailed": "{failures}/{total} 个配方重新匹配失败",
"noMatch": "在 {recipes} 个配方中未找到 {entries} 个条目的本地匹配",
"cancelled": "已取消重新匹配。{recipes} 个配方已更新({entries} 个条目)。",
"error": "配方重新匹配失败:{message}"
},
"manageExcludedModels": {
"label": "管理已排除的模型"
@@ -290,15 +290,15 @@
}
},
"settings": {
"civitaiApiKey": "Civitai API 密钥",
"civitaiApiKeyPlaceholder": "请输入你的 Civitai API 密钥",
"civitaiApiKeyHelp": "用于从 Civitai 下载模型时的身份验证",
"civitaiApiKey": "CivitAI API 密钥",
"civitaiApiKeyPlaceholder": "请输入你的 CivitAI API 密钥",
"civitaiApiKeyHelp": "用于从 CivitAI 下载模型时的身份验证",
"civitaiApiKeyConfigured": "已配置",
"civitaiApiKeyNotConfigured": "未配置",
"civitaiApiKeySet": "设置",
"civitaiHost": {
"label": "Civitai 站点",
"help": "选择使用“在 Civitai 中查看”时默认打开的 Civitai 站点。",
"label": "CivitAI 站点",
"help": "选择使用“在 CivitAI 中查看”时默认打开的 CivitAI 站点。",
"options": {
"com": "civitai.com(仅 SFW",
"red": "civitai.red(无限制)"
@@ -319,8 +319,8 @@
},
"aria2HelpLink": "了解如何配置 aria2 下载后端",
"civitaiHostBanner": {
"title": "已提供 Civitai 站点偏好设置",
"content": "Civitai 现在使用 civitai.com 提供 SFW 内容,使用 civitai.red 提供无限制内容。你可以在设置中更改默认打开的站点。",
"title": "已提供 CivitAI 站点偏好设置",
"content": "CivitAI 现在使用 civitai.com 提供 SFW 内容,使用 civitai.red 提供无限制内容。你可以在设置中更改默认打开的站点。",
"openSettings": "打开设置"
},
"openSettingsFileLocation": {
@@ -428,7 +428,7 @@
},
"downloadSkipBaseModels": {
"label": "跳过这些基础模型的下载",
"help": "适用于所有下载流程。这里只能选择受支持的基础模型。",
"help": "启用后,使用所选基础模型的版本将被跳过。",
"searchPlaceholder": "筛选基础模型...",
"empty": "没有与当前搜索匹配的基础模型。",
"summary": {
@@ -450,7 +450,7 @@
},
"layoutSettings": {
"groupByModel": "按模型分组",
"groupByModelHelp": "开启后,每个 Civitai 模型仅显示最新版本的单张卡片,旧版本将被隐藏。",
"groupByModelHelp": "开启后,每个 CivitAI 模型仅显示最新版本的单张卡片,旧版本将被隐藏。",
"displayDensity": "显示密度",
"displayDensityOptions": {
"default": "默认",
@@ -555,7 +555,7 @@
},
"downloadPathTemplates": {
"title": "下载路径模板",
"help": "配置从 Civitai 下载不同模型类型的文件夹结构。",
"help": "配置从 CivitAI 下载不同模型类型的文件夹结构。",
"availablePlaceholders": "可用占位符:",
"templateOptions": {
"flatStructure": "扁平结构",
@@ -592,7 +592,7 @@
"exampleImages": {
"downloadLocation": "下载位置",
"downloadLocationPlaceholder": "输入示例图片文件夹路径",
"downloadLocationHelp": "输入保存从 Civitai 下载的示例图片的文件夹路径",
"downloadLocationHelp": "输入保存从 CivitAI 下载的示例图片的文件夹路径",
"autoDownload": "自动下载示例图片",
"autoDownloadHelp": "自动为没有示例图片的模型下载示例图片(需设置下载位置)",
"openMode": "打开示例图片操作",
@@ -625,7 +625,7 @@
},
"hideEarlyAccessUpdates": {
"label": "隐藏抢先体验更新",
"help": "抢先体验更新"
"help": "启用后,仅有抢先体验更新的模型将不显示“可更新”徽章。"
},
"hidePaidUpdates": {
"label": "隐藏付费更新",
@@ -647,7 +647,7 @@
},
"metadataArchive": {
"enableArchiveDb": "启用元数据归档数据库",
"enableArchiveDbHelp": "使用本地数据库访问已从 Civitai 删除的模型元数据。",
"enableArchiveDbHelp": "使用本地数据库访问已从 CivitAI 删除的模型元数据。",
"status": "状态",
"statusAvailable": "可用",
"statusUnavailable": "不可用",
@@ -696,7 +696,7 @@
"aiProvider": {
"title": "AI 提供商",
"provider": "提供商",
"providerHelp": "选择的 LLM 提供商。OpenAI 和 Ollama 使用预设的 API 端点。自定义允许指定任何兼容 OpenAI 的端点。",
"providerHelp": "选择的 LLM 提供商。OpenAI 和 Ollama 使用预设的 API 端点。自定义允许指定任何兼容 OpenAI 的端点。",
"providerOptions": {
"openai": "OpenAI",
"ollama": "Ollama(本地)",
@@ -711,7 +711,7 @@
"apiBaseHelp": "LLM API 的基础地址。选择预设或输入自定义地址,下拉框显示所有支持的提供商预设。",
"apiBasePlaceholder": "https://api.openai.com/v1",
"apiKey": "API 密钥",
"apiKeyHelp": "LLM 提供商的 API 密钥。本地存储,除选择的 LLM 提供商外不会发送到任何服务器。",
"apiKeyHelp": "LLM 提供商的 API 密钥。本地存储,除选择的 LLM 提供商外不会发送到任何服务器。",
"apiKeyPlaceholder": "sk-...",
"apiKeyNotSet": "未设置",
"apiKeyConfigured": "已配置",
@@ -750,7 +750,7 @@
"fullTooltip": "从元数据文件重新加载所有模型信息;用于列表过时或手动编辑后。"
},
"fetch": {
"title": "从 Civitai 获取元数据",
"title": "从 CivitAI 获取元数据",
"action": "获取"
},
"download": {
@@ -825,10 +825,10 @@
"enrichHfAgent": "AI HF 元数据增强"
},
"contextMenu": {
"refreshMetadata": "刷新 Civitai 数据",
"refreshMetadata": "刷新 CivitAI 数据",
"checkUpdates": "检查更新",
"linkModel": "链接模型",
"linkCivitai": "链接到 Civitai",
"linkCivitai": "链接到 CivitAI",
"linkHuggingFace": "链接到 HuggingFace",
"copySyntax": "复制 LoRA 语法",
"copyFilename": "复制模型文件名",
@@ -860,6 +860,7 @@
"actions": {
"sendCheckpoint": "发送到 ComfyUI",
"sendRecipe": "发送到 ComfyUI",
"copyRecipeSyntax": "复制配方语法",
"deleteRecipeWithShortcut": "删除配方(Del"
},
"navigation": {
@@ -883,7 +884,10 @@
"loraStatus": {
"none": "此配方不包含 LoRA",
"allAvailable": "所有 LoRA 均已就绪 - 可直接使用",
"missing": "{total} 个 LoRA 中缺失 {missing} 个"
"missing": "{total} 个 LoRA 中缺失 {missing} 个",
"missingAndUnavailable": "{total} 个 LoRA 中缺失 {missing} 个,{unavailable} 个不可用(已从源站删除或哈希无法解析)",
"partial": "{total} 个 LoRA 中 {unavailable} 个不可用(已从源站删除或哈希无法解析)- 使用配方时将被跳过",
"noneUsable": "没有可用的 LoRA - {total} 个中 {unavailable} 个已从源站删除或哈希无法解析"
},
"resources": {
"inLibrary": "在库中",
@@ -896,10 +900,10 @@
"hashInvalidTooltip": "此 LoRA 哈希无法在 CivitAI 上解析——模型可能已更新",
"download": "下载",
"downloadLoraTooltip": "下载此 LoRA",
"preparingDownload": "正在准备下载",
"preparingDownload": "正在准备下载...",
"reconnect": "重新关联",
"reconnectTooltip": "与本地 LoRA 重新关联",
"viewOnCivitai": "在 Civitai 上查看",
"viewOnCivitai": "在 CivitAI 上查看",
"openLoraDetails": "在 LoRA 库中查看 {name}",
"openCheckpointDetails": "在模型库中查看 {name}"
},
@@ -920,7 +924,7 @@
"addTag": "添加",
"noTagsAdded": "未添加标签",
"lorasInRecipe": "此配方中的 LoRA",
"downloadLocationPreview": "下载位置预览:{path}",
"downloadLocationPreview": "下载位置预览:",
"useDefaultPath": "使用默认路径",
"useDefaultPathTooltip": "启用后,文件将自动使用配置的路径模板进行组织",
"selectLoraRoot": "选择 LoRA 根目录",
@@ -934,20 +938,20 @@
"importAndDownload": "导入并下载",
"downloadMissingLoras": "下载缺失的 LoRA",
"saveRecipe": "保存配方",
"loraCountInfo": "({existing}/{total} in library)",
"loraCountInfo": "(库中 {existing}/{total}",
"processingInput": "处理输入...",
"analyzingMetadata": "分析图像元数据...",
"downloadingLoras": "下载 LoRA...",
"savingRecipe": "保存配方...",
"startingDownload": "开始下载 LoRA {current}/{total}",
"deletedFromCivitai": "从 Civitai 中删除",
"deletedFromCivitai": "从 CivitAI 中删除",
"inLibrary": "在库中",
"notInLibrary": "不在库中",
"earlyAccessRequired": "此 LoRA 需要提前访问权限才能下载。",
"earlyAccessEnds": "提前访问权限将于 {date} 结束。",
"earlyAccess": "提前访问",
"verifyEarlyAccess": "在下载之前,请验证您是否已购买提前访问权限。",
"duplicateRecipesFound": "在的库中找到 {count} 个相同的配方。",
"verifyEarlyAccess": "在下载之前,请确认你已购买提前访问权限。",
"duplicateRecipesFound": "在的库中找到 {count} 个相同的配方。",
"duplicateRecipesDescription": "这些配方包含相同的 LoRA,权重完全相同。",
"showDuplicates": "显示重复项",
"hideDuplicates": "隐藏重复项",
@@ -1063,7 +1067,7 @@
"start": "开始导入",
"startImport": "开始导入",
"importing": "正在导入配方...",
"rateLimitedSlowdown": "触发速率限制 — 正在减速",
"rateLimitedSlowdown": "触发速率限制 — 正在减速...",
"rateLimitedHint": "部分条目因元数据提供方的速率限制而被跳过。稍后重新运行导入即可重试这些条目。",
"progress": "进度",
"total": "总计",
@@ -1106,7 +1110,7 @@
"title": "Checkpoint 模型",
"modelTypes": {
"checkpoint": "Checkpoint",
"diffusion_model": "Diffusion Model"
"diffusion_model": "扩散模型"
},
"contextMenu": {
"moveToOtherTypeFolder": "移动到 {otherType} 文件夹",
@@ -1130,7 +1134,7 @@
"collapseAllDisabled": "列表视图下不可用",
"dragDrop": {
"unableToResolveRoot": "无法确定移动的目标路径。",
"moveUnsupported": "Move is not supported for this item.",
"moveUnsupported": "此条目不支持移动。",
"createFolderHint": "释放以创建新文件夹",
"newFolderName": "新文件夹名称",
"folderNameHint": "按 Enter 确认,Escape 取消",
@@ -1268,7 +1272,7 @@
"download": {
"title": "从 URL 下载模型",
"titleWithType": "从 URL 下载 {type}",
"civitaiUrl": "Civitai URL:",
"civitaiUrl": "CivitAI URL:",
"placeholder": "https://civitai.com/models/...",
"urlHint": "每行输入一个 CivitAI、CivArchive 或 Hugging Face URL。支持批量下载多个 URL。",
"selectHfFiles": "选择从此仓库下载的文件:",
@@ -1303,7 +1307,7 @@
"inLibrary": "已在库中"
},
"errors": {
"invalidUrl": "无效的 Civitai URL 格式",
"invalidUrl": "无效的 CivitAI URL 格式",
"noVersions": "此模型没有可用版本",
"mixedSources": "无法在同一批次中混合使用 CivitAI 和 Hugging Face URL。",
"noModelFiles": "在此仓库中未找到模型文件。"
@@ -1382,8 +1386,8 @@
"action": "全部删除"
},
"checkUpdates": {
"title": "检查所有 {type} 的更新?",
"message": "这会库中的每个 {type} 检查更新,大型集合可能需要一些时间。",
"title": "检查所有 {typePlural} 的更新?",
"message": "这会检查库中的每个 {typePlural} 的更新,大型集合可能需要一些时间。",
"tip": "想分批进行?切换到批量模式,选中需要的模型,然后使用“检查所选更新”。",
"action": "检查全部"
},
@@ -1417,7 +1421,7 @@
"title": "本地示例图片",
"message": "未找到此模型的本地示例图片。可选操作:",
"downloadOption": {
"title": "从 Civitai 下载",
"title": "从 CivitAI 下载",
"description": "将远程示例保存到本地,便于离线使用和更快加载"
},
"importOption": {
@@ -1444,7 +1448,7 @@
"confirmAction": "保存并链接"
},
"relinkCivitai": {
"title": "重新关联到 Civitai",
"title": "重新关联到 CivitAI",
"warning": "警告:",
"warningText": "这是一个有潜在风险的操作。重新关联将:",
"warningList": {
@@ -1453,15 +1457,15 @@
"unintendedConsequences": "可能有其他不可预期的后果"
},
"proceedText": "仅在你确定需要此操作时继续。",
"urlLabel": "Civitai 模型 URL",
"urlLabel": "CivitAI 模型 URL",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890 或 https://civitai.red/models/12345/model-name?modelVersionId=67890",
"helpText": {
"title": "粘贴任意 Civitai 或 CivitArchive 模型 URL。支持格式:",
"title": "粘贴任意 CivitAI 或 CivitArchive 模型 URL。支持格式:",
"format1": "https://civitai.com/models/12345",
"format2": "https://civitai.com/models/12345?modelVersionId=67890",
"format3": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"note": "注意:如果未提供 modelVersionId,将使用最新版本。",
"format4": "https://civarchive.com/models/12345 (CivitArchive)"
"format4": "https://civarchive.com/models/12345 (CivArchive)"
},
"confirmAction": "确认重新关联"
},
@@ -1471,8 +1475,8 @@
"editFileName": "编辑文件名",
"editBaseModel": "编辑基础模型",
"editVersionName": "编辑版本名称",
"viewOnCivitai": "在 Civitai 查看",
"viewOnCivitaiText": "在 Civitai 查看",
"viewOnCivitai": "在 CivitAI 查看",
"viewOnCivitaiText": "在 CivitAI 查看",
"viewOnHuggingFace": "在 Hugging Face 查看",
"viewOnHuggingFaceText": "在 Hugging Face 查看",
"viewCreatorProfile": "查看创作者主页",
@@ -1504,7 +1508,7 @@
"notesHint": "回车保存,Shift+回车换行",
"addNotesPlaceholder": "在此添加你的备注...",
"aboutThisVersion": "关于此版本",
"baseModelSearchPlaceholder": "搜索基础模型",
"baseModelSearchPlaceholder": "搜索基础模型...",
"baseModelSuggested": "推荐",
"baseModelNoMatch": "没有匹配的基础模型"
},
@@ -1573,10 +1577,10 @@
"noNext": "没有下一个模型"
},
"license": {
"noImageSell": "No selling generated content",
"noRentCivit": "No Civitai generation",
"noRent": "No generation services",
"noSell": "No selling models",
"noImageSell": "禁止出售生成的图片",
"noRentCivit": "禁止在 CivitAI 上生成",
"noRent": "禁止生成服务",
"noSell": "禁止出售模型",
"creditRequired": "需要创作者署名",
"noDerivatives": "禁止分享合并作品",
"noReLicense": "需要相同权限",
@@ -1639,49 +1643,49 @@
"newer": "较新的版本",
"newerTooltip": "此版本比你本地的最新版本更新",
"earlyAccess": "抢先体验",
"earlyAccessTooltip": "此版本当前需要 Civitai 抢先体验权限",
"earlyAccessTooltip": "此版本当前需要 CivitAI 抢先体验权限",
"paid": "付费",
"paidTooltip": "此版本需要付费后才能下载",
"ignored": "已忽略",
"ignoredTooltip": "此版本已关闭更新通知",
"onSiteOnly": "仅站内生成",
"onSiteOnlyTooltip": "此版本仅在 Civitai 站内可用,无法下载"
"onSiteOnlyTooltip": "此版本仅在 CivitAI 站内可用,无法下载"
},
"actions": {
"download": "下载",
"downloadTooltip": "下载此版本",
"downloadChooseFilesTooltip": "选择要下载的文件",
"downloadEarlyAccessTooltip": "从 Civitai 下载此抢先体验版本",
"downloadPaidTooltip": "从 Civitai 下载此付费版本",
"downloadNotAllowedTooltip": "此版本仅在 Civitai 站内可用,无法下载",
"downloadEarlyAccessTooltip": "从 CivitAI 下载此抢先体验版本",
"downloadPaidTooltip": "从 CivitAI 下载此付费版本",
"downloadNotAllowedTooltip": "此版本仅在 CivitAI 站内可用,无法下载",
"delete": "删除",
"deleteTooltip": "删除此本地版本",
"ignore": "忽略",
"unignore": "取消忽略",
"ignoreTooltip": "忽略此版本的更新通知",
"unignoreTooltip": "恢复此版本的更新通知",
"viewVersionOnCivitai": "在 Civitai 上查看版本",
"viewVersionOnCivitai": "在 CivitAI 上查看版本",
"earlyAccessTooltip": "需要购买抢先体验",
"resumeModelUpdates": "继续跟踪该模型的更新",
"ignoreModelUpdates": "忽略该模型的更新",
"viewLocalVersions": "查看所有本地版本",
"viewLocalTooltip": "敬请期待"
"viewLocalTooltip": "在主页面上显示该模型的所有本地版本"
},
"filters": {
"label": "基础筛选",
"state": {
"showAll": "全部版本",
"showSameBase": "相同基模型"
"showSameBase": "相同基模型"
},
"tooltip": {
"showAllVersions": "切换为显示所有版本",
"showSameBaseVersions": "仅显示与当前基模型匹配的版本"
"showSameBaseVersions": "仅显示与当前基模型匹配的版本"
},
"empty": "没有与当前基模型筛选匹配的版本。"
"empty": "没有与当前基模型筛选匹配的版本。"
},
"empty": "该模型还没有版本历史。",
"error": "加载版本失败。",
"missingModelId": "该模型缺少 Civitai 模型 ID。",
"missingModelId": "该模型缺少 CivitAI 模型 ID。",
"hfGroupInfo": "这是一个 HuggingFace 模型组。打开库页面即可在网格中查看所有版本。",
"confirm": {
"delete": "从库中删除此版本?"
@@ -1765,14 +1769,14 @@
"tips": {
"title": "技巧与提示",
"civitai": {
"title": "Civitai 集成",
"description": "连接你的 Civitai 账号:访问头像 → 设置 → API 密钥 → 添加密钥,然后粘贴到 LoRA 管理器设置中。",
"alt": "Civitai API 设置"
"title": "CivitAI 集成",
"description": "连接你的 CivitAI 账号:访问头像 → 设置 → API 密钥 → 添加密钥,然后粘贴到 LoRA 管理器设置中。",
"alt": "CivitAI API 设置"
},
"download": {
"title": "便捷下载",
"description": "使用 Civitai URL 快速下载和安装新模型。",
"alt": "Civitai 下载"
"description": "使用 CivitAI URL 快速下载和安装新模型。",
"alt": "CivitAI 下载"
},
"recipes": {
"title": "保存配方",
@@ -1850,7 +1854,7 @@
"copiedUri": "链接已复制到剪贴板:{{uri}}",
"uriClipboardFallback": "链接:{{uri}}",
"setupRequired": "示例图片存储",
"setupDescription": "要添加自定义示例图片,需要先设置下载位置。",
"setupDescription": "要添加自定义示例图片,需要先设置下载位置。",
"setupUsage": "此路径用于存储下载的示例图片和自定义图片。",
"openSettings": "打开设置"
}
@@ -1956,7 +1960,7 @@
"submitGithubIssue": "提交 GitHub 问题",
"joinDiscord": "加入 Discord",
"youtubeChannel": "YouTube 频道",
"civitaiProfile": "Civitai 个人资料",
"civitaiProfile": "CivitAI 个人资料",
"supportKofi": "支持 Ko-fi",
"supportPatreon": "支持 Patreon"
},
@@ -2044,9 +2048,9 @@
"cannotSend": "无法发送配方:缺少配方 ID",
"sendFailed": "发送配方到工作流失败",
"sendError": "发送配方到工作流出错",
"missingCheckpointPath": "缺少检查点路径",
"missingCheckpointInfo": "缺少检查点信息",
"downloadCheckpointFailed": "下载检查点失败:{message}",
"missingCheckpointPath": "缺少Checkpoint路径",
"missingCheckpointInfo": "缺少Checkpoint信息",
"downloadCheckpointFailed": "下载Checkpoint失败:{message}",
"missingLoraDownloadInfo": "缺少此 LoRA 的下载信息",
"hashNotFoundOnCivitai": "此 LoRA 哈希无法在 CivitAI 上解析——模型可能已更新或哈希无效",
"downloadLoraFailed": "下载 LoRA 失败:{message}",
@@ -2080,12 +2084,12 @@
"repairBulkComplete": "修复完成:{repaired} 个已修复,{skipped} 个已跳过(共 {total} 个)",
"repairBulkSkipped": "所选 {total} 个配方无需修复",
"repairBulkFailed": "修复所选配方失败:{message}",
"rematchComplete": "已匹配 {entries} 个条目,涉及 {recipes} 个食谱",
"rematchCompleteErrors": "已匹配 {entries} 个条目,涉及 {recipes} 个食谱{failures} 个失败",
"rematchAllFailed": "{failures}/{total} 个所选食谱重新匹配失败",
"rematchUnmatched": "在 {recipes} 个食谱中未找到 {entries} 个条目的本地匹配",
"rematchSkipped": "{total} 个所选食谱均无需重新匹配",
"rematchFailed": "重新匹配所选食谱失败:{message}",
"rematchComplete": "已匹配 {entries} 个条目,涉及 {recipes} 个配方",
"rematchCompleteErrors": "已匹配 {entries} 个条目,涉及 {recipes} 个配方{failures} 个失败",
"rematchAllFailed": "{failures}/{total} 个所选配方重新匹配失败",
"rematchUnmatched": "在 {recipes} 个配方中未找到 {entries} 个条目的本地匹配",
"rematchSkipped": "{total} 个所选配方均无需重新匹配",
"rematchFailed": "重新匹配所选配方失败:{message}",
"reimporting": "正在从源重新导入配方...",
"reimportSuccess": "配方已从源重新导入成功",
"reimportBulkComplete": "重新导入完成:{completed} 个已导入,{failed} 个失败(共 {total} 个)",
@@ -2131,8 +2135,8 @@
"bulkUpdatesChecking": "正在检查所选 {type} 的更新...",
"bulkUpdatesSuccess": "{count} 个所选 {type} 有可用更新",
"bulkUpdatesNone": "所选 {type} 未发现更新",
"bulkUpdatesMissing": "所选 {type} 未关联 Civitai 更新",
"bulkUpdatesPartialMissing": "已跳过 {missing} 个未关联 Civitai 的所选 {type}",
"bulkUpdatesMissing": "所选 {type} 未关联 CivitAI 更新",
"bulkUpdatesPartialMissing": "已跳过 {missing} 个未关联 CivitAI 的所选 {type}",
"bulkUpdatesFailed": "检查所选 {type} 的更新失败:{message}",
"invalidCharactersRemoved": "文件名中的无效字符已移除",
"filenameCannotBeEmpty": "文件名不能为空",
@@ -2161,7 +2165,7 @@
"checkpointRootsFailed": "加载 Checkpoint 根目录失败:{message}",
"unetRootsFailed": "加载 Diffusion Model 根目录失败:{message}",
"embeddingRootsFailed": "加载 Embedding 根目录失败:{message}",
"mappingsUpdated": "基础模型路径映射已更新({count} 条映射{plural}",
"mappingsUpdated": "基础模型路径映射已更新({count} 条映射)",
"mappingsCleared": "基础模型路径映射已清除",
"mappingSaveFailed": "保存基础模型映射失败:{message}",
"downloadTemplatesUpdated": "下载路径模板已更新",
@@ -2172,8 +2176,8 @@
"compactModeToggled": "紧凑模式 {state}",
"settingSaveFailed": "保存设置失败:{message}",
"displayDensitySet": "显示密度已设置为 {density}",
"libraryLoadFailed": "Failed to load libraries: {message}",
"libraryActivateFailed": "Failed to activate library: {message}",
"libraryLoadFailed": "加载模型库失败:{message}",
"libraryActivateFailed": "激活模型库失败:{message}",
"languageChangeFailed": "切换语言失败:{message}",
"cacheCleared": "缓存文件已成功清除。下次操作将重建缓存。",
"cacheClearFailed": "清除缓存失败:{error}",
@@ -2258,7 +2262,7 @@
"contextMenu": {
"contentRatingSet": "内容评级已设置为 {level}",
"contentRatingFailed": "设置内容评级失败:{message}",
"relinkSuccess": "模型已成功重新关联到 Civitai",
"relinkSuccess": "模型已成功重新关联到 CivitAI",
"relinkFailed": "错误:{message}",
"linkHfSuccess": "模型已成功链接到 HuggingFace",
"linkHfFailed": "错误:{message}",
@@ -2322,7 +2326,7 @@
"bulkMoveSuccess": "成功移动 {successCount} 个 {type}",
"exampleImagesDownloadSuccess": "示例图片下载成功!",
"exampleImagesDownloadFailed": "示例图片下载失败:{message}",
"moveFailed": "Failed to move item: {message}",
"moveFailed": "移动条目失败:{message}",
"copiedToClipboard": "已复制到剪贴板",
"downloadStarted": "下载已开始"
},
@@ -2352,7 +2356,7 @@
},
"issues": {
"civitai_api_key": {
"title": "Civitai API 密钥"
"title": "CivitAI API 密钥"
},
"cache_health": {
"title": "模型缓存健康状态"
+116 -112
View File
@@ -67,11 +67,11 @@
"steps": {
"fetch": {
"title": "取得模型 metadata",
"content": "點擊 <strong>取得</strong> 按鈕,從 Civitai 下載模型 metadata 與預覽圖片。"
"content": "點擊 <strong>取得</strong> 按鈕,從 CivitAI 下載模型 metadata 與預覽圖片。"
},
"download": {
"title": "下載新模型",
"content": "使用 <strong>下載</strong> 按鈕,直接從 Civitai 網址下載模型。"
"content": "使用 <strong>下載</strong> 按鈕,直接從 CivitAI 網址下載模型。"
},
"bulk": {
"title": "批次操作",
@@ -103,8 +103,8 @@
"actions": {
"addToFavorites": "加入收藏",
"removeFromFavorites": "移除收藏",
"viewOnCivitai": "在 Civitai 查看",
"notAvailableFromCivitai": "Civitai 不提供",
"viewOnCivitai": "在 CivitAI 查看",
"notAvailableFromCivitai": "CivitAI 不提供",
"viewOnHuggingFace": "在 Hugging Face 查看",
"sendToWorkflow": "傳送到 ComfyUI(點擊:附加,Shift+點擊:取代)",
"copyLoRASyntax": "複製 LoRA 語法",
@@ -113,7 +113,7 @@
"show": "顯示",
"openExampleImages": "開啟範例圖片資料夾",
"replacePreview": "更換預覽圖",
"copyCheckpointName": "複製檢查點名稱",
"copyCheckpointName": "複製 Checkpoint 名稱",
"copyEmbeddingName": "複製嵌入名稱",
"embeddingNameCopied": "已複製 Embedding 語法",
"sendCheckpointToWorkflow": "傳送到 ComfyUI",
@@ -137,7 +137,7 @@
"exampleImages": {
"checkError": "檢查範例圖片時發生錯誤",
"missingHash": "缺少模型雜湊資訊。",
"noRemoteImagesAvailable": "此模型在 Civitai 上無遠端範例圖片"
"noRemoteImagesAvailable": "此模型在 CivitAI 上無遠端範例圖片"
},
"badges": {
"update": "更新",
@@ -187,14 +187,14 @@
"error": "配方修復失敗:{message}"
},
"rematchRecipes": {
"label": "將食譜重新匹配到本地模型",
"loading": "正在將食譜重新匹配到本地模型...",
"success": "已匹配 {entries} 個條目,涉及 {recipes} 個食譜",
"successErrors": "已匹配 {entries} 個條目,涉及 {recipes} 個食譜{failures} 個失敗",
"allFailed": "{failures}/{total} 個食譜重新匹配失敗",
"noMatch": "在 {recipes} 個食譜中找不到 {entries} 個條目的本地匹配",
"cancelled": "已取消重新匹配。{recipes} 個食譜已更新({entries} 個條目)。",
"error": "食譜重新匹配失敗:{message}"
"label": "將配方重新匹配到本地模型",
"loading": "正在將配方重新匹配到本地模型...",
"success": "已匹配 {entries} 個條目,涉及 {recipes} 個配方",
"successErrors": "已匹配 {entries} 個條目,涉及 {recipes} 個配方{failures} 個失敗",
"allFailed": "{failures}/{total} 個配方重新匹配失敗",
"noMatch": "在 {recipes} 個配方中找不到 {entries} 個條目的本地匹配",
"cancelled": "已取消重新匹配。{recipes} 個配方已更新({entries} 個條目)。",
"error": "配方重新匹配失敗:{message}"
},
"manageExcludedModels": {
"label": "管理已排除的模型"
@@ -259,7 +259,7 @@
"clearAll": "清除所有篩選",
"any": "任一",
"all": "全部",
"tagLogicAny": "符合任一籤 (或)",
"tagLogicAny": "符合任一籤 (或)",
"tagLogicAll": "符合所有標籤 (與)",
"loraAvailability": "LoRA 可用性",
"availabilityReady": "可直接使用",
@@ -290,15 +290,15 @@
}
},
"settings": {
"civitaiApiKey": "Civitai API 金鑰",
"civitaiApiKeyPlaceholder": "請輸入您的 Civitai API 金鑰",
"civitaiApiKeyHelp": "用於從 Civitai 下載模型時的身份驗證",
"civitaiApiKey": "CivitAI API 金鑰",
"civitaiApiKeyPlaceholder": "請輸入您的 CivitAI API 金鑰",
"civitaiApiKeyHelp": "用於從 CivitAI 下載模型時的身份驗證",
"civitaiApiKeyConfigured": "已設定",
"civitaiApiKeyNotConfigured": "未設定",
"civitaiApiKeySet": "設定",
"civitaiHost": {
"label": "Civitai 站點",
"help": "選擇使用「在 Civitai 中查看」時預設開啟的 Civitai 站點。",
"label": "CivitAI 站點",
"help": "選擇使用「在 CivitAI 中查看」時預設開啟的 CivitAI 站點。",
"options": {
"com": "civitai.com(僅 SFW",
"red": "civitai.red(無限制)"
@@ -319,8 +319,8 @@
},
"aria2HelpLink": "了解如何設定 aria2 下載後端",
"civitaiHostBanner": {
"title": "已提供 Civitai 站點偏好設定",
"content": "Civitai 現在使用 civitai.com 提供 SFW 內容,使用 civitai.red 提供無限制內容。可以在設定中變更預設開啟的站點。",
"title": "已提供 CivitAI 站點偏好設定",
"content": "CivitAI 現在使用 civitai.com 提供 SFW 內容,使用 civitai.red 提供無限制內容。可以在設定中變更預設開啟的站點。",
"openSettings": "開啟設定"
},
"openSettingsFileLocation": {
@@ -407,7 +407,7 @@
"retentionHelp": "在刪除舊快照之前,要保留多少自動快照。",
"management": "備份管理",
"managementHelp": "匯出目前的使用者狀態,或從備份封存中還原。",
"scopeHelp": "備份的設定、下載歷史與模型更新狀態。不包含模型檔案或可重建的快取。",
"scopeHelp": "備份的設定、下載歷史與模型更新狀態。不包含模型檔案或可重建的快取。",
"locationSummary": "目前備份位置",
"openFolderButton": "開啟備份資料夾",
"openFolderSuccess": "已開啟備份資料夾",
@@ -428,7 +428,7 @@
},
"downloadSkipBaseModels": {
"label": "跳過這些基礎模型的下載",
"help": "適用於所有下載流程。這裡只能選擇受支援的基礎模型。",
"help": "啟用後,使用所選基礎模型的版本將被略過。",
"searchPlaceholder": "篩選基礎模型...",
"empty": "沒有符合目前搜尋條件的基礎模型。",
"summary": {
@@ -450,7 +450,7 @@
},
"layoutSettings": {
"groupByModel": "按模型分組",
"groupByModelHelp": "啟用後,每個 Civitai 模型僅顯示最新版本的單張卡片,舊版本將被隱藏。",
"groupByModelHelp": "啟用後,每個 CivitAI 模型僅顯示最新版本的單張卡片,舊版本將被隱藏。",
"displayDensity": "顯示密度",
"displayDensityOptions": {
"default": "預設",
@@ -517,7 +517,7 @@
"extraFolderPaths": {
"title": "額外資料夾路徑",
"description": "LoRA Manager 專屬的額外模型根目錄。從 ComfyUI 標準資料夾之外的位置載入模型,特別適合管理大型模型庫,避免影響 ComfyUI 效能。",
"restartRequired": "Requires restart to take effect",
"restartRequired": "需要重新啟動才能生效",
"modelTypes": {
"lora": "LoRA 路徑",
"checkpoint": "Checkpoint 路徑",
@@ -555,7 +555,7 @@
},
"downloadPathTemplates": {
"title": "下載路徑範本",
"help": "設定從 Civitai 下載時不同模型類型的資料夾結構。",
"help": "設定從 CivitAI 下載時不同模型類型的資料夾結構。",
"availablePlaceholders": "可用佔位符:",
"templateOptions": {
"flatStructure": "扁平結構",
@@ -592,7 +592,7 @@
"exampleImages": {
"downloadLocation": "下載位置",
"downloadLocationPlaceholder": "輸入範例圖片的資料夾路徑",
"downloadLocationHelp": "輸入從 Civitai 下載範例圖片要儲存的資料夾路徑",
"downloadLocationHelp": "輸入從 CivitAI 下載範例圖片要儲存的資料夾路徑",
"autoDownload": "自動下載範例圖片",
"autoDownloadHelp": "自動為沒有範例圖片的模型下載範例圖片(需設定下載位置)",
"openMode": "開啟範例圖片動作",
@@ -625,7 +625,7 @@
},
"hideEarlyAccessUpdates": {
"label": "隱藏搶先體驗更新",
"help": "搶先體驗更新"
"help": "啟用後,只有搶先體驗更新的模型將不顯示「可更新」徽章。"
},
"hidePaidUpdates": {
"label": "隱藏付費更新",
@@ -647,7 +647,7 @@
},
"metadataArchive": {
"enableArchiveDb": "啟用中繼資料封存資料庫",
"enableArchiveDbHelp": "使用本機資料庫以存取已從 Civitai 刪除模型的中繼資料。",
"enableArchiveDbHelp": "使用本機資料庫以存取已從 CivitAI 刪除模型的中繼資料。",
"status": "狀態",
"statusAvailable": "可用",
"statusUnavailable": "不可用",
@@ -750,7 +750,7 @@
"fullTooltip": "從中繼資料檔重新載入所有模型資訊;適用於清單過時或手動編輯後。"
},
"fetch": {
"title": "從 Civitai 取得 metadata",
"title": "從 CivitAI 取得 metadata",
"action": "取得"
},
"download": {
@@ -825,10 +825,10 @@
"enrichHfAgent": "AI HF 中繼資料增強"
},
"contextMenu": {
"refreshMetadata": "刷新 Civitai 資料",
"refreshMetadata": "刷新 CivitAI 資料",
"checkUpdates": "檢查更新",
"linkModel": "連結模型",
"linkCivitai": "連結到 Civitai",
"linkCivitai": "連結到 CivitAI",
"linkHuggingFace": "連結到 HuggingFace",
"copySyntax": "複製 LoRA 語法",
"copyFilename": "複製模型檔名",
@@ -860,6 +860,7 @@
"actions": {
"sendCheckpoint": "傳送到 ComfyUI",
"sendRecipe": "傳送到 ComfyUI",
"copyRecipeSyntax": "複製配方語法",
"deleteRecipeWithShortcut": "刪除配方(Del"
},
"navigation": {
@@ -883,7 +884,10 @@
"loraStatus": {
"none": "此配方不含 LoRA",
"allAvailable": "所有 LoRA 皆已就緒 - 可直接使用",
"missing": "{total} 個 LoRA 中缺少 {missing} 個"
"missing": "{total} 個 LoRA 中缺少 {missing} 個",
"missingAndUnavailable": "{total} 個 LoRA 中缺少 {missing} 個,{unavailable} 個不可用(已從來源刪除或雜湊無法解析)",
"partial": "{total} 個 LoRA 中 {unavailable} 個不可用(已從來源刪除或雜湊無法解析)- 使用配方時將被略過",
"noneUsable": "沒有可用的 LoRA - {total} 個中 {unavailable} 個已從來源刪除或雜湊無法解析"
},
"resources": {
"inLibrary": "已在庫存",
@@ -891,15 +895,15 @@
"deleted": "已刪除",
"hashInvalid": "無法解析的雜湊",
"inLibraryTooltip": "此模型已存在於本地庫",
"notInLibraryTooltip": "此模型不在的本地庫中",
"notInLibraryTooltip": "此模型不在的本地庫中",
"deletedTooltip": "此 LoRA 已從來源站刪除,無法下載",
"hashInvalidTooltip": "此 LoRA 雜湊無法在 CivitAI 上解析——模型可能已更新",
"download": "下載",
"downloadLoraTooltip": "下載此 LoRA",
"preparingDownload": "正在準備下載",
"preparingDownload": "正在準備下載...",
"reconnect": "重新關聯",
"reconnectTooltip": "與本地 LoRA 重新關聯",
"viewOnCivitai": "在 Civitai 上檢視",
"viewOnCivitai": "在 CivitAI 上檢視",
"openLoraDetails": "在 LoRA 庫中檢視 {name}",
"openCheckpointDetails": "在模型庫中檢視 {name}"
},
@@ -911,7 +915,7 @@
"dropZoneHint": "將圖片拖曳至此處、從剪貼簿貼上,或點擊瀏覽",
"orDivider": "或拖曳 / 貼上圖片",
"imageUrlOrPath": "圖片網址或檔案路徑:",
"urlPlaceholder": "https://civitai.com/images/... 或 C:/path/to/image.png",
"urlPlaceholder": "https://civitai.com/images/... 或 https://civitai.red/images/... 或 C:/path/to/image.png",
"fetchImage": "取得圖片",
"recipeName": "配方名稱",
"recipeNamePlaceholder": "輸入配方名稱",
@@ -940,7 +944,7 @@
"downloadingLoras": "下載 LoRA 中...",
"savingRecipe": "儲存配方中...",
"startingDownload": "開始下載 LoRA {current}/{total}",
"deletedFromCivitai": "已從 Civitai 刪除",
"deletedFromCivitai": "已從 CivitAI 刪除",
"inLibrary": "已在庫存",
"notInLibrary": "不在庫存",
"earlyAccessRequired": "此 LoRA 需購買早期存取才能下載。",
@@ -1063,7 +1067,7 @@
"start": "開始匯入",
"startImport": "開始匯入",
"importing": "匯入中...",
"rateLimitedSlowdown": "觸發速率限制 — 正在減速",
"rateLimitedSlowdown": "觸發速率限制 — 正在減速...",
"rateLimitedHint": "部分項目因元數據提供方的速率限制而被略過。稍後重新執行匯入即可重試這些項目。",
"progress": "進度",
"total": "總計",
@@ -1106,7 +1110,7 @@
"title": "Checkpoint 模型",
"modelTypes": {
"checkpoint": "Checkpoint",
"diffusion_model": "Diffusion Model"
"diffusion_model": "擴散模型"
},
"contextMenu": {
"moveToOtherTypeFolder": "移動到 {otherType} 資料夾",
@@ -1130,7 +1134,7 @@
"collapseAllDisabled": "列表檢視下不可用",
"dragDrop": {
"unableToResolveRoot": "無法確定移動的目標路徑。",
"moveUnsupported": "Move is not supported for this item.",
"moveUnsupported": "此項目不支援移動。",
"createFolderHint": "放開以建立新資料夾",
"newFolderName": "新資料夾名稱",
"folderNameHint": "按 Enter 確認,Escape 取消",
@@ -1193,36 +1197,36 @@
"unusedLoras": {
"high": {
"title": "大量未使用的 LoRA",
"description": "的 LoRA 中有 {percent}%{count}/{total})從未被使用過。",
"description": "的 LoRA 中有 {percent}%{count}/{total})從未被使用過。",
"suggestion": "考慮整理或封存未使用的模型以釋放儲存空間。"
}
},
"unusedCheckpoints": {
"detected": {
"title": "檢測到未使用的 Checkpoint",
"description": "的 Checkpoint 中有 {percent}%{count}/{total})從未被使用過。",
"description": "的 Checkpoint 中有 {percent}%{count}/{total})從未被使用過。",
"suggestion": "審查並考慮刪除不再需要的 Checkpoint。"
}
},
"unusedEmbeddings": {
"high": {
"title": "大量未使用的 Embedding",
"description": "的 Embedding 中有 {percent}%{count}/{total})從未被使用過。",
"suggestion": "考慮整理或封存未使用的 Embedding 以優化的收藏。"
"description": "的 Embedding 中有 {percent}%{count}/{total})從未被使用過。",
"suggestion": "考慮整理或封存未使用的 Embedding 以優化的收藏。"
}
},
"collection": {
"large": {
"title": "檢測到大型收藏",
"description": "的模型收藏正在使用 {size} 的儲存空間。",
"description": "的模型收藏正在使用 {size} 的儲存空間。",
"suggestion": "考慮使用外部儲存或雲端解決方案以獲得更好的組織。"
}
},
"activity": {
"active": {
"title": "活躍用戶",
"description": "已經完成了 {count} 次生成!",
"suggestion": "繼續探索並用的模型創作精彩內容。"
"description": "已經完成了 {count} 次生成!",
"suggestion": "繼續探索並用的模型創作精彩內容。"
}
}
},
@@ -1268,7 +1272,7 @@
"download": {
"title": "從網址下載模型",
"titleWithType": "從網址下載 {type}",
"civitaiUrl": "Civitai 網址:",
"civitaiUrl": "CivitAI 網址:",
"placeholder": "https://civitai.com/models/...",
"urlHint": "每行輸入一個 CivitAI、CivArchive 或 Hugging Face URL。支援批量下載多個 URL。",
"selectHfFiles": "選擇從此倉庫下載的檔案:",
@@ -1292,7 +1296,7 @@
"earlyAccessTooltip": "需要早期存取",
"inLibrary": "已在庫存",
"downloaded": "已下載",
"downloadedTooltip": "先前已下載,但目前不在的庫中。",
"downloadedTooltip": "先前已下載,但目前不在的庫中。",
"alreadyInLibrary": "已在庫存",
"partiallyDownloaded": "部分已下載",
"autoOrganizedPath": "[依路徑範本自動整理]",
@@ -1303,7 +1307,7 @@
"inLibrary": "已在庫中"
},
"errors": {
"invalidUrl": "Civitai 網址格式無效",
"invalidUrl": "CivitAI 網址格式無效",
"noVersions": "此模型無可用版本",
"mixedSources": "無法在同一批次中混合使用 CivitAI 和 Hugging Face URL。",
"noModelFiles": "在此倉庫中未找到模型檔案。"
@@ -1382,8 +1386,8 @@
"action": "全部刪除"
},
"checkUpdates": {
"title": "要檢查所有 {type} 的更新嗎?",
"message": "這會資料庫中的每個 {type} 檢查更新,大型收藏可能會花上一些時間。",
"title": "要檢查所有 {typePlural} 的更新嗎?",
"message": "這會檢查資料庫中的每個 {typePlural} 的更新,大型收藏可能會花上一些時間。",
"tip": "想分批處理?切換到批次模式,選擇需要的模型,然後使用「檢查所選更新」。",
"action": "全部檢查"
},
@@ -1407,7 +1411,7 @@
},
"bulkDownloadMissingLoras": {
"title": "下載缺失的 LoRAs",
"message": "發現 {uniqueCount} 個獨特的缺失 LoRAs(從選取食譜中的 {totalCount} 個總數)。",
"message": "發現 {uniqueCount} 個獨特的缺失 LoRAs(從選取配方中的 {totalCount} 個總數)。",
"previewTitle": "要下載的 LoRAs",
"moreItems": "...還有 {count} 個",
"note": "檔案將使用預設路徑模板下載。根據 LoRAs 的數量,這可能需要一些時間。",
@@ -1417,7 +1421,7 @@
"title": "本機範例圖片",
"message": "此模型未找到本機範例圖片。可選擇:",
"downloadOption": {
"title": "從 Civitai 下載",
"title": "從 CivitAI 下載",
"description": "將遠端範例儲存到本機以便離線使用及加快載入"
},
"importOption": {
@@ -1444,7 +1448,7 @@
"confirmAction": "儲存並連結"
},
"relinkCivitai": {
"title": "重新連結至 Civitai",
"title": "重新連結至 CivitAI",
"warning": "警告:",
"warningText": "這是可能造成破壞性的操作。重新連結將會:",
"warningList": {
@@ -1453,15 +1457,15 @@
"unintendedConsequences": "可能產生其他非預期後果"
},
"proceedText": "僅在確定需要執行時才繼續。",
"urlLabel": "Civitai 模型網址:",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"urlLabel": "CivitAI 模型網址:",
"urlPlaceholder": "https://civitai.com/models/12345/model-name?modelVersionId=67890 或 https://civitai.red/models/12345/model-name?modelVersionId=67890",
"helpText": {
"title": "貼上任意 Civitai 或 CivitArchive 模型網址。支援格式:",
"title": "貼上任意 CivitAI 或 CivitArchive 模型網址。支援格式:",
"format1": "https://civitai.com/models/12345",
"format2": "https://civitai.com/models/12345?modelVersionId=67890",
"format3": "https://civitai.com/models/12345/model-name?modelVersionId=67890",
"note": "注意:若未提供 modelVersionId,將使用最新版本。",
"format4": "https://civarchive.com/models/12345 (CivitArchive)"
"format4": "https://civarchive.com/models/12345 (CivArchive)"
},
"confirmAction": "確認重新連結"
},
@@ -1471,8 +1475,8 @@
"editFileName": "編輯檔案名稱",
"editBaseModel": "編輯基礎模型",
"editVersionName": "編輯版本名稱",
"viewOnCivitai": "在 Civitai 查看",
"viewOnCivitaiText": "在 Civitai 查看",
"viewOnCivitai": "在 CivitAI 查看",
"viewOnCivitaiText": "在 CivitAI 查看",
"viewOnHuggingFace": "在 Hugging Face 查看",
"viewOnHuggingFaceText": "在 Hugging Face 查看",
"viewCreatorProfile": "查看創作者個人檔案",
@@ -1504,7 +1508,7 @@
"notesHint": "按 Enter 儲存,Shift+Enter 換行",
"addNotesPlaceholder": "在此新增備註...",
"aboutThisVersion": "關於此版本",
"baseModelSearchPlaceholder": "搜尋基礎模型",
"baseModelSearchPlaceholder": "搜尋基礎模型...",
"baseModelSuggested": "推薦",
"baseModelNoMatch": "沒有符合的基礎模型"
},
@@ -1573,10 +1577,10 @@
"noNext": "沒有下一個模型"
},
"license": {
"noImageSell": "No selling generated content",
"noRentCivit": "No Civitai generation",
"noRent": "No generation services",
"noSell": "No selling models",
"noImageSell": "禁止出售生成的圖片",
"noRentCivit": "禁止在 CivitAI 上生成",
"noRent": "禁止生成服務",
"noSell": "禁止出售模型",
"creditRequired": "需要創作者標示",
"noDerivatives": "禁止分享合併作品",
"noReLicense": "需要相同授權",
@@ -1606,8 +1610,8 @@
"importing": "正在匯入檔案...",
"noSupportedFiles": "未選擇支援的檔案。請選擇圖片或影片檔案。",
"allFiltered": "所有範例圖片都因 NSFW 內容設定而被過濾",
"sfwOnlyEnabled": "目前的設定為僅顯示安全(SFW)內容",
"changeInSettings": "可以在設定中變更此選項",
"sfwOnlyEnabled": "目前的設定為僅顯示安全(SFW)內容",
"changeInSettings": "可以在設定中變更此選項",
"nsfwMature": "成熟內容",
"nsfwR": "R 級內容",
"nsfwX": "X 級內容",
@@ -1631,41 +1635,41 @@
},
"badges": {
"current": "已開啟版本",
"currentTooltip": "這是用來開啟此彈窗的版本",
"currentTooltip": "這是用來開啟此彈窗的版本",
"inLibrary": "已在庫中",
"inLibraryTooltip": "此版本已存在於的本地庫中",
"inLibraryTooltip": "此版本已存在於的本地庫中",
"downloaded": "已下載",
"downloadedTooltip": "此版本之前下載過,但目前不在的本地庫中",
"downloadedTooltip": "此版本之前下載過,但目前不在的本地庫中",
"newer": "較新版本",
"newerTooltip": "此版本比本地的最新版本更新",
"newerTooltip": "此版本比本地的最新版本更新",
"earlyAccess": "搶先體驗",
"earlyAccessTooltip": "此版本目前需要 Civitai 搶先體驗權限",
"earlyAccessTooltip": "此版本目前需要 CivitAI 搶先體驗權限",
"paid": "付費",
"paidTooltip": "此版本需要付費才能下載",
"ignored": "已忽略",
"ignoredTooltip": "此版本已關閉更新通知",
"onSiteOnly": "僅站內生成",
"onSiteOnlyTooltip": "此版本僅在 Civitai 站內可用,無法下載"
"onSiteOnlyTooltip": "此版本僅在 CivitAI 站內可用,無法下載"
},
"actions": {
"download": "下載",
"downloadTooltip": "下載此版本",
"downloadChooseFilesTooltip": "選擇要下載的檔案",
"downloadEarlyAccessTooltip": "從 Civitai 下載此搶先體驗版本",
"downloadPaidTooltip": "從 Civitai 下載此付費版本",
"downloadNotAllowedTooltip": "此版本僅在 Civitai 站內可用,無法下載",
"downloadEarlyAccessTooltip": "從 CivitAI 下載此搶先體驗版本",
"downloadPaidTooltip": "從 CivitAI 下載此付費版本",
"downloadNotAllowedTooltip": "此版本僅在 CivitAI 站內可用,無法下載",
"delete": "刪除",
"deleteTooltip": "刪除此本地版本",
"ignore": "忽略",
"unignore": "取消忽略",
"ignoreTooltip": "忽略此版本的更新通知",
"unignoreTooltip": "恢復此版本的更新通知",
"viewVersionOnCivitai": "在 Civitai 上查看版本",
"viewVersionOnCivitai": "在 CivitAI 上查看版本",
"earlyAccessTooltip": "需要購買搶先體驗",
"resumeModelUpdates": "恢復追蹤此模型的更新",
"ignoreModelUpdates": "忽略此模型的更新",
"viewLocalVersions": "檢視所有本地版本",
"viewLocalTooltip": "敬請期待"
"viewLocalTooltip": "在主頁面上顯示此模型的所有本機版本"
},
"filters": {
"label": "基礎篩選",
@@ -1681,7 +1685,7 @@
},
"empty": "此模型尚無版本歷史。",
"error": "載入版本失敗。",
"missingModelId": "此模型缺少 Civitai 模型 ID。",
"missingModelId": "此模型缺少 CivitAI 模型 ID。",
"hfGroupInfo": "這是一個 HuggingFace 模型組。打開庫頁面即可在網格中查看所有版本。",
"confirm": {
"delete": "要從庫中刪除此版本嗎?"
@@ -1765,14 +1769,14 @@
"tips": {
"title": "小技巧",
"civitai": {
"title": "Civitai 整合",
"description": "連結您的 Civitai 帳號:前往個人頭像 → 設定 → API 金鑰 → 新增 API 金鑰,然後貼到 LoRA 管理器設定中。",
"alt": "Civitai API 設定"
"title": "CivitAI 整合",
"description": "連結您的 CivitAI 帳號:前往個人頭像 → 設定 → API 金鑰 → 新增 API 金鑰,然後貼到 LoRA 管理器設定中。",
"alt": "CivitAI API 設定"
},
"download": {
"title": "快速下載",
"description": "使用 Civitai 網址即可快速下載並安裝新模型。",
"alt": "Civitai 下載"
"description": "使用 CivitAI 網址即可快速下載並安裝新模型。",
"alt": "CivitAI 下載"
},
"recipes": {
"title": "儲存配方",
@@ -1956,7 +1960,7 @@
"submitGithubIssue": "提交 GitHub 問題",
"joinDiscord": "加入 Discord",
"youtubeChannel": "YouTube 頻道",
"civitaiProfile": "Civitai 個人檔案",
"civitaiProfile": "CivitAI 個人檔案",
"supportKofi": "在 Ko-fi 支持",
"supportPatreon": "在 Patreon 支持"
},
@@ -2044,9 +2048,9 @@
"cannotSend": "無法傳送配方:缺少配方 ID",
"sendFailed": "傳送配方到工作流失敗",
"sendError": "傳送配方到工作流錯誤",
"missingCheckpointPath": "缺少檢查點路徑",
"missingCheckpointInfo": "缺少檢查點資訊",
"downloadCheckpointFailed": "下載檢查點失敗:{message}",
"missingCheckpointPath": "缺少Checkpoint路徑",
"missingCheckpointInfo": "缺少Checkpoint資訊",
"downloadCheckpointFailed": "下載Checkpoint失敗:{message}",
"missingLoraDownloadInfo": "缺少此 LoRA 的下載資訊",
"hashNotFoundOnCivitai": "此 LoRA 雜湊無法在 CivitAI 上解析——模型可能已更新或雜湊無效",
"downloadLoraFailed": "下載 LoRA 失敗:{message}",
@@ -2073,24 +2077,24 @@
"batchImportCancelFailed": "取消批量匯入失敗:{message}",
"batchImportNoUrls": "請輸入至少一個 URL 或檔案路徑",
"batchImportNoDirectory": "請輸入目錄路徑",
"batchImportRateLimited": "已達到元數據提供方的速率限制 — 請求正在放緩,部分項目可能被略過。可以稍後重新執行匯入。",
"batchImportRateLimited": "已達到元數據提供方的速率限制 — 請求正在放緩,部分項目可能被略過。可以稍後重新執行匯入。",
"batchImportBrowseFailed": "瀏覽目錄失敗:{message}",
"batchImportDirectorySelected": "已選擇目錄:{path}",
"noRecipesSelected": "未選取任何食譜",
"noRecipesSelected": "未選取任何配方",
"repairBulkComplete": "修復完成:{repaired} 個已修復,{skipped} 個已跳過(共 {total} 個)",
"repairBulkSkipped": "所選 {total} 個配方無需修復",
"repairBulkFailed": "修復所選配方失敗:{message}",
"rematchComplete": "已匹配 {entries} 個條目,涉及 {recipes} 個食譜",
"rematchCompleteErrors": "已匹配 {entries} 個條目,涉及 {recipes} 個食譜{failures} 個失敗",
"rematchAllFailed": "{failures}/{total} 個所選食譜重新匹配失敗",
"rematchUnmatched": "在 {recipes} 個食譜中找不到 {entries} 個條目的本地匹配",
"rematchSkipped": "{total} 個所選食譜均無需重新匹配",
"rematchFailed": "重新匹配所選食譜失敗:{message}",
"rematchComplete": "已匹配 {entries} 個條目,涉及 {recipes} 個配方",
"rematchCompleteErrors": "已匹配 {entries} 個條目,涉及 {recipes} 個配方{failures} 個失敗",
"rematchAllFailed": "{failures}/{total} 個所選配方重新匹配失敗",
"rematchUnmatched": "在 {recipes} 個配方中找不到 {entries} 個條目的本地匹配",
"rematchSkipped": "{total} 個所選配方均無需重新匹配",
"rematchFailed": "重新匹配所選配方失敗:{message}",
"reimporting": "正在從來源重新匯入配方...",
"reimportSuccess": "配方已從來源重新匯入成功",
"reimportBulkComplete": "重新匯入完成:{completed} 個已匯入,{failed} 個失敗(共 {total} 個)",
"reimportBulkFailed": "重新匯入某些配方失敗",
"noMissingLorasInSelection": "在選取的食譜中未找到缺失的 LoRAs",
"noMissingLorasInSelection": "在選取的配方中未找到缺失的 LoRAs",
"noLoraRootConfigured": "未配置 LoRA 根目錄。請在設定中設定預設的 LoRA 根目錄。",
"workflowSent": "工作流已傳送到 ComfyUI",
"workflowSendFailed": "傳送工作流到 ComfyUI 失敗: {error}",
@@ -2131,8 +2135,8 @@
"bulkUpdatesChecking": "正在檢查所選 {type} 的更新...",
"bulkUpdatesSuccess": "{count} 個所選 {type} 有可用更新",
"bulkUpdatesNone": "所選 {type} 未找到更新",
"bulkUpdatesMissing": "所選 {type} 未連結 Civitai 更新",
"bulkUpdatesPartialMissing": "已略過 {missing} 個未連結 Civitai 的所選 {type}",
"bulkUpdatesMissing": "所選 {type} 未連結 CivitAI 更新",
"bulkUpdatesPartialMissing": "已略過 {missing} 個未連結 CivitAI 的所選 {type}",
"bulkUpdatesFailed": "檢查所選 {type} 更新失敗:{message}",
"invalidCharactersRemoved": "已移除檔名中的無效字元",
"filenameCannotBeEmpty": "檔案名稱不可為空",
@@ -2172,8 +2176,8 @@
"compactModeToggled": "緊湊模式已{state}",
"settingSaveFailed": "儲存設定失敗:{message}",
"displayDensitySet": "顯示密度已設為 {density}",
"libraryLoadFailed": "Failed to load libraries: {message}",
"libraryActivateFailed": "Failed to activate library: {message}",
"libraryLoadFailed": "載入模型庫失敗:{message}",
"libraryActivateFailed": "啟動模型庫失敗:{message}",
"languageChangeFailed": "切換語言失敗:{message}",
"cacheCleared": "快取檔案已成功清除。快取將於下次操作時重建。",
"cacheClearFailed": "清除快取失敗:{error}",
@@ -2251,14 +2255,14 @@
},
"controls": {
"reloadFailed": "重新載入 {pageType} 失敗:{message}",
"refreshFailed": "刷新 {pageType} 失敗:{message}",
"refreshFailed": "{action} {pageType} 失敗:{message}",
"fetchMetadataFailed": "取得 metadata 失敗:{message}",
"clearFilterFailed": "清除自訂篩選失敗:{message}"
},
"contextMenu": {
"contentRatingSet": "內容分級已設為 {level}",
"contentRatingFailed": "設定內容分級失敗:{message}",
"relinkSuccess": "模型已成功重新連結至 Civitai",
"relinkSuccess": "模型已成功重新連結至 CivitAI",
"relinkFailed": "錯誤:{message}",
"linkHfSuccess": "模型已成功連結到 HuggingFace",
"linkHfFailed": "錯誤:{message}",
@@ -2322,7 +2326,7 @@
"bulkMoveSuccess": "已成功移動 {successCount} 個 {type}",
"exampleImagesDownloadSuccess": "範例圖片下載成功!",
"exampleImagesDownloadFailed": "下載範例圖片失敗:{message}",
"moveFailed": "Failed to move item: {message}",
"moveFailed": "移動項目失敗:{message}",
"copiedToClipboard": "已複製到剪貼簿",
"downloadStarted": "下載已開始"
},
@@ -2352,7 +2356,7 @@
},
"issues": {
"civitai_api_key": {
"title": "Civitai API 金鑰"
"title": "CivitAI API 金鑰"
},
"cache_health": {
"title": "模型快取健康狀態"
@@ -2405,10 +2409,10 @@
"seconds": "秒後重新整理"
},
"communitySupport": {
"title": "Keep LoRA Manager Thriving with Your Support ❤️",
"content": "LoRA Manager is a passion project maintained full-time by a solo developer. Your support on Ko-fi helps cover development costs, keeps new updates coming, and unlocks a license key for the LM Civitai Extension as a thank-you gift. Every contribution truly makes a difference.",
"supportCta": "Support on Ko-fi",
"learnMore": "LM Civitai Extension Tutorial"
"title": "用您的支持讓 LoRA Manager 持續茁壯 ❤️",
"content": "LoRA Manager 是由一位獨立開發者全職維護的熱情項目。您在 Ko-fi 上的支持有助於支付開發成本、持續推出新更新,並將贈送 LM CivitAI 擴充功能的授權金鑰作為感謝之禮。每一份貢獻都意義重大。",
"supportCta": " Ko-fi 上支持",
"learnMore": "LM CivitAI 擴充功能教學"
},
"cacheHealth": {
"corrupted": {
+4 -1
View File
@@ -3889,7 +3889,10 @@ class RecipeScanner:
break
if not file_name:
if lora.get("isDeleted", False):
# LoRAs deleted from the source or with an unresolvable hash
# cannot be downloaded; skip them instead of emitting a token
# pointing at a file that does not exist locally.
if lora.get("isDeleted", False) or lora.get("hashInvalid", False):
continue
file_name = lora.get("file_name", "unknown-lora")
folder = lora.get("folder", "")
+14
View File
@@ -699,6 +699,20 @@ body.hide-card-version .hl-badge {
border-color: rgba(231, 76, 60, 0.65);
}
/* Partial: usable but degraded some LoRAs are unobtainable (deleted from
the source or unresolvable hash) and are skipped when the recipe is used.
Amber sits between ready green and missing red. */
.lora-count.partial {
background: rgba(243, 156, 18, 0.35);
border-color: rgba(243, 156, 18, 0.65);
}
/* Unavailable: no usable LoRA at all — gray marks the recipe as dead. */
.lora-count.unavailable {
background: rgba(149, 165, 166, 0.35);
border-color: rgba(149, 165, 166, 0.65);
}
.placeholder-message {
grid-column: 1 / -1;
text-align: center;
@@ -1078,6 +1078,19 @@
color: #facc15;
}
/* Partial: usable but degraded some LoRAs are unobtainable and skipped.
Orange sits between ready green and missing amber. */
.recipe-card__badge--partial {
background: rgba(249, 115, 22, 0.2);
color: #fb923c;
}
/* Unavailable: no usable LoRA at all — red marks the recipe as dead. */
.recipe-card__badge--unavailable {
background: rgba(239, 68, 68, 0.2);
color: #f87171;
}
.recipe-card__badge--empty {
background: rgba(148, 163, 184, 0.18);
color: #e2e8f0;
@@ -1093,6 +1106,16 @@
background: rgba(245, 199, 43, 0.22);
}
[data-theme="light"] .recipe-card__badge--partial {
color: #c2410c;
background: rgba(249, 115, 22, 0.18);
}
[data-theme="light"] .recipe-card__badge--unavailable {
color: #b91c1c;
background: rgba(239, 68, 68, 0.16);
}
[data-theme="light"] .recipe-card__badge--empty {
color: rgba(71, 85, 105, 0.9);
background: rgba(148, 163, 184, 0.2);
+38
View File
@@ -190,6 +190,44 @@
justify-content: center;
}
/* Icon-only companion to the Send button: same pill style as its neighbors,
just without the text label. */
.modal-copy-btn {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 6px 10px;
background: var(--surface-subtle);
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: var(--border-radius-sm);
color: var(--text-color);
cursor: pointer;
font-size: 0.9em;
transition: var(--transition-base);
}
[data-theme="dark"] .modal-copy-btn {
background: var(--surface-subtle);
border: 1px solid var(--lora-border);
}
.modal-copy-btn:hover {
background: oklch(var(--lora-accent-l) var(--lora-accent-c) var(--lora-accent-h) / 0.1);
border-color: var(--lora-accent);
transform: translateY(-1px);
}
.modal-copy-btn:active {
transform: translateY(0);
}
.modal-copy-btn i {
font-size: 14px;
display: flex;
align-items: center;
justify-content: center;
}
@media (max-height: 860px) {
.recipe-header-actions {
padding-bottom: 4px;
@@ -204,8 +204,9 @@ export class RecipeContextMenu extends BaseContextMenu {
const response = await fetch(`/api/lm/recipe/${recipeId}`);
const recipe = await response.json();
// Get missing LoRAs
const missingLoras = recipe.loras.filter(lora => !lora.inLibrary && !lora.isDeleted);
// Get missing LoRAs (still downloadable: not deleted from the
// source and hash still resolvable)
const missingLoras = recipe.loras.filter(lora => !lora.inLibrary && !lora.isDeleted && !lora.hashInvalid);
if (missingLoras.length === 0) {
showToast('recipes.contextMenu.downloadMissing.noMissingLoras', {}, 'info');
+53 -12
View File
@@ -41,15 +41,35 @@ class RecipeCard {
const loras = this.recipe.loras || [];
const lorasCount = loras.length;
// Check if all LoRAs are available in the library
const missingLorasCount = loras.filter(lora => !lora.inLibrary && !lora.isDeleted).length;
const allLorasAvailable = missingLorasCount === 0 && lorasCount > 0;
// Count LoRAs by availability: in library, missing (still downloadable
// from the source), or unobtainable (deleted from the source, or an
// unresolvable hash) which is silently skipped when the recipe is used.
const availableLorasCount = loras.filter(lora => lora.inLibrary).length;
const missingLorasCount = loras.filter(lora => !lora.inLibrary && !lora.isDeleted && !lora.hashInvalid).length;
const unavailableLorasCount = lorasCount - availableLorasCount - missingLorasCount;
// Compact status pill: state icon + available/total fraction.
// Icon switches by state so status never relies on color alone.
const availableLorasCount = lorasCount - missingLorasCount;
const loraCountStateClass = missingLorasCount > 0 ? 'missing' : (allLorasAvailable ? 'ready' : '');
const loraCountIcon = missingLorasCount > 0 ? 'fa-exclamation-triangle' : (allLorasAvailable ? 'fa-check' : 'fa-layer-group');
// - missing (red): something can still be downloaded, most actionable
// - partial (amber): usable but degraded, unobtainable LoRAs are skipped
// - unavailable (gray, ban): no usable LoRA at all
let loraCountStateClass = '';
let loraCountIcon = 'fa-layer-group';
if (lorasCount > 0) {
if (availableLorasCount === lorasCount) {
loraCountStateClass = 'ready';
loraCountIcon = 'fa-check';
} else if (missingLorasCount > 0) {
loraCountStateClass = 'missing';
loraCountIcon = 'fa-exclamation-triangle';
} else if (availableLorasCount > 0) {
loraCountStateClass = 'partial';
loraCountIcon = 'fa-circle-minus';
} else {
loraCountStateClass = 'unavailable';
loraCountIcon = 'fa-ban';
}
}
const loraCountLabel = lorasCount > 0 ? `${availableLorasCount}/${lorasCount}` : `${lorasCount}`;
// Ensure file_url exists, fallback to API URL if needed
@@ -135,7 +155,7 @@ class RecipeCard {
<span class="model-name">${this.recipe.title}</span>
</div>
${!isDuplicatesMode ? `
<div class="lora-count ${loraCountStateClass}" title="${this.getLoraStatusTitle(lorasCount, missingLorasCount)}">
<div class="lora-count ${loraCountStateClass}" title="${this.getLoraStatusTitle(lorasCount, availableLorasCount, missingLorasCount, unavailableLorasCount)}">
<i class="fas ${loraCountIcon}" aria-hidden="true"></i> ${loraCountLabel}
</div>
` : ''}
@@ -154,17 +174,38 @@ class RecipeCard {
return card;
}
getLoraStatusTitle(totalCount, missingCount) {
getLoraStatusTitle(totalCount, availableCount, missingCount, unavailableCount) {
if (totalCount === 0) {
return translate('recipes.loraStatus.none', {}, 'No LoRAs in this recipe');
}
if (missingCount === 0) {
if (availableCount === totalCount) {
return translate('recipes.loraStatus.allAvailable', {}, 'All LoRAs available - Ready to use');
}
if (missingCount > 0 && unavailableCount > 0) {
return translate(
'recipes.loraStatus.missingAndUnavailable',
{ missing: missingCount, unavailable: unavailableCount, total: totalCount },
`${missingCount} of ${totalCount} LoRAs missing, ${unavailableCount} unavailable (deleted from source or unresolvable hash)`
);
}
if (missingCount > 0) {
return translate(
'recipes.loraStatus.missing',
{ missing: missingCount, total: totalCount },
`${missingCount} of ${totalCount} LoRAs missing`
);
}
if (availableCount > 0) {
return translate(
'recipes.loraStatus.partial',
{ unavailable: unavailableCount, total: totalCount },
`${unavailableCount} of ${totalCount} LoRAs unavailable (deleted from source or unresolvable hash) - skipped when recipe is used`
);
}
return translate(
'recipes.loraStatus.missing',
{ missing: missingCount, total: totalCount },
`${missingCount} of ${totalCount} LoRAs missing`
'recipes.loraStatus.noneUsable',
{ unavailable: unavailableCount, total: totalCount },
`No usable LoRAs - ${unavailableCount} of ${totalCount} deleted from source or unresolvable hash`
);
}
+39 -1
View File
@@ -960,7 +960,7 @@ class RecipeModal {
${lora.baseModel ? `<div class="base-model">${lora.baseModel}</div>` : ''}
</div>
${actionsRow}
${isDeleted ? `
${isDeleted || lora.hashInvalid ? `
<div class="lora-reconnect-container" data-lora-index="${loraIndex}">
<div class="reconnect-instructions">
<p>Enter LoRA Syntax or Name to Reconnect:</p>
@@ -1383,6 +1383,15 @@ class RecipeModal {
});
}
// Copy recipe syntax button (header actions)
const copyRecipeSyntaxBtn = document.getElementById('copyRecipeSyntaxBtn');
if (copyRecipeSyntaxBtn) {
copyRecipeSyntaxBtn.addEventListener('click', () => {
// Use backend API to get recipe syntax
this.fetchAndCopyRecipeSyntax();
});
}
// Send prompt to workflow buttons
const sendPromptBtn = document.getElementById('sendPromptBtn');
const sendNegativePromptBtn = document.getElementById('sendNegativePromptBtn');
@@ -1466,6 +1475,35 @@ class RecipeModal {
copyToClipboard(text, successMessage);
}
// Fetch recipe syntax from backend and copy to clipboard
async fetchAndCopyRecipeSyntax() {
if (!this.recipeId) {
showToast('toast.recipes.noRecipeId', {}, 'error');
return;
}
try {
// Fetch recipe syntax from backend
const response = await fetch(`/api/lm/recipe/${this.recipeId}/syntax`);
if (!response.ok) {
throw new Error(`Failed to get recipe syntax: ${response.statusText}`);
}
const data = await response.json();
if (data.success && data.syntax) {
// Use the centralized copyToClipboard utility function
await copyToClipboard(data.syntax, 'Recipe syntax copied to clipboard');
} else {
throw new Error(data.error || 'No syntax returned from server');
}
} catch (error) {
console.error('Error fetching recipe syntax:', error);
showToast('toast.recipes.copyFailed', { message: error.message }, 'error');
}
}
// Send recipe to ComfyUI workflow
async sendRecipeToWorkflow() {
if (!this.recipeId) {
+41 -11
View File
@@ -130,17 +130,29 @@ function renderRecipes(tabElement, recipes, options) {
const baseModel = recipe.base_model || '';
const loras = recipe.loras || [];
const lorasCount = loras.length;
const missingLorasCount = loras.filter(lora => !lora.inLibrary && !lora.isDeleted).length;
const allLorasAvailable = missingLorasCount === 0 && lorasCount > 0;
const statusClass = lorasCount === 0 ? 'empty' : (allLorasAvailable ? 'ready' : 'missing');
// Missing = still downloadable; unavailable = deleted from the source
// or unresolvable hash, silently skipped when the recipe is used.
const availableLorasCount = loras.filter(lora => lora.inLibrary).length;
const missingLorasCount = loras.filter(lora => !lora.inLibrary && !lora.isDeleted && !lora.hashInvalid).length;
const unavailableLorasCount = lorasCount - availableLorasCount - missingLorasCount;
const statusClass = lorasCount === 0 ? 'empty'
: (availableLorasCount === lorasCount ? 'ready'
: (missingLorasCount > 0 ? 'missing'
: (availableLorasCount > 0 ? 'partial' : 'unavailable')));
let statusLabel;
if (lorasCount === 0) {
statusLabel = 'No linked LoRAs';
} else if (allLorasAvailable) {
} else if (statusClass === 'ready') {
statusLabel = `${lorasCount} LoRA${lorasCount > 1 ? 's' : ''} ready`;
} else if (statusClass === 'missing') {
statusLabel = unavailableLorasCount > 0
? `Missing ${missingLorasCount}, ${unavailableLorasCount} of ${lorasCount} unavailable`
: `Missing ${missingLorasCount} of ${lorasCount}`;
} else if (statusClass === 'partial') {
statusLabel = `${unavailableLorasCount} of ${lorasCount} unavailable - skipped when used`;
} else {
statusLabel = `Missing ${missingLorasCount} of ${lorasCount}`;
statusLabel = 'No usable LoRAs';
}
const imageUrl = recipe.file_url ||
@@ -207,8 +219,16 @@ function renderRecipes(tabElement, recipes, options) {
const statusBadge = document.createElement('span');
statusBadge.className = `recipe-card__badge recipe-card__badge--${statusClass}`;
// Icon switches by state so status never relies on color alone.
const statusIcons = {
ready: 'fa-check',
missing: 'fa-exclamation-triangle',
partial: 'fa-circle-minus',
unavailable: 'fa-ban',
empty: 'fa-layer-group',
};
const statusIcon = document.createElement('i');
statusIcon.className = 'fas fa-layer-group';
statusIcon.className = `fas ${statusIcons[statusClass] || 'fa-layer-group'}`;
statusIcon.setAttribute('aria-hidden', 'true');
statusBadge.appendChild(statusIcon);
@@ -216,7 +236,7 @@ function renderRecipes(tabElement, recipes, options) {
statusText.textContent = statusLabel;
statusBadge.appendChild(statusText);
statusBadge.title = getLoraStatusTitle(lorasCount, missingLorasCount);
statusBadge.title = getLoraStatusTitle(lorasCount, availableLorasCount, missingLorasCount, unavailableLorasCount);
meta.appendChild(statusBadge);
body.appendChild(meta);
@@ -264,13 +284,23 @@ function renderRecipes(tabElement, recipes, options) {
/**
* Returns a descriptive title for the LoRA status indicator
* @param {number} totalCount - Total number of LoRAs in recipe
* @param {number} missingCount - Number of missing LoRAs
* @param {number} availableCount - Number of LoRAs present in the library
* @param {number} missingCount - Number of missing LoRAs (still downloadable)
* @param {number} unavailableCount - Number of unobtainable LoRAs (deleted
* from the source or unresolvable hash)
* @returns {string} Status title text
*/
function getLoraStatusTitle(totalCount, missingCount) {
function getLoraStatusTitle(totalCount, availableCount, missingCount, unavailableCount) {
if (totalCount === 0) return "No LoRAs in this recipe";
if (missingCount === 0) return "All LoRAs available - Ready to use";
return `${missingCount} of ${totalCount} LoRAs missing`;
if (availableCount === totalCount) return "All LoRAs available - Ready to use";
if (missingCount > 0 && unavailableCount > 0) {
return `${missingCount} of ${totalCount} LoRAs missing, ${unavailableCount} unavailable (deleted from source or unresolvable hash)`;
}
if (missingCount > 0) return `${missingCount} of ${totalCount} LoRAs missing`;
if (availableCount > 0) {
return `${unavailableCount} of ${totalCount} LoRAs unavailable (deleted from source or unresolvable hash) - skipped when recipe is used`;
}
return `No usable LoRAs - ${unavailableCount} of ${totalCount} deleted from source or unresolvable hash`;
}
/**
@@ -30,8 +30,9 @@ export class BulkMissingLoraDownloadManager {
if (recipe.loras && Array.isArray(recipe.loras)) {
recipe.loras.forEach(lora => {
// Only include LoRAs not in library and not deleted
if (!lora.inLibrary && !lora.isDeleted) {
// Only include LoRAs not in library and still downloadable
// (not deleted from the source, hash still resolvable)
if (!lora.inLibrary && !lora.isDeleted && !lora.hashInvalid) {
const uniqueKey = lora.hash || lora.id || lora.modelVersionId;
if (uniqueKey && !uniqueLoras.has(uniqueKey)) {
+4 -1
View File
@@ -14,11 +14,14 @@
</button>
</div>
</div>
<!-- Header Actions: Send button is static; source URL button is appended dynamically in RecipeModal.js -->
<!-- Header Actions: Send and Copy buttons are static; source URL button is appended dynamically in RecipeModal.js -->
<div class="recipe-header-actions" id="recipeHeaderActions">
<button class="modal-send-btn" id="sendRecipeBtn" title="Send Recipe to ComfyUI">
<i class="fas fa-paper-plane"></i> <span>{{ t('recipes.actions.sendRecipe') }}</span>
</button>
<button class="modal-copy-btn" id="copyRecipeSyntaxBtn" title="{{ t('recipes.actions.copyRecipeSyntax') }}" aria-label="{{ t('recipes.actions.copyRecipeSyntax') }}">
<i class="fas fa-copy" aria-hidden="true"></i>
</button>
<button class="modal-delete-btn" id="deleteRecipeBtn" title="{{ t('recipes.actions.deleteRecipeWithShortcut') }}" aria-label="{{ t('recipes.actions.deleteRecipeWithShortcut') }}">
<i class="fas fa-trash" aria-hidden="true"></i>
</button>
@@ -130,14 +130,61 @@ describe('RecipeCard LoRA status pill', () => {
expect(card.element.querySelector('.lora-count.missing')).toBeNull();
});
it('does not count deleted LoRAs as missing', async () => {
it('marks deleted-from-source LoRAs as partial instead of ready', async () => {
const card = await createCard([
{ name: 'a', inLibrary: true },
{ name: 'b', inLibrary: false, isDeleted: true },
]);
expect(card.element.querySelector('.lora-count.missing')).toBeNull();
expect(card.element.querySelector('.lora-count.ready')).not.toBeNull();
expect(card.element.querySelector('.lora-count.ready')).toBeNull();
const pill = card.element.querySelector('.lora-count.partial');
expect(pill).not.toBeNull();
expect(pill.querySelector('.fa-circle-minus')).not.toBeNull();
expect(pill.textContent).toContain('1/2');
expect(pill.title).toBe('1 of 2 LoRAs unavailable (deleted from source or unresolvable hash) - skipped when recipe is used');
});
it('treats an unresolvable hash as unobtainable, not missing', async () => {
const card = await createCard([
{ name: 'a', inLibrary: true },
{ name: 'b', inLibrary: false, hashInvalid: true },
]);
expect(card.element.querySelector('.lora-count.missing')).toBeNull();
const pill = card.element.querySelector('.lora-count.partial');
expect(pill).not.toBeNull();
expect(pill.textContent).toContain('1/2');
});
it('shows 0/n unavailable when every LoRA is deleted and none is in the library', async () => {
const card = await createCard([
{ name: 'a', inLibrary: false, isDeleted: true },
{ name: 'b', inLibrary: false, isDeleted: true },
]);
const pill = card.element.querySelector('.lora-count.unavailable');
expect(pill).not.toBeNull();
expect(pill.querySelector('.fa-ban')).not.toBeNull();
expect(pill.textContent).toContain('0/2');
expect(pill.title).toBe('No usable LoRAs - 2 of 2 deleted from source or unresolvable hash');
expect(card.element.querySelector('.lora-count.ready')).toBeNull();
});
it('keeps the actionable missing state when LoRAs are both missing and deleted', async () => {
const card = await createCard([
{ name: 'a', inLibrary: true },
{ name: 'b', inLibrary: false },
{ name: 'c', inLibrary: false, isDeleted: true },
]);
const pill = card.element.querySelector('.lora-count.missing');
expect(pill).not.toBeNull();
expect(pill.textContent).toContain('1/3');
expect(pill.title).toBe('1 of 3 LoRAs missing, 1 unavailable (deleted from source or unresolvable hash)');
expect(card.element.querySelector('.lora-count.partial')).toBeNull();
});
it('shows a neutral layers icon with a bare 0 when the recipe has no LoRAs', async () => {
@@ -0,0 +1,132 @@
import { describe, it, beforeEach, afterEach, expect, vi } from 'vitest';
const showToastMock = vi.fn();
const copyToClipboardMock = vi.fn();
const translateMock = vi.fn((key, params, fallback) => (typeof fallback === 'string' ? fallback : key));
const loadingManagerStub = {
showSimpleLoading: vi.fn(),
hide: vi.fn(),
show: vi.fn(),
restoreProgressBar: vi.fn(),
};
const stateStub = {
global: { settings: {}, loadingManager: loadingManagerStub },
loadingManager: loadingManagerStub,
virtualScroller: { updateSingleItem: vi.fn() },
};
vi.mock('../../../static/js/utils/uiHelpers.js', () => ({
showToast: showToastMock,
copyToClipboard: copyToClipboardMock,
sendLoraToWorkflow: vi.fn(),
sendModelPathToWorkflow: vi.fn(),
openCivitaiByMetadata: vi.fn(),
stripLoraTags: vi.fn((text) => text),
sendPromptToWorkflow: vi.fn(),
sendGenParamsToWorkflow: vi.fn(),
}));
vi.mock('../../../static/js/utils/i18nHelpers.js', () => ({
translate: translateMock,
}));
vi.mock('../../../static/js/state/index.js', () => ({
state: stateStub,
}));
vi.mock('../../../static/js/utils/storageHelpers.js', () => ({
setSessionItem: vi.fn(),
removeSessionItem: vi.fn(),
getStorageItem: vi.fn(() => null),
setStorageItem: vi.fn(),
}));
vi.mock('../../../static/js/api/recipeApi.js', () => ({
fetchRecipeDetails: vi.fn(),
updateRecipeMetadata: vi.fn(() => Promise.resolve({ success: true })),
sendRecipeWorkflow: vi.fn(),
}));
vi.mock('../../../static/js/api/apiConfig.js', () => ({
MODEL_TYPES: {
LORA: 'loras',
CHECKPOINT: 'checkpoints',
EMBEDDING: 'embeddings',
},
}));
async function flushAsyncTasks() {
await Promise.resolve();
await new Promise((resolve) => setTimeout(resolve, 0));
}
async function createRecipeModal() {
const { RecipeModal } = await import('../../../static/js/components/RecipeModal.js');
return new RecipeModal();
}
describe('RecipeModal copy recipe syntax', () => {
beforeEach(() => {
vi.clearAllMocks();
document.body.innerHTML = `
<div class="recipe-header-actions" id="recipeHeaderActions">
<button class="modal-send-btn" id="sendRecipeBtn"><i class="fas fa-paper-plane"></i></button>
<button class="modal-copy-btn" id="copyRecipeSyntaxBtn"><i class="fas fa-copy"></i></button>
</div>
`;
global.fetch = vi.fn();
});
afterEach(() => {
document.body.innerHTML = '';
delete global.fetch;
});
it('copies the recipe syntax when the header copy button is clicked', async () => {
const recipeModal = await createRecipeModal();
recipeModal.recipeId = 'recipe-1';
global.fetch.mockResolvedValue({
ok: true,
json: () => Promise.resolve({ success: true, syntax: '<lora:foo:1>' }),
});
recipeModal.setupCopyButtons();
document.getElementById('copyRecipeSyntaxBtn').dispatchEvent(new Event('click', { bubbles: true }));
await flushAsyncTasks();
expect(global.fetch).toHaveBeenCalledWith('/api/lm/recipe/recipe-1/syntax');
expect(copyToClipboardMock).toHaveBeenCalledWith('<lora:foo:1>', 'Recipe syntax copied to clipboard');
});
it('shows an error toast and skips the API call without a recipe ID', async () => {
const recipeModal = await createRecipeModal();
recipeModal.recipeId = null;
await recipeModal.fetchAndCopyRecipeSyntax();
expect(global.fetch).not.toHaveBeenCalled();
expect(showToastMock).toHaveBeenCalledWith('toast.recipes.noRecipeId', {}, 'error');
});
it('shows an error toast when the backend returns no syntax', async () => {
const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
const recipeModal = await createRecipeModal();
recipeModal.recipeId = 'recipe-1';
global.fetch.mockResolvedValue({
ok: true,
json: () => Promise.resolve({ success: false, error: 'no syntax' }),
});
await recipeModal.fetchAndCopyRecipeSyntax();
expect(copyToClipboardMock).not.toHaveBeenCalled();
expect(showToastMock).toHaveBeenCalledWith(
'toast.recipes.copyFailed',
{ message: 'no syntax' },
'error'
);
errorSpy.mockRestore();
});
});
@@ -110,6 +110,7 @@ function recipeModalFixture() {
</div>
<div class="recipe-header-actions" id="recipeHeaderActions">
<button class="modal-send-btn" id="sendRecipeBtn"><i class="fas fa-paper-plane"></i></button>
<button class="modal-copy-btn" id="copyRecipeSyntaxBtn"><i class="fas fa-copy"></i></button>
</div>
<div id="recipeTagsContainer"></div>
</header>
@@ -342,7 +342,13 @@ describe('RecipeModal resource item interactions', () => {
expect(badge.textContent).toContain('Unresolvable Hash');
expect(invalidItem.querySelector('.lora-download')).toBeNull();
expect(invalidItem.querySelector('.lora-reconnect')).not.toBeNull();
const reconnectButton = invalidItem.querySelector('.lora-reconnect');
expect(reconnectButton).not.toBeNull();
reconnectButton.click();
const container = invalidItem.querySelector('.lora-reconnect-container');
expect(container).not.toBeNull();
expect(container.classList.contains('active')).toBe(true);
});
it('marks the entry hash-invalid when hash resolution returns Model not found', async () => {
+28
View File
@@ -374,6 +374,34 @@ async def test_set_lora_entry_hash_invalid_persists_flag(tmp_path: Path, recipe_
assert cleared_lora["hashInvalid"] is False
@pytest.mark.asyncio
async def test_get_recipe_syntax_tokens_skips_unobtainable_loras(tmp_path: Path, recipe_scanner):
scanner, _ = recipe_scanner
recipes_dir = Path(config.loras_roots[0]) / "recipes"
recipes_dir.mkdir(parents=True, exist_ok=True)
recipe_id = "syntax-skip-1"
recipe_path = recipes_dir / f"{recipe_id}.recipe.json"
recipe_data = {
"id": recipe_id,
"file_path": str(tmp_path / "image.png"),
"title": "Syntax skip",
"modified": 0.0,
"created_date": 0.0,
"loras": [
{"file_name": "usable_lora", "strength": 0.8, "hash": ""},
{"file_name": "deleted_lora", "strength": 1.0, "hash": "", "isDeleted": True},
{"file_name": "invalid_hash_lora", "strength": 1.0, "hash": "", "hashInvalid": True},
],
}
recipe_path.write_text(json.dumps(recipe_data))
await scanner.add_recipe(dict(recipe_data))
tokens = await scanner.get_recipe_syntax_tokens(recipe_id)
assert tokens == ["<lora:usable_lora:0.8>"]
@pytest.mark.asyncio
async def test_load_recipe_rewrites_missing_image_path(tmp_path: Path, recipe_scanner):
scanner, _ = recipe_scanner