diff --git a/.env.local.example b/.env.local.example index 1839f9e13..5263b1378 100644 --- a/.env.local.example +++ b/.env.local.example @@ -2,24 +2,32 @@ # # cp .env.local.example .env.local # -# Used by: npm run translate (see package.json), fix-zh-leaks.ts, etc. +# Used by: npm run translate (see package.json), etc. # Requires Bun: https://bun.sh # ----------------------------------------------------------------------------- # Translation API (translate-i18n.ts) -# OpenAI-compatible endpoint. Works with DashScope Qwen-MT, OpenRouter, DeepSeek, etc. +# OpenAI-compatible endpoint. Works with OpenRouter, DeepSeek, DashScope Qwen-MT, etc. # ----------------------------------------------------------------------------- -# --- DeepSeek (recommended) --- +# --- OpenRouter --- +# API keys: https://openrouter.ai/keys +# Docs: https://openrouter.ai/docs +# Models: any OpenRouter model id, e.g. deepseek/deepseek-chat, anthropic/claude-sonnet-4 +# TRANSLATE_API_KEY= +# TRANSLATE_API_BASE_URL=https://openrouter.ai/api/v1 +# TRANSLATE_API_MODEL=deepseek/deepseek-chat + +# --- DeepSeek --- # API keys: https://platform.deepseek.com/api_keys # Docs: https://api-docs.deepseek.com/ # Models: deepseek-v4-pro (quality) | deepseek-v4-flash (faster/cheaper) # Note: deepseek-chat / deepseek-reasoner are deprecated after 2026-07-24. -TRANSLATE_API_KEY= -TRANSLATE_API_BASE_URL=https://api.deepseek.com -TRANSLATE_API_MODEL=deepseek-v4-pro +# TRANSLATE_API_KEY= +# TRANSLATE_API_BASE_URL=https://api.deepseek.com +# TRANSLATE_API_MODEL=deepseek-v4-pro # TRANSLATE_API_MODEL=deepseek-v4-flash -TRANSLATE_CONCURRENCY=5 +# TRANSLATE_CONCURRENCY=5 # --- DashScope Qwen-MT (alternative) --- # TRANSLATE_API_KEY= @@ -31,13 +39,23 @@ TRANSLATE_CONCURRENCY=5 # DASHSCOPE_API_KEY= # ----------------------------------------------------------------------------- -# Fix Chinese leaks in Japanese files (fix-zh-leaks.ts --llm) -# Falls back to TRANSLATE_* / DASHSCOPE_* above if unset +# Translation quality review (review-i18n.ts / npm run translate:review) — optional +# Independent LLM-as-a-judge that scores translations. Use a CHEAP/FAST model — +# evaluation is lighter than translation. Falls back to TRANSLATE_* if unset. +# ----------------------------------------------------------------------------- + +# REVIEW_API_KEY= +# REVIEW_API_BASE_URL=https://api.deepseek.com +# REVIEW_API_MODEL=deepseek-v4-flash +# REVIEW_CONCURRENCY=5 + +# ----------------------------------------------------------------------------- +# Glossary sync (sync-glossary.mjs) — optional +# Path to the ComfyUI frontend locales. Defaults to ../ComfyUI_frontend/src/locales; +# also settable via frontend_locales_path in translation-config.json. # ----------------------------------------------------------------------------- -# FIX_ZH_API_KEY= -# FIX_ZH_BASE_URL= -# FIX_ZH_MODEL=qwen-turbo +# FRONTEND_LOCALES_PATH=../ComfyUI_frontend/src/locales # ----------------------------------------------------------------------------- # Optional — external link tracking (track-external-links.py) diff --git a/.github/scripts/i18n/README.md b/.github/scripts/i18n/README.md new file mode 100644 index 000000000..bc05ea16c --- /dev/null +++ b/.github/scripts/i18n/README.md @@ -0,0 +1,148 @@ +# Docs i18n + +Tooling that translates the English MDX docs into the languages listed in +[`translation-config.json`](./translation-config.json) (currently ja / zh / ko). +English is the single source of truth; every other language is generated. + +## How translation works + +`translate-i18n.ts` is the entry point. It is **incremental**: each translated +file records a `translationSourceHash` (SHA-256 of its English source) in +frontmatter, and a re-run skips files whose English source is unchanged. The +English source is the primary input; the existing target file is passed as +context so unchanged sections are preserved. + +```bash +pnpm translate # translate pending pages + snippets, all languages +pnpm translate:dry-run # list what would be translated +pnpm translate:force # re-translate everything +pnpm translate -- --lang zh,ja # specific languages +pnpm translate -- installation/x.mdx # specific files +pnpm translate:snippets # snippets only +pnpm translate:check-truncation # scan for truncated output +pnpm translate:repair-truncated -- --lang ko +pnpm translate:sync-docs-json # sync docs.json navigation paths +``` + +Quality controls during/after a run write to `.github/i18n-logs/translate/` +(gitignored): semantic mismatches reported by the model, and a truncation scan +(`check-translation-truncation.ts`). + +## Quality review (LLM-as-a-judge) + +`review-i18n.ts` scores existing translations with an **independent** (and +typically cheaper) model on four axes — accuracy, completeness, terminology +(checked against the glossary), and fluency — and lists concrete issues. This is +separate from the translation model's own `=== MISMATCHES ===` notes: here a +different model acts as judge. + +Results are **advisory**: written to `.github/i18n-logs/review/` +(`quality-report.json` / `.txt`, gitignored), never into MDX and never blocking. +By default only translations that are up to date with English and not yet +reviewed at that hash are checked. The reviewed hash is stored as +`reviewSourceHash` in the translated file's frontmatter (snippets: an MDX +comment) and committed to git — so review state is shared across the team and +visible per file, mirroring `translationSourceHash`. Only the hash goes in +frontmatter; scores and the issue list stay in the gitignored report. + +```bash +pnpm translate:review # pending reviews, all languages +pnpm translate:review -- --lang ko # one language +pnpm translate:review -- installation/x.mdx +pnpm translate:review -- --all # re-review everything +pnpm translate:review -- --sample 20 # N pending files per language +pnpm translate:review -- --min-score 4 # report files scoring below 4/5 +``` + +Configure a dedicated (cheap) judge model via `REVIEW_API_KEY` / +`REVIEW_API_BASE_URL` / `REVIEW_API_MODEL` in `.env.local`; falls back to the +`TRANSLATE_*` model when unset. Use a fast model — evaluation is lighter than +translation, and reasoning-heavy models are slow and can drop connections under +concurrency (lower `REVIEW_CONCURRENCY` if you see socket errors). + +## Terminology consistency + +The same English term must render the same way across pages. Three complementary +mechanisms handle this, each for a different category of term: + +| Mechanism | Effect | Example | Maintained | +|-----------|--------|---------|------------| +| `preserve_terms` (in `translation-config.json`) | keep the term **in English** | `checkpoint`, `LoRA`, `scheduler` | by hand | +| glossary `frontend/{lang}.json` | use the frontend's **translation** | `workflow → 워크플로` | machine-synced | +| glossary `overrides/{lang}.json` | **correct / extend** the frontend | `custom node → 커스텀 노드` | by hand, wins | + +**Why three.** ComfyUI proper nouns with no settled translation (model names, +`checkpoint`, `embedding`, …) should stay in English → `preserve_terms`. Terms +the ComfyUI frontend already translates well → mirror them. Terms the frontend +gets wrong, lacks, or that a language community wants to pin → overrides. + +### The glossary (`glossary/`) + +``` +glossary/ + frontend/{lang}.json machine mirror of ComfyUI frontend locale terms + overrides/{lang}.json hand-maintained corrections; win over the mirror +``` + +**`frontend/`** is rebuilt wholesale by `pnpm glossary:sync` from the ComfyUI +frontend locales (the authoritative source). Never hand-edit it. Shape: + +```jsonc +{ "custom nodes": "커스텀 노드", "workflow": "워크플로" } +``` + +**`overrides/{lang}.json`** is the place to record a term decision (issue #1124). +It both remaps terms and drops noisy frontend terms: + +```jsonc +{ + "terms": { "custom node": "커스텀 노드" }, // remap or add (wins over frontend) + "ignore": ["title", "additional", "work"] // drop a noisy frontend term +} +``` + +Resolution at translation time: frontend mirror → remove `ignore` → apply +`terms`. For each document, only terms that literally appear are selected +(whole-word, case-insensitive, longest-first, capped) and injected as +**preferred** (not mandatory) hints — so the model keeps natural phrasing when a +literal substitution would read awkwardly. + +```bash +pnpm glossary:sync # rebuild the frontend mirror, all languages +pnpm glossary:sync -- --lang ko # one language +pnpm glossary:sync:dry-run # report counts without writing +``` + +Frontend path resolves in order: `--frontend ` → `FRONTEND_LOCALES_PATH` +env → `frontend_locales_path` in `translation-config.json` → +`../ComfyUI_frontend/src/locales`. + +### Design notes + +- **Why not auto-extract everything from the frontend?** Its UI locale strings + are low signal as a glossary — full of button/toast text (`Download image`) and + function words whose UI rendering is wrong in prose (`of → 중`, `work → 업무용`). +- **Why a curated word blocklist, not a length filter?** Gold short terms + (`node`, `model`, `latent`) and harmful ones (`work`, `mode`, `here`) are the + same length; length can't separate them. `sync-glossary.mjs` uses an explicit + common-word blocklist; the long tail that slips through goes in override + `ignore`. + +### Curating + +- A frontend term reads badly in prose → add it to the override `ignore` list. +- A term needs a different / agreed translation → add it to override `terms`. +- A term should stay in English everywhere → add it to `preserve_terms`. + +## Files + +| File | Role | +|------|------| +| `translate-i18n.ts` | translation entry point | +| `sync-glossary.mjs` | rebuild the glossary frontend mirror | +| `glossary.mjs` | load glossary layers, select + inject terms | +| `i18n-config.mjs` | shared path rules from `translation-config.json` | +| `sync-docs-json.mjs` / `nav-label-translate.mjs` | docs.json navigation sync | +| `check-translation-truncation.ts` | detect truncated output | +| `check-i18n-sync.mjs` | PR check: English changes have matching translations | +| `translation-config.json` | languages, skip paths, `preserve_terms`, frontend path | diff --git a/.github/scripts/i18n/check-ja.ts b/.github/scripts/i18n/check-ja.ts deleted file mode 100644 index 1b1f97cb7..000000000 --- a/.github/scripts/i18n/check-ja.ts +++ /dev/null @@ -1,265 +0,0 @@ -#!/usr/bin/env bun -/** - * Quality check for Japanese translation files. - * - * Usage: - * bun .github/scripts/i18n/check-ja.ts # check all ja/ files - * bun .github/scripts/i18n/check-ja.ts --verbose # show per-file details - * bun .github/scripts/i18n/check-ja.ts foo.mdx # check specific file(s) - */ - -import { readdir, readFile } from "fs/promises"; -import { join, relative } from "path"; - -const ROOT = join(import.meta.dir, "../../.."); - -// --------------------------------------------------------------------------- -// Helpers -// --------------------------------------------------------------------------- - -async function collectMdx(dir: string): Promise { - const results: string[] = []; - const entries = await readdir(dir, { withFileTypes: true }); - for (const entry of entries) { - const full = join(dir, entry.name); - if (entry.isDirectory()) { - results.push(...(await collectMdx(full))); - } else if (entry.name.endsWith(".mdx")) { - results.push(full); - } - } - return results; -} - -/** Count CJK characters (Han + Hiragana + Katakana) */ -function countCJK(text: string): number { - const m = text.match(/[\u3000-\u9fff\uf900-\ufaff]/g); - return m ? m.length : 0; -} - -/** Count Hiragana characters (unique to Japanese) */ -function countHiragana(text: string): number { - const m = text.match(/[\u3040-\u309f]/g); - return m ? m.length : 0; -} - -/** Count Katakana characters (unique to Japanese) */ -function countKatakana(text: string): number { - const m = text.match(/[\u30a0-\u30ff]/g); - return m ? m.length : 0; -} - -/** Count Chinese-only characters that don't appear in Japanese - * (simplified Chinese characters not used in Japanese kanji) */ -function countChineseOnly(text: string): number { - // Common simplified Chinese markers not used in Japanese - const m = text.match(/[的了在是我他她它们这那里吗呢吧啊哦哈嗯]/g); - return m ? m.length : 0; -} - -/** Count all non-whitespace, non-markup characters */ -function countTextChars(text: string): number { - // Strip frontmatter - const body = text.replace(/^---\n[\s\S]*?\n---\n?/, ""); - // Strip imports, JSX tags, URLs, code blocks - const cleaned = body - .replace(/```[\s\S]*?```/g, "") // code blocks - .replace(/`[^`]+`/g, "") // inline code - .replace(/import\s+.*?from\s+.*?;?\n/g, "") // imports - .replace(/<[^>]+>/g, "") // JSX/HTML tags - .replace(/https?:\/\/\S+/g, "") // URLs - .replace(/\{\/\*[\s\S]*?\*\/\}/g, "") // JSX comments - .replace(//g, "") // HTML comments - .replace(/\[([^\]]*)\]\([^)]*\)/g, "$1"); // markdown links (keep text) - // Count non-whitespace chars - return cleaned.replace(/\s/g, "").length; -} - -/** Check if file has translationSourceHash in frontmatter */ -function hasSourceHash(text: string): boolean { - return /translationSourceHash:\s*[a-f0-9]{8}/.test(text); -} - -/** Check for leaked English-only content patterns */ -function findLeakedEnglish(text: string): string[] { - const body = text.replace(/^---\n[\s\S]*?\n---\n?/, ""); - const issues: string[] = []; - - // Check for common untranslated English patterns in prose (not in code/tags) - const proseLines = body - .replace(/```[\s\S]*?```/g, "") - .replace(/`[^`]+`/g, "") - .replace(/<[^>]+>/g, "") - .replace(/import\s+.*?from\s+.*?;?\n/g, "") - .split("\n") - .filter((l) => l.trim().length > 20); - - for (const line of proseLines) { - const trimmed = line.trim(); - // Skip lines that are just URLs, code, or markdown syntax - if (/^https?:\/\//.test(trimmed)) continue; - if (/^\|/.test(trimmed)) continue; // table rows - if (/^[#>*-]/.test(trimmed) && trimmed.length < 30) continue; - - const cjk = countCJK(trimmed); - const total = trimmed.replace(/\s/g, "").length; - // If a long prose line has 0 CJK chars, it's likely untranslated - if (total > 30 && cjk === 0) { - // But skip lines that are mostly code/technical - if (!/^[A-Z][a-z]/.test(trimmed)) continue; - issues.push(trimmed.slice(0, 80)); - } - } - return issues; -} - -/** Check for thinking tag leaks */ -function hasThinkingLeaks(text: string): boolean { - return /|<\/think>/.test(text); -} - -/** Check for MISMATCH comment leaks (should be in frontmatter only) */ -function hasMismatchCommentLeaks(text: string): boolean { - const body = text.replace(/^---\n[\s\S]*?\n---\n?/, ""); - return / comment in body"); - if (totalChars > 50 && cjkRate < 0.05) issues.push(`very low CJK rate: ${(cjkRate * 100).toFixed(1)}%`); - if (totalChars > 100 && cjkChars === 0) issues.push("zero CJK characters (untranslated?)"); - if (cjkChars > 20 && jpChars === 0) issues.push("zero hiragana/katakana — likely Chinese, not Japanese"); - if (cjkChars > 20 && jpRate < 0.05 && zhOnly > 5) issues.push(`likely Chinese (${jpChars} kana vs ${zhOnly} zh-only markers)`); - if (leakedEnglish.length > 3) issues.push(`${leakedEnglish.length} potentially untranslated lines`); - - const status = issues.length === 0 - ? "ok" - : issues.some((i) => i.includes("not Japanese") || i.includes("likely Chinese") || i.includes("zero CJK") || i.includes("leaked")) - ? "fail" - : "warn"; - - return { path: relPath, totalChars, cjkChars, cjkRate, hiragana, katakana, jpRate, hasHash, thinkingLeak, mismatchLeak, leakedEnglish, status, issues }; -} - -async function main() { - const args = process.argv.slice(2); - const verbose = args.includes("--verbose"); - const fileArgs = args.filter((a) => !a.startsWith("--")); - - let files: string[]; - if (fileArgs.length > 0) { - files = fileArgs.map((f) => join(ROOT, "ja", f.replace(/^(ja|snippets\/ja)\//, ""))); - } else { - // Check both ja/ pages and snippets/ja/ - const jaFiles = await collectMdx(join(ROOT, "ja")); - const snippetFiles = await collectMdx(join(ROOT, "snippets/ja")); - files = [...jaFiles, ...snippetFiles]; - } - - console.log(`Checking ${files.length} Japanese translation files...\n`); - - const reports: FileReport[] = []; - for (const f of files) { - reports.push(await checkFile(f)); - } - - // Stats - const ok = reports.filter((r) => r.status === "ok").length; - const warn = reports.filter((r) => r.status === "warn").length; - const fail = reports.filter((r) => r.status === "fail").length; - - const totalCJK = reports.reduce((s, r) => s + r.cjkChars, 0); - const totalChars = reports.reduce((s, r) => s + r.totalChars, 0); - const avgCJKRate = totalChars > 0 ? totalCJK / totalChars : 0; - - // CJK rate distribution - const rates = reports.filter((r) => r.totalChars > 50).map((r) => r.cjkRate); - rates.sort((a, b) => a - b); - const p10 = rates[Math.floor(rates.length * 0.1)] ?? 0; - const p50 = rates[Math.floor(rates.length * 0.5)] ?? 0; - const p90 = rates[Math.floor(rates.length * 0.9)] ?? 0; - - const totalHiragana = reports.reduce((s, r) => s + r.hiragana, 0); - const totalKatakana = reports.reduce((s, r) => s + r.katakana, 0); - const totalJP = totalHiragana + totalKatakana; - const avgJPRate = totalCJK > 0 ? totalJP / totalCJK : 0; - - console.log("=== Summary ==="); - console.log(`Files: ${files.length} total, ${ok} ok, ${warn} warn, ${fail} fail`); - console.log(`CJK: ${totalCJK.toLocaleString()} CJK chars / ${totalChars.toLocaleString()} total = ${(avgCJKRate * 100).toFixed(1)}% avg`); - console.log(`Kana: ${totalHiragana.toLocaleString()} hiragana + ${totalKatakana.toLocaleString()} katakana = ${totalJP.toLocaleString()} (${(avgJPRate * 100).toFixed(1)}% of CJK)`); - console.log(`CJK distribution (files >50 chars): p10=${(p10 * 100).toFixed(1)}% p50=${(p50 * 100).toFixed(1)}% p90=${(p90 * 100).toFixed(1)}%`); - console.log(); - - // Show problems - const problems = reports.filter((r) => r.status !== "ok"); - if (problems.length > 0) { - console.log(`=== Issues (${problems.length} files) ===`); - for (const r of problems) { - const icon = r.status === "fail" ? "FAIL" : "WARN"; - console.log(`${icon} ${r.path} (CJK ${(r.cjkRate * 100).toFixed(1)}%, kana ${(r.jpRate * 100).toFixed(0)}%)`); - for (const issue of r.issues) { - console.log(` - ${issue}`); - } - } - console.log(); - } - - // Verbose: show all files sorted by CJK rate - if (verbose) { - console.log("=== All files by CJK rate ==="); - const sorted = [...reports].filter((r) => r.totalChars > 50).sort((a, b) => a.cjkRate - b.cjkRate); - for (const r of sorted.slice(0, 30)) { - console.log(` ${(r.cjkRate * 100).toFixed(1)}% ${r.path} (${r.cjkChars}/${r.totalChars})`); - } - if (sorted.length > 30) console.log(` ... and ${sorted.length - 30} more`); - } - - // Exit code - process.exit(fail > 0 ? 1 : 0); -} - -main().catch((err) => { - console.error(err); - process.exit(1); -}); diff --git a/.github/scripts/i18n/fix-zh-leaks.ts b/.github/scripts/i18n/fix-zh-leaks.ts deleted file mode 100644 index 5ded5b71b..000000000 --- a/.github/scripts/i18n/fix-zh-leaks.ts +++ /dev/null @@ -1,314 +0,0 @@ -#!/usr/bin/env bun -/** - * Fix Chinese text contamination in Japanese translation files. - * - * Two modes: - * 1. --dict Static dictionary replacement (free, instant) - * 2. --llm Use a cheap LLM to detect & fix unknown Chinese leaks - * - * Usage: - * bun .github/scripts/i18n/fix-zh-leaks.ts --dict # dict-only, all files - * bun .github/scripts/i18n/fix-zh-leaks.ts --llm # LLM scan, all files - * bun .github/scripts/i18n/fix-zh-leaks.ts --dict --llm # both - * bun .github/scripts/i18n/fix-zh-leaks.ts --dict file1.mdx # specific files - * bun .github/scripts/i18n/fix-zh-leaks.ts --dry-run --dict # show what would change - * - * LLM env (uses TRANSLATE_CJK_* or falls back to a cheap model): - * FIX_ZH_MODEL - model for scanning (default: qwen-plus, or use a cheap one like qwen-turbo) - * FIX_ZH_BASE_URL - API base URL - * FIX_ZH_API_KEY - API key - */ - -import { readdir, readFile, writeFile, mkdir } from "fs/promises"; -import { join, relative } from "path"; -import { getActiveDict } from "./zh-ja-dict"; - -const ROOT = join(import.meta.dir, "../../.."); - -// Load .env.local -async function loadEnvLocal() { - try { - const content = await readFile(join(ROOT, ".env.local"), "utf-8"); - for (const line of content.split("\n")) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const eq = trimmed.indexOf("="); - if (eq === -1) continue; - const key = trimmed.slice(0, eq).trim(); - const val = trimmed.slice(eq + 1).trim(); - if (!process.env[key]) process.env[key] = val; - } - } catch {} -} -await loadEnvLocal(); - -const LLM_BASE_URL = process.env.FIX_ZH_BASE_URL ?? process.env.TRANSLATE_CJK_BASE_URL ?? ""; -const LLM_API_KEY = process.env.FIX_ZH_API_KEY ?? process.env.TRANSLATE_CJK_API_KEY ?? process.env.DASHSCOPE_API_KEY ?? ""; -const LLM_MODEL = process.env.FIX_ZH_MODEL ?? "qwen-turbo"; // cheap & fast by default - -// --------------------------------------------------------------------------- -// Dictionary-based fix -// --------------------------------------------------------------------------- - -interface DictFix { - chinese: string; - japanese: string; - category: string; - count: number; -} - -function applyDictFixes(content: string): { output: string; fixes: DictFix[] } { - const dict = getActiveDict(); - const fixes: DictFix[] = []; - let output = content; - - // Don't replace inside code blocks, frontmatter, or import statements - // Strategy: split into "translatable" and "protected" segments - const segments = splitProtected(output); - - for (const [zh, ja, cat] of dict) { - let totalCount = 0; - for (const seg of segments) { - if (seg.protected) continue; - const regex = new RegExp(escapeRegex(zh), "g"); - const matches = seg.text.match(regex); - if (matches) { - totalCount += matches.length; - seg.text = seg.text.replace(regex, ja); - } - } - if (totalCount > 0) { - fixes.push({ chinese: zh, japanese: ja, category: cat, count: totalCount }); - } - } - - output = segments.map((s) => s.text).join(""); - return { output, fixes }; -} - -interface Segment { - text: string; - protected: boolean; -} - -function splitProtected(content: string): Segment[] { - const segments: Segment[] = []; - // Protect: frontmatter, code blocks, inline code, import statements, URLs, JSX tags - const protectedPattern = /(?:^---\n[\s\S]*?\n---|```[\s\S]*?```|`[^`]+`|import\s+.*?from\s+.*?;?\n|https?:\/\/\S+|<[^>]+>)/gm; - - let lastIndex = 0; - let match; - while ((match = protectedPattern.exec(content)) !== null) { - if (match.index > lastIndex) { - segments.push({ text: content.slice(lastIndex, match.index), protected: false }); - } - segments.push({ text: match[0], protected: true }); - lastIndex = match.index + match[0].length; - } - if (lastIndex < content.length) { - segments.push({ text: content.slice(lastIndex), protected: false }); - } - return segments; -} - -function escapeRegex(s: string): string { - return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); -} - -// --------------------------------------------------------------------------- -// LLM-based fix (cheap model scans for unknown Chinese contamination) -// --------------------------------------------------------------------------- - -interface LlmFix { - original: string; - fixed: string; - reason: string; -} - -async function applyLlmFixes(content: string, relPath: string): Promise<{ output: string; fixes: LlmFix[] }> { - // Extract prose-only lines (skip code, frontmatter, imports) - const body = content.replace(/^---\n[\s\S]*?\n---\n?/, ""); - const proseLines = body - .replace(/```[\s\S]*?```/g, "") - .replace(/`[^`]+`/g, "") - .replace(/<[^>]+>/g, "") - .replace(/import\s+.*?from\s+.*?;?\n/g, "") - .split("\n") - .filter((l) => l.trim().length > 5); - - // Find lines that contain CJK but no kana (suspicious) - const suspiciousLines: string[] = []; - for (const line of proseLines) { - const hasCJK = /[\u4e00-\u9fff]/.test(line); - const hasKana = /[\u3040-\u30ff]/.test(line); - if (hasCJK && !hasKana && line.trim().length > 10) { - suspiciousLines.push(line.trim()); - } - } - - if (suspiciousLines.length === 0) { - return { output: content, fixes: [] }; - } - - // Ask a cheap LLM to check and fix - const prompt = `You are a Japanese language expert. Below are lines from a Japanese documentation file that may contain Chinese text contamination (Chinese words or phrases accidentally used instead of Japanese). - -For each line, if it contains Chinese text that should be Japanese, output: -ORIGINAL: -FIXED: -REASON: - -If a line is fine (valid Japanese), skip it. Only output fixes needed. - -Lines to check: -${suspiciousLines.map((l, i) => `${i + 1}. ${l}`).join("\n")}`; - - try { - const response = await fetch(`${LLM_BASE_URL}/chat/completions`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${LLM_API_KEY}`, - }, - body: JSON.stringify({ - model: LLM_MODEL, - messages: [{ role: "user", content: prompt }], - temperature: 0.1, - max_tokens: 2048, - }), - }); - - if (!response.ok) return { output: content, fixes: [] }; - - const data = (await response.json()) as any; - const result = data.choices?.[0]?.message?.content ?? ""; - - // Parse fixes from LLM response - const fixes: LlmFix[] = []; - const fixPattern = /ORIGINAL:\s*(.*?)\nFIXED:\s*(.*?)\nREASON:\s*(.*?)(?:\n|$)/g; - let m; - while ((m = fixPattern.exec(result)) !== null) { - fixes.push({ original: m[1].trim(), fixed: m[2].trim(), reason: m[3].trim() }); - } - - // Apply fixes to content - let output = content; - for (const fix of fixes) { - if (fix.original && fix.fixed && fix.original !== fix.fixed) { - output = output.replace(fix.original, fix.fixed); - } - } - - return { output, fixes }; - } catch { - return { output: content, fixes: [] }; - } -} - -// --------------------------------------------------------------------------- -// File collection -// --------------------------------------------------------------------------- - -async function collectMdx(dir: string): Promise { - const results: string[] = []; - try { - const entries = await readdir(dir, { withFileTypes: true }); - for (const entry of entries) { - const full = join(dir, entry.name); - if (entry.isDirectory()) results.push(...(await collectMdx(full))); - else if (entry.name.endsWith(".mdx")) results.push(full); - } - } catch {} - return results; -} - -// --------------------------------------------------------------------------- -// Main -// --------------------------------------------------------------------------- - -async function main() { - const args = process.argv.slice(2); - const useDict = args.includes("--dict"); - const useLlm = args.includes("--llm"); - const dryRun = args.includes("--dry-run"); - const fileArgs = args.filter((a) => !a.startsWith("--")); - - if (!useDict && !useLlm) { - console.log("Usage: bun fix-zh-leaks.ts --dict [--llm] [--dry-run] [files...]"); - console.log(" --dict Apply static dictionary fixes (free, instant)"); - console.log(" --llm Use cheap LLM to find unknown Chinese leaks"); - console.log(" --dry-run Show changes without writing"); - return; - } - - if (useLlm && !LLM_API_KEY) { - console.error("No API key for LLM mode. Set FIX_ZH_API_KEY or TRANSLATE_CJK_API_KEY."); - process.exit(1); - } - - // Collect files - let files: string[]; - if (fileArgs.length > 0) { - files = fileArgs.map((f) => join(ROOT, f)); - } else { - const jaFiles = await collectMdx(join(ROOT, "ja")); - const snippetFiles = await collectMdx(join(ROOT, "snippets/ja")); - files = [...jaFiles, ...snippetFiles]; - } - - console.log(`Scanning ${files.length} files... (dict=${useDict}, llm=${useLlm})`); - - let totalDictFixes = 0; - let totalLlmFixes = 0; - let filesChanged = 0; - - for (const filePath of files) { - const relPath = relative(ROOT, filePath); - let content = await readFile(filePath, "utf-8"); - let changed = false; - const allFixes: string[] = []; - - // Dict fixes - if (useDict) { - const { output, fixes } = applyDictFixes(content); - if (fixes.length > 0) { - totalDictFixes += fixes.reduce((s, f) => s + f.count, 0); - content = output; - changed = true; - for (const f of fixes) { - allFixes.push(` dict: ${f.chinese} → ${f.japanese} (×${f.count})`); - } - } - } - - // LLM fixes - if (useLlm) { - const { output, fixes } = await applyLlmFixes(content, relPath); - if (fixes.length > 0) { - totalLlmFixes += fixes.length; - content = output; - changed = true; - for (const f of fixes) { - allFixes.push(` llm: ${f.original} → ${f.fixed} (${f.reason})`); - } - } - } - - if (changed) { - filesChanged++; - console.log(`${dryRun ? "[dry-run] " : ""}${relPath}:`); - for (const fix of allFixes) console.log(fix); - - if (!dryRun) { - await writeFile(filePath, content); - } - } - } - - console.log(`\n${dryRun ? "[dry-run] " : ""}Done: ${filesChanged} files, ${totalDictFixes} dict fixes, ${totalLlmFixes} LLM fixes`); -} - -main().catch((err) => { - console.error(err); - process.exit(1); -}); diff --git a/.github/scripts/i18n/glossary.mjs b/.github/scripts/i18n/glossary.mjs new file mode 100644 index 000000000..de17888bb --- /dev/null +++ b/.github/scripts/i18n/glossary.mjs @@ -0,0 +1,150 @@ +/** + * Glossary loading + per-document term selection + prompt injection. + * + * Two layers, both per-language, both committed: + * + * glossary/frontend/{lang}.json Machine mirror of the ComfyUI frontend + * locale terms. Rebuilt wholesale by + * sync-glossary.mjs — never hand-edit. + * Shape: { "en term": "target", ... } + * + * glossary/overrides/{lang}.json Hand-maintained. Takes priority over the + * frontend mirror. This is the place to record + * a term decision or correct/extend the + * frontend (the layer asked for in issue #1124). + * Shape: + * { + * "terms": { "custom node": "target" }, + * "ignore": ["work", "additional"] + * } + * `terms` remap or add a term (wins over frontend) + * `ignore` drop a frontend term from injection + * + * Resolution: start from the frontend mirror, drop everything in `ignore`, then + * apply `terms` (override or add). The result is a Map. + * + * Term selection for a document is whole-word, case-insensitive, capped to the + * top N longest matches so the prompt stays small and specific terms win. + */ + +import { readFileSync } from "fs"; +import { join, dirname } from "path"; +import { fileURLToPath } from "url"; + +const SCRIPT_DIR = dirname(fileURLToPath(import.meta.url)); +export const GLOSSARY_DIR = join(SCRIPT_DIR, "glossary"); +export const FRONTEND_DIR = join(GLOSSARY_DIR, "frontend"); +export const OVERRIDES_DIR = join(GLOSSARY_DIR, "overrides"); + +/** Max terms injected per document (longest-first). Keeps the prompt bounded. */ +const MAX_TERMS_PER_DOC = 40; + +function readJsonOr(path, fallback) { + try { + return JSON.parse(readFileSync(path, "utf-8")); + } catch { + return fallback; + } +} + +/** + * Load the frontend mirror for one language as { enTermLower: target }. + * @param {string} langCode + * @returns {Record} + */ +export function loadFrontendLayer(langCode) { + const raw = readJsonOr(join(FRONTEND_DIR, `${langCode}.json`), {}); + const out = {}; + for (const [k, v] of Object.entries(raw)) { + if (typeof v === "string" && v.trim()) out[k.toLowerCase()] = v; + } + return out; +} + +/** + * Load the hand-maintained override layer for one language. + * @param {string} langCode + * @returns {{ terms: Record, ignore: Set }} + */ +export function loadOverrideLayer(langCode) { + const raw = readJsonOr(join(OVERRIDES_DIR, `${langCode}.json`), {}); + const terms = {}; + for (const [k, v] of Object.entries(raw.terms ?? {})) { + if (typeof v === "string" && v.trim()) terms[k.toLowerCase()] = v; + } + const ignore = new Set((raw.ignore ?? []).map((t) => String(t).toLowerCase())); + return { terms, ignore }; +} + +/** + * Resolve the effective glossary for a language: frontend mirror minus the + * override ignore-list, with override terms applied on top. + * + * @param {string} langCode + * @returns {Map} enTermLower → target + */ +export function loadGlossary(langCode) { + const frontend = loadFrontendLayer(langCode); + const { terms, ignore } = loadOverrideLayer(langCode); + + const map = new Map(); + for (const [k, v] of Object.entries(frontend)) { + if (ignore.has(k)) continue; + map.set(k, v); + } + for (const [k, v] of Object.entries(terms)) { + if (ignore.has(k)) continue; // explicit ignore wins even over a terms entry + map.set(k, v); + } + return map; +} + +const REGEX_SPECIALS = /[.*+?^${}()|[\]\\]/g; + +function escapeRegExp(s) { + return s.replace(REGEX_SPECIALS, "\\$&"); +} + +/** + * Select the glossary terms that actually appear in `enText`. + * Whole-word, case-insensitive; returns the longest matches first, capped. + * + * @param {string} enText + * @param {Map} glossary + * @param {number} [max] + * @returns {{ en: string, t: string }[]} + */ +export function selectGlossaryForText(enText, glossary, max = MAX_TERMS_PER_DOC) { + if (!glossary.size || !enText) return []; + const lower = enText.toLowerCase(); + const hits = []; + for (const [enLower, target] of glossary) { + if (!lower.includes(enLower)) continue; // cheap pre-check before regex + const re = new RegExp(`\\b${escapeRegExp(enLower)}\\b`); + if (re.test(lower)) hits.push({ en: enLower, t: target, _len: enLower.length }); + } + // Longest term first ("custom node" beats "node"); cap to keep prompt small. + hits.sort((a, b) => b._len - a._len); + return hits.slice(0, max).map(({ en, t }) => ({ en, t })); +} + +/** + * Render selected terms as a prompt block. Returns "" when nothing matched. + * Advisory wording so the model keeps natural phrasing when a literal + * substitution would read awkwardly. + * + * @param {{ en: string, t: string }[]} terms + * @param {string} langName + * @returns {string} + */ +export function buildGlossaryPrompt(terms, langName) { + if (!terms.length) return ""; + const lines = terms.map(({ en, t }) => `${en} → ${t}`); + return [ + `=== Preferred ${langName} terminology ===`, + "Use these translations for the listed terms to keep wording consistent across the docs.", + "They are preferred, not mandatory: if a literal substitution would read unnaturally in context, prefer natural phrasing.", + "Match case and grammar to the sentence; the arrow shows the base form only.", + ...lines, + ].join("\n"); +} diff --git a/.github/scripts/i18n/glossary/frontend/ja.json b/.github/scripts/i18n/glossary/frontend/ja.json new file mode 100644 index 000000000..2d70e3909 --- /dev/null +++ b/.github/scripts/i18n/glossary/frontend/ja.json @@ -0,0 +1,2462 @@ +{ + "\"partner nodes\" credit balance": "\"パートナーノード\" クレジット残高", + "(iterative)": "(反復)", + "(linked)": "(リンク済み)", + "(requires page reload)": "(ページの再読み込みが必要)", + "+ upload a cover": "+ カバー画像をアップロード", + "+ upload a profile picture": "+ プロフィール画像をアップロード", + "/ member": "/ メンバー", + "/ month": "USD / 月", + "1 hr": "1時間", + "1 output": "1つの出力", + "20% discount": "20%割引", + "30 min": "30分", + "3d assets / game assets": "3Dアセット/ゲームアセット", + "3d model": "3Dモデル", + "3d model loaded successfully": "3Dモデルが正常に読み込まれました", + "3d viewer": "3Dビューア(ベータ)", + "3d_models": "3Dモデル", + "3dviewer": "3Dビューア", + "a-z": "アルファベット順", + "about": "情報", + "about comfyui": "ComfyUIについて", + "about data collection": "データ収集について", + "about non-whitelisted sites": "ホワイトリストに登録されていないサイトについて", + "accept terms": "利用規約に同意する", + "access required": "アクセス権が必要です", + "account initialized": "アカウントが初期化されました", + "account settings": "アカウント設定", + "action on link release (shift)": "リンクリリース時のアクション(Shift)", + "actions": "アクション", + "activate layer": "レイヤーを有効化", + "active": "アクティブ", + "active jobs": "アクティブジョブ", + "activity": "アクティビティ", + "adaptive projected guidance": "適応的投影ガイダンス", + "add api credits": "APIクレジットを追加", + "add credit card": "クレジットカードを追加", + "add credits": "クレジットを追加", + "add group": "グループを追加", + "add group for selected nodes": "選択したノードのグループを追加", + "add more credits": "クレジットを追加", + "add more credits to run": "実行するためにクレジットを追加", + "add more credits whenever": "いつでもクレジット追加可能", + "add new keybinding": "新しいキーバインドを追加", + "add node": "ノードを追加", + "add node filter condition": "ノードフィルター条件を追加", + "add noise to image": "ImageAddNoise", + "add output examples": "出力例を追加する", + "add secret": "シークレットを追加", + "add subgraph to library": "サブグラフをライブラリに追加", + "add text prefix": "テキストの接頭辞を追加", + "add text suffix": "テキストの接尾辞を追加", + "add to bookmarks": "ブックマークに追加", + "add to current workflow": "現在のワークフローに追加", + "added nodes follow the cursor": "追加されたノードがカーソルに追従", + "additional info": "追加情報", + "additional information": "追加情報", + "additional tags": "追加タグ", + "addnoise": "ノイズを追加", + "adjust audio volume": "オーディオ音量調整", + "adjust brightness": "明るさを調整", + "adjust contrast": "コントラストを調整", + "adjust size": "サイズを調整", + "adjustments": "調整", + "advanced": "高度な機能", + "advanced inputs": "詳細入力", + "after": "後", + "after delay": "遅延後", + "align selected to": "選択項目を揃える", + "alignyourstepsscheduler": "ステップを整列", + "all downloads completed": "すべてのダウンロードが完了しました", + "all exports completed": "すべてのエクスポートが完了しました", + "all extensions": "すべての拡張機能", + "all installed": "すべてインストール済み", + "all keybindings reset to default": "すべてのキーバインドがデフォルトにリセットされました", + "all models": "すべてのモデル", + "all templates": "すべてのテンプレート", + "all up to date": "すべて最新です", + "all workflows": "すべてのワークフロー", + "alpha": "アルファ", + "always shrink new nodes": "新しいノードを常に縮小", + "always snap to grid": "常にグリッドにスナップ", + "amount": "量", + "amount (usd)": "支払金額(USD)", + "amount to pay in dollars": "支払う金額(ドル)", + "an error occurred": "エラーが発生しました", + "an unexpected error occurred": "予期しないエラーが発生しました", + "an unknown error occurred": "不明なエラーが発生しました", + "api endpoints to run workflows": "ワークフロー実行用APIエンドポイント", + "api key": "APIキー", + "api key cleared": "APIキーが削除されました", + "api key stored": "APIキーが保存されました", + "api keys & secrets": "APIキーとシークレット", + "api node(s)": "APIノード", + "api nodes": "APIノード", + "api pricing": "API料金", + "app": "アプリ", + "app builder": "アプリビルダー", + "app builder mode": "アプリビルダーモード", + "app has no outputs": "アプリに出力がありません", + "app mode": "アプリモード", + "app mode in beta": "アプリモード ベータ版 - フィードバックを送る", + "appearance": "外観", + "apply": "適用する", + "apply changes": "変更を適用", + "apply controlnet": "ControlNetを適用(旧)", + "apply controlnet with vae": "VAEでControlNetを適用", + "apply morphology": "画像形態学", + "apply style model": "スタイルモデルを適用", + "apply to whole image": "画像全体に適用", + "apps": "アプリ", + "architecture": "アーキテクチャ", + "area composition": "エリア構成", + "arrange": "配置", + "arrange as grid": "グリッドとして配置", + "arrange horizontally": "横に配置", + "arrange vertically": "縦に配置", + "arrangement spacing": "配置間隔", + "arrow": "矢印", + "asset collection": "アセットコレクション", + "asset deleted successfully": "アセットが正常に削除されました", + "assets": "アセット", + "at least one": "少なくとも1つ", + "attention": "アテンション", + "attention_experiments": "アテンション実験", + "audio": "オーディオ", + "audio / music": "音声/音楽", + "audio equalizer (3-band)": "オーディオイコライザー(3バンド)", + "audio failed to load": "オーディオの読み込みに失敗しました", + "audio progress": "オーディオの進捗", + "audio_encoder": "オーディオエンコーダ", + "audio_encoder_output": "オーディオエンコーダ出力", + "audio_record": "オーディオ録音", + "audioencoderencode": "オーディオエンコーダーエンコード", + "author": "作者", + "auto queue": "自動キュー", + "auto save": "自動保存", + "auto save delay (ms)": "自動保存遅延(ms)", + "auto-pan speed": "自動パン速度", + "automatic updates": "自動更新", + "automatically check for updates": "自動的に更新を確認する", + "automatically load all model folders": "すべてのモデルフォルダーを自動的に読み込む", + "automatically update the value": "値を自動的に更新", + "back to all assets": "すべてのアセットに戻る", + "back to all plans": "すべてのプランに戻る", + "back to login": "ログインに戻る", + "back to workflow": "ワークフローに戻る", + "background": "背景", + "background color": "背景色", + "background removal": "背景除去", + "background_removal": "背景除去", + "banned": "禁止", + "base image layer": "ベース画像レイヤー", + "base layer preview": "ベースレイヤープレビュー", + "base model": "ベースモデル", + "base model unknown": "ベースモデル不明", + "base models": "ベースモデル", + "basic guider": "基本ガイダー", + "basic info": "基本情報", + "basics": "基本", + "basicscheduler": "基本スケジューラー", + "batch": "バッチ", + "batch count": "バッチ数", + "batch count limit": "バッチ数制限", + "batch image": "バッチ画像処理", + "batch images": "画像をバッチ処理", + "batch latents": "latentをバッチ処理", + "batch masks": "マスクをバッチ処理", + "batch rename": "一括リネーム", + "beeble switchx image edit": "Beeble SwitchX 画像編集", + "beeble switchx video edit": "Beeble SwitchX 動画編集", + "before": "前", + "beginner — following tutorials": "使い始め(チュートリアルをフォロー中)", + "beta": "ベータ", + "betasamplingscheduler": "ベータサンプリングスケジューラー", + "billed monthly": "毎月請求", + "black": "黒", + "blend images": "画像ブレンド", + "blue": "青", + "blueprint": "ブループリント", + "blueprints": "ブループリント", + "blur image": "画像ぼかし", + "bookmark": "ブックマーク", + "bookmark node": "お気に入りノード", + "bookmarked": "ブックマーク済み", + "bookmarks": "お気に入り", + "boolean": "ブール", + "bottom": "下", + "bottom panel": "下部パネル", + "bounding box": "バウンディングボックス", + "bounding_box": "バウンディングボックス", + "box": "ボックス", + "bria fibo image edit": "Bria画像編集", + "bria remove image background": "Bria 画像背景除去", + "bria remove video background": "Bria 動画背景除去", + "bria remove video background (transparent)": "Bria 動画背景除去(透明)", + "bria video green screen": "Bria ビデオグリーンスクリーン", + "briefcase": "ブリーフケース", + "brown": "ブラウン", + "browse": "ブラウズ", + "browse assets": "アセットを閲覧", + "browse example templates": "サンプルテンプレートを表示", + "browse files": "ファイルを選択", + "browse templates": "テンプレートを参照", + "brush": "ブラシ", + "brush adjustment": "ブラシ調整", + "brush adjustment speed multiplier": "ブラシ調整速度の倍率", + "brush settings": "ブラシ設定", + "brush shape": "ブラシ形状", + "build an app": "アプリを作成", + "build app": "アプリビルダーに入る", + "buy": "購入", + "buy now": "今すぐ購入", + "bypass": "バイパス", + "bypass group nodes": "グループノードをバイパス", + "bypass/unbypass selected nodes": "選択したノードのバイパス/バイパス解除", + "bytedance create image asset": "ByteDance 画像アセット作成", + "bytedance create video asset": "ByteDance 動画アセット作成", + "bytedance first-last-frame to video": "ByteDance 最初-最後フレームから動画生成", + "bytedance image": "ByteDance画像", + "bytedance reference images to video": "ByteDance参照画像から動画生成", + "bytedance text to video": "ByteDance テキストから動画へ", + "cache": "キャッシュ", + "calculating dimensions": "寸法を計算中", + "camera": "カメラ", + "camera settings": "カメラ設定", + "camera type": "カメラタイプ", + "camera_control": "カメラコントロール", + "cancel": "キャンセル", + "cancel all running jobs": "実行中のすべてのジョブをキャンセル", + "cancel current run": "現在の実行を中止", + "cancel download": "ダウンロードをキャンセル", + "cancel job": "ジョブをキャンセル", + "cancel selection": "選択をキャンセル", + "cancel subscription": "サブスクリプションをキャンセル", + "cancel this run": "この実行をキャンセル", + "canceled": "キャンセル済み", + "cancelled": "キャンセル済み", + "cannot create subgraph": "サブグラフを作成できません", + "cannot delete installed blueprints": "インストール済みのブループリントは削除できません", + "canny to image": "Cannyから画像へ", + "canny to video": "Cannyから動画へ", + "canvas": "キャンバス", + "canvas background image": "キャンバス背景画像", + "canvas mode": "キャンバスモード", + "canvas navigation": "キャンバスナビゲーション", + "canvas performance": "キャンバスのパフォーマンス", + "canvas toggle link visibility": "キャンバスのリンク表示を切り替える", + "canvas toggle lock": "キャンバスのロックを切り替え", + "canvas toggle minimap": "キャンバス ミニマップ切り替え", + "canvas toolbar": "キャンバスツールバー", + "canvas zoom speed": "キャンバスズーム速度", + "capture": "キャプチャ", + "card": "カード", + "categories": "カテゴリ", + "categorized": "元の順序", + "category": "カテゴリ", + "center camera on model": "モデルにカメラを中央揃え", + "cfg guider": "CFGガイダー", + "cfg override": "CFG 上書き", + "cfgnorm": "CFG正規化", + "change hdri": "HDRIを変更", + "change keybinding": "キーバインドを変更", + "chart": "チャート", + "check for custom node updates": "カスタムノードのアップデートを確認", + "check for updates": "アップデートを確認", + "checking media visibility…": "メディアの公開状況を確認中…", + "checkpoints": "チェックポイント", + "choose a profile picture": "プロフィール画像を選択", + "choose download servers manually": "ダウンロードサーバーを手動で選択", + "choose file to upload": "アップロードするファイルを選択", + "choose inputs": "入力を選択", + "choose installation location": "インストール先を選択", + "choose outputs": "出力を選択", + "choose where to install comfyui": "ComfyUIのインストール場所を選択", + "choose your hardware setup": "ハードウェア構成を選択", + "chromaradianceoptions": "ChromaRadianceオプション", + "circle": "サークル", + "clear": "クリア", + "clear all": "すべてクリア", + "clear filters": "フィルターをクリア", + "clear job history": "ジョブキュー履歴をクリア", + "clear pending tasks": "保留中のタスクをクリア", + "clear queue": "キューをクリア", + "clear queued": "キュー済みをクリア", + "clear recording": "録画をクリア", + "clear url": "URLをクリア", + "clear workflow": "ワークフローをクリア", + "click": "クリック", + "click to browse or": "クリックして選択 または", + "click to clear queue": "クリックしてキューをクリア", + "click to learn more →": "詳しくはこちらをクリック →", + "click to reset zoom": "クリックしてズームをリセット", + "clip": "クリップ", + "clip set last layer": "CLIPの最終層を設定", + "clip text encode (prompt)": "CLIPテキストエンコード(プロンプト)", + "clip vision encode": "CLIPビジョンエンコード", + "clipattentionmultiply": "CLIP注意の乗算", + "clipmergeadd": "CLIPマージ追加", + "clipmergesimple": "CLIPマージシンプル", + "clipmergesubtract": "CLIPマージ減算", + "clipsave": "CLIPを保存", + "clipspace": "クリップスペース", + "cliptextencodecontrolnet": "CLIPテキストエンコードコントロールネット", + "cliptextencodeflux": "CLIPテキストエンコードフラックス", + "cliptextencodehunyuandit": "CLIPテキストエンコードフンユアンDiT", + "cliptextencodesd3": "CLIPテキストエンコードSD3", + "cliptextencodesdxl": "CLIPテキストエンコードSDXL", + "cliptextencodesdxlrefiner": "CLIPテキストエンコードSDXLリファイナー", + "clone": "クローン", + "close anyway": "とにかく閉じる", + "close current workflow": "現在のワークフローを閉じる", + "close dialog": "ダイアログを閉じる", + "close other tabs": "他のタブを閉じる", + "close tab": "タブを閉じる", + "close tabs to left": "左のタブを閉じる", + "close tabs to right": "右のタブを閉じる", + "cloud": "クラウド", + "cloud survey": "クラウドアンケート", + "collapse": "折りたたむ", + "collapse all": "すべて折りたたむ", + "collapse/expand selected nodes": "選択したノードの折りたたみ/展開", + "color": "色", + "color palette": "カラーパレット", + "color picker": "カラーピッカー", + "color saturation and brightness": "色の彩度と明度", + "color select settings": "色選択設定", + "color selector": "カラーピッカー", + "colors": "色", + "combine": "結合", + "combine hooks [2]": "フックを組み合わせる [2]", + "combine hooks [4]": "フックを組み合わせる [4]", + "combine hooks [8]": "フックを組み合わせる [8]", + "combine masks": "マスク合成", + "combo": "コンボ", + "comfy api key": "Comfy APIキー", + "comfy blueprints": "Comfyブループリント", + "comfy cloud logo": "Comfy Cloud ロゴ", + "comfy nodes": "Comfyノード", + "comfy-desktop": "Comfyデスクトップ", + "comfyorg logo": "ComfyOrgロゴ", + "comfyui docs": "ComfyUIのドキュメント", + "comfyui examples": "ComfyUIの例", + "comfyui forum": "ComfyUI フォーラム", + "comfyui issues": "ComfyUIの問題", + "comfyui logo": "ComfyUIロゴ", + "comfyui-manager upgrade required": "ComfyUI-Manager のアップグレードが必要です", + "coming soon": "近日公開", + "command": "コマンド", + "community": "コミュニティ", + "compare images": "画像比較", + "compare text": "比較", + "compatible alternatives": "互換性のある代替案", + "compatible base models": "互換性のあるベースモデル", + "completed": "完了", + "completed ✓": "完了 ✓", + "compositing": "合成", + "compute hours used": "使用計算時間", + "compute hours used (most first)": "使用計算時間(多い順)", + "concatenate audio": "オーディオ連結", + "concatenate text": "連結", + "cond pair": "条件ペア", + "cond pair combine": "ペア条件付け組み合わせ", + "cond pair set default combine": "ペア条件付けデフォルト組み合わせを設定", + "cond pair set props": "ペア条件付けプロパティ設定", + "cond pair set props combine": "ペア条件付けプロパティ設定と組み合わせ", + "cond set default combine": "条件付けデフォルト組み合わせを設定", + "cond set props": "条件付けプロパティ設定", + "cond set props combine": "条件付けプロパティ設定と組み合わせ", + "cond single": "条件単体", + "conditioning": "条件付け", + "conditioning (combine)": "条件付け(組み合わせ)", + "conditioning (concat)": "条件付け(連結)", + "conditioning (set area with percentage)": "条件付け(パーセンテージでエリア設定)", + "conditioning (set area)": "条件付け(エリア設定)", + "conditioning (set mask)": "条件付け(マスク設定)", + "conditioningaverage": "条件付け平均", + "conditioningsetareapercentagevideo": "ビデオの条件設定エリアのパーセンテージ", + "conditioningsetareastrength": "条件付けエリア強度", + "conditioningsettimesteprange": "条件付けタイムステップ範囲", + "conditioningzeroout": "条件付けゼロアウト", + "conference or event": "カンファレンスやイベント", + "confirm": "確認", + "confirm model details": "モデル詳細を確認", + "confirm password": "パスワードの確認", + "confirm selection": "選択を確定", + "confirm your payment": "お支払いを確認", + "confirm your plan change": "プラン変更を確認", + "confirmed": "確認済み", + "conflicting": "競合", + "conflicts": "競合", + "connect an output": "出力を接続", + "connected": "接続", + "connection links": "接続リンク", + "connection taking too long": "接続に時間がかかっています", + "console": "コンソール", + "console logs": "コンソールログ", + "contact our support": "サポートに連絡", + "contact support": "サポートに連絡", + "contact us": "お問い合わせ", + "contains text": "含む", + "content": "コンテンツ", + "content blocked": "コンテンツがブロックされました", + "context menu": "コンテキストメニュー", + "context windows (manual)": "コンテキストウィンドウ(手動)", + "continue": "続ける", + "continue locally": "ローカルで続行", + "continue to payment": "支払いに進む", + "control after generate": "生成後の制御", + "control before generate": "生成前の制御", + "control_net": "コントロールネット", + "controlnet": "コントロールネット", + "controlnetinpaintingalimamaapply": "ControlNetインペインティングAliMamaを適用", + "convert image color to mask": "画像色をマスクに変換", + "convert image to mask": "画像をマスクに変換", + "convert mask to image": "マスクを画像に変換", + "convert number": "数値変換", + "convert selection to subgraph": "選択範囲をサブグラフに変換", + "convert text case": "ケースコンバーター", + "convert text to lowercase": "テキストを小文字に変換", + "convert text to uppercase": "テキストを大文字に変換", + "convert to subgraph": "サブグラフに変換", + "converted to app workflow": "アプリワークフローに変換されました", + "copied": "コピーしました", + "copied to clipboard": "クリップボードにコピーしました", + "copy": "コピー", + "copy (clipspace)": "コピー (Clipspace)", + "copy all": "すべてコピー", + "copy error": "コピーエラー", + "copy error message": "エラーメッセージをコピー", + "copy image": "画像をコピー", + "copy invite link": "招待リンクをコピー", + "copy job id": "ジョブIDをコピー", + "copy link": "リンクをコピー", + "copy model name": "モデル名をコピー", + "copy selection": "選択範囲をコピー", + "copy system info": "システム情報をコピー", + "copy to clipboard": "クリップボードにコピー", + "copy url": "URLをコピー", + "cost per run": "実行あたりのコスト", + "could not determine file type": "ファイルタイプを判断できませんでした", + "couldn't continue oauth sign-in": "OAuthサインインを続行できませんでした", + "cpu mode": "CPUモード", + "create": "作成", + "create 3d file (from splat)": "3Dファイルを作成(スプラットから)", + "create a link": "リンクを作成", + "create a new blank workflow": "新しい空のワークフローを作成", + "create a new workspace": "新しいワークスペースを作成", + "create a profile": "プロフィールを作成", + "create an account": "アカウントを作成する", + "create camera info": "カメラ情報の作成", + "create group node": "グループノードを作成", + "create hook keyframe": "フックキーフレームを作成", + "create hook keyframes from floats": "フックキーフレームを浮動小数点から作成", + "create hook lora": "フックLoRAを作成", + "create hook lora (mo)": "フックLoRA(モデルのみ)", + "create hook model as lora": "フックモデルをLoRAとして作成", + "create link": "リンクを作成", + "create list": "リストを作成", + "create my profile": "プロフィールを作成する", + "create new workspace": "新しいワークスペースを作成", + "create profile": "プロフィールを作成", + "create solid mask": "ソリッドマスク", + "create video": "動画を作成", + "create workspace": "ワークスペースを作成", + "create your comfy hub profile": "Comfy Hubプロフィールを作成", + "create your profile on comfyhub": "ComfyHubのプロフィールを作成", + "created by": "作成者", + "creator": "クリエイター", + "credits": "クレジット", + "credits added successfully": "クレジットが正常に追加されました", + "credits available": "利用可能なクレジット", + "credits have been unified": "クレジットが統合されました", + "credits per dollar": "1ドルあたりのクレジット数", + "credits to receive": "受け取るクレジット数", + "crop by bounding boxes": "CropByBBoxes", + "crop image": "画像を切り抜く", + "crop image (center)": "中央で画像を切り抜き", + "crop image (random)": "ランダムクロップ画像", + "crop latent": "潜在トリミング", + "crop mask": "マスクをトリミング", + "crop preview": "切り抜きプレビュー", + "cross attention method": "クロスアテンションメソッド", + "ctrl+up/down precision": "Ctrl+上/下の精度", + "cuda device index to use": "使用するCUDAデバイスインデックス", + "current plan": "現在のプラン", + "current user": "現在のユーザー", + "current workflow": "現在のワークフロー", + "cursor size": "カーソルサイズ", + "curve": "カーブ", + "curve editor": "カーブエディター", + "custom": "カスタム", + "custom background": "カスタム背景", + "custom color palettes": "カスタムカラーパレット", + "custom combo": "カスタムコンボ", + "custom node configurations": "カスタムノードの設定", + "custom nodes": "カスタムノード", + "custom nodes manager": "カスタムノードマネージャー", + "custom workflows or pipelines": "カスタムワークフローやパイプライン", + "custom_sampling": "カスタムサンプリング", + "customize": "カスタマイズ", + "customize folder": "フォルダーをカスタマイズ", + "cyan": "シアン", + "dark": "ダーク", + "dashboard": "ダッシュボード", + "dashboard workspace settings": "ダッシュボードのワークスペース設定", + "debug": "デバッグ", + "decoding…": "デコード中…", + "decrease brush size in maskeditor": "マスクエディタでブラシサイズを小さくする", + "decrement": "減少", + "decrement value": "値を減少", + "deduplicate images": "画像の重複排除", + "deduplicate subgraph node ids": "サブグラフノードIDの重複排除", + "default banner": "デフォルトバナー", + "default pip install mirror": "デフォルトの pip インストールミラー", + "default preset": "デフォルトプリセット", + "delete": "削除", + "delete all": "すべて削除", + "delete asset": "アセットを削除", + "delete audio file": "オーディオファイルを削除", + "delete blueprint": "ブループリントを削除", + "delete failed": "削除に失敗しました", + "delete image": "画像を削除", + "delete preset": "プリセットを削除", + "delete secret": "シークレットの削除", + "delete selected items": "選択したアイテムを削除", + "delete workflow": "ワークフローを削除", + "delete workspace": "ワークスペースを削除", + "deleted": "削除済み", + "dependencies": "依存関係", + "depr": "非推奨", + "deprecated": "非推奨", + "depth": "深度", + "depth to image": "深度から画像へ", + "depth to video": "深度から動画へ", + "describe your workflow": "ワークフローを説明する", + "description": "説明", + "description is required": "説明が必要です", + "deselect all": "すべて選択解除", + "desktop app settings": "デスクトップアプリの設定", + "desktop settings": "デスクトップ設定", + "desktop user guide": "デスクトップユーザーガイド", + "details": "詳細", + "detect edges (canny)": "キャニー", + "detect face landmarks (mediapipe)": "MediaPipe Face Landmarker", + "detected": "検出されました", + "detection": "検出", + "dev mode": "開発モード", + "devices": "デバイス", + "differential diffusion": "差分拡散", + "diffusersloader": "ディフューザーを読み込む", + "directml device index": "DirectMLデバイスインデックス", + "directories": "ディレクトリ", + "disable animations": "アニメーションを無効化", + "disable ipex optimization": "IPEX最適化を無効にする", + "disable node widget sliders": "ノードウィジェットスライダーを無効にする", + "disable selected": "選択したものを無効化", + "disable smart memory management": "スマートメモリ管理を無効にする", + "disable third-party": "サードパーティを無効化", + "disable xformers optimization": "xFormers最適化を無効にする", + "disablenoise": "ノイズを無効にする", + "discard and switch": "破棄して切り替え", + "disconnected": "切断されました", + "discord / community": "Discord/コミュニティ", + "dismiss": "閉じる", + "display name": "表示名", + "distribute nodes": "ノードを分布", + "dock to top": "上部にドッキング", + "docked job history": "ドックされたジョブ履歴", + "docked job history/queue panel": "アセットサイドパネルで統一ジョブキューを使用", + "docs": "ドキュメント", + "documentation page": "ドキュメントページ", + "does not apply to litegraph": "デフォルトの実装にのみ適用されます", + "don't ask again": "今後表示しない", + "don't show again": "今後表示しない", + "don't show this again": "再度表示しない", + "double click interval (maximum)": "ダブルクリック間隔(最大)", + "download": "ダウンロード", + "download all": "すべてダウンロード", + "download audio": "オーディオをダウンロード", + "download available": "ダウンロード可能", + "download comfyui": "ComfyUIをダウンロード", + "download complete": "ダウンロード完了", + "download export": "エクスポートをダウンロード", + "download failed": "ダウンロードに失敗しました", + "download git": "Gitをダウンロード", + "download image": "画像をダウンロード", + "download started": "ダウンロード開始", + "download video": "ビデオをダウンロード", + "downloading": "ダウンロード中", + "downloads": "ダウンロード", + "drag navigation": "ドラッグナビゲーション", + "draw bboxes": "バウンディングボックスを描画", + "draw face mask (mediapipe)": "MediaPipe Face Mask", + "drop 3d model to load": "3Dモデルをドロップして読み込み", + "drop a video here": "ここに動画をドロップ", + "drop an image here": "ここに画像をドロップ", + "drop your file or": "ファイルをドロップするか", + "dual cfg guider": "デュアルCFGガイダー", + "dual model cfg guider": "デュアルモデル CFG ガイダー", + "dualcliploader": "デュアルCLIPを読み込む", + "duplicate": "複製", + "duplicate current workflow": "現在のワークフローを複製", + "duplicate tab": "タブを複製", + "each month credits refill to": "毎月クレジットが補充されます", + "edge threshold": "エッジしきい値", + "edit & run": "編集と実行", + "edit app": "アプリを編集", + "edit control settings": "制御設定を編集", + "edit display name": "表示名を編集", + "edit image": "画像を編集", + "edit model reference method": "FluxKontextMultiReferenceLatentMethod", + "edit or mask image": "画像を編集またはマスク", + "edit secret": "シークレットを編集", + "edit subgraph": "サブグラフを編集", + "edit subgraph widgets": "サブグラフウィジェットを編集", + "edit token weight": "トークンの重みを編集", + "edit workspace details": "ワークスペースの詳細を編集", + "edit_models": "モデル編集", + "education (student or educator)": "教育(学生または教育者)", + "elevenlabs instant voice clone": "ElevenLabs インスタントボイスクローン", + "elevenlabs speech to speech": "ElevenLabs スピーチ・トゥ・スピーチ", + "elevenlabs speech to text": "ElevenLabs 音声からテキストへ", + "elevenlabs text to dialogue": "ElevenLabs テキストから対話へ", + "elevenlabs text to sound effects": "ElevenLabs テキストから効果音へ", + "elevenlabs text to speech": "ElevenLabs テキスト読み上げ", + "elevenlabs voice isolation": "ElevenLabs ボイスアイソレーション", + "elevenlabs voice selector": "ElevenLabs ボイスセレクター", + "eligible for free tier": "無料プラン対象", + "email": "メール", + "email is required": "メールアドレスは必須です", + "empty": "空", + "empty audio": "空のオーディオ", + "empty canvas": "キャンバスが空です", + "empty hidream-o1 latent image": "Empty HiDream-O1 潜在画像", + "empty image": "空の画像", + "empty latent audio": "空の潜在音声", + "empty latent image": "空の潜在画像", + "emptyltxvlatentvideo": "空のLTXV潜在ビデオ", + "emptymochilatentvideo": "空のMochi潜在ビデオ", + "emptysd3latentimage": "空のSD3潜在画像", + "enable 3d viewer": "3Dビューアーを有効化(ベータ)", + "enable anyway": "それでも有効化", + "enable cpu mode": "CPUモードを有効にする", + "enable node replacement suggestions": "自動ノード置換を有効にする", + "enable or disable pack": "パックを有効/無効にする", + "enable selected": "選択したものを有効化", + "enable tooltips": "ツールチップを有効にする", + "encoding…": "エンコード中…", + "end of billing period": "請求期間の終了", + "enter": "入力", + "enter a description": "説明を入力してください", + "enter a username": "ユーザー名を入力してください", + "enter app mode": "アプリモードに入る", + "enter base name": "ベース名を入力", + "enter name": "名前を入力", + "enter new name": "新しい名前を入力", + "enter new password": "新しいパスワードを入力してください", + "enter new value to change": "変更する場合は新しい値を入力", + "enter node graph": "ノードグラフに入る", + "enter pypi mirror url": "PyPIミラーURLを入力してください", + "enter python mirror url": "PythonミラーURLを入力してください", + "enter search aliases (comma separated)": "検索用エイリアスを入力(カンマ区切り)", + "enter subgraph": "サブグラフに入る", + "enter the filename": "ファイル名を入力", + "enter the person's email": "招待する人のメールアドレスを入力", + "enter the same password again": "もう一度同じパスワードを入力してください", + "enter workspace name": "ワークスペース名を入力", + "enter your api key": "APIキーを入力してください", + "enter your email": "メールアドレスを入力してください", + "enter your keybind": "キーバインドを入力してください", + "enter your name here": "ここにお名前を入力してください", + "enter your password": "パスワードを入力してください", + "eraser": "消しゴム", + "error": "エラー", + "error checking for updates": "アップデートの確認中にエラーが発生しました", + "error installing update": "アップデートのインストール中にエラーが発生しました", + "error loading image": "画像の読み込みエラー", + "error loading model": "モデルの読み込みエラー", + "error loading video": "ビデオの読み込みエラー", + "error log": "エラーログ", + "error logs": "エラーログ", + "error message": "エラーメッセージ", + "error message and stack trace": "エラーメッセージとスタックトレース", + "error system": "エラーシステム", + "error updating consent": "同意の更新エラー", + "errors": "エラー", + "essential": "必須", + "essentials": "必須", + "estimated to finish in": "終了予想時間", + "estimated to start in": "開始予想時間", + "event type": "イベントタイプ", + "execute": "実行", + "execution": "実行", + "execution failed": "実行に失敗しました", + "execution has been interrupted": "実行が中断されました", + "existing user": "既存のユーザー", + "exit app builder": "アプリビルダーを終了", + "exit app mode": "アプリモードを終了", + "exit builder": "ビルダーを終了", + "exit subgraph": "サブグラフを終了", + "expand": "展開", + "expand all": "すべて展開", + "expand job queue": "ジョブキューを展開", + "expand node": "ノードを展開", + "experimental": "実験的", + "expert — i help others": "エキスパート(他者を支援)", + "expiry date": "有効期限", + "exponentialscheduler": "指数スケジューラー", + "export": "エクスポート", + "export (api)": "エクスポート (API)", + "export all workflows": "すべてのワークフローをエクスポート", + "export failed": "エクスポートに失敗しました", + "export model": "モデルをエクスポート", + "export preset": "プリセットをエクスポート", + "export recording": "録画をエクスポート", + "export settings": "エクスポート設定", + "export workflow": "ワークフローをエクスポート", + "export workflow (api format)": "ワークフローをエクスポート(API形式)", + "exporting assets": "アセットをエクスポート中", + "extension": "拡張", + "extension at risk": "リスクのある拡張機能", + "extension name": "拡張機能名", + "extensions": "拡張機能", + "extract and save lora": "LoRAを抽出して保存", + "extract frame": "フレームを抽出", + "extract mesh from splat": "スプラットからメッシュを抽出", + "extract text": "正規表現抽出", + "extract text from json": "JSONから文字列を抽出", + "face_detection_model": "顔検出モデル", + "failed": "失敗", + "failed after": "失敗までの時間", + "failed to accept invite": "招待の承諾に失敗しました", + "failed to apply texture": "テクスチャの適用に失敗しました", + "failed to cancel subscription": "サブスクリプションのキャンセルに失敗しました", + "failed to copy job id": "ジョブIDのコピーに失敗しました", + "failed to copy link": "コピーに失敗しました", + "failed to copy to clipboard": "クリップボードへのコピーに失敗しました", + "failed to create node": "ノードの作成に失敗しました", + "failed to create workspace": "ワークスペースの作成に失敗しました", + "failed to create zip export": "ZIPエクスポートの作成に失敗しました", + "failed to delete asset": "アセットの削除に失敗しました", + "failed to delete selected assets": "選択したアセットの削除に失敗しました", + "failed to delete workspace": "ワークスペースの削除に失敗しました", + "failed to download file": "ファイルのダウンロードに失敗しました", + "failed to download image": "画像のダウンロードに失敗しました", + "failed to download video": "ビデオのダウンロードに失敗しました", + "failed to export workflow": "ワークフローのエクスポートに失敗しました", + "failed to fetch server logs": "サーバーログの取得に失敗しました", + "failed to import workflow assets": "ワークフローアセットのインポートに失敗しました", + "failed to initialize 3d viewer": "3Dビューアの初期化に失敗しました", + "failed to install": "インストールに失敗しました", + "failed to leave workspace": "ワークスペースの退出に失敗しました", + "failed to load 3d model": "3Dモデルの読み込みに失敗しました", + "failed to load background image": "背景画像の読み込みに失敗しました", + "failed to load hdri file": "HDRIファイルの読み込みに失敗しました", + "failed to load outputs": "出力の読み込みに失敗しました", + "failed to load shared workflow": "共有ワークフローの読み込みに失敗しました", + "failed to load subgraph blueprints": "サブグラフの読み込みに失敗しました", + "failed to load workspaces": "ワークスペースの読み込みに失敗しました", + "failed to open workflow": "ワークフローのオープンに失敗しました", + "failed to queue": "キューに追加できませんでした", + "failed to remove member": "メンバーの削除に失敗しました", + "failed to replace nodes": "ノードの置き換えに失敗しました", + "failed to save workflow draft": "ワークフロードラフトの保存に失敗しました", + "failed to select directory": "ディレクトリの選択に失敗しました", + "failed to set gizmo mode": "ギズモモードの設定に失敗しました", + "failed to store api key": "APIキーの保存に失敗しました", + "failed to switch workspace": "ワークスペースの切り替えに失敗しました", + "failed to toggle camera": "カメラの切り替えに失敗しました", + "failed to toggle gizmo": "ギズモの切り替えに失敗しました", + "failed to toggle grid": "グリッドの切り替えに失敗しました", + "failed to update background color": "背景色の更新に失敗しました", + "failed to update background image": "背景画像の更新に失敗しました", + "failed to update edge threshold": "エッジしきい値の更新に失敗しました", + "failed to update light intensity": "光の強度の更新に失敗しました", + "failed to update material mode": "マテリアルモードの更新に失敗しました", + "failed to update node definitions": "ノード定義の更新に失敗しました", + "failed to update up direction": "上方向の更新に失敗しました", + "failed to update workspace": "ワークスペースの更新に失敗しました", + "failed to upload background image": "背景画像のアップロードに失敗しました", + "failed to validate path": "パスの検証に失敗しました", + "faqs": "よくある質問", + "favorite": "お気に入りに追加", + "favorite widget": "ウィジェットをお気に入りに追加", + "favorited inputs": "お気に入り入力", + "favorites": "お気に入り", + "feather mask": "フェザー マスク", + "feedback": "フィードバック", + "file": "ファイル", + "file formats": "ファイル形式", + "file name": "ファイル名", + "file size": "ファイルサイズ", + "file system information": "ファイルシステム情報", + "file upload failed": "ファイルのアップロードに失敗しました", + "filename": "ファイル名", + "fill opacity": "塗りつぶし不透明度", + "filter": "フィルタ", + "filter by": "フィルター条件", + "filter jobs": "ジョブをフィルター", + "filters": "フィルター", + "find issues": "問題を見つける", + "find on github": "GitHubで探す", + "finish": "完了", + "finish publishing": "公開を完了する", + "finished": "完了", + "fit group to contents": "グループを内容に合わせる", + "fit to viewer": "ビューアに合わせる", + "fit view": "ビューに合わせる", + "fit view to selected nodes": "選択したノードにビューを合わせる", + "fixed value": "固定値", + "flagged": "フラグ付き", + "flashvsr video upscale": "FlashVSRビデオ高解像度化", + "flip image": "画像反転", + "flip latent": "潜在反転", + "flipsigmas": "シグマを反転", + "float": "浮動小数点", + "floating": "フローティング", + "floats": "浮動小数点数", + "flux erase image": "Flux 消去画像", + "flux kv cache": "Flux KVキャッシュ", + "flux virtual try-on": "Flux バーチャル試着", + "fluxguidance": "フラックスガイダンス", + "focus mode": "フォーカスモード", + "folder": "フォルダー", + "for more help, visit the": "さらに詳しい情報は、", + "for running commercial/proprietary models": "商用/独自モデルの実行用", + "force attention upcast": "アテンションのアップキャストを強制する", + "force channels-last memory format": "チャネルを最後に強制するメモリ形式", + "forgot password": "パスワードを忘れた場合", + "format text": "テキスト整形", + "founder's edition": "ファウンダーエディション", + "frame interpolate": "フレーム補間", + "frame nodes": "ノードをフレーム化", + "free": "無料", + "friend or colleague": "友人または同僚", + "fullscreen": "全画面表示", + "gallery": "ギャラリー", + "gallery image": "ギャラリー画像", + "gallery thumbnail": "ギャラリーサムネイル", + "gemini input files": "Gemini入力ファイル", + "gemini_input_files": "GEMINI入力ファイル", + "general": "一般", + "generate ltx2 prompt": "TextGenerateLTX2Prompt", + "generate text": "TextGenerate", + "generated": "生成済み", + "generated assets": "生成されたアセット", + "generated on": "生成日時", + "generating video…": "ビデオ生成中…", + "generating…": "生成中…", + "generation failed": "生成に失敗しました", + "generation stalled": "生成が停止しました", + "generation timed out": "生成がタイムアウトしました", + "generation type": "生成タイプ", + "geometry estimation": "ジオメトリ推定", + "get ic-lora parameters": "IC-LoRAパラメータの取得", + "get image from batch": "バッチから画像を取得", + "get image size": "画像サイズ取得", + "get one here": "こちらから取得", + "get splat": "スプラット取得", + "get splat count": "スプラット数を取得", + "get started": "はじめる", + "get started with a template": "テンプレートを利用して開始", + "get video components": "ビデオコンポーネントの取得", + "getting started": "はじめに", + "gitsscheduler": "GITSスケジューラー", + "give feedback": "フィードバックを送信", + "gizmo": "ギズモ", + "gligen": "グライジェン", + "gligentextboxapply": "GLIGENテキストボックスを適用", + "global floating point precision": "グローバル浮動小数点精度", + "global settings": "グローバル設定", + "global value": "グローバル値", + "glsl shader": "GLSLシェーダー", + "go to node": "ノードに移動", + "google / search": "Google/検索", + "google veo 2 video generation": "Google Veo2 ビデオ生成", + "google veo 3 video generation": "Google Veo 3 ビデオ生成", + "graph": "グラフ", + "graph mode": "グラフモード", + "graph navigation": "グラフナビゲーション", + "green": "緑", + "grid spacing": "グリッド間隔", + "grid view": "グリッド表示", + "grok image": "Grok画像生成", + "grok image edit": "Grok画像編集", + "grok reference-to-video": "Grokリファレンス→ビデオ", + "grok video": "Grok動画生成", + "grok video edit": "Grok動画編集", + "grok video extend": "Grokビデオ拡張", + "group": "グループ", + "group by": "グループ化", + "group by module source": "モジュールソースでグループ化", + "group by node category": "ノードカテゴリでグループ化", + "group selected nodes": "選択したノードをグループ化", + "group selected nodes padding": "選択したノードのパディング", + "group settings": "グループ設定", + "groups": "グループ", + "grow mask": "マスクを拡大", + "guidance": "ガイダンス", + "guider": "ガイダー", + "guiders": "ガイダー", + "hand": "パンビュー", + "happyhorse image to video": "HappyHorse 画像から動画へ", + "happyhorse reference to video": "HappyHorse 参照から動画へ", + "happyhorse text to video": "HappyHorse テキストから動画へ", + "happyhorse video edit": "HappyHorse 動画編集", + "hardness": "硬さ", + "hdri environment": "HDRI環境", + "heart": "ハート", + "height": "高さ", + "help & support": "ヘルプ&サポート", + "help center": "ヘルプセンター", + "help center menu": "ヘルプセンターメニュー", + "help fix this": "これを修正するのを助ける", + "help us improve": "改善にご協力ください", + "hidden": "隠す", + "hidden / nested parameters": "非表示/ネストされたパラメータ", + "hide advanced": "詳細を非表示", + "hide advanced inputs": "詳細入力を非表示", + "hide built-in": "組み込みを隠す", + "hide deprecated nodes": "非推奨ノードを非表示", + "hide dev-only nodes": "開発者専用ノードを非表示", + "hide experimental nodes": "実験的ノードを非表示", + "hide features": "機能を隠す", + "hide input": "入力を非表示", + "hide left panel": "左パネルを非表示", + "hide links": "リンクを非表示", + "hide menu": "メニューを隠す", + "hide minimap": "ミニマップを非表示", + "hide referencing nodes": "参照ノードを非表示", + "hide right panel": "右パネルを非表示", + "hide subgraph nodes": "サブグラフノードを一時的に非表示", + "hidream-o1 patch seam smoothing": "HiDream-O1 パッチ継ぎ目スムージング", + "hidream-o1 reference images": "HiDream-O1 参照画像", + "histogram": "ヒストグラム", + "hitpaw general image enhance": "HitPaw 一般画像強化", + "hitpaw video enhance": "HitPaw 動画強化", + "hook_keyframes": "フックキーフレーム", + "hooks": "フック", + "horizontal": "水平", + "hue": "色相", + "hunyuan latent refiner": "HunyuanRefinerLatent", + "hypertile": "ハイパータイル", + "icon": "アイコン", + "ideogram 4 scheduler": "Ideogram 4 スケジューラー", + "image": "画像", + "image api": "画像API", + "image compare": "画像比較", + "image comparison": "画像比較", + "image composite masked": "マスクされた画像合成", + "image does not exist": "画像が存在しません", + "image failed to load": "画像の読み込みに失敗しました", + "image gallery": "画像ギャラリー", + "image histogram": "画像ヒストグラム", + "image layer": "画像レイヤー", + "image not loaded": "画像が読み込まれていません", + "image preview": "画像プレビュー", + "image rgb to yuv": "ImageRGBToYUV", + "image to 3d model": "画像から3Dモデル", + "image to image": "画像から画像へ", + "image to video": "画像から動画へ", + "image url": "画像URL", + "image yuv to rgb": "ImageYUVToRGB", + "imagecompare": "画像比較", + "imageonlycheckpointsave": "画像のみのチェックポイント保存", + "images": "画像", + "import": "インポート", + "import a model": "モデルをインポート", + "import a model from civitai": "Civitaiからモデルをインポート", + "import another": "別のファイルをインポート", + "import anyway": "強制的にインポート", + "import assets & open workflow": "アセットをインポートしてワークフローを開く", + "import failed": "インポートに失敗しました", + "import failed extensions": "インポートに失敗した拡張機能", + "import keybinding preset": "キーバインドプリセットをインポート", + "import not supported": "インポートはサポートされていません", + "import preset": "プリセットをインポート", + "import your own loras": "独自のLoRAをインポート", + "imported": "インポート済み", + "imported assets": "インポート済みアセット", + "importing models": "モデルをインポート中", + "in library": "ライブラリ内", + "in progress": "進行中", + "in workflow": "ワークフロー内", + "inbox": "受信トレイ", + "increase brush size in maskeditor": "マスクエディタでブラシサイズを大きくする", + "increment": "増加", + "increment value": "値を増加", + "inference": "推論", + "info": "情報", + "initial background color": "初期背景色", + "initial camera type": "初期カメラタイプ", + "initial grid visibility": "初期グリッド表示", + "initial light intensity": "初期ライト強度", + "initializing - almost ready": "初期化中 - まもなく準備完了", + "inpaint": "インペイント", + "inpaint image": "画像のインペイント", + "inpaintmodelconditioning": "インペイントモデル条件付け", + "input": "入力", + "input directory": "入力ディレクトリ", + "input image couldn't be loaded": "入力画像を読み込めませんでした", + "input out of range": "入力値が範囲外", + "inputs": "入力", + "inputs will show up here": "ここに入力が表示されます", + "insert": "挿入", + "insert all assets as nodes": "すべてのアセットをノードとして挿入", + "insert as node in workflow": "ワークフローにノードとして挿入", + "inspect asset": "アセットを確認", + "install": "インストール", + "install all": "すべての不足しているノードをインストール", + "install anyway": "それでもインストール", + "install error": "インストールエラー", + "install location": "インストール先", + "install missing custom nodes": "不足しているカスタムノードをインストール", + "install missing nodes": "不足ノードをインストール", + "install node pack": "ノードパックをインストール", + "install required": "インストールが必要", + "install selected": "選択したものをインストール", + "installation queue": "インストールキュー", + "installation required": "インストールが必要", + "installed": "インストール済み", + "installing": "インストール中", + "installing comfyui": "ComfyUIをインストール中", + "instant": "即時", + "instructpix2pix": "インストラクションピクス2ピクス", + "instructpixtopixconditioning": "PixToPix条件付け", + "insufficient credits": "クレジット不足", + "int": "整数", + "intensity": "強度", + "intermediate — comfortable with basics": "基本操作に慣れている", + "interp_model": "補間モデル", + "interrupt": "中断", + "interrupt all running jobs": "すべての実行中ジョブを中断", + "interrupted": "中断されました", + "invalid api key": "無効なAPIキーです", + "invalid asset": "無効なアセット", + "invalid clip input": "無効なCLIP入力", + "invalid connection": "無効な接続", + "invalid dialog": "無効なダイアログ", + "invalid email address": "無効なメールアドレス", + "invalid filename": "無効なファイル名", + "invalid input": "無効な入力", + "invalid workflow": "無効なワークフロー", + "invalid workflow request": "無効なワークフローリクエスト", + "invert": "反転", + "invert image colors": "画像を反転", + "invert mask": "マスクを反転", + "invite": "招待", + "invite accepted": "招待を承諾しました", + "invite date": "招待日", + "invite member": "メンバーを招待", + "invite up to": "最大 {count} 人を招待", + "invoice history": "請求履歴", + "items copied to clipboard": "項目をクリップボードにコピーしました", + "job": "ジョブ", + "job completed": "ジョブが完了しました", + "job details": "ジョブ詳細", + "job failed": "ジョブが失敗しました", + "job history": "ジョブ履歴", + "job id": "ジョブID", + "job id copied to clipboard": "ジョブIDがクリップボードにコピーされました", + "job queue": "ジョブキュー", + "job queued": "ジョブがキューに追加されました", + "job queuing": "ジョブをキューに追加中", + "join audio channels": "オーディオチャンネル結合", + "join date": "参加日", + "join image with alpha": "アルファで画像を結合", + "karrasscheduler": "カラススケジューラー", + "keep original order": "元の順序を維持", + "keep subscription": "サブスクリプションを維持する", + "keybinding": "キーバインディング", + "keybinding already exists on": "このキー割り当てはすでに存在します", + "keybinding preset imported": "キーバインドプリセットをインポートしました", + "keybindings": "キーバインド", + "keyboard shortcuts": "キーボードショートカット", + "kling camera controls": "Klingカメラコントロール", + "kling dual character video effects": "Kling デュアルキャラクター動画エフェクト", + "kling image(first frame) to video": "Kling 画像から動画へ", + "kling motion control": "Klingモーションコントロール", + "kling start-end frame to video": "Kling 開始-終了フレームから動画生成", + "kling text to video": "Kling テキストからビデオへ", + "kling video effects": "Kling ビデオエフェクト", + "kling virtual try on": "Klingバーチャル試着", + "krea 2 image": "Krea 2 画像", + "krea 2 style reference": "Krea 2 スタイル参照", + "ksampler": "Kサンプラー", + "ksampler (advanced)": "Kサンプラー(高度)", + "ksamplerselect": "Kサンプラー選択", + "language": "言語", + "laplacescheduler": "ラプラススケジューラー", + "last updated": "最終更新日", + "latent": "潜在", + "latent blend": "潜在ブレンド", + "latent composite": "潜在合成", + "latent from batch": "バッチから潜在を取得", + "latent_operation": "潜在操作", + "latentadd": "潜在追加", + "latentapplyoperation": "潜在操作を適用", + "latentapplyoperationcfg": "潜在操作CFGを適用", + "latentbatch": "潜在バッチ", + "latentbatchseedbehavior": "潜在バッチシード動作", + "latentcompositemasked": "マスクされた潜在合成", + "latentconcat": "潜在空間結合", + "latentcut": "潜在空間カット", + "latentinterpolate": "潜在補間", + "latentmultiply": "潜在乗算", + "latentoperationsharpen": "潜在操作シャープ化", + "latentoperationtonemapreinhard": "潜在操作トーンマップライナード", + "latentsubtract": "潜在減算", + "later": "後で", + "latest": "最新", + "layers": "レイヤー", + "learn about cloud": "クラウドについて学ぶ", + "learn more": "詳細を学ぶ", + "learn more about data collection": "データ収集の詳細を見る", + "leave": "退出", + "leave workspace": "ワークスペースを退出", + "leaves value unchanged": "値を変更しません", + "left": "左", + "left mouse click behavior": "左クリックの動作", + "left workspace": "ワークスペースから退出しました", + "legacy": "レガシー", + "license": "ライセンス", + "light": "ライト", + "light adjustment increment": "ライト調整増分", + "light intensity": "光の強度", + "light intensity maximum": "ライト強度の最大値", + "light intensity minimum": "ライト強度の最小値", + "light settings": "ライト設定", + "linear": "リニア", + "lineart": "線画", + "link": "リンク", + "link midpoint markers": "リンク中点マーカー", + "link release": "リンク解除", + "link render mode": "リンクレンダーモード", + "link shape": "リンクの形状", + "link to": "リンク先", + "lipsync": "リップシンク", + "list view": "リスト表示", + "litegraph": "litegraph (レガシー)", + "live preview": "ライブプレビュー", + "live preview method": "ライブプレビューメソッド", + "live sampling preview": "ライブサンプリングプレビュー", + "live selection": "ライブ選択", + "load 3d & animation": "3Dを読み込む", + "load 3d model": "3Dモデルを読み込む", + "load a template": "テンプレートを読み込む", + "load all folders": "すべてのフォルダーを読み込む", + "load audio": "音声を読み込む", + "load audio encoder": "オーディオエンコーダーローダー", + "load background removal model": "背景除去モデルの読み込み", + "load checkpoint": "チェックポイントを読み込む", + "load checkpoint with config": "設定でチェックポイントを読み込む(非推奨)", + "load clip": "CLIPを読み込む", + "load clip vision": "CLIPビジョンを読み込む", + "load controlnet model": "ControlNetモデルを読み込む", + "load controlnet model (diff)": "ControlNetモデルを読み込む(diff)", + "load default workflow": "デフォルトワークフローを読み込む", + "load diffusion model": "拡散モデルを読み込む", + "load face detection model (mediapipe)": "MediaPipe Face Landmarker を読み込む", + "load frame interpolation model": "フレーム補間モデルを読み込む", + "load gligen model": "GLIGENを読み込む", + "load hypernetwork": "ハイパーネットワークを読み込む", + "load image": "画像を読み込む", + "load image (as mask)": "画像を読み込む(マスクとして)", + "load image (from folder)": "フォルダから画像データセットを読み込む", + "load image (from outputs)": "画像の読み込み(出力から)", + "load image-text (from folder)": "フォルダから画像とテキストデータセットを読み込む", + "load latent upscale model": "Latent アップスケールモデルを読み込む", + "load lora": "LoRAローダーモデルのみ", + "load lora (bypass) (for debugging)": "LoRAの読み込み(バイパス)(デバッグ用)", + "load lora (model and clip)": "LoRAを読み込む", + "load lora model": "LoRAモデルを読み込み", + "load ltxv audio vae": "LTXV オーディオVAEローダー", + "load moge model": "MoGeモデルの読み込み", + "load optical flow model": "オプティカルフローモデルの読み込み", + "load style": "スタイルを読み込む(LoRA)", + "load style model": "スタイルモデルを読み込む", + "load training dataset": "トレーニングデータセットの読み込み", + "load unclip checkpoint": "unCLIPチェックポイントローダー", + "load upscale model": "拡大モデルを読み込む", + "load vae": "VAEを読み込む", + "load video": "動画を読み込む", + "load workflow": "ワークフローを読み込む", + "load3d_camera": "3Dカメラの読み込み", + "load3d_model_info": "3Dモデル情報を読み込む", + "load_3d": "3Dをロード", + "loaders": "ローダー", + "loading": "読み込み中", + "loading asset": "アセットを読み込み中", + "loading authorization request…": "認可リクエストを読み込み中…", + "loading background image": "背景画像を読み込んでいます", + "loading error": "読み込みエラー", + "loading human interface": "完了中...", + "loading…": "読み込み中…", + "loadlatent": "潜在を読み込む", + "locale": "ロケール", + "locate node on canvas": "キャンバス上でノードを探す", + "lock aspect ratio": "アスペクト比を固定", + "lock canvas": "キャンバスをロック", + "log in to your account": "アカウントにログインする", + "log in with github": "Githubでログイン", + "log in with google": "Googleでログイン", + "log out": "ログアウト", + "logging verbosity level": "ログの冗長性レベル", + "logic": "ロジック", + "login": "ログイン", + "login failed": "ログイン失敗", + "login successful": "ログイン成功", + "logout": "ログアウト", + "logs": "ログ", + "lora_model": "LoRAモデル", + "loss_map": "損失マップ", + "ltxv": "LTXV", + "ltxv audio text encoder loader": "LTXV オーディオテキストエンコーダーローダー", + "ltxv audio vae decode": "LTXV オーディオVAEデコード", + "ltxv audio vae encode": "LTXV オーディオVAEエンコード", + "ltxv empty latent audio": "LTXV 空のラテントオーディオ", + "ltxv image to video": "LTXV 画像から動画へ", + "ltxv preprocess": "LTXVPreprocess", + "ltxv text to video": "LTXV テキストから動画へ", + "ltxvconditioning": "LTXV条件付け", + "ltxvimgtovideo": "LTXV画像からビデオへ", + "ltxvscheduler": "LTXVスケジューラー", + "luma concepts": "Lumaコンセプト", + "luma image to image": "Luma 画像から画像へ", + "luma image to video": "Luma画像から動画へ", + "luma text to image": "Luma テキストから画像へ", + "luma text to video": "Luma テキストからビデオへ", + "luma uni-1 image": "Luma UNI-1 画像生成", + "luma uni-1 image edit": "Luma UNI-1 画像編集", + "luma_concepts": "Lumaコンセプト", + "luma_ref": "Luma参照", + "macos (m1 or later)": "MacOS (M1以降)", + "magnific image relight": "Magnific 画像リライティング", + "magnific image skin enhancer": "Magnific 画像スキンエンハンサー", + "magnific image style transfer": "Magnific画像スタイル転送", + "magnific image upscale (creative)": "Magnific画像アップスケール(クリエイティブ)", + "magnific image upscale (precise v2)": "Magnific画像アップスケール(精密V2)", + "maintenance": "メンテナンス", + "make image grid": "画像グリッド", + "make training dataset": "トレーニングデータセットを作成", + "manage": "管理", + "manage extensions": "拡張機能の管理", + "manage group nodes": "グループノードを管理", + "manage payment": "支払いを管理", + "manage plan": "プランを管理", + "manage shortcuts": "ショートカットを管理", + "manage subscription": "サブスクリプションを管理", + "manager": "マネージャー", + "manager menu": "マネージャーメニュー(レガシー)", + "manual configuration": "マニュアル設定", + "manual setup": "手動セットアップ", + "manually configure python venv": "python venvを手動で設定する", + "manualsigmas": "マニュアルシグマ", + "markdown": "マークダウン", + "mask": "マスク", + "mask blending options": "マスク合成オプション", + "mask editor": "マスクエディター", + "mask layer": "マスクレイヤー", + "mask opacity": "マスク不透明度", + "mask tolerance": "マスク許容値", + "match text": "正規表現マッチ", + "material mode": "マテリアルモード", + "math expression": "数式", + "max run duration": "各ワークフロー実行の最大時間", + "maximize dialog": "ダイアログを最大化", + "maximum fps": "最大FPS", + "maximum selection limit reached": "選択の上限に達しました", + "maximum upload size (mb)": "最大アップロードサイズ (MB)", + "media input missing": "メディア入力が不足しています", + "member": "メンバー", + "member removed": "メンバーを削除しました", + "memory": "メモリ", + "menu": "メニュー", + "merge audio": "オーディオ結合", + "merge image lists": "画像リストを結合", + "merge splats": "スプラットを結合", + "merge text lists": "テキストリストを結合", + "mesh": "メッシュ", + "message support": "サポートにメッセージ", + "method": "方法", + "method used for latent previews": "潜在プレビューに使用されるメソッド", + "metrics disabled": "メトリクスを無効にする", + "metrics enabled": "メトリクスを有効にする", + "microphone permission denied": "マイクの許可が拒否されました", + "migrate": "移行する", + "migrate from existing installation": "既存のインストールから移行", + "migration": "移行", + "minimap": "ミニマップ", + "minimax hailuo video": "MiniMax Hailuo 動画", + "minimax image to video": "MiniMax 画像から動画へ", + "minimax text to video": "MiniMax テキストからビデオへ", + "minimize node": "ノードを最小化", + "mirror horizontal": "左右反転", + "mirror horizontal in maskeditor": "マスクエディタで左右反転", + "mirror settings": "ミラー設定", + "mirror vertical": "上下反転", + "mirror vertical in maskeditor": "マスクエディタで上下反転", + "missing": "不足している", + "missing connection": "接続がありません", + "missing inputs": "入力がありません", + "missing media inputs": "メディア入力が不足しています", + "missing models": "不足しているモデル", + "missing node packs": "不足しているノードパック", + "missing node type": "ノードタイプがありません", + "missing nodes": "不足しているノード", + "model": "モデル", + "model access required": "モデルへのアクセスが必要です", + "model description": "モデル説明", + "model download failed": "モデルのダウンロードに失敗しました", + "model filter": "モデルフィルター", + "model info": "モデル情報", + "model library": "モデルライブラリ", + "model name": "モデル名", + "model providers": "モデルプロバイダー", + "model settings": "モデル設定", + "model size (low to high)": "モデルサイズ(小さい順)", + "model tagging": "モデルタグ付け", + "model type": "モデルタイプ", + "model_merging": "モデルマージ", + "model_patch": "モデルパッチ", + "model_specific": "モデル特有", + "model_task_id": "モデルタスクID", + "modelmergeadd": "モデルマージ追加", + "modelmergeauraflow": "モデルマージオーラフロー", + "modelmergeblocks": "モデルマージブロック", + "modelmergecosmospredict2_14b": "モデル統合コスモス予測2_14B", + "modelmergeflux1": "モデルマージフラックス1", + "modelmergeltxv": "モデルマージLTXV", + "modelmergemochipreview": "モデルマージMochiプレビュー", + "modelmergesd1": "モデルマージSD1", + "modelmergesd2": "モデルマージSD2", + "modelmergesd35_large": "モデルマージSD35_Large", + "modelmergesd3_2b": "モデルマージSD3_2B", + "modelmergesdxl": "モデルマージSDXL", + "modelmergesimple": "モデルマージシンプル", + "modelmergesubtract": "モデルマージ減算", + "modelpatchloader": "モデルパッチローダー", + "models": "モデル", + "models aren't available on cloud": "モデルはCloudで利用できません", + "models ready to use": "すぐに使えるモデル", + "modelsamplingauraflow": "モデルサンプリングオーラフロー", + "modelsamplingcontinuousedm": "モデルサンプリング連続EDM", + "modelsamplingcontinuousv": "モデルサンプリング連続V", + "modelsamplingdiscrete": "モデルサンプリング離散", + "modelsamplingflux": "モデルサンプリングフラックス", + "modelsamplingltxv": "モデルサンプリングLTXV", + "modelsamplingsd3": "モデルサンプリングSD3", + "modelsamplingstablecascade": "モデルサンプリング安定カスケード", + "modelsave": "モデルを保存", + "modify keybinding": "キーバインドを変更", + "module": "モジュール", + "monthly": "月額", + "monthly credit bonus": "月間クレジットボーナス", + "monthly credits": "月間クレジット", + "monthly credits / member": "月間クレジット / メンバー", + "more details on this template": "このテンプレートの詳細", + "more options": "その他のオプション", + "more workflows": "さらに多くのワークフロー", + "most popular": "最も人気", + "most recent": "最新順", + "most relevant": "最も関連性の高い", + "mouse wheel scroll": "マウスホイールスクロール", + "move selected nodes down": "選択したノードを下へ移動", + "move selected nodes left": "選択したノードを左へ移動", + "move selected nodes right": "選択したノードを右へ移動", + "move selected nodes up": "選択したノードを上へ移動", + "multi-select dropdown": "複数選択ドロップダウン", + "multigpu": "マルチGPU", + "multigpu cfg split": "MultiGPU CFG分割", + "multiple assets selected": "複数のアセットが選択されています", + "music generation": "音楽生成", + "mute": "ミュート", + "mute/unmute selected nodes": "選択したノードのミュート/ミュート解除", + "my account settings": "ユーザー設定", + "my blueprints": "マイブループリント", + "my models": "自分のモデル", + "name is required": "名前は必須です", + "nano banana (google gemini image)": "Google Gemini 画像", + "native app": "ネイティブアプリ", + "navigation mode": "キャンバスナビゲーションモード", + "negative": "ネガティブ", + "network": "ネットワーク", + "new blank workflow": "新しい空のワークフロー", + "new folder": "新しいフォルダー", + "new node library design": "新しいノードライブラリデザイン", + "new user": "新しいユーザー", + "new workspace": "新しいワークスペース", + "new — never used it": "ComfyUI初心者(使用経験なし)", + "newest": "最新", + "newsletter or blog": "ニュースレターやブログ", + "next billing cycle": "次の請求サイクル", + "next image": "次の画像", + "next month invoice": "翌月の請求書", + "next opened workflow": "次に開いたワークフロー", + "next slide": "次のスライド", + "nightly": "ナイトリー", + "no 3d scene to export": "エクスポートする3Dシーンがありません", + "no action": "アクションなし", + "no active jobs": "アクティブなジョブはありません", + "no additional tags": "追加タグなし", + "no assets found": "アセットが見つかりません", + "no audio recorded": "音声が録音されていません", + "no bookmarks yet": "お気に入りはまだありません", + "no color": "色なし", + "no conflicts detected": "競合は検出されませんでした", + "no description available": "説明はありません", + "no description set": "説明が設定されていません", + "no errors": "エラーなし", + "no extensions in workflow": "ワークフローに拡張機能がありません", + "no extensions installed": "拡張機能がインストールされていません", + "no favorited inputs": "お気に入り入力なし", + "no files found": "ファイルが見つかりません", + "no generated files found": "生成されたファイルが見つかりません", + "no images to compare": "比較する画像がありません", + "no imported files found": "インポートされたファイルが見つかりません", + "no input image connected": "入力画像が接続されていません", + "no inputs": "入力なし", + "no inputs added yet": "まだ入力が追加されていません", + "no items match your search": "検索条件に一致する項目がありません", + "no keybinding": "ショートカットなし", + "no members": "メンバーがいません", + "no missing nodes": "不足しているノードはありません", + "no nodes": "ノードなし", + "no nodes found": "ノードが見つかりません", + "no output nodes added yet": "まだ出力ノードが追加されていません", + "no output nodes selected": "出力ノードが選択されていません", + "no outputs added yet": "まだ出力が追加されていません", + "no pending invites": "保留中の招待はありません", + "no recent releases": "最近のリリースはありません", + "no results": "結果なし", + "no results found": "結果が見つかりません", + "no stacktrace available": "スタックトレースは利用できません", + "no tasks found": "タスクが見つかりません", + "no templates found": "テンプレートが見つかりません", + "no templates to export": "エクスポートするテンプレートがありません", + "no update found": "アップデートは見つかりませんでした", + "no valid import source detected": "有効なインポート元が検出されませんでした", + "node": "ノード", + "node color": "ノードカラー", + "node colors": "ノードの色", + "node content error": "ノード内容エラー", + "node definitions updated": "ノード定義が更新されました", + "node graph": "ノードグラフ", + "node has no inputs": "このノードには入力がありません", + "node header error": "ノードヘッダーエラー", + "node id badge mode": "ノードIDバッジモード", + "node info": "ノード情報", + "node library": "ノードライブラリ", + "node life cycle badge mode": "ノードライフサイクルバッジモード", + "node links": "ノードリンク", + "node opacity": "ノードの不透明度", + "node pack": "ノードパック", + "node pack info": "ノードパック情報", + "node preview": "ノードプレビュー", + "node render error": "ノード描画エラー", + "node search box": "ノード検索ボックス", + "node search box implementation": "ノード検索ボックスの実装", + "node slots error": "ノードスロットエラー", + "node source badge mode": "ノードソースバッジモード", + "node state": "ノードの状態", + "node templates": "ノードテンプレート", + "node widget": "ノードウィジェット", + "node widgets error": "ノードウィジェットエラー", + "nodes": "ノード", + "nodes aren't available on cloud": "ノードはCloudで利用できません", + "nodes can be replaced": "ノードは置き換え可能です", + "nodes manager": "カスタムノードマネージャ", + "nodes running": "ノードが実行中", + "noise": "ノイズ", + "normal": "ノーマル", + "normalize image colors": "画像を正規化", + "normalized attention guidance": "正規化アテンションガイダンス", + "not available": "利用不可", + "not installed": "未インストール", + "not sure": "まだ分からない", + "nothing selected": "選択されていません", + "nothing to copy": "コピーするものがありません", + "nothing to delete": "削除するものがありません", + "nothing to duplicate": "複製するものがありません", + "nothing to group": "グループ化するものがありません", + "nothing to queue": "キューに追加する項目がありません", + "nothing to rename": "リネームするものがありません", + "notification preferences": "通知設定", + "number of nodes suggestions": "ノード提案の数", + "number of runs": "実行回数:", + "ok, got it": "了解しました", + "only applies to v1": "デフォルトの実装にのみ適用されます", + "only civitai urls are supported": "CivitaiのURLのみサポートされています", + "only for litegraph searchbox/context menu": "ライトグラフの検索ボックス/コンテキストメニュー専用", + "only safetensor format is allowed": "SafeTensor形式のみ許可されています", + "opacity": "不透明度", + "open about comfyui": "ComfyUIについてを開く", + "open all workflows": "すべてのワークフローを開く", + "open clipspace": "クリップスペースを開く", + "open color picker in maskeditor": "MaskEditorでカラーピッカーを開く", + "open comfy-org discord": "Comfy-OrgのDiscordを開く", + "open comfyui docs": "ComfyUIのドキュメントを開く", + "open comfyui forum": "Comfy-Orgフォーラムを開く", + "open comfyui issues": "ComfyUIの問題を開く", + "open custom nodes folder": "カスタムノードフォルダーを開く", + "open dev tools": "開発者ツールを開く", + "open devtools": "開発者ツールを開く", + "open image": "画像を開く", + "open in 3d viewer": "3Dビューアで開く", + "open in mask editor": "マスクエディタで開く", + "open inputs folder": "入力フォルダーを開く", + "open logs": "ログを開く", + "open logs folder": "ログフォルダーを開く", + "open manager": "マネージャーを開く", + "open models folder": "モデルフォルダーを開く", + "open new issue": "新しい問題を開く", + "open node manager": "Node Managerを開く", + "open outputs folder": "出力フォルダーを開く", + "open shared workflow": "共有ワークフローを開く", + "open sign in dialog": "サインインダイアログを開く", + "open without importing": "インポートせずに開く", + "open workflow": "ワークフローを開く", + "open workflow in new tab": "ワークフローを新しいタブで開く", + "openai chatgpt advanced options": "OpenAI ChatGPT 詳細オプション", + "openai chatgpt input files": "OpenAI ChatGPT 入力ファイル", + "openai sora - video": "OpenAI Sora - ビデオ", + "openai_chat_config": "OpenAIチャット設定", + "openai_input_files": "OpenAI入力ファイル", + "opened workflows position": "開いているワークフローの位置", + "operations": "操作", + "or continue with": "または以下で続ける", + "original": "オリジナル", + "orthographic": "オルソグラフィック", + "outpaint image": "画像のアウトペイント", + "output": "出力", + "output directory": "出力ディレクトリ", + "outputs": "出力", + "overwrite": "上書き", + "overwrite preset": "プリセットの上書き", + "owner": "オーナー", + "ownership": "所有権", + "packs selected": "選択したパック", + "pad image for outpainting": "アウトペイント用に画像をパッド", + "paint bucket settings": "ペイントバケツ設定", + "paint layer": "ペイントレイヤー", + "pale blue": "淡い青", + "pan mode": "パンモード", + "panel controls": "パネルコントロール", + "panning": "パン(移動)", + "panorama": "パノラマ", + "parameters": "パラメータ", + "partner": "パートナー", + "partner nodes": "パートナーノード", + "partner nodes pricing": "パートナーノードクレジット", + "password": "パスワード", + "password requirements": "パスワードの要件", + "password reset email sent": "パスワードリセット用メールを送信しました", + "password reset sent": "パスワードリセットを送信しました", + "password updated": "パスワードが更新されました", + "passwords must match": "パスワードが一致する必要があります", + "paste": "貼り付け", + "paste image": "画像を貼り付け", + "paste link here": "ここにリンクを貼り付けてください", + "paste with connect": "接続して貼り付け", + "patch": "パッチ", + "patchmodeladddownscale (kohya deep shrink)": "パッチモデル追加ダウンスケール(Kohya Deep Shrink)", + "pause": "一時停止", + "pause download": "ダウンロードを一時停止", + "paused": "一時停止", + "pending": "保留中", + "pending tasks deleted": "保留中のタスクが削除されました", + "permissions": "権限", + "perp-neg (deprecated by perp-neg guider)": "Perp-Neg(PerpNegGuiderによって非推奨)", + "perp-neg guider": "PerpNegガイダー", + "personal": "個人", + "personal information": "個人情報", + "personal use": "個人利用", + "personal workspace": "個人ワークスペース", + "perspective": "パースペクティブ", + "perturbedattentionguidance": "摂動注意ガイダンス", + "photomakerencode": "フォトメーカーエンコード", + "photomakerloader": "フォトメーカーを読み込む", + "pid conditioning": "PiD コンディショニング", + "pin": "ピン", + "pin/unpin selected items": "選択したアイテムのピン留め/ピン留め解除", + "pin/unpin selected nodes": "選択したノードのピン留め/ピン留め解除", + "pink": "ピンク", + "pinned": "ピン留め", + "pip install mirror for pytorch": "pytorchのpipインストールミラー", + "pixverse image to video": "PixVerse 画像から動画へ", + "pixverse template": "PixVerseテンプレート", + "pixverse text to video": "PixVerse テキストからビデオへ", + "pixverse transition video": "PixVerse トランジションビデオ", + "pixverse_template": "Pixverseテンプレート", + "plan & credits": "プランとクレジット", + "plans & pricing": "プランと価格", + "play": "再生", + "play recording": "録音を再生", + "play/pause": "再生/一時停止", + "playback speed": "再生速度", + "playing": "再生中", + "please help improve comfyui": "ComfyUIの改善にご協力ください", + "please select output nodes": "出力ノードを選択してください", + "plot loss graph": "損失グラフをプロット", + "point cloud": "ポイントクラウド", + "point cloud engine": "PLYエンジン", + "pointer": "ポインタ", + "pointer click drift (maximum distance)": "ポインタークリックドリフト(最大距離)", + "pointer click drift delay": "ポインタークリックドリフト遅延", + "polyexponentialscheduler": "ポリ指数スケジューラー", + "popular": "人気", + "porter-duff image composite": "ポーターダフ画像合成", + "pose to image": "ポーズから画像へ", + "pose to video": "ポーズから動画へ", + "positive-biased guidance": "Mahiroはとても可愛いので、より良いガイダンス機能が必要です!! (。・ω・。)", + "pre-paid credits": "プリペイドクレジット", + "preparation failed": "準備に失敗しました", + "preparation timed out": "準備がタイムアウトしました", + "preprocessors": "前処理", + "prevent attention upcast": "アテンションのアップキャストを防ぐ", + "preview": "プレビュー", + "preview 3d & animation": "3Dプレビュー", + "preview 3d (advanced)": "3Dプレビュー(詳細)", + "preview as text": "プレビュー任意", + "preview audio": "オーディオプレビュー", + "preview image": "画像プレビュー", + "preview image format": "プレビュー画像フォーマット", + "preview mask": "MaskPreview", + "preview output": "出力のプレビュー", + "preview point cloud": "ポイントクラウドのプレビュー", + "preview splat": "スプラットのプレビュー", + "preview version": "プレビュー版", + "previous": "前へ", + "previous image": "前の画像", + "previous opened workflow": "前に開いたワークフロー", + "previous slide": "前のスライド", + "primitive": "プリミティブ", + "privacy policy": "プライバシーポリシー", + "pro": "プロ", + "processing video…": "ビデオ処理中…", + "processing…": "処理中…", + "profile": "プロフィール", + "profile creation": "プロフィール作成", + "prompt execution failed": "プロンプトの実行に失敗しました", + "prompt has no outputs": "プロンプトに出力がありません", + "prompt is empty": "プロンプトが空です", + "prompt validation failed": "プロンプトの検証に失敗しました", + "properties": "プロパティ", + "properties panel": "プロパティパネル", + "provider": "プロバイダー", + "provider is required": "プロバイダーは必須です", + "public models": "公開モデル", + "publish": "公開", + "publish failed": "公開に失敗しました", + "publish subgraph": "サブグラフを公開", + "publish to comfyhub": "ComfyHub へ公開", + "publish to the comfyhub": "ComfyHub へ公開", + "published successfully": "公開に成功しました", + "publisher": "出版社", + "purchase credits": "クレジットを購入", + "purchase failed": "購入に失敗しました", + "purple": "パープル", + "pypi install mirror": "Pypi インストールミラー", + "python install mirror": "Pythonインストールミラー", + "quantize image": "画像を量子化", + "queue": "キュー", + "queue button": "キューボタン", + "queue history size": "キュー履歴サイズ", + "queue panel": "キューパネル", + "queue position": "キュー位置", + "queue progress": "キュー進行状況", + "queue prompt": "キューのプロンプト", + "queue prompt (front)": "キューのプロンプト (前面)", + "queue selected output nodes": "選択した出力ノードをキューに追加", + "queued": "キュー中", + "queued at": "キュー追加日時", + "quick fix available": "クイック修正可能", + "quick purchase": "クイック購入", + "quit": "終了", + "quiver image to svg": "Quiver画像からSVGへ", + "quiver text to svg": "QuiverテキストからSVGへ", + "randomize value": "値をランダム化", + "randomnoise": "ランダムノイズ", + "ratio": "比率", + "re-authentication required": "再認証が必要です", + "re-install": "再インストール", + "ready": "準備完了", + "rebatch images": "画像を再バッチ", + "rebatch latents": "潜在を再バッチ", + "recent": "最新", + "recent releases": "最近のリリース", + "recents": "最近使用", + "recommended": "推奨", + "reconnected": "再接続されました", + "reconnecting": "再接続中", + "record audio": "録音", + "recraft color rgb": "Recraft カラー RGB", + "recraft controls": "Recraftコントロール", + "recraft create style": "Recraft スタイル作成", + "recraft creative upscale image": "Recraft Creative アップスケール画像", + "recraft crisp upscale image": "Recraft シャープ高解像度アップスケール画像", + "recraft image inpainting": "Recraft画像インペインティング", + "recraft image to image": "Recraft 画像から画像へ", + "recraft remove background": "Recraft 背景除去", + "recraft replace background": "Recraft 背景置換", + "recraft style - digital illustration": "Recraftスタイル - デジタルイラストレーション", + "recraft style - logo raster": "Recraft Style - ロゴラスタ", + "recraft style - realistic image": "Recraftスタイル - リアルな画像", + "recraft text to image": "Recraft テキストから画像へ", + "recraft text to vector": "Recraft テキストからベクターへ", + "recraft v4 text to image": "Recraft V4 テキストから画像生成", + "recraft v4 text to vector": "Recraft V4 テキストからベクター生成", + "recraft vectorize image": "Recraft ベクトル化画像", + "recraft_color": "Recraftカラー", + "recraft_controls": "Recraftコントロール", + "recraft_v3_style": "Recraft V3スタイル", + "red": "赤", + "redo": "やり直し", + "reference audio": "ReferenceTimbreAudio", + "referencelatent": "参照潜在変数", + "refresh": "更新", + "refresh credits": "クレジットを更新", + "refresh node": "ノードを更新", + "refresh node definitions": "ノードを更新", + "refreshing": "更新中", + "reinstall": "再インストール", + "reload to apply changes": "変更を適用するには再読み込みしてください", + "remove": "削除", + "remove all": "すべて削除", + "remove background": "背景を削除", + "remove background image": "背景画像を削除", + "remove bypass": "バイパスを解除", + "remove example image": "サンプル画像を削除", + "remove from bookmarks": "ブックマークから削除", + "remove hdri": "HDRIを削除", + "remove image": "画像を削除", + "remove job": "ジョブを削除", + "remove keybinding": "キーバインドを削除", + "remove member": "メンバーを削除", + "remove tag": "タグを削除", + "remove video": "ビデオを削除", + "rename": "名前を変更", + "rename widget": "ウィジェット名を変更", + "rename workflow": "ワークフローの名前を変更", + "render bypass state": "バイパス状態を表示", + "render error state": "エラー状態を表示", + "render moge geometry": "MoGe レンダリング", + "render splat": "スプラットをレンダリング", + "repeat image batch": "画像バッチを繰り返す", + "repeat latent batch": "潜在バッチを繰り返す", + "replace all": "すべて置き換える", + "replace node": "ノードを置き換える", + "replace text": "テキスト置換", + "replace text (regex)": "正規表現置換", + "replaceable": "置き換え可能", + "replaced": "置き換え済み", + "report": "報告", + "report error": "エラーを報告", + "report issue": "問題を報告", + "report submitted": "レポートが送信されました", + "repository": "リポジトリ", + "request failed": "リクエストに失敗しました", + "require confirmation when clearing workflow": "ワークフローをクリアする際に確認を要求する", + "required": "必須", + "required input missing": "必須入力がありません", + "requirements": "要件", + "requires additional credits": "追加クレジットが必要です", + "reroute": "リルート", + "reroute beta": "ルート変更ベータ", + "reroute spline offset": "リルートスプラインオフセット", + "rerun": "再実行", + "rescalecfg": "CFGを再スケール", + "reserved vram (gb)": "予約済みVRAM (GB)", + "reset": "リセット", + "reset all": "すべてリセット", + "reset all keybindings to default": "すべてのキーバインディングをデフォルトにリセット", + "reset all parameters": "すべてのパラメータをリセット", + "reset canvas view": "ビューをリセット", + "reset to default": "デフォルトにリセット", + "reset transform": "変換をリセット", + "reset view": "ビューをリセット", + "reset view to default": "ビューをデフォルトにリセット", + "resize": "リサイズ", + "resize and pad image": "画像のリサイズとパディング", + "resize from bottom-left corner": "左下隅からリサイズ", + "resize from bottom-right corner": "右下隅からリサイズ", + "resize from top-left corner": "左上隅からリサイズ", + "resize from top-right corner": "右上隅からリサイズ", + "resize image": "画像のサイズ変更", + "resize image/mask": "画像/マスクのリサイズ", + "resize images by longer edge": "長辺で画像をリサイズ", + "resize images by shorter edge": "短辺で画像をリサイズ", + "resize node to match output": "ノードを出力に合わせてリサイズ", + "resize selected nodes": "選択したノードのサイズ変更", + "resizing…": "リサイズ中…", + "resolution bucket": "解像度バケット", + "resolution selector": "解像度セレクター", + "restart": "再起動", + "restart required": "再起動が必要です", + "restore dialog": "ダイアログを元に戻す", + "resubscribe": "再購読する", + "resume download": "ダウンロードを再開", + "retarget_task_id": "リターゲットタスクID", + "retry download": "ダウンロードを再試行", + "reuse parameters": "パラメータを再利用", + "reve image create": "Reve画像生成", + "reve image edit": "Reve画像編集", + "reve image remix": "Reve画像リミックス", + "revert changes": "変更を元に戻す", + "review app layout": "アプリのレイアウトを確認", + "revoke invite": "招待を取り消す", + "rig_task_id": "リグタスクID", + "right": "右", + "rotate": "回転", + "rotate image": "画像回転", + "rotate latent": "潜在回転", + "rotate left": "左に回転", + "rotate left in maskeditor": "マスクエディタで左に回転", + "rotate right": "右に回転", + "rotate right in maskeditor": "マスクエディタで右に回転", + "round": "ラウンド", + "rt-detr detect": "RT-DETR 検出", + "rtx 6000 pro (96gb vram)": "RTX 6000 Pro(96GB VRAM)", + "run branch": "ブランチを実行", + "run comfyui in the cloud": "ComfyUIをクラウドで実行", + "run could not start": "実行を開始できませんでした", + "run ended unexpectedly": "実行が予期せず終了しました", + "run moge inference": "MoGe推論", + "run moge panorama inference": "MoGeパノラマ推論", + "run vae on cpu": "CPUでVAEを実行する", + "run workflow": "ワークフローを実行", + "run workflow (queue at front)": "ワークフローを実行する (先頭にキュー)", + "run workflows on your behalf": "あなたに代わってワークフローを実行", + "running…": "実行中…", + "runway first-last-frame to video": "Runway 最初-最後フレームから動画生成", + "sad girl illustration": "悲しそうな女の子のイラスト", + "sam3 detect": "SAM3検出", + "sam3 track preview": "SAM3トラックプレビュー", + "sam3 track to mask": "SAM3トラックからマスク", + "sam3 video track": "SAM3ビデオトラック", + "sampler": "サンプラー", + "samplercustom": "カスタムサンプラー", + "samplercustomadvanced": "カスタムサンプラー(高度)", + "samplerdpmadaptative": "サンプラーDPM適応", + "samplerdpmpp_2m_sde": "サンプラーDPMPP_2M_SDE", + "samplerdpmpp_2s_ancestral": "サンプラーDPMPP_2S_祖先", + "samplerdpmpp_3m_sde": "サンプラーDPMPP_3M_SDE", + "samplerdpmpp_sde": "サンプラーDPMPP_SDE", + "samplereulerancestral": "サンプラーオイラー祖先", + "samplereulerancestralcfg++": "サンプラーオイラー祖先CFG++", + "samplereulercfg++": "サンプラーオイラーCFG++", + "samplerlcmupscale": "サンプラーLCM拡大", + "samplerlms": "サンプラーLMS", + "samplers": "サンプラー", + "sampling": "サンプリング", + "save 3d model": "3Dモデルを保存", + "save and switch": "保存して切り替え", + "save animated png": "アニメーションPNGを保存", + "save animated webp": "アニメーションWEBPを保存", + "save anyway": "強制的に保存", + "save as new preset": "新しいプリセットとして保存", + "save as template": "テンプレートとして保存", + "save audio": "音声を保存", + "save audio (advanced)": "オーディオを保存(詳細)", + "save audio (flac)": "オーディオを保存", + "save audio (mp3)": "オーディオ保存 (MP3)", + "save audio (opus)": "オーディオ保存 (Opus)", + "save checkpoint": "チェックポイントを保存", + "save failed": "保存に失敗しました", + "save image": "画像を保存", + "save image (advanced)": "画像を保存(詳細)", + "save image (to folder)": "画像データセットをフォルダに保存", + "save image (websocket)": "画像を保存するWebSocket", + "save image-text (to folder)": "画像とテキストのデータセットをフォルダに保存", + "save lora weights": "LoRA重みを保存", + "save selected as template": "選択したものをテンプレートとして保存", + "save subgraph to library": "サブグラフをライブラリに保存", + "save svg": "SVG保存ノード", + "save to library": "ライブラリに保存", + "save training dataset": "学習データセットを保存", + "save video": "動画を保存", + "save webm": "SaveWEBM", + "save workflow": "ワークフローを保存", + "save workflow as": "名前を付けてワークフローを保存", + "save workflow first": "まずワークフローを保存してください", + "saved to nodes library": "ノードライブラリに保存されました", + "savelatent": "潜在を保存", + "saving": "保存中", + "saving…": "保存中…", + "scale": "スケール", + "scale image to max dimension": "画像最大寸法へのスケール", + "scale image to total pixels": "画像を総ピクセルにスケール", + "scalerope": "ROPEスケーリング", + "scene": "シーン", + "scene settings": "シーン設定", + "schedulers": "スケジューラー", + "scheduling": "スケジューリング", + "scroll left": "左にスクロール", + "scroll right": "右にスクロール", + "sd3": "SD3", + "sd_4xupscale_conditioning": "SD_4X拡大条件付け", + "sdpose draw keypoints": "SDPoseDrawKeypoints", + "sdpose face bounding boxes": "SDPoseFaceBBoxes", + "sdpose keypoint extractor": "SDPoseKeypointExtractor", + "sdturboscheduler": "SDターボスケジューラー", + "search": "検索", + "search aliases": "エイリアスを検索", + "search assets": "アセットを検索", + "search box": "検索ボックス", + "search extensions": "拡張機能を検索", + "search in node manager": "ノードマネージャーで検索", + "search keybindings": "キーバインディングを検索", + "search models": "モデルを検索", + "search nodes": "ノードを検索", + "search settings": "設定を検索", + "search workflows": "ワークフローを検索", + "secret value": "シークレット値", + "secret value is required": "シークレット値は必須です", + "secrets": "シークレット", + "see a tutorial": "チュートリアルを見る", + "see details": "詳細を見る", + "see error": "エラーを見る", + "see more outputs": "さらに出力を表示", + "see what's new": "新機能", + "select": "選択", + "select a thumbnail": "サムネイルを選択", + "select a user": "ユーザーを選択", + "select all": "すべて選択", + "select amount": "金額を選択", + "select clip device": "CLIPデバイス選択", + "select existing comfyui installation (optional)": "既存のComfyUIインストールを選択(任意)", + "select frameworks": "フレームワークを選択", + "select gpu": "GPUを選択", + "select group children on click": "グループ内の子要素をクリックで選択", + "select items to copy": "コピーする項目を選択", + "select items to delete": "削除する項目を選択", + "select items to duplicate": "複製する項目を選択", + "select items to migrate": "移行する項目を選択", + "select items to rename": "リネームする項目を選択", + "select mode": "選択モード", + "select model": "モデルを選択", + "select model device": "モデルデバイス選択", + "select model type": "モデルタイプを選択", + "select projects": "プロジェクトを選択", + "select vae device": "VAEデバイスの選択", + "select version": "バージョンを選択", + "selected": "選択済み", + "selected file": "選択されたファイル", + "selection opacity": "選択範囲の不透明度", + "self-attention guidance": "自己注意ガイダンス", + "send anonymous usage metrics": "匿名の使用統計を送信する", + "send report": "報告する", + "send reset link": "リセットリンクを送信", + "separate tags with commas": "タグはカンマで区切ってください", + "server": "サーバー", + "server crashed": "サーバーがクラッシュしました", + "server error": "サーバーエラー", + "server-config": "サーバー設定", + "servers are busy": "サーバーが混雑しています", + "service error": "サービスエラー", + "set as background": "背景として設定", + "set clip hooks": "CLIPフックを設定", + "set group nodes to always": "グループノードを常に有効にする", + "set group nodes to never": "グループノードを常に無効にする", + "set hook keyframes": "フックキーフレームを設定", + "set latent noise mask": "潜在ノイズマスクを設定", + "set subgraph description": "サブグラフの説明を設定", + "set subgraph search aliases": "サブグラフの検索エイリアスを設定", + "settings": "設定", + "setunioncontrolnettype": "Union ControlNetタイプを設定", + "shape": "形状", + "shapes": "形", + "share anyway": "それでも共有", + "share url": "共有URL", + "share workflow": "ワークフローを共有", + "sharpen image": "画像をシャープ化", + "shortcuts": "ショートカット", + "show advanced": "詳細を表示", + "show advanced inputs": "詳細入力を表示", + "show advanced parameters": "詳細パラメータを表示", + "show api node pricing badge": "APIノードの料金バッジを表示", + "show as background": "背景として表示", + "show assets": "アセットを表示", + "show assets panel": "アセットパネルを表示", + "show confirmation when closing window": "ウィンドウを閉じるときに確認を表示", + "show confirmation when deleting workflows": "ワークフローを削除する際に確認を表示", + "show connected links": "接続されたリンクを表示", + "show deprecated nodes in search": "検索で非推奨ノードを表示", + "show error report": "エラーレポートを表示", + "show errors in graph": "グラフでエラーを表示", + "show experimental nodes in search": "検索で実験的ノードを表示", + "show frames/groups": "フレーム/グループを表示", + "show graph canvas menu": "グラフキャンバスメニューを表示する", + "show grid": "グリッドを表示", + "show info badges": "情報バッジを表示", + "show input": "入力を表示", + "show keybindings dialog": "キーバインドダイアログを表示", + "show left panel": "左パネルを表示", + "show links": "リンクを表示", + "show maintenance tasks": "メンテナンスタスクを表示", + "show menu": "メニューを表示", + "show minimap": "ミニマップを表示", + "show missing models warning": "欠落しているモデルの警告を表示", + "show model selector (dev)": "モデルセレクターを表示(開発用)", + "show more features": "さらに機能を表示", + "show recommended widgets": "おすすめウィジェットを表示", + "show referencing nodes": "参照ノードを表示", + "show report": "レポートを表示", + "show right panel": "右パネルを表示", + "show run progress bar": "実行進行バーを表示", + "show selection toolbox": "選択ツールボックスを表示", + "show settings dialog": "設定ダイアログを表示", + "show skeleton": "スケルトンを表示", + "show terminal": "ターミナルを表示", + "show toolbox on selection": "選択時にツールボックスを表示", + "show version updates": "バージョン更新を表示", + "shown on node": "ノード上で表示", + "shuffle images list": "画像データセットをシャッフル", + "shuffle pairs of image-text": "画像・テキストデータセットをシャッフル", + "sidebar": "サイドバー", + "sidebar location": "サイドバーの位置", + "sidebar size": "サイドバーのサイズ", + "sidebar style": "サイドバーのスタイル", + "sigmas": "シグマ", + "sign in": "ログイン", + "sign in / sign up": "サインイン / サインアップ", + "sign in again": "再度サインイン", + "sign in required": "サインインが必要です", + "sign out": "サインアウト", + "sign out & try again": "サインアウトして再試行", + "sign out anyway": "とにかくサインアウト", + "sign up": "サインアップ", + "sign up with github": "Githubでサインアップ", + "sign up with github instead": "代わりにGithubでサインアップ", + "sign up with google": "Googleでサインアップ", + "sign-in provider": "サインイン方法", + "signed out successfully": "正常にサインアウトしました", + "simplified apps from workflows": "ワークフローから簡易アプリ作成", + "single-select dropdown": "単一選択ドロップダウン", + "size of preview images": "プレビュー画像のサイズ", + "skip": "スキップ", + "skip for now": "今はスキップ", + "skip to end": "最後にスキップ", + "skip to start": "最初にスキップ", + "skip to the cloud app": "クラウドアプリへスキップ", + "skiplayerguidanceditsimple": "スキップレイヤーガイダンスDiT簡易版", + "skipped": "スキップされました", + "smooth": "スムーズ", + "smoothing precision": "スムージング精度", + "snap highlights node": "スナップハイライトノード", + "snap nodes to grid": "ノードをグリッドにスナップ", + "snap to grid size": "グリッドサイズにスナップ", + "solo use only": "個人利用のみ", + "sonilo text to music": "Sonilo テキストから音楽生成", + "sonilo video to music": "Sonilo 動画から音楽生成", + "sorry, contact support": "申し訳ありません、サポートに連絡してください", + "sort": "並び替え", + "sort alphabetically within groups": "グループ内でアルファベット順に並び替え", + "sort by": "並べ替え条件", + "sort jobs": "ジョブを並べ替え", + "sort mode": "並び替えモード", + "sorting type": "並び替えタイプ", + "source": "ソース", + "splat": "スプラット", + "spline": "スプライン", + "split audio channels": "オーディオチャンネル分割", + "split image with alpha": "アルファで画像を分割", + "splitsigmas": "シグマを分割", + "splitsigmasdenoise": "シグマを分割してノイズ除去", + "stability ai audio inpaint": "Stability AI オーディオインペイント", + "stability ai audio to audio": "Stability AI オーディオ変換", + "stability ai text to audio": "Stability AI テキストからオーディオへ", + "stability ai upscale conservative": "Stability AI アップスケール(コンサバティブ)", + "stability ai upscale creative": "Stability AI アップスケール クリエイティブ", + "stability ai upscale fast": "Stability AI 高速アップスケール", + "stable_cascade": "安定したカスケード", + "stablecascade_emptylatentimage": "安定カスケード_空の潜在画像", + "stablecascade_stageb_conditioning": "安定カスケード_ステージB条件付け", + "stablecascade_stagec_vaeencode": "安定カスケード_ステージC_VAEエンコード", + "stablecascade_superresolutioncontrolnet": "安定カスケード_超解像Controlnet", + "stablezero123_conditioning": "安定ゼロ123条件付け", + "stablezero123_conditioning_batched": "安定ゼロ123条件付け(バッチ)", + "standard": "スタンダード", + "standard (new)": "標準(新)", + "star": "星", + "start creating in seconds": "数秒で作成を開始", + "start publishing": "公開を開始", + "start recording": "録音開始", + "starting comfyui": "ComfyUIを起動中", + "starting today": "本日から開始", + "status": "ステータス", + "step size": "ステップサイズ", + "stitch images": "画像結合", + "stop at mask": "マスクで停止", + "stop playback": "再生を停止", + "stop recording": "録音停止", + "stop run (instant)": "実行を即時停止", + "stop running": "実行を停止", + "straight": "ストレート", + "string": "文字列", + "strip whitespace": "空白文字の削除", + "style_model": "スタイルモデル", + "subgraph blueprints": "サブグラフブループリント", + "subgraph name": "サブグラフ名", + "submit": "送信", + "submit a github issue": "GitHub イシューを提出", + "subscribe": "購読する", + "subscribe for more": "さらに詳しく", + "subscribe now": "今すぐ購読", + "subscribe to": "購読する", + "subscribe to comfy cloud": "Comfy Cloudにサブスクライブ", + "subscribe to run": "実行を購読", + "subscription": "サブスクリプション", + "subscription activation failed": "サブスクリプションの有効化に失敗しました", + "subscription cancelled successfully": "サブスクリプションが正常にキャンセルされました", + "subscription reactivated successfully": "サブスクリプションが再開されました", + "subscription required": "サブスクリプションが必要です", + "subscription update failed": "サブスクリプションの更新に失敗しました", + "subscription updated successfully": "サブスクリプションが正常に更新されました", + "subscription upgrade required": "サブスクリプションのアップグレードが必要です", + "subscription verification timed out": "サブスクリプションの確認がタイムアウトしました", + "substring": "部分文字列", + "success": "成功", + "successfully saved": "保存に成功しました", + "suggested tags": "おすすめタグ", + "support": "サポート", + "survey questions placeholder": "アンケート質問のプレースホルダー", + "sv3d_conditioning": "SV3D条件付け", + "svd_img2vid_conditioning": "SVD_img2vid条件付け", + "swap nodes": "ノードの入れ替え", + "switch": "切り替え", + "switch back": "設定を開く", + "switch camera": "カメラを切り替える", + "switch to grid view": "グリッドビューに切り替え", + "switch to outputs": "出力に切り替え", + "switch to single view": "シングルビューに切り替え", + "switch workspace": "ワークスペースを切り替え", + "system info": "システム情報", + "system locations": "システムの場所", + "tab bar layout": "タブバーのレイアウト", + "tags": "タグ", + "tangential damping cfg": "接線減衰 CFG", + "task error": "タスクエラー", + "tasks": "タスク", + "team": "チーム", + "team workspace": "チームワークスペース", + "team workspaces": "チームワークスペース", + "technical details": "技術詳細", + "templates": "テンプレート", + "terminal": "ターミナル", + "terms": "利用規約", + "terms of use": "利用規約", + "text encoder precision": "テキストエンコーダー精度", + "text generation": "テキスト生成(LLM)", + "text length": "長さ", + "text string": "文字列", + "text string (multiline)": "文字列(複数行)", + "text to 3d model": "テキストから3Dモデル", + "text to image": "テキストから画像へ", + "text to video": "テキストから動画へ", + "textarea widget font size": "テキストエリアウィジェットのフォントサイズ", + "textarea widget spellcheck": "テキストエリアウィジェットのスペルチェック", + "theme": "テーマ", + "thickness": "太さ", + "this app": "このアプリ", + "this app encountered an error": "このアプリでエラーが発生しました", + "this node": "このノード", + "this workflow has missing nodes": "このワークフローには不足しているノードがあります", + "this workflow has no nodes": "このワークフローにはノードがありません", + "this workflow is missing models": "このワークフローにはモデルが不足しています", + "threshold mask": "しきい値マスク", + "thumbnail preview": "サムネイルプレビュー", + "tiled": "タイル", + "time": "時間", + "time elapsed": "経過時間", + "timesteps range": "タイムステップ範囲", + "timesteps_range": "タイムステップの範囲", + "to finish setup": "してセットアップを完了", + "toggle app mode": "アプリモードを切り替え", + "toggle apps sidebar": "アプリサイドバーを切り替え", + "toggle assets sidebar": "アセットサイドバーの表示切り替え", + "toggle bottom panel": "下部パネルを切り替え", + "toggle essential bottom panel": "エッセンシャル下部パネルの切り替え", + "toggle focus mode": "フォーカスモードの切り替え", + "toggle job history": "ジョブ履歴を切り替え", + "toggle link visibility": "リンクの表示切り替え", + "toggle logs bottom panel": "ログ下部パネルの切り替え", + "toggle minimap": "ミニマップの切り替え", + "toggle model library sidebar": "モデルライブラリサイドバーの切り替え", + "toggle node library sidebar": "ノードライブラリサイドバーの切り替え", + "toggle promotion of hovered widget": "ホバー中のウィジェットの昇格を切り替え", + "toggle properties panel": "プロパティパネルの切り替え", + "toggle queue panel v2": "キューパネルV2を切り替え", + "toggle search box": "検索ボックスの切り替え", + "toggle terminal bottom panel": "ターミナル下部パネルの切り替え", + "toggle theme": "テーマを切り替え", + "toggle theme (dark/light)": "テーマを切り替え(ダーク/ライト)", + "toggle view controls bottom panel": "ビューコントロール下部パネルの切り替え", + "toggle workflows sidebar": "ワークフローサイドバーの切り替え", + "tolerance": "許容値", + "tomepatchmodel": "トメパッチモデル", + "tool": "ツール", + "tooltip delay": "ツールチップ遅延", + "top": "上", + "top custom node packs pre-installed": "人気カスタムノードパックをプリインストール", + "top up": "チャージ", + "top-up failed": "チャージに失敗しました", + "top-up verification timed out": "チャージの確認がタイムアウトしました", + "topaz image enhance": "Topaz画像強化", + "topbar": "トップバー", + "torch install mirror": "Torchインストールミラー", + "torchcompilemodel": "Torchコンパイルモデル", + "total": "合計", + "total cost": "合計コスト", + "total credits": "総クレジット", + "total due today": "本日のお支払い合計", + "total generation time": "生成時間合計", + "total generation time (longest first)": "生成時間合計(長い順)", + "total nodes": "合計ノード数", + "total yearly credits": "年間合計クレジット", + "train lora": "LoRA学習", + "training": "トレーニング", + "training…": "トレーニング中…", + "transfer color": "ColorTransfer", + "transform": "変換", + "transform splat": "スプラットの変換", + "translate": "移動", + "tree explorer": "ツリーエクスプローラー", + "tree explorer item padding": "ツリーエクスプローラーアイテムのパディング", + "trigger phrase": "トリガーフレーズ", + "trigger phrases": "トリガーフレーズ", + "trim audio duration": "オーディオの長さをトリミング", + "trim text": "トリム", + "triplecliploader": "トリプルCLIPを読み込む", + "triposplat conditioning": "TripoSplatコンディショニング", + "triposplat decode": "TripoSplat デコード", + "triposplat preprocess image": "TripoSplat 前処理画像", + "triposplat sampling preview": "TripoSplat サンプリングプレビュー", + "troubleshoot": "トラブルシューティング", + "troubleshooting guide": "トラブルシューティングガイド", + "truncate text": "テキストを切り詰める", + "try again": "再試行", + "try cloud for free": "クラウドを無料で試す", + "try it out": "試してみる", + "try this template": "このテンプレートを試す", + "try update": "アップデートを試す", + "tsr - temporal score rescaling": "TSR - 時間的スコアリスケーリング", + "unable to start comfyui desktop": "ComfyUIデスクトップを起動できません", + "unbookmark node": "お気に入りノードから削除", + "unclipconditioning": "unCLIP条件付け", + "undated": "日付なし", + "understood": "理解しました", + "undo": "元に戻す", + "unet": "U-Net", + "unet precision": "UNET精度", + "unetcrossattentionmultiply": "UNetクロス注意の乗算", + "unetselfattentionmultiply": "UNet自己注意の乗算", + "unettemporalattentionmultiply": "UNet時間的注意の乗算", + "unfavorite": "お気に入りを解除", + "unfavorite widget": "ウィジェットのお気に入りを解除", + "ungroup selected group nodes": "選択したグループノードのグループ解除", + "unified sidebar width": "サイドバーの幅を統一", + "uninstall": "アンインストール", + "uninstall selected": "選択したものをアンインストール", + "uninvite": "招待を取り消す", + "unknown": "不明", + "unknown error": "不明なエラー", + "unknown file": "不明なファイル", + "unknown input": "不明な入力", + "unknown pack": "不明なパック", + "unload models": "モデルのアンロード", + "unload models and execution cache": "モデルと実行キャッシュのアンロード", + "unlock aspect ratio": "アスペクト比を解除", + "unlock canvas": "キャンバスのロックを解除", + "unlock top-ups and more": "チャージや追加機能をアンロック", + "unpack subgraph": "サブグラフを展開", + "unpack the selected subgraph": "選択したサブグラフを展開", + "unpin": "ピンを解除", + "unresolved missing nodes": "未解決の欠落ノード", + "unresolved nodes": "未解決ノード", + "unsafe install location detected": "安全でないインストール場所が検出されました", + "unsaved changes": "未保存の変更", + "unsorted": "並び替えなし", + "unsupported node packs": "サポートされていないノードパック", + "untitled": "無題", + "up direction": "上方向", + "update": "更新", + "update all": "すべて更新", + "update available": "更新が利用可能", + "update comfyui": "ComfyUIをアップデート", + "update complete": "アップデート完了", + "update frontend": "フロントエンドを更新", + "update link": "リンクを更新", + "update password": "パスワードを更新", + "update requested": "更新が要求されました", + "update selected": "選択したものを更新", + "update started": "アップデート開始", + "updated": "更新済み", + "updated recently": "最近更新", + "updates available": "アップデートあり", + "updating all packages": "すべてのパッケージを更新中", + "updating comfyui desktop": "ComfyUIデスクトップの更新", + "upgrade": "アップグレード", + "upgrade plan": "プランをアップグレード", + "upgrade to add credits": "クレジット追加のためアップグレード", + "upgrade to creator": "Creatorにアップグレード", + "upgrade to unlock this feature": "アップグレードしてこの機能を利用する", + "upload": "アップロード", + "upload a video": "動画をアップロード", + "upload already in progress": "アップロードはすでに進行中です", + "upload an image": "画像をアップロード", + "upload background image": "背景画像をアップロード", + "upload before and after": "ビフォーアフターをアップロード", + "upload example image": "サンプル画像をアップロード", + "upload model help video": "モデルアップロードヘルプ動画", + "upload my workflow": "ワークフローをアップロード", + "upload texture": "テクスチャをアップロード", + "upload to comfyhub": "ComfyHubにアップロード", + "upscale image": "画像を拡大", + "upscale image (using model)": "モデルを使用して画像を拡大", + "upscale image by": "画像を拡大(指定サイズ)", + "upscale latent": "潜在を拡大", + "upscale latent by": "潜在を拡大(指定サイズ)", + "upscale_diffusion": "アップスケール拡散", + "upscale_model": "アップスケールモデル", + "upscaling": "アップスケーリング", + "usage hint": "使用ヒント", + "usage metrics": "使用状況のメトリクス", + "usd / mo": "USD / 月", + "usd / mo / member": "USD / 月 / メンバー", + "use classic cache system": "クラシックキャッシュシステムを使用する", + "use email instead": "メールアドレスを使用する", + "use from library": "ライブラリから使用", + "use legacy manager ui": "レガシーManager UIを使用", + "use legacy ui": "レガシーUIを使用する", + "use new menu": "新しいメニューを使用", + "user": "ユーザー", + "user avatar": "ユーザーアバター", + "user journey events": "ユーザージャーニーイベント", + "user not authenticated": "ユーザーが認証されていません", + "using from library": "ライブラリから使用中", + "usostylereference": "USOスタイルリファレンス", + "utilities": "ユーティリティ", + "vae decode": "VAEデコード", + "vae decode (tiled)": "VAEデコード(タイル)", + "vae decode audio": "VAEデコード音声", + "vae decode audio (tiled)": "VAEデコードオーディオ(タイル)", + "vae encode": "VAEエンコード", + "vae encode (for inpainting)": "VAEエンコード(インペイント用)", + "vae encode (tiled)": "VAEエンコード(タイル)", + "vae encode audio": "VAEエンコード音声", + "vae precision": "VAE精度", + "vaesave": "VAEを保存", + "validate workflows": "ワークフローを検証", + "validation": "検証", + "validation failed": "検証に失敗しました", + "version": "バージョン", + "version compatibility warning": "バージョン互換性の警告", + "vertical": "垂直", + "video": "ビデオ", + "video api": "動画API", + "video failed to load": "ビデオの読み込みに失敗しました", + "video linear cfg guidance": "ビデオ線形CFGガイダンス", + "video slice": "ビデオスライス", + "video thumbnail preview": "動画サムネイルプレビュー", + "video triangle cfg guidance": "ビデオ三角形CFGガイダンス", + "video_models": "ビデオモデル", + "videos": "動画", + "vidu image to video generation": "Vidu 画像からビデオ生成", + "vidu multi-frame video generation": "Vidu マルチフレーム動画生成", + "vidu q3 image-to-video generation": "Vidu Q3 画像から動画生成", + "vidu q3 start/end frame-to-video generation": "Vidu Q3 開始/終了フレームからの動画生成", + "vidu q3 text-to-video generation": "Vidu Q3 テキストから動画生成", + "vidu reference to video generation": "Vidu リファレンスからビデオ生成", + "vidu text to video generation": "Vidu テキストからビデオ生成", + "vidu video extension": "Vidu 動画拡張", + "vidu2 image-to-video generation": "Vidu2 画像から動画生成", + "vidu2 reference-to-video generation": "Vidu2 参照画像から動画生成", + "vidu2 start/end frame-to-video generation": "Vidu2 開始/終了フレームからの動画生成", + "vidu2 text-to-video generation": "Vidu2 テキストから動画生成", + "view all jobs": "すべてのジョブを見る", + "view all settings": "すべての設定を表示", + "view app": "アプリを表示", + "view available workflow tools": "利用可能なワークフローツールの表示", + "view controls": "ビューコントロール", + "view details": "詳細を表示", + "view enterprise": "エンタープライズを見る", + "view full policy": "完全なポリシーを見る", + "view in manager": "マネージャーで表示", + "view job": "ジョブを表示", + "view more details": "詳細を表示", + "view node graph": "ノードグラフを表示", + "view plans": "プランを見る", + "view pricing details": "料金詳細を見る", + "view usage history": "利用履歴を表示", + "view workspace": "ワークスペースを見る", + "virtual environment path": "仮想環境のパス", + "visualize face landmarks (mediapipe)": "MediaPipe Face Mesh 可視化", + "void quadmask preprocessor": "VOIDQuadmaskPreprocess", + "volume": "音量", + "voxel": "ボクセル", + "voxel to mesh": "VoxelToMesh", + "voxel to mesh (basic)": "VoxelToMeshBasic", + "vpscheduler": "VPスケジューラー", + "vram management mode": "VRAM管理モード", + "wan context windows (manual)": "WAN コンテキストウィンドウ(手動)", + "wan image to image": "Wan 画像から画像へ", + "wan image to video": "Wan 画像から動画へ", + "wan text to image": "Wan テキストから画像へ", + "wan_camera_embedding": "WANカメラ埋め込み", + "wanimagetovideo": "Wan画像からビデオへ", + "warning": "警告", + "wavespeed image upscale": "WaveSpeed画像高解像度化", + "web app": "ウェブアプリ", + "webcam": "ウェブカメラ", + "webcam capture": "ウェブカメラキャプチャ", + "welcome to comfyui": "ComfyUIへようこそ", + "white": "白", + "widget control mode": "ウィジェット制御モード", + "widget not visible": "ウィジェットが表示されていません", + "width": "幅", + "window": "ウィンドウ", + "window style": "ウィンドウスタイル", + "wireframe": "ワイヤーフレーム", + "workflow": "ワークフロー", + "workflow actions": "ワークフロー操作", + "workflow contents": "ワークフローの内容", + "workflow data is empty": "ワークフローデータが空です", + "workflow deleted": "ワークフローが削除されました", + "workflow description": "ワークフローの説明", + "workflow exported successfully": "ワークフローのエクスポートに成功しました", + "workflow name": "ワークフロー名", + "workflow opened in new tab": "ワークフローが新しいタブで開かれました", + "workflow overview": "ワークフロー概要", + "workflows": "ワークフロー", + "works anywhere, instantly": "どこでも即時利用可能", + "workspace": "ワークスペース", + "workspace created": "ワークスペースを作成しました", + "workspace created but setup incomplete": "ワークスペースは作成されましたが、セットアップが完了していません", + "workspace deleted": "ワークスペースを削除しました", + "workspace name": "ワークスペース名", + "workspace name*": "ワークスペース名*", + "workspace not found": "ワークスペースが見つかりません", + "workspace settings": "ワークスペース設定", + "workspace updated": "ワークスペースが更新されました", + "yearly": "年額", + "yellow": "黄色", + "you'll be redirected to": "リダイレクト先:", + "you're on the free plan": "無料プランをご利用中です", + "you're out of free credits": "無料クレジットがなくなりました", + "your credit balance": "あなたのクレジット残高", + "your description": "自己紹介", + "your device is not supported": "お使いのデバイスはサポートされていません", + "your subscription has been canceled": "サブスクリプションはキャンセルされました", + "your team workspaces": "あなたのチームワークスペース", + "your username (required)": "ユーザー名(必須)", + "zip download ready": "ZIPダウンロードの準備ができました", + "zoom controls": "ズームコントロール", + "zoom in": "拡大", + "zoom in/out": "ズームイン/アウト", + "zoom options": "ズームオプション", + "zoom out": "縮小", + "zoom to fit": "全体表示にズーム" +} diff --git a/.github/scripts/i18n/glossary/frontend/ko.json b/.github/scripts/i18n/glossary/frontend/ko.json new file mode 100644 index 000000000..40ca07963 --- /dev/null +++ b/.github/scripts/i18n/glossary/frontend/ko.json @@ -0,0 +1,2478 @@ +{ + "\"partner nodes\" credit balance": "\"파트너 노드\" 크레딧 잔액", + "(iterative)": "(반복)", + "(linked)": "(연결됨)", + "(requires page reload)": "(페이지 새로 고침 필요)", + "+ upload a cover": "+ 커버 업로드", + "+ upload a profile picture": "+ 프로필 사진 업로드", + "/ member": "/ 멤버", + "/ month": "USD / 월", + "1 hr": "1시간", + "1 output": "1개의 출력", + "20% discount": "20% 할인", + "30 min": "30분", + "3d assets / game assets": "3D 에셋 / 게임 에셋", + "3d model": "3D 모델", + "3d model loaded successfully": "3D 모델이 성공적으로 로드됨", + "3d viewer": "3D 뷰어 (베타)", + "3d_models": "3D 모델", + "3dviewer": "3D 뷰어", + "a → z": "가나다순", + "a-z": "알파벳순", + "about": "정보", + "about comfyui": "ComfyUI에 대하여", + "about data collection": "데이터 수집 안내", + "about non-whitelisted sites": "비허용 사이트에 대하여", + "accept terms": "약관 동의", + "access required": "접근 권한 필요", + "account initialized": "계정이 초기화됨", + "account settings": "계정 설정", + "action on link release (shift)": "링크 해제 시 동작 (Shift)", + "actions": "작업", + "activate layer": "레이어 활성화", + "active": "활성", + "active jobs": "활성 작업", + "activity": "활동", + "adaptive projected guidance": "적응형 투사 가이던스", + "add api credits": "API 크레딧 추가", + "add credit card": "신용카드 추가", + "add credits": "크레딧 추가", + "add group": "그룹 추가", + "add group for selected nodes": "선택한 노드 그룹 추가", + "add more credits": "크레딧 추가하기", + "add more credits to run": "실행을 위해 크레딧 추가하기", + "add more credits whenever": "언제든지 크레딧 추가 가능", + "add new keybinding": "새 키 바인딩 추가", + "add node": "노드 추가", + "add node filter condition": "노드 필터 조건 추가", + "add noise to image": "이미지에 노이즈 추가", + "add output examples": "출력 예시 추가하기", + "add secret": "시크릿 추가", + "add subgraph to library": "서브그래프를 라이브러리에 추가", + "add text prefix": "텍스트 접두사 추가", + "add text suffix": "텍스트 접미사 추가", + "add to bookmarks": "북마크에 추가", + "add to current workflow": "현재 워크플로우에 추가", + "added nodes follow the cursor": "추가된 노드가 커서를 따라감", + "additional info": "추가 정보", + "additional information": "추가 정보", + "additional tags": "추가 태그", + "addnoise": "노이즈 추가", + "adjust audio volume": "오디오 볼륨 조절", + "adjust brightness": "밝기 조정", + "adjust contrast": "명암 조정", + "adjust size": "크기 조정", + "adjustments": "조정", + "advanced": "고급", + "advanced inputs": "고급 입력", + "after": "이후", + "after delay": "지연 후", + "align selected to": "선택 항목 정렬", + "alignyourstepsscheduler": "AlignYourSteps 스케쥴러", + "all downloads completed": "모든 다운로드가 완료되었습니다", + "all exports completed": "모든 내보내기 완료", + "all extensions": "모든 확장 프로그램", + "all installed": "모두 설치됨", + "all keybindings reset to default": "모든 키 바인딩이 기본값으로 재설정되었습니다", + "all models": "모든 모델", + "all templates": "모든 템플릿", + "all up to date": "모두 최신 상태", + "all workflows": "모든 워크플로우", + "alpha": "알파", + "always shrink new nodes": "새 노드를 항상 축소", + "always snap to grid": "항상 그리드에 스냅", + "amount": "수량", + "amount (usd)": "결제 금액 (USD)", + "amount to pay in dollars": "결제할 금액(달러)", + "an error occurred": "오류가 발생했습니다", + "an unexpected error occurred": "예기치 않은 오류가 발생했습니다", + "an unknown error occurred": "알 수 없는 오류가 발생했습니다", + "api endpoints to run workflows": "워크플로우 실행용 API 엔드포인트", + "api key": "API 키", + "api key cleared": "API 키 삭제됨", + "api key stored": "API 키 저장됨", + "api keys & secrets": "API 키 및 시크릿", + "api node(s)": "API 노드(들)", + "api nodes": "API 노드", + "api pricing": "API 가격", + "app": "앱", + "app builder": "앱 빌더", + "app builder mode": "앱 빌더 모드", + "app has no outputs": "앱에 출력이 없습니다", + "app mode": "앱 모드", + "app mode in beta": "앱 모드 베타 - 피드백 보내기", + "appearance": "모양", + "apply": "적용", + "apply changes": "변경사항 적용", + "apply controlnet": "컨트롤넷 적용 (구형)", + "apply controlnet with vae": "컨트롤넷을 VAE와 함께 적용", + "apply morphology": "이미지 형태 변환", + "apply style model": "스타일 모델 적용", + "apply to whole image": "전체 이미지에 적용", + "apps": "앱", + "architecture": "아키텍처", + "area composition": "영역 구성", + "arrange": "정렬", + "arrange as grid": "그리드로 정렬", + "arrange horizontally": "가로로 정렬", + "arrange vertically": "세로로 정렬", + "arrangement spacing": "정렬 간격", + "arrow": "화살표", + "asset collection": "에셋 컬렉션", + "asset deleted successfully": "에셋이 성공적으로 삭제되었습니다", + "assets": "에셋", + "at least one": "최소 한 개", + "attention": "어텐션", + "attention_experiments": "어텐션 실험", + "audio": "오디오", + "audio / music": "오디오 / 음악", + "audio equalizer (3-band)": "오디오 이퀄라이저 (3-밴드)", + "audio failed to load": "오디오를 불러오지 못했습니다", + "audio progress": "오디오 진행률", + "audioencoderencode": "오디오 인코더 인코딩", + "author": "작성자", + "auto queue": "자동 실행 대기열", + "auto save": "자동 저장", + "auto save delay (ms)": "자동 저장 지연 시간 (ms)", + "auto-pan speed": "자동 팬 속도", + "automatic updates": "자동 업데이트", + "automatically check for updates": "자동 업데이트 확인", + "automatically load all model folders": "모든 모델 폴더 자동 로드", + "automatically update the value": "값을 자동으로 업데이트", + "back to all assets": "모든 에셋으로 돌아가기", + "back to all plans": "모든 플랜으로 돌아가기", + "back to login": "로그인으로 돌아가기", + "back to workflow": "워크플로우로 돌아가기", + "background": "배경", + "background color": "배경색", + "background removal": "배경 제거", + "background_removal": "배경 제거", + "banned": "차단됨", + "base image layer": "기본 이미지 레이어", + "base layer preview": "기본 레이어 미리보기", + "base model": "베이스 모델", + "base model unknown": "베이스 모델 알 수 없음", + "base models": "베이스 모델", + "basic guider": "기본 가이드", + "basic info": "기본 정보", + "basics": "기본", + "basicscheduler": "기본 스케줄러", + "batch": "배치", + "batch count": "배치 수", + "batch count limit": "배치 수 제한", + "batch image": "이미지 일괄 처리", + "batch images": "이미지 배치", + "batch latents": "latent 배치", + "batch masks": "마스크 배치", + "batch rename": "일괄 이름 변경", + "beeble switchx image edit": "Beeble SwitchX 이미지 편집", + "beeble switchx video edit": "Beeble SwitchX 비디오 편집", + "before": "이전", + "beginner — following tutorials": "막 시작한 단계 (튜토리얼 따라하는 중)", + "beta": "베타", + "betasamplingscheduler": "베타 샘플링 스케줄러", + "billed monthly": "매월 결제", + "black": "검정색", + "blend images": "이미지 혼합", + "blue": "파란색", + "blueprint": "블루프린트", + "blueprints": "블루프린트", + "blur image": "이미지 흐림", + "bookmark": "북마크", + "bookmark node": "즐겨찾는 노드", + "bookmarked": "북마크됨", + "bookmarks": "즐겨찾기", + "boolean": "논리값", + "bottom": "아래", + "bottom panel": "하단 패널", + "bounding box": "바운딩 박스", + "box": "상자", + "bria fibo image edit": "Bria 이미지 편집", + "bria remove image background": "Bria 이미지 배경 제거", + "bria remove video background": "Bria 비디오 배경 제거", + "bria remove video background (transparent)": "Bria 비디오 배경 제거 (투명)", + "bria video green screen": "Bria 비디오 그린 스크린", + "briefcase": "서류가방", + "brown": "갈색", + "browse": "찾아보기", + "browse assets": "에셋 탐색", + "browse example templates": "예제 템플릿 탐색", + "browse files": "파일 찾아보기", + "browse templates": "템플릿 탐색", + "brush": "브러시", + "brush adjustment": "브러시 조정", + "brush adjustment speed multiplier": "브러시 조정 속도 배수", + "brush settings": "브러시 설정", + "brush shape": "브러시 모양", + "build an app": "앱 만들기", + "build app": "앱 빌더로 진입", + "buy": "구매", + "buy now": "지금 구매", + "bypass": "실행 건너뛰기", + "bypass group nodes": "그룹 노드 우회", + "bypass/unbypass selected nodes": "선택한 노드 우회/우회 해제", + "bytedance create image asset": "ByteDance 이미지 에셋 생성", + "bytedance create video asset": "ByteDance 비디오 에셋 생성", + "bytedance first-last-frame to video": "ByteDance 첫-마지막-프레임에서 비디오 생성", + "bytedance image": "ByteDance 이미지", + "bytedance image to video": "ByteDance 이미지 투 비디오", + "bytedance reference images to video": "ByteDance 참조 이미지를 비디오로", + "bytedance text to video": "ByteDance 텍스트-비디오", + "cache": "캐시", + "calculating dimensions": "크기 계산 중", + "camera": "카메라", + "camera settings": "카메라 설정", + "camera type": "카메라 유형", + "camera_control": "카메라 제어", + "cancel": "취소", + "cancel all running jobs": "실행 중인 모든 작업 취소", + "cancel current run": "현재 실행 취소", + "cancel download": "다운로드 취소", + "cancel job": "작업 취소", + "cancel selection": "선택 취소", + "cancel subscription": "구독 취소", + "cancel this run": "이 실행 취소", + "canceled": "취소됨", + "cancelled": "취소됨", + "cannot create subgraph": "서브그래프를 생성할 수 없습니다", + "cannot delete installed blueprints": "설치된 블루프린트는 삭제할 수 없습니다", + "canny to image": "Canny → 이미지", + "canny to video": "Canny → 비디오", + "canvas": "캔버스", + "canvas background image": "캔버스 배경 이미지", + "canvas mode": "캔버스 모드", + "canvas navigation": "캔버스 탐색", + "canvas performance": "캔버스 성능", + "canvas toggle link visibility": "캔버스 링크 가시성 토글", + "canvas toggle lock": "캔버스 토글 잠금", + "canvas toggle minimap": "캔버스 미니맵 전환", + "canvas toolbar": "캔버스 툴바", + "canvas zoom speed": "캔버스 확대/축소 속도", + "capture": "캡처", + "card": "카드", + "categories": "카테고리", + "categorized": "원본 순서", + "category": "카테고리", + "center camera on model": "모델에 카메라 중앙 맞추기", + "cfg guider": "CFG 가이드", + "cfg override": "CFG 오버라이드", + "change hdri": "HDRI 변경", + "change keybinding": "키 바인딩 변경", + "chart": "차트", + "check for custom node updates": "커스텀 노드 업데이트 확인", + "check for updates": "업데이트 확인", + "checking media visibility…": "미디어 공개 여부 확인 중…", + "checkpoints": "체크포인트", + "choose a profile picture": "프로필 사진 선택", + "choose download servers manually": "다운로드 서버 수동 선택", + "choose file to upload": "업로드할 파일 선택", + "choose inputs": "입력 선택", + "choose installation location": "설치 위치 선택", + "choose outputs": "출력 선택", + "choose where to install comfyui": "ComfyUI를 설치할 위치를 선택하세요", + "choose your hardware setup": "하드웨어 설정을 선택하세요", + "circle": "원", + "clear": "지우기", + "clear all": "모두 지우기", + "clear filters": "필터 지우기", + "clear job history": "작업 대기열 기록 삭제", + "clear pending tasks": "보류 중인 작업 제거하기", + "clear queue": "대기열 비우기", + "clear queued": "대기열 비우기", + "clear recording": "녹화 지우기", + "clear url": "URL 지우기", + "clear workflow": "워크플로 비우기", + "click": "클릭", + "click to browse or": "클릭하여 탐색하거나", + "click to clear queue": "클릭하여 대기열 비우기", + "click to learn more →": "자세히 알아보기 →", + "click to reset zoom": "클릭하여 확대/축소 초기화", + "clip": "클립", + "clip set last layer": "CLIP 마지막 레이어 설정", + "clip text encode (prompt)": "CLIP 텍스트 인코딩 (프롬프트)", + "clip text encode for lumina2": "CLIP 텍스트 인코딩 (Lumina2)", + "clip vision encode": "CLIP_VISION 인코딩", + "clip_vision_output": "CLIP_VISION 출력", + "clipattentionmultiply": "CLIP 어텐션 곱하기", + "clipmergeadd": "CLIP 병합 (더하기)", + "clipmergesimple": "CLIP 병합 (단순)", + "clipmergesubtract": "CLIP 병합 (빼기)", + "clipsave": "CLIP 저장", + "clipspace": "클립스페이스", + "cliptextencodecontrolnet": "CLIP 텍스트 인코딩 (컨트롤넷)", + "cliptextencodeflux": "CLIP 텍스트 인코딩 (FLUX)", + "cliptextencodehunyuandit": "CLIP 텍스트 인코딩 (HunyuanDiT)", + "cliptextencodesd3": "CLIP 텍스트 인코딩 (SD3)", + "cliptextencodesdxl": "CLIP 텍스트 인코딩 (SDXL)", + "cliptextencodesdxlrefiner": "CLIP 텍스트 인코딩 (SDXL Refiner)", + "clone": "복제", + "close anyway": "그래도 닫기", + "close current workflow": "현재 워크플로 닫기", + "close dialog": "대화 상자 닫기", + "close other tabs": "다른 탭 닫기", + "close tab": "탭 닫기", + "close tabs to left": "왼쪽 탭 닫기", + "close tabs to right": "오른쪽 탭 닫기", + "cloud": "클라우드", + "cloud survey": "클라우드 설문", + "collapse": "접기", + "collapse all": "모두 접기", + "collapse/expand selected nodes": "선택한 노드 축소/확장", + "color": "색상", + "color palette": "색상 팔레트", + "color picker": "색상 선택기", + "color saturation and brightness": "색상 채도 및 밝기", + "color select settings": "색상 선택 설정", + "color selector": "색상 선택기", + "colors": "색상", + "combine": "결합", + "combine hooks [2]": "후크 결합 [2]", + "combine hooks [4]": "후크 결합 [4]", + "combine hooks [8]": "후크 결합 [8]", + "combine masks": "마스크 합성", + "combo": "콤보", + "comfy api key": "Comfy API 키", + "comfy blueprints": "Comfy 블루프린트", + "comfy cloud logo": "Comfy Cloud 로고", + "comfy nodes": "Comfy 노드", + "comfy-org discord": "Comfy-Org 디스코드", + "comfyorg logo": "ComfyOrg 로고", + "comfyui docs": "ComfyUI 문서", + "comfyui examples": "ComfyUI 예시", + "comfyui forum": "ComfyUI 포럼", + "comfyui issues": "ComfyUI 이슈 페이지", + "comfyui logo": "ComfyUI 로고", + "comfyui-manager upgrade required": "ComfyUI-Manager 업그레이드 필요", + "coming soon": "곧 출시 예정", + "command": "명령", + "community": "커뮤니티", + "compare images": "이미지 비교", + "compare text": "비교", + "compatible alternatives": "호환 가능한 대안", + "compatible base models": "호환 가능한 베이스 모델", + "completed": "완료됨", + "completed ✓": "완료됨 ✓", + "compositing": "합성", + "compute hours used": "사용한 컴퓨트 시간", + "compute hours used (most first)": "사용한 컴퓨트 시간(많은 순)", + "concatenate audio": "오디오 연결", + "concatenate text": "연결", + "cond pair": "조건 쌍", + "cond pair combine": "조건 쌍 (결합)", + "cond pair set default combine": "조건 쌍 (기본 결합 설정)", + "cond pair set props": "조건 쌍 (속성 설정)", + "cond pair set props combine": "조건 쌍 (속성 설정 및 결합)", + "cond set default combine": "조건 (기본 결합 설정)", + "cond set props": "조건 (속성 설정)", + "cond set props combine": "조건 (속성 설정 및 결합)", + "cond single": "단일 조건", + "conditioning": "조건화", + "conditioning (combine)": "조건 (결합)", + "conditioning (concat)": "조건 (연결)", + "conditioning (set area with percentage)": "조건 (비율로 영역 설정)", + "conditioning (set area)": "조건 (영역 설정)", + "conditioning (set mask)": "조건 (마스크 설정)", + "conditioningaverage": "조건 (평균)", + "conditioningsetareapercentagevideo": "비디오 조건 (비율로 영역 설정)", + "conditioningsetareastrength": "조건 (영역 강도 설정)", + "conditioningsettimesteprange": "조건 (타임스텝 범위 설정)", + "conditioningstableaudio": "Stable Audio 조건 설정", + "conditioningzeroout": "조건 (0으로 출력)", + "conference or event": "컨퍼런스 또는 이벤트", + "confirm": "확인", + "confirm model details": "모델 세부 정보 확인", + "confirm password": "비밀번호 확인", + "confirm selection": "선택 확인", + "confirm your payment": "결제 확인", + "confirm your plan change": "플랜 변경 확인", + "confirmed": "확인됨", + "conflicting": "충돌", + "conflicts": "충돌", + "connect an output": "출력 연결", + "connected": "연결됨", + "connection links": "연결 링크", + "connection taking too long": "연결 시간이 너무 오래 걸립니다", + "console": "콘솔", + "console logs": "콘솔 로그", + "contact our support": "고객 지원 문의", + "contact support": "고객 지원 문의", + "contact us": "문의하기", + "contains text": "포함", + "content": "콘텐츠", + "content blocked": "콘텐츠 차단됨", + "context menu": "컨텍스트 메뉴", + "context windows (manual)": "컨텍스트 윈도우 (수동)", + "continue": "계속", + "continue locally": "로컬에서 계속하기", + "continue to payment": "결제 계속하기", + "control after generate": "생성 후 제어", + "control before generate": "생성 전 제어", + "control_net": "컨트롤넷", + "controlnet": "컨트롤넷", + "controlnetinpaintingalimamaapply": "컨트롤넷 인페인팅 AliMama 적용", + "convert image color to mask": "이미지 색상을 마스크로 변환", + "convert image to mask": "이미지를 마스크로 변환", + "convert mask to image": "마스크를 이미지로 변환", + "convert number": "숫자 변환", + "convert selection to subgraph": "선택 영역을 서브그래프로 변환", + "convert text case": "대소문자 변환기", + "convert text to lowercase": "텍스트 소문자 변환", + "convert text to uppercase": "텍스트 대문자 변환", + "convert to subgraph": "서브그래프로 변환", + "converted to app workflow": "앱 워크플로우로 변환됨", + "copied": "복사됨", + "copied to clipboard": "클립보드에 복사됨", + "copy": "복사", + "copy (clipspace)": "복사 (Clipspace)", + "copy all": "모두 복사", + "copy error": "복사 오류", + "copy error message": "오류 메시지 복사", + "copy image": "이미지 복사", + "copy invite link": "초대 링크 복사", + "copy job id": "작업 ID 복사", + "copy link": "링크 복사", + "copy model name": "모델 이름 복사", + "copy selection": "선택 항목 복사", + "copy system info": "시스템 정보 복사", + "copy to clipboard": "클립보드에 복사", + "copy url": "URL 복사", + "cosmosimagetovideolatent": "Cosmos 비디오 생성 (이미지 → 비디오)", + "cost per run": "실행 당 비용", + "could not determine file type": "파일 유형을 결정할 수 없습니다", + "couldn't continue oauth sign-in": "OAuth 로그인 진행을 계속할 수 없습니다", + "cpu mode": "CPU 모드", + "create": "생성", + "create 3d file (from splat)": "3D 파일 생성(splat에서)", + "create a link": "링크 생성", + "create a new blank workflow": "새 빈 워크플로 만들기", + "create a new workspace": "새 워크스페이스 만들기", + "create a profile": "프로필 생성하기", + "create an account": "계정 생성", + "create camera info": "카메라 정보 생성", + "create group node": "그룹 노드 만들기", + "create hook keyframe": "후크 키프레임 생성", + "create hook keyframes from floats": "실수로 후크 키프레임 생성", + "create hook lora": "후크 LoRA 생성", + "create hook lora (mo)": "후크 LoRA 생성 (모델 전용)", + "create hook model as lora": "후크 모델을 LoRA로 생성", + "create link": "링크 생성", + "create list": "목록 만들기", + "create my profile": "내 프로필 생성하기", + "create new workspace": "새 워크스페이스 만들기", + "create profile": "프로필 생성", + "create solid mask": "단색 마스크", + "create video": "비디오 생성", + "create workspace": "워크스페이스 만들기", + "create your comfy hub profile": "Comfy Hub 프로필 생성", + "create your profile on comfyhub": "ComfyHub에서 프로필 생성하기", + "created by": "작성자", + "credits": "크레딧", + "credits added successfully": "크레딧이 성공적으로 추가되었습니다", + "credits available": "사용 가능한 크레딧", + "credits have been unified": "크레딧이 통합되었습니다", + "credits per dollar": "달러당 크레딧", + "credits to receive": "받을 크레딧", + "crop by bounding boxes": "CropByBBoxes", + "crop image": "이미지 자르기", + "crop image (center)": "중앙 자르기", + "crop image (random)": "무작위 이미지 자르기", + "crop latent": "잠재 데이터 자르기", + "crop mask": "마스크 자르기", + "crop preview": "자르기 미리보기", + "cross attention method": "교차 어텐션 방법", + "ctrl+up/down precision": "Ctrl+위/아래 정밀도", + "cuda device index to use": "사용할 CUDA 장치 번호", + "current plan": "현재 플랜", + "current user": "현재 사용자", + "current workflow": "현재 워크플로우", + "cursor size": "커서 크기", + "curve": "곡선", + "curve editor": "곡선 편집기", + "custom": "커스텀", + "custom background": "맞춤 배경", + "custom color palettes": "사용자 정의 색상 팔레트", + "custom combo": "사용자 지정 콤보", + "custom node configurations": "커스텀 노드 구성", + "custom nodes": "커스텀 노드", + "custom nodes manager": "커스텀 노드 관리자", + "custom workflows or pipelines": "맞춤형 워크플로우 또는 파이프라인", + "custom_sampling": "사용자 정의 샘플링", + "customize": "사용자 정의", + "customize folder": "폴더 사용자 정의", + "cyan": "청록색", + "dark": "다크", + "dashboard": "대시보드", + "dashboard workspace settings": "대시보드 워크스페이스 설정", + "debug": "디버그", + "decoding…": "디코딩 중…", + "decrease brush size in maskeditor": "마스크 편집기에서 브러시 크기 줄이기", + "decrement": "감소", + "decrement value": "값 감소", + "deduplicate images": "이미지 중복 제거", + "deduplicate subgraph node ids": "서브그래프 노드 ID 중복 제거", + "default banner": "기준 배너", + "default pip install mirror": "기본 pip 설치 미러", + "default preset": "기본 프리셋", + "delete": "삭제", + "delete all": "전체 삭제", + "delete asset": "에셋 삭제", + "delete audio file": "오디오 파일 삭제", + "delete blueprint": "블루프린트 삭제", + "delete failed": "삭제 실패", + "delete image": "이미지 삭제", + "delete preset": "프리셋 삭제", + "delete secret": "시크릿 삭제", + "delete selected items": "선택한 항목 삭제", + "delete workflow": "워크플로 삭제", + "delete workspace": "워크스페이스 삭제", + "deleted": "삭제됨", + "dependencies": "의존성", + "depr": "사용 중단", + "deprecated": "지원 중단됨", + "depth": "깊이", + "depth to image": "깊이 → 이미지", + "depth to video": "깊이 → 비디오", + "describe your workflow": "워크플로우 설명하기", + "description": "설명", + "description is required": "설명은 필수입니다", + "deselect all": "모두 선택 해제", + "desktop app settings": "데스크탑 앱 설정", + "desktop settings": "데스크탑 설정", + "desktop user guide": "데스크톱 사용자 가이드", + "details": "세부 정보", + "detect edges (canny)": "Canny 경계 필터", + "detect face landmarks (mediapipe)": "MediaPipe 얼굴 랜드마커", + "detected": "감지됨", + "detection": "감지", + "dev": "개발 전용", + "dev mode": "개발자 모드", + "devices": "장치", + "differential diffusion": "차등 확산", + "diffusersloader": "Diffusers 로드", + "directml device index": "DirectML 장치 번호", + "directories": "디렉토리", + "disable animations": "애니메이션 비활성화", + "disable ipex optimization": "IPEX 최적화 비활성화", + "disable node widget sliders": "노드 위젯 슬라이더 비활성화", + "disable selected": "선택 항목 비활성화", + "disable smart memory management": "스마트 메모리 관리 비활성화", + "disable third-party": "서드파티 비활성화", + "disable xformers optimization": "xFormers 최적화 비활성화", + "disablenoise": "노이즈 비활성화", + "discard and switch": "변경 사항 버리고 전환", + "disconnected": "연결 해제됨", + "discord / community": "Discord / 커뮤니티", + "dismiss": "닫기", + "display name": "표시 이름", + "distribute nodes": "노드 배치", + "dock to top": "상단에 도킹", + "docked job history": "도킹된 작업 기록", + "docked job history/queue panel": "에셋 사이드 패널에서 통합 작업 큐 사용", + "docs": "문서", + "documentation page": "문서 페이지", + "does not apply to litegraph": "기본 구현에만 적용됩니다.", + "don't ask again": "다시 묻지 않기", + "don't show again": "다시 표시하지 않기", + "don't show this again": "다시 보지 않기", + "double click interval (maximum)": "더블 클릭 간격 (최대)", + "download": "다운로드", + "download all": "모두 다운로드", + "download audio": "오디오 다운로드", + "download available": "다운로드 가능", + "download comfyui": "ComfyUI 다운로드", + "download complete": "다운로드 완료", + "download export": "내보내기 다운로드", + "download failed": "다운로드 실패", + "download git": "git 프로그램 다운로드", + "download image": "이미지 다운로드", + "download started": "다운로드 시작됨", + "download video": "비디오 다운로드", + "downloading": "다운로드 중", + "downloads": "다운로드", + "drag navigation": "드래그 내비게이션", + "draw bboxes": "BBoxes 그리기", + "draw face mask (mediapipe)": "MediaPipe 얼굴 마스크", + "drop 3d model to load": "3D 모델을 드롭하여 로드", + "drop a video here": "여기에 비디오를 드롭하세요", + "drop an image here": "여기에 이미지를 드롭하세요", + "drop your file or": "파일을 드롭하거나", + "dual cfg guider": "이중 CFG 가이드", + "dualcliploader": "이중 CLIP 로드", + "duplicate": "복제", + "duplicate current workflow": "현재 워크플로 복제", + "duplicate tab": "탭 복제", + "each month credits refill to": "매월 크레딧이 다시 충전됩니다", + "edge threshold": "에지 임계값", + "edit & run": "편집 및 실행", + "edit app": "앱 편집", + "edit control settings": "제어 설정 편집", + "edit display name": "표시 이름 편집", + "edit image": "이미지 편집", + "edit model reference method": "Flux Kontext 다중 참조 잠재 방법", + "edit or mask image": "이미지 편집 또는 마스크", + "edit secret": "시크릿 편집", + "edit subgraph": "서브그래프 편집", + "edit subgraph widgets": "서브그래프 위젯 편집", + "edit token weight": "토큰 가중치 편집", + "edit workspace details": "워크스페이스 정보 수정", + "education (student or educator)": "교육용(학생 또는 교육자)", + "elevenlabs instant voice clone": "ElevenLabs 즉시 음성 복제", + "elevenlabs speech to speech": "ElevenLabs 음성 변환", + "elevenlabs speech to text": "ElevenLabs 음성 → 텍스트", + "elevenlabs text to dialogue": "ElevenLabs 텍스트 → 대화", + "elevenlabs text to sound effects": "ElevenLabs 텍스트 → 효과음", + "elevenlabs text to speech": "ElevenLabs 텍스트 음성 변환", + "elevenlabs voice isolation": "ElevenLabs 음성 분리", + "elevenlabs voice selector": "ElevenLabs 음성 선택기", + "eligible for free tier": "무료 등급 가능", + "email": "이메일", + "email is required": "이메일은 필수 항목입니다", + "empty": "비어 있음", + "empty audio": "빈 오디오", + "empty canvas": "빈 캔버스", + "empty image": "빈 이미지", + "empty latent audio": "빈 잠재 오디오", + "empty latent image": "빈 잠재 이미지", + "emptychromaradiancelatentimage": "빈 색조 복사 잠재 이미지", + "emptycosmoslatentvideo": "빈 잠재 비디오 (Cosmos)", + "emptyhunyuanimagelatent": "빈 훈위안 이미지 잠재", + "emptyltxvlatentvideo": "빈 잠재 비디오 (LTXV)", + "emptymochilatentvideo": "빈 잠재 비디오 (Mochi)", + "emptysd3latentimage": "빈 잠재 이미지 (SD3)", + "enable 3d viewer": "3D 뷰어 활성화 (베타)", + "enable anyway": "그래도 활성화", + "enable cpu mode": "CPU 모드 활성화", + "enable node replacement suggestions": "노드 교체 제안 활성화", + "enable or disable pack": "팩 활성화 또는 비활성화", + "enable selected": "선택 항목 활성화", + "enable tooltips": "툴팁 활성화", + "encoding…": "인코딩 중…", + "end of billing period": "청구 기간 종료", + "enter": "입력", + "enter a description": "설명을 입력하세요", + "enter a username": "사용자 이름 입력", + "enter app mode": "앱 모드로 진입", + "enter base name": "기본 이름 입력", + "enter name": "이름 입력", + "enter new name": "새 이름 입력", + "enter new password": "새 비밀번호를 입력하세요", + "enter new value to change": "변경하려면 새 값을 입력하세요", + "enter node graph": "노드 그래프 진입", + "enter pypi mirror url": "PyPI 미러 URL 입력", + "enter python mirror url": "Python 미러 URL 입력", + "enter search aliases (comma separated)": "검색 별칭을 입력하세요 (쉼표로 구분)", + "enter subgraph": "서브그래프 진입", + "enter the filename": "파일 이름 입력", + "enter the person's email": "이메일을 입력하세요", + "enter the same password again": "동일한 비밀번호를 다시 입력하세요", + "enter workspace name": "워크스페이스 이름 입력", + "enter your api key": "API 키를 입력하세요", + "enter your email": "이메일을 입력하세요", + "enter your keybind": "단축키를 입력하세요", + "enter your name here": "여기에 이름을 입력하세요", + "enter your password": "비밀번호를 입력하세요", + "epsilon scaling": "엡실론 스케일링", + "eraser": "지우개", + "error": "오류", + "error checking for updates": "업데이트 확인 중 오류가 발생했습니다", + "error installing update": "업데이트 설치 중 오류가 발생했습니다", + "error loading image": "이미지 로드 오류", + "error loading model": "모델 로딩 오류", + "error loading video": "비디오 로드 오류", + "error log": "오류 로그", + "error logs": "오류 로그", + "error message": "오류 메시지", + "error message and stack trace": "오류 메시지 및 스택 추적", + "error system": "오류 시스템", + "error updating consent": "데이터 수집 동의 설정 업데이트 오류", + "errors": "오류", + "essential": "필수", + "essentials": "필수", + "estimated to finish in": "예상 완료 시간", + "estimated to start in": "예상 시작 시간", + "event type": "이벤트 유형", + "execute": "실행", + "execution": "실행", + "execution failed": "실행 실패", + "execution has been interrupted": "실행이 중단되었습니다", + "existing user": "기존 사용자", + "exit app builder": "앱 빌더 종료", + "exit app mode": "앱 모드 종료", + "exit builder": "빌더 종료", + "exit subgraph": "서브그래프 나가기", + "expand": "확장", + "expand all": "모두 펼치기", + "expand job queue": "작업 대기열 확장", + "expand node": "노드 확장", + "experimental": "실험적", + "expert — i help others": "전문가 (다른 사용자 도움)", + "expiry date": "만료 날짜", + "exponentialscheduler": "지수 스케줄러", + "export": "내보내기", + "export (api)": "내보내기 (API)", + "export all workflows": "모든 워크플로우 내보내기", + "export failed": "내보내기 실패", + "export model": "모델 내보내기", + "export preset": "프리셋 내보내기", + "export recording": "녹화 내보내기", + "export settings": "내보내기 설정", + "export workflow": "워크플로 내보내기", + "export workflow (api format)": "워크플로 내보내기 (API 형식)", + "exporting assets": "에셋 내보내는 중", + "extendintermediatesigmas": "시그마 배열 중간 구간 확장", + "extension": "확장", + "extension at risk": "위험한 확장", + "extension name": "확장 이름", + "extensions": "확장 프로그램", + "extract and save lora": "LoRA 추출 및 저장", + "extract frame": "프레임 추출", + "extract mesh from splat": "Splat에서 메시 추출", + "extract text": "정규식 추출", + "extract text from json": "JSON에서 문자열 추출", + "face_detection_model": "얼굴 감지 모델", + "failed": "실패", + "failed after": "실패 시점", + "failed to accept invite": "초대 수락에 실패했습니다", + "failed to apply texture": "텍스처 적용에 실패했습니다", + "failed to cancel subscription": "구독 취소에 실패했습니다", + "failed to copy job id": "작업 ID 복사 실패", + "failed to copy link": "링크 복사 실패", + "failed to copy to clipboard": "클립보드에 복사하지 못했습니다", + "failed to create node": "노드 생성에 실패했습니다", + "failed to create workspace": "워크스페이스 생성에 실패했습니다", + "failed to create zip export": "ZIP 내보내기 생성 실패", + "failed to delete asset": "에셋 삭제 실패", + "failed to delete selected assets": "선택한 에셋 삭제 실패", + "failed to delete workspace": "워크스페이스 삭제에 실패했습니다", + "failed to download file": "파일 다운로드에 실패했습니다", + "failed to download image": "이미지 다운로드 실패", + "failed to download video": "비디오 다운로드 실패", + "failed to export workflow": "워크플로우 내보내기에 실패했습니다", + "failed to fetch server logs": "서버 로그를 가져오는 데 실패했습니다", + "failed to import workflow assets": "워크플로우 에셋 가져오기에 실패했습니다", + "failed to initialize 3d viewer": "3D 뷰어 초기화 실패", + "failed to install": "설치 실패", + "failed to leave workspace": "워크스페이스 나가기에 실패했습니다", + "failed to load 3d model": "3D 모델을 로드하지 못함", + "failed to load background image": "배경 이미지를 로드하지 못함", + "failed to load hdri file": "HDRI 파일을 불러오지 못했습니다", + "failed to load outputs": "출력 불러오기 실패", + "failed to load shared workflow": "공유된 워크플로우를 불러오지 못했습니다", + "failed to load subgraph blueprints": "서브그래프 블루프린트 로드 실패", + "failed to load workspaces": "워크스페이스 불러오기에 실패했습니다", + "failed to open workflow": "워크플로우 열기에 실패했습니다", + "failed to queue": "대기열 추가 실패", + "failed to remove member": "멤버 제거에 실패했습니다", + "failed to replace nodes": "노드 교체 실패", + "failed to save workflow draft": "워크플로우 초안 저장에 실패했습니다", + "failed to select directory": "디렉토리 선택 실패", + "failed to set gizmo mode": "Gizmo 모드 설정에 실패했습니다", + "failed to store api key": "API 키 저장 실패", + "failed to switch workspace": "워크스페이스 전환에 실패했습니다", + "failed to toggle camera": "카메라 전환 실패", + "failed to toggle gizmo": "Gizmo 전환에 실패했습니다", + "failed to toggle grid": "그리드 전환 실패", + "failed to update background color": "배경색 업데이트 실패", + "failed to update background image": "배경 이미지 업데이트 실패", + "failed to update edge threshold": "에지 임계값 업데이트 실패", + "failed to update light intensity": "조명 세기 업데이트 실패", + "failed to update material mode": "머티리얼 모드 업데이트 실패", + "failed to update node definitions": "노드 정의 업데이트에 실패했습니다", + "failed to update up direction": "위쪽 방향 업데이트 실패", + "failed to update workspace": "워크스페이스 업데이트에 실패했습니다", + "failed to upload background image": "배경 이미지 업로드 실패", + "failed to validate path": "경로 유효성 검사 실패", + "false": "거짓", + "faqs": "자주 묻는 질문", + "favorite": "즐겨찾기", + "favorite widget": "위젯 즐겨찾기", + "favorited inputs": "즐겨찾는 입력", + "favorites": "즐겨찾기", + "feather mask": "마스크 가장자리 흐리게", + "feedback": "피드백", + "file": "파일", + "file formats": "파일 형식", + "file name": "파일 이름", + "file size": "파일 크기", + "file system information": "파일 시스템 정보", + "file upload failed": "파일 업로드에 실패했습니다", + "filename": "파일 이름", + "fill opacity": "채우기 불투명도", + "filter": "필터", + "filter by": "필터 기준", + "filter jobs": "작업 필터", + "filters": "필터", + "find issues": "문제 찾기", + "find on github": "GitHub에서 찾기", + "finish": "완료", + "finish publishing": "게시 완료하기", + "finished": "완료", + "fit group to contents": "그룹을 내용에 맞게 조정", + "fit to viewer": "뷰어에 맞추기", + "fit view": "보기 맞춤", + "fit view to selected nodes": "선택한 노드에 뷰 맞추기", + "fixed value": "고정 값", + "flagged": "검토 대상", + "flashvsr video upscale": "FlashVSR 비디오 업스케일", + "flip image": "이미지 뒤집기", + "flip latent": "잠재 데이터 연산 (뒤집기)", + "flipsigmas": "시그마 배열 뒤집기", + "float": "실수", + "floating": "플로팅", + "floats": "실수 배열", + "flux": "FLUX", + "flux erase image": "Flux 이미지 지우기", + "flux kv cache": "Flux KV 캐시", + "flux virtual try-on": "Flux 가상 피팅", + "fluxdisableguidance": "가이드 비활성화 (FLUX)", + "fluxguidance": "FLUX 가이드", + "fluxkontextimagescale": "Flux Kontext 이미지 스케일", + "focus mode": "집중 모드", + "folder": "폴더", + "for more help, visit the": "더 자세한 도움말은", + "for running commercial/proprietary models": "상용/독점 모델 실행용", + "force attention upcast": "어텐션 업캐스트 강제 적용", + "force channels-last memory format": "channels-last 메모리 형식 강제 적용", + "forgot password": "비밀번호 찾기", + "format text": "텍스트 포맷", + "frame interpolate": "프레임 보간", + "frame nodes": "노드 프레임", + "free": "무료", + "freeu_v2": "FreeU V2", + "friend or colleague": "친구 또는 동료", + "fullscreen": "전체 화면", + "gallery": "갤러리", + "gallery image": "갤러리 이미지", + "gallery thumbnail": "갤러리 썸네일", + "gemini input files": "Gemini 입력 파일", + "general": "일반", + "generate ltx2 prompt": "TextGenerateLTX2Prompt", + "generate text": "텍스트 생성", + "generated": "생성됨", + "generated assets": "생성된 에셋", + "generated on": "생성 일시", + "generating video…": "비디오 생성 중…", + "generating…": "생성 중…", + "generation failed": "생성 실패", + "generation stalled": "생성 중단됨", + "generation timed out": "생성 시간 초과", + "generation type": "생성 유형", + "geometry estimation": "기하 추정", + "get ic-lora parameters": "IC-LoRA 파라미터 가져오기", + "get image from batch": "배치에서 이미지 가져오기", + "get image size": "이미지 크기 가져오기", + "get one here": "여기에서 받기", + "get splat": "Splat 가져오기", + "get splat count": "Splat 개수 가져오기", + "get started": "시작하기", + "get started with a template": "템플릿으로 시작하기", + "get video components": "비디오 컴포넌트 추출", + "getting started": "시작하기", + "gitsscheduler": "GITS 스케줄러", + "give feedback": "피드백 보내기", + "gligen": "글리젠", + "gligentextboxapply": "GLIGEN 텍스트 박스 적용", + "global floating point precision": "전역 부동 소수점 정밀도", + "global settings": "글로벌 설정", + "global value": "글로벌 값", + "glsl shader": "GLSL 셰이더", + "go to node": "노드로 이동", + "google / search": "Google / 검색", + "google veo 2 video generation": "Google Veo2 비디오 생성", + "google veo 3 video generation": "Google Veo 3 비디오 생성", + "graph": "그래프", + "graph mode": "그래프 모드", + "graph navigation": "그래프 탐색", + "green": "초록색", + "grid spacing": "그리드 간격", + "grid view": "그리드 보기", + "grok image": "Grok 이미지", + "grok image edit": "Grok 이미지 편집", + "grok reference-to-video": "Grok 참조-비디오", + "grok video": "Grok 비디오", + "grok video edit": "Grok 비디오 편집", + "grok video extend": "Grok 비디오 확장", + "group": "그룹", + "group by": "그룹 기준", + "group by module source": "모듈 소스별로 그룹화", + "group by node category": "노드 카테고리별로 그룹화", + "group selected nodes": "선택한 노드 그룹화", + "group selected nodes padding": "선택된 노드 패딩", + "group settings": "그룹 설정", + "groups": "그룹", + "grow mask": "마스크 확장", + "guidance": "가이드", + "guider": "가이드", + "guiders": "가이드", + "hand": "손", + "happyhorse image to video": "HappyHorse 이미지 → 비디오", + "happyhorse reference to video": "HappyHorse 참조 → 비디오", + "happyhorse text to video": "HappyHorse 텍스트 → 비디오", + "happyhorse video edit": "HappyHorse 비디오 편집", + "hardness": "경도", + "hdri environment": "HDRI 환경", + "heart": "하트", + "height": "높이", + "help & support": "도움말 및 지원", + "help center": "도움말 센터", + "help center menu": "도움말 센터 메뉴", + "help fix this": "이 문제 해결에 도움을 주세요", + "help us improve": "개선에 도움을 주세요", + "hidden": "숨김", + "hidden / nested parameters": "숨김 / 중첩 매개변수", + "hide advanced": "고급 설정 숨기기", + "hide advanced inputs": "고급 입력 숨기기", + "hide built-in": "내장 숨기기", + "hide deprecated nodes": "사용 중단 노드 숨기기", + "hide dev-only nodes": "개발자 전용 노드 숨기기", + "hide experimental nodes": "실험적 노드 숨기기", + "hide features": "기능 숨기기", + "hide input": "입력 숨기기", + "hide left panel": "왼쪽 패널 숨기기", + "hide links": "링크 숨기기", + "hide menu": "메뉴 숨기기", + "hide minimap": "미니맵 숨기기", + "hide referencing nodes": "참조 노드 숨기기", + "hide right panel": "오른쪽 패널 숨기기", + "hide subgraph nodes": "서브그래프 노드 숨기기", + "histogram": "히스토그램", + "hitpaw general image enhance": "HitPaw 일반 이미지 향상", + "hitpaw video enhance": "HitPaw 비디오 향상", + "hook_keyframes": "후크 키프레임", + "hooks": "후크", + "horizontal": "수평", + "hue": "색상(Hue)", + "hunyuan latent refiner": "HunyuanRefinerLatent", + "hypertile": "하이퍼 타일", + "icon": "아이콘", + "ideogram 4 scheduler": "Ideogram 4 스케줄러", + "image": "이미지", + "image api": "이미지 API", + "image compare": "이미지 비교", + "image comparison": "이미지 비교", + "image composite masked": "마스크된 이미지 합성", + "image does not exist": "이미지가 존재하지 않습니다", + "image failed to load": "이미지를 로드하지 못했습니다.", + "image gallery": "이미지 갤러리", + "image histogram": "이미지 히스토그램", + "image layer": "이미지 레이어", + "image not loaded": "이미지 불러오기 실패", + "image preview": "이미지 미리보기", + "image rgb to yuv": "ImageRGBToYUV", + "image to 3d model": "이미지 → 3D 모델", + "image to image": "이미지 → 이미지", + "image to video": "이미지 → 비디오", + "image url": "이미지 URL", + "image yuv to rgb": "ImageYUVToRGB", + "imagecompare": "이미지 비교", + "imageonlycheckpointsave": "이미지 전용 체크포인트 저장", + "images": "이미지", + "import": "가져오기", + "import a model": "모델 가져오기", + "import a model from civitai": "Civitai에서 모델 가져오기", + "import another": "다른 항목 가져오기", + "import anyway": "그래도 가져오기", + "import assets & open workflow": "에셋 가져오기 및 워크플로우 열기", + "import failed": "가져오기 실패", + "import failed extensions": "가져오기 실패한 확장", + "import keybinding preset": "키 바인딩 프리셋 가져오기", + "import not supported": "가져오기 지원되지 않음", + "import preset": "프리셋 가져오기", + "import your own loras": "나만의 LoRA 가져오기", + "imported": "가져옴", + "imported assets": "가져온 에셋", + "importing models": "모델 가져오는 중", + "in library": "라이브러리에 있음", + "in progress": "진행 중", + "in workflow": "워크플로 내", + "inbox": "받은 편지함", + "increase brush size in maskeditor": "마스크 편집기에서 브러시 크기 늘리기", + "increment": "증가", + "increment value": "값 증가", + "inference": "추론", + "info": "정보", + "initial background color": "초기 배경색", + "initial camera type": "초기 카메라 타입", + "initial grid visibility": "초기 그리드 표시", + "initial light intensity": "초기 조명 강도", + "initializing - almost ready": "초기화 중 - 거의 준비됨", + "inpaint": "인페인팅", + "inpaint image": "이미지 인페인팅", + "inpaintmodelconditioning": "인페인팅 모델 조건 설정", + "input": "입력", + "input directory": "입력 디렉토리", + "input image couldn't be loaded": "입력 이미지 불러오기 실패", + "input out of range": "입력값 범위 초과", + "inputs": "입력", + "inputs will show up here": "입력값이 여기에 표시됩니다", + "insert": "삽입", + "insert all assets as nodes": "모든 에셋을 노드로 삽입", + "insert as node in workflow": "워크플로우에 노드로 삽입", + "inspect asset": "에셋 검사", + "install": "설치", + "install all": "모든 누락된 노드 설치", + "install anyway": "그래도 설치", + "install error": "설치 오류", + "install location": "설치 위치", + "install missing custom nodes": "누락된 커스텀 노드 설치", + "install missing nodes": "누락된 노드 설치", + "install node pack": "노드 팩 설치", + "install required": "설치 필요", + "install selected": "선택한 항목 설치", + "installation queue": "설치 대기열", + "installation required": "설치 필요", + "installed": "설치됨", + "installing": "설치 중", + "installing comfyui": "ComfyUI 설치 중", + "instant": "즉시", + "instructpix2pix": "InstructPix2Pix", + "instructpixtopixconditioning": "InstructPixToPix 조건 설정", + "insufficient credits": "크레딧 부족", + "int": "정수", + "intensity": "강도", + "intermediate — comfortable with basics": "기본 기능에 익숙함", + "interrupt": "중단", + "interrupt all running jobs": "모든 실행 중인 작업 중단", + "interrupted": "중단됨", + "invalid api key": "유효하지 않은 API 키", + "invalid asset": "잘못된 에셋", + "invalid clip input": "잘못된 CLIP 입력", + "invalid connection": "잘못된 연결", + "invalid dialog": "잘못된 대화상자", + "invalid email address": "유효하지 않은 이메일 주소", + "invalid filename": "잘못된 파일명", + "invalid input": "잘못된 입력", + "invalid workflow": "잘못된 워크플로우", + "invalid workflow request": "잘못된 워크플로우 요청", + "invert": "반전", + "invert image colors": "이미지 반전", + "invert mask": "마스크 반전", + "invite": "초대", + "invite accepted": "초대 수락됨", + "invite date": "초대 날짜", + "invite member": "멤버 초대", + "invite up to": "최대 {count}명 초대", + "invoice history": "청구서 내역", + "items copied to clipboard": "항목이 클립보드에 복사되었습니다", + "job": "작업", + "job completed": "작업 완료됨", + "job details": "작업 세부 정보", + "job failed": "작업 실패", + "job history": "작업 기록", + "job id": "작업 ID", + "job id copied to clipboard": "작업 ID가 클립보드에 복사됨", + "job queue": "작업 대기열", + "job queued": "작업이 대기열에 추가됨", + "job queuing": "작업 대기 중", + "join audio channels": "오디오 채널 합치기", + "join date": "가입 날짜", + "join image with alpha": "알파와 함께 이미지 결합", + "karrasscheduler": "Karras 스케줄러", + "keep original order": "원래 순서를 유지", + "keep subscription": "구독 유지", + "keybinding": "키 바인딩", + "keybinding already exists on": "단축키가 이미 존재합니다", + "keybinding preset imported": "키 바인딩 프리셋이 가져와졌습니다", + "keybindings": "단축키", + "keyboard shortcuts": "키보드 단축키", + "kling camera controls": "Kling 카메라 컨트롤", + "kling dual character video effects": "Kling 듀얼 캐릭터 비디오 효과", + "kling image(first frame) to video": "Kling 비디오 생성 (이미지 → 비디오)", + "kling motion control": "Kling 모션 컨트롤", + "kling start-end frame to video": "Kling 비디오 생성 (시작-끝 프레임)", + "kling text to video": "Kling 비디오 생성 (텍스트 → 비디오)", + "kling video effects": "Kling 비디오 효과", + "kling video extend": "Kling 비디오 확장", + "kling virtual try on": "Kling 가상 착용", + "krea 2 image": "Krea 2 이미지", + "krea 2 style reference": "Krea 2 스타일 참조", + "ksampler (advanced)": "고급 KSampler", + "ksamplerselect": "KSampler (선택)", + "language": "언어", + "laplacescheduler": "라플라스 스케줄러", + "last updated": "마지막 업데이트", + "latent": "잠재 데이터", + "latent blend": "잠재 데이터 연산 (혼합)", + "latent composite": "잠재 데이터 합성 (위치 기반)", + "latent from batch": "배치에서 잠재 데이터 가져오기", + "latent_operation": "잠재 연산", + "latentadd": "잠재 데이터 연산 (더하기)", + "latentapplyoperation": "잠재 데이터 연산 (연산 적용)", + "latentapplyoperationcfg": "잠재 데이터 CFG 연산 (연산 적용)", + "latentbatch": "잠재 데이터 배치 연결", + "latentbatchseedbehavior": "잠재 데이터 배치 시드 동작", + "latentcompositemasked": "잠재 데이터 합성 (마스크 기반)", + "latentinterpolate": "잠재 데이터 연산 (보간)", + "latentmultiply": "잠재 데이터 연산 (곱하기)", + "latentoperationsharpen": "잠재 데이터 연산 (선명화)", + "latentoperationtonemapreinhard": "잠재 데이터 연산 (톤맵 레인하르트)", + "latentsubtract": "잠재 데이터 연산 (빼기)", + "later": "나중에", + "latest": "최신", + "layers": "레이어", + "learn about cloud": "클라우드 알아보기", + "learn more": "더 알아보기", + "learn more about data collection": "데이터 수집에 대해 더 알아보기", + "leave": "나가기", + "leave workspace": "워크스페이스 나가기", + "leaves value unchanged": "값을 변경하지 않습니다", + "left": "왼쪽", + "left mouse click behavior": "왼쪽 마우스 클릭 동작", + "left workspace": "워크스페이스에서 나감", + "legacy": "레거시", + "license": "라이선스", + "light": "라이트", + "light adjustment increment": "조명 조정 단위", + "light intensity": "조명 강도", + "light intensity maximum": "최대 조명 강도", + "light intensity minimum": "최소 조명 강도", + "light settings": "조명 설정", + "linear": "직선", + "lineart": "라인아트", + "link": "링크", + "link midpoint markers": "링크 중간점 마커", + "link release": "링크 해제", + "link render mode": "링크 렌더 모드", + "link shape": "링크 모양", + "link to": "연결 대상", + "lipsync": "립싱크", + "list view": "리스트 보기", + "lite graph": "LiteGraph", + "litegraph": "litegraph (구버전)", + "live preview": "실시간 미리보기", + "live preview method": "라이브 미리보기 방식", + "live sampling preview": "라이브 샘플링 미리보기", + "live selection": "실시간 선택", + "llms": "LLM", + "load 3d & animation": "3D 불러오기", + "load 3d model": "3D 모델 불러오기", + "load a template": "템플릿 불러오기", + "load all folders": "모든 폴더 로드", + "load audio": "오디오 불러오기", + "load audio encoder": "오디오 인코더 로더", + "load background removal model": "배경 제거 모델 불러오기", + "load checkpoint": "체크포인트 로드", + "load checkpoint with config": "구성으로 체크포인트 로드 (지원 중단)", + "load clip": "CLIP 로드", + "load clip vision": "CLIP_VISION 로드", + "load controlnet model": "컨트롤넷 모델 로드", + "load controlnet model (diff)": "컨트롤넷 모델 로드 (차이)", + "load default workflow": "기본 워크플로 불러오기", + "load diffusion model": "확산 모델 로드", + "load face detection model (mediapipe)": "MediaPipe 얼굴 랜드마커 불러오기", + "load frame interpolation model": "프레임 보간 모델 불러오기", + "load gligen model": "GLIGEN 로드", + "load hypernetwork": "하이퍼네트워크 로드", + "load image": "이미지 불러오기", + "load image (as mask)": "마스크 이미지 로드", + "load image (from folder)": "폴더에서 이미지 데이터셋 불러오기", + "load image (from outputs)": "이미지 로드 (출력에서)", + "load image-text (from folder)": "폴더에서 이미지 및 텍스트 데이터셋 불러오기", + "load latent upscale model": "Latent 업스케일 모델 불러오기", + "load lora": "LoRA 로드 (모델 전용)", + "load lora (bypass) (for debugging)": "LoRA 불러오기 (바이패스) (디버깅용)", + "load lora (model and clip)": "LoRA 로드", + "load lora model": "LoRA 모델 로드", + "load ltxv audio vae": "LTXV 오디오 VAE 로더", + "load moge model": "MoGe 모델 불러오기", + "load optical flow model": "광학 흐름 모델 불러오기", + "load style": "스타일 불러오기 (LoRA)", + "load style model": "스타일 모델 로드", + "load training dataset": "학습 데이터셋 불러오기", + "load unclip checkpoint": "unCLIP 체크포인트 로드", + "load upscale model": "업스케일 모델 로드", + "load vae": "VAE 로드", + "load video": "비디오 불러오기", + "load workflow": "워크플로 로드", + "load3d_camera": "3D 카메라 불러오기", + "load3d_model_info": "3D 모델 정보 불러오기", + "load_3d": "3D 로드", + "loaders": "로더", + "loading": "로딩 중", + "loading asset": "에셋 로드 중", + "loading authorization request…": "인증 요청을 불러오는 중…", + "loading background image": "배경 이미지 불러오는 중", + "loading error": "로딩 오류", + "loading human interface": "마무리 중...", + "loading…": "불러오는 중…", + "loadlatent": "잠재 데이터 로드", + "locale": "언어 설정", + "locate node on canvas": "캔버스에서 노드 찾기", + "lock aspect ratio": "비율 고정", + "lock canvas": "캔버스 잠금", + "log in to your account": "계정에 로그인", + "log in with github": "Github로 로그인", + "log in with google": "구글로 로그인", + "log out": "로그아웃", + "logging verbosity level": "로그 출력 수준", + "logic": "로직", + "login": "로그인", + "login failed": "로그인 실패", + "login successful": "로그인 성공", + "logout": "로그아웃", + "logs": "로그", + "lotusconditioning": "Lotus 조건 설정", + "ltxv audio text encoder loader": "LTXV 오디오 텍스트 인코더 로더", + "ltxv audio vae decode": "LTXV 오디오 VAE 디코드", + "ltxv audio vae encode": "LTXV 오디오 VAE 인코드", + "ltxv empty latent audio": "LTXV 빈 latent 오디오", + "ltxv image to video": "LTXV 이미지 투 비디오", + "ltxv preprocess": "LTXV 전처리", + "ltxv text to video": "LTXV 텍스트 투 비디오", + "ltxvaddguide": "LTXV 가이드 추가", + "ltxvconditioning": "LTXV 조건 설정", + "ltxvcropguides": "LTXV 가이드 자르기", + "ltxvimgtovideo": "LTXV 비디오 생성 (이미지 → 비디오)", + "ltxvscheduler": "LTXV 스케줄러", + "luma concepts": "Luma 컨셉", + "luma image to image": "Luma 이미지 생성 (이미지 → 이미지)", + "luma image to video": "Luma 이미지 → 비디오", + "luma reference": "Luma 이미지 참조", + "luma text to image": "Luma 이미지 생성 (텍스트 → 이미지)", + "luma text to video": "Luma 텍스트 투 비디오", + "luma uni-1 image": "Luma UNI-1 이미지", + "luma uni-1 image edit": "Luma UNI-1 이미지 편집", + "luma_concepts": "Luma 컨셉", + "luma_ref": "Luma 참조", + "macos (m1 or later)": "MacOS (M1 이상)", + "magnific image relight": "Magnific 이미지 리라이트", + "magnific image skin enhancer": "Magnific 이미지 피부 보정", + "magnific image style transfer": "Magnific 이미지 스타일 전송", + "magnific image upscale (creative)": "Magnific 이미지 업스케일 (Creative)", + "magnific image upscale (precise v2)": "Magnific 이미지 업스케일 (Precise V2)", + "maintenance": "유지 보수", + "make image grid": "이미지 그리드", + "make training dataset": "학습 데이터셋 만들기", + "manage": "관리", + "manage extensions": "확장 프로그램 관리", + "manage group nodes": "그룹 노드 관리", + "manage payment": "결제 관리", + "manage plan": "플랜 관리", + "manage shortcuts": "단축키 관리", + "manage subscription": "구독 관리", + "manager": "매니저", + "manager extension": "관리자 확장", + "manager menu": "매니저 메뉴(구버전)", + "manual configuration": "수동 구성", + "manual setup": "수동 설정", + "manually configure python venv": "Python venv를 수동으로 구성", + "markdown": "마크다운", + "mask": "마스크", + "mask blending options": "마스크 혼합 옵션", + "mask editor": "마스크 편집기", + "mask layer": "마스크 레이어", + "mask opacity": "마스크 불투명도", + "mask tolerance": "마스크 허용치", + "match text": "정규식 일치", + "material mode": "재질 모드", + "math expression": "수학식", + "max run duration": "각 워크플로우 실행 최대 시간", + "maximize dialog": "대화 상자 최대화", + "maximum fps": "최대 FPS", + "maximum selection limit reached": "최대 선택 한도에 도달했습니다", + "maximum upload size (mb)": "최대 업로드 크기 (MB)", + "media input missing": "미디어 입력 누락", + "member": "멤버", + "member removed": "멤버가 제거되었습니다", + "memory": "메모리", + "menu": "메뉴", + "merge audio": "오디오 병합", + "merge image lists": "이미지 리스트 병합", + "merge splats": "Splats 병합", + "merge text lists": "텍스트 리스트 병합", + "mesh": "메시", + "message support": "지원 문의", + "method": "방법", + "method used for latent previews": "잠재 데이터 미리보기 방법", + "metrics disabled": "데이터 수집 비활성화", + "metrics enabled": "데이터 수집 활성화", + "microphone permission denied": "마이크 권한이 거부되었습니다", + "migrate": "이전(migrate)", + "migrate from existing installation": "기존 설치에서 마이그레이션", + "migration": "마이그레이션", + "minimap": "미니맵", + "minimax hailuo video": "MiniMax Hailuo 비디오", + "minimax image to video": "MiniMax 이미지에서 비디오로", + "minimax text to video": "MiniMax 텍스트 투 비디오", + "minimize node": "노드 최소화", + "mirror horizontal": "수평 반전", + "mirror horizontal in maskeditor": "마스크 편집기에서 수평 반전", + "mirror settings": "미러 URL 설정", + "mirror vertical": "수직 반전", + "mirror vertical in maskeditor": "마스크 편집기에서 수직 반전", + "missing": "누락됨", + "missing connection": "연결 누락", + "missing inputs": "입력 누락", + "missing media inputs": "누락된 미디어 입력", + "missing models": "누락된 모델", + "missing node packs": "누락된 노드 팩", + "missing node type": "노드 타입 없음", + "missing nodes": "누락된 노드", + "model": "모델", + "model access required": "모델 접근 필요", + "model description": "모델 설명", + "model download failed": "모델 다운로드 실패", + "model filter": "모델 필터", + "model info": "모델 정보", + "model library": "모델 라이브러리", + "model name": "모델 이름", + "model providers": "모델 공급자", + "model settings": "모델 설정", + "model size (low to high)": "모델 크기 (낮음에서 높음 순)", + "model tagging": "모델 태깅", + "model type": "모델 유형", + "model_merging": "모델 병합", + "model_patch": "모델 패치", + "model_specific": "모델 특정", + "model_task_id": "모델 작업 ID", + "modelmergeadd": "모델 병합 (더하기)", + "modelmergeauraflow": "모델 병합 (AuraFlow)", + "modelmergeblocks": "모델 병합 (블록)", + "modelmergecosmos14b": "모델 병합 (Cosmos 14B)", + "modelmergecosmos7b": "모델 병합 (Cosmos 7B)", + "modelmergeflux1": "모델 병합 (FLUX.1)", + "modelmergeltxv": "모델 병합 (LTXV)", + "modelmergemochipreview": "모델 병합 (Mochi Preview)", + "modelmergesd1": "모델 병합 (SD1)", + "modelmergesd2": "모델 병합 (SD2)", + "modelmergesd35_large": "모델 병합 (SD35 Large)", + "modelmergesd3_2b": "모델 병합 (SD3 2B)", + "modelmergesdxl": "모델 병합 (SDXL)", + "modelmergesimple": "모델 병합 (단순)", + "modelmergesubtract": "모델 병합 (빼기)", + "modelmergewan2_1": "모델 병합 (WAN2.1)", + "modelpatchloader": "모델 패치 로더", + "models": "모델", + "models aren't available on cloud": "모델이 클라우드에서 사용할 수 없습니다", + "models ready to use": "즉시 사용 가능한 모델", + "modelsamplingauraflow": "모델 샘플링 (AuraFlow)", + "modelsamplingcontinuousedm": "모델 샘플링 (연속 EDM)", + "modelsamplingcontinuousv": "모델 샘플링 (연속 V)", + "modelsamplingdiscrete": "모델 샘플링 (이산)", + "modelsamplingflux": "모델 샘플링 (FLUX)", + "modelsamplingltxv": "모델 샘플링 (LTXV)", + "modelsamplingsd3": "모델 샘플링 (SD3)", + "modelsamplingstablecascade": "모델 샘플링 (StableCascade)", + "modelsave": "모델 저장", + "modify keybinding": "단축키 수정", + "module": "모듈", + "monthly": "월간", + "monthly credit bonus": "월간 크레딧 보너스", + "monthly credits": "월간 크레딧", + "monthly credits / member": "월별 크레딧 / 멤버", + "more details on this template": "이 템플릿에 대한 자세한 정보", + "more options": "추가 옵션", + "more workflows": "더 많은 워크플로", + "most popular": "가장 인기 있는", + "most recent": "최신순", + "most relevant": "가장 관련성 높은", + "mouse wheel scroll": "마우스 휠 스크롤", + "move selected nodes down": "선택한 노드 아래로 이동", + "move selected nodes left": "선택한 노드 왼쪽으로 이동", + "move selected nodes right": "선택한 노드 오른쪽으로 이동", + "move selected nodes up": "선택한 노드 위로 이동", + "multi-select dropdown": "다중 선택 드롭다운", + "multigpu": "멀티GPU", + "multigpu cfg split": "MultiGPU CFG 분할", + "multiple assets selected": "여러 자산이 선택됨", + "music generation": "음악 생성", + "mute": "음소거", + "mute/unmute selected nodes": "선택한 노드 활성화/비활성화", + "my account settings": "사용자 설정", + "my blueprints": "내 블루프린트", + "my models": "내 모델", + "name is required": "이름은 필수 항목입니다", + "nano banana (google gemini image)": "Google Gemini 이미지", + "native app": "네이티브 앱", + "navigation mode": "캔버스 내비게이션 모드", + "negative": "네거티브", + "network": "네트워크", + "new blank workflow": "새로운 빈 워크플로", + "new folder": "새 폴더", + "new node library design": "새로운 노드 라이브러리 디자인", + "new user": "새 사용자", + "new workspace": "새 워크스페이스", + "new — never used it": "ComfyUI 처음 사용 (이전에 사용한 적 없음)", + "newest": "최신", + "newsletter or blog": "뉴스레터 또는 블로그", + "next billing cycle": "다음 결제 주기", + "next image": "다음 이미지", + "next month invoice": "다음 달 청구서", + "next opened workflow": "다음 열린 워크플로", + "next slide": "다음 슬라이드", + "nightly": "최신 테스트 버전(nightly)", + "no 3d scene to export": "내보낼 3D 장면이 없습니다", + "no action": "작업 없음", + "no active jobs": "활성 작업 없음", + "no additional tags": "추가 태그 없음", + "no assets found": "에셋을 찾을 수 없습니다", + "no audio recorded": "녹음된 오디오가 없습니다", + "no bookmarks yet": "아직 즐겨찾기가 없습니다", + "no color": "색 없음", + "no conflicts detected": "충돌 없음", + "no description available": "설명이 없습니다", + "no description set": "설정된 설명 없음", + "no errors": "오류 없음", + "no extensions in workflow": "워크플로에 확장 프로그램 없음", + "no extensions installed": "설치된 확장 프로그램 없음", + "no favorited inputs": "즐겨찾는 입력 없음", + "no files found": "파일을 찾을 수 없음", + "no generated files found": "생성된 파일을 찾을 수 없음", + "no images to compare": "비교할 이미지가 없습니다", + "no imported files found": "가져온 파일을 찾을 수 없음", + "no input image connected": "입력 이미지가 연결되지 않았습니다", + "no inputs": "입력 없음", + "no inputs added yet": "아직 입력값이 추가되지 않았습니다", + "no items match your search": "검색 결과가 없습니다", + "no keybinding": "키 바인딩 없음", + "no members": "멤버 없음", + "no missing nodes": "누락된 노드 없음", + "no nodes": "노드 없음", + "no nodes found": "노드를 찾을 수 없습니다", + "no output nodes added yet": "아직 출력 노드가 추가되지 않았습니다", + "no output nodes selected": "선택된 출력 노드가 없습니다", + "no outputs added yet": "아직 출력이 추가되지 않았습니다", + "no pending invites": "대기 중인 초대 없음", + "no recent releases": "최근 릴리즈 없음", + "no results": "결과 없음", + "no results found": "결과를 찾을 수 없습니다.", + "no stacktrace available": "스택 추적을 사용할 수 없습니다", + "no tasks found": "작업을 찾을 수 없습니다.", + "no templates found": "템플릿을 찾을 수 없습니다", + "no templates to export": "내보낼 템플릿이 없습니다", + "no update found": "업데이트를 찾을 수 없습니다", + "no valid import source detected": "유효한 가져오기 소스를 감지하지 못했습니다", + "node": "노드", + "node color": "노드 색상", + "node colors": "노드 색상", + "node content error": "노드 콘텐츠 오류", + "node definitions updated": "노드 정의가 업데이트되었습니다", + "node graph": "노드 그래프", + "node has no inputs": "노드에 입력이 없습니다", + "node header error": "노드 헤더 오류", + "node id badge mode": "노드 ID 배지 모드", + "node info": "노드 정보", + "node library": "노드 라이브러리", + "node life cycle badge mode": "노드 생명 주기 배지 모드", + "node links": "노드 링크", + "node opacity": "노드 불투명도", + "node pack": "노드 팩", + "node pack info": "노드 팩 정보", + "node preview": "노드 미리보기", + "node render error": "노드 렌더링 오류", + "node search box": "노드 검색 상자", + "node search box implementation": "노드 검색 상자 구현", + "node slots error": "노드 슬롯 오류", + "node source badge mode": "노드 출처 배지 모드", + "node state": "노드 상태", + "node templates": "노드 템플릿", + "node widget": "노드 위젯", + "node widgets error": "노드 위젯 오류", + "nodes": "노드", + "nodes aren't available on cloud": "노드가 클라우드에서 사용할 수 없습니다", + "nodes can be replaced": "노드를 교체할 수 있습니다", + "nodes manager": "커스텀 노드 관리자", + "nodes running": "노드 실행 중", + "noise": "노이즈", + "normal": "노멀(normal)", + "normalize image colors": "이미지 정규화", + "normalized attention guidance": "정규화된 어텐션 가이던스", + "not available": "사용 불가", + "not installed": "미설치", + "not sure": "잘 모르겠음", + "nothing selected": "선택된 항목이 없습니다", + "nothing to copy": "복사할 항목 없음", + "nothing to delete": "삭제할 항목 없음", + "nothing to duplicate": "복제할 항목 없음", + "nothing to group": "그룹화할 항목이 없습니다", + "nothing to queue": "대기열에 추가할 항목이 없습니다", + "nothing to rename": "이름을 변경할 항목 없음", + "notification preferences": "알림 환경설정", + "number of nodes suggestions": "노드 제안 수", + "number of runs": "실행 횟수:", + "ok, got it": "확인", + "only applies to v1": "기본 구현에만 적용됩니다.", + "only civitai urls are supported": "Civitai URL만 지원됩니다", + "only for litegraph searchbox/context menu": "라이트그래프 검색 상자/컨텍스트 메뉴 전용", + "only safetensor format is allowed": "SafeTensor 형식만 허용됩니다", + "opacity": "불투명도", + "open about comfyui": "ComfyUI 정보 열기", + "open all workflows": "모든 워크플로우 열기", + "open clipspace": "클립스페이스 열기", + "open color picker in maskeditor": "MaskEditor에서 색상 선택기 열기", + "open comfy-org discord": "Comfy-Org 디스코드 열기", + "open comfyui docs": "ComfyUI 문서 열기", + "open comfyui forum": "Comfy-Org 포럼 열기", + "open comfyui issues": "ComfyUI 문제 열기", + "open custom nodes folder": "커스텀 노드 폴더 열기", + "open dev tools": "개발자 도구 열기", + "open devtools": "개발자 도구 열기", + "open image": "이미지 열기", + "open in 3d viewer": "3D 뷰어에서 열기", + "open in mask editor": "마스크 편집기에서 열기", + "open inputs folder": "입력 폴더 열기", + "open logs": "로그 열기", + "open logs folder": "로그 폴더 열기", + "open manager": "관리자 열기", + "open models folder": "모델 폴더 열기", + "open new issue": "새 문제 열기", + "open node manager": "Node Manager 열기", + "open outputs folder": "출력 폴더 열기", + "open shared workflow": "공유된 워크플로우 열기", + "open sign in dialog": "로그인 대화 상자 열기", + "open without importing": "가져오지 않고 열기", + "open workflow": "워크플로우 열기", + "open workflow in new tab": "워크플로우 새 탭에서 열기", + "openai chatgpt advanced options": "OpenAI ChatGPT 고급 옵션", + "openai chatgpt input files": "OpenAI ChatGPT 입력 파일", + "openai gpt image 2": "OpenAI GPT 이미지 2", + "openai sora - video": "OpenAI Sora - 비디오", + "openai_chat_config": "OpenAI 채팅 설정", + "openai_input_files": "OpenAI 입력 파일", + "opened workflows position": "열린 워크플로 위치", + "operations": "연산", + "or continue with": "또는 다음으로 계속", + "original": "원본", + "orthographic": "직교법", + "outpaint image": "이미지 아웃페인팅", + "output": "출력", + "output directory": "출력 디렉토리", + "outputs": "출력", + "overwrite": "덮어쓰기", + "overwrite preset": "프리셋 덮어쓰기", + "owner": "소유자", + "ownership": "소유권", + "packs selected": "선택한 노드 팩", + "pad image for outpainting": "아웃페인팅을 위한 이미지 패딩", + "paint bucket settings": "페인트 버킷 설정", + "paint layer": "페인트 레이어", + "pale blue": "흐린 파랑색", + "pan mode": "팬 모드", + "panel controls": "패널 컨트롤", + "panning": "패닝", + "panorama": "파노라마", + "parameters": "파라미터", + "partner": "파트너", + "partner nodes": "파트너 노드", + "partner nodes pricing": "파트너 노드 크레딧", + "password": "비밀번호", + "password requirements": "비밀번호 요구사항", + "password reset email sent": "비밀번호 재설정 이메일이 전송되었습니다", + "password reset sent": "비밀번호 재설정 전송됨", + "password updated": "비밀번호가 업데이트되었습니다", + "passwords must match": "비밀번호가 일치해야 합니다", + "paste": "붙여넣기", + "paste image": "이미지 붙여넣기", + "paste link here": "여기에 링크를 붙여넣으세요", + "paste with connect": "연결하여 붙여넣기", + "patchmodeladddownscale (kohya deep shrink)": "다운스케일 추가 모델 패치 (Kohya Deep Shrink)", + "pause": "일시정지", + "pause download": "다운로드 일시 중지", + "paused": "일시 중지됨", + "pending": "대기 중", + "pending tasks deleted": "보류 중인 작업이 삭제되었습니다", + "permissions": "권한", + "perp-neg (deprecated by perp-neg guider)": "Perp-Neg (PerpNegGuider에 의해 지원 중단됨)", + "perp-neg guider": "PerpNeg 가이드", + "personal": "개인", + "personal information": "개인 정보", + "personal use": "개인용", + "personal workspace": "개인 워크스페이스", + "perspective": "원근법", + "perturbedattentionguidance": "교란 어텐션 유도 (PAG)", + "photomaker": "포토메이커", + "photomakerencode": "포토메이커 인코딩", + "photomakerloader": "포토메이커 로드", + "pid conditioning": "PiD 컨디셔닝", + "pin": "고정", + "pin/unpin selected items": "선택한 항목 고정/고정 해제", + "pin/unpin selected nodes": "선택한 노드 고정/고정 해제", + "pink": "분홍색", + "pinned": "고정됨", + "pip install mirror for pytorch": "pytorch를 위한 pip 설치 미러", + "pixverse image to video": "PixVerse 이미지에서 비디오로", + "pixverse template": "PixVerse 템플릿", + "pixverse text to video": "PixVerse 텍스트 투 비디오", + "pixverse transition video": "PixVerse 전환 비디오", + "pixverse_template": "Pixverse 템플릿", + "plan & credits": "플랜 및 크레딧", + "plans & pricing": "플랜 및 가격", + "play": "재생", + "play recording": "녹음 재생", + "play/pause": "재생/일시정지", + "playback speed": "재생 속도", + "playing": "재생 중", + "please help improve comfyui": "ComfyUI 개선에 도움을 주세요", + "please select output nodes": "출력 노드를 선택해 주세요", + "plot loss graph": "손실 그래프 그리기", + "point cloud": "포인트 클라우드", + "point cloud engine": "PLY 엔진", + "pointer": "포인터", + "pointer click drift (maximum distance)": "포인터 클릭 드리프트 (최대 거리)", + "pointer click drift delay": "포인터 클릭 드리프트 지연", + "polyexponentialscheduler": "다항 지수 스케줄러", + "popular": "인기", + "porter-duff image composite": "포터-더프 이미지 합성", + "pose to image": "포즈 → 이미지", + "pose to video": "포즈 → 비디오", + "positive-biased guidance": "마히로", + "pre-paid credits": "선불 크레딧", + "preparation failed": "준비 실패", + "preparation timed out": "준비 시간 초과", + "preprocessors": "전처리기", + "prevent attention upcast": "어텐션 업캐스트 방지", + "preview": "미리보기", + "preview 3d & animation": "3D 미리보기", + "preview 3d (advanced)": "3D 미리보기 (고급)", + "preview as text": "미리보기 아무거나", + "preview audio": "오디오 미리듣기", + "preview image": "이미지 미리보기", + "preview image format": "미리보기 이미지 형식", + "preview mask": "마스크 미리보기", + "preview output": "출력 미리보기", + "preview point cloud": "포인트 클라우드 미리보기", + "preview splat": "스플랫 미리보기", + "preview version": "미리보기 버전", + "previous": "이전", + "previous image": "이전 이미지", + "previous opened workflow": "이전 열린 워크플로", + "previous slide": "이전 슬라이드", + "primitive": "기본 입력", + "privacy policy": "개인정보 보호정책", + "processing video…": "비디오 처리 중…", + "processing…": "처리 중…", + "profile": "프로필", + "profile creation": "프로필 생성", + "prompt execution failed": "프롬프트 실행 실패", + "prompt has no outputs": "프롬프트에 출력이 없습니다", + "prompt is empty": "프롬프트가 비어 있음", + "prompt validation failed": "프롬프트 검증 실패", + "properties": "속성", + "properties panel": "속성 패널", + "provider": "공급자", + "provider is required": "공급자는 필수 항목입니다", + "public models": "공개 모델", + "publish": "게시", + "publish failed": "게시 실패", + "publish subgraph": "서브그래프 게시", + "publish to comfyhub": "ComfyHub에 게시하기", + "publish to the comfyhub": "ComfyHub에 게시하기", + "published successfully": "성공적으로 게시됨", + "publisher": "배포자", + "purchase credits": "크레딧 구매", + "purchase failed": "구매 실패", + "purple": "보라색", + "pypi install mirror": "PyPI 설치 미러", + "python install mirror": "Python 설치 미러", + "quantize image": "이미지 양자화", + "queue": "실행 대기열", + "queue button": "실행 대기열 버튼", + "queue history size": "실행 큐 기록 갯수", + "queue panel": "큐 패널", + "queue position": "대기열 위치", + "queue progress": "대기열 진행 상황", + "queue prompt": "실행 대기열에 프롬프트 추가", + "queue prompt (front)": "실행 대기열 맨 앞에 프롬프트 추가", + "queue selected output nodes": "선택한 출력 노드 대기열에 추가", + "queued": "대기 중", + "queued at": "대기열에 추가된 시간", + "quick fix available": "빠른 수정 가능", + "quick purchase": "빠른 구매", + "quit": "종료", + "quiver image to svg": "Quiver 이미지 → SVG", + "quiver text to svg": "Quiver 텍스트 → SVG", + "randomize value": "값 무작위화", + "randomnoise": "무작위 노이즈", + "ratio": "비율", + "re-authentication required": "재인증 필요", + "re-install": "재설치", + "ready": "준비됨", + "rebatch images": "이미지 배치 재배치", + "rebatch latents": "잠재 데이터 배치 재배치", + "recent": "최근", + "recent releases": "최신 릴리스", + "recents": "최근 항목", + "recommended": "권장", + "reconnected": "재연결됨", + "reconnecting": "재연결 중", + "record audio": "오디오 녹음", + "recraft controls": "Recraft 제어", + "recraft create style": "Recraft 스타일 생성", + "recraft creative upscale image": "Recraft 크리에이티브 업스케일 이미지", + "recraft crisp upscale image": "Recraft 선명 업스케일 이미지", + "recraft image inpainting": "Recraft 이미지 인페인팅", + "recraft image to image": "Recraft 이미지 생성 (이미지 → 이미지)", + "recraft remove background": "Recraft 배경 제거", + "recraft replace background": "Recraft 배경 교체", + "recraft style - digital illustration": "Recraft 스타일 - 디지털 일러스트레이션", + "recraft style - logo raster": "Recraft 스타일 - 로고 래스터", + "recraft style - realistic image": "Recraft 스타일 - 사실적인 이미지", + "recraft text to image": "Recraft 이미지 생성 (텍스트 → 이미지)", + "recraft text to vector": "Recraft 벡터 생성 (텍스트 → 벡터)", + "recraft v4 text to image": "Recraft V4 텍스트-이미지", + "recraft v4 text to vector": "Recraft V4 텍스트-벡터", + "recraft vectorize image": "Recraft 벡터 생성 (이미지 → 벡터)", + "recraft_color": "Recraft 색상", + "recraft_controls": "Recraft 컨트롤", + "recraft_v3_style": "Recraft V3 스타일", + "red": "빨간색", + "redo": "다시 실행", + "reference audio": "ReferenceTimbreAudio", + "referencelatent": "참조 잠재", + "refresh": "새로 고침", + "refresh credits": "크레딧 새로고침", + "refresh node": "노드 새로고침", + "refresh node definitions": "노드 정의 새로 고침", + "refreshing": "새로 고침 중", + "reinstall": "재설치", + "reload to apply changes": "변경 사항을 적용하려면 새로 고침하세요.", + "remove": "제거", + "remove all": "모두 제거", + "remove background": "배경 제거", + "remove background image": "배경 이미지 제거", + "remove bypass": "우회 제거", + "remove example image": "예시 이미지 제거", + "remove from bookmarks": "북마크에서 제거", + "remove hdri": "HDRI 제거", + "remove image": "이미지 제거", + "remove job": "작업 제거", + "remove keybinding": "키 바인딩 제거", + "remove member": "멤버 제거", + "remove tag": "태그 제거", + "remove video": "비디오 제거", + "rename": "이름 바꾸기", + "rename widget": "위젯 이름 변경", + "rename workflow": "워크플로우 이름 변경", + "render bypass state": "바이패스 상태 렌더링", + "render error state": "에러 상태 렌더링", + "render moge geometry": "MoGe 렌더", + "repeat image batch": "이미지 반복 배치 생성", + "repeat latent batch": "잠재 데이터 반복 배치 생성", + "replace all": "모두 교체", + "replace node": "노드 교체", + "replace text": "텍스트 교체", + "replace text (regex)": "정규식 치환", + "replaceable": "교체 가능", + "replaced": "교체됨", + "replacevideolatentframes": "비디오 Latent 프레임 교체", + "report": "신고", + "report error": "오류 신고", + "report issue": "이슈 보고", + "report submitted": "보고서 제출됨", + "repository": "저장소", + "request failed": "요청 실패", + "require confirmation when clearing workflow": "워크플로 비우기 시 확인 요구", + "required": "필수", + "required input missing": "필수 입력 누락", + "requirements": "요구 사항", + "requires additional credits": "추가 크레딧 필요", + "reroute": "경유점", + "reroute beta": "경유점 (베타)", + "reroute spline offset": "경유점 스플라인 오프셋", + "rerun": "다시 실행", + "rescalecfg": "CFG 리스케일", + "reserved vram (gb)": "예약된 VRAM (GB)", + "reset": "재설정", + "reset all": "모두 초기화", + "reset all keybindings to default": "모든 키 바인딩을 기본값으로 초기화", + "reset all parameters": "모든 매개변수 재설정", + "reset canvas view": "캔버스 보기 재설정", + "reset to default": "기본값으로 재설정", + "reset transform": "변환 초기화", + "reset view": "보기 재설정", + "reset view to default": "기본 보기로 재설정", + "resize": "크기 조정", + "resize and pad image": "이미지 크기 조정 및 패딩", + "resize from bottom-left corner": "왼쪽 아래 모서리에서 크기 조정", + "resize from bottom-right corner": "오른쪽 아래 모서리에서 크기 조정", + "resize from top-left corner": "왼쪽 위 모서리에서 크기 조정", + "resize from top-right corner": "오른쪽 위 모서리에서 크기 조정", + "resize image": "이미지 크기 조정", + "resize image/mask": "이미지/마스크 크기 조정", + "resize images by longer edge": "긴 변 기준 이미지 크기 조정", + "resize images by shorter edge": "짧은 변 기준 이미지 크기 조정", + "resize node to match output": "노드 크기를 출력에 맞추기", + "resize selected nodes": "선택된 노드 크기 조정", + "resizing…": "크기 조정 중…", + "resolution bucket": "해상도 버킷", + "resolution selector": "해상도 선택기", + "restart": "재시작", + "restart required": "재시작 필요", + "restore dialog": "대화 상자 복원", + "resubscribe": "다시 구독하기", + "resume download": "다운로드 재개", + "retarget_task_id": "재타겟팅 작업 ID", + "retry download": "다운로드 재시도", + "reuse parameters": "파라미터 재사용", + "reve image create": "Reve 이미지 생성", + "reve image edit": "Reve 이미지 편집", + "reve image remix": "Reve 이미지 리믹스", + "revert changes": "변경 사항 되돌리기", + "review app layout": "앱 레이아웃 검토", + "revoke invite": "초대 취소", + "rig_task_id": "리깅 작업 ID", + "right": "오른쪽", + "rotate": "회전", + "rotate image": "이미지 회전", + "rotate latent": "잠재 데이터 연산 (회전)", + "rotate left": "왼쪽으로 회전", + "rotate left in maskeditor": "마스크 편집기에서 왼쪽으로 회전", + "rotate right": "오른쪽으로 회전", + "rotate right in maskeditor": "마스크 편집기에서 오른쪽으로 회전", + "round": "둥근", + "rt-detr detect": "RT-DETR 감지", + "run branch": "분기 실행", + "run comfyui in the cloud": "ComfyUI 클라우드에서 실행하기", + "run could not start": "실행 시작 실패", + "run ended unexpectedly": "실행이 예기치 않게 종료됨", + "run moge inference": "MoGe 추론", + "run moge panorama inference": "MoGe 파노라마 추론", + "run vae on cpu": "CPU에서 VAE 실행", + "run workflow": "워크플로 실행", + "run workflow (queue at front)": "워크플로 실행 (가장 먼저 실행)", + "run workflows on your behalf": "워크플로를 대신 실행", + "running…": "실행 중…", + "runway first-last-frame to video": "Runway 첫-마지막 프레임 비디오 변환", + "runway text to image": "Runway 텍스트 이미지 생성", + "sad girl illustration": "슬픈 소녀 일러스트", + "sam3 detect": "SAM3 감지", + "sam3 track preview": "SAM3 트랙 미리보기", + "sam3 track to mask": "SAM3 트랙 → mask", + "sam3 video track": "SAM3 비디오 트랙", + "sampler": "샘플러", + "samplercustom": "사용자 정의 샘플러", + "samplercustomadvanced": "고급 사용자 정의 샘플러", + "samplerdpmadaptative": "DPMAdaptive 샘플러", + "samplerdpmpp_2m_sde": "DPMPP_2M_SDE 샘플러", + "samplerdpmpp_2s_ancestral": "DPMPP_2S_Ancestral 샘플러", + "samplerdpmpp_3m_sde": "DPMPP_3M_SDE 샘플러", + "samplerdpmpp_sde": "DPMPP_SDE 샘플러", + "samplereulerancestral": "Eluer Ancestral 샘플러", + "samplereulerancestralcfg++": "Eluer Acnestral CFG++ 샘플러", + "samplereulercfg++": "Eluer CFG++ 샘플러", + "samplerlcmupscale": "LCM 확대 샘플러", + "samplerlms": "LMS 샘플러", + "samplers": "샘플러", + "sampling": "샘플링", + "save 3d model": "3D 모델 저장", + "save and switch": "저장하고 전환", + "save animated png": "애니메이션 PNG 저장", + "save animated webp": "애니메이션 WEBP 저장", + "save anyway": "그래도 저장", + "save as new preset": "새 프리셋으로 저장", + "save as template": "템플릿으로 저장", + "save audio": "오디오 저장", + "save audio (advanced)": "오디오 저장 (고급)", + "save audio (flac)": "오디오 저장", + "save audio (mp3)": "오디오 저장 (MP3)", + "save audio (opus)": "오디오 저장 (Opus)", + "save checkpoint": "체크포인트 저장", + "save failed": "저장 실패", + "save image": "이미지 저장", + "save image (advanced)": "이미지 저장 (고급)", + "save image (to folder)": "이미지 데이터셋을 폴더에 저장", + "save image (websocket)": "이미지 웹소켓 전송", + "save image-text (to folder)": "이미지 및 텍스트 데이터셋을 폴더에 저장", + "save lora weights": "LoRA 가중치 저장", + "save selected as template": "선택된 부분을 템플릿으로 저장", + "save subgraph to library": "서브그래프를 라이브러리에 저장", + "save svg": "SVG 노드 저장", + "save to library": "라이브러리에 저장", + "save training dataset": "학습 데이터셋 저장", + "save video": "비디오 저장", + "save webm": "동영상 저장 (WEBM)", + "save workflow": "워크플로 저장", + "save workflow as": "다른 이름으로 워크플로 저장", + "save workflow first": "먼저 워크플로우 저장", + "saved to nodes library": "노드 라이브러리에 저장됨", + "savelatent": "잠재 데이터 저장", + "saving": "저장 중", + "saving…": "저장 중…", + "scale": "크기 조절", + "scale image to max dimension": "이미지를 최대 크기로 확대", + "scale image to total pixels": "총 픽셀 수에 맞춰 이미지 크기 조정", + "scalerope": "ROPE 스케일", + "scene": "장면", + "scene settings": "장면 설정", + "schedulers": "스케줄러", + "scheduling": "스케줄링", + "scroll left": "왼쪽으로 스크롤", + "scroll right": "오른쪽으로 스크롤", + "sd_4xupscale_conditioning": "SD_4X 확대 조건 설정", + "sdpose draw keypoints": "SDPoseDrawKeypoints", + "sdpose face bounding boxes": "SDPoseFaceBBoxes", + "sdpose keypoint extractor": "SDPoseKeypointExtractor", + "sdturboscheduler": "SD-Turbo 스케줄러", + "search": "검색", + "search aliases": "별칭 검색", + "search assets": "에셋 검색", + "search box": "검색 상자", + "search extensions": "확장 검색", + "search in node manager": "노드 매니저에서 검색", + "search keybindings": "키 바인딩 검색", + "search models": "모델 검색", + "search nodes": "노드 검색", + "search settings": "설정 검색", + "search workflows": "워크플로 검색", + "secret value": "시크릿 값", + "secret value is required": "시크릿 값은 필수 항목입니다", + "secrets": "시크릿", + "see a tutorial": "튜토리얼 보기", + "see details": "자세히 보기", + "see error": "오류 보기", + "see more outputs": "더 많은 출력 보기", + "see what's new": "새로운 기능 보기", + "select": "선택", + "select a thumbnail": "썸네일 선택", + "select a user": "사용자 선택", + "select all": "모두 선택", + "select amount": "금액 선택", + "select clip device": "CLIP 디바이스 선택", + "select existing comfyui installation (optional)": "기존 ComfyUI 설치 선택 (선택사항)", + "select frameworks": "프레임워크 선택", + "select gpu": "GPU 선택", + "select group children on click": "그룹 클릭 시 자식 선택", + "select items to copy": "복사할 항목 선택", + "select items to delete": "삭제할 항목 선택", + "select items to duplicate": "복제할 항목 선택", + "select items to migrate": "마이그레이션 항목 선택", + "select items to rename": "이름을 변경할 항목 선택", + "select mode": "선택 모드", + "select model": "모델 선택", + "select model device": "모델 디바이스 선택", + "select model type": "모델 유형 선택", + "select projects": "프로젝트 선택", + "select vae device": "VAE 장치 선택", + "select version": "버전 선택", + "selected": "선택됨", + "selected file": "선택된 파일", + "selection opacity": "선택 영역 불투명도", + "self-attention guidance": "셀프 어텐션 가이드", + "send anonymous usage metrics": "익명 사용 통계 보내기", + "send report": "보고서 보내기", + "send reset link": "재설정 링크 보내기", + "separate tags with commas": "태그는 쉼표로 구분하세요", + "server": "서버", + "server crashed": "서버 중단", + "server error": "서버 오류", + "server-config": "서버 구성", + "servers are busy": "서버가 혼잡합니다", + "service error": "서비스 오류", + "set as background": "배경으로 설정", + "set clip hooks": "CLIP 후크 설정", + "set group nodes to always": "그룹 노드를 항상 실행으로 설정", + "set group nodes to never": "그룹 노드를 절대 실행 안함으로 설정", + "set hook keyframes": "후크 키프레임 설정", + "set latent noise mask": "잠재 데이터에 노이즈 마스크 설정", + "set subgraph description": "서브그래프 설명 설정", + "set subgraph search aliases": "서브그래프 검색 별칭 설정", + "settings": "설정", + "setunioncontrolnettype": "통합 컨트롤넷 유형 설정", + "shape": "형태", + "shapes": "형태", + "share anyway": "그래도 공유", + "share url": "공유 URL", + "share workflow": "워크플로우 공유", + "sharpen image": "이미지 선명화", + "shortcuts": "단축키", + "show advanced": "고급 설정 보기", + "show advanced inputs": "고급 입력 표시", + "show advanced parameters": "고급 파라미터 표시", + "show api node pricing badge": "API 노드 가격 배지 표시", + "show as background": "배경으로 표시", + "show assets": "에셋 보기", + "show assets panel": "에셋 패널 보기", + "show confirmation when closing window": "창 닫을 때 확인 표시", + "show confirmation when deleting workflows": "워크플로 삭제 시 확인 표시", + "show connected links": "연결된 링크 표시", + "show deprecated nodes in search": "검색에서 지원 중단된 노드 표시", + "show error report": "오류 보고서 보기", + "show errors in graph": "그래프에서 오류 보기", + "show experimental nodes in search": "검색에서 실험적 노드 표시", + "show frames/groups": "프레임/그룹 표시", + "show graph canvas menu": "그래프 캔버스 메뉴 표시", + "show grid": "그리드 표시", + "show info badges": "정보 배지 표시", + "show input": "입력 표시", + "show keybindings dialog": "단축키 대화상자 표시", + "show left panel": "왼쪽 패널 표시", + "show links": "링크 표시", + "show maintenance tasks": "유지 보수 작업 보기", + "show menu": "메뉴 표시", + "show minimap": "미니맵 표시", + "show missing models warning": "누락된 모델 경고 표시", + "show model selector (dev)": "모델 선택기 표시 (개발자용)", + "show more features": "더 많은 기능 보기", + "show recommended widgets": "권장 위젯 표시", + "show referencing nodes": "참조 노드 보기", + "show report": "보고서 보기", + "show right panel": "오른쪽 패널 표시", + "show run progress bar": "실행 진행률 표시줄 표시", + "show selection toolbox": "선택 도구 상자 표시", + "show settings dialog": "설정 대화상자 표시", + "show skeleton": "스켈레톤 표시", + "show terminal": "터미널 보기", + "show toolbox on selection": "선택 시 툴박스 표시", + "show version updates": "버전 업데이트 표시", + "shown on node": "노드에 표시됨", + "shuffle images list": "이미지 데이터셋 섞기", + "shuffle pairs of image-text": "이미지-텍스트 데이터셋 섞기", + "sidebar": "사이드바", + "sidebar location": "사이드바 위치", + "sidebar size": "사이드바 크기", + "sidebar style": "사이드바 스타일", + "sigmas": "시그마", + "sign in": "로그인", + "sign in / sign up": "로그인 / 회원가입", + "sign in again": "다시 로그인", + "sign in required": "로그인 필요", + "sign out": "로그아웃", + "sign out & try again": "로그아웃 후 다시 시도", + "sign out anyway": "그래도 로그아웃하기", + "sign up": "가입하기", + "sign up with github": "Github로 가입하기", + "sign up with github instead": "대신 Github로 가입하기", + "sign up with google": "구글로 가입하기", + "sign-in provider": "로그인 방법", + "signed out successfully": "성공적으로 로그아웃되었습니다", + "simplified apps from workflows": "워크플로우 기반 간소화 앱", + "single-select dropdown": "단일 선택 드롭다운", + "size of preview images": "미리보기 최대 이미지 크기", + "skip": "건너뛰기", + "skip for now": "일단 건너뛰기", + "skip to end": "끝으로 건너뛰기", + "skip to start": "처음으로 건너뛰기", + "skip to the cloud app": "클라우드 앱으로 건너뛰기", + "skiplayerguidancedit": "레이어 건너뛰기 가이던스 (DiT)", + "skiplayerguidanceditsimple": "SkipLayerGuidanceDiT 간단 버전", + "skiplayerguidancesd3": "레이어 건너뛰기 가이던스 (SD3)", + "skipped": "건너뜀", + "smooth": "부드럽게", + "smoothing precision": "부드럽기 정밀도", + "snap highlights node": "스냅 하이라이트 노드", + "snap nodes to grid": "노드를 그리드에 맞추기", + "snap to grid size": "그리드 크기에 스냅", + "solo use only": "개인용 전용", + "sonilo text to music": "Sonilo 텍스트로 음악 생성", + "sonilo video to music": "Sonilo 비디오로 음악 생성", + "sorry, contact support": "죄송합니다, 지원팀에 문의하세요", + "sort": "정렬", + "sort alphabetically within groups": "그룹 내에서 알파벳순으로 정렬", + "sort by": "정렬 기준", + "sort jobs": "작업 정렬", + "sort mode": "정렬 방식", + "sorting type": "정렬 방식", + "source": "소스", + "spline": "스플라인", + "split audio channels": "오디오 채널 분리", + "split image with alpha": "이미지와 알파채널 분리", + "splitsigmas": "시그마 배열 분할 (스텝)", + "splitsigmasdenoise": "시그마 배열 분할 (노이즈 제거양)", + "stability ai audio inpaint": "Stability AI 오디오 인페인팅", + "stability ai audio to audio": "Stability AI 오디오 변환", + "stability ai text to audio": "Stability AI 텍스트-오디오 변환", + "stability ai upscale conservative": "Stability AI 업스케일 보수적", + "stability ai upscale creative": "Stability AI 업스케일 크리에이티브", + "stability ai upscale fast": "Stability AI 초고속 업스케일", + "stable_cascade": "Stable Cascade", + "stablecascade_emptylatentimage": "StableCascade 빈 잠재 이미지", + "stablecascade_stageb_conditioning": "StableCascasde_StageB 조건 설정", + "stablecascade_stagec_vaeencode": "StableCascade_StageC VAE 인코딩", + "stablecascade_superresolutioncontrolnet": "StableCascade 초고해상도 컨트롤넷", + "stablezero123_conditioning": "StableZero123 조건 설정", + "stablezero123_conditioning_batched": "StableZero123 조건 설정 (배치)", + "standard (new)": "표준(신규)", + "star": "별", + "start creating in seconds": "몇 초 만에 제작 시작", + "start publishing": "게시 시작하기", + "start recording": "녹음 시작", + "starting comfyui": "ComfyUI 시작 중", + "starting today": "오늘부터 시작", + "status": "상태", + "step size": "단계 크기", + "stitch images": "이미지 스티치", + "stop at mask": "마스크에서 중지", + "stop playback": "재생 중지", + "stop recording": "녹음 중지", + "stop run (instant)": "즉시 실행 중지", + "stop running": "실행 중지", + "straight": "직선", + "string": "문자열", + "strip whitespace": "공백 제거", + "style_model": "스타일 모델", + "subgraph blueprints": "서브그래프 블루프린트", + "subgraph name": "서브그래프 이름", + "submit": "제출", + "submit a github issue": "GitHub 이슈 제출", + "subscribe": "구독", + "subscribe for more": "더 많은 혜택 구독하기", + "subscribe now": "지금 구독하기", + "subscribe to": "구독하기", + "subscribe to comfy cloud": "Comfy Cloud 구독하기", + "subscribe to run": "실행 구독", + "subscription": "구독", + "subscription activation failed": "구독 활성화에 실패했습니다", + "subscription cancelled successfully": "구독이 성공적으로 취소되었습니다", + "subscription reactivated successfully": "구독이 성공적으로 재활성화되었습니다", + "subscription required": "구독 필요", + "subscription update failed": "구독 업데이트에 실패했습니다", + "subscription updated successfully": "구독이 성공적으로 업데이트되었습니다", + "subscription upgrade required": "구독 업그레이드 필요", + "subscription verification timed out": "구독 확인 시간이 초과되었습니다", + "substring": "부분 문자열", + "success": "성공", + "successfully saved": "성공적으로 저장되었습니다", + "suggested tags": "추천 태그", + "support": "지원팀", + "survey questions placeholder": "설문 질문 자리표시자", + "sv3d_conditioning": "SV3D 조건 설정", + "svd_img2vid_conditioning": "SVD 조건 설정 (이미지 → 비디오)", + "swap nodes": "노드 교체", + "switch": "전환", + "switch back": "설정 열기", + "switch camera": "카메라 전환", + "switch to grid view": "그리드 보기로 전환", + "switch to outputs": "출력으로 전환", + "switch to single view": "단일 보기로 전환", + "switch workspace": "워크스페이스 전환", + "system info": "시스템 정보", + "system locations": "시스템 위치", + "t5tokenizeroptions": "T5 토큰생성기 옵션", + "tab bar layout": "탭 바 레이아웃", + "tags": "태그", + "tangential damping cfg": "접선 감쇠 CFG", + "task error": "작업 오류", + "tasks": "작업", + "team": "팀", + "team workspace": "팀 워크스페이스", + "team workspaces": "팀 워크스페이스", + "technical details": "기술적 세부 사항", + "templates": "템플릿", + "terminal": "터미널", + "terms": "이용약관", + "terms of use": "이용 약관", + "text encoder precision": "텍스트 인코더 정밀도", + "text generation": "텍스트 생성 (LLM)", + "text length": "길이", + "text string": "문자열", + "text string (multiline)": "문자열 (여러 줄)", + "text to 3d model": "텍스트 → 3D 모델", + "text to image": "텍스트 → 이미지", + "text to video": "텍스트 → 비디오", + "textarea widget font size": "텍스트 영역 위젯 글꼴 크기", + "textarea widget spellcheck": "텍스트 영역 위젯 맞춤법 검사", + "textencodehunyuanvideo_imagetovideo": "HunyuanVideo 텍스트 인코딩 (이미지 → 비디오)", + "theme": "테마", + "thickness": "두께", + "this app": "이 앱", + "this app encountered an error": "앱에서 오류가 발생했습니다", + "this node": "이 노드", + "this workflow has missing nodes": "이 워크플로우에 누락된 노드가 있습니다", + "this workflow has no nodes": "이 워크플로우에는 노드가 없습니다", + "this workflow is missing models": "이 워크플로우에 모델이 누락되었습니다", + "threshold mask": "임계값 마스크", + "thumbnail preview": "썸네일 미리보기", + "tiled": "타일드", + "time": "시간", + "time elapsed": "경과 시간", + "timesteps range": "조건 (타임스텝 범위)", + "timesteps_range": "타임스텝 범위", + "to finish setup": "하여 설정 완료", + "toggle app mode": "앱 모드 전환", + "toggle apps sidebar": "앱 사이드바 전환", + "toggle assets sidebar": "에셋 사이드바 전환", + "toggle bottom panel": "하단 패널 전환", + "toggle essential bottom panel": "필수 하단 패널 전환", + "toggle focus mode": "포커스 모드 토글", + "toggle job history": "작업 기록 전환", + "toggle link visibility": "링크 가시성 전환", + "toggle logs bottom panel": "로그 하단 패널 전환", + "toggle minimap": "미니맵 전환", + "toggle model library sidebar": "모델 라이브러리 사이드바 토글", + "toggle node library sidebar": "노드 라이브러리 사이드바 토글", + "toggle promotion of hovered widget": "호버된 위젯 승격 전환", + "toggle properties panel": "속성 패널 전환", + "toggle queue panel v2": "대기열 패널 V2 전환", + "toggle search box": "검색 상자 전환", + "toggle terminal bottom panel": "터미널 하단 패널 전환", + "toggle theme": "테마 전환", + "toggle theme (dark/light)": "테마 전환 (어두운/밝은)", + "toggle view controls bottom panel": "뷰 컨트롤 하단 패널 전환", + "toggle workflows sidebar": "워크플로 사이드바 토글", + "tolerance": "허용치", + "tomepatchmodel": "토큰 병합(ToMe) 모델 패치", + "tool": "도구", + "tooltip delay": "툴팁 지연", + "top": "위", + "top custom node packs pre-installed": "최고의 커스텀 노드 팩 사전 설치", + "top up": "충전하기", + "top-up failed": "충전 실패", + "top-up verification timed out": "충전 확인 시간이 초과되었습니다", + "topaz image enhance": "Topaz 이미지 향상", + "topbar": "상단바", + "torch install mirror": "torch 설치 미러", + "torchcompilemodel": "모델 토치 컴파일", + "total": "총계", + "total cost": "총 비용", + "total credits": "총 크레딧", + "total due today": "오늘 결제 금액 합계", + "total generation time": "총 생성 시간", + "total generation time (longest first)": "총 생성 시간(긴 순)", + "total nodes": "총 노드", + "total yearly credits": "연간 총 크레딧", + "train lora": "LoRA 학습", + "training": "학습", + "training…": "학습 중…", + "transfer color": "ColorTransfer", + "transform": "변환", + "transform splat": "Splat 변환", + "translate": "이동", + "tree explorer": "트리 탐색기", + "tree explorer item padding": "트리 탐색기 항목 패딩", + "trigger phrase": "트리거 문구", + "trigger phrases": "트리거 문구", + "trim audio duration": "오디오 길이 자르기", + "trim text": "정리", + "trimvideolatent": "잠재 비디오 자르기", + "triplecliploader": "삼중 CLIP 로드", + "triposplat conditioning": "TripoSplat 컨디셔닝", + "triposplat decode": "TripoSplat 디코드", + "triposplat preprocess image": "TripoSplat 전처리 이미지", + "triposplat sampling preview": "TripoSplat 샘플링 미리보기", + "troubleshoot": "문제 해결", + "troubleshooting guide": "문제 해결 가이드", + "true": "참", + "truncate text": "텍스트 자르기", + "try again": "다시 시도", + "try cloud for free": "클라우드 무료 체험", + "try it out": "사용해 보기", + "try this template": "이 템플릿 사용해보기", + "try update": "업데이트 시도", + "tsr - temporal score rescaling": "TSR - 시간적 점수 재조정", + "unable to start comfyui desktop": "ComfyUI Desktop을 시작할 수 없습니다", + "unbookmark node": "즐겨찾기 해제 노드", + "unclipconditioning": "unCLIP 조건 설정", + "undated": "날짜 없음", + "understood": "이해했습니다", + "undo": "실행 취소", + "unet": "UNet", + "unet precision": "UNET 정밀도", + "unetcrossattentionmultiply": "UNet 교차 어텐션 곱하기", + "unetselfattentionmultiply": "UNet 셀프 어텐션 곱하기", + "unettemporalattentionmultiply": "UNet 템포럴 어텐션 곱하기", + "unfavorite": "즐겨찾기 해제", + "unfavorite widget": "위젯 즐겨찾기 해제", + "ungroup selected group nodes": "선택한 그룹 노드 그룹 해제", + "unified sidebar width": "통합 사이드바 너비", + "uninstall": "제거", + "uninstall selected": "선택 항목 제거", + "uninvite": "초대 취소", + "unknown": "알 수 없음", + "unknown error": "알 수 없는 오류", + "unknown file": "알 수 없는 파일", + "unknown input": "알 수 없는 입력", + "unknown pack": "알 수 없는 팩", + "unload models": "모델 언로드", + "unload models and execution cache": "모델 및 실행 캐시 언로드", + "unlock aspect ratio": "비율 해제", + "unlock canvas": "캔버스 잠금 해제", + "unlock top-ups and more": "충전 및 추가 혜택 잠금 해제", + "unpack subgraph": "서브그래프 풀기", + "unpack the selected subgraph": "선택한 서브그래프 묶음 풀기", + "unpin": "고정 해제", + "unresolved missing nodes": "해결되지 않은 누락된 노드", + "unresolved nodes": "해결되지 않은 노드", + "unsafe install location detected": "안전하지 않은 설치 위치 감지됨", + "unsaved changes": "저장되지 않은 변경 사항", + "unsorted": "정렬 안 함", + "unsupported node packs": "지원되지 않는 노드 팩", + "untitled": "제목 없음", + "up direction": "위 방향", + "update": "업데이트", + "update all": "모두 업데이트", + "update available": "업데이트 가능", + "update comfyui": "ComfyUI 업데이트", + "update complete": "업데이트 완료", + "update frontend": "프론트엔드 업데이트", + "update link": "링크 업데이트", + "update password": "비밀번호 업데이트", + "update requested": "업데이트 요청됨", + "update selected": "선택 항목 업데이트", + "update started": "업데이트 시작됨", + "updated": "업데이트 됨", + "updated recently": "최근 업데이트", + "updates available": "업데이트 가능", + "updating all packages": "모든 패키지 업데이트 중", + "updating comfyui desktop": "ComfyUI 데스크톱 업데이트 중", + "upgrade": "업그레이드", + "upgrade plan": "플랜 업그레이드", + "upgrade to add credits": "크레딧 추가를 위해 업그레이드하세요", + "upgrade to creator": "Creator로 업그레이드", + "upgrade to unlock this feature": "이 기능을 사용하려면 업그레이드하세요", + "upload": "업로드", + "upload a video": "비디오 업로드", + "upload already in progress": "업로드가 이미 진행 중입니다", + "upload an image": "이미지 업로드", + "upload background image": "배경 이미지 업로드", + "upload before and after": "비교 이미지 업로드", + "upload example image": "예시 이미지 업로드", + "upload model help video": "모델 업로드 도움말 영상", + "upload my workflow": "내 워크플로우 업로드하기", + "upload texture": "텍스처 업로드", + "upload to comfyhub": "ComfyHub에 업로드", + "upscale image": "이미지 확대", + "upscale image (using model)": "모델을 사용한 이미지 확대", + "upscale image by": "이미지 확대 비율", + "upscale latent": "잠재 데이터 크기 조정", + "upscale latent by": "잠재 데이터 크기 배율 조정", + "upscale_diffusion": "업스케일 확산", + "upscale_model": "업스케일 모델", + "upscaling": "업스케일링", + "usage hint": "사용 힌트", + "usage metrics": "사용 통계", + "usd / mo": "USD / 월", + "usd / mo / member": "USD / 월 / 멤버", + "use classic cache system": "예전 방식의 공격적 캐시 시스템 사용", + "use email instead": "이메일로 계속하기", + "use from library": "라이브러리에서 사용", + "use legacy manager ui": "레거시 Manager UI 사용", + "use legacy ui": "구버전 매니저 UI 사용", + "use new menu": "새 메뉴 사용", + "user": "사용자", + "user avatar": "사용자 아바타", + "user journey events": "사용자 행동 흐름 이벤트", + "user not authenticated": "사용자가 인증되지 않았습니다", + "using from library": "라이브러리에서 사용 중", + "usostylereference": "USO 스타일 참조", + "utilities": "유틸리티", + "vae decode": "VAE 디코드", + "vae decode (tiled)": "VAE 디코드 (타일)", + "vae decode audio": "오디오 VAE 디코드", + "vae decode audio (tiled)": "VAE 오디오 디코드 (타일)", + "vae encode": "VAE 인코드", + "vae encode (for inpainting)": "VAE 인코드 (인페인팅용)", + "vae encode (tiled)": "VAE 인코드 (타일)", + "vae encode audio": "오디오 VAE 인코드", + "vae precision": "VAE 정밀도", + "vaesave": "VAE 저장", + "validate workflows": "워크플로 유효성 검사", + "validation": "검증", + "validation failed": "유효성 검사 실패", + "version": "버전", + "version compatibility warning": "버전 호환성 경고", + "vertical": "수직", + "video": "비디오", + "video api": "비디오 API", + "video failed to load": "비디오를 로드하지 못했습니다.", + "video linear cfg guidance": "비디오 선형 CFG 가이드", + "video slice": "비디오 슬라이스", + "video thumbnail preview": "비디오 썸네일 미리보기", + "video triangle cfg guidance": "비디오 삼각형 CFG 가이드", + "video_models": "비디오 모델", + "videos": "비디오", + "vidu image to video generation": "Vidu 이미지 비디오 생성", + "vidu multi-frame video generation": "Vidu 다중 프레임 비디오 생성", + "vidu q3 image-to-video generation": "Vidu Q3 이미지-비디오 생성", + "vidu q3 start/end frame-to-video generation": "Vidu Q3 시작/종료 프레임-투-비디오 생성", + "vidu q3 text-to-video generation": "Vidu Q3 텍스트-비디오 생성", + "vidu reference to video generation": "Vidu 참조 비디오 생성", + "vidu text to video generation": "Vidu 텍스트 비디오 생성", + "vidu video extension": "Vidu 비디오 확장", + "vidu2 image-to-video generation": "Vidu2 이미지-비디오 생성", + "vidu2 reference-to-video generation": "Vidu2 참조-비디오 생성", + "vidu2 start/end frame-to-video generation": "Vidu2 시작/종료 프레임-투-비디오 생성", + "vidu2 text-to-video generation": "Vidu2 텍스트-투-비디오 생성", + "view all jobs": "모든 작업 보기", + "view all settings": "모든 설정 보기", + "view app": "앱 보기", + "view available workflow tools": "사용 가능한 워크플로 도구 보기", + "view controls": "보기 컨트롤", + "view details": "자세히 보기", + "view enterprise": "엔터프라이즈 보기", + "view full policy": "전체 정책 보기", + "view in manager": "매니저에서 보기", + "view job": "작업 보기", + "view more details": "자세히 보기", + "view node graph": "노드 그래프 보기", + "view plans": "플랜 보기", + "view pricing details": "요금 세부정보 보기", + "view usage history": "사용 기록 보기", + "view workspace": "워크스페이스 보기", + "virtual environment path": "가상 환경 경로", + "visualize face landmarks (mediapipe)": "MediaPipe 얼굴 메시 시각화", + "void quadmask preprocessor": "VOIDQuadmaskPreprocess", + "volume": "볼륨", + "voxel": "복셀", + "voxel to mesh": "복셀 → 매시", + "voxel to mesh (basic)": "복셀 → 매시 (기본)", + "vpscheduler": "VP 스케줄러", + "vram management mode": "VRAM 관리 모드", + "wan context windows (manual)": "WAN 컨텍스트 창 (수동)", + "wan image to image": "Wan 이미지-이미지 변환", + "wan image to video": "Wan 이미지-비디오 변환", + "wan text to image": "Wan 텍스트 투 이미지", + "wan text to video": "Wan 텍스트 투 비디오", + "wan_camera_embedding": "WAN 카메라 임베딩", + "wananimatetovideo": "완애니메이트투비디오", + "wancameraembedding": "완카메라임베딩", + "wancameraimagetovideo": "완카메라이미지투비디오", + "wanfirstlastframetovideo": "WAN 비디오 생성 (시작-끝 프레임)", + "wanfuncontroltovideo": "WAN 비디오 생성 (Fun Control)", + "wanfuninpainttovideo": "WAN 비디오 생성 (Fun Inpaint)", + "wanhumoimagetovideo": "WanHuMo 이미지-비디오 변환", + "wanimagetovideo": "WAN 비디오 생성 (이미지 → 비디오)", + "wanvacetovideo": "WAN 비디오 생성 (VACE)", + "warning": "경고", + "wavespeed image upscale": "WaveSpeed 이미지 업스케일", + "web app": "웹 앱", + "webcam": "웹캠", + "webcam capture": "웹캠 캡처", + "welcome to comfyui": "ComfyUI에 오신 것을 환영합니다", + "white": "흰색", + "widget control mode": "위젯 제어 모드", + "widget not visible": "위젯이 표시되지 않습니다", + "width": "너비", + "window": "창", + "window style": "창 스타일", + "wireframe": "와이어프레임", + "workflow": "워크플로", + "workflow actions": "워크플로우 작업", + "workflow contents": "워크플로 내용", + "workflow data is empty": "워크플로우 데이터가 비어 있습니다", + "workflow deleted": "워크플로가 삭제되었습니다.", + "workflow description": "워크플로우 설명", + "workflow exported successfully": "워크플로우가 성공적으로 내보내졌습니다", + "workflow name": "워크플로우 이름", + "workflow opened in new tab": "워크플로우가 새 탭에서 열렸습니다", + "workflow overview": "워크플로우 개요", + "workflows": "워크플로", + "works anywhere, instantly": "어디서나 즉시 사용 가능", + "workspace": "워크스페이스", + "workspace created": "워크스페이스 생성됨", + "workspace created but setup incomplete": "워크스페이스가 생성되었지만 설정이 완료되지 않았습니다", + "workspace deleted": "워크스페이스 삭제됨", + "workspace name": "워크스페이스 이름", + "workspace name*": "워크스페이스 이름*", + "workspace not found": "워크스페이스를 찾을 수 없습니다.", + "workspace settings": "워크스페이스 설정", + "workspace updated": "워크스페이스가 업데이트되었습니다", + "yearly": "연간", + "yellow": "노란색", + "you'll be redirected to": "다음으로 리디렉션됩니다", + "you're on the free plan": "무료 플랜을 사용 중입니다", + "you're out of free credits": "무료 크레딧이 모두 소진되었습니다", + "your credit balance": "보유 크레딧 잔액", + "your description": "소개", + "your device is not supported": "이 장치는 지원되지 않습니다.", + "your subscription has been canceled": "구독이 취소되었습니다", + "your team workspaces": "내 팀 워크스페이스", + "your username (required)": "사용자 이름 (필수)", + "z-a": "가나다 역순", + "zip download ready": "ZIP 다운로드 준비 완료", + "zoom controls": "줌 컨트롤", + "zoom in": "확대", + "zoom in/out": "확대/축소", + "zoom options": "줌 옵션", + "zoom out": "축소", + "zoom to fit": "화면에 맞추기" +} diff --git a/.github/scripts/i18n/glossary/frontend/zh.json b/.github/scripts/i18n/glossary/frontend/zh.json new file mode 100644 index 000000000..7c19b0df5 --- /dev/null +++ b/.github/scripts/i18n/glossary/frontend/zh.json @@ -0,0 +1,2562 @@ +{ + "\"partner nodes\" credit balance": "\"合作伙伴节点\"积分余额", + "(iterative)": "(迭代)", + "(linked)": "(已关联)", + "(requires page reload)": "(需要重新加载页面)", + "+ upload a cover": "+ 上传封面", + "+ upload a profile picture": "+ 上传头像", + "/ member": "/ 每成员", + "/ month": "美元 / 月", + "1 hr": "1 小时", + "1 output": "1 个输出", + "20% discount": "20% 减免", + "30 min": "30 分钟", + "3d assets / game assets": "3D 资产 / 游戏资产", + "3d model": "3D 模型", + "3d model loaded successfully": "3D模型加载成功", + "3d viewer": "3D 查看器(测试版)", + "3d_models": "3D模型", + "3dviewer": "3D查看器", + "a-z": "字母顺序", + "about": "关于", + "about comfyui": "关于ComfyUI", + "about data collection": "关于数据收集", + "about non-whitelisted sites": "关于非白名单网站", + "accept terms": "接受条款", + "access required": "需要访问权限", + "access restricted": "访问受限", + "account initialized": "账户已初始化", + "account settings": "用户设置", + "action on link release (shift)": "释放连线时的操作(Shift)", + "actions": "操作", + "activate layer": "活跃层", + "active": "活跃", + "active jobs": "活跃任务", + "activity": "活动", + "adaptive projected guidance": "自适应投影引导", + "add api credits": "添加API额度", + "add credit card": "添加信用卡", + "add credits": "添加积分", + "add group": "添加组", + "add group for selected nodes": "为选定节点添加组", + "add more credits": "获取更多积分", + "add more credits to run": "获取更多积分来运行", + "add more credits whenever": "随时获取更多积分", + "add new keybinding": "添加新快捷键", + "add node": "添加节点", + "add node filter condition": "添加节点筛选条件", + "add noise to image": "图像添加噪声", + "add output examples": "添加输出示例", + "add secret": "添加机密", + "add subgraph to library": "添加子工作流到节点库", + "add text prefix": "文本前添加", + "add text suffix": "文本后添加", + "add to bookmarks": "添加到书签", + "add to current workflow": "添加到当前工作流", + "added nodes follow the cursor": "新增节点跟随光标", + "additional info": "附加信息", + "additional information": "附加信息", + "additional tags": "附加标签", + "addnoise": "添加噪波", + "adjust audio volume": "音频调整音量", + "adjust brightness": "调整亮度", + "adjust contrast": "调整对比度", + "adjust size": "调整尺寸", + "adjustments": "调整", + "advanced": "高级", + "advanced inputs": "高级输入", + "after": "之后", + "after delay": "延迟后", + "align selected to": "对齐选中项到", + "alignyourstepsscheduler": "AlignYourSteps调度器", + "all downloads completed": "所有下载已完成", + "all exports completed": "全部导出完成", + "all extensions": "全部扩展", + "all installed": "全部已安装", + "all keybindings reset to default": "所有快捷键已重置为默认值", + "all models": "全部模型", + "all templates": "所有模板", + "all up to date": "全部已是最新", + "all workflows": "全部工作流", + "alpha": "透明度", + "always shrink new nodes": "始终收缩新节点", + "always snap to grid": "始终吸附到网格", + "amount": "数量", + "amount (usd)": "支付金额(美元)", + "amount to pay in dollars": "支付金额(美元)", + "an error occurred": "发生错误", + "an unexpected error occurred": "发生了意外错误", + "an unknown error occurred": "发生未知错误", + "api endpoints to run workflows": "运行工作流的 API 端点", + "api key": "API 密钥", + "api key cleared": "API 密钥已清除", + "api key stored": "API 密钥已存储", + "api keys & secrets": "API 密钥与机密", + "api node(s)": "API节点", + "api nodes": "API 节点", + "api pricing": "API 价格", + "app": "应用", + "app builder": "应用构建器", + "app builder mode": "应用构建模式", + "app has no outputs": "应用没有输出", + "app mode": "App 模式", + "app mode in beta": "App 模式测试版 - 提供反馈", + "appearance": "外观", + "apply": "应用", + "apply changes": "应用更改", + "apply controlnet": "应用ControlNet(旧版)", + "apply controlnet with vae": "应用ControlNet", + "apply morphology": "图像形态学", + "apply style model": "应用风格模型", + "apply to whole image": "应用到图像整体", + "apps": "应用", + "architecture": "架构", + "area composition": "区域合成", + "arrange": "排列", + "arrange as grid": "网格排列", + "arrange horizontally": "水平排列", + "arrange vertically": "垂直排列", + "arrangement spacing": "排列间距", + "arrow": "箭头", + "asset collection": "资产合集", + "asset deleted successfully": "资产删除成功", + "assets": "资产", + "at least one": "至少一个", + "attention": "注意力", + "attention_experiments": "注意力实验", + "audio": "音频", + "audio / music": "音频 / 音乐", + "audio equalizer (3-band)": "音频均衡器(三段)", + "audio failed to load": "音频加载失败", + "audio progress": "音频进度", + "audio_encoder": "音频编码器", + "audio_encoder_output": "音频编码器输出", + "audio_record": "音频录制", + "audioencoderencode": "音频编码器编码", + "author": "作者", + "auto": "自动", + "auto queue": "自动执行", + "auto save": "自动保存", + "auto save delay (ms)": "自动保存延迟(毫秒)", + "auto-pan speed": "自动平移速度", + "automatic updates": "自动更新", + "automatically check for updates": "自动检查更新", + "automatically load all model folders": "自动加载所有模型文件夹", + "automatically update the value": "自动更新该值", + "back to all assets": "返回所有资产", + "back to all plans": "返回所有方案", + "back to login": "返回登录", + "back to workflow": "返回工作流", + "background": "背景", + "background color": "背景颜色", + "background removal": "背景移除", + "background_removal": "背景移除", + "banned": "已禁止", + "base image layer": "基础图像层", + "base layer preview": "基础图像层预览", + "base model": "基础模型", + "base model unknown": "基础模型未知", + "base models": "基础模型", + "basic guider": "基本引导器", + "basic info": "基本信息", + "basics": "基础", + "basicscheduler": "基本调度器", + "batch": "批处理", + "batch count": "批次数量", + "batch count limit": "批处理计数限制", + "batch image": "批量图像", + "batch images": "批量图像", + "batch latents": "批量latent", + "batch masks": "批量mask", + "batch rename": "批量重命名", + "beeble switchx image edit": "Beeble SwitchX 图像编辑", + "beeble switchx video edit": "Beeble SwitchX 视频编辑", + "before": "之前", + "beginner — following tutorials": "刚刚开始(正在学习教程)", + "beta": "测试版", + "betasamplingscheduler": "Beta采样调度器", + "billed monthly": "每月付款", + "black": "黑色", + "blend images": "混合图像", + "blue": "蓝色", + "blueprint": "蓝图", + "blueprints": "蓝图", + "blur image": "模糊图像", + "bookmark": "书签", + "bookmark node": "收藏节点", + "bookmarked": "已收藏", + "bookmarks": "收藏夹", + "boolean": "布尔", + "bottom": "底部", + "bottom panel": "底部面板", + "bounding box": "边界框", + "bounding_box": "边界框", + "box": "盒子", + "bria fibo image edit": "Bria FIBO 图像编辑", + "bria remove image background": "Bria 移除图像背景", + "bria remove video background": "Bria 移除视频背景", + "bria remove video background (transparent)": "Bria 移除视频背景(透明)", + "bria video green screen": "Bria 视频绿幕", + "briefcase": "公文包", + "brown": "棕色", + "browse": "浏览", + "browse assets": "浏览资产", + "browse example templates": "浏览示例模板", + "browse files": "浏览文件", + "browse templates": "浏览模板", + "brush": "画笔", + "brush adjustment": "画笔调整", + "brush adjustment speed multiplier": "画笔调整速度倍增器", + "brush settings": "笔刷设置", + "brush shape": "笔刷形状", + "build an app": "构建应用", + "build app": "进入应用构建器", + "buy": "购买", + "buy now": "立即购买", + "bypass": "绕过", + "bypass group nodes": "绕过分组节点", + "bypass/unbypass selected nodes": "忽略/取消忽略选定节点", + "bytedance": "字节跳动", + "bytedance create image asset": "ByteDance 创建图像资产", + "bytedance create video asset": "ByteDance 创建视频资产", + "bytedance first-last-frame to video": "字节跳动首尾帧转视频", + "bytedance image": "字节跳动图片", + "bytedance image to video": "字节跳动图片转视频", + "bytedance reference images to video": "字节跳动参考图像转视频", + "bytedance seed": "字节跳动 Seed", + "bytedance text to video": "字节跳动文生视频", + "cache": "缓存", + "calculating dimensions": "正在计算尺寸", + "camera": "相机", + "camera settings": "相机设置", + "camera type": "相机类型", + "camera_control": "相机控制", + "cancel": "取消", + "cancel all running jobs": "取消所有正在运行的任务", + "cancel current run": "取消当前任务", + "cancel download": "取消下载", + "cancel job": "取消任务", + "cancel selection": "取消选择", + "cancel subscription": "取消订阅", + "cancel this run": "取消本次运行", + "canceled": "已取消", + "cancelled": "已取消", + "cannot create subgraph": "无法创建子工作流", + "cannot delete installed blueprints": "无法删除已安装的蓝图", + "canny to image": "Canny转图像", + "canny to video": "Canny转视频", + "canvas": "画布", + "canvas background image": "画布背景图像", + "canvas mode": "画布模式", + "canvas navigation": "画布导航", + "canvas performance": "画布性能", + "canvas toggle link visibility": "切换链接可见性", + "canvas toggle lock": "切换视图锁定", + "canvas toggle minimap": "画布切换小地图", + "canvas toolbar": "画布工具栏", + "canvas zoom speed": "画布缩放速度", + "capture": "捕获", + "card": "卡片", + "categories": "分类", + "categorized": "原始顺序", + "category": "类别", + "center camera on model": "将相机居中到模型", + "cfg guider": "CFG引导器", + "cfg override": "CFG 覆盖", + "cfgnorm": "CFG归一化", + "change hdri": "更换HDRI", + "change keybinding": "更改快捷键", + "chart": "图表", + "check for custom node updates": "检查自定义节点更新", + "check for updates": "检查更新", + "checking media visibility…": "正在检查媒体可见性…", + "checkpoints": "模型", + "choose a profile picture": "选择头像", + "choose download servers manually": "手动选择下载服务器", + "choose file to upload": "选择要上传的文件", + "choose inputs": "选择输入", + "choose installation location": "选择安装位置", + "choose outputs": "选择输出", + "choose where to install comfyui": "选择ComfyUI的安装位置", + "choose your hardware setup": "选择您的硬件配置", + "chromaradianceoptions": "ChromaRadiance选项", + "circle": "圆形", + "clear": "清除", + "clear all": "全部清除", + "clear filters": "清除筛选", + "clear job history": "清除任务记录", + "clear pending tasks": "清除待处理任务", + "clear queue": "清理队列", + "clear queued": "清除已执行", + "clear recording": "清除录制", + "clear url": "清除链接", + "clear workflow": "清空工作流", + "click": "点击", + "click to browse or": "点击浏览或", + "click to clear queue": "点击清空队列", + "click to learn more →": "点击了解更多 →", + "click to reset zoom": "点击重置缩放", + "clip": "CLIP", + "clip set last layer": "设置CLIP最后一层", + "clip text encode (prompt)": "CLIP文本编码", + "clip text encode for lumina2": "CLIP文本编码(Lumina2)", + "clip vision encode": "CLIP视觉编码", + "clip_vision": "CLIP视觉", + "clip_vision_output": "CLIP视觉输出", + "clipattentionmultiply": "CLIP注意力相乘", + "clipmergeadd": "CLIP相加", + "clipmergesimple": "CLIP融合简易", + "clipmergesubtract": "CLIP相减", + "clipsave": "CLIP保存", + "clipspace": "剪贴空间", + "cliptextencodecontrolnet": "CLIP文本编码(ControlNet)", + "cliptextencodeflux": "CLIP文本编码(Flux)", + "cliptextencodehidream": "CLIP文本编码(HiDream)", + "cliptextencodehunyuandit": "CLIP文本编码(混元DiT)", + "cliptextencodekandinsky5": "CLIP文本编码(Kandinsky5)", + "cliptextencodepixartalpha": "CLIP文本编码(PixArtAlpha)", + "cliptextencodesd3": "CLIP文本编码(SD3)", + "cliptextencodesdxl": "CLIP文本编码(SDXL)", + "cliptextencodesdxlrefiner": "CLIP文本编码(SDXLRefiner)", + "clone": "克隆", + "close anyway": "仍然关闭", + "close current workflow": "关闭当前工作流", + "close dialog": "关闭对话框", + "close other tabs": "关闭其他标签", + "close tab": "关闭标签", + "close tabs to left": "关闭左侧标签", + "close tabs to right": "关闭右侧标签", + "cloud": "云端", + "cloud survey": "云调研", + "collapse": "折叠", + "collapse all": "全部折叠", + "collapse/expand selected nodes": "折叠/展开选定节点", + "color": "颜色", + "color palette": "色彩主题", + "color picker": "取色器", + "color saturation and brightness": "颜色饱和度和亮度", + "color select settings": "色彩选取设置", + "color selector": "色彩选取", + "colors": "颜色", + "combine": "组合", + "combine hooks [2]": "组合约束 [2]", + "combine hooks [4]": "组合约束 [4]", + "combine hooks [8]": "组合约束 [8]", + "combine masks": "合成遮罩", + "combo": "组合", + "comfy": "舒适", + "comfy api key": "Comfy API 密钥", + "comfy blueprints": "Comfy 蓝图", + "comfy cloud": "Comfy 云", + "comfy nodes": "Comfy 节点", + "comfy-desktop": "Comfy桌面版", + "comfyorg logo": "ComfyOrg 徽标", + "comfyui docs": "ComfyUI 文档", + "comfyui examples": "ComfyUI示例", + "comfyui forum": "ComfyUI 论坛", + "comfyui issues": "ComfyUI 问题", + "comfyui logo": "ComfyUI 标志", + "comfyui-manager upgrade required": "需要升级 ComfyUI-Manager", + "coming soon": "即将推出", + "command": "指令", + "community": "社区", + "compare images": "图像对比", + "compare text": "比较", + "compatible alternatives": "兼容替代项", + "compatible base models": "兼容基础模型", + "completed": "已完成", + "completed ✓": "已完成 ✓", + "compositing": "合成", + "compute hours used": "计算耗时", + "compute hours used (most first)": "计算用时(最先)", + "concatenate audio": "音频拼接", + "concatenate text": "连接", + "cond pair": "条件对", + "cond pair combine": "条件对合并", + "cond pair set default combine": "条件对设置默认合并", + "cond pair set props": "条件对设置属性", + "cond pair set props combine": "条件对设置属性合并", + "cond set default combine": "条件设置默认合并", + "cond set props": "条件设置属性", + "cond set props combine": "条件设置属性合并", + "cond single": "条件单", + "conditioning": "条件", + "conditioning (combine)": "条件合并", + "conditioning (concat)": "条件连接", + "conditioning (set area with percentage)": "条件采样区域(系数)", + "conditioning (set area)": "条件采样区域", + "conditioning (set mask)": "条件遮罩", + "conditioningaverage": "条件平均", + "conditioningsetareapercentagevideo": "调节设置区域百分比视频", + "conditioningsetareastrength": "条件采样区域强度", + "conditioningsettimesteprange": "设置条件时间", + "conditioningstableaudio": "StableAudio条件", + "conditioningzeroout": "条件零化", + "conference or event": "会议或活动", + "confirm": "确认", + "confirm model details": "确认模型信息", + "confirm password": "确认密码", + "confirm selection": "确认选择", + "confirm your payment": "确认付款", + "confirm your plan change": "确认更改方案", + "confirmed": "已确认", + "conflicting": "存在冲突", + "conflicts": "冲突", + "connect an output": "连接输出", + "connected": "连接式", + "connection links": "连接线", + "connection taking too long": "连接时间过长", + "console": "控制台", + "console logs": "控制台日志", + "contact our support": "联系我们的支持团队", + "contact support": "联系支持", + "contact us": "联系我们", + "contains text": "包含", + "content": "内容", + "content blocked": "内容被拦截", + "context menu": "上下文菜单", + "context windows (manual)": "上下文窗口(手动)", + "continue": "继续", + "continue locally": "本地继续", + "continue to payment": "继续付款", + "control after generate": "生成后控制", + "control before generate": "生成前控制", + "control_net": "ControlNet", + "controlnet": "ControlNet", + "controlnetinpaintingalimamaapply": "应用ControlNet(阿里妈妈局部重绘)", + "convert image color to mask": "图像颜色到遮罩", + "convert image to mask": "图像转换为遮罩", + "convert mask to image": "遮罩转换为图像", + "convert number": "数字转换", + "convert selection to subgraph": "将选中内容转换为子工作流", + "convert text case": "大小写转换器", + "convert text to lowercase": "文本半角", + "convert text to uppercase": "文本全角", + "convert to subgraph": "转换为子工作流", + "converted to app workflow": "已转换为应用工作流", + "copied": "已复制", + "copied to clipboard": "已复制到剪贴板", + "copy": "复制", + "copy (clipspace)": "复制 (Clipspace)", + "copy all": "全部复制", + "copy error": "复制错误", + "copy error message": "复制报错信息", + "copy image": "复制图像", + "copy invite link": "复制邀请链接", + "copy job id": "复制队列 ID", + "copy link": "复制链接", + "copy model name": "复制模型名称", + "copy selection": "复制所选内容", + "copy system info": "复制系统信息", + "copy to clipboard": "复制到剪贴板", + "copy url": "复制链接", + "cosmosimagetovideolatent": "图像到视频Latent(Cosmos)", + "cosmospredict2imagetovideolatent": "图像到视频Latent(CosmosPredict2)", + "cost per run": "每次运行的成本", + "could not determine file type": "无法确定文件类型", + "couldn't continue oauth sign-in": "无法继续 OAuth 登录", + "cpu mode": "CPU模式", + "create": "创建", + "create 3d file (from splat)": "创建 3D 文件(由 Splat)", + "create a link": "创建链接", + "create a new blank workflow": "创建空白工作流", + "create a new workspace": "创建新工作区", + "create a profile": "创建个人资料", + "create an account": "创建一个账户", + "create camera info": "创建相机信息", + "create group node": "创建组节点", + "create hook keyframe": "创建约束关键帧", + "create hook keyframes from floats": "从浮点数创建约束关键帧", + "create hook lora": "创建约束LoRA", + "create hook lora (mo)": "创建约束LoRA(仅模型)", + "create hook model as lora": "创建约束模型为LoRA", + "create link": "创建链接", + "create list": "创建列表", + "create my profile": "创建我的个人资料", + "create new workspace": "创建新工作区", + "create profile": "创建个人资料", + "create solid mask": "纯块遮罩", + "create video": "创建视频", + "create workspace": "创建工作区", + "create your comfy hub profile": "创建你的 Comfy Hub 个人资料", + "create your profile on comfyhub": "在 ComfyHub 创建你的个人资料", + "created by": "创建者", + "credits": "积分", + "credits added successfully": "积分添加成功", + "credits available": "积分可用", + "credits have been unified": "积分已合并", + "credits per dollar": "每美元积分数", + "credits to receive": "获得积分数", + "crop by bounding boxes": "CropByBBoxes", + "crop image": "裁剪图像", + "crop image (center)": "裁剪图像(中心)", + "crop image (random)": "裁剪图像(随机)", + "crop latent": "裁剪Latent", + "crop mask": "裁剪遮罩", + "crop preview": "裁剪预览", + "cross attention method": "交叉注意力方法", + "ctrl+up/down precision": "Ctrl+上/下 精度", + "cuda device index to use": "要使用的 CUDA 设备索引", + "current plan": "当前订阅计划", + "current user": "当前用户", + "current workflow": "当前工作流", + "cursor size": "光标大小", + "curve": "曲线", + "curve editor": "曲线编辑器", + "custom": "自定义", + "custom background": "自定义背景", + "custom color palettes": "自定义色彩主题", + "custom combo": "自定义组合", + "custom node configurations": "自定义节点配置", + "custom nodes": "自定义节点", + "custom nodes manager": "自定义节点管理器", + "custom workflows or pipelines": "自定义工作流或流程", + "custom_sampling": "自定义采样", + "customize": "自定义", + "customize folder": "自定义文件夹", + "cyan": "青色", + "dark": "深色", + "dashboard": "仪表盘", + "dashboard workspace settings": "仪表盘工作区设置", + "debug": "调试", + "decoding…": "正在解码…", + "decrease brush size in maskeditor": "在 MaskEditor 中减小笔刷大小", + "decrement": "减小", + "decrement value": "递减值", + "deduplicate images": "图像去重", + "deduplicate subgraph node ids": "去重子图节点ID", + "default banner": "默认横幅", + "default pip install mirror": "默认 pip 安装镜像", + "default preset": "默认预设", + "delete": "删除", + "delete all": "全部删除", + "delete asset": "删除资产", + "delete audio file": "删除音频文件", + "delete blueprint": "删除蓝图", + "delete failed": "删除失败", + "delete image": "删除图片", + "delete preset": "删除预设", + "delete secret": "删除机密", + "delete selected items": "删除选定的项目", + "delete workflow": "删除工作流", + "delete workspace": "删除工作区", + "deleted": "已删除", + "dependencies": "依赖关系", + "depr": "已弃用", + "deprecated": "弃用", + "depth": "深度", + "depth to image": "深度转图像", + "depth to video": "深度转视频", + "describe your workflow": "描述你的工作流", + "description": "描述", + "description is required": "描述是必填的", + "deselect all": "取消全选", + "desktop app settings": "桌面应用设置", + "desktop settings": "桌面设置", + "desktop user guide": "桌面端用户指南", + "details": "详情", + "detect edges (canny)": "Canny边缘检测", + "detect face landmarks (mediapipe)": "MediaPipe 人脸标记器", + "detected": "检测到", + "detection": "检测", + "dev": "开发专用", + "dev mode": "开发模式", + "devices": "设备", + "differential diffusion": "差异扩散DifferentialDiffusion", + "diffusersloader": "Diffusers加载器", + "directml device index": "DirectML 设备索引", + "directories": "目录", + "disable animations": "禁用动画", + "disable ipex optimization": "禁用 IPEX 优化", + "disable node widget sliders": "禁用节点组件滑块", + "disable selected": "禁用选中项", + "disable smart memory management": "禁用智能内存管理", + "disable third-party": "禁用第三方", + "disable xformers optimization": "禁用 xFormers 优化", + "disablenoise": "禁用噪波", + "discard and switch": "放弃并切换", + "disconnected": "已断开连接", + "discord / community": "Discord / 社区", + "dismiss": "关闭", + "display name": "显示名称", + "distribute nodes": "分布节点", + "dock to top": "停靠到顶部", + "docked job history": "停靠的作业历史", + "docked job history/queue panel": "在资源侧边栏中使用统一作业队列", + "docs": "文档", + "documentation page": "文档页面", + "does not apply to litegraph": "仅适用于默认框架", + "don't ask again": "不再询问", + "don't show again": "不再显示", + "don't show this again": "不再显示此消息", + "double click interval (maximum)": "双击间隔(最大)", + "download": "下载", + "download all": "全部下载", + "download audio": "下载音频", + "download available": "下载可用项", + "download comfyui": "下载 ComfyUI", + "download complete": "下载完成", + "download export": "下载导出文件", + "download failed": "下载失败", + "download git": "下载 git", + "download image": "下载图片", + "download started": "已开始下载", + "download video": "下载视频", + "downloading": "正在下载", + "downloads": "下载", + "drag navigation": "拖动画布", + "draw bboxes": "绘制边界框", + "draw face mask (mediapipe)": "MediaPipe 人脸蒙版", + "drop 3d model to load": "拖放 3D 模型以加载", + "drop a video here": "将视频拖到此处", + "drop an image here": "将图片拖到此处", + "drop your file or": "拖放您的文件或", + "dual cfg guider": "双CFG引导器", + "dual model cfg guider": "双模型 CFG 指导器", + "dualcliploader": "双CLIP加载器", + "duplicate": "复制", + "duplicate current workflow": "复制当前工作流", + "duplicate tab": "复制标签", + "each month credits refill to": "每月积分补充至", + "edge threshold": "边缘阈值", + "edit & run": "编辑与运行", + "edit app": "编辑应用", + "edit control settings": "改变控制设置", + "edit display name": "编辑显示名称", + "edit image": "编辑图片", + "edit model reference method": "FluxKontext多参考潜在方法", + "edit or mask image": "编辑或遮罩图片", + "edit secret": "编辑机密", + "edit subgraph": "编辑子图", + "edit subgraph widgets": "编辑子工作流组件", + "edit token weight": "编辑令牌权重", + "edit workspace details": "编辑工作区详情", + "edit_models": "编辑模型", + "education (student or educator)": "教育(学生或教师)", + "elevenlabs instant voice clone": "ElevenLabs 即时语音克隆", + "elevenlabs speech to speech": "ElevenLabs 语音转换", + "elevenlabs speech to text": "ElevenLabs 语音转文本", + "elevenlabs text to dialogue": "ElevenLabs 文本转对话", + "elevenlabs text to sound effects": "ElevenLabs 文本转音效", + "elevenlabs text to speech": "ElevenLabs 文字转语音", + "elevenlabs voice isolation": "ElevenLabs 语音隔离", + "elevenlabs voice selector": "ElevenLabs 声音选择器", + "eligible for free tier": "可享免费套餐", + "email": "电子邮件", + "email is required": "邮箱为必填项", + "empty": "空", + "empty audio": "空音频", + "empty canvas": "画布为空", + "empty flux 2 latent": "空Latent图像(Flux2)", + "empty hidream-o1 latent image": "空 HiDream-O1 潜空间图像", + "empty image": "空图像", + "empty latent audio": "空Latent音频", + "empty latent image": "空Latent图像", + "empty qwen image layered latent": "空Latent图像(QwenImageLayerd)", + "emptychromaradiancelatentimage": "空Latent图像(ChromaRadiance)", + "emptycosmoslatentvideo": "空Latent视频(Cosmos)", + "emptyhunyuanimagelatent": "空Latent图像(Hunyuan)", + "emptylatenthunyuan3dv2": "空Latent图像(Hunyuan3Dv2)", + "emptyltxvlatentvideo": "空Latent视频(LTXV)", + "emptymochilatentvideo": "空Latent视频(Mochi)", + "emptysd3latentimage": "空Latent图像(SD3)", + "enable 3d viewer": "启用3D查看器(测试版)", + "enable anyway": "仍然启用", + "enable cpu mode": "启用 CPU 模式", + "enable node replacement suggestions": "启用自动节点替换", + "enable or disable pack": "启用或禁用包", + "enable selected": "启用选中项", + "enable tooltips": "启用工具提示", + "encoding…": "正在编码…", + "end of billing period": "账单周期结束", + "enter": "进入", + "enter a description": "输入描述", + "enter a username": "输入用户名", + "enter app mode": "进入应用模式", + "enter base name": "输入基础名称", + "enter name": "输入名称", + "enter new name": "输入新名称", + "enter new password": "输入新密码", + "enter new value to change": "输入新值以更改", + "enter node graph": "进入节点图", + "enter pypi mirror url": "输入PyPI镜像URL", + "enter python mirror url": "输入Python镜像URL", + "enter search aliases (comma separated)": "输入搜索别名(用逗号分隔)", + "enter subgraph": "进入子图", + "enter the filename": "输入文件名", + "enter the person's email": "输入对方邮箱", + "enter the same password again": "再次输入相同的密码", + "enter workspace name": "请输入工作区名称", + "enter your api key": "请输入您的 API 密钥", + "enter your email": "输入您的电子邮件", + "enter your keybind": "输入你的快捷键", + "enter your name here": "请输入你的姓名", + "enter your password": "输入您的密码", + "epsilon scaling": "Epsilon缩放", + "eraser": "橡皮擦", + "error": "错误", + "error checking for updates": "检查更新时出错", + "error installing update": "安装更新时出错", + "error loading image": "图片加载出错", + "error loading model": "加载模型出错", + "error loading video": "视频加载出错", + "error log": "错误日志", + "error logs": "错误日志", + "error message": "报错信息", + "error message and stack trace": "错误报告和堆栈跟踪", + "error system": "错误系统", + "error updating consent": "更新同意错误", + "errors": "错误", + "essential": "常用", + "essentials": "基础", + "estimated to finish in": "预计完成于", + "estimated to start in": "预计开始于", + "event type": "事件类型", + "execute": "执行", + "execution": "执行", + "execution failed": "执行失败", + "execution has been interrupted": "执行已被中断", + "existing user": "用户已存在", + "exit app builder": "退出应用构建器", + "exit app mode": "退出应用模式", + "exit builder": "退出构建器", + "exit subgraph": "退出子工作流", + "expand": "展开", + "expand all": "全部展开", + "expand job queue": "展开任务队列", + "expand node": "展开节点", + "experimental": "实验性", + "expert — i help others": "专家(帮助他人)", + "expiry date": "过期日期", + "exponentialscheduler": "Exponential调度器", + "export": "导出", + "export (api)": "导出 (API)", + "export all workflows": "导出所有工作流", + "export failed": "导出失败", + "export model": "导出模型", + "export preset": "导出预设", + "export recording": "导出录制", + "export settings": "导出设置", + "export workflow": "导出工作流", + "export workflow (api format)": "导出工作流(API格式)", + "exporting assets": "正在导出资源", + "extendintermediatesigmas": "插值扩展Sigmas", + "extension": "扩展", + "extension at risk": "有风险的扩展", + "extension name": "扩展名称", + "extensions": "扩展", + "extract and save lora": "保存LoRA", + "extract frame": "提取帧", + "extract mesh from splat": "从 Splat 提取网格", + "extract text": "正则表达式提取", + "extract text from json": "从JSON提取字符串", + "face_detection_model": "人脸检测模型", + "failed": "失败", + "failed after": "失败于", + "failed to accept invite": "接受邀请失败", + "failed to apply texture": "应用纹理失败", + "failed to cancel subscription": "取消订阅失败", + "failed to copy job id": "未能复制队列 ID", + "failed to copy link": "复制链接失败", + "failed to copy to clipboard": "复制到剪贴板失败", + "failed to create node": "创建节点失败", + "failed to create workspace": "创建工作区失败", + "failed to create zip export": "创建ZIP导出失败", + "failed to delete asset": "删除资产失败", + "failed to delete selected assets": "未能删除所选资产", + "failed to delete workspace": "删除工作区失败", + "failed to download file": "文件下载失败", + "failed to download image": "图片下载失败", + "failed to download video": "视频下载失败", + "failed to export workflow": "工作流导出失败", + "failed to fetch server logs": "无法获取服务器日志", + "failed to import workflow assets": "导入工作流资源失败", + "failed to initialize 3d viewer": "初始化3D查看器失败", + "failed to install": "安装失败", + "failed to leave workspace": "离开工作区失败", + "failed to load 3d model": "无法加载3D模型", + "failed to load background image": "无法加载背景图片", + "failed to load hdri file": "HDRI文件加载失败", + "failed to load outputs": "加载输出失败", + "failed to load shared workflow": "加载共享工作流失败", + "failed to load subgraph blueprints": "加载子工作流蓝图失败", + "failed to load workspaces": "加载工作区失败", + "failed to open workflow": "打开工作流失败", + "failed to queue": "排队失败", + "failed to remove member": "移除成员失败", + "failed to replace nodes": "替换节点失败", + "failed to save workflow draft": "保存工作流草稿失败", + "failed to select directory": "选择目录失败", + "failed to set gizmo mode": "设置控件模式失败", + "failed to store api key": "API 密钥存储失败", + "failed to switch workspace": "切换工作区失败", + "failed to toggle camera": "切换镜头失败", + "failed to toggle gizmo": "切换控件失败", + "failed to toggle grid": "切换网格失败", + "failed to update background color": "更新背景色失败", + "failed to update background image": "更新背景图像失败", + "failed to update edge threshold": "更新边缘阈值失败", + "failed to update light intensity": "更新光照强度失败", + "failed to update material mode": "更新材质模式失败", + "failed to update node definitions": "节点定义更新失败", + "failed to update up direction": "更新向上轴失败", + "failed to update workspace": "更新工作区失败", + "failed to upload background image": "上传背景图像失败", + "failed to validate path": "路径验证失败", + "false": "否", + "faqs": "常见问题", + "favorite": "收藏", + "favorite widget": "收藏组件", + "favorited inputs": "已收藏输入", + "favorites": "收藏夹", + "feather mask": "羽化遮罩", + "feedback": "反馈", + "file": "文件", + "file formats": "文件格式", + "file name": "文件名", + "file size": "文件大小", + "file system information": "文件系统信息", + "file upload failed": "文件上传失败", + "filename": "文件名", + "fill opacity": "填充不透明度", + "filter": "过滤", + "filter by": "筛选方式", + "filter jobs": "筛选任务", + "filters": "滤镜", + "find issues": "查找问题", + "find on github": "在 GitHub 上查找", + "finish": "完成", + "finish publishing": "完成发布", + "finished": "已完成", + "fit group to contents": "适应组内容", + "fit to viewer": "适应视图", + "fit view": "适应视图", + "fit view to selected nodes": "适应视图到选中节点", + "fixed value": "固定值", + "flagged": "已标记", + "flashvsr video upscale": "FlashVSR 视频超分辨率", + "flip image": "图像翻转", + "flip latent": "翻转Latent", + "flipsigmas": "翻转Sigma", + "float": "浮点", + "floating": "浮动式", + "floats": "浮点组", + "flux": "Flux", + "flux erase image": "Flux 擦除图像", + "flux kv cache": "Flux KV 缓存", + "flux virtual try-on": "Flux 虚拟试穿", + "flux2scheduler": "Flux2调度器", + "fluxdisableguidance": "Flux禁用指导", + "fluxguidance": "Flux引导", + "fluxkontextimagescale": "图像缩放为FluxKontext", + "focus mode": "专注模式", + "folder": "文件夹", + "for more help, visit the": "如需更多帮助,请访问", + "for running commercial/proprietary models": "用于运行商业/专有模型", + "force attention upcast": "强制 upcast-attention", + "force channels-last memory format": "强制使用 channels-last 内存格式", + "forgot password": "忘记密码", + "format text": "格式化文本", + "fov": "视场", + "frame interpolate": "帧插值", + "frame nodes": "框选节点", + "free": "免费", + "friend or colleague": "朋友或同事", + "fullscreen": "全屏", + "gallery": "图库", + "gallery image": "图库图片", + "gallery thumbnail": "图库缩略图", + "gemini input files": "Gemini 输入文件", + "gemini_input_files": "GEMINI 输入文件", + "general": "常规", + "generate ltx2 prompt": "TextGenerateLTX2Prompt", + "generate text": "TextGenerate", + "generated": "已生成", + "generated assets": "生成的资源", + "generated on": "生成于", + "generatetracks": "生成轨道", + "generating video…": "正在生成视频…", + "generating…": "正在生成…", + "generation failed": "生成失败", + "generation stalled": "生成停滞", + "generation time (fastest first)": "生成时间(最快)", + "generation time (longest first)": "生成时间(最慢)", + "generation timed out": "生成超时", + "generation type": "生成类型", + "geometry estimation": "几何估算", + "get ic-lora parameters": "获取 IC-LoRA 参数", + "get image from batch": "从批次获取图像", + "get image size": "获取图像尺寸", + "get one here": "在这里获取", + "get splat": "获取 Splat", + "get splat count": "获取 Splat 数量", + "get started": "开始使用", + "get started with a template": "从模板开始", + "get video components": "获取视频元素", + "getting started": "入门", + "gitsscheduler": "GITS调度器", + "give feedback": "提交反馈", + "gizmo": "控件", + "gligen": "GLIGEN", + "gligentextboxapply": "GLIGEN文本框应用", + "global floating point precision": "全局浮点精度", + "global settings": "全局设置", + "global value": "全局值", + "glsl shader": "GLSL 着色器", + "go to node": "转到节点", + "google / search": "Google / 搜索", + "google veo 2 video generation": "Google Veo2 视频生成", + "google veo 3 video generation": "Google Veo 3 视频生成", + "graph": "画面", + "graph mode": "图形模式", + "graph navigation": "图形导航", + "green": "绿色", + "grid spacing": "网格间距", + "grid view": "网格视图", + "grok image": "Grok 图像", + "grok image edit": "Grok 图像编辑", + "grok reference-to-video": "Grok 参考生成视频", + "grok video": "Grok 视频", + "grok video edit": "Grok 视频编辑", + "grok video extend": "Grok 视频扩展", + "group": "组", + "group by": "分组方式", + "group by module source": "按模块来源分组", + "group by node category": "按节点类别分组", + "group selected nodes": "将选中节点转换为组节点", + "group selected nodes padding": "选定节点的组内边距", + "group settings": "分组设置", + "groups": "分组", + "grow mask": "扩展遮罩", + "guidance": "引导", + "guider": "引导器", + "guiders": "引导器", + "hand": "拖拽", + "happyhorse image to video": "HappyHorse 图像转视频", + "happyhorse reference to video": "HappyHorse 参考转视频", + "happyhorse text to video": "HappyHorse 文本转视频", + "happyhorse video edit": "HappyHorse 视频编辑", + "hardness": "硬度", + "hdri environment": "HDRI环境", + "heart": "心", + "height": "高度", + "help & support": "帮助和支持", + "help center": "帮助中心", + "help center menu": "帮助中心菜单", + "help fix this": "帮助修复这个", + "help us improve": "帮助我们改进", + "hex": "十六进制", + "hidden": "隐藏", + "hidden / nested parameters": "隐藏/嵌套参数", + "hide advanced": "隐藏高级选项", + "hide advanced inputs": "隐藏高级输入", + "hide built-in": "仅第三方", + "hide deprecated nodes": "隐藏已弃用节点", + "hide dev-only nodes": "隐藏仅开发者可见节点", + "hide experimental nodes": "隐藏实验性节点", + "hide features": "隐藏功能", + "hide input": "隐藏输入", + "hide left panel": "隐藏左侧面板", + "hide links": "隐藏链接", + "hide menu": "隐藏菜单", + "hide minimap": "隐藏小地图", + "hide referencing nodes": "隐藏引用节点", + "hide right panel": "隐藏右侧面板", + "hide subgraph nodes": "隐藏子图节点", + "hidream-o1 patch seam smoothing": "HiDream-O1 补丁缝隙平滑", + "hidream-o1 reference images": "HiDream-O1 参考图像", + "histogram": "直方图", + "hitpaw general image enhance": "HitPaw 通用图像增强", + "hitpaw video enhance": "HitPaw 视频增强", + "hook_keyframes": "约束关键帧", + "hooks": "约束", + "horizontal": "水平", + "hue": "色相", + "hunyuan latent refiner": "HunyuanRefinerLatent", + "hunyuan3dv2conditioning": "Hunyuan3Dv2条件", + "hunyuan3dv2conditioningmultiview": "Hunyuan3Dv2条件多视角", + "hunyuanimagetovideo": "图像到视频(Hunyuan)", + "hunyuanvideo15imagetovideo": "图像到视频(Hunyuan Video 15 )", + "hypertile": "超分块HyperTile", + "ic_lora_parameters": "IC_LORA参数", + "icon": "图标", + "ideogram 4 scheduler": "Ideogram 4 调度器", + "image": "图像", + "image api": "图像 API", + "image compare": "图像对比", + "image comparison": "图片对比", + "image composite masked": "合成图像(遮罩)", + "image does not exist": "图像不存在", + "image failed to load": "图像加载失败", + "image gallery": "图片库", + "image histogram": "图像直方图", + "image layer": "图像层", + "image not loaded": "图像未加载", + "image preview": "图像预览", + "image rgb to yuv": "图像RGB到YUV", + "image to 3d model": "图像转3D模型", + "image to image": "图像转图像", + "image to video": "图像转视频", + "image url": "图片网址", + "image yuv to rgb": "图像YUV到RGB", + "imagecompare": "图像对比", + "imageonlycheckpointsave": "保存Checkpoint(仅图像)", + "images": "图像", + "import": "导入", + "import a model": "导入模型", + "import a model from civitai": "从 Civitai 导入模型", + "import another": "导入其他", + "import anyway": "仍然导入", + "import assets & open workflow": "导入资源并打开工作流", + "import failed": "导入失败", + "import failed extensions": "导入失败的扩展", + "import keybinding preset": "导入快捷键预设", + "import not supported": "不支持导入", + "import preset": "导入预设", + "import your own loras": "导入您的 Lora", + "imported": "已导入", + "imported assets": "已导入资源", + "importing models": "正在导入模型", + "in library": "已在库中", + "in progress": "进行中", + "in workflow": "在工作流中", + "inbox": "收件箱", + "increase brush size in maskeditor": "在 MaskEditor 中增大笔刷大小", + "increment": "增加", + "increment value": "递增值", + "inference": "推理", + "info": "信息", + "initial background color": "初始背景颜色", + "initial camera type": "初始相机类型", + "initial grid visibility": "初始网格可见性", + "initial light intensity": "初始光照强度", + "initializing - almost ready": "初始化中 - 即将完成", + "inpaint": "局部重绘", + "inpaint image": "图像修复", + "inpaintmodelconditioning": "内补模型条件", + "input": "输入", + "input directory": "输入目录", + "input image couldn't be loaded": "输入图像无法加载", + "input out of range": "输入超出范围", + "inputs": "输入", + "inputs will show up here": "输入将在这里显示", + "insert": "插入", + "insert all assets as nodes": "将所有资源作为节点插入", + "insert as node in workflow": "作为节点插入到工作流", + "inspect asset": "查看资产", + "install": "安装", + "install all": "安装所有缺失节点", + "install anyway": "仍然安装", + "install error": "安装错误", + "install location": "安装位置", + "install missing custom nodes": "安装缺失的自定义节点", + "install missing nodes": "安装缺失节点", + "install node pack": "安装节点包", + "install required": "需要安装", + "install selected": "安装选定", + "installation queue": "安装队列", + "installation required": "需要安装", + "installed": "已安装", + "installing": "正在安装", + "installing comfyui": "正在安装 ComfyUI", + "instant": "实时", + "instructpix2pix": "InstructPix2Pix", + "instructpixtopixconditioning": "InstructPixToPix条件", + "insufficient credits": "积分不足", + "int": "整数", + "intensity": "强度", + "intermediate — comfortable with basics": "熟练掌握基础知识", + "interp_model": "插值模型", + "interrupt": "中断", + "interrupt all running jobs": "中断全部正在运行的任务", + "interrupted": "已中断", + "invalid api key": "无效的 API 密钥", + "invalid asset": "无效资源", + "invalid clip input": "无效的 CLIP 输入", + "invalid connection": "无效连接", + "invalid dialog": "无效对话框", + "invalid email address": "无效的电子邮件地址", + "invalid filename": "无效文件名", + "invalid input": "无效输入", + "invalid workflow": "无效工作流", + "invalid workflow request": "无效的工作流请求", + "invert": "反转", + "invert image colors": "反转图像", + "invert mask": "反转遮罩", + "invite": "邀请", + "invite accepted": "邀请已接受", + "invite date": "邀请日期", + "invite member": "邀请成员", + "invite up to": "可邀请多达", + "invoice history": "发票历史", + "items copied to clipboard": "已复制到剪贴板", + "job": "任务", + "job completed": "作业已完成", + "job details": "任务细节", + "job failed": "作业失败", + "job history": "任务历史", + "job id": "任务ID", + "job id copied to clipboard": "队列 ID 已复制到剪贴板", + "job queue": "任务队列", + "job queued": "任务添加到队列", + "job queuing": "作业排队中", + "join audio channels": "音频通道合并", + "join date": "加入日期", + "join image with alpha": "合并图像Alpha", + "kandinsky5imagetovideo": "图像到视频(Kandinsky5)", + "karrasscheduler": "Karras调度器", + "keep original order": "保持原始顺序", + "keep subscription": "保留订阅", + "keybinding": "按键绑定", + "keybinding already exists on": "快捷键已存在", + "keybinding preset imported": "快捷键预设已导入", + "keybindings": "快捷键", + "keyboard shortcuts": "键盘快捷键", + "kling camera controls": "Kling 相机控制", + "kling dual character video effects": "Kling 双角色视频特效", + "kling image(first frame) to video": "Kling 图像转视频", + "kling motion control": "Kling 动作控制", + "kling start-end frame to video": "Kling 起止帧生成视频", + "kling text to video": "Kling 文本转视频", + "kling video effects": "Kling 视频特效", + "kling video extend": "Kling 视频扩展", + "kling virtual try on": "Kling 虚拟试穿", + "krea 2 image": "Krea 2 图像", + "krea 2 style reference": "Krea 2 风格参考", + "ksampler": "K采样器", + "ksampler (advanced)": "K采样器(高级)", + "ksamplerselect": "K采样器选择", + "language": "语言", + "laplacescheduler": "Laplace调度器", + "last updated": "最后更新", + "latent": "Latent", + "latent blend": "混合Latent", + "latent composite": "合成Latent", + "latent from batch": "从批次获取Latent", + "latent_operation": "Latent操作", + "latentadd": "Latent相加", + "latentapplyoperation": "Latent应用操作", + "latentapplyoperationcfg": "Latent应用操作CFG", + "latentbatch": "组合Latent批次", + "latentbatchseedbehavior": "Latent批处理随机种行为", + "latentcompositemasked": "合成Latent遮罩", + "latentconcat": "潜在空间拼接", + "latentcut": "潜在空间切割", + "latentcuttobatch": "Latent切割", + "latentinterpolate": "Latent插值", + "latentmultiply": "Latent相乘", + "latentoperationsharpen": "Latent操作锐化", + "latentoperationtonemapreinhard": "Latent操作色调映射Reinhard", + "latentsubtract": "Latent相减", + "latest": "最新", + "layers": "图层", + "lazycache": "惰性缓存", + "learn about cloud": "了解云服务", + "learn more": "了解更多", + "learn more about data collection": "了解更多关于数据收集的信息", + "leave": "离开", + "leave workspace": "离开工作区", + "leaves value unchanged": "数值不变", + "left": "左侧", + "left mouse click behavior": "左键点击行为", + "left workspace": "已退出工作区", + "legacy": "传统", + "license": "许可证", + "light": "淺色", + "light adjustment increment": "光照调整步长", + "light intensity": "光照强度", + "light intensity maximum": "光照强度上限", + "light intensity minimum": "光照强度下限", + "light settings": "灯光设置", + "linear": "线性", + "lineart": "线稿", + "link": "连线", + "link midpoint markers": "连线中点标记", + "link release": "释放链接", + "link render mode": "连线渲染样式", + "link shape": "连线形状", + "link to": "连接到", + "lipsync": "唇形同步", + "list view": "列表视图", + "lite graph": "画面", + "litegraph": "litegraph(旧版)", + "live preview": "实时预览", + "live preview method": "实时预览", + "live sampling preview": "实时采样预览", + "live selection": "实时选择", + "load 3d & animation": "加载3D", + "load 3d model": "加载3D模型", + "load a template": "加载模板", + "load all folders": "加载所有文件夹", + "load audio": "加载音频", + "load audio encoder": "加载音频编码器", + "load background removal model": "加载背景移除模型", + "load checkpoint": "Checkpoint加载器(简易)", + "load checkpoint with config": "Ckeckpoint加载器(已弃用)", + "load clip": "加载CLIP", + "load clip vision": "加载CLIP视觉", + "load controlnet model": "加载ControlNet模型", + "load controlnet model (diff)": "加载ControlNet模型(diff)", + "load default workflow": "加载默认工作流", + "load diffusion model": "UNet加载器", + "load face detection model (mediapipe)": "加载 MediaPipe 人脸标记器", + "load frame interpolation model": "加载帧插值模型", + "load gligen model": "GLIGEN加载器", + "load hypernetwork": "超网络加载器", + "load image": "加载图像", + "load image (as mask)": "加载图像(作为遮罩)", + "load image (from folder)": "加载图像数据集", + "load image (from outputs)": "加载图像(来自输出)", + "load image-text (from folder)": "加载图像和文本数据集", + "load latent upscale model": "加载Latent放大模型", + "load lora": "LoRA加载器(仅模型)", + "load lora (bypass) (for debugging)": "加载LoRA(旁路)(用于调试)", + "load lora (model and clip)": "加载LoRA", + "load lora model": "加载 LoRA 模型", + "load ltxv audio vae": "LTXV音频VAE加载器", + "load moge model": "加载 MoGe 模型", + "load optical flow model": "加载光流模型", + "load style": "加载风格(LoRA)", + "load style model": "加载风格模型", + "load training dataset": "加载训练数据集", + "load unclip checkpoint": "unCLIPCheckpoint加载器", + "load upscale model": "加载放大模型", + "load vae": "加载VAE", + "load video": "加载视频", + "load workflow": "加载工作流", + "load3d_camera": "加载3D相机", + "load3d_model_info": "加载3D模型信息", + "load_3d": "加载3D", + "loaders": "加载器", + "loading": "加载中", + "loading asset": "正在加载资产", + "loading authorization request…": "正在加载授权请求…", + "loading background image": "正在加载背景图像", + "loading error": "加载错误", + "loading human interface": "完成中...", + "loading…": "正在加载…", + "loadlatent": "加载Latent", + "locale": "区域设置", + "locate node on canvas": "在画布上定位节点", + "lock aspect ratio": "锁定宽高比", + "lock canvas": "锁定画布", + "log in to your account": "登录您的账户", + "log in with github": "使用Github登录", + "log in with google": "使用Google登录", + "log out": "退出登录", + "logging verbosity level": "日志详细级别", + "logic": "逻辑", + "login": "登录", + "login failed": "登录失败", + "login successful": "登录成功", + "logout": "登出", + "logs": "日志", + "lora_model": "LORA模型", + "loss_map": "损失图", + "lotusconditioning": "Lotus条件", + "ltxv": "LTXV", + "ltxv audio text encoder loader": "LTXV音频文本编码器加载器", + "ltxv audio vae decode": "LTXV音频VAE解码", + "ltxv audio vae encode": "LTXV音频VAE编码", + "ltxv empty latent audio": "LTXV 空音频潜空间", + "ltxv image to video": "LTXV 图像到视频", + "ltxv preprocess": "LTXV预处理", + "ltxv reference audio (id-lora)": "LTXV 参考音频(ID-LoRA)", + "ltxv text to video": "LTXV 文本到视频", + "ltxvaddguide": "LTXV添加指导", + "ltxvconditioning": "LTXV条件", + "ltxvcropguides": "LTXV裁剪指导", + "ltxvimgtovideo": "图像到视频(LTXV)", + "ltxvimgtovideoinplace": "LTXV图像转视频(原地)", + "ltxvlatentupsampler": "LTXV潜空间上采样器", + "ltxvscheduler": "LTXV调度器", + "ltxvseparateavlatent": "LTXV分离音视频潜空间", + "luma concepts": "Luma 概念", + "luma image to image": "Luma 图像到图像", + "luma image to video": "Luma 图像转视频", + "luma reference": "Luma 参考", + "luma text to image": "Luma 文生图", + "luma text to video": "Luma 文本转视频", + "luma uni-1 image": "Luma UNI-1 图像生成", + "luma uni-1 image edit": "Luma UNI-1 图像编辑", + "luma_concepts": "Luma 概念", + "luma_ref": "Luma 参考", + "macos (m1 or later)": "MacOS (M1 或更高版本)", + "magnific image relight": "Magnific图像重光照", + "magnific image skin enhancer": "Magnific图像美肤增强", + "magnific image style transfer": "Magnific 图像风格迁移", + "magnific image upscale (creative)": "Magnific 图像放大(创意)", + "magnific image upscale (precise v2)": "Magnific 图像放大(精确 V2)", + "maintenance": "维护", + "make image grid": "图像表格", + "make training dataset": "制作训练数据集", + "manage": "管理", + "manage extensions": "管理扩展", + "manage group nodes": "管理组节点", + "manage payment": "管理付款", + "manage plan": "管理订阅", + "manage shortcuts": "管理快捷键", + "manage subscription": "管理订阅", + "manager": "管理器", + "manager extension": "管理扩展", + "manager menu": "管理菜单(旧版)", + "manual configuration": "手动配置", + "manual setup": "手动设置", + "manually configure python venv": "手动配置 python 虚拟环境", + "manualsigmas": "自定义Sigmas", + "mask": "遮罩", + "mask blending options": "遮罩混合设置", + "mask editor": "遮罩编辑器", + "mask layer": "遮罩层", + "mask opacity": "遮罩不透明度", + "mask tolerance": "遮罩阈值", + "match text": "正则表达式匹配", + "material mode": "材质模式", + "math expression": "数学表达式", + "max run duration": "运行单个工作流的最大时长", + "maximize dialog": "最大化对话框", + "maximum fps": "最大FPS", + "maximum selection limit reached": "已达到最大选择数量", + "maximum upload size (mb)": "最大上传大小 (MB)", + "media assets": "媒体资产", + "media input missing": "缺少媒体输入", + "member": "成员", + "member removed": "成员已移除", + "memory": "内存", + "menu": "菜单", + "merge audio": "音频合并", + "merge image lists": "融合图像序列", + "merge splats": "合并 Splats", + "merge text lists": "融合文本序列", + "mesh": "网格", + "message support": "联系客服", + "method": "方法", + "method used for latent previews": "用于潜空间预览的方法", + "metrics disabled": "禁用度量", + "metrics enabled": "启用度量", + "microphone permission denied": "麦克风权限被拒绝", + "migrate": "迁移", + "migrate from existing installation": "从现有安装迁移", + "migration": "迁移", + "minimap": "小地图", + "minimax hailuo video": "MiniMax 海螺视频", + "minimax image to video": "MiniMax 图像转视频", + "minimax text to video": "MiniMax 文本转视频", + "minimize node": "最小化节点", + "mirror horizontal": "水平翻转", + "mirror horizontal in maskeditor": "在蒙版编辑器中水平翻转", + "mirror settings": "镜像设置", + "mirror vertical": "垂直翻转", + "mirror vertical in maskeditor": "在蒙版编辑器中垂直翻转", + "missing": "缺失", + "missing connection": "缺少连接", + "missing inputs": "缺少输入", + "missing media inputs": "缺少媒体输入", + "missing models": "缺失模型", + "missing node packs": "缺失节点包", + "missing node type": "缺少节点类型", + "missing nodes": "缺失节点", + "model": "模型", + "model access required": "需要模型访问权限", + "model description": "模型描述", + "model download failed": "模型下载失败", + "model filter": "模型筛选", + "model info": "模型信息", + "model library": "模型库", + "model name": "模型名", + "model providers": "模型提供商", + "model settings": "模型设置", + "model size (low to high)": "模型大小(从低到高)", + "model tagging": "模型标签", + "model type": "模型类型", + "model_merging": "模型合并", + "model_patch": "模型补丁", + "model_specific": "模型特定", + "model_task_id": "模型任务ID", + "modelcomputedtype": "模型计算Dtype", + "modelmergeadd": "模型相加", + "modelmergeauraflow": "模型融合(Auraflow )", + "modelmergeblocks": "模型融合(分块)", + "modelmergecosmos14b": "模型融合(Cosmos14B)", + "modelmergecosmos7b": "模型融合(COsmos7B)", + "modelmergecosmospredict2_14b": "模型融合(CosmosPredict2_14B)", + "modelmergecosmospredict2_2b": "模型融合(CosmosPredict2_2B)", + "modelmergeflux1": "模型融合(Flux1)", + "modelmergeltxv": "模型融合(LTXV)", + "modelmergemochipreview": "模型融合(Mochi预览)", + "modelmergeqwenimage": "模型融合Qwen图像", + "modelmergesd1": "模型融合(SD1)", + "modelmergesd2": "模型融合(SD2)", + "modelmergesd35_large": "模型融合(SD35_大)", + "modelmergesd3_2b": "模型融合(SD3_2B)", + "modelmergesdxl": "模型融合(SDXL)", + "modelmergesimple": "模型融合(简易)", + "modelmergesubtract": "模型相减", + "modelmergewan2_1": "模型融合(WAN2.1)", + "modelnoisescale": "模型噪声尺度", + "modelpatchloader": "加载模型补丁", + "models": "模型", + "models aren't available on cloud": "模型在云端不可用", + "models ready to use": "模型即刻可用", + "modelsamplingauraflow": "采样算法(AuraFlow)", + "modelsamplingcontinuousedm": "采样算法(连续EDM)", + "modelsamplingcontinuousv": "采样算法(连续V)", + "modelsamplingdiscrete": "采样算法(离散)", + "modelsamplingflux": "采样算法(Flux)", + "modelsamplingltxv": "采样算法(LTXV)", + "modelsamplingsd3": "采样算法(SD3)", + "modelsamplingstablecascade": "采样算法(Stable Cascade)", + "modelsave": "保存模型", + "modify keybinding": "修改快捷键", + "module": "模块", + "moge_geometry": "MOGE几何", + "moge_model": "MOGE模型", + "monthly": "月度", + "monthly credit bonus": "每月积分奖励", + "monthly credits": "每月积分", + "monthly credits / member": "每成员每月积分", + "more details on this template": "这是什么?", + "more options": "更多选项", + "more workflows": "更多工作流", + "most popular": "最受欢迎", + "most recent": "最新", + "most relevant": "最相关", + "mouse wheel scroll": "鼠标滚轮滚动", + "move selected nodes down": "下移所选节点", + "move selected nodes left": "左移所选节点", + "move selected nodes right": "右移所选节点", + "move selected nodes up": "上移所选节点", + "multi-select dropdown": "多选下拉框", + "multigpu": "多GPU", + "multigpu cfg split": "多GPU CFG 拆分", + "multiple assets selected": "已选择多个资源", + "music generation": "音乐生成", + "mute": "禁用", + "mute/unmute selected nodes": "静音/取消静音选定节点", + "my account settings": "我的用户设置", + "my blueprints": "我的蓝图", + "my models": "我的模型", + "name is required": "名称为必填项", + "nano banana (google gemini image)": "Nano Banana (Google Gemini 图像)", + "native app": "本地应用", + "navigation mode": "画布导航模式", + "negative": "负面", + "network": "网络", + "new blank workflow": "新建空白工作流", + "new folder": "新文件夹", + "new node library design": "全新节点库设计", + "new user": "新用户", + "new workspace": "新建工作区", + "new — never used it": "ComfyUI 新手(从未使用过)", + "newest": "最新", + "newest first": "最新", + "newsletter or blog": "新闻通讯或博客", + "next billing cycle": "下一个计费周期", + "next image": "下一张图像", + "next month invoice": "下月账单", + "next opened workflow": "下一个打开的工作流", + "next slide": "下一张幻灯片", + "nightly": "每夜", + "no 3d scene to export": "没有3D场景可以导出", + "no action": "无操作", + "no active jobs": "无活跃任务", + "no additional tags": "无附加标签", + "no assets found": "未找到资产", + "no audio recorded": "未录制音频", + "no bookmarks yet": "暂无收藏", + "no color": "无色", + "no conflicts detected": "未检测到冲突", + "no description available": "无可用描述", + "no description set": "未设置描述", + "no errors": "无错误", + "no extensions in workflow": "工作流中无扩展", + "no extensions installed": "未安装扩展", + "no favorited inputs": "暂无已收藏输入", + "no files found": "未找到文件", + "no generated files found": "未找到生成的文件", + "no images to compare": "没有可以对比的图像", + "no imported files found": "未找到导入的文件", + "no input image connected": "未连接输入图像", + "no inputs": "无输入", + "no inputs added yet": "尚未添加输入项", + "no items match your search": "没有符合搜索条件的项目", + "no keybinding": "无快捷键", + "no members": "暂无成员", + "no missing nodes": "无缺失节点", + "no nodes": "暂无节点", + "no nodes found": "未找到节点", + "no output nodes added yet": "尚未添加输出节点", + "no output nodes selected": "未选择输出节点", + "no outputs added yet": "尚未添加输出", + "no pending invites": "暂无待处理邀请", + "no recent releases": "没有最近的发布", + "no results": "无结果", + "no results found": "未找到结果", + "no stacktrace available": "无可用堆栈跟踪", + "no tasks found": "未找到任务", + "no templates found": "未找到模板", + "no templates to export": "没有模板可以导出", + "no update found": "未发现更新", + "no valid import source detected": "检测不到有效的导入源", + "node": "节点", + "node color": "节点颜色", + "node colors": "节点颜色", + "node content error": "节点内容错误", + "node definitions updated": "节点定义已更新", + "node graph": "节点图", + "node has no inputs": "节点没有输入", + "node header error": "节点标题错误", + "node id badge mode": "节点ID标签", + "node info": "节点信息", + "node library": "节点库", + "node life cycle badge mode": "节点制作周期标签", + "node links": "节点连接", + "node opacity": "节点不透明度", + "node pack": "节点包", + "node pack info": "节点包信息", + "node preview": "显示节点预览", + "node render error": "节点渲染错误", + "node search box": "节点搜索框", + "node search box implementation": "节点搜索框", + "node slots error": "节点插槽错误", + "node source badge mode": "节点源标签", + "node state": "节点状态", + "node templates": "节点模板", + "node widget": "节点组件", + "node widgets error": "节点控件错误", + "nodes": "节点", + "nodes aren't available on cloud": "节点在云端不可用", + "nodes can be replaced": "节点可被替换", + "nodes manager": "自定义节点管理器", + "nodes running": "节点正在运行", + "noise": "噪波", + "normal": "法线", + "normalize image colors": "规格化图像", + "normalized attention guidance": "归一化注意力引导", + "normalizevideolatentstart": "规格化视频Latent", + "not available": "不可用", + "not installed": "未安装", + "not sure": "不确定", + "nothing selected": "未选择任何内容", + "nothing to copy": "没有可以复制的内容", + "nothing to delete": "没有可以删除的内容", + "nothing to group": "没有可分组的内容", + "nothing to queue": "没有可加入队列的内容", + "nothing to rename": "没有可以重命名的内容", + "notification preferences": "通知偏好", + "number of nodes suggestions": "节点建议数量", + "number of runs": "运行次数:", + "ok, got it": "好的,知道了", + "oldest first": "最旧", + "only applies to v1": "仅适用于默认框架", + "only civitai urls are supported": "仅支持 Civitai 链接", + "only for litegraph searchbox/context menu": "仅适用于 litegraph", + "only safetensor format is allowed": "仅允许 SafeTensor 格式", + "opacity": "不透明度", + "open about comfyui": "打开关于ComfyUI", + "open all workflows": "打开所有工作流", + "open clipspace": "打开剪贴板", + "open color picker in maskeditor": "在 MaskEditor 中打开取色器", + "open comfy-org discord": "打开Comfy-Org Discord", + "open comfyui docs": "打开ComfyUI文档", + "open comfyui forum": "打开 Comfy-Org 论坛", + "open comfyui issues": "打开ComfyUI问题", + "open custom nodes folder": "打开自定义节点文件夹", + "open dev tools": "打开开发者工具", + "open devtools": "打开开发者工具", + "open image": "打开图像", + "open in 3d viewer": "在 3D 查看器中打开", + "open in mask editor": "用遮罩编辑器打开", + "open inputs folder": "打开输入文件夹", + "open logs": "打开日志", + "open logs folder": "打开日志文件夹", + "open manager": "打开管理器", + "open models folder": "打开模型文件夹", + "open new issue": "打开新问题", + "open node manager": "打开节点管理器", + "open outputs folder": "打开输出文件夹", + "open shared workflow": "打开共享工作流", + "open sign in dialog": "打开登录对话框", + "open without importing": "不导入直接打开", + "open workflow": "打开工作流", + "open workflow in new tab": "在新标签页中打开工作流", + "openai chatgpt advanced options": "OpenAI ChatGPT 高级选项", + "openai gpt image 2": "OpenAI GPT 图像 2", + "openai_chat_config": "OpenAI对话文件", + "openai_input_files": "OpenAI输入文件", + "opened workflows position": "已打开工作流的位置", + "operations": "操作", + "optical_flow": "光流", + "optimalstepsscheduler": "OptimalSteps调度器", + "or continue with": "或者继续使用", + "original": "原始", + "orthographic": "正交", + "outpaint image": "图像扩展", + "output": "输出", + "output directory": "输出目录", + "outputs": "输出", + "overwrite": "覆盖", + "overwrite preset": "覆盖预设", + "owner": "所有者", + "ownership": "所属", + "packs selected": "选定的包", + "pad image for outpainting": "外补画板", + "paint bucket settings": "填充设置", + "paint layer": "绘画层", + "pale blue": "淡蓝色", + "pan mode": "平移模式", + "panel controls": "面板控制", + "panning": "平移", + "panorama": "全景", + "parameters": "参数", + "partner": "合作伙伴", + "partner nodes": "合作节点", + "partner nodes pricing": "合作伙伴节点积分", + "password": "密码", + "password requirements": "密码要求", + "password reset email sent": "重置密码邮件已发送", + "password reset sent": "密码重置邮件已发送", + "password updated": "密码已更新", + "passwords must match": "密码必须匹配", + "paste": "粘贴", + "paste image": "粘贴图像", + "paste link here": "粘贴链接到此", + "paste with connect": "粘贴并连接", + "patch": "补丁", + "patchmodeladddownscale (kohya deep shrink)": "收缩模型UNET(Kohya Deep Shrink)", + "pause": "暂停", + "pause download": "暂停下载", + "paused": "已暂停", + "pending": "待定", + "pending tasks deleted": "待处理任务已删除", + "permissions": "权限", + "perp-neg (deprecated by perp-neg guider)": "Perp-Neg(已弃用,使用PerpNegGuider)", + "perp-neg guider": "PerpNeg引导器", + "personal": "个人", + "personal information": "个人信息", + "personal use": "个人使用", + "personal workspace": "个人工作区", + "perspective": "透视", + "perturbedattentionguidance": "PAG注意力引导", + "photomaker": "PhotoMaker", + "photomakerencode": "PhotoMaker编码", + "photomakerloader": "PhotoMaker加载器", + "pid conditioning": "PiD 条件处理", + "pin": "固定", + "pin/unpin selected items": "固定/取消固定选定项目", + "pin/unpin selected nodes": "固定/取消固定选定节点", + "pink": "粉色", + "pinned": "顶固", + "pip install mirror for pytorch": "用于pytorch的Pip安装镜像", + "pixverse image to video": "PixVerse 图像转视频", + "pixverse template": "PixVerse 模板", + "pixverse text to video": "PixVerse 文本转视频", + "pixverse transition video": "PixVerse 转场视频", + "pixverse_template": "Pixverse 模板", + "plan & credits": "计划与积分", + "plans & pricing": "订阅和定价", + "play": "播放", + "play recording": "播放录音", + "play/pause": "开启/暂停", + "playback speed": "播放速度", + "playing": "播放中", + "please help improve comfyui": "请帮助我们改进ComfyUI", + "please select output nodes": "请选择输出节点", + "plot loss graph": "绘制损失图", + "point cloud": "点云", + "point cloud engine": "点云引擎", + "pointer": "指针", + "pointer click drift (maximum distance)": "指针点击漂移(距离)", + "pointer click drift delay": "指针点击漂移延迟", + "polyexponentialscheduler": "Polyexponential调度器", + "popular": "热门", + "porter-duff image composite": "Porter-Duff图像合成", + "pose to image": "姿态转图像", + "pose to video": "姿态转视频", + "positive-biased guidance": "真寻太可爱了,她应该有个更好的引导功能!!(。・ω・。)", + "pre-paid credits": "预付款额度", + "preparation failed": "准备失败", + "preparation timed out": "准备超时", + "preprocessors": "预处理器", + "prevent attention upcast": "不使用 upcast-attention", + "preview": "预览", + "preview 3d & animation": "预览3D", + "preview 3d (advanced)": "3D 预览(高级)", + "preview as text": "预览任意", + "preview audio": "预览音频", + "preview image": "预览图像", + "preview image format": "预览图像格式", + "preview mask": "预览遮罩", + "preview output": "预览输出", + "preview point cloud": "预览点云", + "preview splat": "预览 Splat", + "preview version": "预览版", + "previous": "上一个", + "previous image": "上一张图像", + "previous opened workflow": "上一个打开的工作流", + "previous slide": "上一张幻灯片", + "primitive": "基础", + "privacy policy": "隐私政策", + "processing video…": "正在处理视频…", + "processing…": "正在处理…", + "profile": "档案", + "profile creation": "个人资料创建", + "prompt execution failed": "提示执行失败", + "prompt has no outputs": "提示无输出", + "prompt is empty": "提示词为空", + "prompt validation failed": "提示校验失败", + "properties": "属性", + "properties panel": "属性面板", + "provider": "提供商", + "provider is required": "提供商为必填项", + "public models": "公共模型", + "publish": "发布", + "publish failed": "发布失败", + "publish subgraph": "发布子工作流", + "publish to comfyhub": "发布到 ComfyHub", + "publish to the comfyhub": "发布到 ComfyHub", + "published successfully": "发布成功", + "publisher": "出版商", + "purchase credits": "购买积分", + "purchase failed": "购买失败", + "purple": "紫色", + "pypi install mirror": "Pypi 安装镜像", + "python install mirror": "Python安装镜像", + "quadruplecliploader": "四重CLIP加载器", + "quantize image": "量化图像", + "queue": "队列", + "queue button": "执行按钮", + "queue history size": "队列历史大小", + "queue panel": "队列面板", + "queue position": "队列位置", + "queue progress": "队列进度", + "queue prompt": "执行提示词", + "queue prompt (front)": "执行提示词 (优先执行)", + "queue selected output nodes": "将所选输出节点加入队列", + "queued": "已执行", + "queued at": "执行于", + "quick fix available": "可用快速修复", + "quick purchase": "快速购买", + "quit": "退出", + "quiver image to svg": "Quiver 图像转SVG", + "quiver text to svg": "Quiver 文本转SVG", + "qwen": "Qwen千问", + "randomize value": "随机值", + "randomnoise": "随机噪波", + "ratio": "比例", + "re-authentication required": "需要重新认证", + "re-install": "重新安装", + "ready": "就绪", + "rebatch images": "重设图像批次", + "rebatch latents": "重设Latent批次", + "recent": "最近", + "recent releases": "最近发布", + "recents": "最近使用", + "recommended": "推荐", + "reconnected": "已重新连接", + "reconnecting": "重新连接中", + "record audio": "录制音频", + "recraft color rgb": "Recraft 颜色 RGB", + "recraft controls": "Recraft 控件", + "recraft create style": "Recraft创建风格", + "recraft creative upscale image": "Recraft 创意放大图像", + "recraft crisp upscale image": "Recraft 清晰放大图像", + "recraft image inpainting": "Recraft 图像修复", + "recraft image to image": "Recraft 图像到图像", + "recraft remove background": "Recraft 移除背景", + "recraft replace background": "Recraft 更换背景", + "recraft style - digital illustration": "Recraft 风格 - 数字插画", + "recraft style - logo raster": "Recraft 风格 - 标志光栅图", + "recraft style - realistic image": "Recraft 风格 - 真实图像", + "recraft text to image": "Recraft 文本转图像", + "recraft text to vector": "Recraft 文本转矢量", + "recraft v4 text to image": "Recraft V4 文本转图像", + "recraft v4 text to vector": "Recraft V4 文本转矢量", + "recraft vectorize image": "Recraft 矢量化图像", + "recraft_color": "Recraft 颜色", + "recraft_controls": "Recraft 控件", + "recraft_v3_style": "Recraft V3 风格", + "red": "红色", + "redo": "重做", + "reference audio": "ReferenceTimbreAudio", + "referencelatent": "参考Latent", + "refresh": "刷新", + "refresh credits": "刷新额度", + "refresh node": "刷新节点", + "refresh node definitions": "刷新节点", + "refreshing": "刷新中", + "reinstall": "重装", + "reload to apply changes": "重新加载以应用更改", + "remove": "移除", + "remove all": "全部移除", + "remove background": "移除背景", + "remove background image": "移除背景图片", + "remove bypass": "删除所有忽略节点", + "remove example image": "移除示例图像", + "remove from bookmarks": "从书签中移除", + "remove hdri": "移除HDRI", + "remove image": "移除图片", + "remove job": "移除任务", + "remove keybinding": "移除快捷键", + "remove member": "移除成员", + "remove tag": "移除标签", + "remove video": "移除视频", + "rename": "重命名", + "rename widget": "重命名组件", + "rename workflow": "重命名工作流", + "render bypass state": "渲染绕过状态", + "render error state": "渲染错误状态", + "render moge geometry": "MoGe 渲染", + "render splat": "渲染 Splat", + "repeat image batch": "复制图像批次", + "repeat latent batch": "复制Latent批次", + "replace all": "全部替换", + "replace node": "替换节点", + "replace text": "替换文本", + "replace text (regex)": "正则表达式替换", + "replaceable": "可替换", + "replaced": "已替换", + "replacevideolatentframes": "替换视频Latent", + "report": "反馈", + "report error": "反馈报错", + "report issue": "报告问题", + "report submitted": "报告已提交", + "repository": "仓库", + "request failed": "请求失败", + "require confirmation when clearing workflow": "清除工作流时需要确认", + "required": "必填", + "required input missing": "缺少必需输入", + "requirements": "依赖项", + "requires additional credits": "需要额外积分", + "reroute": "重新路由", + "reroute beta": "转接点 Beta", + "reroute spline offset": "重新路由样条偏移", + "rerun": "重新运行", + "rescalecfg": "缩放CFG", + "reserved vram (gb)": "保留 VRAM (GB)", + "reset": "重置", + "reset all": "重置所有", + "reset all keybindings to default": "将所有键绑定重置为默认", + "reset all parameters": "重置所有参数", + "reset canvas view": "重置视图", + "reset to default": "重置为默认值", + "reset transform": "重置变换", + "reset view": "重置视图", + "reset view to default": "重置视图为默认", + "resize": "调整大小", + "resize and pad image": "调整尺寸并填充图像", + "resize from bottom-left corner": "从左下角调整大小", + "resize from bottom-right corner": "从右下角调整大小", + "resize from top-left corner": "从左上角调整大小", + "resize from top-right corner": "从右上角调整大小", + "resize image": "调整图像大小", + "resize image/mask": "调整图像/掩码大小", + "resize images by longer edge": "缩放图像(长边)", + "resize node to match output": "调整节点以匹配输出", + "resize selected nodes": "调整选定节点的大小", + "resizing…": "正在调整大小…", + "resolution bucket": "分辨率 Bucket", + "resolution selector": "分辨率选择器", + "restart": "重新启动", + "restart required": "需要重启", + "restore dialog": "还原对话框", + "resubscribe": "重新订阅", + "resume download": "恢复下载", + "retarget_task_id": "重定向任务ID", + "retry download": "重试下载", + "reuse parameters": "复用参数", + "reve image create": "Reve 图像生成", + "reve image edit": "Reve 图像编辑", + "reve image remix": "Reve 图像混合", + "revert changes": "撤销更改", + "review app layout": "查看应用布局", + "revoke invite": "撤销邀请", + "right": "右侧", + "rotate": "旋转", + "rotate image": "图像旋转", + "rotate latent": "旋转Latent", + "rotate left": "向左旋转", + "rotate left in maskeditor": "在蒙版编辑器中向左旋转", + "rotate right": "向右旋转", + "rotate right in maskeditor": "在蒙版编辑器中向右旋转", + "round": "圆角", + "rt-detr detect": "RT-DETR 检测", + "run branch": "运行支流节点", + "run comfyui in the cloud": "在云端运行 ComfyUI", + "run could not start": "无法启动运行", + "run ended unexpectedly": "运行意外结束", + "run moge inference": "MoGe 推理", + "run moge panorama inference": "MoGe 全景推理", + "run vae on cpu": "在 CPU 上运行 VAE", + "run workflow": "运行工作流", + "run workflow (queue at front)": "运行工作流(排在前面)", + "run workflows on your behalf": "代表您运行工作流", + "running…": "正在运行…", + "runway first-last-frame to video": "Runway首尾帧转视频", + "runway text to image": "Runway 文生图", + "sam3 detect": "SAM3 检测", + "sam3 track preview": "SAM3 跟踪预览", + "sam3 track to mask": "SAM3 跟踪转 mask", + "sam3 video track": "SAM3 视频跟踪", + "sampler": "采样器", + "sampler ar video": "采样器 AR 视频", + "samplercustom": "自定义采样器", + "samplercustomadvanced": "自定义采样器(高级)", + "samplerdpmadaptative": "DPMAdaptative采样器", + "samplerdpmpp_2m_sde": "DPMPP_2M_SDE采样器", + "samplerdpmpp_2s_ancestral": "DPMPP_2S_Ancestral采样器", + "samplerdpmpp_3m_sde": "DPMPP_3M_SDE采样器", + "samplerdpmpp_sde": "DPMPP_SDE采样器", + "samplerer_sde": "ER_SDE采样器", + "samplereulerancestral": "EulerAncestral采样器", + "samplereulerancestralcfg++": "EulerAncestralCFG++采样器", + "samplereulercfg++": "EuleCFG++采样器", + "samplerlcmupscale": "LCM缩放采样器", + "samplerlms": "LMS采样器", + "samplers": "采样器", + "samplersasolver": "SASolver采样器", + "samplerseeds2": "SEEDS2采样器", + "sampling": "采样", + "samplingpercenttosigma": "采样比到Sigma", + "save 3d model": "保存3D模型", + "save and switch": "保存并切换", + "save animated png": "保存动画(APNG)", + "save animated webp": "保存动画(WEBP)", + "save anyway": "仍然保存", + "save as new preset": "另存为新预设", + "save as template": "另存为模板", + "save audio": "保存音频", + "save audio (advanced)": "保存音频(高级)", + "save audio (flac)": "保存音频", + "save audio (mp3)": "保存音频 (MP3)", + "save audio (opus)": "保存音频 (Opus)", + "save checkpoint": "保存Checkpoint", + "save failed": "保存失败", + "save image": "保存图像", + "save image (advanced)": "保存图像(高级)", + "save image (to folder)": "保存图像数据集", + "save image (websocket)": "保存图像(网络接口)", + "save image-text (to folder)": "保存图像文本数据集", + "save lora weights": "保存 LoRA", + "save selected as template": "将选定节点另存为模板", + "save subgraph to library": "保存子工作流到节点库", + "save svg": "保存SVG", + "save to library": "保存到库", + "save training dataset": "保存训练数据集", + "save video": "保存视频", + "save webm": "保存WEBM", + "save workflow": "保存工作流", + "save workflow as": "另存工作流", + "save workflow first": "请先保存工作流", + "saved to nodes library": "已保存到节点库", + "savelatent": "保存Latent", + "saving": "正在保存", + "saving…": "正在保存…", + "scale": "缩放", + "scale image to max dimension": "图像缩放到最大尺寸", + "scale image to total pixels": "缩放图像(像素)", + "scalerope": "缩放ROPE", + "scene": "场景", + "scene settings": "场景设置", + "schedulers": "调度器", + "scheduling": "调度", + "scroll left": "向左滚动", + "scroll right": "向右滚动", + "sd3": "SD3", + "sd_4xupscale_conditioning": "SD_4X放大条件", + "sdpose draw keypoints": "SDPoseDrawKeypoints", + "sdpose face bounding boxes": "SDPoseFaceBBoxes", + "sdpose keypoint extractor": "SDPoseKeypointExtractor", + "sdturboscheduler": "SDTurbo调度器", + "search": "搜索", + "search aliases": "搜索别名", + "search assets": "搜索资产", + "search box": "搜索框", + "search extensions": "搜索扩展", + "search in node manager": "在节点管理器中搜索", + "search keybindings": "搜索快捷键", + "search models": "搜索模型", + "search nodes": "搜索节点", + "search settings": "搜索设置", + "search workflows": "搜索工作流", + "secret value": "机密值", + "secret value is required": "机密值为必填项", + "secrets": "密钥", + "see a tutorial": "查看教程", + "see details": "查看详情", + "see error": "查看错误", + "see more outputs": "查看更多输出", + "see what's new": "新功能?", + "select": "选择", + "select a thumbnail": "选择缩略图", + "select a user": "选择用户", + "select all": "全选", + "select amount": "选择金额", + "select clip device": "选择 CLIP 设备", + "select existing comfyui installation (optional)": "选择已有的ComfyUI安装(可选)", + "select frameworks": "选择框架", + "select gpu": "选择 GPU", + "select group children on click": "点击时选择组内所有子项", + "select items to copy": "选择复制", + "select items to delete": "选择删除", + "select items to duplicate": "选择复制", + "select items to migrate": "选择要迁移的项目", + "select items to rename": "选择重命名", + "select mode": "选择模式", + "select model": "选择模型", + "select model device": "选择模型设备", + "select model type": "选择模型类型", + "select projects": "选择项目", + "select vae device": "选择VAE设备", + "select version": "选择版本", + "selected": "已选择", + "selected file": "已选文件", + "selection opacity": "选取不透明度", + "self-attention guidance": "SAG自注意力引导", + "send anonymous usage metrics": "发送匿名使用情况统计", + "send report": "发送报告", + "send reset link": "发送重置链接", + "separate tags with commas": "按逗号区分标签", + "server": "服务器", + "server crashed": "服务器崩溃", + "server error": "服务器错误", + "server-config": "服务器配置", + "servers are busy": "服务器繁忙", + "service error": "服务错误", + "set as background": "设为背景", + "set clip hooks": "设置CLIP约束", + "set group nodes to always": "将分组节点设置为始终", + "set group nodes to never": "将分组节点设置为从不", + "set hook keyframes": "设置约束关键帧", + "set latent noise mask": "设置Latent噪波遮罩", + "set subgraph description": "设置子图描述", + "set subgraph search aliases": "设置子图搜索别名", + "setfirstsigma": "设置第一个Sigma", + "settings": "设置", + "setunioncontrolnettype": "设置UnionControlNet类型", + "shape": "形状", + "shapes": "形状", + "share anyway": "仍然分享", + "share url": "分享链接", + "share workflow": "分享工作流", + "sharpen image": "锐化图像", + "shortcuts": "快捷键", + "show advanced": "显示高级选项", + "show advanced inputs": "显示高级输入", + "show advanced parameters": "显示高级参数", + "show api node pricing badge": "显示 API 节点定价徽章", + "show as background": "作为背景显示", + "show assets": "显示资产", + "show assets panel": "显示资产面板", + "show confirmation when closing window": "关闭窗口时显示确认", + "show confirmation when deleting workflows": "删除工作流时显示确认", + "show connected links": "显示已连接的连线", + "show deprecated nodes in search": "在搜索中显示已弃用的节点", + "show error report": "显示错误报告", + "show errors in graph": "在图中显示错误", + "show experimental nodes in search": "在搜索中显示实验性节点", + "show frames/groups": "显示框架/分组", + "show graph canvas menu": "显示图形画布菜单", + "show grid": "显示网格", + "show info badges": "显示信息徽章", + "show input": "显示输入", + "show keybindings dialog": "显示快捷键对话框", + "show left panel": "显示左侧面板", + "show links": "显示链接", + "show maintenance tasks": "显示维护任务", + "show menu": "显示菜单", + "show minimap": "显示小地图", + "show missing models warning": "显示缺失模型警告", + "show model selector (dev)": "显示模型选择器(开发用)", + "show more features": "显示更多功能", + "show recommended widgets": "显示推荐控件", + "show referencing nodes": "显示引用节点", + "show report": "显示报告", + "show right panel": "显示右侧面板", + "show run progress bar": "显示运行进度条", + "show selection toolbox": "显示选择工具箱", + "show settings dialog": "显示设置对话框", + "show skeleton": "显示骨架", + "show terminal": "显示终端", + "show toolbox on selection": "选中时显示工具箱", + "show version updates": "显示版本更新", + "shown on node": "节点上显示", + "shuffle images list": "打乱图像数据集", + "shuffle pairs of image-text": "打乱图像文本数据集", + "sidebar": "侧边栏", + "sidebar location": "侧边栏位置", + "sidebar size": "侧边栏大小", + "sidebar style": "侧边栏样式", + "sigmas": "Sigmas", + "sign in": "登录", + "sign in / sign up": "登录 / 注册", + "sign in again": "重新登录", + "sign in required": "需要登录", + "sign out": "退出登录", + "sign out & try again": "退出并重试", + "sign out anyway": "仍然退出登录", + "sign up": "注册", + "sign up with github": "使用Github注册", + "sign up with github instead": "改用 Github 注册", + "sign up with google": "使用Google注册", + "sign-in provider": "登录方式", + "signed out successfully": "成功退出登录", + "simplified apps from workflows": "基于工作流的简化应用", + "single-select dropdown": "单选下拉框", + "size of preview images": "预览图像的大小", + "skip": "跳过", + "skip for now": "暂时跳过", + "skip to end": "跳到结尾", + "skip to start": "跳到开头", + "skip to the cloud app": "跳转到云应用", + "skiplayerguidancedit": "跳过层引导(DiT)", + "skiplayerguidanceditsimple": "跳过层引导(DiT简化)", + "skiplayerguidancesd3": "跳过层引导(SD3)", + "skipped": "跳过", + "smooth": "平滑", + "smoothing precision": "预测平滑", + "snap highlights node": "吸附高亮节点", + "snap nodes to grid": "节点吸附到网格", + "snap to grid size": "吸附网格大小", + "solo use only": "仅限个人使用", + "sonilo text to music": "Sonilo 文本生成音乐", + "sonilo video to music": "Sonilo 视频生成音乐", + "sorry, contact support": "抱歉,请联系客服", + "sort": "排序", + "sort alphabetically within groups": "在分组内按字母顺序排序", + "sort by": "排序方式", + "sort jobs": "排序任务", + "sort mode": "排序模式", + "sorting type": "排序类型", + "source": "来源", + "spline": "曲线", + "split audio channels": "分离音频通道", + "split image with alpha": "分离图像Alpha", + "splitsigmas": "分离Sigma", + "splitsigmasdenoise": "分离Sigma降噪", + "stability ai audio inpaint": "Stability AI 音频重绘", + "stability ai audio to audio": "Stability AI 音频到音频", + "stability ai stable image ultra": "Stability AI Stable 图像 Ultra", + "stability ai text to audio": "Stability AI 文本转音频", + "stability ai upscale conservative": "Stability AI 保守放大", + "stability ai upscale creative": "Stability AI 创意放大", + "stability ai upscale fast": "Stability AI 极速放大", + "stable_cascade": "StableCascade", + "stablecascade_emptylatentimage": "空Latent图像(Stable Cascade)", + "stablecascade_stageb_conditioning": "Stable Cascade_B阶段_条件", + "stablecascade_stagec_vaeencode": "Stable Cascade_C阶段_VAE编码", + "stablecascade_superresolutioncontrolnet": "Stable Cascade_超分辨率ControlNet", + "stablezero123_conditioning": "StableZero123条件", + "stablezero123_conditioning_batched": "StableZero123条件_批处理", + "standard (new)": "标准(新)", + "star": "星星", + "start creating in seconds": "几秒内开始创作", + "start publishing": "开始发布", + "start recording": "开始录音", + "starting comfyui": "启动 ComfyUI", + "starting today": "今日开始", + "status": "状态", + "step size": "间距", + "stitch images": "图像拼接", + "stop at mask": "遇到遮罩时停止", + "stop playback": "停止播放", + "stop recording": "停止录音", + "stop run (instant)": "立即停止运行", + "stop running": "停止运行", + "straight": "直角线", + "string": "字符串", + "strip whitespace": "清理空字符", + "style_model": "风格模型", + "subgraph blueprints": "子图蓝图", + "subgraph name": "子工作流名称", + "submit": "提交", + "submit a github issue": "提交 GitHub 问题", + "subscribe": "订阅", + "subscribe for more": "订阅获取更多", + "subscribe now": "立即订阅", + "subscribe to": "订阅", + "subscribe to comfy cloud": "订阅 Comfy Cloud", + "subscribe to run": "订阅 Run", + "subscription": "订阅", + "subscription activation failed": "订阅激活失败", + "subscription cancelled successfully": "订阅取消成功", + "subscription reactivated successfully": "订阅已成功重新激活", + "subscription required": "需要订阅", + "subscription update failed": "订阅更新失败", + "subscription updated successfully": "订阅更新成功", + "subscription upgrade required": "需要升级订阅", + "subscription verification timed out": "订阅验证超时", + "substring": "子字符串", + "success": "成功", + "successfully saved": "保存成功", + "suggested tags": "推荐标签", + "support": "支持", + "survey questions placeholder": "调查问题占位符", + "sv3d_conditioning": "SV3D条件", + "svd_img2vid_conditioning": "SVD_img2vid条件", + "swap nodes": "交换节点", + "switch": "切换", + "switch back": "打开设置", + "switch camera": "切换摄影机类型", + "switch to grid view": "切换到网格视图", + "switch to outputs": "切换到输出", + "switch to single view": "切换到单图视图", + "switch workspace": "切换工作区", + "system info": "系统信息", + "system locations": "系统位置", + "t5tokenizeroptions": "T5Tokenizer设置", + "tab bar layout": "标签栏布局", + "tags": "标签", + "tangential damping cfg": "切向阻尼CFG", + "task error": "任务错误", + "tasks": "使用例", + "team": "团队", + "team workspace": "团队工作区", + "team workspaces": "团队工作区", + "technical details": "技术细节", + "templates": "模板", + "terminal": "终端", + "terms": "条款", + "terms of use": "使用条款", + "text encoder precision": "文本编码器精度", + "text generation": "文本生成(LLM)", + "text length": "长度", + "text string": "字符串", + "text string (multiline)": "字符串(多行)", + "text to 3d model": "文本转3D模型", + "text to image": "文本转图像", + "text to video": "文本转视频", + "textarea widget font size": "文本框组件字体大小", + "textarea widget spellcheck": "文本框组件拼写检查", + "textencodeacestepaudio": "文本音频编码(AceStep)", + "textencodehunyuanvideo_imagetovideo": "文本编码(Hunyuan视频_图像到视频)", + "textencodeqwenimageedit": "文本编码(QwenImageEdit)", + "textencodeqwenimageeditplus": "文本编码(QwenImageEditPlus)", + "theme": "主题", + "thickness": "厚度", + "this app": "此应用", + "this app encountered an error": "应用遇到错误", + "this node": "此节点", + "this workflow has missing nodes": "该工作流含有缺失节点", + "this workflow has no nodes": "此工作流没有节点", + "this workflow is missing models": "此工作流缺少模型", + "threshold mask": "遮罩阈值", + "thumbnail preview": "缩略图预览", + "tiled": "分快", + "time": "时间", + "time elapsed": "耗时", + "timesteps range": "条件间隔范围", + "timesteps_range": "时间间隔范围", + "to finish setup": "以完成设置", + "toggle app mode": "切换 App 模式", + "toggle apps sidebar": "切换应用侧边栏", + "toggle assets sidebar": "切换资产侧边栏", + "toggle bottom panel": "底部面板", + "toggle essential bottom panel": "切换基础底部面板", + "toggle focus mode": "切换焦点模式", + "toggle job history": "切换任务历史", + "toggle link visibility": "切换链接可见性", + "toggle logs bottom panel": "切换日志底部面板", + "toggle minimap": "切换小地图", + "toggle model library sidebar": "切换模型库侧边栏", + "toggle node library sidebar": "切换节点库侧边栏", + "toggle promotion of hovered widget": "切换悬停小部件的提升", + "toggle properties panel": "开关属性面板", + "toggle queue panel v2": "切换队列面板 V2", + "toggle search box": "切换搜索框", + "toggle terminal bottom panel": "切换终端底部面板", + "toggle theme": "切换主题", + "toggle theme (dark/light)": "切换主题(暗/亮)", + "toggle view controls bottom panel": "切换视图控制底部面板", + "toggle workflows sidebar": "切换工作流侧边栏", + "tolerance": "阈值", + "tomepatchmodel": "Tome合并模型Token", + "tool": "工具", + "tooltip delay": "工具提示延迟", + "top": "顶部", + "top custom node packs pre-installed": "顶级自定义节点包预装", + "top up": "充值", + "top-up failed": "充值失败", + "top-up verification timed out": "充值验证超时", + "topaz image enhance": "Topaz 图像增强", + "topaz video enhance": "Topaz 视频增强", + "topbar": "顶部栏", + "torch install mirror": "Torch安装镜像", + "torchcompilemodel": "Torch编译模型", + "total": "总计", + "total cost": "总成本", + "total credits": "总积分", + "total due today": "今日应付总额", + "total generation time": "总生成时间", + "total generation time (longest first)": "生成时间(最慢)", + "total nodes": "节点总数", + "total yearly credits": "总共年度积分", + "train lora": "训练 LoRA", + "training": "训练", + "training…": "正在训练…", + "transfer color": "ColorTransfer", + "transform": "变换", + "transform splat": "变换 Splat", + "translate": "移动", + "tree explorer": "树形浏览器", + "tree explorer item padding": "树形浏览器项目内边距", + "trigger phrase": "触发短语", + "trigger phrases": "触发短语", + "trim audio duration": "修剪音频时长", + "trim text": "修剪", + "trimvideolatent": "修剪视频Latent", + "triplecliploader": "三重CLIP加载器", + "triposplat conditioning": "TripoSplat 条件编码", + "triposplat decode": "TripoSplat 解码", + "triposplat preprocess image": "TripoSplat 预处理图像", + "triposplat sampling preview": "TripoSplat 采样预览", + "troubleshoot": "故障排除", + "troubleshooting guide": "故障排查指南", + "true": "是", + "truncate text": "截断文本", + "try again": "重试", + "try cloud for free": "免费试用云端", + "try it out": "试试看", + "try this template": "试试 Wan Fun Control template →", + "try update": "尝试更新", + "tsr - temporal score rescaling": "TSR - 时序分数重缩放", + "unable to start comfyui desktop": "无法启动 ComfyUI 桌面版", + "unbookmark node": "取消收藏节点", + "unclipconditioning": "unCLIP条件", + "undated": "无日期", + "understood": "我已了解", + "undo": "撤回", + "unet": "U-Net", + "unet precision": "UNET 精度", + "unetcrossattentionmultiply": "UNet交叉注意力乘数", + "unetselfattentionmultiply": "UNet自注意力乘数", + "unettemporalattentionmultiply": "UNet时间注意力乘数", + "unfavorite": "取消收藏", + "unfavorite widget": "取消收藏组件", + "ungroup selected group nodes": "解散选中组节点", + "unified sidebar width": "统一侧边栏宽度", + "uninstall": "卸载", + "uninstall selected": "卸载所选", + "uninvite": "取消邀请", + "unknown": "未知", + "unknown error": "未知错误", + "unknown file": "未知文件", + "unknown input": "未知输入", + "unknown pack": "未知包", + "unload models": "卸载模型", + "unload models and execution cache": "卸载模型和执行缓存", + "unlock aspect ratio": "解锁宽高比", + "unlock canvas": "解除锁定画布", + "unlock top-ups and more": "解锁补充积分和更多功能", + "unpack subgraph": "解包子工作流", + "unpack the selected subgraph": "解包选中子工作流", + "unpin": "取消固定", + "unresolved missing nodes": "未解析的缺失节点", + "unresolved nodes": "未解析节点", + "unsafe install location detected": "检测到安装路径不安全", + "unsaved changes": "未保存的更改", + "unsorted": "未排序", + "unsupported node packs": "不支持的节点包", + "untitled": "无标题", + "up direction": "上方向", + "update": "更新", + "update all": "全部更新", + "update available": "有更新可用", + "update comfyui": "更新 ComfyUI", + "update complete": "更新完成", + "update frontend": "更新前端", + "update link": "更新链接", + "update password": "更新密码", + "update requested": "已请求更新", + "update selected": "更新所选", + "update started": "更新开始", + "updated": "已更新", + "updated recently": "最近更新", + "updates available": "有可用更新", + "updating all packages": "更新所有包", + "updating comfyui desktop": "正在更新ComfyUI桌面", + "upgrade": "升级", + "upgrade plan": "升级订阅", + "upgrade to add credits": "升级以添加积分", + "upgrade to creator": "升级到 Creator", + "upgrade to unlock this feature": "升级订阅解锁该功能", + "upload": "上传", + "upload a video": "上传视频", + "upload already in progress": "上传已在进行中", + "upload an image": "上传图片", + "upload background image": "上传背景图片", + "upload before and after": "上传前后对比", + "upload example image": "上传示例图片", + "upload model help video": "上传模型视频", + "upload my workflow": "上传我的工作流", + "upload texture": "上传纹理", + "upload to comfyhub": "上传到 ComfyHub", + "upscale image": "缩放图像", + "upscale image (using model)": "使用模型放大图像", + "upscale image by": "缩放图像(比例)", + "upscale latent": "缩放Latent", + "upscale latent by": "缩放Latent(比例)", + "upscale_diffusion": "放大扩散", + "upscale_model": "放大模型", + "upscaling": "图像放大", + "usage hint": "使用提示", + "usage metrics": "使用情况指标", + "usd / mo / member": "美元 / 月 / 每成员", + "use classic cache system": "使用经典缓存系统", + "use email instead": "改用邮箱", + "use from library": "从库中使用", + "use legacy manager ui": "使用旧版管理器UI", + "use legacy ui": "使用传统界面", + "use new menu": "使用新菜单", + "user": "用户", + "user avatar": "用户头像", + "user journey events": "用户旅程事件", + "user not authenticated": "用户未认证", + "using from library": "正在从库中使用", + "usostylereference": "USO风格参考", + "utilities": "实用工具", + "vae decode": "VAE解码", + "vae decode (tiled)": "VAE解码(分块)", + "vae decode audio": "VAE解码(音频)", + "vae decode audio (tiled)": "VAE解码音频(分块)", + "vae encode": "VAE编码", + "vae encode (for inpainting)": "VAE编码(局部重绘)", + "vae encode (tiled)": "VAE编码分块)", + "vae encode audio": "VAE编码(音频)", + "vae precision": "VAE 精度", + "vaedecodehunyuan3d": "VAE解码(Hunyuan3D)", + "vaesave": "保存VAE", + "validate workflows": "校验工作流", + "validation": "验证", + "validation failed": "验证失败", + "version": "版本", + "version compatibility warning": "版本兼容性警告", + "vertical": "竖直", + "video": "视频", + "video api": "视频 API", + "video failed to load": "视频加载失败", + "video linear cfg guidance": "视频线性CFG引导", + "video slice": "视频切片", + "video thumbnail preview": "视频缩略图预览", + "video triangle cfg guidance": "视频三角形CFG引导", + "video_models": "视频模型", + "videos": "视频", + "vidu image to video generation": "Vidu 图像转视频生成", + "vidu multi-frame video generation": "Vidu 多帧视频生成", + "vidu q3 image-to-video generation": "Vidu Q3 图像转视频生成", + "vidu q3 start/end frame-to-video generation": "Vidu Q3 起始/结束帧到视频生成", + "vidu q3 text-to-video generation": "Vidu Q3 文本转视频生成", + "vidu reference to video generation": "Vidu 参考转视频生成", + "vidu text to video generation": "Vidu 文本转视频生成", + "vidu video extension": "Vidu 视频扩展", + "vidu2 image-to-video generation": "Vidu2 图像转视频生成", + "vidu2 reference-to-video generation": "Vidu2 参考图像转视频生成", + "vidu2 start/end frame-to-video generation": "Vidu2 起始/结束帧到视频生成", + "vidu2 text-to-video generation": "Vidu2 文本到视频生成", + "view all jobs": "查看全部任务", + "view all settings": "查看所有设置", + "view app": "查看应用", + "view available workflow tools": "查看可用的工作流工具", + "view controls": "视图控制", + "view details": "查看详情", + "view enterprise": "查看企业", + "view full policy": "查看完整政策", + "view in manager": "在管理器中查看", + "view job": "查看任务", + "view more details": "查看更多详情", + "view node graph": "查看节点图", + "view plans": "查看套餐", + "view pricing details": "查看定价详情", + "view settings": "查看设置", + "view usage history": "查看使用历史", + "view workspace": "查看工作区", + "virtual environment path": "虚拟环境路径", + "visualize face landmarks (mediapipe)": "MediaPipe 人脸网格可视化", + "void quadmask preprocessor": "VOIDQuadmaskPreprocess", + "volume": "音量", + "voxel": "体素", + "voxel to mesh": "体素到网格", + "voxel to mesh (basic)": "体素到网格(基础)", + "vpscheduler": "VPS调度器", + "vram management mode": "VRAM 管理模式", + "wan": "Wan万相", + "wan context windows (manual)": "WAN上下文窗口(手动)", + "wan image to image": "Wan 图像转图像", + "wan image to video": "Wan 图生视频", + "wan reference to video": "Wan 参考视频生成", + "wan text to image": "Wan文生图", + "wan text to video": "Wan文生视频", + "wan22funcontroltovideo": "Wan22FunControl视频", + "wan22imagetovideolatent": "Wan22图像转视频潜变量", + "wan_camera_embedding": "WAN 摄像头嵌入", + "wananimatetovideo": "Wan动画转视频", + "wanblockswap": "Wan块置换", + "wancameraembedding": "Wan相机嵌入", + "wancameraimagetovideo": "万相机图像转视频", + "wanfirstlastframetovideo": "Wan首尾帧视频", + "wanfuncontroltovideo": "WanFunControl视频", + "wanfuninpainttovideo": "WanFunInpaint视频", + "wanhumoimagetovideo": "万虎魔图像转视频", + "wanimagetovideo": "图像到视频(Wan)", + "wanmoveconcattrack": "WanMove合并轨道", + "wanmovetracksfromcoords": "WanMove坐标到轨道", + "wanmovetracktovideo": "WanMove轨道到视频", + "wanmovevisualizetracks": "WanMove预览轨道", + "wanphantomsubjecttovideo": "WanPhantom主体转视频", + "wansoundimagetovideo": "图像到视频(WanSound)", + "wansoundimagetovideoextend": "图像到视频扩展(WanSound)", + "wantracktovideo": "WanTrack视频", + "wanvacetovideo": "WanVace视频", + "warning": "警告", + "wavespeed image upscale": "WaveSpeed 图像超分辨率", + "web app": "网页应用", + "webcam": "摄像头", + "webcam capture": "网络摄像头捕获", + "welcome to comfyui": "欢迎使用 ComfyUI", + "white": "白", + "widget control mode": "组件控制模式", + "widget not visible": "组件不可见", + "width": "宽度", + "window": "窗口", + "window style": "窗口样式", + "wireframe": "线框", + "workflow": "工作流", + "workflow actions": "工作流操作", + "workflow contents": "工作流内容", + "workflow data is empty": "工作流数据为空", + "workflow deleted": "工作流已删除", + "workflow description": "工作流描述", + "workflow exported successfully": "工作流导出成功!", + "workflow name": "工作流名称", + "workflow opened in new tab": "工作流已在新标签页中打开", + "workflow overview": "工作流总览", + "workflows": "工作流", + "works anywhere, instantly": "随时随地,立即可用", + "workspace": "工作区", + "workspace created": "工作区已创建", + "workspace created but setup incomplete": "工作区已创建,但设置未完成", + "workspace deleted": "工作区已删除", + "workspace name": "工作区名称", + "workspace name*": "工作区名称*", + "workspace not found": "未找到工作区", + "workspace settings": "工作区设置", + "workspace updated": "工作区已更新", + "yearly": "年度", + "yellow": "黄色", + "you'll be redirected to": "您将被重定向到", + "you're on the free plan": "您正在使用免费套餐", + "you're out of free credits": "您的免费积分已用完", + "your credit balance": "您的积分余额", + "your description": "你的简介", + "your device is not supported": "您的设备不受支持", + "your subscription has been canceled": "您的订阅已被取消", + "your team workspaces": "你的团队工作区", + "your username (required)": "你的用户名(必填)", + "zip download ready": "ZIP下载已就绪", + "zoom controls": "缩放控制", + "zoom in": "放大", + "zoom in/out": "放大/缩小", + "zoom options": "缩放选项", + "zoom out": "缩小", + "zoom to fit": "适合画面" +} diff --git a/.github/scripts/i18n/glossary/overrides/ja.json b/.github/scripts/i18n/glossary/overrides/ja.json new file mode 100644 index 000000000..670699dcc --- /dev/null +++ b/.github/scripts/i18n/glossary/overrides/ja.json @@ -0,0 +1,26 @@ +{ + "terms": { + "custom node": "カスタムノード" + }, + "ignore": [ + "active", + "additional", + "apply", + "bottom", + "clear", + "custom", + "depth", + "empty", + "group", + "left", + "pause", + "ready", + "reset", + "right", + "skip", + "status", + "title", + "top", + "total" + ] +} diff --git a/.github/scripts/i18n/glossary/overrides/ko.json b/.github/scripts/i18n/glossary/overrides/ko.json new file mode 100644 index 000000000..fb64909a5 --- /dev/null +++ b/.github/scripts/i18n/glossary/overrides/ko.json @@ -0,0 +1,26 @@ +{ + "terms": { + "custom node": "커스텀 노드" + }, + "ignore": [ + "active", + "additional", + "apply", + "bottom", + "clear", + "custom", + "depth", + "empty", + "group", + "left", + "pause", + "ready", + "reset", + "right", + "skip", + "status", + "title", + "top", + "total" + ] +} diff --git a/.github/scripts/i18n/glossary/overrides/zh.json b/.github/scripts/i18n/glossary/overrides/zh.json new file mode 100644 index 000000000..a029c6271 --- /dev/null +++ b/.github/scripts/i18n/glossary/overrides/zh.json @@ -0,0 +1,26 @@ +{ + "terms": { + "custom node": "自定义节点" + }, + "ignore": [ + "active", + "additional", + "apply", + "bottom", + "clear", + "custom", + "depth", + "empty", + "group", + "left", + "pause", + "ready", + "reset", + "right", + "skip", + "status", + "title", + "top", + "total" + ] +} diff --git a/.github/scripts/i18n/i18n-config.mjs b/.github/scripts/i18n/i18n-config.mjs index a27071758..8e9c1bca1 100644 --- a/.github/scripts/i18n/i18n-config.mjs +++ b/.github/scripts/i18n/i18n-config.mjs @@ -25,6 +25,12 @@ export const TRUNCATION_ISSUES_TXT = join(TRANSLATE_LOG_DIR, "truncation-issues. export const MISMATCHES_JSON = join(TRANSLATE_LOG_DIR, "mismatches.json"); export const MISMATCHES_TXT = join(TRANSLATE_LOG_DIR, "mismatches.txt"); +/** Gitignored AI quality-review logs (review-i18n.ts). */ +export const REVIEW_LOG_REL = ".github/i18n-logs/review"; +export const REVIEW_LOG_DIR = join(REPO_ROOT, REVIEW_LOG_REL); +export const REVIEW_REPORT_JSON = join(REVIEW_LOG_DIR, "quality-report.json"); +export const REVIEW_REPORT_TXT = join(REVIEW_LOG_DIR, "quality-report.txt"); + /** Repo roots that are never English MDX sources (pages). */ export const REPO_META_PREFIXES = [ "snippets/", diff --git a/.github/scripts/i18n/review-i18n.ts b/.github/scripts/i18n/review-i18n.ts new file mode 100644 index 000000000..a7b99aeb8 --- /dev/null +++ b/.github/scripts/i18n/review-i18n.ts @@ -0,0 +1,625 @@ +#!/usr/bin/env bun +/** + * AI translation quality review (LLM-as-a-judge). + * + * An independent — and typically cheaper — model scores existing translations + * against the English source on four axes (accuracy, completeness, terminology, + * fluency) and lists concrete issues. This is separate from the `=== MISMATCHES + * ===` notes that the translation model self-reports during `translate`; here a + * different model acts as judge. + * + * Results are advisory: written to `.github/i18n-logs/review/` (gitignored), + * never into MDX and never blocking. Treat the report as a review aid. + * + * Incremental: by default only reviews translations whose English source hash + * matches the translated file (i.e. up-to-date translations) AND that have not + * already been reviewed at that hash. The reviewed hash is stored as + * `reviewSourceHash` in the translated file's frontmatter (snippets: an MDX + * comment) — committed to git, so review state is shared across the team and + * visible per file. This mirrors how `translationSourceHash` works. + * The detailed issue list / scores go to the gitignored report, not frontmatter. + * + * Usage: + * bun review-i18n.ts # pending reviews, all languages + * bun review-i18n.ts --lang ko # one language + * bun review-i18n.ts installation/x.mdx # specific files + * bun review-i18n.ts --all # re-review everything (ignore state) + * bun review-i18n.ts --sample 20 # review N random pending pairs per language + * bun review-i18n.ts --snippets # review snippets instead of pages + * bun review-i18n.ts --min-score 4 # only report files scoring below 4 + * + * Environment (.env.local or shell). Falls back to TRANSLATE_* when unset, so a + * dedicated judge model is optional: + * REVIEW_API_KEY - judge API key (fallback: TRANSLATE_API_KEY ...) + * REVIEW_API_BASE_URL - OpenAI-compatible base URL (fallback: TRANSLATE_API_BASE_URL ...) + * REVIEW_API_MODEL - judge model id (fallback: TRANSLATE_API_MODEL ...) + * REVIEW_CONCURRENCY - parallel requests (fallback: TRANSLATE_CONCURRENCY, default 5) + * + * Requires Bun. + */ + +import { readdir, readFile, writeFile, mkdir } from "fs/promises"; +import { createHash } from "crypto"; +import { join, dirname, relative } from "path"; +import { + loadI18nConfig, + REPO_ROOT, + stripLangPrefix, + isEnglishPagePath, + isEnglishSnippetPath, + parseLangArg as parseLangArgFromConfig, + REVIEW_LOG_DIR, + REVIEW_LOG_REL, + REVIEW_REPORT_JSON, + REVIEW_REPORT_TXT, +} from "./i18n-config.mjs"; +import { loadGlossary, selectGlossaryForText, buildGlossaryPrompt } from "./glossary.mjs"; + +// --------------------------------------------------------------------------- +// Load .env.local +// --------------------------------------------------------------------------- + +const ROOT = REPO_ROOT; + +async function loadEnvLocal() { + try { + const content = await readFile(join(ROOT, ".env.local"), "utf-8"); + for (const line of content.split("\n")) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith("#")) continue; + const eq = trimmed.indexOf("="); + if (eq === -1) continue; + const key = trimmed.slice(0, eq).trim(); + const val = trimmed.slice(eq + 1).trim(); + if (!process.env[key]) process.env[key] = val; + } + } catch {} +} +await loadEnvLocal(); + +// --------------------------------------------------------------------------- +// Config +// --------------------------------------------------------------------------- + +interface LangConfig { + code: string; + name: string; + dir: string; + snippets_dir: string; +} + +const config = loadI18nConfig() as { + languages: LangConfig[]; + skip_paths: string[]; +}; +const pathFilterOpts = { languages: config.languages, skip_paths: config.skip_paths }; + +const BASE_URL = + process.env.REVIEW_API_BASE_URL ?? + process.env.TRANSLATE_API_BASE_URL ?? + process.env.TRANSLATE_CJK_BASE_URL ?? + "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"; +const API_KEY = + process.env.REVIEW_API_KEY ?? + process.env.TRANSLATE_API_KEY ?? + process.env.DEEPSEEK_API_KEY ?? + process.env.TRANSLATE_CJK_API_KEY ?? + process.env.DASHSCOPE_API_KEY ?? + ""; +const MODEL = + process.env.REVIEW_API_MODEL ?? + process.env.TRANSLATE_API_MODEL ?? + process.env.TRANSLATE_CJK_MODEL ?? + "qwen-turbo"; +const CONCURRENCY = Number( + process.env.REVIEW_CONCURRENCY ?? process.env.TRANSLATE_CONCURRENCY ?? "5" +); + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +/** SHA-256 of English source, truncated to 8 hex chars (matches translate). */ +function sourceHash(en: string): string { + return createHash("sha256").update(en).digest("hex").slice(0, 8); +} + +/** Extract translationSourceHash from frontmatter or snippet comment. */ +function getExistingHash(content: string): string | null { + const fm = content.match(/translationSourceHash:\s*"?([a-f0-9]{8})"?/); + if (fm) return fm[1] ?? null; + const mdx = content.match(/\{\/\*\s*translationSourceHash:\s*([a-f0-9]{8})\s*\*\/\}/); + if (mdx) return mdx[1] ?? null; + const html = content.match(//); + return html?.[1] ?? null; +} + +/** Extract reviewSourceHash (the English hash this file was last reviewed at). */ +function getReviewHash(content: string): string | null { + const fm = content.match(/reviewSourceHash:\s*"?([a-f0-9]{8})"?/); + if (fm) return fm[1] ?? null; + const mdx = content.match(/\{\/\*\s*reviewSourceHash:\s*([a-f0-9]{8})\s*\*\/\}/); + return mdx?.[1] ?? null; +} + +/** + * Write reviewSourceHash into a page's frontmatter (creating it if absent), + * replacing any prior value. Inserted right after translationSourceHash when + * present so the two hashes sit together. + */ +function setReviewHashPage(content: string, hash: string): string { + const cleaned = content.replace(/\nreviewSourceHash:\s*"?[a-f0-9]{8}"?/g, ""); + const fmMatch = cleaned.match(/^(---\n)([\s\S]*?)(\n---)/); + const metaLine = `reviewSourceHash: ${hash}`; + if (!fmMatch) return `---\n${metaLine}\n---\n${cleaned}`; + const [, open, body, close] = fmMatch; + const rest = cleaned.slice(fmMatch[0].length); + return `${open}${body}\n${metaLine}${close}${rest}`; +} + +/** Write reviewSourceHash on a snippet (no frontmatter) via an MDX comment. */ +function setReviewHashSnippet(content: string, hash: string): string { + const stripped = content.replace(/\{\/\*\s*reviewSourceHash:\s*[a-f0-9]{8}\s*\*\/\}\n?/, ""); + return `{/* reviewSourceHash: ${hash} */}\n${stripped}`; +} + +async function readFileOr(path: string, fallback = ""): Promise { + try { + return await readFile(path, "utf-8"); + } catch { + return fallback; + } +} + +async function collectMdx(dir: string): Promise { + const results: string[] = []; + let entries; + try { + entries = await readdir(dir, { withFileTypes: true }); + } catch { + return results; + } + for (const entry of entries) { + const full = join(dir, entry.name); + if (entry.isDirectory()) results.push(...(await collectMdx(full))); + else if (entry.name.endsWith(".mdx")) results.push(full); + } + return results; +} + +function parseLangArg(args: string[]): LangConfig[] { + try { + return parseLangArgFromConfig(args, config.languages) as LangConfig[]; + } catch (err: unknown) { + console.error(err instanceof Error ? err.message : String(err)); + process.exit(1); + } +} + +// --------------------------------------------------------------------------- +// Path mapping (mirrors translate-i18n.makeMapping) +// --------------------------------------------------------------------------- + +interface PathMapping { + enPath: string; + targetPath: string; + enRel: string; + targetRel: string; +} + +function makeMapping(lang: LangConfig, relPath: string, snippetsMode: boolean): PathMapping { + const enRel = stripLangPrefix(relPath, config.languages); + if (snippetsMode) { + return { + enPath: join(ROOT, "snippets", enRel), + targetPath: join(ROOT, lang.snippets_dir, enRel), + enRel: `snippets/${enRel}`, + targetRel: `${lang.snippets_dir}/${enRel}`, + }; + } + return { + enPath: join(ROOT, enRel), + targetPath: join(ROOT, lang.dir, enRel), + enRel, + targetRel: `${lang.dir}/${enRel}`, + }; +} + +// --------------------------------------------------------------------------- +// Judge API +// --------------------------------------------------------------------------- + +interface AxisScores { + accuracy: number; + completeness: number; + terminology: number; + fluency: number; +} + +interface ReviewVerdict { + scores: AxisScores; + overall: number; + issues: string[]; +} + +const SCORE_KEYS: (keyof AxisScores)[] = ["accuracy", "completeness", "terminology", "fluency"]; + +function buildJudgePrompt( + enText: string, + targetText: string, + lang: LangConfig, + relPath: string, + glossaryBlock: string +): string { + return [ + `You are reviewing a ${lang.name} translation of ComfyUI documentation (a node-based AI image generation tool).`, + `File: ${relPath}`, + "", + "Score the translation against the English source on four axes, each 1 (poor) to 5 (excellent):", + "- accuracy: faithful meaning; no mistranslation, no invented content", + "- completeness: nothing dropped — sections, list items, tables, code, links all present", + "- terminology: technical terms translated consistently and correctly (follow the preferred terminology below if given)", + "- fluency: reads naturally in the target language", + "", + "Do NOT penalize: expected localization (e.g. /{lang}/ internal links, translated snippet import paths),", + "code blocks / identifiers / URLs left in English, or terms intentionally kept in English.", + glossaryBlock ? `${glossaryBlock}\n` : "", + "Respond with ONLY a JSON object, no prose, no code fences:", + '{"scores":{"accuracy":N,"completeness":N,"terminology":N,"fluency":N},"overall":N,"issues":["short issue", "..."]}', + "Keep issues concise and specific (quote the offending phrase). Empty array if none.", + "", + "=== English Source ===", + enText, + "", + `=== ${lang.name} Translation ===`, + targetText, + ] + .filter(Boolean) + .join("\n"); +} + +const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); + +async function callApi(prompt: string, attempt = 0): Promise { + const MAX_RETRIES = 3; + try { + const response = await fetch(`${BASE_URL}/chat/completions`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${API_KEY}`, + }, + body: JSON.stringify({ + model: MODEL, + messages: [{ role: "user", content: prompt }], + temperature: 0, + // Headroom for reasoning models that spend tokens before the JSON answer. + max_tokens: 4096, + }), + }); + if (!response.ok) { + const err = await response.text(); + // Retry on rate-limit / server errors; fail fast on client errors. + if ((response.status === 429 || response.status >= 500) && attempt < MAX_RETRIES) { + await sleep(1000 * 2 ** attempt); + return callApi(prompt, attempt + 1); + } + throw new Error(`API ${response.status}: ${err}`); + } + const data = (await response.json()) as { choices?: { message?: { content?: string } }[] }; + return data.choices?.[0]?.message?.content ?? ""; + } catch (err: unknown) { + // Transient network drops (socket closed, reset) — back off and retry. + if (attempt < MAX_RETRIES) { + await sleep(1000 * 2 ** attempt); + return callApi(prompt, attempt + 1); + } + throw err; + } +} + +function clampScore(n: unknown): number { + const v = Math.round(Number(n)); + if (!Number.isFinite(v)) return 0; + return Math.min(5, Math.max(1, v)); +} + +/** Parse the judge's JSON, tolerating code fences / surrounding prose. */ +function parseVerdict(raw: string): ReviewVerdict { + let text = raw.trim(); + text = text.replace(/^```(?:json)?\s*/i, "").replace(/```\s*$/, ""); + const start = text.indexOf("{"); + const end = text.lastIndexOf("}"); + if (start === -1 || end === -1) { + const preview = raw.trim().slice(0, 120).replace(/\s+/g, " "); + throw new Error(`no JSON object in judge output (got: "${preview || ""}")`); + } + const obj = JSON.parse(text.slice(start, end + 1)) as Record; + + const rawScores = (obj.scores ?? {}) as Record; + const scores = {} as AxisScores; + for (const k of SCORE_KEYS) scores[k] = clampScore(rawScores[k]); + + const overall = + obj.overall != null + ? clampScore(obj.overall) + : clampScore(SCORE_KEYS.reduce((s, k) => s + scores[k], 0) / SCORE_KEYS.length); + + const issues = Array.isArray(obj.issues) + ? obj.issues.map((i) => String(i).trim()).filter(Boolean) + : []; + + return { scores, overall, issues }; +} + +// --------------------------------------------------------------------------- +// Collect candidate English source files +// --------------------------------------------------------------------------- + +async function collectEnglishFiles(snippetsMode: boolean, fileArgs: string[]): Promise { + if (fileArgs.length > 0) { + return fileArgs + .map((f) => stripLangPrefix(f, config.languages)) + .filter((f) => + snippetsMode + ? isEnglishSnippetPath(f.replace(/^snippets\//, ""), pathFilterOpts) + : isEnglishPagePath(f, pathFilterOpts) + ); + } + if (snippetsMode) { + const all = await collectMdx(join(ROOT, "snippets")); + return all + .map((f) => relative(join(ROOT, "snippets"), f)) + .filter((f) => isEnglishSnippetPath(f, pathFilterOpts)); + } + const all = await collectMdx(ROOT); + return all + .map((f) => relative(ROOT, f)) + .filter((f) => isEnglishPagePath(f, pathFilterOpts)); +} + +// --------------------------------------------------------------------------- +// Concurrency pool +// --------------------------------------------------------------------------- + +async function pool(items: T[], concurrency: number, fn: (item: T, index: number) => Promise) { + let i = 0; + const workers = Array.from({ length: concurrency }, async () => { + while (i < items.length) { + const idx = i++; + await fn(items[idx], idx); + } + }); + await Promise.all(workers); +} + +// --------------------------------------------------------------------------- +// Report +// --------------------------------------------------------------------------- + +interface ReviewEntry { + lang: string; + enRel: string; + targetRel: string; + overall: number; + scores: AxisScores; + issues: string[]; +} + +interface ReviewReport { + generated: string; + model: string; + reviewed: number; + flagged: number; + minScore: number; + entries: ReviewEntry[]; +} + +async function writeReport(entries: ReviewEntry[], reviewed: number, minScore: number): Promise { + await mkdir(REVIEW_LOG_DIR, { recursive: true }); + const flagged = entries.filter((e) => e.overall < minScore); + flagged.sort((a, b) => a.overall - b.overall); + + const report: ReviewReport = { + generated: new Date().toISOString(), + model: MODEL, + reviewed, + flagged: flagged.length, + minScore, + entries: flagged, + }; + await writeFile(REVIEW_REPORT_JSON, `${JSON.stringify(report, null, 2)}\n`); + + const lines = [ + "# Translation quality review (not committed to git)", + "", + `Generated: ${report.generated}`, + `Judge model: ${MODEL}`, + `Reviewed: ${reviewed} file(s); flagged below ${minScore}/5: ${flagged.length}`, + "", + "AI-as-judge scores (accuracy / completeness / terminology / fluency, 1-5).", + "Advisory only — independent of the translation model's own MISMATCH notes.", + "", + "---", + "", + ]; + if (flagged.length === 0) { + lines.push(`_No files scored below ${minScore}._`, ""); + } else { + for (const e of flagged) { + const s = e.scores; + lines.push( + `## [${e.lang}] ${e.enRel} — overall ${e.overall}/5`, + `acc ${s.accuracy} · comp ${s.completeness} · term ${s.terminology} · flu ${s.fluency}`, + "" + ); + for (const issue of e.issues) lines.push(`- ${issue}`); + lines.push(""); + } + } + await writeFile(REVIEW_REPORT_TXT, lines.join("\n")); +} + +// --------------------------------------------------------------------------- +// Main +// --------------------------------------------------------------------------- + +type ReviewJob = { relPath: string; lang: LangConfig }; + +/** Per-language glossary cache for the terminology axis. */ +const glossaryCache = new Map>(); +function getGlossary(code: string): ReturnType { + let g = glossaryCache.get(code); + if (!g) { + g = loadGlossary(code); + glossaryCache.set(code, g); + } + return g; +} + +async function main() { + const args = process.argv.slice(2); + const all = args.includes("--all"); + const snippetsMode = args.includes("--snippets") || args.includes("--snippets-only"); + const selectedLangs = parseLangArg(args); + + const sampleIdx = args.indexOf("--sample"); + const sampleN = sampleIdx !== -1 ? Number(args[sampleIdx + 1]) : 0; + const minScoreIdx = args.indexOf("--min-score"); + const minScore = minScoreIdx !== -1 ? Number(args[minScoreIdx + 1]) : 4; + + const fileArgs = args.filter((a, i) => { + if (a.startsWith("--")) return false; + const prev = args[i - 1]; + return prev !== "--lang" && prev !== "--sample" && prev !== "--min-score"; + }); + + if (!API_KEY) { + console.error("No API key. Set REVIEW_API_KEY or TRANSLATE_API_KEY in .env.local"); + process.exit(1); + } + + const files = await collectEnglishFiles(snippetsMode, fileArgs); + if (files.length === 0) { + console.log("No files to review."); + return; + } + + // Build the pending set: translation exists, is up-to-date vs English, and + // (unless --all) hasn't been reviewed at this hash yet. The reviewed hash is + // read from the translated file's own `reviewSourceHash` (committed to git). + const pending: ReviewJob[] = []; + let skipStale = 0; + let skipReviewed = 0; + for (const lang of selectedLangs) { + for (const relPath of files) { + const { enPath, targetPath } = makeMapping(lang, relPath, snippetsMode); + const enContent = await readFileOr(enPath); + if (!enContent || enContent.length < 50) continue; + const target = await readFileOr(targetPath); + if (!target) continue; // no translation to review + + const hash = sourceHash(enContent); + if (getExistingHash(target) !== hash) { + skipStale++; // translation out of date — translate first + continue; + } + if (!all && getReviewHash(target) === hash) { + skipReviewed++; + continue; + } + pending.push({ relPath, lang }); + } + } + + let jobs = pending; + if (sampleN > 0) { + // Deterministic sample per language (no RNG): take first N after a stable shuffle by enRel. + const byLang = new Map(); + for (const j of pending) { + const arr = byLang.get(j.lang.code) ?? []; + arr.push(j); + byLang.set(j.lang.code, arr); + } + jobs = []; + for (const arr of byLang.values()) { + arr.sort((a, b) => a.relPath.localeCompare(b.relPath)); + jobs.push(...arr.slice(0, sampleN)); + } + } + + console.log( + `Review: model=${MODEL} concurrency=${CONCURRENCY} languages=${selectedLangs + .map((l) => l.code) + .join(",")} mode=${snippetsMode ? "snippets" : "pages"}` + ); + console.log( + `${files.length} EN sources × ${selectedLangs.length} lang(s); ` + + `${jobs.length} to review` + + `${skipStale ? `, ${skipStale} stale (translate first)` : ""}` + + `${skipReviewed ? `, ${skipReviewed} already reviewed` : ""}` + + `${sampleN > 0 ? ` [sampled ${sampleN}/lang]` : ""}` + ); + + if (jobs.length === 0) { + console.log("Nothing to review. Use --all to re-review."); + return; + } + + await mkdir(REVIEW_LOG_DIR, { recursive: true }); + const entries: ReviewEntry[] = []; + let reviewed = 0; + let failed = 0; + const startTime = Date.now(); + + await pool(jobs, CONCURRENCY, async ({ relPath, lang }, idx) => { + const tag = `[${idx + 1}/${jobs.length}]`; + const { enPath, targetPath, enRel, targetRel } = makeMapping(lang, relPath, snippetsMode); + try { + const enContent = await readFileOr(enPath); + const target = await readFileOr(targetPath); + const glossaryTerms = selectGlossaryForText(enContent, getGlossary(lang.code)); + const glossaryBlock = buildGlossaryPrompt(glossaryTerms, lang.name); + + const out = await callApi(buildJudgePrompt(enContent, target, lang, enRel, glossaryBlock)); + const verdict = parseVerdict(out); + + // Record the reviewed hash in the translated file (committed to git). + const hash = sourceHash(enContent); + const stamped = snippetsMode + ? setReviewHashSnippet(target, hash) + : setReviewHashPage(target, hash); + await writeFile(targetPath, stamped); + + reviewed++; + entries.push({ + lang: lang.code, + enRel, + targetRel, + overall: verdict.overall, + scores: verdict.scores, + issues: verdict.issues, + }); + const flag = verdict.overall < minScore ? " ⚠" : ""; + console.log(`${tag} ${verdict.overall}/5${flag} [${lang.code}] ${enRel}`); + } catch (err: unknown) { + failed++; + const msg = err instanceof Error ? err.message : String(err); + console.error(`${tag} FAIL [${lang.code}] ${enRel}: ${msg}`); + } + }); + + const elapsed = ((Date.now() - startTime) / 1000).toFixed(1); + await writeReport(entries, reviewed, minScore); + + const flagged = entries.filter((e) => e.overall < minScore).length; + console.log( + `\nReviewed ${reviewed} in ${elapsed}s (${failed} failed). ` + + `${flagged} flagged below ${minScore}/5 → ${REVIEW_LOG_REL}/quality-report.txt` + ); +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/.github/scripts/i18n/sync-glossary.mjs b/.github/scripts/i18n/sync-glossary.mjs new file mode 100644 index 000000000..6509ee3bb --- /dev/null +++ b/.github/scripts/i18n/sync-glossary.mjs @@ -0,0 +1,220 @@ +#!/usr/bin/env bun +/** + * Sync the committed glossary from the ComfyUI frontend locales. + * + * The ComfyUI frontend is the authoritative source of term translations. This + * pulls every translated, term-like string from the frontend locale files + * (main / nodeDefs / settings / commands) and writes a pure machine mirror to + * glossary/frontend/{lang}.json. The translator injects these at translation + * time. + * + * This writes ONLY the frontend layer and rebuilds it wholesale every run. + * Hand-maintained corrections live in glossary/overrides/{lang}.json, which + * this script never reads or touches — that layer wins at translation time and + * is the place to remap a term or drop a noisy frontend term (see glossary.mjs). + * + * A filter keeps the mirror safe to inject as terminology hints: + * - drops stopwords / common short function words (of, on, you, work, …) and + * bare 1–3 char strings — these have UI-specific renderings that would + * mislead prose translation (e.g. "of" → "중", "work" → "업무용"). + * - drops full sentences, placeholders ({count}), and label-with-colon text. + * - keeps multi-word and longer single-word terms, including harmless UI + * phrases ("Download image"). + * + * Harmless noise is fine: at translation time only terms that literally appear + * in a document are injected, framed as *preferred* hints, not mandatory + * substitutions. Genuinely harmful single words go in the override ignore-list. + * + * Frontend path resolution (first that exists wins): + * 1. --frontend CLI flag + * 2. FRONTEND_LOCALES_PATH env var + * 3. frontend_locales_path in translation-config.json + * 4. ../ComfyUI_frontend/src/locales (sibling-repo default) + * + * Usage: + * bun .github/scripts/i18n/sync-glossary.mjs # all configured langs + * bun .github/scripts/i18n/sync-glossary.mjs --lang ko # one language + * bun .github/scripts/i18n/sync-glossary.mjs --dry-run # report only, no write + * + * Requires Bun. + */ + +import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs"; +import { join } from "path"; +import { loadI18nConfig, REPO_ROOT, parseLangArg } from "./i18n-config.mjs"; +import { FRONTEND_DIR } from "./glossary.mjs"; + +const config = loadI18nConfig(); +const args = process.argv.slice(2); +const dryRun = args.includes("--dry-run"); + +/** Frontend locale files to harvest. nodeDefs uses display_name; others are flat key→string. */ +const SOURCE_FILES = ["main.json", "nodeDefs.json", "settings.json", "commands.json"]; + +/** Function words with UI-specific renderings — never useful as prose terminology. */ +// Grammar function words — never terminology. +const STOPWORDS = + "a an the of to in on off or and for with you your we our us i me my is are be am " + + "was were it its this that these those at by as from into onto over under up down " + + "out yes no ok per via not do does done"; + +// Ordinary vocabulary that appears in UI strings but is not domain terminology. +// These collide with short domain terms by length alone, so an explicit list is +// the only reliable filter (e.g. keep "node"/"model" but drop "work"/"mode"). +// The long tail that slips through goes in each override's `ignore` list. +const COMMON_WORDS = + "all none any some each work works working here there now then add added adding " + + "use used using run running runs new old other others name names type types mode " + + "modes core share shared small large big more less most least set sets get got " + + "make made show shows hide open close save load help back next prev also only just " + + "very much many few same change changed changes edit view item items value values " + + "text default enable enabled disable disabled allow allowed title additional"; + +const BLOCKLIST = new Set(`${STOPWORDS} ${COMMON_WORDS}`.split(/\s+/)); + +function flagValue(name) { + const i = args.indexOf(name); + return i !== -1 && args[i + 1] ? args[i + 1] : null; +} + +// --------------------------------------------------------------------------- +// Resolve frontend locales path +// --------------------------------------------------------------------------- + +function resolveFrontendPath() { + const candidates = [ + flagValue("--frontend"), + process.env.FRONTEND_LOCALES_PATH, + config.frontend_locales_path, + join(REPO_ROOT, "../ComfyUI_frontend/src/locales"), + ].filter(Boolean); + for (const c of candidates) { + const abs = c.startsWith("/") ? c : join(REPO_ROOT, c); + if (existsSync(join(abs, "en", "main.json"))) return abs; + } + return null; +} + +// --------------------------------------------------------------------------- +// Term extraction + filtering +// --------------------------------------------------------------------------- + +/** Flatten a nested locale object to { dottedKey: string }. */ +function flatten(obj, out = {}, prefix = "") { + for (const [k, v] of Object.entries(obj)) { + const key = prefix ? `${prefix}.${k}` : k; + if (typeof v === "string") out[key] = v; + else if (v && typeof v === "object") flatten(v, out, key); + } + return out; +} + +/** nodeDefs is keyed by node id; the term is each entry's display_name. */ +function flattenNodeDefs(defs) { + const out = {}; + for (const k of Object.keys(defs)) { + const d = defs[k]?.display_name; + if (typeof d === "string") out[`node.${k}`] = d; + } + return out; +} + +function flattenFile(name, obj) { + return name === "nodeDefs.json" ? flattenNodeDefs(obj) : flatten(obj); +} + +/** Strip trailing status suffixes the frontend appends (mostly node names). */ +function cleanTerm(s) { + return s.replace(/\s*\((?:DEPRECATED|BETA|EXPERIMENTAL|LEGACY)\)\s*$/i, "").trim(); +} + +/** Keep only short, term-like strings safe to inject as terminology hints. */ +function isTermLike(en) { + const w = en.trim(); + if (w.length < 3) return false; // bare 1–2 char strings (of, on, OR) + const words = w.split(/\s+/); + if (words.length > 5) return false; // full sentences + if (/[.!?:]/.test(w)) return false; // sentences / label-with-colon + if (/\{.*?\}/.test(w)) return false; // ICU placeholders + if (words.length === 1 && BLOCKLIST.has(w.toLowerCase())) return false; + if (words.every((x) => BLOCKLIST.has(x.toLowerCase()))) return false; + return true; +} + +/** + * Build the frontend mirror { enTermLower: target } for one language from all + * source files. First definition of a given English term wins on duplicates. + */ +function extractTerms(frontend, langCode) { + const enFlat = {}; + const tFlat = {}; + for (const file of SOURCE_FILES) { + const enObj = JSON.parse(readFileSync(join(frontend, "en", file), "utf-8")); + Object.assign(enFlat, flattenFile(file, enObj)); + const tPath = join(frontend, langCode, file); + if (existsSync(tPath)) { + Object.assign(tFlat, flattenFile(file, JSON.parse(readFileSync(tPath, "utf-8")))); + } + } + + const terms = {}; + for (const [key, enRaw] of Object.entries(enFlat)) { + const en = cleanTerm(enRaw); + if (!isTermLike(en)) continue; + const tRaw = tFlat[key]; + if (typeof tRaw !== "string") continue; + const t = cleanTerm(tRaw); + if (!t || t === en) continue; // untranslated / kept in English + const k = en.toLowerCase(); + if (!(k in terms)) terms[k] = t; + } + return terms; +} + +/** Stable, human-diffable serialization: keys sorted alphabetically. */ +function serialize(obj) { + const sorted = {}; + for (const k of Object.keys(obj).sort()) sorted[k] = obj[k]; + return `${JSON.stringify(sorted, null, 2)}\n`; +} + +// --------------------------------------------------------------------------- +// Main +// --------------------------------------------------------------------------- + +function main() { + const frontend = resolveFrontendPath(); + if (!frontend) { + console.error( + "Frontend locales not found. Set FRONTEND_LOCALES_PATH, pass --frontend , " + + "or set frontend_locales_path in translation-config.json.\n" + + "Expected to find /en/main.json" + ); + process.exit(1); + } + console.log(`Frontend locales: ${frontend}`); + + let selectedLangs; + try { + selectedLangs = parseLangArg(args, config.languages); + } catch (err) { + console.error(err instanceof Error ? err.message : String(err)); + process.exit(1); + } + + if (!dryRun) mkdirSync(FRONTEND_DIR, { recursive: true }); + + for (const lang of selectedLangs) { + const terms = extractTerms(frontend, lang.code); + const total = Object.keys(terms).length; + console.log(`[${lang.code}] ${total} terms mirrored from frontend`); + + if (dryRun) continue; + writeFileSync(join(FRONTEND_DIR, `${lang.code}.json`), serialize(terms)); + } + + if (dryRun) console.log("\n(dry-run: no files written)"); + else console.log(`\nFrontend mirror written to ${FRONTEND_DIR}`); +} + +main(); diff --git a/.github/scripts/i18n/translate-i18n.ts b/.github/scripts/i18n/translate-i18n.ts index f118716ae..c0d1a8541 100644 --- a/.github/scripts/i18n/translate-i18n.ts +++ b/.github/scripts/i18n/translate-i18n.ts @@ -63,6 +63,11 @@ import { syncDocsJsonFile, formatNavSyncReport, } from "./sync-docs-json.mjs"; +import { + loadGlossary, + selectGlossaryForText, + buildGlossaryPrompt, +} from "./glossary.mjs"; // --------------------------------------------------------------------------- // Load .env.local @@ -212,6 +217,23 @@ const SKIP_PATHS: string[] = config.skip_paths ?? ["built-in-nodes"]; const CHUNKED_FILES: ChunkedFileConfig[] = config.chunked_files ?? []; const PRESERVE_TERMS: string[] = config.preserve_terms ?? []; +/** Per-language glossary (en term → preferred target term), loaded once per code. */ +const glossaryCache = new Map>(); +function getGlossary(langCode: string): ReturnType { + let g = glossaryCache.get(langCode); + if (!g) { + g = loadGlossary(langCode); + glossaryCache.set(langCode, g); + } + return g; +} + +/** Build the preferred-terminology prompt block for the terms present in enText. */ +function glossaryBlockFor(enText: string, lang: LangConfig): string { + const terms = selectGlossaryForText(enText, getGlossary(lang.code)); + return buildGlossaryPrompt(terms, lang.name); +} + // --------------------------------------------------------------------------- // Helpers // --------------------------------------------------------------------------- @@ -412,6 +434,8 @@ async function translateWithQwenMT( "", buildTranslationInstructions(lang), ]; + const glossaryBlock = glossaryBlockFor(enText, lang); + if (glossaryBlock) parts.push("", glossaryBlock); if (existingText.trim()) { parts.push( "", @@ -446,6 +470,8 @@ Output ONLY the translated MDX content.`; "=== English Source ===", enText, ]; + const glossaryBlock = glossaryBlockFor(enText, lang); + if (glossaryBlock) userParts.push("", glossaryBlock); if (existingText.trim()) { userParts.push( "", diff --git a/.github/scripts/i18n/translation-config.json b/.github/scripts/i18n/translation-config.json index 80f0a66ad..47d667a30 100644 --- a/.github/scripts/i18n/translation-config.json +++ b/.github/scripts/i18n/translation-config.json @@ -1,4 +1,5 @@ { + "frontend_locales_path": "../ComfyUI_frontend/src/locales", "skip_paths": ["built-in-nodes"], "chunked_files": [ { @@ -30,6 +31,10 @@ "ComfyUI", "LoRA", "VAE", "CLIP", "checkpoint", "ControlNet", "KSampler", "UNet", "API", "JSON", "MDX", "GitHub", "Hugging Face", "Civitai", "ComfyUI Manager", "safetensors", "GGUF", "SDXL", "SD1.5", - "Stable Diffusion", "Black Forest Labs", "Stability AI", "RealESRGAN" + "Stable Diffusion", "Black Forest Labs", "Stability AI", "RealESRGAN", + "embedding", "scheduler", "sampler", "latent", "conditioning", + "inpainting", "outpainting", "upscale", "diffusion", "tokenizer", + "denoise", "T5", "T2I", "IPAdapter", "InstantID", "AnimateDiff", + "Flux", "diffusers", "tensor", "pipeline", "node graph" ] } diff --git a/.github/scripts/i18n/zh-ja-dict.ts b/.github/scripts/i18n/zh-ja-dict.ts deleted file mode 100644 index fe1d1860b..000000000 --- a/.github/scripts/i18n/zh-ja-dict.ts +++ /dev/null @@ -1,174 +0,0 @@ -/** - * Chinese → Japanese correction dictionary. - * - * These are words/phrases that are natural in Chinese but wrong or unnatural - * in Japanese. When an LLM translates EN+ZH→JA, it sometimes "leaks" the - * Chinese form instead of using the correct Japanese equivalent. - * - * Categories: - * 1. Chinese-only words (don't exist in Japanese) - * 2. Same kanji but different meaning (false friends) - * 3. Chinese prefers kanji where Japanese prefers katakana loanword - * 4. Simplified Chinese characters not used in Japanese - * - * Format: [chinese, japanese, category, note?] - */ - -export const ZH_JA_DICT: [string, string, string, string?][] = [ - // ── Category 1: Chinese-only vocabulary (no Japanese equivalent in kanji) ── - - // Common function words / particles - ["的", null!, "skip", "too common, context-dependent"], // skip — used differently in JP - - // Tech terms where ZH uses kanji but JA uses katakana - ["视频", "動画", "tech", "video"], - ["音频", "オーディオ", "tech", "audio"], - ["语音", "音声", "tech", "voice/speech"], - ["链接", "リンク", "tech", "link"], - ["默认", "デフォルト", "tech", "default"], - ["图标", "アイコン", "tech", "icon"], - ["文件夹", "フォルダ", "tech", "folder"], - ["文件", "ファイル", "tech", "file — careful: 文件 can mean document in JP context"], - ["服务器", "サーバー", "tech", "server"], - ["浏览器", "ブラウザ", "tech", "browser"], - ["软件", "ソフトウェア", "tech", "software"], - ["硬件", "ハードウェア", "tech", "hardware"], - ["程序", "プログラム", "tech", "program"], - ["代码", "コード", "tech", "code"], - ["数据", "データ", "tech", "data"], - ["数据库", "データベース", "tech", "database"], - ["接口", "インターフェース", "tech", "interface/API"], - ["网络", "ネットワーク", "tech", "network"], - ["网站", "ウェブサイト", "tech", "website"], - ["网页", "ウェブページ", "tech", "webpage"], - ["博客", "ブログ", "tech", "blog"], - ["内存", "メモリ", "tech", "memory (RAM)"], - ["缓存", "キャッシュ", "tech", "cache"], - ["驱动", "ドライバー", "tech", "driver"], - ["鼠标", "マウス", "tech", "mouse"], - ["键盘", "キーボード", "tech", "keyboard"], - ["屏幕", "スクリーン", "tech", "screen"], - ["桌面", "デスクトップ", "tech", "desktop"], - ["窗口", "ウィンドウ", "tech", "window"], - ["菜单", "メニュー", "tech", "menu"], - ["按钮", "ボタン", "tech", "button"], - ["标签", "タブ", "tech", "tab (UI)"], - ["下载", "ダウンロード", "tech", "download"], - ["上传", "アップロード", "tech", "upload"], - ["安装", "インストール", "tech", "install"], - ["卸载", "アンインストール", "tech", "uninstall"], - ["更新", "アップデート", "skip", "update — 更新 is valid Japanese (こうしん), skip"], - ["升级", "アップグレード", "tech", "upgrade"], - ["登录", "ログイン", "tech", "login"], - ["注册", "登録", "tech", "register"], - ["密码", "パスワード", "tech", "password"], - ["用户名", "ユーザー名", "tech", "username"], - - // ── Category 2: Chinese words that exist in JP but with different/rare usage ── - - ["信息", "情報", "vocab", "information"], - ["运行", "実行", "vocab", "run/execute"], - ["应用", "アプリケーション", "vocab", "application"], - ["项目", "プロジェクト", "vocab", "project"], - ["选项", "オプション", "vocab", "option"], - ["功能", "機能", "vocab", "function/feature — same kanji but 功能 is ZH form"], - ["支持", "サポート", "vocab", "support — JP uses both but サポート more common in tech"], - ["问题", "問題", "vocab", "problem — JP uses 問題 too, but watch for ZH grammar"], - ["简单", "シンプル", "vocab", "simple"], - ["复杂", "複雑", "vocab", "complex — same meaning but 复杂 is simplified"], - ["尝试", "試す", "vocab", "try"], - ["确认", "確認", "vocab", "confirm — same but 确 is simplified"], - ["删除", "削除", "vocab", "delete — same meaning but 删 is simplified"], - ["创建", "作成", "vocab", "create"], - ["修改", "変更", "vocab", "modify"], - ["获取", "取得", "vocab", "obtain/get"], - ["显示", "表示", "vocab", "display"], - ["隐藏", "非表示", "vocab", "hide"], - ["完成", "完了", "skip", "complete — 完成 is valid Japanese (かんせい), skip"], - ["取消", "キャンセル", "vocab", "cancel"], - ["开始", "開始", "vocab", "start — same but 开 is simplified"], - ["结束", "終了", "vocab", "end"], - ["添加", "追加", "vocab", "add"], - ["移除", "除去", "vocab", "remove"], - - // ── Category 3: Simplified Chinese characters not used in Japanese ── - // These are dead giveaways of Chinese contamination - - ["请", "ください", "simplified", "please — 请 is simplified form of 請"], - ["这", "この", "simplified", "this — ZH-only"], - ["那", "その", "simplified", "that — ZH-only (in this usage)"], - ["还", "まだ", "simplified", "still/yet — ZH-only"], - ["没有", "ありません", "simplified", "don't have — ZH grammar"], - ["已经", "すでに", "simplified", "already"], - ["如果", "もし", "simplified", "if — ZH-only"], - ["因为", "なぜなら", "simplified", "because — ZH-only"], - ["所以", "そのため", "simplified", "therefore — ZH-only"], - ["但是", "しかし", "simplified", "but — ZH-only"], - ["虽然", "〜にもかかわらず", "simplified", "although — ZH-only"], - ["或者", "または", "simplified", "or — ZH-only"], - ["并且", "そして", "simplified", "and — ZH-only"], - ["只是", "ただ", "simplified", "just — ZH-only"], - ["可以", "できます", "simplified", "can — ZH grammar"], - ["需要", "必要", "simplified", "need — ZH prefers 需要, JP prefers 必要"], - ["使用", "使用", "skip", "same in both — skip"], - ["通过", "を通じて", "simplified", "through — ZH-only"], - ["进行", "行う", "simplified", "carry out — ZH-only"], - ["提供", "提供", "skip", "same in both — skip"], - - // ── Category 4: AI/ML specific terms ── - - ["模型", "モデル", "ai", "model — JP uses both but モデル more common"], - ["训练", "トレーニング", "ai", "training"], - ["推理", "推論", "ai", "inference"], - ["权重", "重み", "ai", "weights"], - ["采样", "サンプリング", "ai", "sampling"], - ["采样器", "サンプラー", "ai", "sampler"], - ["生成", "生成", "skip", "same in both"], - ["噪声", "ノイズ", "ai", "noise"], - ["去噪", "ノイズ除去", "ai", "denoise"], - ["分辨率", "解像度", "ai", "resolution"], - ["提示词", "プロンプト", "ai", "prompt"], - ["正面提示词", "ポジティブプロンプト", "ai", "positive prompt"], - ["负面提示词", "ネガティブプロンプト", "ai", "negative prompt"], - ["潜空间", "潜在空間", "ai", "latent space"], - ["编码器", "エンコーダー", "ai", "encoder"], - ["解码器", "デコーダー", "ai", "decoder"], - ["扩散", "拡散", "ai", "diffusion — same meaning but 扩 is simplified"], - ["裁剪", "切り抜き", "ai", "crop/trim"], - ["抖动", "ディザリング", "ai", "dithering"], - ["抖動", "ディザリング", "ai", "dithering (traditional)"], - ["插值", "補間", "ai", "interpolation"], - ["放大", "アップスケール", "ai", "upscale"], - ["缩放", "スケーリング", "ai", "scaling"], - ["蒙版", "マスク", "ai", "mask"], - ["遮罩", "マスク", "ai", "mask (alternative)"], - ["图层", "レイヤー", "ai", "layer"], - ["渲染", "レンダリング", "ai", "rendering"], - ["管道", "パイプライン", "ai", "pipeline"], - ["工作流", "ワークフロー", "ai", "workflow"], - ["节点", "ノード", "ai", "node"], - ["自定义", "カスタム", "ai", "custom"], - ["自定义节点", "カスタムノード", "ai", "custom node"], - ["预览", "プレビュー", "ai", "preview"], - ["批处理", "バッチ処理", "ai", "batch processing"], - ["队列", "キュー", "ai", "queue"], - - // ── Category 5: Image/video processing ── - - ["亮度", "明度", "image", "brightness"], - ["对比度", "コントラスト", "image", "contrast"], - ["饱和度", "彩度", "image", "saturation"], - ["色调", "色相", "image", "hue"], - ["模糊", "ぼかし", "image", "blur"], - ["锐化", "シャープ化", "image", "sharpen"], - ["旋转", "回転", "image", "rotate"], - ["翻转", "反転", "image", "flip"], - ["混合", "ブレンド", "skip", "blend — 混合 is valid Japanese (こんごう), skip"], - ["合成", "合成", "skip", "same in both"], - ["透明度", "透明度", "skip", "transparency — valid in both languages, skip"], -]; - -/** Get only actionable entries (skip nulls and "skip" category) */ -export function getActiveDict() { - return ZH_JA_DICT.filter(([, ja, cat]) => cat !== "skip" && ja != null); -} diff --git a/README.md b/README.md index 0c1c085bb..bc2fa9e8d 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,8 @@ cp .env.local.example .env.local | `npm run translate:snippets:dry-run` | Preview pending snippet translations | | `npm run translate:check-truncation` | Scan for likely truncated translations | | `npm run translate:repair-truncated` | Re-translate files listed in the truncation log | +| `npm run glossary:sync` | Rebuild the terminology glossary from the ComfyUI frontend (see [Terminology consistency](#terminology-consistency)) | +| `npm run translate:review` | Score existing translations with an AI judge (see [Quality review](#quality-review)) | Pass extra flags after `--`: @@ -148,7 +150,53 @@ npm run translate:repair-truncated -- --lang ko - **Chunked files**: `changelog/index.mdx` is handled by `` version labels. The script compares EN vs target labels, translates only **missing** versions, and inserts them in EN order. Old blocks are never re-translated unless you use `--force`. - **Directories**: Subdirectories are created automatically when files are written; you do not need to `mkdir` by hand -Script location: `.github/scripts/i18n/` (see `translate-i18n.ts`, `translation-config.json`) +Script location: `.github/scripts/i18n/` (see `translate-i18n.ts`, `translation-config.json`, and the [i18n README](.github/scripts/i18n/README.md) for full details) + +#### Terminology consistency + +To keep the same English term rendered the same way across pages (e.g. avoid "custom node" drifting between two different Korean translations), three complementary mechanisms feed the translator. Each handles a different kind of term: + +| Mechanism | Effect | Example | Maintained | +|-----------|--------|---------|------------| +| `preserve_terms` (in `translation-config.json`) | keep the term **in English** | `checkpoint`, `LoRA`, `scheduler` | by hand | +| `glossary/frontend/{lang}.json` | use the frontend's **translation** | `workflow → 워크플로` | machine-synced | +| `glossary/overrides/{lang}.json` | **correct / extend** the frontend | `custom node → 커스텀 노드` | by hand, wins | + +The **ComfyUI frontend** ([`ComfyUI_frontend/src/locales`](https://github.com/Comfy-Org/ComfyUI_frontend/tree/main/src/locales)) is the authoritative source of term translations. `npm run glossary:sync` mirrors its locale terms into `glossary/frontend/{lang}.json` (rebuilt wholesale each run — never hand-edit). Hand-maintained corrections live in `glossary/overrides/{lang}.json`, which wins over the mirror and is the place to record a term decision or drop a noisy frontend term: + +```jsonc +// glossary/overrides/ko.json +{ + "terms": { "custom node": "커스텀 노드" }, // remap or add (wins over frontend) + "ignore": ["title", "additional", "work"] // drop a noisy frontend term +} +``` + +At translation time, only terms that actually appear in a document are selected and injected as **preferred** (not mandatory) hints, so the model keeps natural phrasing when a literal substitution would read awkwardly. ComfyUI proper nouns with no settled translation (model names, `checkpoint`, …) instead go in `preserve_terms` to stay in English. See the [i18n README](.github/scripts/i18n/README.md) for the full design and curation guidance. + +```bash +npm run glossary:sync # rebuild the frontend mirror, all languages +npm run glossary:sync -- --lang ko # one language +npm run glossary:sync:dry-run # report counts without writing +``` + +The frontend locales path resolves in order: `--frontend ` → `FRONTEND_LOCALES_PATH` env → `frontend_locales_path` in `translation-config.json` → `../ComfyUI_frontend/src/locales`. + +#### Quality review + +`npm run translate:review` scores existing translations with an **independent** (and typically cheaper) AI model — an LLM-as-a-judge — on four axes: accuracy, completeness, terminology (checked against the glossary), and fluency. It is separate from the translation model's own `=== MISMATCHES ===` self-notes; here a different model acts as judge. + +Results are **advisory**: the detailed scores and issue list are written to `.github/i18n-logs/review/` (`quality-report.json` / `.txt`, gitignored) and never block a PR. The reviewed hash is recorded as `reviewSourceHash` in the translated file's frontmatter (committed to git), so review state is shared across the team and visible per file — mirroring `translationSourceHash`. By default only translations that are up to date with English and not yet reviewed at that hash are checked. + +```bash +npm run translate:review # pending reviews, all languages +npm run translate:review -- --lang ko # one language +npm run translate:review -- --all # re-review everything +npm run translate:review -- --sample 20 # N pending files per language +npm run translate:review -- --min-score 4 # report files scoring below 4/5 +``` + +Configure a dedicated cheap judge model via `REVIEW_API_KEY` / `REVIEW_API_BASE_URL` / `REVIEW_API_MODEL` in `.env.local` (falls back to the `TRANSLATE_*` model when unset). Use a fast model — evaluation is lighter than translation; reasoning-heavy models are slow under concurrency, so lower `REVIEW_CONCURRENCY` if you see connection errors. #### Adding a new language @@ -157,11 +205,14 @@ See [Request a new language](#request-a-new-language) above — please open an i Maintainers: add one entry under `languages` in `.github/scripts/i18n/translation-config.json` (`code`, `name`, `dir`, `snippets_dir`). Path exclusion, link localization, and English-file scanning are derived automatically by `i18n-config.mjs` in the same folder — no per-language edits in translate scripts when adding a locale. Then add navigation in `docs.json` (see [Mintlify Localization](https://mintlify.com/docs/navigation/localization)), and batch-translate: ```bash +npm run glossary:sync -- --lang fr # build the terminology glossary for the new locale npm run translate:dry-run -- --lang fr npm run translate -- --lang fr npm run translate:snippets -- --lang fr ``` +The glossary is extended automatically: once the language is in `translation-config.json`, `npm run glossary:sync` generates `glossary/frontend/{lang}.json` from the ComfyUI frontend locale (provided the frontend ships that locale). An `glossary/overrides/{lang}.json` file is optional — add it later only to correct or pin specific terms. See [Terminology consistency](#terminology-consistency). + #### Manual translation You can still translate by hand instead of using the script: diff --git a/package.json b/package.json index d66f9d0b7..4fc506222 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,10 @@ "translate:snippets:dry-run": "bun .github/scripts/i18n/translate-i18n.ts --snippets --dry-run", "translate:check-truncation": "bun .github/scripts/i18n/check-translation-truncation.ts", "translate:repair-truncated": "bun .github/scripts/i18n/translate-i18n.ts --repair-truncated", - "translate:sync-docs-json": "bun .github/scripts/i18n/translate-i18n.ts --sync-docs-json" + "translate:sync-docs-json": "bun .github/scripts/i18n/translate-i18n.ts --sync-docs-json", + "glossary:sync": "bun .github/scripts/i18n/sync-glossary.mjs", + "glossary:sync:dry-run": "bun .github/scripts/i18n/sync-glossary.mjs --dry-run", + "translate:review": "bun .github/scripts/i18n/review-i18n.ts" }, "devDependencies": { "@executeautomation/playwright-mcp-server": "^1.0.5" diff --git a/readme/README.md b/readme/README.md deleted file mode 100644 index 7e53546a2..000000000 --- a/readme/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Contributing guides (i18n) - -English documentation: [../README.md](../README.md) - -| Language | File | -|----------|------| -| 中文 | [zh-CN.md](zh-CN.md) | -| 日本語 | [ja-JP.md](ja-JP.md) | -| 한국어 | [ko-KR.md](ko-KR.md) | diff --git a/readme/ja-JP.md b/readme/ja-JP.md index 01350d1ba..4e667bfb4 100644 --- a/readme/ja-JP.md +++ b/readme/ja-JP.md @@ -78,9 +78,15 @@ PR を作成していただければ、数日以内にレビューします。 リポジトリルートの英語 MDX が**唯一のソース**です。他言語は同じ相対パスでミラーします(例:`zh/get_started/introduction.mdx`、`ja/get_started/introduction.mdx`、`ko/get_started/introduction.mdx`)。再利用フラグメントは `snippets/` にあり、各言語のコピーは `snippets/zh/`、`snippets/ja/`、`snippets/ko/` などに置きます。 -**翻訳方針**:対応言語(`zh`、`ja`、`ko` など)は英語からの**自動翻訳**で維持します。英語ドキュメント更新後、メンテナーが `npm run translate` で一括同期します。全ページを手翻訳する必要はありません。 +他言語の貢献ガイド:[readme/](.)([English](../README.md)、[中文](zh-CN.md)、[한국어](ko-KR.md))。 -**新しい言語のリクエスト**:[Issue を作成](https://github.com/Comfy-Org/docs/issues/new) して希望の言語(例:フランス語、ドイツ語)をお知らせください。メンテナーが `translation-config.json` と `docs.json` を設定し、**全コンテンツの一括翻訳**を行います。リクエストを送るだけで大丈夫です。訳文 MDX の PR は不要です。 +**翻訳方針** + +対応言語は英語からの**自動翻訳**で維持します。英語ドキュメントが更新されると、`npm run translate` で一括同期されます。貢献者が全ページを手翻訳する必要はありません。 + +**新しい言語のリクエスト** + +他の言語が必要ですか?[Issue を作成](https://github.com/Comfy-Org/docs/issues/new) して希望の言語(例:フランス語、ドイツ語、ブラジルポルトガル語)をお知らせください。メンテナーが `translation-config.json` と `docs.json` に追加し、**全コンテンツの一括翻訳**を行います。リクエストを送るだけで大丈夫です。訳文 MDX の PR は不要です。 MDX の編集仕様は [Mintlify](https://mintlify.com/docs/page) の Writing Content を参照してください。 @@ -111,6 +117,7 @@ cp .env.local.example .env.local | `npm run translate:snippets:dry-run` | snippet の未翻訳一覧を表示 | | `npm run translate:check-truncation` | 途中で切れた翻訳をスキャン | | `npm run translate:repair-truncated` | ログに記録されたファイルを再翻訳 | +| `npm run glossary:sync` | ComfyUI フロントエンドから用語集を再構築([用語の一貫性](#用語の一貫性) 参照) | `--` の後にオプションを渡せます: @@ -124,7 +131,7 @@ npm run translate:repair-truncated -- --lang ko **途中切れ翻訳の修復** -長いファイルは翻訳が途中で切れることがあります(コードフェンス未閉じなど)。一括翻訳後は新規翻訳ファイルを自動スキャンし、`.github/i18n-logs/translate/truncation-issues.json` と `truncation-issues.txt`(gitignore)に修復リストを書き出します。 +長いファイルは翻訳が途中で切れることがあります(コードフェンス未閉じなど)。一括翻訳後は新規翻訳ファイルを自動スキャンし、`.github/i18n-logs/translate/truncation-issues.json` と `truncation-issues.txt`(gitignore)に修復リストを書き出します。言語全体をスキャンする場合や修復する場合: ```bash npm run translate:check-truncation -- --lang ko @@ -137,17 +144,55 @@ npm run translate:repair-truncated -- --lang ko - **入力**: 英語 MDX(主ソース)+ 既存の訳文(コンテキスト、あれば) - **出力**: `zh/`、`ja/`、`ko/` などに書き込み、frontmatter の `translationSourceHash` を更新(snippet は HTML コメントで hash を保存) -- **レビューメモ(mismatch)**: モデルが `=== MISMATCHES ===` で報告した意味上の問題は `.github/i18n-logs/translate/mismatches.json` と `mismatches.txt`(gitignore)に書き込み、MDX には入れません。`npm run translate` 実行時のみ。截断スキャンでは出ません。 -- **截断ログ**: 構造的な問題は `.github/i18n-logs/translate/truncation-issues.json`(上記「途中切れ翻訳の修復」参照) +- **レビューメモ(mismatch)**: モデルが `=== MISMATCHES ===` で報告した意味上の問題は `.github/i18n-logs/translate/mismatches.json` と `mismatches.txt`(gitignore)に書き込み、MDX には入れません。`npm run translate` 実行時のみ。途中切れスキャンでは出ません。 +- **途中切れログ**: 構造的な問題は `.github/i18n-logs/translate/truncation-issues.json`(上記「途中切れ翻訳の修復」参照) - **スキップ**: `built-in-nodes/`(`translation-config.json` の `skip_paths`) -- **チャンク翻訳**: `changelog/index.mdx` は `` のバージョンラベルを比較し、**不足している**バージョンのみ翻訳して EN と同じ順序で挿入します。既存ブロックは `--force` 以外では再翻訳しません +- **チャンク翻訳**: `changelog/index.mdx` は `` のバージョンラベルを比較し、**不足している**バージョンのみ翻訳して英語と同じ順序で挿入します。既存ブロックは `--force` 以外では再翻訳しません - **ディレクトリ**: ファイル書き込み時にサブディレクトリを自動作成(手動の `mkdir` は不要) -スクリプト:`.github/scripts/i18n/` +スクリプト:`.github/scripts/i18n/`(`translate-i18n.ts`、`translation-config.json`、および [i18n README](../.github/scripts/i18n/README.md) を参照) + +#### 用語の一貫性 + +同じ英語用語がページごとに異なる訳にならないよう(例:「custom node」が韓国語で二通りに訳されるのを防ぐ)、翻訳器には三つの補完的な仕組みがあります。それぞれ異なる種類の用語を扱います: + +| 仕組み | 効果 | 例 | 保守 | +|--------|------|-----|------| +| `preserve_terms`(`translation-config.json` 内) | 用語を**英語のまま**保持 | `checkpoint`、`LoRA`、`scheduler` | 手動 | +| `glossary/frontend/{lang}.json` | フロントエンドの**既存訳**を使用 | `workflow → 워크플로` | 機械同期 | +| `glossary/overrides/{lang}.json` | フロントエンドを**修正 / 拡張** | `custom node → 커스텀 노드` | 手動、優先 | + +**ComfyUI フロントエンド**([`ComfyUI_frontend/src/locales`](https://github.com/Comfy-Org/ComfyUI_frontend/tree/main/src/locales))が用語訳の権威ソースです。`npm run glossary:sync` はその locale 用語を `glossary/frontend/{lang}.json` にミラーします(実行のたびに全量再構築 — 手編集しないでください)。手動の修正は `glossary/overrides/{lang}.json` に書き、ミラーより優先されます。用語の決定を記録したり、ノイズの多いフロントエンド用語を除外する場所です: + +```jsonc +// glossary/overrides/ko.json +{ + "terms": { "custom node": "커스텀 노드" }, // 再マップまたは追加(frontend より優先) + "ignore": ["title", "additional", "work"] // ノイズの多いフロントエンド用語を除外 +} +``` + +翻訳時は、ドキュメントに実際に現れる用語だけを選び、**推奨**(必須ではない)ヒントとして注入します。直訳が不自然になる場合は自然な表現を保てます。定訳のない ComfyUI 固有名詞(モデル名、`checkpoint` など)は `preserve_terms` に入れて英語のままにします。設計と保守の詳細は [i18n README](../.github/scripts/i18n/README.md) を参照してください。 + +```bash +npm run glossary:sync # フロントエンドミラーを全言語で再構築 +npm run glossary:sync -- --lang ko # 単一言語 +npm run glossary:sync:dry-run # 件数のみ報告、書き込みなし +``` + +フロントエンド locale のパスは次の順で解決されます:`--frontend ` → `FRONTEND_LOCALES_PATH` 環境変数 → `translation-config.json` の `frontend_locales_path` → `../ComfyUI_frontend/src/locales`。 #### 新しい言語の追加 -上記「**新しい言語のリクエスト**」を参照 — Issue で申請してください。PR で言語を追加する必要はありません。 +上記 [新しい言語のリクエスト](#新しい言語のリクエスト) を参照 — Issue で申請してください。PR で言語を自分で追加しないでください。 + +メンテナー:`.github/scripts/i18n/translation-config.json` の `languages` にエントリを追加(`code`、`name`、`dir`、`snippets_dir`)。パス除外、リンクのローカライズ、英語ファイルのスキャンは同フォルダの `i18n-config.mjs` から自動導出されるため、ロケール追加時に翻訳スクリプトを言語ごとに編集する必要はありません。次に `docs.json` にナビゲーションを追加([Mintlify ローカライゼーション](https://mintlify.com/docs/navigation/localization) 参照)し、一括翻訳を実行: + +```bash +npm run translate:dry-run -- --lang fr +npm run translate -- --lang fr +npm run translate:snippets -- --lang fr +``` #### 手動翻訳 diff --git a/readme/ko-KR.md b/readme/ko-KR.md index 8320dd55d..92c95fa8d 100644 --- a/readme/ko-KR.md +++ b/readme/ko-KR.md @@ -78,9 +78,15 @@ PR을 생성해 주시면 며칠 내에 검토합니다. 저장소 루트의 영문 MDX가 **유일한 소스**입니다. 다른 언어는 동일한 상대 경로로 미러링합니다(예: `zh/get_started/introduction.mdx`, `ja/get_started/introduction.mdx`, `ko/get_started/introduction.mdx`). 재사용 조각은 `snippets/`에 있으며, 언어별 복사본은 `snippets/zh/`, `snippets/ja/`, `snippets/ko/` 등에 둡니다. -**번역 방침**: 지원 언어(`zh`, `ja`, `ko` 등)는 영문 기준 **자동 번역**으로 유지합니다. 영문 문서가 바뀌면 메인테이너가 `npm run translate`로 일괄 동기화합니다. 기여자가 페이지마다 수동 번역할 필요는 없습니다. +다른 언어 기여 가이드: [readme/](.)([English](../README.md), [中文](zh-CN.md), [日本語](ja-JP.md)). -**새 언어 요청**: 다른 언어가 필요하면 [Issue를 열어](https://github.com/Comfy-Org/docs/issues/new) 원하는 언어(예: 프랑스어, 독일어)를 알려 주세요. 메인테이너가 `translation-config.json`, `docs.json`을 설정하고 **전체 콘텐츠를 일괄 번역**합니다. 요청만 보내시면 됩니다. 번역 MDX PR은 필요 없습니다. +**번역 방침** + +지원 로케일은 영문 기준 **자동 번역**으로 유지합니다. 영문 문서가 바뀌면 `npm run translate`로 일괄 동기화되며, 기여자가 모든 페이지를 수동 번역할 필요는 없습니다. + +**새 언어 요청** + +다른 언어 문서가 필요하신가요? [Issue를 열어](https://github.com/Comfy-Org/docs/issues/new) 원하는 로케일(예: 프랑스어, 독일어, 브라질 포르투갈어)을 알려 주세요. 메인테이너가 `translation-config.json`과 `docs.json`에 추가한 뒤 **전체 콘텐츠를 일괄 번역**합니다. 요청만 보내시면 됩니다. 번역 MDX PR은 필요 없습니다. MDX 편집 규격은 [Mintlify](https://mintlify.com/docs/page) Writing Content 섹션을 참고하세요. @@ -111,6 +117,7 @@ cp .env.local.example .env.local | `npm run translate:snippets:dry-run` | snippet 대기 목록 미리보기 | | `npm run translate:check-truncation` | 잘린 번역 가능성 스캔 | | `npm run translate:repair-truncated` | 로그에 기록된 파일 재번역 | +| `npm run glossary:sync` | ComfyUI 프론트엔드에서 용어집 재구축([용어 일관성](#용어-일관성) 참고) | `--` 뒤에 추가 옵션을 전달할 수 있습니다: @@ -124,7 +131,7 @@ npm run translate:repair-truncated -- --lang ko **잘린 번역 복구** -긴 파일은 번역 중간에 잘릴 수 있습니다(예: 코드 펜스 미닫힘). 일괄 번역 후 스크립트가 새로 번역된 파일을 자동 스캔하고, 복구 목록을 `.github/i18n-logs/translate/truncation-issues.json`과 `truncation-issues.txt`(gitignore)에 기록합니다. +긴 파일은 번역 중간에 잘릴 수 있습니다(예: 코드 펜스 미닫힘). 일괄 번역 후 스크립트가 새로 번역된 파일을 자동 스캔하고, 복구 목록을 `.github/i18n-logs/translate/truncation-issues.json`과 `truncation-issues.txt`(gitignore)에 기록합니다. 언어 전체를 스캔하거나 복구하려면: ```bash npm run translate:check-truncation -- --lang ko @@ -140,14 +147,52 @@ npm run translate:repair-truncated -- --lang ko - **검토 메모(mismatch)**: 모델이 `=== MISMATCHES ===`로 보고한 의미상 이슈는 `.github/i18n-logs/translate/mismatches.json`과 `mismatches.txt`(gitignore)에 기록되며 MDX에는 넣지 않습니다. `npm run translate` 실행 시에만 생성되며, 잘림 스캔에서는 나오지 않습니다. - **잘림 로그**: 구조적 문제(미닫힌 코드 펜스, 본문 과소 등)는 `.github/i18n-logs/translate/truncation-issues.json`에 기록 — 위 「잘린 번역 복구」 참고. - **건너뛰기**: `built-in-nodes/`(`translation-config.json` → `skip_paths`) -- **청크 파일**: `changelog/index.mdx`는 `` 버전 라벨을 비교해 **누락된** 버전만 번역하고 EN 순서로 삽입합니다. 기존 블록은 `--force` 없이는 재번역하지 않습니다. +- **청크 파일**: `changelog/index.mdx`는 `` 버전 라벨을 비교해 **누락된** 버전만 번역하고 영문 순서로 삽입합니다. 기존 블록은 `--force` 없이는 재번역하지 않습니다. - **디렉터리**: 파일 쓰기 시 하위 디렉터리 자동 생성(수동 `mkdir` 불필요) -스크립트 위치: `.github/scripts/i18n/` +스크립트 위치: `.github/scripts/i18n/`(`translate-i18n.ts`, `translation-config.json`, [i18n README](../.github/scripts/i18n/README.md) 참고) + +#### 용어 일관성 + +같은 영문 용어가 페이지마다 다르게 번역되지 않도록(예: "custom node"가 서로 다른 한국어로 번역되는 것 방지), 번역기에는 세 가지 보완 메커니즘이 있습니다. 각각 다른 종류의 용어를 처리합니다: + +| 메커니즘 | 효과 | 예시 | 유지 관리 | +|----------|------|------|-----------| +| `preserve_terms`(`translation-config.json`) | 용어를 **영문 그대로** 유지 | `checkpoint`, `LoRA`, `scheduler` | 수동 | +| `glossary/frontend/{lang}.json` | 프론트엔드 **기존 번역** 사용 | `workflow → 워크플로` | 기계 동기화 | +| `glossary/overrides/{lang}.json` | 프론트엔드를 **수정 / 확장** | `custom node → 커스텀 노드` | 수동, 우선 | + +**ComfyUI 프론트엔드**([`ComfyUI_frontend/src/locales`](https://github.com/Comfy-Org/ComfyUI_frontend/tree/main/src/locales))가 용어 번역의 권위 있는 출처입니다. `npm run glossary:sync`는 locale 용어를 `glossary/frontend/{lang}.json`에 미러링합니다(실행마다 전체 재구축 — 수동 편집 금지). 수동 보정은 `glossary/overrides/{lang}.json`에 두며 미러보다 우선합니다. 용어 결정을 기록하거나 노이즈가 많은 프론트엔드 용어를 제거하는 곳입니다: + +```jsonc +// glossary/overrides/ko.json +{ + "terms": { "custom node": "커스텀 노드" }, // 재매핑 또는 추가(frontend보다 우선) + "ignore": ["title", "additional", "work"] // 노이즈 프론트엔드 용어 제거 +} +``` + +번역 시 문서에 실제로 등장하는 용어만 골라 **권장**(필수 아님) 힌트로 주입합니다. 직역이 어색하면 자연스러운 표현을 유지할 수 있습니다. 정착된 번역이 없는 ComfyUI 고유명사(모델명, `checkpoint` 등)는 `preserve_terms`에 넣어 영문을 유지하세요. 전체 설계와 큐레이션 안내는 [i18n README](../.github/scripts/i18n/README.md)를 참고하세요. + +```bash +npm run glossary:sync # 프론트엔드 미러 전체 언어 재구축 +npm run glossary:sync -- --lang ko # 단일 언어 +npm run glossary:sync:dry-run # 개수만 보고, 쓰기 없음 +``` + +프론트엔드 locale 경로는 다음 순서로 해석됩니다: `--frontend ` → `FRONTEND_LOCALES_PATH` 환경 변수 → `translation-config.json`의 `frontend_locales_path` → `../ComfyUI_frontend/src/locales`. #### 새 언어 추가 -위 「**새 언어 요청**」 참고 — Issue로 신청해 주세요. PR로 언어를 직접 추가할 필요는 없습니다. +위 [새 언어 요청](#새-언어-요청) 참고 — Issue로 신청해 주세요. PR로 직접 언어를 추가하지 마세요. + +메인테이너: `.github/scripts/i18n/translation-config.json`의 `languages`에 항목 추가(`code`, `name`, `dir`, `snippets_dir`). 경로 제외, 링크 현지화, 영문 파일 스캔은 같은 폴더의 `i18n-config.mjs`에서 자동으로 파생되므로 로케일 추가 시 번역 스크립트를 언어별로 수정할 필요가 없습니다. 그다음 `docs.json`에 내비게이션 추가([Mintlify 로컬라이제이션](https://mintlify.com/docs/navigation/localization) 참고) 후 일괄 번역: + +```bash +npm run translate:dry-run -- --lang fr +npm run translate -- --lang fr +npm run translate:snippets -- --lang fr +``` #### 수동 번역 diff --git a/readme/zh-CN.md b/readme/zh-CN.md index 823a8bebb..20f49bdf8 100644 --- a/readme/zh-CN.md +++ b/readme/zh-CN.md @@ -78,9 +78,15 @@ ComfyUI 现在为内置节点和自定义节点都增加了内置的节点帮助 仓库根目录的英文 MDX 是**唯一源文件**。其它语言在对应目录下镜像相同路径(例如 `zh/get_started/introduction.mdx`、`ja/get_started/introduction.mdx`、`ko/get_started/introduction.mdx`)。可复用片段在 `snippets/` 下,各语言副本位于 `snippets/zh/`、`snippets/ja/`、`snippets/ko/` 等。 -**翻译方式**:已支持的多语言(如 `zh`、`ja`、`ko`)均通过**自动翻译**维护。英文文档更新后,由维护者批量运行 `npm run translate` 同步译文,无需贡献者逐页手工翻译。 +其它语言贡献指南:[readme/](.)([English](../README.md)、[日本語](ja-JP.md)、[한국어](ko-KR.md))。 -**申请新增语言**:如需其它语言版本,请 [提交 Issue](https://github.com/Comfy-Org/docs/issues/new) 说明所需语言(例如法语、德语)。维护者会完成 `translation-config.json`、`docs.json` 配置,并**批量翻译全部内容**。你只需发起请求,无需自行提交完整译文的 PR。 +**翻译政策** + +已支持的多语言通过英文的**自动翻译**维护。英文文档更新后,由 `npm run translate` 批量同步译文,贡献者无需逐页手工翻译。 + +**申请新增语言** + +需要其它语言版本?[提交 Issue](https://github.com/Comfy-Org/docs/issues/new) 说明所需语言(例如法语、德语或巴西葡萄牙语)。维护者会将其加入 `translation-config.json` 和 `docs.json`,并**批量翻译全部内容**。你只需发起请求,无需自行提交完整译文的 PR。 文件编辑规范见 [Mintlify](https://mintlify.com/docs/page) 文档 Writing Content 部分。 @@ -111,6 +117,7 @@ cp .env.local.example .env.local | `npm run translate:snippets:dry-run` | 预览待翻译的 snippet | | `npm run translate:check-truncation` | 扫描可能被截断的译文 | | `npm run translate:repair-truncated` | 根据截断日志批量重译 | +| `npm run glossary:sync` | 从 ComfyUI 前端重建术语表(见 [术语一致性](#术语一致性)) | 通过 `--` 传递额外参数: @@ -140,14 +147,52 @@ npm run translate:repair-truncated -- --lang ko - **审阅备注(mismatch)**:模型通过 `=== MISMATCHES ===` 报告的语义问题写入 `.github/i18n-logs/translate/mismatches.json` 和 `mismatches.txt`(已 gitignore),不会写入 MDX。仅在 `npm run translate` 时产生,截断扫描不会产生。 - **截断日志**:结构性问题(未闭合代码块、正文过短等)写入 `.github/i18n-logs/translate/truncation-issues.json`,见上文「截断译文修复」。 - **跳过路径**:`built-in-nodes/`(在 `translation-config.json` 的 `skip_paths` 中配置) -- **分块文件**:`changelog/index.mdx` 按 `` 版本号对比,只翻译**缺失**的版本并插入到对应位置;旧版本不会重译(除非 `--force`) +- **分块文件**:`changelog/index.mdx` 按 `` 版本号对比,只翻译**缺失**的版本并按英文顺序插入;旧版本不会重译(除非 `--force`) - **目录**:写入文件时会自动创建子目录,无需手动 `mkdir` -脚本路径:`.github/scripts/i18n/` +脚本路径:`.github/scripts/i18n/`(详见 `translate-i18n.ts`、`translation-config.json` 及 [i18n README](../.github/scripts/i18n/README.md)) + +#### 术语一致性 + +为避免同一英文术语在不同页面译法不一致(例如 "custom node" 被译成两种韩语),翻译器使用三种互补机制,分别处理不同类型的术语: + +| 机制 | 作用 | 示例 | 维护方式 | +|------|------|------|----------| +| `preserve_terms`(在 `translation-config.json` 中) | 保持术语为**英文** | `checkpoint`、`LoRA`、`scheduler` | 手工维护 | +| `glossary/frontend/{lang}.json` | 使用前端**已有译文** | `workflow → 워크플로` | 机器同步 | +| `glossary/overrides/{lang}.json` | **修正 / 扩展**前端术语 | `custom node → 커스텀 노드` | 手工维护,优先级最高 | + +**ComfyUI 前端**([`ComfyUI_frontend/src/locales`](https://github.com/Comfy-Org/ComfyUI_frontend/tree/main/src/locales))是术语译法的权威来源。`npm run glossary:sync` 将其 locale 术语镜像到 `glossary/frontend/{lang}.json`(每次全量重建,请勿手工编辑)。手工修正写在 `glossary/overrides/{lang}.json`,优先级高于镜像,用于记录术语决策或剔除噪声条目: + +```jsonc +// glossary/overrides/ko.json +{ + "terms": { "custom node": "커스텀 노드" }, // 重映射或新增(优先于 frontend) + "ignore": ["title", "additional", "work"] // 剔除噪声前端术语 +} +``` + +翻译时,仅选取文档中实际出现的术语,作为**推荐**(非强制)提示注入模型,避免生硬替换。尚无固定译法的 ComfyUI 专有名词(模型名、`checkpoint` 等)应放入 `preserve_terms` 以保持英文。完整设计与维护说明见 [i18n README](../.github/scripts/i18n/README.md)。 + +```bash +npm run glossary:sync # 重建前端镜像,所有语言 +npm run glossary:sync -- --lang ko # 单一语言 +npm run glossary:sync:dry-run # 仅报告数量,不写入 +``` + +前端 locale 路径按以下顺序解析:`--frontend ` → `FRONTEND_LOCALES_PATH` 环境变量 → `translation-config.json` 中的 `frontend_locales_path` → `../ComfyUI_frontend/src/locales`。 #### 添加新语言 -见上文「**申请新增语言**」——请通过 Issue 申请,无需自行在 PR 中添加语言配置。 +见上文 [申请新增语言](#申请新增语言) — 请通过 Issue 申请,勿自行在 PR 中添加语言。 + +维护者:在 `.github/scripts/i18n/translation-config.json` 的 `languages` 下新增一条(`code`、`name`、`dir`、`snippets_dir`)。路径排除、链接本地化与英文文件扫描由同目录的 `i18n-config.mjs` 自动推导,添加新语言时无需修改翻译脚本。随后在 `docs.json` 中添加导航(见 [Mintlify 本地化](https://mintlify.com/docs/navigation/localization)),并批量翻译: + +```bash +npm run translate:dry-run -- --lang fr +npm run translate -- --lang fr +npm run translate:snippets -- --lang fr +``` #### 手动翻译