Files
DemonGatanjieu-Anomalous_Mo…/web/modules/locales.js
T
DemonGatanjieuandClaude Opus 5.5 a3ce3cae94 Reference audio editor: every clip listed, main and auxiliary references
"Reference audio and emotions" replaces Edit emotions: a large window with
the voices on top (main voice, emotions, new emotion) and every clip of the
character below, one row each (listen, file and length, its line editable
in place, where else it is used, Main / Aux for the voice picked), with
filters, search and paging. Auxiliary references (timbre averaged in, v1 /
v2 / v2Pro), fixed lines (`lines`) and lengths need Anomalous_TTS
interface 18. tts_voice_refs.js holds the rules; the old clip search and
merge helper go.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 12:52:19 +08:00

5427 lines
381 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export const i18n = {
zh: {
updateGuideTitle: "本次更新",
updateGuideReplay: "查看更新引导",
updateGuideSkip: "跳过",
updateGuideBack: "上一步",
updateGuideNext: "下一步",
updateGuideDone: "知道了",
updateGuideProgress: "第 {current} / {total} 步",
tourRailTitle: "左侧图标栏:一条线用下来",
tourRailBody: "从上往下就是平时的用法:在模型库挑模型 → 出图后在图库收藏 → 收藏的东西分别进工作流、搭配、提示词三页,下次一键用上。再点一下当前页的图标(或顶栏最左边的按钮),可以收起、展开旁边的列表。",
tourGalleryTitle: "🖼️ 图库:出图后点 ☆ 收藏",
tourGalleryBody: "生成的图都在这里。喜欢哪张,点它的 ☆ 选要留下什么:整个工作流(去“工作流”)、它的模型和 LoRA 搭配(去“搭配”),或者只要提示词(去“提示词”)。收藏过的 ☆ 是实心的,点开就能找到存成了什么。",
tourRecipesTitle: "📚 工作流:整套调好的流程",
tourRecipesBody: "收藏的整个工作流在这里,带出图当封面。点开或拖到画布上就能接着用;本机缺模型时,“模型检查”会帮你找。右上角的 ⇅ 是分享与导入:生成分享码,或者粘贴分享码、拖入工作流文件和备份。",
tourCombosTitle: "🧩 搭配:模型 + LoRA + 提示词",
tourCombosBody: "常用的主模型、几个 LoRA 和一段提示词存成一个搭配(从图库收藏,或在这里新建)。按“放到画布”或把卡片拖到画布上,就放出一组连好线的节点;画布上原有的东西不动。",
tourPromptsTitle: "✍️ 提示词:提示词工坊",
tourPromptsBody: "提示词工坊:选中的提示词节点在这里按词块直接改,点词卡就加进去,打中文会译成英文,还能在每个词下面看它的意思。你存的提示词在“我存的”里;词卡也能直接拖到画布的提示词框里(正面绿框、负面红框)。",
tourNodeTitle: "🤖 当前节点:选中哪个改哪个",
tourNodeBody: "选中画布上的节点后:上面换模型、插 LoRA;提示词节点可以一键到提示词工坊里改;下面列出这类节点存过的参数,每条写明会改哪几项,点“套用”只改这几项。",
tourScanTitle: "🎯 扫描模型",
tourScanBody: "第一次用先扫描一下:认出每个模型是什么(名字、封面、基础模型),找模型、查缺模型都靠它。一键只扫新加的模型,进度在页面里,关掉窗口也会在后台继续。鼠标放到模型卡片上,点准星按钮可以只扫那一个。",
tourDoctorTitle: "🩺 模型检查(缺模型)",
tourDoctorBody: "打开工作流时会自动检查,缺模型就在画布上方提示。改过名、换过文件夹的同一个文件(按 SHA256 指纹认)可以一键换上;其余的在这里自己挑,或看模型去哪下载。不想自动弹,在横条上点“不再提醒”。",
tourNoticeTitle: "(!) 更新说明与停靠",
tourNoticeBody: "点 (!) 看最近改了什么,也能再开这个导览;旁边的 ◧ 在贴着 ComfyUI 侧边和独立浮动窗口之间切换。",
tourSettingsTitle: "⚙️ 设置",
tourSettingsBody: "外观和语言、模型卡片清晰度与内存、文件夹、工作流指纹、打开方式和窗口,以及帮助与反馈。",
tourExit: "退出导览 (Esc)",
tourDone: "完成",
updateGuideNoticeTooltip: "更新引导与版本",
versionCheckOpen: "检查更新 / 切换版本 ›",
versionPanelTitle: "版本与更新",
versionChipUnknown: "版本未知",
versionCurrent: "当前版本",
versionUnknown: "无法识别(不是 git 安装)",
versionDevBuild: "开发版(基于 {base},分支 {branch})",
versionBranch: "分支 {branch}",
versionDetached: "固定在发布版本",
versionDirtyWarning: "插件文件有本地修改,切换版本前请先提交或还原这些修改。",
versionCheck: "检查更新",
versionCheckHint: "点击“检查更新”获取已发布的版本列表。只有点击时才会联网。",
versionChecking: "正在获取发布版本…",
versionReturnLatest: "回到最新版",
versionReturnLatestHint: "切回默认分支并拉取最新代码",
versionUndo: "撤销上次切换(回到 {label})",
versionShowPrerelease: "显示预发布版本",
versionNoReleases: "没有找到已发布的版本。",
versionBadgeCurrent: "当前",
versionBadgeLatest: "最新稳定版",
versionBadgePrerelease: "预发布",
versionNotes: "更新说明",
versionOpenGithub: "在 GitHub 查看",
versionUpdateTo: "更新到此版本",
versionRollbackTo: "回退到此版本",
versionUpToDate: "已是最新稳定版。",
versionNewAvailable: "有新版本:{tag}",
versionSourceGit: "(GitHub 接口不可用,列表来自 git 标签,没有更新说明)",
versionPreparing: "正在准备 {tag}…",
versionSwitching: "正在切换到 {tag}…",
versionConfirmUpdate: "从 {from} 更新到 {tag}?",
versionConfirmRollback: "从 {from} 回退到 {tag}?",
versionConfirmLatest: "切回默认分支并更新到最新代码?",
versionConfirmUndo: "回到切换前的版本 {label}?",
versionRollbackDataWarning: "旧版本可能读不懂新版本保存的设置或配方。你的数据不会被删除,回到新版后即可恢复正常。",
versionNoPanelWarning: "{tag} 还没有版本面板。想回到新版时,请在 ComfyUI Manager 里点“更新”这个插件。",
versionRestartNote: "切换后需要重启 ComfyUI 才会生效。",
versionSwitched: "已切换到 {tag}。",
versionReturnedLatest: "已回到最新版。",
versionPendingRestart: "待重启",
versionRestartQuestion: "现在重启 ComfyUI 吗?",
versionRestartNow: "立即重启",
versionRestartLater: "稍后",
versionRestarting: "ComfyUI 正在重启,稍后请刷新页面。",
versionRestartManual: "无法自动重启(需要 ComfyUI Manager)。请手动重启 ComfyUI。",
versionErrorGeneric: "操作失败:{error}",
versionError_not_git: "插件不是通过 git 安装的,无法检查或切换版本。",
versionError_dirty: "以下插件文件有本地修改,为了不覆盖它们,已取消切换:",
versionError_diverged: "本地分支有远程没有的提交,已取消以免覆盖。",
versionError_offline: "无法连接 GitHub,请检查网络后重试。",
versionError_git_missing: "找不到 git 程序。",
versionError_git_timeout: "git 操作超时,请稍后重试。",
versionError_git_failed: "git 操作失败:{error}",
versionError_bad_tag: "版本名无效。",
versionError_unknown_tag: "这不是已发布的版本。",
versionError_no_previous: "没有可以撤销的切换。",
versionError_no_default_branch: "无法确定默认分支。",
updateGuideTourBanner: "💡 想在主界面实地体验?点击开启按键遮罩导览 ›",
materialCardDragHint: "按住可拖拽至画布节点注入参数,或拖至空白处载入工作流",
updateGuideImportTitle: "模型拖进来,自动放对地方",
updateGuideImportBody: "在模型页点“+ 导入”,或者直接把模型文件拖到模型页上:每个文件会说明它是什么(Checkpoint、LoRA、VAE、文本编码器…)、什么底模、要放到哪个文件夹,放的位置可以改。本机已经有的同一个文件会指出来,什么都不会被覆盖,放好后自动扫描。",
updateGuideTidyTitle: "整理:放错文件夹的、重复的模型",
updateGuideTidyBody: "模型页上方多了“整理”标签。它读每个模型文件里的信息,找出放错文件夹、在那里加载会报错的模型(比如只有主体的 Flux、Anima 放进了 Checkpoint),一键连同封面和备注移到对的地方;还会把完全相同的重复文件并排列出来。",
updateGuideBaseModelsTitle: "按底模筛选,卡片显示版本",
updateGuideBaseModelsBody: "类型标签下面多了一排底模标签(Illustrious、SDXL、Anima…)和数量,点一下只看这个底模的模型,找配套的 LoRA 很方便。扫描过的模型,卡片名字上方会显示 Civitai 上的版本,同名的几个版本一眼分开。",
updateGuideCompareTitle: "参数对比,工作流先看参数方案",
updateGuideCompareBody: "图库里在一张图上按 ⇄,再按另一张或“和当前画布对比”,只列出两边不同的值,勾选后能一键放回画布。打开一个工作流先看到它的参数方案:默认参数、你存的各套方案和它们出的图;☆ 标出重点参数。选中节点时,“当前节点”会说明每套方案从哪来、上次套用的是哪套。",
updateGuideSettingsTabsTitle: "设置分成几个标签",
updateGuideSettingsTabsBody: "设置页分成 外观、模型、工作流、提示词、备份、帮助。下载和导入的模型放到哪里,在“模型”里选,默认按底模分文件夹,旁边有示例路径。",
materialAppliedTarget: '已应用到:{name} · #{id}',
materialDropHint: '拖到兼容的节点上,松手应用;Esc 取消',
materialDropTarget: '松手应用到:{name}',
promptPreviewTag: "松手后变成",
materialApplyFailed: '应用失败,节点参数已恢复。',
materialUndo: "撤销这次应用",
materialUndone: "已撤销",
materialUndoChanged: "节点已发生其他变化,请使用 ComfyUI 的撤销操作。",
materialTargetChanged: "请重新选中一个节点后再应用。",
materialNoCompatibleValues: "这些值不能安全地写进这个节点。",
materialValueUnavailable: "有个选项在这个节点里没有(本机缺模型,或节点版本不同)。",
promptCompositionHint: "填写提示词,选择放在前面或后面,再拖到提示词节点。保留节点原有文字,不自动运行。",
nodeValuesSaved: "已存下这些节点的参数。以后选中同类节点,在“当前节点”里就能套用。",
promptDragNoteHint: "按住卡头或便签,直接拖拽至画布节点",
recipeMoveKept: "以前从出图收下的完整工作流还有 {count} 个没移过来。它们现在都放在这里,以后在图库点 ☆ 也能直接存成配方。",
recipeMoveKeptButton: "移到这里",
recipeMovedKept: "移过来了 {count} 个。原来的文件还在,只是不再单独列出。",
recipeScopePill_all: "全部",
recipeScopePill_complete: "完整工作流",
recipeScopePill_partial: "功能模块",
recipeViewGrid: "网格视图",
recipeViewList: "列表视图",
recipeStatusUnverified: "模型待校验",
recipeReadinessHint: "检测工作流所需模型在本地环境中的就绪状态,点击卡片进入详情可进行智能比对与替换",
close: '关闭',
copy: '复制',
materialSavePromptAction: "保存提示词",
materialSaveGeneration: "保存这组生成参数",
materialSaveGenerationAction: "存下来",
materialGenerationScope: "保存采样与尺寸节点的整组参数,可在“当前节点”里套用。",
materialCopySuccess: "已复制",
materialCopyFailed: "复制失败",
materialClickToCopy: "点击复制数值",
promptAdjustRole: "调整用途",
notebookCompanionModels: "配套模型",
notebookMore: "更多",
notebookDoneEditing: "📑 查看双语分词",
loras: "LoRA 模型",
notebookPromptTitle: "提示词",
materialAllTags: "全部标签",
materialDuplicateConfirm: "这张图片和所选参数已经保存为“{name}”。仍要另存一份吗?",
materialCopyError: "复制失败,请重试",
materialChars: "{count} 字符",
materialCopyPromptText: "复制提示词",
notebookSaveError: '保存失败,修改仍留在编辑器中,请重试。',
title: 'Anomalous 模型浏览器',
scan: '🔄 扫描目录并同步 C 站数据',
scanTitle: '扫描目录',
scanConfirm: '注意:\n扫描过程将会自动比对 Civitai 并重命名本地模型,同时清理损坏文件。\n确定要开始扫描吗?',
scanning: '扫描中...',
scanBg: '扫描后台启动!',
scanDone: '完成',
scanCompleteMsg: '✅ 扫描完成!\n\n⚠️ 提示:由于部分模型已被重命名或去重,请点击 ComfyUI 的 [Refresh] 按钮以同步最新的模型列表。',
togglePlayTitle: '切换播放模式',
clean: '🧹 清理无效的 .info 残留文件',
cleanTitle: '清理重复 Info',
files: '个文件。',
folderOpen: '打开',
folderOpenHint: '在资源管理器里打开这个文件夹',
folderAll: '全部',
folderTopOnly: '根目录里的',
scanPageTitle: "扫描模型",
scanPageLead: "扫描就是给模型配上封面和说明:插件算出每个模型文件的“指纹”,拿去 Civitai(最大的 AI 绘图模型网站)查它是哪个模型,查到就下载封面、触发词,并记下它配合哪个大模型用(底模)。查不到的,就从文件本身猜它的底模。扫过的不会重复下载。",
scanPageMatched: "Civitai 上查到了",
scanPageUnmatched: "没查到",
scanPageNew: "还没扫过",
scanPageSummaryFailed: "暂时读不到模型数量,仍然可以扫描。",
scanPageScanNew: "扫描 {count} 个待查的模型",
scanPageScanAgain: "再检查一遍",
scanPageScanPicked: "扫描挑选的 {count} 个模型",
scanPageScanning: "正在扫描…",
scanPageRetry: "把 {count} 个没查到的再联网查一遍",
scanSettingsTitle: "扫描设置",
scanSettingsLead: "下一次扫描按这里的设置进行。刷新页面后恢复默认;“修改文件名”和“重新获取”扫完一次就自动关掉。",
scanPageScopeAllHelp: "所有模型文件夹,设置里“文件夹管理”隐藏的除外。",
scanPagePickModels: "挑选模型扫描…",
scanPickBackToAll: "清空,改回扫描全部",
scanPageLeadShort: "给模型配上封面、说明和底模;扫过的不会重复下载。",
scanCountingTitle: "正在清点你的模型…",
scanCheckingNet: "正在检查能不能连上 Civitai…",
scanNetDownTitle: "连不上 Civitai",
scanNetDownText: "原因:{why}\n\n可以先只从模型文件推断:能认出底模(SDXL、Flux 这类),没有封面和触发词;以后能连上时再扫一次,会自动补上。\n\n也可以先去「设置 → 模型 → 网络」填代理。",
scanNetFromFiles: "从文件推断",
scanNetSetProxy: "去设置代理",
scanCountingHint: "模型很多,或者放在网络盘上时,第一次要等一会儿;之后再打开会快很多。",
scanPageAboutLink: "扫描是怎么回事?",
scanHeroWaiting: "还有 {count} 个模型待查",
scanHeroPicked: "已选 {count} 个模型",
scanHeroDone: "模型都扫过了",
scanHeroFound: "{total} 个模型里 {matched} 个已在 Civitai 查到",
scanHeroLookup: "会去 Civitai 查 {count} 个,查不到的从文件推断底模;已查到的不再联网。",
scanHeroInfer: "离线:{count} 个还没扫过的只从文件推断。",
scanHeroForce: "开着“重新获取”:{count} 个都会重新联网查。",
scanHeroMore: "详情",
scanHeroLess: "收起",
scanHeroRenames: "这次会改磁盘上的文件名。",
scanHeroFetchesAll: "这次会重新获取所有已扫描的模型,很慢。",
scanModeOnline: "联网",
scanModeOffline: "离线",
scanModeOnlineHelp: "先去 Civitai 查,查不到的从文件本身猜底模;连不上时自动改成只看文件,下次联网再补查。",
scanStateTitle: "模型状态",
scanStateUnmatched: "没查到 · 已从文件推断",
scanPartsChip: "基础组件 {count} 个 · 没查到也正常",
scanAttentionTitle: "需要你看一下",
scanSettingsMore: "更多:改文件名、重新获取",
scanTileDisplayName: "用 Civitai 名称显示",
scanTileDisplayNameHelp: "只改卡片上显示的名字,不改文件。",
scanTileAutoFix: "扫完修复工作流",
scanTileAutoFixHelp: "把画布里找不到的模型换成本地对应的那个。",
scanTileKey: "Civitai Key",
scanTileKeyOn: "已设置:要登录才能看的模型也能查。",
scanTileKeyOff: "没设置:部分模型要登录 Civitai 才能看。",
scanTileOnlineOnly: "离线扫描时用不到。",
scanPageApiKeyChange: "更换…",
scanPageBackground: "扫描在后台进行,可以关掉这个窗口继续用 ComfyUI。",
scanScopeWithParts: "(含 {count} 个基础组件)",
scanPartsNote: "这些是绘图模型要配合加载的部件,很多本来就不在 Civitai 上,没查到不影响使用。扫描会顺便记下文件指纹,模型检查靠它在别人的工作流里认出这些文件;扫不扫都可以,上面的数字也不算它们。",
scanListParts: "基础组件 {count} 个",
scanListPartsHint: "这些是绘图模型要配合加载的部件(VAE、文本编码器、CLIP、CLIP Vision、放大模型),很多本来就不在 Civitai 上,没查到不影响使用。扫描会顺便记下文件指纹,模型检查靠它在别人的工作流里认出这些文件;扫不扫都可以。",
scanScopeLookup: "{count} 个{parts}这次会去 Civitai 查:还没扫过的,和上次没连上网的",
scanScopeInfer: "{count} 个还没扫过的{parts}只从文件推断类型(离线,不联网)",
scanScopeNothingNew: "没有还没扫过的模型,这次不会联网查",
scanScopeMatched: "{count} 个{parts}已经查到,只用已有记录,不再联网",
scanScopeNotFound: "{count} 个{parts}Civitai 上没有,不重查(要重查,在“没查到”列表里再联网查一遍)",
scanScopeExcluded: "{count} 个设为不扫描,跳过",
scanScopeWaiting: "{count} 个{parts}上次没连上网、还没查的,等下次联网扫描再查",
scanScopeForce: "开着“重新获取”:{count} 个{parts}都会重新联网查",
scanPickTitle: "挑选要扫描的模型",
scanPickSearch: "搜索名字或文件名",
scanPickAllFolders: "全部文件夹",
scanPickViewList: "列表",
scanPickViewCovers: "封面",
scanPickStateAll: "全部",
scanPickFound: "已查到",
scanPickShown: "选中这 {count} 个",
scanPickUnpickShown: "取消选中这些",
scanPickOnlyPicked: "只看已选",
scanPickClear: "清空已选",
scanPickChange: "改选…",
scanPickRemove: "不扫这个",
scanPickMore: "还有 {count} 个",
scanPickNone: "还没选模型",
scanPickSummary: "已选 {count} 个 · 共 {size}",
scanPickRangeHint: "按住 Shift 点击,可以一次选中一段",
scanPickLoading: "正在读取模型…",
scanPickFailed: "读不到模型列表:{error}",
scanPickEmpty: "没有符合条件的模型。",
scanPickTruncated: "模型太多,只列出了前 {shown} 个(共 {total} 个)。",
scanPickFoundNote: "其中 {count} 个已经查到,这次只用已有记录,不会重新联网;要重新查,在下面的扫描设置里打开“重新获取已扫描的模型”。",
scanPageTagFiles: "会改动文件",
scanPageTagSlow: "很慢",
scanPageOfflineHelp: "不联网,只从模型文件推断底模,没有封面和触发词。之后联网扫描会自动补查这些模型。",
scanPageFileRename: "同时修改磁盘上的文件名",
scanPageFileRenameHelp: "会真的给模型文件改名,用到这些模型的旧工作流要靠模型检查修复;遇到内容完全相同的重复副本,会把其中一个移到回收站;部分文件夹受保护,不会改名。扫描完自动关掉。",
scanPageForce: "重新获取已扫描的模型",
scanPageForceHelp: "每个模型都重新计算哈希并联网获取,很慢。只更新 Civitai 的信息和 Civitai 的封面;你改的名字、备注和自己换的封面都会保留。扫描完自动关掉。",
scanPageForceConfirm: "重新获取全部已扫描的模型?\n\n每个模型都要重新计算哈希、联网下载信息和封面,模型多时可能要很久。\n你改的名字、备注和自己换的封面都会保留;被替换的只有 Civitai 自己的旧封面。",
scanPageApiKeySet: "设置…",
scanPageApiKeyPrompt: "输入 Civitai API Key(留空并确定可以清除):",
scanPageApiKeySaved: "API Key 已保存。",
scanPageApiKeyCleared: "API Key 已清除。",
scanPageApiKeyFailed: "保存失败:{error}",
scanPageStartFailed: "扫描没能开始:{error}",
scanReasonNotFound: "Civitai 上没有这个文件",
scanReasonNetwork: "当时连不上 Civitai",
scanReasonOffline: "离线扫描,还没查 Civitai",
scanPageNotDrawing: "{count} 个还没扫的看起来不是绘图模型(比如语音模型),Civitai 上多半查不到",
scanPageSkipThem: "都不扫",
scanPageScanThem: "都照常扫",
scanPageSeeThem: "逐个看",
scanPageExcludedNote: "{count} 个模型设为不扫描",
scanListNotDrawing: "看起来不是绘图模型 · {count}",
scanListNotDrawingHint: "这些模型的文件头不像任何一种绘图模型(大模型、LoRA、VAE…),常见的是语音、语言这类模型,Civitai 上一般查不到。设为不扫描后,扫描全部时会跳过它们,也不再显示“未扫描”;想记下它们的指纹(修复工作流时用),就照常扫描。",
scanListExcluded: "设为不扫描的模型 · {count}",
scanListExcludedHint: "扫描全部时跳过这些模型;单独挑出来扫仍然会扫。改为扫描后,下次扫描就会算上它们。",
scanListExcludedAll: "全部改为扫描",
scanRowSkip: "不扫描",
scanRowKeep: "照常扫描",
scanRowUnskip: "改为扫描",
scanRowNotDrawing: "看起来不是绘图模型",
scanFingerprintKept: "指纹已记下,修复工作流时可以用",
scanChoiceFailed: "有 {count} 个模型没改成(找不到文件,或它的 .anomalous.json 读不了)。",
scanReasonDamaged: "文件头损坏:文件可能没下载完整,或被别的工具改坏了,所以 Civitai 认不出它,也读不出底模。建议重新下载这个模型,换好后点「重新查找」",
scanReasonUnknown: "Civitai 上没找到",
scanErrorNameConflict: "目标文件名已被另一个不同的模型占用,没有改名",
scanErrorDuplicateKept: "发现完全相同的副本,但没能移到回收站,两份都保留了",
scanCountMatched: "新匹配 {count}",
scanCountInferred: "从文件推断 {count}",
scanCountFailed: "失败 {count}",
scanCountCovers: "下载封面 {count}",
scanCountRenamed: "改名 {count}",
scanCountNothing: "没有需要更新的模型",
scanFileMatched: "已匹配 Civitai:{name}",
scanFileInferredBase: "{reason},底模从文件推断为 {base}",
scanFileInferred: "{reason},文件里也没读出底模",
scanFileFailed: "没有完成:{error}",
scanFileUpdated: "已更新",
scanFileRenamed: "原文件名 {from}",
scanFileDuplicate: "重复副本已移到回收站",
scanFileCoverKept: "保留了你的封面,Civitai 封面存为备份",
scanScopeOne: "扫描 {name}",
scanScopePicked: "扫描挑选的模型",
scanScopeRetry: "重新联网查找",
scanScopeAll: "扫描全部模型",
scanCivitaiDownShort: "中途连不上 Civitai",
scanOneUnchanged: "这个模型的信息已经是最新的",
scanOneTitle: "扫描:{name}",
scanModelGone: "找不到 {name},可能已被移动或删除。",
scanRowOpen: "查看",
scanRowRetry: "重新查找",
scanRowSearch: "去 Civitai 搜",
scanRowScan: "扫描",
scanShowAll: "显示全部 {count} 个",
scanBack: "‹ 返回扫描",
scanListScanAll: "扫描这 {count} 个模型",
scanListEmpty: "这里已经没有模型了。",
scanResultList: "上次扫描的明细",
scanResultDetails: "看每个模型({count})",
scanResultTitle: "上次扫描 · {when} · {scope} · 用时 {duration}",
scanSeconds: "{count} 秒",
scanMinutes: "{count} 分钟",
scanResultOffline: "这是离线扫描:没有查 Civitai,下次联网扫描会补查这些模型。",
scanResultCivitaiDown: "扫描中途连不上 Civitai,之后的模型先从文件推断了底模。网络恢复后,下次扫描会自动补查它们。",
scanCivitaiWhy: "原因:{why}。浏览器能上、这里却不行时,试试在代理软件里打开“系统代理”或 TUN 模式,或者在 设置 → 网络 里填代理地址。",
scanResultNothing: "没有模型需要更新({count} 个已是最新)。",
scanResultUnchanged: "另有 {count} 个模型已是最新,没有改动。",
scanListNew: "还没扫过的模型 · {count}",
scanListMatched: "Civitai 上查到的模型 · {count}",
scanListMatchedHint: "这些模型已经在 Civitai 上认出来了:名字、说明和触发词都有了。点“查看”看它的详情。",
scanListSearch: "按名字找…",
scanUpdating: "先显示上次的统计,正在更新…",
scanListUnmatched: "Civitai 上没查到的模型 · {count}",
scanListNewHint: "这些模型放进来以后还没扫过,卡片上标着“未扫描”。点上面的按钮一起扫,或者点某一行的“扫描”只扫那一个;扫过一次,不管查没查到,都不会再留在这里。大文件算指纹要几十秒。",
scanListUnmatchedHint: "扫过了,但 Civitai 上没查到。常见原因:模型不是在 Civitai 发布的(语音、放大、识别这类模型多半来自 HuggingFace 或 GitHub),是自己训练或合并的,或者下载后被改过。不影响使用,只是没有封面和说明;想记下来源,点“查看”后在编辑里填上来源链接。标着“当时连不上”或“离线扫描”的,下次联网扫描会自动再查。",
scanListUnmatchedHintOffline: "扫过了,但 Civitai 上没查到。现在是离线扫描,不能重新查找;联网后再试。",
scanListSkipped: "不在扫描范围的模型文件 · {count}",
scanListSkippedHint: "这些模型文件不是 .safetensors 格式(比如 .pth、.ckpt、.bin),扫描只认 .safetensors,所以不会去查它们,卡片上也不会标“未扫描”。它们在 ComfyUI 里照样能用;想记下来源,点“查看”后在编辑里填上来源链接。",
scanPageSkippedNote: "{count} 个其他格式的模型文件不扫描",
scanPageDamagedNote: "{count} 个模型文件已损坏(文件头读不出来),建议重新下载",
scanReasonNotImage: "也看不出是哪类绘图模型,可能是语音、放大之类的模型",
scanPageShowList: "查看是哪些模型",
scanPageScanNewOffline: "离线扫描 {count} 个新模型",
scanProgressShowResult: "查看结果",
modelSourceLabel: "来源",
modelSourceCivitai: "Civitai",
modelSourceLocal: "从文件推断",
modelSourceLocalShort: "推断",
modelSourceInferredBadge: "推断 {base}",
modelSourceDamagedShort: "文件损坏",
modelSourceDamaged: "文件头损坏,建议重新下载",
modelSourceSkipped: "不扫描",
modelSourceSkippedHint: "你设了不扫描:扫描全部时会跳过它(单独挑出来扫仍然会扫)。",
modelSourceNotDrawingHint: "还没扫描。文件头看起来不像绘图模型(可能是语音之类的模型),Civitai 上多半查不到,可以设为不扫描。",
modelSourceSetSkip: "设为不扫描",
modelSourceSetScan: "改为扫描",
modelSourceLocalHint: "{reason},底模是从模型文件推断的。可以在扫描页重新联网查找。",
modelSourceNotScanned: "未扫描",
modelSourceNotScannedHint: "还没扫描:到扫描页补全封面、触发词和底模。",
modelSourceEdited: "你改过:{fields}",
modelSourceListSep: "、",
modelSourceFieldName: "名称",
modelSourceFieldNotes: "备注",
modelSourceFieldLink: "来源链接",
modelInferredBase: "底模 ≈ {base} 是插件从模型文件本身推断的,不一定准;Civitai 的封面、说明和触发词也就没有。",
modelInferredNoBase: "文件本身也看不出底模;Civitai 的封面、说明和触发词也就没有。",
modelInferredPending: "下次联网扫描会自动再查。",
modelInferredFill: "补上名称和来源链接",
modelInferredEdit: "编辑信息",
modelLinkSource: "来源链接",
noModels: '此文件夹中没有找到模型。',
modelSearchPlaceholder: '搜索模型:名称、触发词、底模…',
modelSearchNone: '这一类里没有和“{query}”匹配的模型。要搜别的类型,点上面的类型标签。',
modelTypesLabel: '模型类型',
modelTypesRoot: '根目录',
modelTypesCrumbHint: '只显示这个文件夹里的模型。点击回到全部 {type}',
noPreview: '暂无预览图',
delModel: '删除',
delConfirm: '确定删除',
delConfirm2: '及其信息文件和预览图吗?它们会一起移到系统回收站,需要时可以从回收站还原。',
delSuccess: '✅ 删除成功!\n',
delNote: '\n\n⚠️ 提示:请重启 ComfyUI,否则由于缓存继续使用会报错',
delFail: '❌ 删除失败: ',
copyAll: '📋 复制全部',
copied: '✅ 已复制!',
clickToCopy: '点击复制: ',
compatibleModels: '🔗 兼容模型',
refresh: '刷新',
loading: '加载中…',
loadingCompatible: '加载中...',
applyToCanvas: '插入节点',
workspace: '创作工作台',
workspaceTitle: '创作工作台',
materialLoadError: "存过的提示词读取失败。",
materialOpenWorkflow: '打开完整工作流',
materialOpenError: "无法打开这张图里的工作流。",
materialViewDetails: '查看详情',
materialViewParameters: '查看参数',
materialDetailLoadError: "无法读取这条提示词。",
materialSourceImage: '来源图片',
workbenchLoadSuccess: '工作流已成功加载到 ComfyUI 画布!',
workbenchLoadFailed: '无法加载工作流到画布:',
workbenchNext: '下一张 (→)',
workbenchPrev: '上一张 (←)',
workbenchFilmstrip: '侧栏缩略图',
workbenchTabOverview: '概览',
workbenchTabPrompts: '提示词',
workbenchTabModels: '模型',
workbenchTabNodes: '全部参数',
workbenchZoomFit: '适应窗口',
workbenchZoomReset: '1:1 实际尺寸',
workbenchCopyWorkflowJson: '复制完整工作流 JSON',
workbenchCopiedWorkflowJson: '✅ 已复制工作流 JSON',
workbenchStepsValue: '{count} 步',
workbenchNoModels: '(未检测到模型引用)',
workbenchNoNodeParams: '(无底层节点参数数据)',
workbenchLocateModel: '🔎 定位模型',
materialInspecting: '正在读取图片中的工作流与参数…',
materialInspectError: "这张图片没有可复用的完整 UI 工作流。",
materialSaveHint: '完整工作流保留精确种子;作为单节点参数应用时会跳过种子。',
materialPromptRoleHelp: "已按工作流连线自动识别提示词角色;识别不准时可手动改为正面、负面、共用或忽略。每条提示词都能直接存进提示词库。",
materialNoPromptData: '(无嵌入提示词数据)',
materialSaveError: "没存上,请再试一次。",
materialNodeApplied: "参数已填进节点",
materialPromptText: '提示词',
materialViewOriginal: '🔍 查看大图',
materialDenoise: '降噪',
materialScheduler: '调度',
materialModelBase: '主模型 / UNet',
materialModelLora: '🎨 LoRA 微调层',
materialModelVae: 'VAE 编码器',
materialModelClip: '👁️ 文本编码器 (CLIP)',
materialModelOther: '其它模型组件',
materialParameterCount: '{count} 项参数',
materialNodeId: '节点 ID',
materialNodeMode: '节点模式',
materialCopyNodeParameters: '📋 复制节点 JSON',
materialNoWidgetParameters: '这个节点没有序列化的控件参数。',
materialWidgetIndex: '参数 {index}',
materialVolatileParameter: '运行时易变',
materialParameterFullValue: '这里保留完整值;内容较长时可在框内滚动。',
materialNodeProperties: '节点属性 (properties)',
materialParamSeed: '种子 (seed)',
materialParamSeedControl: '运行后种子控制',
materialParamAddNoise: '添加噪声',
materialParamStartStep: '开始步数',
materialParamEndStep: '结束步数',
materialParamLeftoverNoise: '保留剩余噪声',
materialParamWidth: '宽度',
materialParamHeight: '高度',
materialParamBatchSize: '批次数量',
materialParamCheckpoint: 'Checkpoint 模型',
materialParamUnet: 'UNet 模型',
materialParamWeightDtype: '权重数据类型',
materialParamLora: 'LoRA 模型',
materialParamModelStrength: '模型权重',
materialParamClipStrength: 'CLIP 权重',
materialParamVae: 'VAE 模型',
materialParamClipVision: 'CLIP Vision 模型',
materialParamControlNet: 'ControlNet 模型',
materialParamClipOne: '文本编码器 1',
materialParamClipTwo: '文本编码器 2',
materialParamClipThree: '文本编码器 3',
materialParamClipType: '编码器类型',
materialParamFilenamePrefix: '输出文件名前缀',
materialPromptCopied: '✅ 提示词已复制',
materialPromptNode: '提示词',
materialCopied: '✅ 已复制',
materialCopyPrompt: '📋 复制提示词',
materialSelectNodeForSaving: "选这个节点,存下它的参数",
materialSelectAllNodes: '全选节点',
materialClearNodeSelection: '清空选择',
materialSelectedNodeCount: '已选择 {count} 个节点',
materialSaveNode: '保存这组参数',
materialSaveNodeHint: '只保存这个节点的参数,在“当前节点”里套用',
materialSaveSelectedAction: '保存选中节点参数 ({count})',
materialSaving: '正在保存…',
materialSaved: '✓ 已存入',
materialSelectedNodesName: '选中 {count} 个节点',
deleteNotebook: '删除',
baseModel: '基础模型',
mainModel: '主模型',
shellCombos: "搭配",
comboHelp: "搭配是什么?",
shellPrompts: "提示词",
comboLead: "搭配 = 选哪些模型 + 写什么提示词。默认是一个主模型 + 几个 LoRA + 提示词;也可以把画布上选中的一段节点存下来(Flux、视频流程,放大、ControlNet 这类几个节点配合的也行),模型和提示词以后能换,其他节点原样放回。按“放到画布”就连好线放上去,也可以把卡片拖到画布上。",
comboDragHint: "拖到画布上松手,就在那里放一组连好线的节点;Esc 取消",
comboDragCanvas: "松手:在这里新建这个搭配的一组节点",
comboSearch: "搜索搭配、模型或提示词…",
comboNew: "新建搭配",
comboNewName: "新搭配叫什么?",
comboSlotPositive: "正向提示词",
comboSlotNegative: "负向提示词",
comboSlotText: "文本",
comboSlotModel: "模型",
comboSlotMainModel: "主模型",
comboSlotTextEncoder: "文本编码器",
comboGroupModels: "模型",
comboGroupLoras: "LoRA",
comboGroupPrompts: "提示词",
comboGroupFixed: "原样放回的节点",
comboOpenInput: "{node} 的 {input}({type})",
comboOpenInputs: "放到画布后要接上:{inputs}。这些线来自保存时没选中的节点。",
comboOpenInputsCount: "有 {count} 个输入要接上",
comboFixedHint: "强度等其他参数按保存时固定。想用别的数值:在画布上调好,再右键 → AMB → “存为搭配”另存一个。",
comboFixedStrength: "强度",
comboFixedClipStrength: "CLIP 强度",
comboFixedDtype: "精度",
comboFixedType: "类型",
comboFixedDevice: "设备",
comboFixedSwitch: "开关",
comboFixedOff: "关",
comboTranslate: "译",
comboTranslateHint: "看看这段提示词的翻译(只看,不改动提示词)",
comboTranslating: "翻译中…",
comboTranslationToEnglish: "英文翻译",
comboTranslationToChinese: "中文翻译",
comboTranslationCopy: "复制",
comboTranslationCopied: "已复制",
comboTranslationFailed: "翻译服务连不上,稍后再试。",
comboSlotEmpty: "(空)",
comboSlotClear: "留空",
comboSlotUnknownFolder: "认不出这个下拉框列的是哪类模型,保持原样。",
comboPick: "换一个",
comboPickTitle: "选择:{slot}",
comboPickSearch: "按名称搜索",
comboPickAllBases: "全部底模",
comboPickNoMatch: "没有符合条件的模型。",
comboPickNone: "这一类里还没有模型。",
comboStructureName: "节点搭配",
comboStructureNodes: "结构:{nodes}",
comboStructurePacks: "需要的节点包:{packs}",
comboStructureMissing: "这台电脑缺少这些节点,放不到画布上:{nodes}。可以在 ComfyUI Manager 里安装。",
comboFromSelectionNone: "先在画布上选中几个节点(按住 Ctrl 点选,或框选),再从选中节点新建搭配。",
comboFromSelectionFailed: "读取选中的节点时出错了,详细原因在浏览器控制台里。",
comboFromSelectionNothing: "选中的 {count} 个节点都是子图。搭配暂时存不了子图。",
comboFromSelectionTitle: "从选中节点新建搭配",
comboFromSelectionKept: "保存 {count} 个节点:{nodes},以及它们之间的连线。",
comboFromSelectionDropped: "另外 {count} 个是子图,搭配暂时存不了子图,不保存:{nodes}。连到它们的线也不保存。",
comboFromSelectionOpen: "从没选中的节点连进来的线存不了,放到画布后这些接口空着,要自己接上:{inputs}。",
comboFromSelectionSlots: "这些是以后可以换的空位(模型和文本)。可以改名;取消勾选的保持现在的值,不再当空位。现在是 None 的可选位默认不勾:",
comboFromSelectionNoSlots: "没有可以换的空位,节点都按现在的设置原样放回。",
comboFromSelectionSave: "保存搭配",
comboNewDefault: "默认搭配",
comboMenuSave: "存为搭配",
comboMenuSaveMany: "把选中的 {count} 个节点存为搭配",
canvasMenuTitle: "AMB",
canvasMenuOpen: "在 AMB 里打开它",
canvasMenuReplace: "看图换模型",
canvasMenuLoraBefore: "前面插一个 LoRA",
canvasMenuLoraAfter: "后面插一个 LoRA",
canvasMenuParameters: "套用参数方案…",
canvasMenuOutputs: "这个模型出过的图",
canvasMenuDetails: "查看模型详情",
canvasMenuSaveParams: "存这个节点的参数…",
canvasMenuOpenPage: "打开 AMB",
canvasMenuQuickSearch: "快速搜索…",
quickSearchTitle: "AMB 快速搜索",
quickSearchPlaceholder: "搜搭配、模型、提示词…",
quickSearchKeys: "↑↓ 选择 · 回车放到画布 · Tab 换类别 · Esc 关闭",
quickSearchAll: "全部",
quickSearchKind_combo: "搭配",
quickSearchKind_model: "模型",
quickSearchKind_prompt: "提示词",
quickSearchPositive: "正面",
quickSearchNegative: "负面",
quickSearchMore: "还有 {count} 个,多打几个字缩小范围",
quickSearchNothing: "没有找到。换个词试试,或者按 Tab 只看某一类。",
quickSearchHint: "打字搜索:模型的名字、触发词、底模,搭配的名字,提示词的内容都能搜。",
canvasMenuAdjust: "调整这个菜单…",
canvasMenuModelUnknown: "AMB 没找到这个模型,可能还没扫描,或者文件不在模型文件夹里。",
canvasMenuGroup: "右键菜单",
canvasMenuPlacement: "AMB 的选项出现在哪里",
canvasMenuPlace_submenu: "归到一个“AMB”里",
canvasMenuPlaceHelp_submenu: "ComfyUI 的菜单只多一行;要用时把鼠标移到 AMB 上",
canvasMenuPlace_top: "直接列在菜单里",
canvasMenuPlaceHelp_top: "少移一下鼠标,但 ComfyUI 的菜单会变长",
canvasMenuSketchComfy: "属性|克隆|删除",
canvasMenuPreview: "会看到:",
canvasMenuPreviewNone: "什么也没有:AMB 不会出现在这个菜单里",
canvasMenuPreviewNote: "(只列这个节点用得上的)",
canvasMenuList_node: "右键一个节点",
canvasMenuList_canvas: "右键画布空白处",
canvasMenuUp: "上移",
canvasMenuDown: "下移",
canvasMenuReset: "恢复默认",
canvasMenuResetHelp: "所有项回到默认的开关和顺序。",
canvasMenuEntry_open: "在 AMB 里打开它",
canvasMenuEntryHelp_open: "提示词节点打开提示词页,其他节点打开“当前节点”",
canvasMenuEntry_replaceModel: "看图换模型",
canvasMenuEntryHelp_replaceModel: "节点有模型下拉框时,看着封面挑一个换上",
canvasMenuEntry_loraBefore: "前面插一个 LoRA",
canvasMenuEntryHelp_loraBefore: "挑一个 LoRA,接在这个节点的输入前面",
canvasMenuEntry_loraAfter: "后面插一个 LoRA",
canvasMenuEntryHelp_loraAfter: "挑一个 LoRA,接在这个节点的输出后面",
canvasMenuEntry_parameters: "套用参数方案",
canvasMenuEntryHelp_parameters: "打开“当前节点”,直接看这类节点存过的参数",
canvasMenuEntry_modelOutputs: "这个模型出过的图",
canvasMenuEntryHelp_modelOutputs: "用节点里这个模型生成过的图",
canvasMenuEntry_modelDetails: "查看模型详情",
canvasMenuEntryHelp_modelDetails: "节点里这个模型在 AMB 里的详情页",
canvasMenuEntry_saveParameters: "存这个节点的参数",
canvasMenuEntryHelp_saveParameters: "起个名字存下来,以后同类节点可以套用",
canvasMenuEntry_saveCombo: "存为搭配",
canvasMenuEntryHelp_saveCombo: "把这个节点(或选中的几个节点)存成搭配",
canvasMenuEntry_quickSearch: "快速搜索",
canvasMenuEntryHelp_quickSearch: "搜模型、搭配、提示词,回车放到画布(也可以按 Alt+B)",
canvasMenuEntry_openPage: "打开 AMB 的某一页",
canvasMenuEntryHelp_openPage: "主页、模型、图库、工作流、搭配、提示词……",
comboNewDefaultHint: "一个主模型 + 几个 LoRA + 提示词",
comboNewWithLoraNode: "默认搭配,LoRA 用 {node}",
comboLoraNodeLabel: "放到画布时 LoRA 用:",
comboLoraNodeCore: "官方 LoRA 节点",
comboLoraNodeCoreHint: "一个 LoRA 一个“加载LoRA”节点,串成一串",
comboLoraNodeRgthree: "Power Lora Loader",
comboLoraNodeRgthreeHint: "rgthree 的节点:所有 LoRA 放在一个节点里,每行有开关和强度",
comboLoraNodeEasy: "Easy-Use LoRA 堆叠",
comboLoraNodeEasyHint: "Easy-Use 的 LoRA 堆叠节点(一个最多 10 个),再由“应用 LoRA 堆叠”接到模型上",
comboLoraNodeMissingMark: "(未安装)",
comboLoraNodeFallback: "这个搭配的 LoRA 要放进 {node},但这台 ComfyUI 没装 {pack},这次改用官方 LoRA 节点放置。",
comboNewFromSelection: "从画布上选中的节点",
comboNewFromSelectionHint: "已选中 {count} 个节点:保存这些节点和它们之间的连线",
comboNewFromSelectionEmpty: "先在画布上选中节点(按住 Ctrl 点选,或框选)",
comboNewLike: "和“{name}”一样的结构",
comboPlaceMissingNodes: "这个搭配用到的节点这台电脑没有,没有放到画布上:{nodes}。可以在 ComfyUI Manager 里安装后再试。",
comboPlaceProblems: "已经放到画布上,但有几处没能还原:",
comboPlaceSlotMissing: "· {node} 里找不到“{widget}”(空位:{label}),可能是节点包升级改了名字",
comboPlaceLinkMissing: "· {from} → {to} 的 {type} 连线接不上",
comboUse: "放到画布",
comboUseHint: "把主模型、LoRA 和正负提示词连好线放到画布上,跟着鼠标走,点一下放下,Esc 取消",
comboNoModel: "没选模型",
comboLoraCount: "{count} 个 LoRA",
comboNoPrompt: "(还没写提示词)",
comboEmpty: "还没有搭配。点“新建搭配”,选一个主模型和几个 LoRA,写好提示词;以后按一下“放到画布”就能连好线放出来。",
comboNoMatches: "没有符合的搭配。",
comboLoadError: "搭配读取失败,请重试。",
comboBack: "← 全部搭配",
noteNeedsClip: "UNet 模型不带文本编码器:画布上没有唯一的 CLIP 加载节点,提示词节点的 clip 要你自己接。",
translate: '翻译',
dialogOk: '确定',
dialogCopySelected: '已选中,按 Ctrl+C',
dialogCancel: '取消',
scanModelPrecisely: '精准扫描此模型',
galleryLoading: '加载中...',
galleryErrorPrefix: '错误: ',
galleryDelete: '删除',
galleryKeep: "收藏:存成工作流、搭配或提示词",
compareCardTitle: "对比参数:先点这张,再点另一张的 ⇄,或和当前画布比",
compareTitle: "参数对比",
comparePicked: "已选「{name}」。再点另一张图的 ⇄ 和它对比,或:",
compareWithCanvas: "和当前画布对比",
compareCanvas: "当前画布",
compareLoading: "正在读取两边的参数…",
compareLoadFailed: "读取失败:{error}",
compareNoWorkflow: "这张图里没有可读的工作流。",
compareSameStructure: "节点结构相同",
compareOtherStructure: "节点结构不同",
compareSummary: "{diff} 项不同,{same} 项相同",
compareNoDifference: "除了种子,两边的参数完全一样。",
compareNothingPaired: "两边的节点对不上,没有能逐项比较的参数。",
compareSeeds: "种子(每次生成一般都不同)",
compareOnlyIn: "只有 {side} 有的节点",
compareRewired: "连线不同的节点",
compareState: "状态",
compareParameter: "参数",
compareMoreTags: "还有 {count} 个",
compareTagsOnly: "独有:",
compareKeys: "★ 关键参数",
compareShowSame: "也显示相同的参数",
compareNewest: "画布和最新出图对比",
compareNewestSide: "最新出图",
compareNewestHint: "看看现在的画布和最近生成的那张图相比改了哪些参数,也能把图上的参数改回画布",
compareNoPicture: "输出文件夹里还没有带工作流的图片。",
compareKeyHint: "点参数名前的 ☆,把关键参数固定在最上面;所有工作流、参数方案都会记住。",
compareStar: "设为关键参数:以后对比和参数方案里都排在最前",
compareUnstar: "取消关键参数",
paramSetDiffers: "与默认参数有 {count} 处不同",
paramSetSame: "与默认参数相同",
paramSetCompare: "和默认参数对比",
paramSetCount: "参数方案 {count}",
workflowsSteps: "{count} 步",
recipePromptShowAll: "展开全部",
compareWithDefault: "和默认参数对比",
workflowOwnValues: "默认参数",
workflowOwnValuesHint: "保存工作流时的参数",
workflowSetFromCanvas: "从画布保存",
workflowSetEditing: "编辑中",
workflowSetCopy: "复制成新方案",
workflowAllPictures: "全部出图",
workflowCompare: "对比",
workflowMainValues: "常用参数",
workflowSetPictures: "用这组参数出的图",
workflowSetNoPictures: "输出文件夹里还没有用这组参数生成的图。",
workflowAllNodeValues: "全部节点参数",
workflowSetsTipTitle: "还没有参数方案",
workflowSetsTip: "在画布上换几个参数试试,出图满意了就点「从画布保存」。存下的方案能和默认参数 ⇄ 对比,一眼看出差在哪。",
workflowCompareTip: "点上面的「⇄ 对比」,看这组参数和默认参数差在哪;下面每张图的 ⇄ 能比两张图的参数。",
workflowTipDone: "知道了",
focusTitle: "重点参数",
focusHint: "在下面「全部节点参数」里点 ☆,标出这个工作流最要紧的几个参数,它们会显示在这里,对比时也排在最前面。",
focusStar: "标为这个工作流的重点参数",
focusUnstar: "取消重点",
focusNote: "备注",
focusNotePrompt: "这个参数的备注(比如:0.6–0.8 最好)",
focusDefault: "默认 {value}",
focusBadge: "本工作流重点",
focusFull: "一个工作流最多标 {count} 个重点参数。",
focusSaveError: "重点参数没能保存。",
recipePromptFold: "收起",
workflowsFilter: "筛选",
workflowsFilterOn: "筛选 · {count}",
workflowsFilterKind: "类型",
workflowsFilterTag: "标签",
paramSetCountHint: "打开这个工作流的参数方案",
compareModeOn: "启用",
compareModeMuted: "已静音",
compareModeBypassed: "已绕过",
compareSwap: "左右交换",
compareCanvasHint: "勾选的参数会从图片改到画布上,种子不改。",
compareApply: "把勾选的 {count} 项改到画布上",
compareApplyNone: "勾选要改到画布上的参数",
compareApplied: "画布上改了 {count} 项",
compareApplySkipped: ",{count} 项没改(节点不在了,或这台电脑没有那个选项)",
compareUndo: "撤销",
compareClose: "关闭",
galleryKeptAs: "已存成:{list}。点开看看",
listJoin: "、",
workbenchKeep: "收藏",
workbenchKeepHint: "把这张图存成工作流、搭配或提示词",
keepMenuTitle: "收藏这张图",
keepAs_recipe: "整个工作流",
keepAs_recipeHint: "存成工作流配方,在“工作流”页,可以整个打开",
keepAs_combo: "模型搭配",
keepAs_comboHint: "出这张图的模型、LoRA 和正负提示词节点,数值原样记下,在“搭配”页一键放到画布",
keepAs_prompt: "只要提示词",
keepAs_promptHint: "正向和负向提示词,存进提示词库",
keepKeptAs: "已存:{name},点这里打开",
keptAs_recipe: "已存成工作流配方:{name}",
keptAs_combo: "已存成搭配:{name}",
keptAs_comboShort: "已存成搭配,名字可以直接改:",
comboFromImage: "从这张图存下的搭配",
comboFromImageOpen: "来自这张图,点开看大图",
comboRename: "改名",
comboRenameAsk: "这个搭配叫什么?",
comboEyebrow: "搭配",
comboEyebrowKept: "搭配 · 从一张图收藏",
comboSeePicture: "查看原图",
comboNoMainModel: "还没选主模型",
comboNoLora: "没有 LoRA",
comboModelsTitle: "模型",
comboBaseModel: "底模",
comboChange: "更换",
comboChoose: "选择",
comboAddLora: "添加 LoRA",
comboRemoveLora: "去掉这个 LoRA",
comboPickerClose: "收起",
comboPickerNone: "没有找到这个底模能用的模型。",
comboPickerFailed: "没能读出模型列表。",
comboRenameHint: "点一下改名",
keepRenameHint: "搭配的名字,改完按回车",
keepRenamed: "已改名:{name}",
keepRenameFailed: "没能改名,还是原来的名字。",
keptAs_prompt: "已存下提示词:{name}",
keepExisted: "之前就存过了:{name}",
keepComboMissing: "有 {count} 个模型本机没有,搭配里先空着。",
keepComboMissingNamed: "有 {count} 个模型这台电脑没有,先按原图的名字记着;在搭配里点它换一个本机的模型就行。",
keepOpen: "打开",
keepRemove: "取消收藏",
keepRemoveHint: "把存下的这一项移到系统回收站",
keepRemoveConfirm: "取消收藏后,存下的{what}“{name}”会移到系统回收站。确定吗?",
keepRemoved: "已取消收藏:{what}“{name}”在回收站里",
keepRemoveFailed: "没能取消收藏,请再试一次。",
keepNoun_recipe: "工作流配方",
keepNoun_combo: "搭配",
keepNoun_prompt: "提示词",
keepNoPrompt: "这张图的工作流里没找到提示词。",
keepNoWorkflow: "这张图没有带 ComfyUI 工作流,存不了。",
keepFailed: "没存上,请再试一次。",
galleryDeleteConfirm: '删除这张图片?',
galleryDeleteConfirmHint: '会移到系统回收站,需要时可以从回收站还原。',
galleryDeleteFailed: '删除失败: ',
galleryNoMore: '没有更多图片了',
galleryScrollMore: '向下滚动加载更多',
galleryLoadFailed: '加载失败',
galleryEmpty: '图库为空',
galleryKeptOnly: '★ 已收藏',
galleryKeptOnlyHint: '只看收藏过的图:存成过工作流、搭配或提示词的',
galleryKeptEmpty: '还没有收藏的图。点图片卡片上的 ☆,把它存成工作流、搭配或提示词。',
gallerySearchPlaceholder: '输入后按回车变成一个搜索块:提示词、模型、LoRA、seed、文件名或模型哈希',
gallerySearchHelp: '每个搜索块单独匹配,所有块需同时满足;块里可以有空格,按整段短语匹配。8 位以上的十六进制按模型哈希匹配(例如 667B5E3B),改过名的模型文件也能找到。输入框为空时按退格删除最后一块。首次搜索需要读取图片信息,之后会快很多。',
searchChipHash: '哈希',
searchChipNumber: '数字',
searchChipRemove: '移除这个搜索块',
searchChipsClear: '清空搜索',
gallerySearchCount: '找到 {count} 张',
gallerySearchEmpty: '没有找到匹配的图片',
gallerySearching: '正在搜索…',
galleryFilterAll: '全部',
galleryFilterImages: '图片',
galleryFilterVideos: '视频',
galleryFormatsTitle: '显示的格式',
galleryFormatsHelp: '点一下某个格式,图库里就不再显示它,再点一下恢复。视频能否播放取决于浏览器,MP4 和 WebM 最稳。',
galleryFormatShown: '显示中,点一下隐藏',
galleryFormatHidden: '已隐藏,点一下显示',
galleryViewVideo: '播放视频',
settingsGallery: '图库',
galleryClose: '关闭图库',
galleryHistoryTitle: '历史生成图库: {name}',
galleryScanning: '加载中,正在扫描图片元数据...',
galleryNoModelImages: '没有找到使用此模型生成的历史图片。',
gallerySetCover: '设为封面',
gallerySetCoverConfirm: '确定将此图片设为封面吗?',
galleryCoverSuccess: '设置成功!',
gallerySelectingCoverPrefix: '正在为模型 ',
gallerySelectingCoverSuffix: ' 选择封面。请点击下方的图片。',
galleryLoadImagesError: '加载历史图片失败',
galleryCancel: '取消',
detailBackDoctor: '← 返回模型检查',
detailBackAssistant: '← 返回助手面板',
detailBackModels: '← 模型库 / {type}',
detailBackPrevModel: '← 上一个模型',
detailBack: '← 返回',
detailBackHint: '也可以按 Esc',
detailFolder: '文件夹',
detailOutputs: '作品',
detailCopy: '复制',
detailFile: '文件',
detailDeleteModel: '删除模型',
detailEdit: '编辑',
modelEditTitle: '编辑模型信息',
modelEditClose: '关闭',
modelEditFromCivitai: '信息来自 Civitai',
modelEditCover: '封面',
modelEditCoverNow: '现在的封面',
modelEditNoCover: '还没有封面',
modelEditCoverCivitai: 'Civitai 原封面',
modelEditCoverUpload: '上传图片或视频',
modelEditCoverGallery: '从全部出图里挑…',
modelEditCoverHint: '保存时换上这张,原来的封面移到回收站。',
modelEditCoverCivitaiHint: '保存时换回 Civitai 的原封面。',
modelEditName: '名称',
modelEditNameHint: '只改插件里显示的名字,文件不动。',
modelEditRename: '同时改磁盘上的文件名',
modelEditRenameHint: '文件会真的改名:用到它的旧工作流会找不到它,要靠模型检查修复。',
modelEditRenameProtected: 'VAE、文本编码器、CLIP Vision 这类基础组件不改文件名。',
modelEditRenameNeedsName: '要改文件名,先填上名称。',
modelEditLink: '来源链接',
modelEditLinkPlaceholder: 'https://… 在哪下载的',
modelEditLinkWeb: '网页',
modelEditLinkHint: '填上在哪下载的:详情页会多一个按钮直接打开;分享工作流、模型检查找缺的模型时,也会指向这里。',
modelEditLinkLocalHint: 'Civitai 上没有它,填上在哪下载的(LiblibAI、HuggingFace…):详情页会多一个按钮直接打开;分享工作流、模型检查找缺的模型时,也会指向这里。',
modelEditLinkCivitaiHint: '已经自动记下了 Civitai 页面,可以不填;从别处下载的就填那里,会优先用它。',
modelEditLinkInvalid: '来源链接要是一个网址(http:// 或 https:// 开头)。',
modelEditNotes: '备注',
modelEditNotesPlaceholder: '用法、推荐权重、触发词……',
modelEditReset: '恢复原样',
modelEditResetHint: '清空你改的名称和备注,封面换回 Civitai 的原图;来源链接保留。',
modelEditResetConfirm: '恢复原样?\n\n你改的名称和备注会清空,封面换回 Civitai 的原图(没有原图就留着现在的)。来源链接保留。',
modelEditResetCoverKept: '没找到 Civitai 的原封面,现在的封面留着没动;名称和备注已经清空。',
modelEditResetCoverFailed: '封面没能换回来,看看文件是不是被别的程序占用了;名称和备注已经清空。',
modelEditCancel: '取消',
modelEditSave: '保存',
modelEditSaving: '保存中…',
modelEditSaveFailed: '没保存上:{error}',
modelEditLeaveForGallery: '去图库挑封面,会丢下这里还没保存的修改。继续吗?',
remoteViewChip: '仅浏览',
remoteViewHint: '这个窗口是从别的设备打开的:可以浏览;扫描、下载、移动、删除、保存这类改动,只能在运行 ComfyUI 的电脑上做。\n\nComfyUI 在云服务器(AutoDL 等)上?这样就能照常用:\n1. 点下面的「复制」。\n2. 打开服务器的终端(AutoDL:JupyterLab → 终端),粘贴,按回车。\n3. 重启 ComfyUI。\n\n之后任何能打开这个网址的人都能改动你的模型和设置,所以别把网址给别人。用 SSH 隧道打开(地址以 127.0.0.1 开头)的话什么都不用做。',
remoteChangesChip: '远程可修改',
remoteChangesHint: '服务器上的插件文件夹里有 allow_remote_changes 文件:从别的设备打开也能扫描、移动、删除和保存。任何能打开这个网址的人都能这样做。\n\n不需要了:复制下面这一行,在服务器的终端里粘贴、按回车,再重启 ComfyUI。',
remoteChipTip: '点开看说明',
detailNotesTitle: '📓 专属备注 (Notes)',
detailEditNotes: '编辑备注',
detailGeneratedGallery: '查看历史生成作品',
detailTrainedWords: '训练词:',
detailDescription: '描述:',
detailNotes: '备注:',
detailNoCompatibleModels: '没有找到兼容模型。',
detailCompatibleLoadFailed: '加载失败。',
detailPathCopied: '路径已复制',
detailPathCopyFailed: '复制失败',
detailOpenFolder: '打开所在文件夹',
detailOpenFolderFailed: '打不开文件夹:{error}',
galleryInsertAsNode: '作为“加载图像”节点插入工作流',
galleryInsertNodeFollow: '“加载图像”节点跟着鼠标走:点一下放下,Esc 取消',
galleryInsertNodeFailed: '没能放入“加载图像”节点:图片没能复制到 input 文件夹,或画布还没准备好',
doctorGraphUnavailable: '当前画布或节点不可用。',
doctorMissingChainInputs: "这个节点没有 MODEL 输入,LoRA 插不到它前面。",
doctorUnconnectedChainInputs: "这个节点的 MODEL 输入还没连上。",
doctorMissingChainOutputs: "这个节点没有 MODEL 输出,LoRA 插不到它后面。",
doctorUnsupportedInsertion: '当前节点不支持此插入方式。',
doctorCreateLoraFailed: '无法创建标准 LoRA Loader 节点。',
doctorLoraNotReady: 'LoRA 列表尚未就绪,请刷新 ComfyUI 模型列表后重试。',
promptDragHint: '拖到提示词框上:绿框是正面,红框是负面,灰框没连到采样器;Esc 取消',
promptDropInto: '松手:填进 {node} 的{box}',
promptBoxPositive: '正面提示词框',
promptBoxNegative: '负面提示词框',
promptBoxBoth: '提示词框(正负两边都连着)',
promptBoxPlain: '提示词框',
promptDropOnlyOther: "(这条只有{role},照样填进去)",
promptDropPartner: ';同一个采样器的{box}({node})也填上',
promptDropPartnerMaybe: ';它若有{role},也填进同一个采样器的{box}({node})',
promptDropNoBox: '这个节点没有提示词框',
promptDropPickBox: '这个节点有好几个提示词框,拖到其中一个上',
promptFilledOne: '已填进 {node}',
promptNodesCreated: '新建了 {count} 个提示词节点',
currentNodePrompts: '提示词',
currentNodePromptPlain: '提示词(没连到采样器)',
currentNodePromptEmpty: '(空)',
currentNodeChangedMeanwhile: '翻译期间这个框被改过,没有写入。',
currentNodeParams: '参数',
currentNodeSave: '存下当前参数',
currentNodeSaveName: "给这组参数起个名字",
currentNodeSaved: "已存下:{name}。以后选中同类节点,就能在这里套用。",
currentNodeSavedBefore: "已经存过一模一样的参数:{name}",
currentNodeDelete: "删除",
currentNodeDeleteConfirm: "删除存下的“{name}”?和它一起存的其他节点的参数也会一起删掉,移到系统回收站。",
currentNodeDeleteFailed: "没删掉,请再试一次。",
currentNodeSaveFailed: '没能保存这组参数',
currentNodeSearch: '搜索参数…',
currentNodeNoSets: "这种节点还没有存过参数。在这里“存下当前参数”、在图库的参数页里存下节点,或配方里的参数方案,都会列在这里。",
currentNodeNoMatch: '没有匹配的参数',
currentNodeLoadFailed: '没能读出存过的参数',
currentNodeFromSet: '工作流「{recipe}」的参数方案',
currentNodeSetPictures: '出过 {count} 张图',
currentNodeOpenSet: '打开',
currentNodeFromPicture: '收藏图片 {name} 时存的',
currentNodeSeePicture: '看原图',
currentNodeFromHere: '在当前节点里存的',
currentNodeKeepSeed: '种子不跟着换',
currentNodeKeepModel: '模型在上面换',
currentNodeKeepMissing: '本机没有这个选项',
currentNodeKeptLine: '保持不变:{names}',
currentNodeKeptPart: '{names}({why})',
currentNodeKeptSep: ';',
currentNodeShowAll: '显示全部 {count} 项',
currentNodeShowLess: '收起',
currentNodeCompare: '⇄ 对比',
currentNodeCompareHint: '和画布上的整个工作流对比,不只是这个节点',
currentNodeCompareFailed: '没能读出这组参数的工作流',
currentNodeViewCards: '卡片',
currentNodeViewTable: '并排',
currentNodeNow: '现在',
currentNodeApplyShort: '套用 {count} 项',
currentNodeAllSame: '这些参数方案和现在的值都一样。',
currentNodeAppliedLast: '上次套用「{name}」· {when}',
currentNodeAppliedSame: '之后没变过',
currentNodeAppliedChanged: '之后变了:{changes}',
currentNodeAppliedMore: '等 {count} 项',
currentNodeAppliedRestore: '恢复成这套',
currentNodeToday: '今天 {time}',
currentNodeLastBadge: '上次套用',
currentNodeMatches: '现在的值和「{name}」一样',
currentNodeMatchesMore: '(还有 {count} 套也一样)',
currentNodeClosest: '现在的值最接近「{name}」,只差:{changes}',
currentNodeApply: '套用这 {count} 项',
currentNodeSame: '和当前一样',
doctorLead: '检查当前工作流用到的模型在本机找不找得到。工作流里记着每个模型的文件指纹,改过名、换过文件夹的模型也能认出来;只有指纹对得上的文件才会被换上。',
doctorChecking: '正在检查…',
doctorStatUsed: '用到的模型',
doctorStatHere: '在本机',
doctorStatFixable: '能直接换上',
doctorStatMissing: '要你处理',
doctorPutInAll: '换上 {count} 个',
doctorPutIn: '换上',
doctorUseCandidate: '用它',
doctorPick: '自己挑',
doctorRecheck: '重新检查',
doctorSources: '模型去哪下载',
doctorNoModels: '当前工作流没有用到模型文件。',
doctorAllHere: '{count} 个模型都在本机,可以直接运行。',
doctorHowItWorks: '“换上”只会用同一个文件(指纹一致)。缺的模型能确定来源的(C 站按指纹找到、工作流带着文件链接,或 ComfyUI-Manager 模型清单里的同名文件指纹对得上)可以直接下载;清单里只是同名的,标成“按文件名下载”,由你决定。其余的请自己挑一个本地模型,或者去 Civitai 找。',
doctorToHandle: '需要处理',
doctorReplaced: '刚换上的',
doctorWas: '原来是 {file}',
doctorHereList: '在本机的模型({count})',
doctorWhyFound: '本机有同一个文件,只是名字或文件夹不同:{file}',
doctorWhySpelling: '只是路径里斜杠的写法不同:{file}',
doctorWhyCandidate: '本机有一个大小完全相同的文件:{file}。工作流没记它的指纹,不能确定是同一个,用不用由你决定。',
doctorWhySameName: "本机有一个同名文件:{file}。工作流没记它的指纹,名字一样不一定是同一个模型,用不用由你决定。",
doctorWhyLikely: "本机有一个同名、大小也完全相同的文件:{file},很可能就是它。工作流没记它的指纹,还是由你确认。",
doctorLevelSure: "确定",
doctorLevelLikely: "很可能",
doctorLevelMaybe: "可能",
doctorLevelUnclear: "分不清",
doctorLevelConflict: "对不上",
doctorLevelNone: "找不到",
doctorWhyConflict: '按指纹和大小找到的不是同一个文件,没有替换。',
doctorWhyAmbiguous: '本机有好几个文件都可能是它,没法确定是哪一个。',
doctorWhyChanged: '文件还在,但内容和保存工作流时不一样(可能换成了别的版本)。ComfyUI 会照常使用它。',
doctorWhyNotHere: '按指纹在本机找过,没有这个文件。',
doctorWhyNoRecord: '工作流里没有记下它的指纹,没法自动找,只能自己挑或下载。',
downloadLooking: '查找下载来源…',
downloadOne: '下载 · {size}',
downloadOneNoSize: '下载',
downloadAll: '下载全部 {count} 个({size})',
downloadNoNetwork: '连不上下载网站,暂时查不到来源。',
downloadDifferentFile: '工作流里的链接指向的不是同一个文件,没有提供下载。',
downloadGated: '这个文件要先在 Hugging Face 上登录并同意使用条款,请到网页上下载。',
downloadTitle: '下载缺失的模型',
downloadTitleMany: '下载 {count} 个缺失的模型',
downloadSaveTo: '保存到',
downloadRootNew: '(还没有这个文件夹,会新建)',
downloadUnsafeFormat: '⚠ 这是 .ckpt / .pt 一类的格式,加载时可能运行文件里夹带的代码。只下载你信任的来源。',
downloadNoCheck: 'ⓘ 这个来源没有给出文件指纹,下完没法核对是不是同一个文件。',
downloadSpace: '这次要下载 {need},磁盘剩余 {free}。',
downloadRules: '默认保存到哪里,在 设置 → 模型 里改',
downloadStart: '开始下载',
downloadQueued: '排队中…',
downloadVerifying: '核对文件…',
downloadProgress: '{percent}% · {done} / {total}',
downloadRetry: '重试',
downloadSetKey: '填 API Key',
downloadDone: '已下载:{name}',
downloadDonePutIn: '已下载并换上:{name}',
downloadSourceMirror: 'Hugging Face(国内镜像)',
downloadOneByName: '按文件名下载 · {size}',
downloadOpenPage: '打开网页',
downloadOneByNameNoSize: '按文件名下载',
downloadByName: '⚠ 只是在 ComfyUI-Manager 的模型清单里找到同名文件({name})。工作流没记这个模型的指纹,没法确认是同一个文件,确定是它再下载。',
downloadViaManager: 'ⓘ 下载地址来自 ComfyUI-Manager 的模型清单({name}),已按工作流记的指纹确认是同一个文件。',
downloadListSite: '清单给的文件在:{site}',
downloadSearchHf: '去 Hugging Face 搜',
downloadSearchHfHint: '没找到下载地址。按文件名在 Hugging Face 上搜一下;通用的名字可能搜出很多,挑对的那个自己下。',
downloadNoManager: '装了 ComfyUI Manager,还能多一个下载来源(它的常用模型清单)。',
downloadTryMirror: '在国内的话,可以在 设置 → 模型下载 里打开“Hugging Face 用国内镜像”再试。',
downloadError_network: '下载中断了(网络问题)。点重试会从断开的地方接着下。',
downloadError_needs_key: '这个模型要登录 Civitai 才能下载:填上你的 Civitai API Key 再点下载。',
downloadError_forbidden: '网站拒绝了下载(可能要登录或没有权限)。',
downloadError_gone: '网站上已经没有这个文件了。',
downloadError_hash_mismatch: '下载到的文件和工作流记录的指纹对不上,已经丢弃,没有放进模型文件夹。',
downloadError_exists: '那里已经有同名文件了,不会覆盖。换个位置或文件名。',
downloadError_already: '这个文件已经在下载了。',
downloadError_no_space: '磁盘空间不够。',
downloadError_not_a_file: '网站返回的是网页而不是模型文件(多半要登录)。',
downloadError_bad_name: '文件名要以模型格式结尾,比如 .safetensors。',
downloadError_bad_path: '这个位置不行:只能放在模型文件夹里面。',
downloadError_bad_source: '这个下载来源不在允许的网站里。',
downloadError_bad_type: '认不出这个模型该放进哪类文件夹。',
downloadError_bad_root: '这个模型文件夹不存在了。',
downloadError_unknown: '下载失败了,详细原因在 ComfyUI 的控制台里。',
doctorProof: '指纹',
doctorProofSaved: '工作流里记的',
doctorProofLocal: '本机同名文件',
doctorProofNone: '没有',
doctorChangedMeanwhile: '这个节点在检查之后被改过,没有替换。已重新检查。',
doctorScanHint: '模型库里还有 {count} 个模型没扫描过。没扫描的模型认不出指纹,扫描后再检查一次,也许就找到了。',
doctorToScan: '去扫描页',
doctorBannerMissing: '这个工作流有 {count} 个模型在本机找不到。',
doctorBannerStill: '还有 {count} 个找不到。',
doctorBannerFixable: '其中 {count} 个本机有同一个文件(改过名或换了文件夹),可以直接换上。',
doctorBannerPutIn: '已换上 {count} 个模型。',
doctorBannerShow: '查看',
doctorBannerClose: '关闭提示',
doctorBannerLabel: '模型检查:',
doctorBannerMute: '不再提醒',
doctorBannerMuteHint: '以后打开工作流不再自动检查;在 设置 → 工作流 里可以重新打开',
doctorBannerMuted: '好的,以后打开工作流不再自动检查。想重新打开:设置 → 工作流 → 打开工作流时检查缺失模型。',
assistantSelectNode: '请在画布中点击选中任意节点',
assistantSelectedNode: '当前选中节点',
assistantQuickActions: '快捷操作',
assistantChangeWidget: '更换 {name}',
assistantChangeCurrent: '更换当前模型',
assistantVisualPicker: '{type} · 可视化选择',
assistantInsertBefore: '前方插入 LoRA',
assistantInsertAfter: '后方插入 LoRA',
assistantConnectInputs: '接入节点输入端',
assistantConnectOutputs: '接入节点输出端',
assistantPreviewFailed: '无法加载预览',
assistantHistoryTitle: '历史生成图 ({count})',
assistantViewAll: '查看全部 →',
assistantRestoreWorkflow: '点击恢复此工作流',
assistantViewGallery: '点击查看完整图库',
pickerNoCompatible: '没有可供选择的兼容模型。',
pickerEyebrow: '当前节点 · 模型选择器',
pickerInsertBeforeTitle: '⬅ 在节点前方插入 LoRA',
pickerInsertAfterTitle: '在节点后方插入 LoRA ➡',
pickerChangeTitle: '🔀 更换当前模型',
pickerFolders: '文件夹',
pickerSearch: '🔍 搜索名称或完整路径…',
pickerMainAll: '主模型:全部类型',
pickerNameAsc: '名称 A–Z',
pickerNameDesc: '名称 Z–A',
pickerByFolder: '按文件夹',
pickerLoadingCovers: '⏳ 正在加载模型封面…',
pickerCancel: '取消',
pickerInsertConfirm: '插入并自动连线',
pickerReplaceConfirm: '确认替换',
pickerCoversFailed: '⚠️ 封面加载失败,仍可按名称选择模型。',
doctorLoadingPreview: '加载预览...',
doctorNoPreview: '暂无预览图',
doctorProfile: '📖 查看档案',
doctorBase: '基础模型',
doctorTriggerWords: '触发词',
doctorClickCopy: '点击复制',
doctorCopyAll: '📋 全部复制',
doctorNotes: '📝 我的备注',
pickerSelected: '已选择: {path}',
pickerChooseModel: '请选择一个模型。节点连接和强度不会被改动。',
pickerCompatibleMain: '✨ 已根据主模型 {name} 自动筛选兼容 LoRA;可在上方切换为全部类型。',
pickerCompatibleTag: '✨ 未找到已连接主模型,已根据当前 LoRA 的 {name} 标注筛选。',
pickerCompatibleNoTags: 'ℹ 已识别主模型 {name},但没有同类 LoRA 标注,因此暂时显示全部。',
pickerCompatibleUnknown: 'ℹ 未识别到主模型类型,暂时显示全部 LoRA;你仍可手动按基础模型筛选。',
pickerAllModels: '全部模型',
pickerResults: '{count} 个结果',
pickerCurrent: '当前',
pickerBaseModel: '基础模型',
pickerRoot: '根目录',
pickerNoMatches: '没有符合条件的模型。',
pickerOperationFailed: '操作失败:',
notebookSelectMain: '请先选择一个主模型。',
notebookPromptPlaceholder: "在此输入提示词内容(英文词条用逗号分隔,支持自动双语切词翻译)...",
notebookUnlabeledBase: '未标注基础模型',
notebookUnetNeedsTextEncoder: 'UNet 模型不含文本编码器:发送到画布后,把你的 CLIP 加载器接到两个提示词节点上。LoRA 会用“仅模型”加载。',
mainPreflightTitle: '导入工作流 (预检海关)',
mainOpenTitle: '打开 Anomalous 模型浏览器',
mainInterfaceCategory: '界面',
mainLanguageSetting: '插件语言',
mainLanguageTooltip: '默认跟随 ComfyUI 的原生语言;也可以只为本插件固定使用中文或 English。',
mainLanguageAuto: '跟随 ComfyUI',
mainLanguageChinese: '中文',
mainLanguageEnglish: 'English',
themeDomainActivated: '🌊🩸 界域展开:深海血族!',
themeDomainDeactivated: '🌕 界域收拢:恢复原初视界。',
themeEasterEggHint: '深渊在凝视着你... ({count}/5)',
mainEntryModeSetting: '浏览器入口模式',
mainEntryModeTooltip: '三种模式严格互斥:悬浮按钮、运行按钮旁的顶部入口,或仅保留“扩展”菜单命令。',
mainEntryModeFloating: '悬浮入口',
mainEntryModeTopbar: '顶部动作栏',
mainEntryModeMenu: '仅扩展菜单',
mainShortcutSetting: '打开浏览器快捷键',
mainShortcutTooltip: '显示当前生效按键,并使用 ComfyUI 原生录入窗口修改。冲突、覆盖和保留按键提醒均由 ComfyUI 处理。',
mainShortcutUnassigned: '未绑定',
mainShortcutCustomize: '自定义',
mainShortcutOpenFailed: '无法打开 ComfyUI 快捷键编辑器,请前往“设置 → 快捷键”修改。',
mainTopbarTriggerLabel: '模型浏览器',
mainFloatingTriggerLabel: '模型浏览器',
mainFloatingTriggerSizeSetting: '悬浮入口大小',
mainFloatingTriggerSizeTooltip: '选择小、标准或大三档尺寸;拖动边界会按实际尺寸重新计算。',
mainFloatingTriggerSizeSmall: '小',
mainFloatingTriggerSizeMedium: '标准',
mainFloatingTriggerSizeLarge: '大',
mainFloatingTriggerStyleSetting: '悬浮入口样式',
mainFloatingTriggerStyleTooltip: '选择圆形图标或带名称的胶囊按钮。',
mainFloatingTriggerStyleIcon: '圆形图标',
mainFloatingTriggerStylePill: '胶囊文字',
mainResetFloatingTriggerPosition: '重置悬浮入口位置',
mainRetryInit: '插件界面初始化失败,点击可重试',
mainRetryInitEn: 'The plugin UI failed to initialize. Click to retry.',
mainShareFingerprints: "{total} 个模型里,{hashed} 个带了指纹:别人改过名也能找到同一个文件。",
mainShareNoFingerprint: "{count} 个没有指纹(没扫描过或本机没有),别人只能按名字或大小找;先扫描一下更好。",
mainShareProvenanceOff: "设置里关掉了“在工作流里记下模型指纹”,分享码里不带模型指纹和下载链接。",
mainShareLinks: "附带模型下载链接({count} 个)",
mainClose: '关闭',
shareTitle: '分享与导入',
shareExportHeading: '分享当前工作流',
shareExportHelp: '把画布上的工作流变成一段短码,发到群里或评论区;对方在这里粘贴就能打开。',
shareEmptyCanvas: '画布上还没有节点。',
shareStats: '汉字码 {hanzi} 字 · 字母码 {letters} 字。',
shareWhole: '这个工作流用了子图或特殊的节点,分享码带的是完整内容,会长一些。',
shareCopyHanzi: '复制汉字码',
shareCopyLetters: '复制字母码',
shareCodeHelp: '汉字码最短。如果群里或评论区发不出去、发了别人看不到(可能被当成敏感词拦了),换字母码,到哪都能发。',
shareCopied: '已复制{kind}({count} 字)',
shareKindHanzi: '汉字码',
shareKindLetters: '字母码',
shareImportHeading: '导入',
shareImportPlaceholder: '粘贴分享码(AMB2-、AMB1-、AMB0- 开头的都行)或工作流 JSON;也可以把工作流文件、带工作流的图片、配方包、备份压缩包拖到这里。',
shareImportButton: '导入',
shareChooseFile: '选择文件…',
shareImported: '已打开工作流({count} 个节点)',
shareImportEmpty: '先粘贴分享码,或者拖入文件。',
shareImportFailed: '打不开:{error}',
shellHome: "主页",
shellVoices: "角色语音",
voiceTabCharacters: "角色",
shellAudioGallery: "音频库",
shellTitleModels: "模型库",
homeTitle: "今天要做什么?",
homeLead: "Anomalous 帮你打理 ComfyUI 周边的杂事:模型、出图、工作流、搭配、提示词和角色语音。点一张卡片直接开始。",
homeCardModelsTitle: "找模型,放进节点",
homeCardModelsBody: "按类型浏览模型和预览图,拖到画布的节点上就换好。",
homeCardDoctorTitle: "修复缺失的模型",
homeCardDoctorBody: "别人的工作流打开报红?模型检查找出你本地对应的模型并换上。",
homeCardVoicesTitle: "给角色配音",
homeCardVoicesBody: "选一个角色,粘贴台词,每句选情绪,直接生成语音。",
homeCardGalleryTitle: "翻看生成的图",
homeCardGalleryBody: "按时间浏览出图,查看当时用的参数。觉得好就点 ☆,存成工作流、搭配或提示词。",
homeCardRecipesTitle: "保存常用工作流",
homeCardRecipesBody: "把调好的工作流连同模型和参数存下来,下次直接用。",
homeCardCombosTitle: "一键放出常用搭配",
homeCardCombosBody: "主模型、LoRA 和提示词存成一个搭配,按一下就连好线放到画布上。",
homeCardPromptsTitle: "拼提示词",
homeCardPromptsBody: "提示词工坊:选中的提示词节点按词块直接改,点词卡就加进去,中文会译成英文。想边看画布边改,可以停到画布旁。",
homeStartLabel: "第一次用?",
homeStartSetup: "一键准备",
firstRunTitle: "第一次用?先准备一下",
firstRunLead: "四步,大约几分钟。准备好以后,模型都有名字、封面和底模,工作流缺模型时也认得出来。",
firstRunLater: "以后再说",
firstRunDone: "完成",
firstRunNetTitle: "1 · 检查网络",
firstRunNetBody: "扫描要连 Civitai 查模型的名字和封面。在国内一般要先开代理。",
firstRunNetChecking: "正在连 Civitai…",
firstRunNetOk: "能连上 · {ms} ms",
firstRunNetDown: "连不上",
firstRunNetFail: "连不上 Civitai({error})。开好代理后点重试;或者先离线扫描:只读文件,查不到名字和封面,以后联网再扫一次就补上。",
firstRunCheck: "检查",
firstRunRetry: "重试",
firstRunScanOffline: "离线扫描",
firstRunKeyTitle: "2 · Civitai Key(可选)",
firstRunKeyBody: "有些模型要登录 Civitai 才查得到。没有也能继续,以后在扫描页里填。",
firstRunKeyRefused: "Civitai 不认这个 Key,可能填错了或已经过期。换一个,或者清空。",
firstRunKeyHas: "已设置",
firstRunKeySet: "填写",
firstRunKeyChange: "更换",
firstRunScanTitle: "3 · 扫描模型",
firstRunScanBody: "你有 {count} 个模型还没扫描。只读文件、查名字和封面,不改动你的文件;扫描在后台进行,期间照常用 ComfyUI。",
firstRunScanNothingNew: "模型都扫描过了。想再查一遍可以重新扫。",
firstRunScanNone: "还没有模型。把模型放进 ComfyUI 的 models 文件夹,或者直接拖进 AMB,再回来扫描。",
firstRunScanRunning: "正在扫描,可以先去用别的,回来看结果。",
firstRunScanPreparing: "准备中…",
firstRunScanStart: "开始扫描",
firstRunScanDone: "扫完了",
firstRunScanDoneBody: "扫描完成。",
firstRunScanFailed: "这次没扫成,原因在扫描进度框里。可以再试一次。",
firstRunTourTitle: "4 · 认识一下界面",
firstRunTourBody: "30 秒导览,指一下每个按钮在哪。",
firstRunTourStart: "开始导览",
firstRunGo: "一键准备",
firstRunGoNote: "按顺序做 1、3、4;网络不通时会停下来让你选。第 2 步可以跳过。",
homeStartScan: "扫描模型文件夹",
homeStartTour: "界面导览",
homeStartNews: "看更新说明",
shellActivity: "记录",
activityTitle: "操作记录",
activityLead: "Anomalous 改过的东西都记在这里:画布上改了哪个节点的什么参数,增删了哪些节点,以及模型、配方、搭配、提示词、图片、音频等文件的改动。画布上的改动,在没被再改过之前可以点“撤销”;其余只记录。",
activityAll: "全部",
activityCanvas: "画布",
activityFiles: "文件",
activityClear: "清空记录",
activityClearConfirm: "清空全部操作记录?只删除记录本身,不会撤回任何改动。",
activityEmpty: "还没有记录。Anomalous 改画布上的节点、改文件时都会记在这里。",
activityLoadFailed: "读取记录失败:",
activityRecent: "最近操作",
activityViewAll: "查看全部",
activityToday: "今天",
activityYesterday: "昨天",
activityCanvasChanged: "改了画布上 {count} 处",
activityByAi: "AI:{summary}",
mcpDidPositive: "AI 改写了正向提示词(Ctrl+Z 撤销)",
mcpDidNegative: "AI 改写了反向提示词(Ctrl+Z 撤销)",
mcpDidModel: "AI 把模型换成了 {name}(Ctrl+Z 撤销)",
mcpDidLora: "AI 加入了 LoRA:{name}(Ctrl+Z 撤销)",
mcpDidCombo: "AI 摆上了搭配“{name}”(Ctrl+Z 撤销)",
mcpDidFix: "AI 找回了 {count} 个缺失的模型(Ctrl+Z 撤销)",
mcpDidRun: "AI 让工作流开始运行",
activityCanvasOpened: "打开工作流 {name}({count} 个节点)",
activityChangedValue: "{node} · {widget}:{before} → {after}",
activityAdded: "新增节点 {node}",
activityRemoved: "删除节点 {node}",
activityMore: "还有 {count} 处没列出",
activityEmptyValue: "(空)",
activityLocate: "在画布上找到",
activityUndo: "撤销",
activityUndone: "已撤销",
activityUndoGone: "撤不了了:这之后画布又改过",
activityLocateMissing: "这个节点已经不在当前画布上了。",
activityWithTarget: "{action}:{target}",
activityUnknown: "其他改动",
activityModelDelete: "删除模型",
activityModelEdit: "修改模型信息",
activityModelCover: "更换模型封面",
activityScan: "扫描模型",
activityScanDone: "{scope}:{counts}",
activityFieldFilename: "文件名",
activityFileMoved: "移到回收站:{name}",
activityFieldChange: "{field}:{before} → {after}",
activityRecipeSave: "保存工作流配方",
activityRecipeEdit: "修改配方",
activityRecipeDelete: "删除配方",
activityRecipeRestore: "恢复配方旧版本",
activityRecipeCover: "设置配方封面",
activityRecipeImport: "导入配方包",
activityMaterialSave: "存下提示词或参数",
activityMaterialEdit: "修改存下的提示词或参数",
activityMaterialDelete: "删除存下的提示词或参数",
activityNoteSave: "保存搭配",
activityNoteDelete: "删除搭配",
activityPresetSave: "保存参数方案",
activityPresetRename: "重命名参数方案",
activityPresetDelete: "删除参数方案",
activityImageDelete: "删除图片",
activityAudioDelete: "删除音频",
activityAudioSave: "保存音频",
activityCacheClear: "清理缓存",
activityVoiceImport: "导入角色",
activityVoiceSettings: "修改角色设置",
activityModelDownload: "下载模型",
activityModelImport: "导入模型",
activityModelMove: "挪动模型",
activityDownloadLine: "{file}({size},来自 {source})",
activityDownloadChecked: "✓ 指纹核对一致",
activityDownloadUnchecked: "来源没有指纹,没有核对",
activityDownloadFor: "工作流里写的是 {value}",
sidebarToggle: '收起/展开列表',
sidebarDoctor: '模型检查',
sidebarAssistant: '当前节点',
sidebarSettings: "设置",
settingsBack: "‹ 返回",
settingsOpen: "打开",
settingsAppearance: "外观",
settingsViewModeHelp: "紧凑一屏放得多;沉浸卡片更大,背景带一层封面氛围。",
settingsAtmosphereHelp: "沉浸模式下背景氛围的浓淡。",
settingsScaleHelp: "只缩放这个浏览器窗口里的文字和按钮,不影响 ComfyUI。",
settingsTheme: "主题",
settingsThemeHelp: "跟随 ComfyUI:ComfyUI 换成浅色或深色的调色板,这里跟着变。深渊绯红是暗红色调的深色配色。",
settingsThemeAuto: "跟随 ComfyUI",
settingsThemeDark: "深色",
settingsThemeLight: "浅色",
settingsThemeAbyssal: "深渊绯红",
settingsCards: "模型卡片与内存",
settingsCardQualityHelp: "缩略图是 512 像素的小图,存在 ComfyUI 的用户文件夹里,重启后不用重做;打开模型详情仍是原图。原图在卡片上更清楚,但一屏几十张大图会明显多占内存和显存。",
settingsVideoHelp: "模型的视频封面和图库里的视频平时显示第一帧,鼠标停上才(静音)播放。一直播放会让屏幕上的视频同时解码,更占显存和电量。",
settingsCacheTitle: "缩略图缓存",
settingsCacheLoading: "正在统计…",
settingsCacheHelp: "已缓存 {count} 张,占 {size}(最多 {limit},满了自动清掉最久没用的)。清空后看到时会重新生成,不影响模型和封面。",
settingsCacheUnknown: "读不到缓存大小。",
settingsCacheClear: "清空",
settingsFolders: "模型文件夹",
settingsFoldersHelp: "哪些模型类型显示在模型页、按什么顺序,以及怎么分组。",
foldersBack: "‹ 返回设置",
foldersLead: "选哪些模型显示在“模型”页、按什么顺序排。关掉的不读取,也不扫描,不占资源。改了马上生效。",
foldersGrouping: "怎么分组",
foldersByType: "按模型类型(推荐)",
foldersByDisk: "按硬盘上的文件夹",
foldersByTypeHelp: "按 ComfyUI 的模型类型分:Checkpoint、LoRA、VAE……额外模型路径里的同类模型也算在一起。",
foldersByDiskHelp: "按硬盘上的文件夹名分,适合自己整理过文件夹结构的人。",
foldersShown: "显示在模型页",
foldersHidden: "不显示(不读取、不扫描)",
foldersNoneShown: "现在一个都没显示,在下面打开几个。",
foldersRare: "其他 {count} 种(一般用不到)",
foldersMoveUp: "往前",
foldersMoveDown: "往后",
foldersSaveFailed: "没能保存:{error}",
foldersLoadFailed: "读不到文件夹列表。",
settingsWorkflows: "工作流",
settingsCheckOnOpen: '打开工作流时检查缺失模型',
settingsCheckOnOpenHelp: '打开或拖进工作流时,缺模型就在画布上方提示,本机有同一个文件的可以一键换上。关掉后,要检查就点左侧的模型检查。',
settingsNetwork: '网络',
settingsProxy: '代理地址',
settingsProxyHelp: '插件自己联网(扫描、下载模型、翻译、检查更新)走的代理。留空就用系统代理;代理软件用 PAC 模式或只代理浏览器时,在这里填它的 HTTP 端口,例如 127.0.0.1:7890。只影响本插件。',
settingsProxyPlaceholder: '留空 = 系统代理',
settingsProxyBad: '没有保存:格式写成 127.0.0.1:7890 或 http://127.0.0.1:7890。',
settingsProxySocks: '没有保存:插件用不了 SOCKS 代理,请填代理软件的 HTTP 端口(在代理软件的设置里,常见 7890、7897、10809)。',
settingsNetworkTest: '测试连接',
settingsNetworkTestHelp: '现在能不能连上 Civitai(用上面的代理)。',
settingsNetworkTesting: '正在连接 Civitai…',
settingsNetworkOk: '能连上 Civitai({ms} 毫秒)。',
settingsNetworkOkRed: '连得上 civitai.red(Civitai 的另一个地址,{ms} 毫秒),civitai.com 连不上:查模型会用 civitai.red,能认出名字和触发词;封面图在 civitai.com 那边,可能下不来,需要的话填上面的代理。',
settingsNetworkFail: '连不上 Civitai:{why}。',
settingsNetworkKeyRefused: '能连上 Civitai,但它不认现在的 API 密钥。',
netFailureTimeout: '等了很久没有回应,常见原因是没有走代理',
netFailureRefused: '连接被拒绝,代理地址或端口不对,或者代理软件没开',
netFailureDns: '找不到 civitai.com,网络没通或域名解析被干扰',
netFailureSsl: '安全连接失败,可能被拦截,或者电脑的时间不对',
netFailureReset: '连接被中途掐断,常见原因是没有走代理',
netFailureProxy: '代理拒绝了这次连接',
netFailureHttp: 'Civitai 返回了错误(HTTP {code}),可能是它那边临时出问题',
netFailureOther: '网络出错',
settingsDownloads: '模型下载与导入',
settingsSidecars: '模型附带的文件',
settingsSidecarsWhere: '说明和备份放在哪',
settingsSidecarsWhereHelp: '扫描得到的说明(.info)、你改过的名字和备注(.anomalous.json)、换了封面后留着的 Civitai 原图。封面一直留在模型旁边,ComfyUI 和别的插件要看。',
settingsSidecarsBeside: '和模型放在一起',
settingsSidecarsHidden: '收进隐藏的 .amb 文件夹',
settingsSidecarsTidy: '清掉重复的封面备份',
settingsSidecarsTidyHelp: '以前每次扫描都会多存一份和封面一模一样的 Civitai 原图。清掉以后,换封面时才会再留一份。',
settingsSidecarsTidyButton: '检查并清理',
settingsSidecarsCounting: '正在看所有模型文件夹……',
settingsSidecarsConfirmHidden: '要把 {moves} 个文件收进各自文件夹的 .amb 里,并把 {duplicates} 份和封面一模一样的备份移到回收站。只是挪动,随时可以改回来。继续吗?',
settingsSidecarsConfirmBeside: '要把 {moves} 个文件从 .amb 挪回模型旁边,并把 {duplicates} 份和封面一模一样的备份移到回收站。继续吗?',
settingsSidecarsMoving: '正在挪文件……',
settingsSidecarsDone: '✓ 挪好了 {moved} 个文件,清掉 {deduped} 份重复备份。',
settingsSidecarsPartly: '挪好了 {moved} 个文件,清掉 {deduped} 份重复备份;有 {failed} 个没挪成,原地照样能用,详情在浏览器控制台里。',
settingsSidecarsFailed: '没能完成,详情在浏览器控制台里。',
settingsBackup: '备份',
settingsBackupExport: '导出备份',
settingsBackupExportHelp: '把工作流配方、搭配、素材和存下的提示词、参数方案,以及你给模型改的名字、备注和封面,打成一个压缩包。放到云端硬盘或 U 盘里,换电脑、重装时导回来。',
settingsBackupExportButton: '导出',
settingsBackupImport: '导入备份',
settingsBackupImportHelp: '从导出的压缩包恢复。先列出包里有什么;默认只添加这台电脑上没有的,不会删掉任何东西。',
settingsBackupImportButton: '选择文件',
backupExportTitle: '导出备份',
backupExportIntro: '工作流配方、搭配、素材和存下的提示词、参数方案都会带上,还有插件设置。',
backupExportModels: '模型的名字、备注和自选封面',
backupExportModelsHint: '换了电脑也能按文件哈希对回模型。扫描得来的 C 站信息不用带,重新扫描就有。',
backupExportComfyHint: 'ComfyUI 工作流菜单里保存的那些(user/default/workflows)。',
backupExportScan: '模型的扫描信息',
backupExportScanHint: '从 C 站扫到的名字、触发词、底模(.info,很小)。C 站上的模型被删了也不怕。',
backupExportCivitaiCovers: 'C 站封面',
backupExportCivitaiCoversHint: '扫描下载的封面图和视频,可能有几百 MB。不带的话,导入后重新扫描也能下回来。',
backupDoneScan: '扫描信息:写回 {model_infos} 个,C 站封面 {model_civitai_covers} 张(只补这台电脑上没有的)。',
backupExportLibrary: '模型清单',
backupExportLibraryHint: '每个模型的位置、大小、指纹和下载链接(很小)。换电脑后导入时,可以把缺的模型直接下回来。',
backupLibraryMissing: '这台电脑上缺 {count} 个原来有的模型(共 {size})。',
backupLibraryAllHere: '模型清单里的 {total} 个模型,这台电脑上都有。',
backupLibraryDownload: '查找下载…',
backupDownloadTitle: '补下载缺的模型({count} 个)',
backupDownloadLooking: '正在查找 {count} 个模型的下载来源…',
backupDownloadFound: '找到 {found} / {count} 个的下载来源。勾选要下载的:',
backupDownloadNoSource: '找不到下载来源(C 站和链接里都没有)。',
backupDownloadByName: '⚠ 只按文件名找到,没法确认是同一个文件,默认不勾。',
backupDownloadTotal: '选中 {count} 个,共 {need};磁盘剩余 {free}。',
backupDownloadWhere: '会下到和原来电脑上一样的文件夹和文件名,一个接一个下,下完核对指纹并自动扫描。关掉这个窗口也会继续下载。这些模型的名字和备注,等下载完再导入一次同一个备份就会写上。',
backupDownloadStart: '下载选中的',
backupDownloadDone: '✓ 已下载',
backupDownloadHide: '关闭(继续下载)',
backupExportKey: 'C 站 API 密钥不会放进备份。',
backupExportStart: '导出',
backupExporting: '正在打包…',
backupExported: '已经下载:{name}({size})。把它放到云端硬盘或 U 盘里保存。',
backupFailed: '没有成功:{error}',
backupImportTitle: '导入备份',
backupReading: '正在读取 {name}…',
backupFrom: '{name}:做于 {date},插件版本 {version}。选要导入的部分:',
backupPart_recipes: '工作流配方',
backupPart_combos: '搭配',
backupPart_materials: '素材和存下的提示词',
backupPart_parameters: '参数方案',
backupPart_comfy_workflows: 'ComfyUI 自己保存的工作流',
backupCounts: '新的 {new} 个 · 相同 {same} 个 · 不同 {differs} 个',
backupModels: '模型的名字、备注和封面:这台电脑上找到 {matched} / {total} 个对应的模型',
backupModelsMissing: '没找到的 {count} 个(可能还没下载):{names}',
backupSettings: '插件设置',
backupSettingsHint: '显示哪些模型文件夹、下载位置等。会换掉这台电脑现在的设置;C 站密钥保留这台电脑的。',
backupNothing: '这份备份里没有可以导入的东西。',
backupModeTitle: '遇到这台电脑上也有、但内容不同的文件时',
backupModeKeep: '保留这台电脑上的(推荐)',
backupModeReplace: '换成备份里的,这台电脑上的放进回收站',
backupImportStart: '导入',
backupImporting: '正在导入…',
backupDone: '添加了 {added} 个文件,换掉 {replaced} 个,跳过 {skipped} 个(相同的,或保留了这台电脑上的)。',
backupDoneModels: '模型:写回 {model_notes} 个模型的名字和备注、{model_covers} 张封面;保留这台电脑上自选封面 {covers_kept} 张;{models_missing} 个模型这台电脑上没有。',
backupDoneSettings: '插件设置已经换成备份里的。',
backupFailedItems: '这些没有处理:',
backupDoneHint: '重新打开对应的页面就能看到。换掉的文件在回收站里。',
activityBackupExport: '导出备份',
activityBackupImport: '导入备份',
settingsDownloadPlace: '缺失的模型下载到',
settingsDownloadPlaceHelp: '“工作流写的位置”:按工作流里记的子文件夹放,下完节点不用改;工作流没写子文件夹的,放进下面这个文件夹。“固定文件夹”:总是放进下面这个文件夹,下完自动把节点改到新位置(可以 Ctrl+Z)。每次下载前,确认框里还能改。',
settingsDownloadPlaceWorkflow: '工作流写的位置',
settingsDownloadPlaceFolder: '固定文件夹',
settingsDownloadFolder: '文件夹',
settingsDownloadFolderHelp: '下载和导入的模型放进各类模型自己的文件夹(loras、checkpoints…)里的哪一层。自己写时,{base} 会换成模型的底模,比如 SDXL、Flux、Illustrious;已经有这个名字的文件夹(不分大小写和符号)就用它;留空就放在类型文件夹本身。',
settingsDownloadFolderRoot: '(类型文件夹本身)',
settingsHfMirror: 'Hugging Face 用国内镜像',
settingsHfMirrorHelp: '从 Hugging Face 下载时改走 hf-mirror.com,国内网络通常快得多、也更稳。中文界面默认打开;不在国内可以关掉。只影响 Hugging Face,C 站没有镜像。',
settingsDownloadKey: 'Civitai API Key',
settingsDownloadKeyHelp: '有些模型要登录 Civitai 才能下载,填上你的 Key 就能下。只保存在本机。',
settingsDownloadKeySet: '设置…',
settingsTabLook: '外观',
settingsTabModels: '模型',
settingsTabWorkflows: '工作流',
settingsTabCanvas: '画布',
settingsTabPacks: '节点包',
settingsTabPrompts: '提示词',
settingsTabBackup: '备份',
settingsTabHelp: '帮助',
settingsDownloadFolderPreset0: '按底模分(比如 loras/SDXL)',
settingsDownloadFolderPreset1: '先放进 Downloads,再按底模分',
settingsDownloadFolderPreset2: '都放进 Downloads 文件夹',
settingsDownloadFolderPreset3: '直接放在类型文件夹里',
settingsDownloadFolderCustom: '自己写…',
settingsDownloadFolderExample: '例:{path}',
importChip: '+ 导入',
importChipTitle: '把下载好的模型文件放进对应的文件夹(也可以直接把文件拖到这一页)',
importDropHint: '松手,把模型放进对应的文件夹',
importNoModels: '这里只收模型文件(.safetensors、.gguf、.ckpt 等)',
importTitle: '导入 {count} 个模型',
importIntro: '先看看每个文件是什么、会放到哪里,不对的可以改。',
importFromDownloads: '在「下载」文件夹里找到了,会直接移过去',
importFromDesktop: '在桌面上找到了,会直接移过去',
importWillUpload: '找不到原文件在哪,会复制一份过去',
importRemove: '不导入这个',
importKind: '类型',
importKindPick: '选择类型…',
importKind_checkpoints: '大模型(Checkpoint)',
importKind_loras: 'LoRA',
importKind_vae: 'VAE',
importKind_text_encoders: '文本编码器(CLIP / T5)',
importKind_diffusion_models: '扩散模型(UNet)',
importKind_controlnet: 'ControlNet',
importKind_embeddings: 'Embedding(嵌入)',
importKind_clip_vision: 'CLIP Vision',
importKind_upscale_models: '放大模型',
importKind_ipadapter: 'IPAdapter',
importKindHelp_checkpoints: '大模型:出图的主体,文件里自带 VAE 和文本编码器,用「Checkpoint 加载器」加载。',
importKindHelp_loras: 'LoRA:小模型,给大模型加角色、画风或概念,接在大模型后面用;要和大模型的底模对得上。',
importKindHelp_vae: 'VAE:负责图片和潜空间互相转换,影响颜色和细节;大模型多半自带,单独下载的放这里。',
importKindHelp_text_encoders: '文本编码器:把提示词变成模型看得懂的东西(CLIP、T5 等)。Flux、SD3、Wan 这类模型要单独加载它。',
importKindHelp_diffusion_models: '扩散模型:只有主体部分的模型(Flux、Wan 等常这样发布),要另外配 VAE 和文本编码器。',
importKindHelp_controlnet: 'ControlNet:按线稿、姿势、深度图等控制画面构图。',
importKindHelp_embeddings: 'Embedding:很小的提示词包,在提示词里写它的名字来用(常用于负面提示词)。',
importKindHelp_clip_vision: 'CLIP Vision:让模型看懂参考图,IPAdapter、图生视频等会用到。',
importKindHelp_upscale_models: '放大模型:把图片放大并补上细节。',
importKindHelp_ipadapter: 'IPAdapter:用参考图控制画风或人物。',
importKindUnknown: '认不出这是哪类模型,请在上面选一下。',
importKindUnreadable: '这种格式不能安全地打开来看,请在上面选它的类型。',
importBase: '底模:{base}',
importBaseNone: '底模:看不出(放在类型文件夹里)',
importBaseShared: '多种底模通用,放在类型文件夹里',
importBaseCivitai: '(C 站确认)',
importChecking: '正在读整个文件、向 C 站核对…',
importCivitaiDown: 'C 站连不上,按文件头判断',
importCivitaiUnknown: 'C 站没有这个文件,按文件头判断',
importCivitaiName: 'C 站上是:{name}',
importDuplicate: '你已经有这个文件了:{path}(内容完全一样)',
importSameFile: '已经有一个同名、同大小的文件:{path},可能就是它',
importSameName: '已有同名文件:{path}。放到同一个位置时,这个会另存为「名字 (2)」',
importStillPut: '仍然放进去',
importLooking: '正在看这是什么模型…',
importPlaced: '✓ 已放到 {path}',
importMoving: '正在移过去…',
importCopying: '正在复制…',
importUploading: '正在发送 {percent}%',
importKeepOriginal: '保留原文件(复制一份,不移动)',
importPutAll: '放好({count})',
importDone: '已放好 {count} 个模型,正在读取它们的信息',
importError_gone: '原文件不见了(被移走或删掉了?)',
importError_io: '写文件失败(磁盘满了,或者没有权限?)',
importError_incomplete: '文件没传完整,请再试一次。',
importError_network: '连接断了,请再试一次。',
importError_not_local: '只能在运行 ComfyUI 的这台电脑上移动文件。',
importError_not_model: '这不是模型文件。',
importError_bad_type: '请先选类型。',
importError_unknown: '导入失败了,详细原因在 ComfyUI 的控制台里。',
tidyChip: '整理',
tidyChipTitle: '找出放错文件夹的模型和内容重复的文件',
tidyLoading: '正在检查…',
tidyDeepRunning: '正在读文件核对,大文件可能要一两分钟…',
tidyFailed: '检查失败了,详细原因在 ComfyUI 的控制台里。',
tidyBreaks: '放在这里,「{loader}」读不了它,要用「{right}」。',
tidyMove: '挪过去',
tidyMoved: '✓ 已把 {name} 挪到 {path}。',
tidyMovedHint: '已经用到它的工作流,要把「{from}」节点换成「{to}」。',
tidyLeft: '有 {count} 个附属文件(封面、信息)没能一起挪,还在原来的地方。',
tidyDupGroup: '{count} 份一模一样的文件,每份 {size}',
tidyUnchecked: '还有 {groups} 组大小相同、没扫描过的文件没核对,核对要读 {size}。',
tidyDeep: '核对',
tidyLoader_checkpoints: 'Checkpoint 加载器',
tidyLoader_loras: 'LoRA 加载器',
tidyLoader_vae: 'VAE 加载器',
tidyLoader_text_encoders: 'CLIP 加载器',
tidyLoader_diffusion_models: 'UNet 加载器',
tidyLoader_controlnet: 'ControlNet 加载器',
tidyLoader_embeddings: '提示词里的 embedding:名字',
tidyLoader_clip_vision: 'CLIP Vision 加载器',
tidyLoader_upscale_models: '放大模型加载器',
tidyLoader_ipadapter: 'IPAdapter 加载器',
modelTabAll: '全部模型',
modelBasesLabel: '按底模筛选',
modelBasesAll: '全部',
modelBasesUnknown: '看不出',
tidyLead: '按文件里自带的"目录"判断每个模型是什么,找出放错文件夹的和重复的文件。这里只看不改,挪动和删除都要你来点。',
tidyAllGood: '✓ 都整理好了',
tidyChecked: '检查了 {count} 个模型文件,没有放错的,也没有重复的。',
tidyStepMisplaced: '放错文件夹({count})· 放在这里加载会报错',
tidyStepDuplicates: '重复的文件({count} 组)· 白占硬盘',
tidyWhy_diffusion_models: '这个文件只有模型主体,没有 VAE 和文本编码器,「{loader}」读不了它,要用「{right}」。',
tidyWhy_checkpoints: '这是完整的大模型(自带 VAE 和文本编码器),要用「{right}」加载。',
tidyWhy_loras: '这是 LoRA,要接在大模型后面、用「{right}」加载,放在这里找不到它。',
tidyWhy_text_encoders: '这是文本编码器(把提示词变成模型看得懂的东西),要用「{right}」加载。',
tidyWhy_vae: '这是 VAE,要用「{right}」加载。',
tidyChangePlace: '换个位置',
tidyDupWhy: '这几个文件内容一模一样,留一份就够了。点封面选要留的那份。',
tidyKeep: '留这份',
tidyExtra: '多余',
tidyRecycleExtra: '多余的放进回收站({count})',
tidyRecycleConfirm: '把 {count} 份多余的文件(共 {size})连同封面、信息放进回收站?留下的是:{keep}',
tidyRecycled: '✓ 已把 {count} 份多余的文件放进回收站,腾出 {size}。',
tidyUsageTitle: '很久没用的模型',
tidyUsagePacksTitle: '很久没用的节点包',
tidyUsagePacksElsewhere: '节点包的整理在 设置 → 节点包 →',
tidyUsageLead: '按 AMB 记下的每次运行和打开过的工作流、出图和音频里存的记录、保存过的工作流(配方、搭配也算),以及现在开着的标签页来判断。放进来不到 30 天的不算。这里只是建议,删之前看一眼。',
tidyUsageRun: '开始查找',
tidyUsageLedger: '运行和打开工作流的记录从 {date} 开始({days} 天)。',
tidyUsageLedgerShort: 'AMB 从 {date} 才开始记录每次运行和打开的工作流({days} 天),比这一档短;更早的只看得到出图和保存的工作流,结果可能不全。',
tidyUsageLedgerNone: 'AMB 从这一版开始记录每次运行和打开的工作流,目前还没有记录;现在只看得到出图和保存的工作流,结果可能不全。',
tidyUsageRunning: '正在读运行记录、出图和保存的工作流……图很多时要一会儿。',
tidyUsageFailed: '查找失败了,详情在浏览器控制台里。',
tidyUsage30: '超过 30 天没用',
tidyUsage90: '超过 90 天没用',
tidyUsageNever: '从没用过',
tidyUsageAgain: '重新查找',
tidyUsageSeen: '看了 {outputs} 个出图(图片和音频)、{saved} 个保存的文件。',
tidyUsageSeenCapped: '看了 {outputs} 个出图(图片和音频)、{saved} 个保存的文件(太多了没看完,结果可能不全)。',
tidyUsageNoOutput: '没找到用过的记录:没运行过,打开过的工作流、出图和保存的工作流里也没有它',
tidyUsageLast: '上次用到:{date}({days} 天前)',
tidyUsageSaved: '有 {count} 个保存的工作流 / 配方 / 搭配用到它',
tidyUsagePicked: '已选 {count} 个,共 {size}',
tidyUsagePickHint: '勾选要清理的模型',
tidyUsageRecycle: '移到回收站',
tidyUsageConfirm: '把选中的 {count} 个模型(共 {size})连同封面和说明移到回收站?需要时可以从回收站还原。',
tidyUsageRecycleFailed: '有模型没能移到回收站,详情在浏览器控制台里。',
tidyUsageRecycled: '✓ 已把 {count} 个模型放进回收站,腾出 {size}。',
tidyUsageNone: '这一档里没有模型。',
tidyUsageMore: '还有 {count} 个(共 {size})没列出来,先处理上面这些。',
tidyUsagePacksLead: '这些包只靠节点干活,而它们的节点这段时间没被运行、打开或保存过(放上画布、开着的标签页里有,都算用过)。“装了多少天”按它文件夹的创建日期算。插件不动节点包:点“在 Manager 里找它”,会打开 ComfyUI Manager 并搜好这个包(包名也复制好了,没搜到就粘贴进搜索框),在那一行点 Disable(停用,以后还能启用)或 Uninstall(卸载),改完重启 ComfyUI。',
tidyUsageNoManager: '没找到 ComfyUI Manager。装上它以后,就能在里面停用或卸载节点包。',
tidyUsageNodes: '{count} 个节点',
tidyUsageNoNodes: '没有节点',
tidyUsageInstalled: '装了 {days} 天',
tidyUsageFeeds: '{packs} 的节点要用它做出的东西,停用前看看那边还用不用',
tidyUsageFind: '在 Manager 里找它',
tidyUsageKeep: '我还在用',
tidyUsageUnkeep: '取消标记',
tidyUsageKeepFailed: '没能保存这个标记,详情在浏览器控制台里。',
tidyUsageKept: '你标记为在用的',
tidyUsageKeptLead: '这些包你说过还在用,上面就不再列出。点“取消标记”,它就重新按记录来判断。',
tidyUsageUiPacks: '节点很久没用,但它还在界面上干活',
tidyUsageUiPacksLead: '这些包的节点这段时间没用过,可它们还给 ComfyUI 界面加了东西(按钮、菜单、面板、监视条之类)。只用它的面板、按钮不会留下记录,所以这里看不出来。界面上的功能你也不用了,再考虑停用。',
tidyUsagePageOnly: '在界面或后台干活的',
tidyUsagePageOnlyLead: '这些包没有节点,只在界面或后台干活(比如菜单、性能监视、下载工具),从记录里看不出用没用,只有你知道。',
tidyUsagePacksNone: '这一档里没有只靠节点干活、又很久没用的包。',
settingsTranslation: '翻译',
settingsDeeplKey: 'DeepL 密钥',
settingsDeeplKeyHelp: '提示词翻译默认用谷歌的免费接口,连不上时换 MyMemory(额度小)。填上你自己的 DeepL 密钥,就先用 DeepL,翻得更好。免费版每月 50 万字符:在 deepl.com 注册 DeepL API Free,到账户的 API Keys 页复制。只保存在本机,备份里也不带。',
settingsDeeplKeyOn: '已填写',
settingsDeeplKeyOff: '未填写',
settingsDeeplKeyPrompt: '粘贴 DeepL API 密钥(免费版的以 :fx 结尾)。清空后确定,就删掉已保存的密钥。',
settingsDeeplKeyCleared: '已删掉 DeepL 密钥,翻译改回用谷歌和 MyMemory。',
settingsDeeplKeyWorks: '密钥能用。试着翻了一句:{text}',
settingsDeeplKeyFailed: '密钥已保存,但 DeepL 没翻成:{why}。在这之前,翻译先用谷歌。',
settingsDeeplKeySaveFailed: '保存失败:{error}',
settingsDeeplBadKey: 'DeepL 不认这个密钥,看看是不是没复制全',
settingsDeeplQuota: '这个月的额度用完了',
settingsDeeplBusy: 'DeepL 这会儿太忙,过一会儿再试',
settingsOpening: "打开方式与窗口",
settingsEntryHelp: "在哪里打开这个浏览器。快捷键在 ComfyUI 设置 → Anomalous Model Browser 里设置。打开后按 1–9,跳到左边从上往下对应的页面。",
settingsFollowNode: "按选中的节点打开",
settingsFollowNodeHelp: "打开浏览器时,画布上选中的是文本节点,就打开提示词并对准它;选中的是其他节点(K 采样器、加载模型的节点等),就打开当前节点。什么都没选,回到上次用的页面。",
shellRailKey: "{name}(按 {key})",
settingsLayout: "窗口布局",
settingsLayoutHelp: "窗口位置、大小、停靠、缩放和展示模式恢复默认。",
settingsReset: "恢复默认",
settingsHelp: "帮助与反馈",
settingsTour: "界面导览",
settingsTourHelp: "在界面上一个个指给你看:每个按钮在哪、是做什么的。",
settingsNewsHelp: "这个版本改了什么。",
settingsGuide: "完整使用说明",
settingsGuideHelp: "在 GitHub 上看完整的文字说明,跟着每次更新一起改。",
settingsStart: "开始",
settingsOpenGuide: "去看看",
feedbackTitle: "遇到问题,或者有想法?",
feedbackLead: "在 GitHub 上告诉我,一两句话就行。版本、显卡这些信息会自动附上。",
feedbackReport: "报告问题",
feedbackSuggest: "提建议",
starButton: "⭐ 点个 Star",
starHint: "觉得好用的话,在 GitHub 上点个 Star,能让更多人发现这个插件",
settingsStar: "在 GitHub 上点个 Star",
settingsStarHelp: "觉得好用就点一下,能让更多人发现这个插件。会打开项目页面,点右上角的 ☆ Star 就行。",
settingsStarOpen: "去点 Star",
feedbackCopy: "复制诊断信息",
feedbackCopyHint: "插件和 ComfyUI 的版本、显卡、浏览器,不含文件路径和个人信息;可以贴到任何地方。",
feedbackCopied: "已复制",
feedbackCopyFailed: "复制失败",
feedbackWrite: "写反馈",
feedbackDialogLead: "说说遇到了什么,一两句话就行,中文英文都可以。写完点“去 GitHub 提交”,会打开一个已经写好的页面,你在那里点一下提交就行(需要登录 GitHub)。",
feedbackDialogSuggestLead: "想要什么功能、哪里不顺手,随便写。写完点“去 GitHub 提交”,会打开一个已经写好的页面,你在那里点一下提交就行(需要登录 GitHub)。",
feedbackReportPlaceholder: "比如:在模型页点扫描,进度停在 30% 就不动了。",
feedbackSuggestPlaceholder: "比如:希望提示词能按标签筛选。",
feedbackScreenshotHint: "有截图或报错的话,到 GitHub 页面上直接拖进去就行。",
feedbackAttach: "附上环境信息(插件和 ComfyUI 版本、显卡、浏览器,不含文件路径和个人信息)",
feedbackShowAttach: "看看会附上什么",
feedbackSubmit: "去 GitHub 提交",
feedbackIssueBugPrefix: "[问题] ",
feedbackIssueIdeaPrefix: "[建议] ",
feedbackIssueEnvironment: "环境信息(自动填写)",
settingsReportHelp: "先在这里写一两句话,再去 GitHub 提交;版本、显卡这些信息会自动附上。",
settingsSuggestHelp: "想要的功能、哪里不顺手,都可以写。",
sidebarScan: '扫描模型',
sidebarGlobalWizardTitle: '全局扫描向导',
sidebarProvenance: '在工作流里记下模型指纹',
sidebarProvenanceDesc: "生成图片或保存工作流时,把模型的指纹和下载链接一起存进去。以后模型改名、换电脑,模型检查也能找回来;别人拿到工作流,也知道模型去哪下。",
sidebarScanning: '⏳ 扫描中...',
sidebarScanDone: '✅ 扫描完成',
scanProgressTitle: '模型扫描进度',
scanProgressPreparing: '正在准备扫描目录…',
scanProgressCounting: '正在统计需要检查的模型…',
scanProgressFolder: '目录 {current}/{total} · {folder}',
scanProgressModel: '模型 {current}/{total} · {filename}',
scanProgressFinished: '扫描结果已经刷新。',
scanProgressProblem: '扫描已中断',
scanProgressInterrupted: '检测到上次异常退出留下的扫描状态,现已自动清理。',
scanProgressRetryReady: '扫描功能已经恢复,可以立即重新扫描。',
scanProgressLastError: '最近一个错误:{error}',
sidebarUiScale: "界面缩放",
sidebarViewMode: '展示模式',
sidebarViewModeCompact: '紧凑模式',
sidebarViewModeStandard: '标准模式',
sidebarViewModeAesthetic: '沉浸模式',
sidebarBgAtmosphere: '背景氛围',
sidebarResetConfirm: '确认重置窗口位置、缩放和停靠状态吗?',
promptLibrarySyncFailed: "存过的提示词没同步上,已保留现有词卡,会自动重试",
promptLibrarySource: "你存过的提示词,可以改名或删除",
promptCardPositive: "⊕ 正向",
promptCardNegative: "⊖ 负向",
promptCardCopy: "复制",
promptCardCopied: "已复制",
promptCardCopyHint: "复制提示词到剪贴板",
promptCardPin: "固定",
promptCardPinned: "已固定",
promptCardPinHint: "固定浮窗,移开鼠标也不关",
promptCardClose: "关闭浮窗",
promptCardAddHint: "点卡片加进提示词框,或拖到画布的提示词框里",
promptCardAdd: "加入",
promptCardAddTitle: "加进对应的提示词框",
promptStudioTitle: "提示词工坊",
promptStudioResize: "拖动调整宽度,双击恢复默认",
promptStudioDockLeft: "停到左边",
promptStudioDockRight: "停到右边",
promptStudioDock: "停到画布旁",
promptStudioDockHint: "移到画布旁边,一边看画布一边改。浏览器窗口会先收起来。",
promptStudioUndock: "回到窗口",
promptStudioUndockHint: "放回浏览器窗口里的“提示词”页。",
promptStudioViewTags: "词块",
promptStudioViewText: "整段",
promptStudioViewHint: "按词块看,还是看整段文字",
promptStudioGlossOff: "不显示意思",
promptStudioGlossIn: "意思:{language}",
promptStudioGlossHint: "在每个词下面显示它的意思(通过翻译服务查询)",
promptStudioEditing: "正在改:{node}",
promptStudioDraft: "草稿(不在任何节点里)",
promptStudioDraftHint: "在画布上选中一个提示词节点,这里就直接改它。草稿可以存下,或按住 ⠿ 拖到画布上。",
promptStudioUseDraftHint: "不改这个节点了,换成空白的草稿",
promptStudioUndo: "撤销",
promptStudioUndoHint: "撤销在工坊里做的上一步(画布上按 Ctrl+Z 也行)",
promptStudioPositive: "正面",
promptStudioNegative: "负面",
promptStudioWrongBox: "{card}词卡不能放进{box}提示词框",
promptStudioNoBoxFor: "这个节点没有能放{card}提示词的框",
promptStudioAddPlaceholder: "输入提示词,回车加入",
promptStudioAddHint: "可以一次输入好几个,用逗号隔开;中文、日文等不是英文的会自动译成英文",
promptStudioTranslating: "翻译中…",
promptStudioTranslateFailed: "没能翻译,请稍后再试",
promptStudioHasForeign: "这里有不是英文的词,多数模型只认英文。",
promptStudioToEnglish: "译成英文",
promptStudioCopy: "复制",
promptStudioCopied: "已复制",
promptStudioSave: "存下",
promptStudioSaveHint: "存成词卡,以后在“我存的”里点一下就能用",
promptStudioSaveName: "给这段提示词起个名字",
promptStudioSaved: "存好了:{name},在“我存的”里",
promptStudioSavedBefore: "已经存过一样的:{name}",
promptStudioSaveFailed: "没能存下,请再试一次",
promptStudioDragOut: "按住拖到画布:放到提示词框上就填进去,放到空白处新建一个提示词节点",
promptStudioEmpty: "还没有提示词。点一张词卡,或在这里输入。",
promptStudioWeight: "权重 {weight}",
promptStudioWeightDown: "减弱",
promptStudioWeightUp: "加强",
promptStudioEditTag: "改字",
promptStudioRemoveTag: "删掉",
promptStudioTagHint: "点一下选中(可调权重),双击改字,拖动换位置",
promptStudioAllThere: "这些词已经都有了",
promptStudioRefTitle: "参考:{name}",
promptStudioRefClose: "关掉参考",
promptStudioRefBack: "‹ 卡片",
promptStudioRefAddAll: "全部加入",
promptStudioRefAddAllHint: "把这张卡片的词一次全加进去(已经有的不重复加)",
promptStudioRefNote: "点一个词,只把它加进正在改的提示词;打勾的是已经有的。",
promptStudioRefTake: "只把这个词加进去",
promptStudioRefThere: "这个词已经有了",
promptStudioRefHint: "点卡片现在会先把它打开成参考,可以一个词一个词地挑;想整张加,点参考上的“全部加入”。",
promptStudioAddedSkipped: "加了 {count} 个,{skipped} 个已经有了",
promptDeckSearch: "搜索词卡…",
promptDeckNew: "新建词卡",
promptDeckNewName: "词卡名字(可不填)",
promptDeckNewText: "提示词,多个用逗号隔开",
promptDeckPresets: "常用",
promptDeckSaved: "我存的",
promptDeckRolePositive: "正面",
promptDeckRoleNegative: "负面",
promptDeckTagCount: "{count} 词",
promptDeckNoMatch: "没有匹配的词卡",
promptDeckSavedEmpty: "还没有。在图库里点 ☆ 收藏提示词、在提示词框上点“存下”,或点 + 新建,都会出现在这里。",
promptPresetQuality: "画质",
promptPresetNegative: "常用负面",
promptPresetAnatomy: "手和身体",
currentNodeEditInStudio: "在提示词工坊里改",
promptCardRename: "改名",
promptCardRenameHint: "给这条存过的提示词改个名字",
promptCardRenameAsk: "新名字",
promptCardRenameFailed: "没改成,请再试一次。",
promptCardDelete: "删除",
promptCardDeleteHint: "删除这条存过的提示词(进回收站)",
promptCardDeleteConfirm: "删除“{name}”?它的正向和负向会一起删掉,移到系统回收站。",
promptCardDeleteFailed: "没删掉,请再试一次。",
promptCardDragCanvas: "松手:在这里新建一个提示词节点",
promptNodePositive: "CLIP 文本编码器 (正向)",
promptNodeNegative: "CLIP 文本编码器 (负向)",
toolWorkflowTransferTitle: "分享与导入",
toolModelSourcesTitle: "每个模型去哪下载,链接可以改成任何网站",
toolModelSourcesShort: '模型来源',
modelSourcesTitle: "模型来源",
modelSourcesLead: "每个模型从哪下载。链接存在模型自己的信息里(编辑窗口里的“下载地址”就是它),哪个网站都行;“当前工作流”里的链接还会存进工作流,分享时一起带走。",
modelSourcesOpen: "打开",
modelSourcesSave: "保存",
modelSourcesSavedBoth: "已存进模型信息和这个工作流",
modelSourcesSavedWorkflow: "已存进这个工作流(本机没有这个模型)",
modelSourcesSaveFailed: "没存上:{error}",
modelSourcesFound: "找到了,看一下再点保存",
modelSourcesNotFound: "没找到,可以自己粘贴链接",
modelSourcesStats: "已填链接 {done} / {total}",
modelSourcesKeepAll: "把链接都存进工作流",
modelSourcesKeptAll: "已把 {count} 个链接存进工作流",
modelSourcesWorkflowEmpty: "画布上没有用到模型",
modelSourcesNoteTitle: "模型来源清单",
modelSourcesNoteFile: "文件",
modelSourcesNoteLink: "链接",
modelSourcesNoteCount: "{count} 个模型",
modelSourcesScopeWorkflow: "当前工作流",
modelSourcesScopeLibrary: "全部模型",
modelSourcesFilterAll: "全部",
modelSourcesFilterResolved: "有链接",
modelSourcesFilterUnresolved: "没填链接",
modelSourcesSearchPlaceholder: "搜索模型或节点",
modelSourcesGenerateNoteNode: "写进画布便签",
modelSourcesCopySummary: "复制清单",
modelSourcesCopied: "已复制清单",
modelSourcesNoteCreated: "已在画布上加了一张来源便签",
modelSourcesAutoDetect: "自动查找",
modelSourcesSavedLocal: "已存进模型信息",
modelSourcesStatusMissingOnDisk: "本机没有",
modelSourcesStatusUnfilled: "没填链接",
modelSourcesStatusUnfilledOptional: "可以不填",
modelSourcesComponentsAdvanced: "基础组件 {count} 个",
modelSourcesComponentsOptionalHint: "VAE、文本编码器这类,链接可以不填",
modelSourcesLibraryLoading: "正在读取全部模型…",
modelSourcesLibraryLoadFailed: "全部模型没有读出来。",
modelSourcesRetry: '重试',
modelSourcesTypeTextEncoder: '文本编码器',
modelSourcesTypeVae: 'VAE',
modelSourcesTypeVaeApprox: '预览 VAE',
modelSourcesTypeVisionEncoder: '视觉编码器',
modelSourcesLocalTargetUnknown: "本机找不到这个模型的文件,链接没地方存。",
modelSourcesNoModelsFound: "没有符合的模型",
modelSourcesUrlPlaceholder: "粘贴下载页链接,哪个网站都行",
sidebarManageFolders: '文件夹管理',
sidebarVideoPlayback: "视频封面",
sidebarAlwaysPlay: "一直播放",
sidebarHoverPlay: "鼠标停上才播(推荐)",
sidebarCardQuality: "卡片图片",
sidebarOptimizedThumbnail: "缩略图(推荐)",
sidebarOriginalCover: "原图",
delSure: '确认删除?',
dockTitle: '侧边停靠',
maximizeTitle: '全屏 / 还原(双击标题栏也可以)',
replaceAll: '全部替换',
editRaw: '编辑全文',
findPlaceholder: '查找...',
replacePlaceholder: '替换为...',
models: '模型',
gallery: '图库',
settingsBtn: '设置',
importBtn: '导入工作流 (分享码)',
recipeTitle: '工作流',
recipeSaveCurrent: '保存当前工作流',
recipeSaveTitle: '保存为工作流配方',
recipeName: '名称',
recipeDefaultName: '新工作流配方',
recipeNameRequired: '请填写配方名称。',
recipeTags: '标签',
recipeTagsHint: '例如:人像, SDXL, 放大',
recipeNotes: '备注',
recipeNotesHint: '记录这个版本为什么好用……',
recipeThumbnail: '工作流缩略图',
recipeCancel: '取消',
recipeSave: '保存',
recipeSaving: '正在保存…',
recipeVerificationMissing: '发现 {count} 个模型缺少核验信息',
recipeVerifyOnSave: '保存时核验并写入完整 SHA-256',
recipeVerifyOnSaveHint: '默认不核验;选中后保存可能需要更长时间。',
recipeSaveReceipt: '已保存:{nodes} 个节点,{links} 条连线,{groups} 个分组。',
recipeSaveReceiptMismatch: '已保存,但完整性回执与当前画布不一致;请重新打开配方核对。',
recipeLoadError: '无法加载工作流配方。',
recipeUntitled: '未命名配方',
recipeSearchPlaceholder: '搜索名称、笔记或标签…',
recipeNoMatches: '没有匹配的配方。请清除搜索或标签筛选。',
recipeExport: '导出配方包',
recipePackageExportTitle: '导出配方包:{name}',
recipePackageExportIntro: '把这个配方的工作流、名字、备注、标签、参数、封面和模型缩略图打成一个压缩包发给别人。对方在“工作流”页的 ⇅ 里拖进去,就多一张配方卡片。',
recipePackageHistory: '带上版本历史',
recipePackageHistoryHint: '你改过的旧版本。给别人一般不用带。',
recipePackageExportStart: '导出',
recipePackageExported: '已经下载:{name}({size})。用 QQ、微信发的时候按“文件”发。',
recipePackageImportTitle: '导入配方包',
recipePackageImportWhat: '配方“{name}”:{cover},{pictures} 张模型缩略图。',
recipePackageImportCover: '有封面',
recipePackageImportNoCover: '没有封面',
recipePackageImportHistory: '还带了 {count} 个旧版本。',
recipePackageImportRenamed: '你已经有同名的配方,这个会存为“{name}”,原来的不动。',
recipePackageImportModels: '缺的模型,打开工作流时“模型检查”会提示,能一键下载。',
recipePackageKeep: '存为配方',
recipePackageKeepAndOpen: '存为配方并打开',
recipePackageImported: '已存为配方:{name}',
recipeAppendCanvas: '追加到画布',
recipeAppendError: '无法追加此配方到当前画布。',
recipeOpenCanvas: '新画布打开',
recipeOpenError: '无法在新画布中打开此配方。',
recipeDragHint: '按住拖拽至画布打开工作流',
recipeDragTargetCanvas: '释放以在画布打开工作流',
recipeCardDragHint: '按住卡片可拖拽至画布打开工作流',
recipeCardPrimaryActionTooltipComplete: '在新画布中打开工作流(也可直接按住卡片拖至画布)',
recipeCardPrimaryActionTooltipPartial: '追加模块至当前画布(也可直接按住卡片拖至画布)',
recipeEmptyGuideTitle: '工作流配方工坊暂无配方',
recipeEmptyGuideSubtitle: "把调好的工作流连同模型和参数存下来,下次直接用。",
recipeEmptyStep1Title: '1. 保存当前工作流',
recipeEmptyStep1Desc: "点右上角“保存当前工作流”,把画布上的工作流和参数存成配方。",
recipeEmptyStep2Title: '2. 画布直接拖拽',
recipeEmptyStep2Desc: "按住配方卡片拖到画布空白处松开,整套工作流就载入了,不用重新连线。",
recipeEmptyStep3Title: "3. 缺模型也不怕",
recipeEmptyStep3Desc: "打开配方时,模型检查会在本机找出改过名、换过文件夹的模型,帮你换上。",
recipeEmptySaveCurrentBtn: '保存当前工作流',
recipeScopePartialSaveHint: "这不是能单独运行的完整工作流(比如没有输出节点),会存成“功能模块”:用的时候加到现有画布上。",
recipeScopeCompleteSaveHint: "这是能单独运行的完整工作流,以后可以直接在新画布里打开。",
recipeDelete: '删除',
recipeDeleteConfirm: '确定删除这个工作流配方吗?配方、历史版本和图片会移到系统回收站。',
recipeDeleteError: '删除工作流配方失败。',
recipeSaveError: '保存工作流配方失败。',
recipeCopyParameter: '复制参数值',
recipeCopied: '已复制',
recipeCopyFailed: '复制失败',
recipeAdvancedInfo: '高级信息',
recipeInlineEditName: '点击修改名称',
recipeInlineEditNotes: '点击修改备注',
recipeInlineEditTags: '编辑标签',
recipeMissingNodes: '当前缺少以下节点类型,恢复后可能无法运行',
recipeBindImage: '封面',
recipeNoImage: '不要封面',
recipeCanvasPreview: '当前画布',
recipeLoadingRecentImages: '正在读取最近生成结果…',
recipeRecentImagesUnavailable: '暂时无法读取最近生成结果。',
recipeKeepImage: '保留当前封面',
recipeEdit: '编辑',
recipeEditTitle: '编辑工作流配方',
recipeHistory: '版本历史',
recipeHistoryEmpty: '还没有历史版本。更新配方后会自动保留旧版本。',
recipeUnknownVersion: '未知时间',
recipeRestoreVersion: '恢复此版本',
recipeRestoreVersionConfirm: '恢复此版本会覆盖当前配方,但当前内容会先自动存入历史。继续吗?',
recipeEditCanvas: '载入画布编辑',
recipeEditCanvasConfirm: '载入会替换当前画布。完成结构编辑后,点击“更新当前配方”即可保存为新版本。继续吗?',
recipeUpdate: '保存更新',
recipeUpdateCurrent: '更新当前配方',
recipeUpdateError: '更新工作流配方失败。',
recipeDetailBack: '返回配方列表',
recipeGallery: '图库',
recipeGalleryLoading: '正在查找匹配的历史出图…',
recipeGalleryEmpty: '未在最近 200 张含工作流数据的 PNG 中找到与此配方结构匹配的出图。',
recipeGalleryRefresh: '刷新匹配结果',
recipeGalleryLoadError: '无法读取配方图库。',
recipeGalleryScanHint: '已检查最近 {count} 张含工作流数据的 PNG。',
recipeGalleryOpenImage: '查看原图',
recipeGalleryDifferenceHint: '以下是节点参数的差异;图库匹配本身只关注节点类型。',
recipeParameterSnapshots: '已存参数方案',
recipeParameterLoading: '正在读取预设…',
recipeParameterLoadError: '无法读取预设列表。',
recipeParameterUntitled: '未命名参数方案',
recipeParameterDelete: '删除方案',
recipeParameterDeleteConfirm: '确定删除参数方案“{name}”吗?会移到系统回收站。',
recipeParameterDeleteError: '无法删除预设,请稍后重试。',
recipeParameterNew: '新建参数方案',
recipeParameterReadCurrent: '从当前画布保存新方案',
recipeParameterReadCurrentError: '无法读取当前画布参数。',
recipeParameterSkeletonMismatch: '当前画布缺少配方必需的核心节点,无法直接应用参数。',
recipeParameterWidgetMismatch: '当前画布的节点输入项与预设不一致:',
recipeParameterNodeUnavailable: '无法在当前画布中定位匹配节点:',
recipeParameterApply: '应用到当前画布',
recipeParameterApplied: '已应用 {count} 项参数',
recipeParameterApplyError: '应用参数失败,当前画布未完成修改。',
recipeParameterNewHint: '基于当前配方骨架编辑节点参数;种子等运行时变化值会被忽略。保存后会生成新的只读快照,不会覆盖历史记录。',
recipeParameterName: '笔记名称',
recipeParameterSave: '保存参数方案',
recipeParameterCancel: '取消编辑',
recipeParameterSaveError: '参数方案保存失败。',
recipeParameterSensitiveHidden: '敏感控件已隐藏',
recipeDetailUnknownNode: '未命名节点',
recipeDetailWidget: '控件',
recipeDetailScheduler: '调度器',
recipeDetailSteps: '步数',
recipeDetailCFG: 'CFG',
recipeDetailDenoise: '降噪',
recipeDetailNoSavedParameters: '此配方没有可展示的参数。',
recipeDetailVersions: '版本',
recipeDetailModelComposition: "用到的模型",
recipeDetailBaseModel: '主模型',
recipeDetailNotIndexed: '尚未索引',
recipeDetailSampler: '采样器',
recipeDetailResolution: '分辨率',
recipeDetailUnavailable: '不可用',
recipeDetailNoNotes: '没有备注。',
recipeDetailUpdated: '更新时间',
recipeDetailCopyFingerprint: '复制工作流指纹',
recipeDetailPrompts: '提示词',
recipeDetailNoPrompts: '此配方没有可安全展示的提示词摘要。',
recipePromptSupportNotice: '当前仅自动识别 ComfyUI 原生 CLIPTextEncode 与已知官方连接;第三方文本节点请手动标注。',
recipePromptRoleChoose: '选择提示词角色',
recipePromptRoleAutomatic: '自动识别',
recipePromptRoleManual: '用户手动标注',
recipePromptRolePositive: '正面提示词',
recipePromptRoleNegative: '负面提示词',
recipePromptRoleBoth: '正负共用',
recipePromptRoleIgnored: '忽略',
recipePromptRoleUnknown: '角色未确定',
recipePromptRoleSaveError: '无法保存提示词角色,请稍后重试。',
recipeDetailVolatileIgnored: '运行时变化,已忽略',
recipeDetailExpandValue: '展开完整内容',
recipeDetailCollapseValue: '收起内容',
recipeDetailAvailable: '本机可用',
recipeDetailMissing: '本机缺失',
recipeDetailAvailabilityNotChecked: '尚未检查本机',
recipeDetailNoModelReferences: '没有识别到受支持的模型加载器。其他自定义控件保留在参数和完整工作流中。',
recipeDetailModel: '模型',
recipeOpenLocalModel: '打开本地模型详情',
recipeModelNoteAdd: '添加模型备注',
recipeModelNoteEdit: '编辑模型备注',
recipeModelNoteEmpty: '暂无个人模型备注',
recipeModelNoteTitle: '模型个人备注',
recipeModelNotePrompt: '记录这个模型在当前配方中的用法、建议权重或注意事项。留空保存即可删除备注。',
recipeModelNoteError: '无法保存模型备注。',
recipeDetailCurrentVersion: '当前版本',
recipeCompareVersion: '对比此版本',
recipeDiffLoading: '正在比较…',
recipeDiffSummary: '变更摘要',
recipeDiffBefore: '之前',
recipeDiffAfter: '之后',
recipeDiffNoChanges: '两个版本没有检测到有意义的变更。',
recipeDiffError: '无法读取此历史版本。',
recipeDiffPinned: '钉选参数',
recipeDiffPrompts: '提示词',
recipeDiffModels: '模型引用',
recipeDiffParameters: '参数摘要',
recipeDiffWorkflow: '工作流结构',
recipeDiffPresentation: '展示信息',
recipeDiffOther: '其他',
recipeDetailUnknownTime: '未知时间',
recipeParameterRename: '重命名',
recipeParameterRenamePrompt: '请输入参数方案的新名称:',
recipeParameterRenameError: '重命名参数方案失败',
recipeStatusReady: "模型都在本机",
recipeStatusChecking: "正在看本机有没有这些模型…",
recipeStatusNoModels: "没有识别到模型加载节点",
recipeMissingHint: "放到画布上以后,模型检查会帮你在本机找(改过名、换过文件夹的也能找到),找不到的会告诉你去哪下。",
recipeModelDownloadPage: "下载页",
recipeStatusMissing: "缺 {count} 个模型",
recipeStatusChecking: '⏳ 检查环境中…',
recipeRawNodesShowMore: '展开其余 {count} 个节点…',
recipeCardSpecsSteps: '步数',
recipeCardSpecsSampler: '采样',
recipeCardSpecsResolution: '尺寸',
audioVoiceClipCount: "{count} 条声音",
audioSearchCharacters: "搜索角色或情绪",
audioPlay: "播放试听",
audioCopyTagLabel: "复制 {tag}",
audioCopyMainHint: "粘贴到配音文字里:后面的句子换回默认语气",
audioCopyEmotionHint: "粘贴到配音文字里:后面的句子用「{emotion}」的语气读",
audioCopied: "已复制",
audioGuideTitle: "音频工作台使用说明",
audioGuideFilesTitle: "第一步:导入角色",
audioGuideFilesBody: "点“导入角色”,或者直接把 GPT、SoVITS 模型和参考音频拖进来(好几个角色、整个文件夹也行,会按名字自动分好)。卡片上的“编辑情绪”给每种情绪挑一条参考音频,“读音”纠正总念错的词。存放位置和基础文件在左边侧栏最下面的“GPT-SoVITS 设置”里。",
audioGuideDragTitle: "拖动:把角色放到节点上",
audioGuideDragBody: "拖角色卡片的标题栏(或左边侧栏里的角色名)→ 放到“角色语音 (GPT-SoVITS)”节点上:设为这个角色。拖动时鼠标旁的提示会写明“松手会发生什么”;放错节点会说明原因,不会乱写。",
audioGuideTagsTitle: "情绪靠台词里的 {标签}",
audioGuideTagsBody: "台词里的标签切换情绪:写 {开心} 或 {happy} 就换成这种情绪的参考音频,写 {main} 回到主声音。设了情绪的角色,每行右边有“复制 {标签}”按钮。还支持 [角色名] 换人说、[pause:1s] 插入停顿,直接写在台词里即可。",
audioGuideScriptTitle: "配音:不用手写标签",
audioGuideScriptBody: "在“角色语音”页顶部切到“配音”,先在左边点要念的角色,粘贴整段台词,点“分成句子”,每句会变成一张卡片。点卡片选中(Ctrl / Shift 可多选),双击改台词;要换人念,点左边的角色或卡片上的名字。每句可以单独选情绪,也可以拆分、合并、删除。点句子上的 ▶ 可以试听,然后点“生成语音”;要用自己的工作流,下面的“放进自己的工作流”可以推送到节点、拖到节点或复制,角色和台词会一起填好。",
audioGuideGenerateTitle: "生成与音频库",
audioTourImportTitle: "导入角色",
audioTourImportBody: "点这里导入 GPT、SoVITS 模型和参考音频;也可以直接把文件或整个文件夹拖到这一页。",
audioTourDragTitle: "拖到节点上",
audioTourDragBody: "按住角色卡片的标题栏,拖到画布上的“角色语音 (GPT-SoVITS)”节点,就换成这个角色。",
audioTourEditTitle: "情绪和读音",
audioTourEditBody: "“编辑情绪”给每种情绪挑一条参考音频;“读音”纠正总念错的词;“添加文件”往这个角色里补音频。",
audioTourTagTitle: "情绪标签",
audioTourTagBody: "点一下复制这个 {标签},写进台词里,后面的句子就换成这种情绪的声音。",
audioTourScriptTitle: "配音",
audioTourScriptBody: "写台词、生成语音在这一页:粘贴整段台词,每句点选情绪,直接生成;也可以推送到节点,用你自己的工作流。",
audioTourGalleryTitle: "音频库",
audioTourGalleryBody: "生成的音频都在这里,可以试听、按台词搜索。",
audioTourSettingsTitle: "GPT-SoVITS 设置",
audioTourSettingsBody: "角色存放在哪、基础文件下载、平时用哪种语气,都在这里设置。",
audioGuideGenerateBody: "在“配音”页点“生成语音”,不用碰画布,结果存到 output/audio/角色名/;某一句不满意可以只重来这一句。之后到“音频库”试听、按台词搜索;只在预览里出现的临时结果,可以点保存留下来。",
audioEngineInstallTitle: "{engine} 需要先安装节点包 {pack}",
audioEngineDesc: "GPT-SoVITS(Anomalous TTS):使用你训练好的 GPT-SoVITS 角色模型,音色还原度高;支持多句一起生成、多角色对话和停顿标签。",
audioEngineInstallHow: "安装方法:打开 ComfyUI Manager,搜索“{search}”并安装(或打开项目主页按说明安装),然后重启 ComfyUI。",
audioEngineOpenRepo: "打开项目主页",
audioSectionCharactersOf: "{engine} 角色",
audioDragCardHint: "拖标题栏 → GPT-SoVITS 节点",
audioDragCharacterTitle: "拖到 GPT-SoVITS 节点:角色设为 {character}。情绪在台词里用 {标签} 切换。",
ttsPronounceOpen: '读音',
ttsPronounceTitle: '读音:{name}',
ttsPronounceSubtitle: '剧本里写左边的字,这个角色就读右边的字。剧本和字幕照常写,只影响念出来的声音',
ttsPronounceTips: '长的先匹配,只替换一遍。日语模型说中文时:发不好的音(选、全这类 ü,模型、行这类后鼻音)换成好读的同音字,或在前面加个字;英文字母写成读音相近的汉字(C站 → 西站);多音字读错就换成同音字(粘进 → 沾进)。右边留空表示不读。',
ttsPronounceLanguage: '试听语言',
ttsPronounceFromPlaceholder: '剧本里写的',
ttsPronounceToPlaceholder: '让角色读成',
ttsPronounceNow: '现在',
ttsPronounceNowHint: '听这个角色现在怎么读左边的字(已保存的读音表会生效)',
ttsPronounceAfter: '改后',
ttsPronounceAfterHint: '听右边的字读出来是什么样',
ttsPronounceAdd: '+ 添加一条',
ttsPronounceFromMissing: '有一条只写了读法({to}),左边要写剧本里的字',
ttsPronounceDuplicate: '“{from}”写了两遍,请合并成一条',
ttsEditorOpen: "参考音频与情绪",
ttsRefsTitle: "参考音频 · {name}",
ttsRefsSubtitle: "上面选一个声音,下面给它挑参考音频:主参考决定语气和念法,副参考用来融合音色。保存后写进角色文件夹里的 anomalous_tts.json。",
ttsRefsMainVoice: "主声音",
ttsRefsCountMain: "1 主",
ttsRefsCountAux: "1 主 {aux} 副",
ttsRefsCountAuto: "自动",
ttsRefsCountAutoAux: "自动 + {aux} 副",
ttsRefsCountNone: "还没选主参考",
ttsRefsNewEmotion: "新情绪",
ttsRefsNewEmotionPrompt: "新情绪的名字,例如 开心(剧本里标上这个情绪的句子就用它)",
ttsRefsNameMissing: "情绪名不能为空",
ttsRefsRename: "改名",
ttsRefsRenamePrompt: "情绪的新名字(剧本里用旧名字标的句子要跟着改)",
ttsRefsDelete: "删除这个情绪",
ttsRefsDeleteConfirm: "删除情绪“{name}”?音频文件不会删,只是不再用它。",
ttsRefsMainHint: "剧本里没标情绪的句子用主声音。",
ttsRefsMainAuto: "主声音的主参考现在是节点自动挑的({file})。在下面点“主参考”就换成你选的。",
ttsRefsBackToAuto: "改回自动挑",
ttsRefsEmotionHint: "剧本里标了“{name}”的句子用这个声音。",
ttsRefsFromFilename: "这个情绪来自文件名(原名.情绪.wav):可以换主参考、加副参考;要改名或删掉,改文件名。",
ttsRefsSearch: "搜台词或文件名",
ttsRefsFilter_all: "全部 {count}",
ttsRefsFilter_here: "这个声音用的 {count}",
ttsRefsFilter_used: "已用上 {count}",
ttsRefsFilter_noline: "没台词 {count}",
ttsRefsNoLine: "没找到台词,点这里填",
ttsRefsLineBack: "保存后换回文件里的台词",
ttsRefsNeedsUpdate: "副参考和改台词需要 Anomalous_TTS 1.1.0(接口 18),先在 GPT-SoVITS 设置里更新。",
ttsRefsSeconds: "{seconds} 秒",
ttsRefsTooLongShort: "主参考要 3~10 秒;这条可以当副参考。",
ttsRefsUse_main: "{name}·主",
ttsRefsUse_aux: "{name}·副",
ttsRefsUse_auto: "节点自动挑的",
ttsRefsMain: "主参考",
ttsRefsAux: "副参考",
ttsRefsMainHintRow: "设为这个声音的主参考(决定语气和念法,只有一条)",
ttsRefsMainOffHint: "再点一下:改回让节点自动挑",
ttsRefsAuxHintRow: "加为副参考:音色和主参考取平均,可以加好几条,不需要台词",
ttsRefsAuxVersion: "这个角色是 {version} 模型,只有 v1 / v2 / v2Pro 用得上副参考。",
ttsRefsNote: "副参考建议用同一个人、音质干净的 2~4 条。",
ttsRefsNothing: "没有符合的音频。",
ttsRefsShowMore: "再显示一些(还有 {count} 条)",
ttsRefsNoMain: "情绪“{name}”还没选主参考。",
ttsRefsCloseUnsaved: "有改动还没保存,确定关闭吗?",
ttsEditorRemove: "删除这一行",
ttsEditorSave: "保存",
ttsEditorSaveFailed: "保存失败:{error}",
ttsEditorLoadingFiles: "正在读取这个角色的音频列表…",
ttsEditorFileCount: "这个角色有 {count} 条音频。",
ttsEditorLoadFailed: "读取音频列表失败:{error}",
ttsEditorUnknownAudio: "{file} 不在这个角色的文件夹里",
ttsEditorNameInvalid: "情绪名“{name}”不能用:不能叫 main,也不能带 {} [] 这些符号",
ttsEditorNameDuplicate: "情绪名“{name}”重复了",
ttsCharacterError: "这个角色读取失败:{error}",
ttsMainMissing: "没有找到合适的主声音(3~10 秒的参考音频)。点“编辑情绪”选一条。",
ttsEmptyTitle: "还没有角色",
ttsEmptyDesc: "把 GPT 模型(.ckpt)、SoVITS 模型(.pth)和参考音频拖到这里,或者点下面的按钮,就能做出第一个角色。",
ttsSetupTitle: "GPT-SoVITS 设置",
ttsSetupCharacters: "{count} 个角色",
ttsSetupDownloading: "基础文件下载中…",
ttsSetupPackagesMissing: "缺 {count} 个 Python 包",
ttsSetupPretrained: "基础文件",
ttsSetupPackages: "Python 包",
ttsSetupRemote: "这些操作只能在运行 ComfyUI 的那台电脑上进行(当前是从别的设备打开的)。",
ttsSetupFailed: "操作失败:{error}",
ttsSetupDotPretrained: "有基础文件还没下载,点开看看",
ttsSetupDotPackages: "缺 Python 包,点开看怎么装",
ttsReminderText: "你的角色用到的基础文件还有 {count} 个没下载(约 {size})。第一次生成时会自动下载,也可以现在下载。",
ttsReminderDownload: "现在下载",
ttsReminderDismiss: "不再提醒",
ttsImportPretrainedNote: "生成时还要用到基础文件:{files}(约 {size}),第一次生成时会自动下载。",
ttsSetupStorage: "角色存放位置",
ttsSetupOtherPlaces: "其他位置",
ttsStorageHint: "导入的角色放在这里。要换位置,先把角色文件夹自己移过去,再改下面的设置文件(storage)。",
ttsOtherPlacesHint: "这些位置里的角色照样能用。设置文件里的(libraries)在那里删掉,重启 ComfyUI 后就不再列出;文件不会删除。",
ttsLibrarySource_default: "默认",
ttsLibrarySource_yaml: "yaml 配置",
ttsLibrarySource_app: "设置文件",
ttsLibraryMissing: "文件夹不存在",
ttsNeededFor_all: "所有模型",
ttsNeededFor_zh: "中文",
ttsNeededFor_en: "英语",
ttsNeededFor_ja: "日语",
ttsNeededFor_v2pro: "v2Pro 模型",
ttsPresetsTitle: "语气档位",
ttsPresetsHint: "所有角色通用,改了马上保存。单个角色可以在卡片上的“专属设置”里另选;节点上改过的数字最优先。",
ttsPresetsSaved: "已保存。",
ttsPresetsSaveFailed: "保存失败:{error}",
ttsPresetsNeedsNode: "语气档位需要 Anomalous_TTS v1.1.0 或更新的版本,可以在下面的“Anomalous_TTS 版本”里更新。",
ttsPreset_stable: "平稳",
ttsPreset_standard: "自然",
ttsPreset_lively: "生动",
ttsPresetDesc_stable: "少念错,语气平",
ttsPresetDesc_standard: "不快不慢,以前的默认",
ttsPresetDesc_lively: "更有感情,偶尔念错",
ttsPresetsLanguages: "角色说的不是参考音频的语言时(比如日语角色说中文),用哪种语气。",
ttsPresetsPair: "{ref}角色说{lang}",
ttsPresetsCross: "其他语言组合",
ttsPresetCustom: "自建",
ttsPresetDescCustom: "你自建的",
ttsPresetWas: "原 {value}",
ttsPresetResetOne: "恢复内置",
ttsPresetNew: "+ 新建",
ttsFeelSteady: "← 更稳,少念错",
ttsFeelLively: "更活,起伏大 →",
ttsFeelLegend: "空心圈:{base} 实心点:这一档",
ttsFeel_about: "和{base}差不多。",
ttsFeel_steadier: "比{base}稳一些。",
ttsFeel_muchSteadier: "比{base}稳很多。",
ttsFeel_livelier: "比{base}活一些。",
ttsFeel_muchLivelier: "比{base}活很多。",
ttsFeelYourDefault: "你的默认({name})",
ttsFeelIsDefault: "这就是你的默认,其他档都拿它来比。",
ttsFeelEditHint: "点一下就能改,改完马上存进这一档",
ttsListen: "▶ 试听这一档",
ttsListenAgain: "▶ 再听一次",
ttsListenMaking: "生成中…",
ttsListenHint: "用同一个种子读同一句,只换语气,方便对比。第一次要加载模型,会慢一点。",
ttsListenHeard: "听过的:",
ttsListenWho: "试听:",
ttsPresetDefaultBadge: "默认",
ttsPresetIsDefault: "所有角色默认用这一档",
ttsPresetMakeDefault: "设为默认",
ttsPresetNewName: "新语气的名字(最多 {count} 个字)。数字先照抄“{from}”,建好再改。",
ttsPresetRename: "改名",
ttsPresetRenameAsk: "“{name}”的新名字",
ttsPresetNameTaken: "已经有叫“{name}”的语气了,换个名字吧。",
ttsPresetTooMany: "自建的语气最多 {count} 个。",
ttsPresetDelete: "删除",
ttsPresetDeleteAsk: "删除语气“{name}”?",
ttsPresetDeleteUses: "正在用它的:{list}。删掉后这些地方改回跟通用设置。",
ttsPresetUseDefault: "默认档",
ttsTuningOpen: "专属设置",
ttsTuningTitle: "专属设置:{name}",
ttsTuningSubtitle: "这个角色说每种语言时用哪种语气、快慢多少。不选就和 GPT-SoVITS 设置里的一样。每行下面是实际用的数字,蓝底的和通用的不一样。",
ttsTuningAll: "所有语言",
ttsTuningLang: "说{lang}",
ttsTuningFollow: "和通用一样({preset})",
ttsTuningSpeed: "快慢",
ttsTuningNumbers: "调数字",
ttsTuningNumbersHint: "空着的用上面这一档的数字(灰字)。",
ttsTuningBadNumber: "“{name}”的数字超出范围。",
ttsTuningActual: "实际用:",
ttsTuningSameAsGeneral: "和通用设置一样:",
ttsTuningGeneralValue: "通用设置是 {value}",
ttsVersionTitle: "Anomalous_TTS 版本",
ttsVersionHint: "Anomalous_TTS 的稳定版本。点“检查更新”才会联网;更新后要重启 ComfyUI 才生效,不合适可以点“回到”退回去。",
ttsVersionCheck: "检查更新",
ttsVersionChecking: "正在查看已发布的版本…",
ttsVersionUpToDate: "已是最新的稳定版",
ttsVersionNew: "有新的稳定版 {tag}",
ttsVersionUpdate: "更新到 {tag}",
ttsVersionNotes: "看更新内容",
ttsVersionUndo: "回到 {tag}",
ttsVersionConfirm: "把 Anomalous_TTS 从 {from} 更新到 {tag}?\n\n更新后要重启 ComfyUI 才生效。",
ttsVersionUpdated: "Anomalous_TTS 已换成 {tag}。",
ttsVersionUnknown: "读不到版本",
ttsVersionNoGit: "这里只能更新从 GitHub 用 git 安装的 Anomalous_TTS(ComfyUI Manager 就是这样装的)。现在这份不是,请在 ComfyUI Manager 里更新。",
versionError_tts_missing: "没找到用 git 安装的 Anomalous_TTS,请在 ComfyUI Manager 里更新。",
ttsNeededFor_v3: "v3 模型",
ttsNeededFor_v4: "v4 模型",
ttsNeededFor_v5dev: "v5dev 模型",
ttsNeededFor_v5turbo: "v5turbo 模型",
ttsModelVersion: "GPT-SoVITS {version} 模型",
ttsPretrainedOk: "已就绪",
ttsPretrainedMissing: "缺少",
ttsPretrainedOptional: "缺少(可选)",
ttsPretrainedQueued: "等待下载",
ttsPretrainedDownloading: "下载中 {percent}%",
ttsPretrainedError: "下载失败",
ttsPretrainedDownload: "下载(约 {size})",
ttsPretrainedDownloadAll: "全部下载(约 {size})",
ttsPretrainedSource: "基础文件来源",
ttsPretrainedHint: "第一次生成时会自动下载;只说日语的角色不需要中文那几项。标“可选”的缺了也能用,只是效果差一点。电脑上有 GPT-SoVITS 整合包的,可以在设置文件里写上它(pretrained),直接用包里的。",
ttsPackagesFor: "{lang}缺少 {packages}",
ttsPackagesHint: "在命令行运行上面的命令,然后重启 ComfyUI。",
ttsCopyCommand: "复制命令",
ttsCopied: "已复制",
ttsCopyPath: "复制路径",
ttsSettingsFile: "设置文件",
ttsSettingsFileHint: "存放位置(storage)、其他角色文件夹(libraries)、GPT-SoVITS 整合包(pretrained)都在这个文件里改,界面上改不了:节点不接受网页指定的本机路径。路径写完整,例如 \"storage\": \"D:/voices\";改完不用重启。",
ttsKind_gpt: "GPT",
ttsKind_sovits: "SoVITS",
ttsKind_audio: "音频",
ttsKind_text: "台词",
ttsImportOpenShort: "导入角色",
ttsImportOpen: "+ 导入角色",
ttsImportAddOpen: "添加文件",
ttsImportTitle: "导入 GPT-SoVITS 角色",
ttsBatchPickFolder: "选择文件夹…",
ttsBatchScanTruncated: "文件太多,只列出了前 {count} 个。",
ttsBatchNewDraft: "+ 新角色",
ttsBatchUnnamed: "未命名角色",
ttsBatchTray: "未分配",
ttsBatchSubmit: "导入 {count} 个角色",
ttsBatchMoveTo: "属于哪个角色",
ttsBatchRowProblem: "有文件出错或不能导入:处理掉标红的那一行",
ttsBatchDuplicateName: "列表里有两个角色都叫“{name}”,请改一个",
ttsBatchNoAudio: "至少放一条参考音频",
ttsStepFiles: "放入文件",
ttsStepImport: "导入",
ttsHeroTitle: "把角色的文件拖到这里",
ttsHeroClips: "参考音频",
ttsHeroDesc: "每个角色要一个 GPT 模型、一个 SoVITS 模型和几段参考音频;有台词文件(.list / .lab / .txt)就一起放。可以一次放好几个角色,或者整个文件夹,会按名字自动分好。",
ttsHeroClipsLength: "3~10 秒",
ttsLayoutTitle: "📁 推荐的文件夹放法",
ttsLayoutRoot: "我的声音",
ttsLayoutRootNote: "选这个文件夹",
ttsLayoutCharA: "阿罗娜",
ttsLayoutCharB: "普拉娜",
ttsLayoutCharNote: "一个角色一个文件夹,文件夹名就是角色名",
ttsLayoutClip: "早上好",
ttsLayoutClipNote: "参考音频,3~10 秒,可以放好几段",
ttsLayoutLineNote: "这段音频的台词,同名(可选)",
ttsLayoutMore: "其他角色一样放",
ttsLayoutFoot: "GPT-SoVITS 整合包也可以直接选整个包:GPT_weights 和 SoVITS_weights 里的模型按文件名分成角色。分不出来的文件会单独列出来,让你选它属于谁。",
ttsMenuUploadHint: "从浏览器上传",
ttsAddMore: "+ 继续添加",
ttsToolbarFound: "{count} 个角色",
ttsToolbarAdding: "添加到「{name}」",
ttsFooterWaiting: "{count} 个还要处理",
ttsFooterTray: "{count} 个文件没分配",
ttsFooterSaveTo: "保存到 {path}",
ttsFooterImportOne: "导入",
ttsDropCover: "松开,放进来",
ttsCardReady: "可以导入",
ttsCardBusy: "处理中…",
ttsCardDone: "已导入",
ttsCardFileProblem: "有文件出错",
ttsCardFailed: "导入失败",
ttsCardEmotionProblem: "情绪名有误",
ttsCardGpt: "GPT 模型",
ttsCardSovits: "SoVITS 模型",
ttsCardClips: "音频 {count}",
ttsCardAddTo: "添加到",
ttsCardNamePlaceholder: "给角色起个名字",
ttsCardNameTitle: "角色名,可以直接改",
ttsCardFold: "收起",
ttsCardUnfold: "展开",
ttsCardRemove: "移除这个角色",
ttsCardRemoveConfirm: "移除「{name}」和它的 {count} 个文件?原文件不受影响。",
ttsCardClipsTitle: "参考音频 · {count}",
ttsCardClipsHint: "主声音选一段 3~10 秒、说得清楚的;其他的填上情绪名,比如“开心”",
ttsCardAddClips: "+ 添加音频",
ttsCardLineFiles: "台词文件",
ttsCardAddLineFile: "+ 添加",
ttsCardMainOn: "这是主声音:剧本里没标情绪的部分用它",
ttsCardMainEmotion: "主声音",
ttsCardMoveHere: "属于 {name}",
ttsCardMoveTo: "移到 {name}",
ttsCardTrayTitle: "{count} 个文件不知道属于哪个角色",
ttsCardTrayHint: "在每个文件右边选它属于哪个角色;不需要的点 × 去掉。",
ttsStepChoose: "选方式",
ttsChooseTitle: "你手上有什么?",
ttsMode_single: "一个角色",
ttsMode_single_desc: "这个角色的 GPT 模型、SoVITS 模型和几段参考音频。会一步步带你放好。",
ttsMode_batch: "很多角色 / 整合包",
ttsMode_batch_desc: "一次导入好几个角色,或者选一个 GPT-SoVITS 整合包文件夹,会按名字自动分好。",
ttsMode_add: "给已有角色加声音",
ttsMode_add_desc: "往已经导入的角色里加参考音频、台词文件或新模型。",
ttsModePickCharacter: "加给哪个角色?",
ttsChooseAgain: "‹ 换一种方式",
ttsToolbarSingle: "新角色",
ttsSoloDropHint: "也可以直接把文件拖进这个窗口",
ttsTourReplay: "看引导",
ttsCardSteps: "还差 {count} 步",
ttsCardPickFile: "选择文件",
ttsCardPickShort: "选择",
ttsCheckGpt: "放 GPT 模型(.ckpt,在整合包的 GPT_weights 文件夹里)",
ttsCheckGptDone: "GPT 模型",
ttsCheckSovits: "放 SoVITS 模型(.pth,在整合包的 SoVITS_weights 文件夹里)",
ttsCheckSovitsDone: "SoVITS 模型",
ttsCheckSovitsUnsupported: "这个 SoVITS 是 {version} 模型,装的 Anomalous_TTS 太旧,更新后就能用",
ttsCheckSovitsUnknown: "认不出这个 SoVITS 的版本,换一个 GPT-SoVITS 训练出的 .pth",
ttsCheckAudio: "放几段参考音频(3~10 秒、说得清楚的)",
ttsCheckAudioDone: "参考音频 {count} 段",
ttsCheckMain: "在下面的音频里点 ☆,选一段当主声音",
ttsCheckMainDone: "主声音:{file}",
ttsCheckMainGo: "去选",
ttsCheckName: "给角色起个名字",
ttsCheckNameTaken: "“{name}”已经有了,换个名字",
ttsCheckNameTwice: "列表里还有一个“{name}”,换个名字",
ttsCheckNameDone: "名字:{name}",
ttsCheckNameGo: "填名字",
ttsCheckFiles: "放要加的参考音频、台词文件或新模型",
ttsCheckFilesDone: "要加的文件 {count} 个",
ttsBatchNoMain: "选一段 3~10 秒的音频当主声音",
ttsTourSingleTitle: "只有一个角色?选这里",
ttsTourSingleBody: "会一步步带你放好 GPT 模型、SoVITS 模型和参考音频,每一步都告诉你该点哪里。",
ttsTourBatchTitle: "很多角色或整合包",
ttsTourBatchBody: "一次放一堆文件或整个文件夹,会按名字自动分成一个个角色;分不出来的单独列出来,让你选它属于谁。",
ttsTourAddTitle: "给已有角色加声音",
ttsTourAddBody: "往已经导入的角色里加参考音频或情绪。在角色卡片上点“添加文件”也会来到这里。",
ttsTourHelpTitle: "随时再看一遍",
ttsTourHelpBody: "点这个 ? 会重新播放当前这一页的引导。",
ttsTourChecklistTitle: "待办清单",
ttsTourChecklistBody: "这里列出这个角色还差什么。做完一项就打勾,全部打勾就能导入。",
ttsTourNextTitle: "下一步点这里",
ttsTourNextBody: "亮起来的那一项就是下一步,按钮就在它旁边。也可以直接把文件拖进窗口,会自动放到对的地方。",
ttsTourHeadTitle: "名字和进度",
ttsTourHeadBody: "名字可以直接在这里改;旁边写着还差几步,全部完成会变成绿色的“可以导入”。",
ttsTourImportTitle: "最后点导入",
ttsTourImportBody: "清单全部完成后这个按钮就能点。文件都是复制过去的,原文件不动。",
ttsCheckAudioNoneUsable: "这些音频都不在 3~10 秒,再放几段长度合适的",
ttsImportLeftOut: "不导入",
ttsCardShowAll: "显示全部 {count} 段",
ttsCardLeftOut: "不导入 · {count} 段不在 3~10 秒(节点用不了),连同它们的台词文件",
ttsCardTrayFolder: "{folder} · {count} 个文件",
ttsCardTrayTop: "(最外层)",
ttsCardTrayMoveAll: "整个文件夹放到…",
ttsUploadLargeTitle: "要上传的文件很多",
ttsUploadLarge: "这次要上传 {count} 个文件,共 {size}。会花一些时间,期间界面可能变卡。继续吗?",
ttsSkippedFolders: "跳过了这些文件夹(Python 环境、基础文件,或整合包的程序和训练文件夹):{folders}。",
ttsImportKeptBestMany: "每个角色的 GPT 和 SoVITS 都用了轮数最大的那个(另外 {count} 个没用)。",
ttsImportAddTitle: "添加文件 · {name}",
ttsImportNameTaken: "已经有叫“{name}”的角色了。",
ttsImportNameTakenVariant: "“{name}”已经有这些版本:{variants}。请换一个名字。",
ttsImportSwitchToAdd: "改成添加到这个角色",
ttsImportKeptBest: "{kind}:用了轮数最大的 {file}(另外 {count} 个没用)。",
ttsImportUnsupportedBlock: "{file} 是 {version} 模型,现在装的 Anomalous_TTS 还不支持。在“GPT-SoVITS 设置”里更新 Anomalous_TTS(或用 ComfyUI Manager)后再导入。",
ttsImportUnknownBlock: "认不出 {file} 是哪个版本的 SoVITS 权重。请换一个 GPT-SoVITS 训练出的 .pth。",
ttsImportOutOfRange: "不在 3~10 秒,节点用不了,不会导入",
ttsTextSource_txt: "台词来自同名 .txt",
ttsTextSource_lab: "台词来自同名 .lab",
ttsTextSource_list: "台词来自标注文件",
ttsTextSource_filename: "台词取自文件名,请确认是否正确",
ttsTextSource_file: "台词来自 {file}",
ttsTextSource_missing: "{file} 里没有这条音频",
ttsTextSource_none: "没找到台词:可以粘贴,或把 .txt / .lab / .list 拖到框里。留空会用无参考文本模式,效果差一些。",
ttsImportPickFiles: "选择文件…",
ttsImportSkipped: "跳过了不支持或重复的文件:{files}",
ttsImportRenamed: "有 {count} 个文件和同一角色里的文件重名,已在前面加上所在文件夹的名字。",
ttsImportRenamedFrom: "改了名,原文件:{file}",
ttsBatchLater: "文件较多,先打开了一批;还有 {count} 个角色在下一批,导入完这批会自动打开。",
ttsBatchNext: "打开下一批({count} 个角色)",
ttsBatchImported: "上一批的 {count} 个角色已导入,打开了下一批。",
ttsFooterPending: "下一批还有 {count} 个角色",
ttsPreviewStop: "停止试听",
ttsPreviewFailed: "放不了:{error}",
ttsPreviewUnreadable: "浏览器读不了这个音频",
ttsImportRowSkip: "角色里已有,跳过",
ttsImportRowMerge: "合并新台词",
ttsImportRowConflict: "角色里有同名的不同文件",
ttsImportRowUnsupported: "不支持",
ttsImportExistingDifferent: "角色里已经有同名但内容不同的文件:{file}。改个文件名再放进来,或者先删掉这一行。",
ttsImportRowUploading: "上传中 {percent}%",
ttsImportRowNotSent: "放进角色后上传",
ttsImportRowReady: "✓ 就绪",
ttsImportRowError: "✕ {error}",
ttsImportSeconds: "{seconds} 秒",
ttsImportUnsupported: "{version}(不支持)",
ttsImportMain: "主声音",
ttsImportMainTitle: "设为主声音(剧本里没标情绪的部分用它)",
ttsImportEmotionPlaceholder: "情绪名(可选)",
ttsImportTextPlaceholder: "参考台词(可以把 .txt / .lab / .list 拖到这里)",
ttsImportLanguage: "角色说的语言",
ttsImportLanguageAuto: "自动判断",
ttsImportLanguageAutoFound: "自动(识别为{lang})",
ttsImportAddSubmit: "添加",
ttsImportFailed: "导入失败:{error}",
ttsImportNoLibrary: "存放位置不能写入:{path}。请检查这个文件夹,或在 GPT-SoVITS 设置里写明的设置文件中改 storage。",
ttsImportNoFiles: "还没有放入文件",
ttsImportNameMissing: "请填写角色名",
ttsImportWeightsMissing: "新角色至少要有一个 GPT 权重(.ckpt)和一个 SoVITS 权重(.pth)",
ttsDropNew: "松开:导入为新角色",
ttsDropAddTo: "松开:添加到「{name}」",
scriptDirectorMainMissing: "这个角色还没有主声音,请先在卡片上点“编辑情绪”选一条参考音频",
scriptDirectorNoCharacters: "还没有 GPT-SoVITS 角色。",
audioDragCharacterHint: "{character}(整个角色)→ 放到 {node} 节点上",
audioDropCharacterTarget: "松手:{node} 节点的角色设为 {character}",
audioDropReject_unsupported: "这个节点不在支持名单里(支持:{supported})",
audioDropReject_notListed: "{node} 的列表里还没有 {file}:请在 ComfyUI 按 R 刷新节点后再试",
audioDropReject_noMainVoice: "{character} 还没有主声音:先在卡片上点“编辑情绪”选一条参考音频",
audioListSeparator: "、",
audioSidebarTitle: "音色分类",
audioRefresh: "刷新音色",
audioSidebarSearch: "搜索角色或情绪",
audioSidebarNoMatch: "没有匹配的角色",
audioSidebarLanguageUnknown: "未标语言",
audioSidebarMainClip: "主声音",
audioSidebarShowClips: "展开声音",
audioSidebarHideClips: "收起声音",
audioAllVoices: "全部音色",
audioGalleryTitle: "生成的语音",
audioGallerySubtitle: "每条都带着当时的台词和角色;点 💬 可以拿回“配音”再配一版",
audioGalleryEmpty: "音频库还是空的:在“配音”页点“生成语音”,或在节点后面接「保存音频」节点,生成的音频就会出现在这里",
audioDeleteConfirm: "删除这个音频文件吗?会移到系统回收站。",
audioDownload: "下载音频",
audioDelete: "删除",
scriptDirectorSubtitle: "选一个角色,把台词贴进来,每句点一下选情绪,然后生成语音。",
draftsBox: "草稿箱",
draftsBoxCount: "草稿箱({count})",
draftsNew: "新建",
draftsNewHint: "开一份空白剧本;现在这份留在草稿箱里",
draftsNewBlank: "新建空白剧本",
draftsNewScript: "新剧本",
draftsClose: "关闭剧本",
draftsCloseHint: "这份已经存好了,回草稿箱随时能打开",
draftsBackToScript: "回到剧本",
draftsUntitled: "没起名的剧本",
draftsRename: "改名",
draftsRenameHint: "点一下改名",
draftsRenamePrompt: "给这份剧本起个名字(空着就用第一句台词)",
draftsCopy: "复制一份",
draftsCopyName: "{name}(副本)",
draftsDelete: "删除",
draftsDeleteHint: "放进“最近删除”,30 天内能找回",
draftsRestore: "找回",
draftsLines: "{count} 句",
draftsEditingNow: "正在编辑",
draftsSaving: "正在保存…",
draftsSaved: "已自动保存",
draftsSaveFailed: "没保存上,下次改动时再试",
draftsUnreadable: "草稿箱读不出来,这次先不保存(刷新再试)",
draftsBusy: "正在生成,等它完成再换剧本。",
draftsEmpty: "还没有草稿。贴进台词,就会自动存成一份。",
draftsDeletedCount: "最近删除({count})",
draftsDeletedHint: "删除的剧本在这里放 30 天,之后自动清掉。",
draftsDeletedAt: "{when}删除",
draftsJustNow: "刚刚",
draftsMinutesAgo: "{count} 分钟前",
draftsTodayAt: "今天 {time}",
draftsYesterdayAt: "昨天 {time}",
draftsDate: "{month}月{day}日",
draftsDateYear: "{year}年{month}月{day}日",
scriptRunHint: '直接在 ComfyUI 里生成,不改动画布,结果存到 output/audio/{character}/',
scriptRunNeedsUpdate: '直接生成需要更新 Anomalous_TTS(接口版本 11 以上)。现在可以先推送到节点,在画布上运行。',
scriptRunLanguage: '语言',
scriptRunLang_auto: "自动识别",
scriptRunLang_zh: '中文',
scriptRunLang_ja: '日语',
scriptRunLang_en: '英语',
scriptRunSpeed: "快慢",
scriptRunParamName_top_k: "候选数量",
scriptRunParamName_top_p: "候选范围",
scriptRunParamName_temperature: "随机程度",
scriptRunParamName_repetition_penalty: "防重复",
scriptRunSaveDefaults: "以后都这样念",
scriptRunMode: "语气",
scriptRunModeAuto: "平时的",
scriptRunModeAutoBase: "平时的",
scriptRunModeIsAuto: "这个角色平时的语气。",
scriptRunModeAutoShort: "按语气档位和这个角色的专属设置(这里是说{lang}时)。",
scriptRunModeSaved: "已存进“{name}”,所有用它的角色都跟着变。",
scriptRunOpenPresets: "语气档位设置",
scriptRunOpenTuning: "{name} 的专属设置",
scriptRunDefaultsSaved: '已保存',
scriptRunDefaultsFailed: '保存默认设置失败:{error}',
scriptRunSettingsBroken: '这个角色的设置文件有问题,先修好再保存:{error}',
scriptRunSaveDefaultsHint: "把 TA 现在的快慢和语言存为平时的,以后的剧本也这样。语气要一直用,去“专属设置”。",
scriptRunParamHint_speed: "快慢,1 为正常",
scriptRunParamHint_top_k: '每一步只在最可能的 k 个候选里挑。小:更稳、更平;大:更有变化,也更容易出错',
scriptRunParamHint_top_p: '只在累计概率达到 p 的候选里挑。1 表示不限制',
scriptRunParamHint_temperature: '随机程度。低:更稳定、语气更平;高:更有起伏,也更容易念错',
scriptRunParamHint_repetition_penalty: '抑制重复。念到一半卡住、重复字时调高一点',
scriptRunGenerate: '生成语音',
scriptRunNewTake: '整段换一版',
scriptRunNewTakeHint: '换一个种子,整段重新生成',
scriptRunCancel: '取消',
scriptRunQueued: '排队中…',
scriptRunRunning: '生成中…',
scriptRunProgress: '生成中 {value}/{max}',
scriptRunDone: "生成好了,用时 {seconds} 秒",
scriptRunSavedLink: "已存进音频库 ›",
scriptRunCancelled: '已取消',
scriptRunFailed: '生成失败:{error}',
scriptRunNoAudio: '没有拿到生成的音频',
scriptRunRetakeLine: '只把这句换一版(其他句子不变)',
scriptDirectorTitle: "配音",
scriptDirectorListenLine: "按现在的设置试听这句",
scriptDirectorPreviewEmotion: "听「{emotion}」原本的参考声音",
scriptDirectorWorkflowTitle: "放进自己的工作流",
scriptDirectorSplitter: "拖动调整左右宽度;双击恢复",
scriptPageNoCharacters: "还没有角色。先在“角色”里导入一个,再回来写台词。",
scriptPageGoVoices: "去导入角色",
scriptDirectorInputPlaceholder: "把台词贴在这里。每句一行,或者整段贴进来按标点自动分句。\n\n分好以后,每句都能单独选情绪(比如主声音、开心)。",
scriptDirectorParse: "分成句子",
scriptDirectorClear: "清空",
scriptDirectorInject: "推送到节点",
scriptDirectorSuccess: "已写入节点",
scriptDirectorNoNode: "画布上没有 {node} 节点",
audioLoading: "正在读取…",
audioGallerySearch: "搜索台词或文件名",
audioPreviewsTitle: "未保存的预览",
audioPreviewsHint: "来自「预览音频」节点,ComfyUI 重启后会被清除",
audioSavePreview: "保存到音频库",
audioPreviewSaved: "已保存",
audioSaveFailed: "保存失败:{error}",
audioCopySpeech: "复制台词",
audioVoiceAgain: "在“配音”里打开,再配一版",
audioSpeechCopied: "已复制台词",
audioNoMatches: "没有找到匹配的音频",
audioVoiceLabel: "音色 {name}",
audioSeedLabel: "seed {seed}",
audioExpandSpeech: "展开 / 收起完整台词",
audioLoadFailed: "读取失败:{error}",
audioTrackCount: "{shown} / {total} 条",
audioLoadMore: "加载更多",
audioDeleteFailed: "删除失败:{error}",
scriptDirectorPickNode: "画布上有多个 {node} 节点,请先选中要写入的那一个",
scriptDirectorOverwriteConfirm: "目标节点的台词栏已经有内容,要覆盖吗?",
scriptDirectorPickCharacter: "请先选择角色",
scriptDirectorMainEmotion: "主声音",
scriptDirectorEdit: "改原文",
scriptDirectorLinesCount: "{count} 句",
scriptDirectorDeleteLine: "删除这句",
scriptDirectorPackageSummary: "共 {count} 句 · 用到:{emotions}",
scriptDirectorPackageSummaryCast: "共 {count} 句 · 角色:{speakers}",
scriptDirectorSpeakerUnusable: "有句子交给了一个现在用不了的角色(删掉了,或没有主声音),请交给别的角色。",
scriptDirectorPasteFor: "贴进来的台词先交给:{name}(在左边点角色可以换)",
scriptDirectorEmptyLine: "(空的,双击输入台词)",
scriptDirectorEditHint: "双击改台词",
scriptDirectorEditLine: "改台词",
scriptDirectorSpeakerMenu: "换成谁念",
scriptDirectorCardsHint: "点句子选中,双击改台词",
scriptCastHint: "点句子选中(Ctrl / Shift 多选),右边就能改谁念、怎么念;双击改台词",
scriptCastPicked: "已选 {count} 句:在右边改谁念、怎么念(Esc 取消)",
scriptCastListHint: "点角色:右边显示 TA 在这份剧本里怎么念;之后贴进来、新加的句子也由 TA 念",
scriptCardTuneHint: "这句单独改过。点它在右边改,或点 ↺ 回到上一层",
scriptTuneScript: "整份剧本",
scriptTuneScriptMeta: "{count} 句 · {speakers} 个角色",
scriptTuneLineCount: "{count} 句",
scriptTuneOwnCount: "{count} 句单独改过",
scriptTuneCharacterMeta: "念第 {lines} 句,共 {count} 句",
scriptTuneCharacterNone: "这份剧本里还没有 TA 的台词",
scriptTuneResetLines: "{count} 句单独改过:全部回到 TA 这一层",
scriptTuneResetAll: "这几句全部回到上一层",
scriptTuneLine: "第 {n} 句",
scriptTuneLines: "选中的 {count} 句",
scriptTuneWho: "谁念",
scriptTuneFromLine: "这一句",
scriptTuneFromUsual: "{name}平时",
scriptTuneFromDefault: "默认",
scriptTuneFromMixed: "各不相同",
scriptTuneFromHint_line: "这一句自己改的;点 ↺ 回到上一层",
scriptTuneFromHint_character: "在这份剧本里给 {name} 改的;点一下去 TA 那一层",
scriptTuneFromHint_script: "整份剧本改的;点一下去整份剧本",
scriptTuneFromHint_usual: "{name}平时的设置(存过的);点一下去 TA 那一层",
scriptTuneFromHint_default: "没人改过,用默认的",
scriptTuneUsualHint: "按语气档位和角色的专属设置",
scriptTuneNumbers: "看数字",
scriptTuneLasting: "永久设置:",
scriptTuneResetScript: "整份剧本全部回到默认",
scriptTuneResetCharacter: "撤掉这份剧本里给 TA 改的",
scriptTuneChangedHere: "本剧本改过",
scriptTuneCast: "角色(点一个,只改 TA)",
scriptTuneListen: "▶ 试听这句",
ttsPresetsPick: "平时用哪种语气",
ttsPresetWhat: "{name}:{about}",
ttsStatusReady: "✓ 一切就绪",
ttsStatusMissing: "{count} 个基础文件没下载",
ttsSetupTab_tones: "语气",
ttsSetupTab_languages: "说别的语言",
ttsSetupTab_files: "基础文件",
ttsSetupTab_places: "存放位置",
ttsSetupTab_version: "版本",
ttsTonesSimple: "简单",
ttsTonesNumbers: "看数字",
ttsStatusDownloading: "基础文件下载中…",
ttsStatusPackages: "缺 {count} 个 Python 包",
scriptTuneOtherCharacters: "其他角色({count})▾",
scriptDirectorSpeakerSearch: "搜索角色…",
scriptTuneReset: "回到上一层",
scriptTuneOldTts: "按角色、按句分开设置要 Anomalous_TTS 接口 17(1.1.0)。现在整段按第一句的角色念;可以在 GPT-SoVITS 设置里更新。",
scriptDirectorCopy: "复制剧本",
scriptDirectorCopied: "已复制",
scriptDirectorDragHandle: "拖到节点",
scriptDirectorDragHint: "拖到画布上的 {node} 节点:会同时设置角色和台词",
scriptDirectorPushHint: "写入选中的(或画布上唯一的){node} 节点",
scriptDirectorDropNotTts: "只能放到 {node} 节点上",
scriptDirectorEmotionMissing: "当前角色没有这个情绪,请换一个",
scriptDirectorSplitSentence: "按句自动分段",
scriptDirectorSplitLine: "按换行分段(每行一张卡片)",
scriptDirectorMergeNext: "与下一段合并(保留这张卡片的情绪)",
scriptDirectorAddLine: "+ 添加一段",
scriptDirectorSplitAtCaret: "在光标处拆成两段",
scriptDirectorSplitHint: "先在这段文字里点一下要断开的位置,再点 ✂",
scriptDirectorEmpty: "还没有台词,请先粘贴剧本并解析分句",
scriptDirectorVoiceUnusable: "有台词用了这个角色没有的情绪,请换一个",
scriptDirectorSampleNotListed: "{node} 节点的列表里还没有 {file}。请先在 ComfyUI 中刷新节点定义(按 R)后再试。"
},
en: {
updateGuideTitle: "What's new",
updateGuideReplay: "View update guide",
updateGuideSkip: "Skip",
updateGuideBack: "Back",
updateGuideNext: "Next",
updateGuideDone: "Got it",
updateGuideProgress: "Step {current} of {total}",
tourRailTitle: "The rail: one line from top to bottom",
tourRailBody: "Top to bottom is how you use it: pick models in Models → keep a good result in the Gallery → what you keep goes to Workflows, Combos or Prompts, ready to use next time. Click the current page's icon again (or the button at the top left) to show or hide its list.",
tourGalleryTitle: "🖼️ Gallery: keep a result with ☆",
tourGalleryBody: "Everything you generate is here. When you like one, press its ☆ and choose what to keep: the whole workflow (to Workflows), its models and LoRAs as a combo (to Combos), or just its prompts (to Prompts). A kept image's ☆ is filled; press it to find what it became.",
tourRecipesTitle: "📚 Workflows: whole tuned set-ups",
tourRecipesBody: "Whole workflows you keep live here, with the picture as the cover. Open one or drag it onto the canvas to carry on; when a model is missing here, Model Check helps you find it. The ⇅ at the top right imports and exports workflows as share codes.",
tourCombosTitle: "🧩 Combos: model + LoRAs + prompt",
tourCombosBody: "Keep a main model, a few LoRAs and a prompt as a combo (from the Gallery, or made here). Put on canvas, or drag the card onto the canvas, lays them out as a wired group of nodes; nothing already on the canvas changes.",
tourPromptsTitle: "✍️ Prompts: Prompt Studio",
tourPromptsBody: "Prompt Studio: the selected prompt node is edited here tag by tag, a clicked card goes in, text in other languages becomes English, and each tag can show its meaning. Your saved prompts are under My prompts; cards also drag straight onto a prompt box on the canvas (green positive, red negative).",
tourNodeTitle: "🤖 Current node: the one you select",
tourNodeBody: "Select a node on the canvas: swap its model or insert a LoRA on top; a prompt node opens in Prompt Studio with one press; below, every saved set of values for this kind of node says what it would change, and Apply changes only that.",
tourScanTitle: "🎯 Scan models",
tourScanBody: "Scan once to start: it works out what each model is (name, cover, base model), which finding models and Model Check rely on. One button scans only the new ones, with progress on the page; it carries on in the background if you close the window. The crosshair button on a model card scans just that one.",
tourDoctorTitle: "🩺 Model Check (missing models)",
tourDoctorBody: "Each workflow you open is checked; missing models show a bar over the canvas. The same file under another name or folder (recognised by its SHA256) is put back with one press; for the rest, pick one here or see where to download it. Don't want the bar? Press \"Don't show again\" on it.",
tourNoticeTitle: "(!) What's new & docking",
tourNoticeBody: "Press (!) to see what changed and to start this tour again; the ◧ beside it switches between docking at ComfyUI's side and a floating window.",
tourSettingsTitle: "⚙️ Settings",
tourSettingsBody: "Look and language, model card quality and memory, folders, workflow fingerprints, how the browser opens, and help.",
tourExit: "Exit the tour (Esc)",
tourDone: "Done",
updateGuideNoticeTooltip: "Update guide & version",
versionCheckOpen: "Check for updates / switch version ›",
versionPanelTitle: "Version & updates",
versionChipUnknown: "Unknown version",
versionCurrent: "Installed",
versionUnknown: "Unknown (not a git install)",
versionDevBuild: "Development build (based on {base}, branch {branch})",
versionBranch: "Branch {branch}",
versionDetached: "Pinned to a release",
versionDirtyWarning: "Plugin files have local changes. Commit or revert them before switching versions.",
versionCheck: "Check for updates",
versionCheckHint: "Click \"Check for updates\" to list published releases. Nothing goes online until you click.",
versionChecking: "Fetching releases…",
versionReturnLatest: "Back to latest",
versionReturnLatestHint: "Switch to the default branch and pull the newest code",
versionUndo: "Undo last switch (back to {label})",
versionShowPrerelease: "Show pre-releases",
versionNoReleases: "No published releases found.",
versionBadgeCurrent: "Installed",
versionBadgeLatest: "Latest stable",
versionBadgePrerelease: "Pre-release",
versionNotes: "Release notes",
versionOpenGithub: "View on GitHub",
versionUpdateTo: "Update to this version",
versionRollbackTo: "Roll back to this version",
versionUpToDate: "You're on the latest stable release.",
versionNewAvailable: "New version available: {tag}",
versionSourceGit: "(GitHub API unavailable; list comes from git tags, without notes)",
versionPreparing: "Preparing {tag}…",
versionSwitching: "Switching to {tag}…",
versionConfirmUpdate: "Update from {from} to {tag}?",
versionConfirmRollback: "Roll back from {from} to {tag}?",
versionConfirmLatest: "Switch to the default branch and update to the newest code?",
versionConfirmUndo: "Go back to {label}, the version before the last switch?",
versionRollbackDataWarning: "Older versions may not understand settings or recipes saved by newer ones. Nothing is deleted; it all works again once you return to the newer version.",
versionNoPanelWarning: "{tag} does not have this version panel yet. To come back, use \"Update\" for this plugin in ComfyUI Manager.",
versionRestartNote: "Restart ComfyUI afterwards for the change to take effect.",
versionSwitched: "Switched to {tag}.",
versionReturnedLatest: "Back on the latest version.",
versionPendingRestart: "restart pending",
versionRestartQuestion: "Restart ComfyUI now?",
versionRestartNow: "Restart now",
versionRestartLater: "Later",
versionRestarting: "ComfyUI is restarting. Refresh the page in a moment.",
versionRestartManual: "Could not restart automatically (needs ComfyUI Manager). Please restart ComfyUI yourself.",
versionErrorGeneric: "Something went wrong: {error}",
versionError_not_git: "The plugin was not installed with git, so versions can't be checked or switched.",
versionError_dirty: "These plugin files have local changes, so the switch was cancelled to avoid overwriting them:",
versionError_diverged: "The local branch has commits the remote doesn't, so nothing was changed.",
versionError_offline: "Couldn't reach GitHub. Check your connection and try again.",
versionError_git_missing: "The git program was not found.",
versionError_git_timeout: "A git command timed out. Please try again.",
versionError_git_failed: "git failed: {error}",
versionError_bad_tag: "Invalid version name.",
versionError_unknown_tag: "That is not a published version.",
versionError_no_previous: "There is no switch to undo.",
versionError_no_default_branch: "Couldn't determine the default branch.",
updateGuideTourBanner: "💡 Prefer to see them in action? Start Spotlight Tour ›",
materialCardDragHint: "Hold and drag onto canvas nodes to inject values, or drop on empty canvas to load workflow",
updateGuideImportTitle: "Drop a model in, it goes to the right folder",
updateGuideImportBody: "Models page → + Import, or drop model files on the models page: each file says what it is (Checkpoint, LoRA, VAE, text encoder…), its base model and the folder it will go to, which you can change. A file you already have is pointed out, nothing is ever replaced, and the new files are scanned right after.",
updateGuideTidyTitle: "Tidy: models in the wrong folder, files you have twice",
updateGuideTidyBody: "The models page has a Tidy tab. It reads each model file and finds models in a folder where they fail to load (a Flux or Anima main model among the checkpoints, say) and moves them, with cover and notes, in one press; identical files you have twice are listed side by side.",
updateGuideBaseModelsTitle: "Filter by base model; versions on the cards",
updateGuideBaseModelsBody: "Under the type chips, a chip per base model (Illustrious, SDXL, Anima…) with counts shows only the models for that base, handy for finding LoRAs that fit. A scanned model's card shows its Civitai version above the name, so versions sharing a file name can be told apart.",
updateGuideCompareTitle: "Compare parameters; workflows open on their values",
updateGuideCompareBody: "In the Gallery press ⇄ on one picture, then on another or Compare with the canvas: only the values that differ are listed, and ticked ones go onto the canvas in one go. A workflow now opens on its parameter sets: the default values, your saved sets and the pictures each made; ☆ marks the values that matter most. With a node selected, Current node says where each set came from and which one was put in last.",
updateGuideSettingsTabsTitle: "Settings in tabs",
updateGuideSettingsTabsBody: "The settings page has tabs: Look, Models, Workflows, Prompts, Backup, Help. Where downloaded and imported models go is chosen under Models, by base model by default, with an example path.",
materialAppliedTarget: 'Applied to: {name} · #{id}',
materialDropHint: 'Drop on a compatible node to apply; Esc cancels',
materialDropTarget: 'Drop to apply to: {name}',
promptPreviewTag: "after release",
materialApplyFailed: 'Application failed; node parameters were restored.',
materialUndo: "Undo this application",
materialUndone: "Undone",
materialUndoChanged: "The node has changed since application. Use ComfyUI undo instead.",
materialTargetChanged: "Select one node again before applying.",
materialNoCompatibleValues: "These values cannot be put into this node safely.",
materialValueUnavailable: "One of the choices is not available on this node (a model this computer lacks, or another node version).",
promptCompositionHint: "Enter prompt text, choose beginning or end, then drag onto a prompt node. Existing text is preserved. This does not start generation.",
nodeValuesSaved: "Saved these nodes' values. Select a node of the same kind and they are in Current node.",
promptDragNoteHint: "Hold card or header to drag onto canvas node",
recipeMoveKept: "{count} whole workflows kept from your images earlier are not here yet. They belong here now; the gallery's star keeps new ones as recipes.",
recipeMoveKeptButton: "Move them here",
recipeMovedKept: "Moved {count}. The original files stay; they are just not listed on their own.",
recipeScopePill_all: "All",
recipeScopePill_complete: "Full Workflow",
recipeScopePill_partial: "Modules",
recipeViewGrid: "Grid View",
recipeViewList: "List View",
recipeStatusUnverified: "Models to Verify",
recipeReadinessHint: "Detects readiness of required models in local environment; click card details for smart matching and replacement",
close: 'Close',
copy: 'Copy',
materialSavePromptAction: "Save prompt",
materialSaveGeneration: "Save these generation settings",
materialSaveGenerationAction: "Save",
materialGenerationScope: "Saves complete sampler and size node settings for reuse from Current node.",
materialCopySuccess: "Copied",
materialCopyFailed: "Copy failed",
materialClickToCopy: "Click to copy",
promptAdjustRole: "Adjust role",
notebookCompanionModels: "Companion models",
notebookMore: "More",
notebookDoneEditing: "📑 View Bilingual Tags",
loras: "LoRA Models",
notebookPromptTitle: "Prompt",
materialAllTags: "All tags",
materialDuplicateConfirm: "This image and selection are already saved as “{name}”. Save another copy?",
materialCopyError: "Copy failed; retry",
materialChars: "{count} {count|character|characters}",
materialCopyPromptText: "Copy prompt",
notebookSaveError: 'Save failed. Your edits remain in the editor; please retry.',
title: 'Anomalous Model Browser',
scan: '🔄 Scan folder and sync Civitai data',
scanTitle: 'Scan Folder',
scanConfirm: 'Notice:\nThe scan process will automatically compare with Civitai and rename your local files.\nStart scan?',
scanning: 'Scanning...',
scanBg: 'Scan started in background!',
scanDone: 'Done',
scanCompleteMsg: '✅ Scan Complete!\n\n⚠️ Note: Please click [Refresh] to sync the model list since files were renamed.',
togglePlayTitle: 'Toggle Play Mode',
clean: '🧹 Clean orphaned .info files',
cleanTitle: 'Clean Duplicate Info',
files: 'files.',
folderOpen: 'Open',
folderOpenHint: 'Open this folder in the file manager',
folderAll: 'All',
folderTopOnly: 'In the top folder',
scanPageTitle: "Scan models",
scanPageLead: "Scanning gives your models a cover and a description: the plugin takes each model file's fingerprint (its hash) to Civitai, the largest site for AI image models, to find which model it is; when found, it downloads the cover and trigger words and notes which base model it works with. For files Civitai does not know, the base model is guessed from the file. Models already scanned are not downloaded again.",
scanPageMatched: "Found on Civitai",
scanPageUnmatched: "Not found",
scanPageNew: "Not scanned yet",
scanPageSummaryFailed: "Couldn't count the models right now; you can still scan.",
scanPageScanNew: "Scan {count} {count|model|models} not looked up yet",
scanPageScanAgain: "Check again",
scanPageScanPicked: "Scan the {count} picked models",
scanPageScanning: "Scanning…",
scanPageRetry: "Look up the {count} not found again",
scanSettingsTitle: "Scan settings",
scanSettingsLead: "The next scan follows these settings. Reloading the page resets them; renaming files and fetching again turn themselves off after one scan.",
scanPageScopeAllHelp: "Every model folder except those hidden in Settings → Folder manager.",
scanPagePickModels: "Pick models to scan…",
scanPickBackToAll: "Clear, scan everything again",
scanPageLeadShort: "Gives your models a cover, a description and a base model; models already scanned are not downloaded again.",
scanCountingTitle: "Counting your models…",
scanCheckingNet: "Checking whether Civitai can be reached…",
scanNetDownTitle: "Civitai cannot be reached",
scanNetDownText: "Why: {why}\n\nYou can scan from the model files only: base models (SDXL, Flux…) are found, without covers or trigger words; scan again once Civitai can be reached and the rest is filled in.\n\nOr set a proxy first in Settings → Models → Network.",
scanNetFromFiles: "Scan from the files",
scanNetSetProxy: "Set a proxy",
scanCountingHint: "With many models, or models on a network drive, the first time takes a while; opening the page again is much quicker.",
scanPageAboutLink: "How scanning works",
scanHeroWaiting: "{count} {count|model|models} still to look up",
scanHeroPicked: "{count} {count|model|models} picked",
scanHeroDone: "Every model is scanned",
scanHeroFound: "{matched} of {total} {total|model|models} found on Civitai",
scanHeroLookup: "Looks up {count} on Civitai and infers the base model from the file for any it does not find; found ones are not looked up again.",
scanHeroInfer: "Offline: {count} not scanned yet are only read from their files.",
scanHeroForce: "Fetch scanned models again is on: all {count} are looked up again.",
scanHeroMore: "Details",
scanHeroLess: "Less",
scanHeroRenames: "This scan renames files on disk.",
scanHeroFetchesAll: "This scan fetches every scanned model again, which is slow.",
scanModeOnline: "Online",
scanModeOffline: "Offline",
scanModeOnlineHelp: "Asks Civitai first and guesses the base model from the file for what Civitai does not know; without a connection it only reads the files and looks again next time.",
scanStateTitle: "Your models",
scanStateUnmatched: "Not found · inferred from file",
scanPartsChip: "{count} {count|component|components} · not found is fine",
scanAttentionTitle: "Worth a look",
scanSettingsMore: "More: rename files, fetch again",
scanTileDisplayName: "Civitai names on cards",
scanTileDisplayNameHelp: "Only the name on the card, not the file.",
scanTileAutoFix: "Fix the workflow afterwards",
scanTileAutoFixHelp: "Swaps models missing on the canvas for the local ones.",
scanTileKey: "Civitai key",
scanTileKeyOn: "Set: models that need a login can be looked up.",
scanTileKeyOff: "Not set: some models need a Civitai login.",
scanTileOnlineOnly: "Not used offline.",
scanPageApiKeyChange: "Change…",
scanPageBackground: "Scans run in the background; you can close this window and keep using ComfyUI.",
scanScopeWithParts: " ({count} of them components)",
scanPartsNote: "These are the parts a drawing model loads with it. Many are not on Civitai at all, and not being found does not matter. A scan still notes each file's fingerprint, which Model Check uses to recognize them in other people's workflows; scanning them is up to you, and the counts above leave them out.",
scanListParts: "{count} {count|component|components}",
scanListPartsHint: "These are the parts a drawing model loads with it (VAE, text encoders, CLIP, CLIP Vision, upscalers). Many are not on Civitai at all, and not being found does not matter. A scan still notes each file's fingerprint, which Model Check uses to recognize them in other people's workflows; scanning them is up to you.",
scanScopeLookup: "{count}{parts} are looked up on Civitai this time: the ones not scanned yet, and those last scanned without a connection",
scanScopeInfer: "{count} not scanned yet{parts} are only read from their files (offline)",
scanScopeNothingNew: "Every model has been scanned: nothing is looked up online this time",
scanScopeMatched: "{count} already found{parts} keep their record and are not looked up again",
scanScopeNotFound: "{count} not on Civitai{parts} are not looked up again (the Not found list can look them up again)",
scanScopeExcluded: "{count} set to never be scanned are left out",
scanScopeWaiting: "{count}{parts} last scanned without a connection wait for the next online scan",
scanScopeForce: "Fetch scanned models again is on: all {count}{parts} are looked up again",
scanPickTitle: "Pick models to scan",
scanPickSearch: "Search name or file name",
scanPickAllFolders: "All folders",
scanPickViewList: "List",
scanPickViewCovers: "Covers",
scanPickStateAll: "All",
scanPickFound: "Found",
scanPickShown: "Pick these {count}",
scanPickUnpickShown: "Unpick these",
scanPickOnlyPicked: "Picked only",
scanPickClear: "Clear picks",
scanPickChange: "Change…",
scanPickRemove: "Don't scan this one",
scanPickMore: "and {count} more",
scanPickNone: "Nothing picked yet",
scanPickSummary: "{count} picked · {size} in all",
scanPickRangeHint: "Shift-click picks a run at once",
scanPickLoading: "Reading the models…",
scanPickFailed: "Could not read the models: {error}",
scanPickEmpty: "No model matches.",
scanPickTruncated: "Too many models: only the first {shown} of {total} are listed.",
scanPickFoundNote: "{count} of them are already found: their record is used again, not looked up; to look them up again, turn on Fetch scanned models again in the scan settings below.",
scanPageTagFiles: "changes files",
scanPageTagSlow: "slow",
scanPageOfflineHelp: "No internet: only the base model is inferred from the file; no covers or trigger words. The next online scan looks these models up.",
scanPageFileRename: "Also rename the files on disk",
scanPageFileRenameHelp: "Really renames model files, so older workflows using them need Model Check; of two identical copies one goes to the Recycle Bin; protected folders are never renamed. Turns itself off after the scan.",
scanPageForce: "Fetch scanned models again",
scanPageForceHelp: "Every model is hashed and fetched again, which is slow. Only Civitai's information and Civitai's covers are updated; names, notes and covers you set stay. Turns itself off after the scan.",
scanPageForceConfirm: "Fetch every scanned model again?\n\nEach model is hashed and its information and cover downloaded again, which can take long for a big library.\nNames, notes and covers you set stay; only Civitai's own older covers are replaced.",
scanPageApiKeySet: "Set…",
scanPageApiKeyPrompt: "Civitai API key (leave empty and confirm to clear):",
scanPageApiKeySaved: "API key saved.",
scanPageApiKeyCleared: "API key cleared.",
scanPageApiKeyFailed: "Could not save: {error}",
scanPageStartFailed: "The scan could not start: {error}",
scanReasonNotFound: "Civitai does not know this file",
scanReasonNetwork: "Civitai could not be reached then",
scanReasonOffline: "Offline scan, Civitai not asked yet",
scanPageNotDrawing: "{count} not scanned yet look like no drawing model (a voice model, say); Civitai most likely has none of them",
scanPageSkipThem: "Don't scan them",
scanPageScanThem: "Scan them as usual",
scanPageSeeThem: "See each",
scanPageExcludedNote: "{count} {count|model is|models are} set to never be scanned",
scanListNotDrawing: "Look like no drawing model · {count}",
scanListNotDrawingHint: "These models' headers look like no drawing model (checkpoint, LoRA, VAE…); usually voice or language models, which Civitai does not list. Set to not be scanned, a scan of everything skips them and they no longer show “Not scanned”; scan them as usual to keep their fingerprint (used to repair workflows).",
scanListExcluded: "Models not scanned · {count}",
scanListExcludedHint: "A scan of everything skips these models; picked by hand they are still scanned. Scan them again and the next scan includes them.",
scanListExcludedAll: "Scan them all again",
scanRowSkip: "Don't scan",
scanRowKeep: "Scan as usual",
scanRowUnskip: "Scan again",
scanRowNotDrawing: "Looks like no drawing model",
scanFingerprintKept: "fingerprint kept, used to repair workflows",
scanChoiceFailed: "{count} {count|model was|models were} not changed (file not found, or its .anomalous.json cannot be read).",
scanReasonDamaged: "Damaged header: the file may not have downloaded whole, or another tool broke it, so Civitai cannot tell it and its base model cannot be read. Download this model again, then press Look up again",
scanReasonUnknown: "Not found on Civitai",
scanErrorNameConflict: "a different model already has the target file name; not renamed",
scanErrorDuplicateKept: "an identical copy could not be moved to the Recycle Bin; both kept",
scanCountMatched: "{count} matched",
scanCountInferred: "{count} inferred from the file",
scanCountFailed: "{count} failed",
scanCountCovers: "{count} {count|cover|covers} downloaded",
scanCountRenamed: "{count} renamed",
scanCountNothing: "No model needed an update",
scanFileMatched: "Matched on Civitai: {name}",
scanFileInferredBase: "{reason}; base model inferred from the file: {base}",
scanFileInferred: "{reason}; the file does not tell its base model either",
scanFileFailed: "Not done: {error}",
scanFileUpdated: "Updated",
scanFileRenamed: "was {from}",
scanFileDuplicate: "duplicate copy moved to the Recycle Bin",
scanFileCoverKept: "your cover kept, Civitai’s saved as the backup",
scanScopeOne: "Scanned {name}",
scanScopePicked: "Scanned the picked models",
scanScopeRetry: "Looked up again",
scanScopeAll: "Scanned all models",
scanCivitaiDownShort: "Civitai stopped answering",
scanOneUnchanged: "This model’s information is already up to date",
scanOneTitle: "Scanning: {name}",
scanModelGone: "{name} is not there any more; it may have been moved or deleted.",
scanRowOpen: "Open",
scanRowRetry: "Look up again",
scanRowSearch: "Search Civitai",
scanRowScan: "Scan",
scanShowAll: "Show all {count}",
scanBack: "‹ Back to scan",
scanListScanAll: "Scan these {count} {count|model|models}",
scanListEmpty: "No models left here.",
scanResultList: "The last scan, model by model",
scanResultDetails: "See each model ({count})",
scanResultTitle: "Last scan · {when} · {scope} · took {duration}",
scanSeconds: "{count} s",
scanMinutes: "{count} min",
scanResultOffline: "This was an offline scan: Civitai was not asked; the next online scan looks these models up.",
scanResultCivitaiDown: "Civitai stopped answering during the scan, so the base model of the models after that was inferred from their files. The next scan looks them up once the connection is back.",
scanCivitaiWhy: "Why: {why}. If your browser reaches Civitai and this does not, let your VPN app set the system proxy or use TUN mode, or give a proxy address in Settings → Network.",
scanResultNothing: "No model needed an update ({count} already up to date).",
scanResultUnchanged: "{count} more models were already up to date.",
scanListNew: "Not scanned yet · {count}",
scanListMatched: "Found on Civitai · {count}",
scanListMatchedHint: "Civitai knows these models: they have their names, descriptions and trigger words. Open one to see it.",
scanListSearch: "Find by name…",
scanUpdating: "Showing the last counts while they are updated…",
scanListUnmatched: "Not found on Civitai · {count}",
scanListNewHint: "These models have not been scanned since they were added; their cards say “Not scanned”. The button above scans them all, a row’s Scan just that one; once scanned, found or not, they leave this list. Fingerprinting a large file takes some seconds.",
scanListUnmatchedHint: "Scanned, but Civitai did not find them. Usual reasons: the model was not published on Civitai (voice, upscale and detection models mostly come from HuggingFace or GitHub), you trained or merged it, or the file was changed after download. They work as usual, only without a cover and description; to keep where one came from, open it and add its source link in the editor. Those marked “could not be reached” or “offline scan” are looked up again by the next online scan.",
scanListUnmatchedHintOffline: "Scanned, but Civitai did not find them. Looking them up again needs an online scan.",
scanListSkipped: "Model files a scan does not read · {count}",
scanListSkippedHint: "These model files are not .safetensors (.pth, .ckpt, .bin and so on). Scans read only .safetensors, so these are never looked up and their cards never say “Not scanned”. They work in ComfyUI as usual; to keep where one came from, open it and add its source link in the editor.",
scanPageSkippedNote: "{count} model files in other formats are not scanned",
scanPageDamagedNote: "{count} model files are damaged (their header cannot be read); download them again",
scanReasonNotImage: "and the file is no known image model: maybe a voice, upscale or similar model",
scanPageShowList: "Show which models",
scanPageScanNewOffline: "Scan {count} new models offline",
scanProgressShowResult: "Show the result",
modelSourceLabel: "Source",
modelSourceCivitai: "Civitai",
modelSourceLocal: "Inferred from the file",
modelSourceLocalShort: "Inferred",
modelSourceInferredBadge: "≈ {base}",
modelSourceDamagedShort: "Damaged",
modelSourceDamaged: "Damaged header, download it again",
modelSourceSkipped: "Not scanned (your choice)",
modelSourceSkippedHint: "You set it to not be scanned: a scan of everything skips it (picked by hand it is still scanned).",
modelSourceNotDrawingHint: "Not scanned yet. Its header looks like no drawing model (a voice model, say), which Civitai most likely has no record of; you can set it to not be scanned.",
modelSourceSetSkip: "Don't scan it",
modelSourceSetScan: "Scan it again",
modelSourceLocalHint: "{reason}; the base model was inferred from the file. You can look it up again on the scan page.",
modelSourceNotScanned: "Not scanned",
modelSourceNotScannedHint: "Not scanned yet: the scan page fills in cover, trigger words and base model.",
modelSourceEdited: "Edited by you: {fields}",
modelSourceListSep: ", ",
modelSourceFieldName: "name",
modelSourceFieldNotes: "notes",
modelSourceFieldLink: "source link",
modelInferredBase: "The base model ≈ {base} was inferred from the model file itself and may be off; there is no Civitai cover, description or trigger words.",
modelInferredNoBase: "The file does not tell its base model either; there is no Civitai cover, description or trigger words.",
modelInferredPending: "The next online scan looks it up again.",
modelInferredFill: "Add a name and source link",
modelInferredEdit: "Edit info",
modelLinkSource: "Source link",
noModels: 'No models found in this folder.',
modelSearchPlaceholder: 'Search models: name, trigger words, base model…',
modelSearchNone: 'No model of this type matches "{query}". To search another type, pick it above.',
modelTypesLabel: 'Model types',
modelTypesRoot: 'Top folder',
modelTypesCrumbHint: 'Only the models in this folder. Click to show every {type}',
noPreview: 'No preview available',
delModel: 'Delete',
delConfirm: 'Delete',
delConfirm2: ' with its info files and previews? They go to the Recycle Bin together and can be restored from there.',
delSuccess: '✅ Delete Complete!\n',
delNote: '\n\n⚠️ Note: Please restart ComfyUI, otherwise continuing to use it due to cache will cause errors.',
delFail: '❌ Delete Failed: ',
copyAll: '📋 Copy All',
copied: '✅ Copied!',
clickToCopy: 'Click to copy: ',
compatibleModels: '🔗 Compatible Models',
refresh: 'Refresh',
loading: 'Loading…',
loadingCompatible: 'Loading...',
applyToCanvas: 'Add Node',
workspace: 'Workspace',
workspaceTitle: 'Creative Workspace',
materialLoadError: "Could not read your saved prompts.",
materialOpenWorkflow: 'Open Full Workflow',
materialOpenError: "Could not open this image's workflow.",
materialViewDetails: 'View Details',
materialViewParameters: 'View Parameters',
materialDetailLoadError: "Could not read this prompt.",
materialSourceImage: 'Source Image',
workbenchLoadSuccess: 'Workflow loaded to ComfyUI canvas successfully!',
workbenchLoadFailed: 'Could not load workflow into canvas: ',
workbenchNext: 'Next (→)',
workbenchPrev: 'Previous (←)',
workbenchFilmstrip: 'Thumbnail Rail',
workbenchTabOverview: 'Overview',
workbenchTabPrompts: 'Prompts',
workbenchTabModels: 'Models',
workbenchTabNodes: 'All Parameters',
workbenchZoomFit: 'Fit Stage',
workbenchZoomReset: '1:1 Actual Size',
workbenchCopyWorkflowJson: 'Copy Workflow JSON',
workbenchCopiedWorkflowJson: '✅ Workflow JSON copied',
workbenchStepsValue: '{count} {count|step|steps}',
workbenchNoModels: '(No model references found)',
workbenchNoNodeParams: '(No node parameters in this image)',
workbenchLocateModel: '🔎 Show model',
materialInspecting: 'Reading the embedded workflow and parameters…',
materialInspectError: "This image has no complete UI workflow to reuse.",
materialSaveHint: 'The full workflow keeps the exact seed; single-node application skips seed widgets.',
materialPromptRoleHelp: "Prompt roles are detected from workflow links. Correct them as positive, negative, shared, or ignored when needed. Each prompt can be saved to your prompts.",
materialNoPromptData: '(No embedded prompt data)',
materialSaveError: "It was not saved; try again.",
materialNodeApplied: "Values applied",
materialPromptText: 'Prompt',
materialViewOriginal: '🔍 Full View',
materialDenoise: 'Denoise',
materialScheduler: 'Scheduler',
materialModelBase: 'Base Model / UNet',
materialModelLora: '🎨 LoRA Layers',
materialModelVae: 'VAE',
materialModelClip: '👁️ Text Encoder (CLIP)',
materialModelOther: 'Other Models',
materialParameterCount: '{count} {count|parameter|parameters}',
materialNodeId: 'Node ID',
materialNodeMode: 'Node Mode',
materialCopyNodeParameters: '📋 Copy Node JSON',
materialNoWidgetParameters: 'This node has no serialized widget parameters.',
materialWidgetIndex: 'Parameter {index}',
materialVolatileParameter: 'Runtime volatile',
materialParameterFullValue: 'The complete value is retained; scroll inside the field when it is long.',
materialNodeProperties: 'Node Properties',
materialParamSeed: 'Seed',
materialParamSeedControl: 'After-generate seed control',
materialParamAddNoise: 'Add Noise',
materialParamStartStep: 'Start Step',
materialParamEndStep: 'End Step',
materialParamLeftoverNoise: 'Return Leftover Noise',
materialParamWidth: 'Width',
materialParamHeight: 'Height',
materialParamBatchSize: 'Batch Size',
materialParamCheckpoint: 'Checkpoint Model',
materialParamUnet: 'UNet Model',
materialParamWeightDtype: 'Weight Dtype',
materialParamLora: 'LoRA Model',
materialParamModelStrength: 'Model Strength',
materialParamClipStrength: 'CLIP Strength',
materialParamVae: 'VAE Model',
materialParamClipVision: 'CLIP Vision Model',
materialParamControlNet: 'ControlNet Model',
materialParamClipOne: 'Text Encoder 1',
materialParamClipTwo: 'Text Encoder 2',
materialParamClipThree: 'Text Encoder 3',
materialParamClipType: 'Encoder Type',
materialParamFilenamePrefix: 'Output Filename Prefix',
materialPromptCopied: '✅ Prompt Copied',
materialPromptNode: 'Prompt',
materialCopied: '✅ Copied',
materialCopyPrompt: '📋 Copy Prompt',
materialSelectNodeForSaving: "Pick this node to save its values",
materialSelectAllNodes: 'Select All Nodes',
materialClearNodeSelection: 'Clear Selection',
materialSelectedNodeCount: '{count} {count|node|nodes} selected',
materialSaveNode: '+ Save node parameters',
materialSaveNodeHint: 'Save only this node\'s parameters, to apply from Current node',
materialSaveSelectedAction: 'Save selected node parameters ({count})',
materialSaving: 'Saving…',
materialSaved: '✓ Saved',
materialSelectedNodesName: '{count} selected nodes',
deleteNotebook: 'Delete',
baseModel: 'Base Model',
mainModel: 'Main Model',
shellCombos: "Combos",
comboHelp: "What is a combo?",
shellPrompts: "Prompts",
comboLead: "A combo is which models and which prompts. By default a main model, a few LoRAs and a prompt; or keep a piece of the canvas, the nodes you picked (Flux and video workflows, upscaling, ControlNet and other nodes that work together): its models and prompts can be changed later, the other nodes go back as saved. Put on canvas lays them out wired together; you can also drag a card onto the canvas.",
comboDragHint: "Release on the canvas for a wired group of nodes there; Esc cancels",
comboDragCanvas: "Release: a new group of nodes for this combo here",
comboSearch: "Search combos, models or prompts…",
comboNew: "New combo",
comboNewName: "Name the new combo",
comboSlotPositive: "Positive prompt",
comboSlotNegative: "Negative prompt",
comboSlotText: "Text",
comboSlotModel: "Model",
comboSlotMainModel: "Main model",
comboSlotTextEncoder: "Text encoder",
comboGroupModels: "Models",
comboGroupLoras: "LoRAs",
comboGroupPrompts: "Prompts",
comboGroupFixed: "Nodes put back as saved",
comboOpenInput: "{input} of {node} ({type})",
comboOpenInputs: "Wire these after putting it on the canvas: {inputs}. Their links came from nodes that were not picked.",
comboOpenInputsCount: "{count} input(s) to wire",
comboFixedHint: "Strength and the other values stay as saved. For other values, set them on the canvas and right-click → AMB → Save as combo again.",
comboFixedStrength: "strength",
comboFixedClipStrength: "CLIP strength",
comboFixedDtype: "dtype",
comboFixedType: "type",
comboFixedDevice: "device",
comboFixedSwitch: "switch",
comboFixedOff: "off",
comboTranslate: "Translate",
comboTranslateHint: "See this prompt translated (a look only; the prompt is not changed)",
comboTranslating: "Translating…",
comboTranslationToEnglish: "In English",
comboTranslationToChinese: "In Chinese",
comboTranslationCopy: "Copy",
comboTranslationCopied: "Copied",
comboTranslationFailed: "The translation service cannot be reached; try again later.",
comboSlotEmpty: "(empty)",
comboSlotClear: "Leave empty",
comboSlotUnknownFolder: "Cannot tell which kind of models this drop-down lists; kept as it is.",
comboPick: "Change",
comboPickTitle: "Choose: {slot}",
comboPickSearch: "Search by name",
comboPickAllBases: "All base models",
comboPickNoMatch: "No model matches.",
comboPickNone: "No models of this kind yet.",
comboStructureName: "Node combo",
comboStructureNodes: "Structure: {nodes}",
comboStructurePacks: "Node packs needed: {packs}",
comboStructureMissing: "This computer lacks these nodes, so it cannot be put on the canvas: {nodes}. ComfyUI Manager can install them.",
comboFromSelectionNone: "Pick a few nodes on the canvas first (Ctrl+click, or drag a box), then make a combo from them.",
comboFromSelectionFailed: "Reading the picked nodes failed; the browser console says why.",
comboFromSelectionNothing: "All {count} picked nodes are subgraphs. A combo cannot keep subgraphs yet.",
comboFromSelectionTitle: "New combo from the picked nodes",
comboFromSelectionKept: "Keeps {count} {count|node|nodes}: {nodes}, and the links between them.",
comboFromSelectionDropped: "{count} more are subgraphs, which a combo cannot keep yet: {nodes}. Links to them are not kept either.",
comboFromSelectionOpen: "Links from nodes that were not picked cannot be kept; on the canvas these inputs stay open for you to wire: {inputs}.",
comboFromSelectionSlots: "These are the slots you can change later (models and texts). Rename them; an unticked one keeps its value and is no slot. Optional ones now set to None start unticked:",
comboFromSelectionNoSlots: "No slots to change; the nodes go back with the values they have now.",
comboFromSelectionSave: "Save combo",
comboNewDefault: "Default combo",
comboMenuSave: "Save as combo",
comboMenuSaveMany: "Save the {count} picked nodes as a combo",
canvasMenuTitle: "AMB",
canvasMenuOpen: "Open in AMB",
canvasMenuReplace: "Change model by picture",
canvasMenuLoraBefore: "Insert a LoRA before",
canvasMenuLoraAfter: "Insert a LoRA after",
canvasMenuParameters: "Apply saved values…",
canvasMenuOutputs: "Pictures made with this model",
canvasMenuDetails: "Model details",
canvasMenuSaveParams: "Save this node's values…",
canvasMenuOpenPage: "Open AMB",
canvasMenuQuickSearch: "Quick search…",
quickSearchTitle: "AMB quick search",
quickSearchPlaceholder: "Find a combo, model or prompt…",
quickSearchKeys: "↑↓ pick · Enter puts it on the canvas · Tab changes the kind · Esc closes",
quickSearchAll: "All",
quickSearchKind_combo: "Combos",
quickSearchKind_model: "Models",
quickSearchKind_prompt: "Prompts",
quickSearchPositive: "Positive",
quickSearchNegative: "Negative",
quickSearchMore: "{count} more; type a little more to narrow it down",
quickSearchNothing: "Nothing found. Try another word, or Tab to one kind.",
quickSearchHint: "Type to search: a model's name, trigger words or base model, a combo's name, a prompt's text.",
canvasMenuAdjust: "Adjust this menu…",
canvasMenuModelUnknown: "AMB does not know this model: maybe it is not scanned yet, or the file is outside the model folders.",
canvasMenuGroup: "Right-click menu",
canvasMenuPlacement: "Where AMB's entries show",
canvasMenuPlace_submenu: "Together under “AMB”",
canvasMenuPlaceHelp_submenu: "ComfyUI's menu gets one line more; point at AMB to see them",
canvasMenuPlace_top: "Listed in the menu",
canvasMenuPlaceHelp_top: "One move less, but ComfyUI's menu gets longer",
canvasMenuSketchComfy: "Properties|Clone|Remove",
canvasMenuPreview: "You will see:",
canvasMenuPreviewNone: "Nothing: AMB stays out of this menu",
canvasMenuPreviewNote: "(only those that fit the node)",
canvasMenuList_node: "Right-click on a node",
canvasMenuList_canvas: "Right-click on the empty canvas",
canvasMenuUp: "Move up",
canvasMenuDown: "Move down",
canvasMenuReset: "Reset",
canvasMenuResetHelp: "Every entry back to its default switch and place.",
canvasMenuEntry_open: "Open in AMB",
canvasMenuEntryHelp_open: "A prompt node opens Prompts, any other node Current node",
canvasMenuEntry_replaceModel: "Change model by picture",
canvasMenuEntryHelp_replaceModel: "For a node with a model drop-down: pick another by its cover",
canvasMenuEntry_loraBefore: "Insert a LoRA before",
canvasMenuEntryHelp_loraBefore: "Pick a LoRA, wired in before this node's inputs",
canvasMenuEntry_loraAfter: "Insert a LoRA after",
canvasMenuEntryHelp_loraAfter: "Pick a LoRA, wired in after this node's outputs",
canvasMenuEntry_parameters: "Apply saved values",
canvasMenuEntryHelp_parameters: "Current node, at the values saved for this kind of node",
canvasMenuEntry_modelOutputs: "Pictures made with this model",
canvasMenuEntryHelp_modelOutputs: "The pictures made with the node's model",
canvasMenuEntry_modelDetails: "Model details",
canvasMenuEntryHelp_modelDetails: "The node's model's page in AMB",
canvasMenuEntry_saveParameters: "Save this node's values",
canvasMenuEntryHelp_saveParameters: "Name and keep them, to apply to nodes of this kind later",
canvasMenuEntry_saveCombo: "Save as combo",
canvasMenuEntryHelp_saveCombo: "This node (or the picked nodes) as a combo",
canvasMenuEntry_quickSearch: "Quick search",
canvasMenuEntryHelp_quickSearch: "Find a model, combo or prompt; Enter puts it on the canvas (or press Alt+B)",
canvasMenuEntry_openPage: "Open a page of AMB",
canvasMenuEntryHelp_openPage: "Home, Models, Gallery, Workflows, Combos, Prompts…",
comboNewDefaultHint: "A main model + a few LoRAs + a prompt",
comboNewWithLoraNode: "Default combo, LoRAs in {node}",
comboLoraNodeLabel: "On the canvas, LoRAs go in:",
comboLoraNodeCore: "ComfyUI's LoRA loaders",
comboLoraNodeCoreHint: "One Load LoRA node per LoRA, in a chain",
comboLoraNodeRgthree: "Power Lora Loader",
comboLoraNodeRgthreeHint: "rgthree's node: every LoRA in one node, each row with its own switch and strength",
comboLoraNodeEasy: "Easy-Use LoRA stack",
comboLoraNodeEasyHint: "Easy-Use's LoRA stack node (up to 10 each), put on the model by Easy Apply LoraStack",
comboLoraNodeMissingMark: " (not installed)",
comboLoraNodeFallback: "This combo's LoRAs go in {node}, but this ComfyUI does not have {pack}; they were put in ComfyUI's own LoRA loaders this time.",
comboNewFromSelection: "From the nodes picked on the canvas",
comboNewFromSelectionHint: "{count} {count|node|nodes} picked: they are kept with the links between them",
comboNewFromSelectionEmpty: "Pick nodes on the canvas first (Ctrl+click, or drag a box)",
comboNewLike: "Same structure as \"{name}\"",
comboPlaceMissingNodes: "This computer lacks nodes this combo uses, so nothing was put on the canvas: {nodes}. Install them with ComfyUI Manager and try again.",
comboPlaceProblems: "Put on the canvas, but a few things could not be restored:",
comboPlaceSlotMissing: "· No \"{widget}\" in {node} (slot: {label}); the node pack may have renamed it",
comboPlaceLinkMissing: "· The {type} link {from} → {to} could not be made",
comboUse: "Put on canvas",
comboUseHint: "Lays the main model, LoRAs and prompts out wired together; the group follows the pointer until you click, Esc cancels",
comboNoModel: "No model",
comboLoraCount: "{count} {count|LoRA|LoRAs}",
comboNoPrompt: "(no prompt yet)",
comboEmpty: "No combos yet. Press New combo, pick a main model and some LoRAs and write a prompt; then one press of Put on canvas lays them out, wired.",
comboNoMatches: "No combo matches.",
comboLoadError: "Could not load the combos; try again.",
comboBack: "← All combos",
noteNeedsClip: "A UNet model has no text encoder and the canvas has no single CLIP loader, so connect the prompt nodes' clip yourself.",
translate: 'Translate',
dialogOk: 'OK',
dialogCopySelected: 'Selected: press Ctrl+C',
dialogCancel: 'Cancel',
scanModelPrecisely: 'Scan This Model',
galleryLoading: 'Loading...',
galleryErrorPrefix: 'Error: ',
galleryDelete: 'Delete',
galleryKeep: "Keep it as a workflow, a combo or its prompts",
compareCardTitle: "Compare parameters: press this one, then another image's ⇄, or compare with the canvas",
compareTitle: "Compare parameters",
comparePicked: "Picked “{name}”. Press another image's ⇄ to compare, or:",
compareWithCanvas: "Compare with the canvas",
compareCanvas: "Canvas",
compareLoading: "Reading both sides…",
compareLoadFailed: "Could not read: {error}",
compareNoWorkflow: "This image holds no workflow that can be read.",
compareSameStructure: "Same nodes",
compareOtherStructure: "Different nodes",
compareSummary: "{diff} different, {same} the same",
compareNoDifference: "Apart from the seeds, both sides are the same.",
compareNothingPaired: "No node on one side matches one on the other, so no values can be set side by side.",
compareSeeds: "Seeds (usually different on every run)",
compareOnlyIn: "Nodes only {side} has",
compareRewired: "Nodes wired differently",
compareState: "State",
compareParameter: "Parameter",
compareMoreTags: "{count} more",
compareTagsOnly: "only here:",
compareKeys: "★ Key parameters",
compareShowSame: "Show equal values too",
compareNewest: "Canvas vs. newest picture",
compareNewestSide: "Newest picture",
compareNewestHint: "See which values the canvas changed since the newest picture, and put the picture's values back if you like",
compareNoPicture: "The output folder has no picture with a workflow yet.",
compareKeyHint: "Press ☆ before a value's name to keep it at the top; every workflow and parameter set remembers it.",
compareStar: "Make it a key parameter: shown first in comparisons and parameter sets",
compareUnstar: "No longer a key parameter",
paramSetDiffers: "{count} different from the default",
paramSetSame: "Same as the default",
paramSetCompare: "Compare with the default",
paramSetCount: "{count} parameter sets",
workflowsSteps: "{count} {count|step|steps}",
recipePromptShowAll: "Show all",
compareWithDefault: "Compare with the default",
workflowOwnValues: "Default values",
workflowOwnValuesHint: "The values saved with the workflow",
workflowSetFromCanvas: "From canvas",
workflowSetEditing: "editing",
workflowSetCopy: "Copy as a new set",
workflowAllPictures: "All pictures",
workflowCompare: "Compare",
workflowMainValues: "Main values",
workflowSetPictures: "Pictures made with these values",
workflowSetNoPictures: "The output folder has no picture made with these values yet.",
workflowAllNodeValues: "Every node's values",
workflowSetsTipTitle: "No parameter sets yet",
workflowSetsTip: "Try other values on the canvas; when you like a picture, press From canvas. A saved set can be compared ⇄ with the defaults to see exactly what differs.",
workflowCompareTip: "Press ⇄ Compare above to see how these values differ from the defaults; ⇄ on a picture below compares two pictures' values.",
workflowTipDone: "Got it",
focusTitle: "Focus values",
focusHint: "Star ☆ a value under Every node's values below to mark what matters most in this workflow; it shows here and comes first in comparisons.",
focusStar: "Mark as a focus value of this workflow",
focusUnstar: "Unmark",
focusNote: "Note",
focusNotePrompt: "A note for this value (say: 0.6–0.8 works best)",
focusDefault: "default {value}",
focusBadge: "focus here",
focusFull: "A workflow takes up to {count} focus values.",
focusSaveError: "Could not save the focus values.",
recipePromptFold: "Show less",
workflowsFilter: "Filter",
workflowsFilterOn: "Filter · {count}",
workflowsFilterKind: "Kind",
workflowsFilterTag: "Tag",
paramSetCountHint: "Open this workflow's parameter sets",
compareModeOn: "On",
compareModeMuted: "Muted",
compareModeBypassed: "Bypassed",
compareSwap: "Swap sides",
compareCanvasHint: "Ticked values go from the image onto the canvas; seeds stay.",
compareApply: "Put the {count} ticked on the canvas",
compareApplyNone: "Tick the values to put on the canvas",
compareApplied: "{count} changed on the canvas",
compareApplySkipped: "; {count} not (the node is gone, or this computer lacks that choice)",
compareUndo: "Undo",
compareClose: "Close",
galleryKeptAs: "Kept as a {list}; open to see",
listJoin: ", ",
workbenchKeep: "Keep",
workbenchKeepHint: "Keep this image as a workflow, a combo or its prompts",
keepMenuTitle: "Keep this image",
keepAs_recipe: "The whole workflow",
keepAs_recipeHint: "As a Workflow Recipe on the Workflows page, to open whole",
keepAs_combo: "Its combo",
keepAs_comboHint: "The nodes that made its model and prompts, every value as it was, on the Combos page",
keepAs_prompt: "Just the prompts",
keepAs_promptHint: "The positive and negative prompts, in your saved prompts",
keepKeptAs: "Kept as {name}; open it",
keptAs_recipe: "Kept as a Workflow Recipe: {name}",
keptAs_combo: "Kept as a combo: {name}",
keptAs_comboShort: "Kept as a combo. Rename it here if you like:",
comboFromImage: "Kept from this image",
comboFromImageOpen: "Kept from this image; click to see it large",
comboRename: "Rename",
comboRenameAsk: "What should this combo be called?",
comboEyebrow: "Combo",
comboEyebrowKept: "Combo · kept from a picture",
comboSeePicture: "See the picture",
comboNoMainModel: "No main model yet",
comboNoLora: "No LoRA",
comboModelsTitle: "Models",
comboBaseModel: "Base model",
comboChange: "Change",
comboChoose: "Choose",
comboAddLora: "Add a LoRA",
comboRemoveLora: "Take this LoRA out",
comboPickerClose: "Close",
comboPickerNone: "No models for this base model found.",
comboPickerFailed: "Could not read the model list.",
comboRenameHint: "Click to rename",
keepRenameHint: "The combo's name; press Enter when done",
keepRenamed: "Renamed to {name}",
keepRenameFailed: "Could not rename it; it keeps its name.",
keptAs_prompt: "Kept the prompts: {name}",
keepExisted: "Kept before: {name}",
keepComboMissing: "{count} of its models are not on this computer, so the combo leaves them out.",
keepComboMissingNamed: "{count} of its models are not on this computer; the combo keeps them by the picture's names; click one in the combo to choose a model of yours.",
keepOpen: "Open",
keepRemove: "Remove",
keepRemoveHint: "Move what was kept to the Recycle Bin",
keepRemoveConfirm: "Remove the kept {what} \"{name}\"? It goes to the Recycle Bin.",
keepRemoved: "Removed the {what} \"{name}\"; it is in the Recycle Bin",
keepRemoveFailed: "Could not remove it; please try again.",
keepNoun_recipe: "workflow recipe",
keepNoun_combo: "combo",
keepNoun_prompt: "prompt",
keepNoPrompt: "This image's workflow has no prompt.",
keepNoWorkflow: "This image carries no ComfyUI workflow, so it cannot be kept.",
keepFailed: "It was not kept; try again.",
galleryDeleteConfirm: 'Delete this image?',
galleryDeleteConfirmHint: 'It goes to the Recycle Bin and can be restored from there.',
galleryDeleteFailed: 'Delete failed: ',
galleryNoMore: 'No more images',
galleryScrollMore: 'Scroll down to load more',
galleryLoadFailed: 'Load failed',
galleryEmpty: 'Gallery is empty',
galleryKeptOnly: '★ Kept',
galleryKeptOnlyHint: 'Only the pictures you kept as a workflow, combo or prompt',
galleryKeptEmpty: 'No kept pictures yet. Press ☆ on a picture to keep it as a workflow, combo or prompt.',
gallerySearchPlaceholder: 'Type and press Enter to add a search block: prompt, model, LoRA, seed, file name or model hash',
gallerySearchHelp: 'Each search block matches on its own and all blocks must match; a block may contain spaces and matches as a phrase. Hex of 8+ characters matches model hashes (e.g. 667B5E3B), even for renamed model files. Backspace in an empty box removes the last block. The first search reads image info; later ones are much faster.',
searchChipHash: 'hash',
searchChipNumber: 'number',
searchChipRemove: 'Remove this search block',
searchChipsClear: 'Clear search',
gallerySearchCount: '{count} found',
gallerySearchEmpty: 'No matching images',
gallerySearching: 'Searching…',
galleryFilterAll: 'All',
galleryFilterImages: 'Images',
galleryFilterVideos: 'Videos',
galleryFormatsTitle: 'Formats shown',
galleryFormatsHelp: 'Click a format to hide it from the gallery, and again to show it. Whether a video plays depends on the browser; MP4 and WebM are the safest.',
galleryFormatShown: 'Shown; click to hide',
galleryFormatHidden: 'Hidden; click to show',
galleryViewVideo: 'Play video',
settingsGallery: 'Gallery',
galleryClose: 'Close Gallery',
galleryHistoryTitle: 'Generated History: {name}',
galleryScanning: 'Loading, scanning metadata...',
galleryNoModelImages: 'No images found generated by this model.',
gallerySetCover: 'Set Cover',
gallerySetCoverConfirm: 'Set this image as the cover?',
galleryCoverSuccess: 'Cover set successfully!',
gallerySelectingCoverPrefix: 'Selecting cover for ',
gallerySelectingCoverSuffix: '. Click an image below.',
galleryLoadImagesError: 'Error loading images',
galleryCancel: 'Cancel',
detailBackDoctor: '← Back to Model Check',
detailBackAssistant: '← Back to Assistant',
detailBackModels: '← Models / {type}',
detailBackPrevModel: '← Previous model',
detailBack: '← Back',
detailBackHint: 'Esc does this too',
detailFolder: 'Folder',
detailOutputs: 'Outputs',
detailCopy: 'Copy',
detailFile: 'File',
detailDeleteModel: 'Delete model',
detailEdit: 'Edit',
modelEditTitle: 'Edit model info',
modelEditClose: 'Close',
modelEditFromCivitai: 'Information from Civitai',
modelEditCover: 'Cover',
modelEditCoverNow: 'Current cover',
modelEditNoCover: 'No cover yet',
modelEditCoverCivitai: "Civitai's cover",
modelEditCoverUpload: 'Upload a picture or video',
modelEditCoverGallery: 'Pick from all pictures…',
modelEditCoverHint: 'Saving puts this one in; the old cover goes to the Recycle Bin.',
modelEditCoverCivitaiHint: "Saving brings Civitai's cover back.",
modelEditName: 'Name',
modelEditNameHint: 'Only the name shown in the plugin; the file stays as it is.',
modelEditRename: 'Also rename the file on disk',
modelEditRenameHint: 'The file is really renamed: older workflows that use it will not find it until Model Check fixes them.',
modelEditRenameProtected: 'Components such as VAE, text encoders and CLIP Vision are never renamed.',
modelEditRenameNeedsName: 'Fill in a name to rename the file.',
modelEditLink: 'Source link',
modelEditLinkPlaceholder: 'https://… where you downloaded it',
modelEditLinkWeb: 'Web page',
modelEditLinkHint: 'Where you downloaded it: the details get a button that opens it, and shared workflows and Model Check point to it when this model is missing.',
modelEditLinkLocalHint: 'Civitai does not have it. Add where you downloaded it (LiblibAI, HuggingFace…): the details get a button that opens it, and shared workflows and Model Check point to it when this model is missing.',
modelEditLinkCivitaiHint: 'The Civitai page is already kept, so this can stay empty; if you downloaded it elsewhere, put that here and it is used first.',
modelEditLinkInvalid: 'The source link must be a web address (starting with http:// or https://).',
modelEditNotes: 'Notes',
modelEditNotesPlaceholder: 'How to use it, a good strength, trigger words…',
modelEditReset: 'Reset',
modelEditResetHint: "Clears the name and notes you set and brings Civitai's cover back; the source link stays.",
modelEditResetConfirm: "Reset this model?\n\nThe name and notes you set are cleared and the cover goes back to Civitai's (the current one stays if there is none). The source link stays.",
modelEditResetCoverKept: "Civitai's cover was not found, so the current cover stays; the name and notes are cleared.",
modelEditResetCoverFailed: 'The cover could not be put back; check whether another program has the file open. The name and notes are cleared.',
modelEditCancel: 'Cancel',
modelEditSave: 'Save',
modelEditSaving: 'Saving…',
modelEditSaveFailed: 'Not saved: {error}',
modelEditLeaveForGallery: 'Picking from the gallery drops the changes not saved here. Go on?',
remoteViewChip: 'View only',
remoteViewHint: 'This window was opened from another device: you can look around; scanning, downloading, moving, deleting, saving and other changes can only be made on the computer ComfyUI runs on.\n\nComfyUI on a cloud server (AutoDL, RunPod…)? To use it as usual:\n1. Press Copy below.\n2. Open the server\'s terminal (AutoDL: JupyterLab → Terminal), paste, press Enter.\n3. Restart ComfyUI.\n\nThen anyone who can open this address can change your models and settings, so keep the address to yourself. Opened through an SSH tunnel (the address starts with 127.0.0.1), there is nothing to do.',
remoteChangesChip: 'Remote changes on',
remoteChangesHint: 'The plugin folder on the server has an allow_remote_changes file: other devices can scan, move, delete and save too. Anyone who can open this address can do so.\n\nNo longer needed: copy the line below, paste it into the server\'s terminal, press Enter, and restart ComfyUI.',
remoteChipTip: 'Press for the explanation',
detailNotesTitle: '📓 Custom Notes',
detailEditNotes: 'Edit Notes',
detailGeneratedGallery: 'View Generated Gallery',
detailTrainedWords: 'Trained Words:',
detailDescription: 'Description:',
detailNotes: 'Notes:',
detailNoCompatibleModels: 'No compatible models found.',
detailCompatibleLoadFailed: 'Failed to load.',
detailPathCopied: 'Path copied',
detailPathCopyFailed: 'Copy failed',
detailOpenFolder: 'Show in folder',
detailOpenFolderFailed: 'Could not open the folder: {error}',
galleryInsertAsNode: 'Insert as a Load Image node',
galleryInsertNodeFollow: 'The Load Image node follows the pointer: click to put it down, Esc to cancel',
galleryInsertNodeFailed: 'Could not add a Load Image node: the picture could not be copied into the input folder, or the canvas is not ready',
doctorGraphUnavailable: 'The current graph or node is unavailable.',
doctorMissingChainInputs: "This node has no MODEL input, so a LoRA cannot go before it.",
doctorUnconnectedChainInputs: "This node’s MODEL input is not connected yet.",
doctorMissingChainOutputs: "This node has no MODEL output, so a LoRA cannot go after it.",
doctorUnsupportedInsertion: 'This insertion is not available for the selected node.',
doctorCreateLoraFailed: 'Unable to create a standard LoRA Loader node.',
doctorLoraNotReady: 'The LoRA list is not ready. Refresh ComfyUI model lists and try again.',
promptDragHint: 'Drop on a prompt box: green is positive, red is negative, grey is not wired to a sampler; Esc cancels',
promptDropInto: 'Release: into {node}\'s {box}',
promptBoxPositive: 'positive prompt box',
promptBoxNegative: 'negative prompt box',
promptBoxBoth: 'prompt box (wired to both sides)',
promptBoxPlain: 'prompt box',
promptDropOnlyOther: " (this one only has a {role}; it goes in anyway)",
promptDropPartner: '; the {box} on the same sampler ({node}) too',
promptDropPartnerMaybe: '; its {role}, if any, into the {box} on the same sampler ({node})',
promptDropNoBox: 'This node has no prompt box',
promptDropPickBox: 'This node has several prompt boxes; drop on one of them',
promptFilledOne: 'Filled {node}',
promptNodesCreated: 'Created {count} prompt node(s)',
currentNodePrompts: 'Prompts',
currentNodePromptPlain: 'Prompt (not wired to a sampler)',
currentNodePromptEmpty: '(empty)',
currentNodeChangedMeanwhile: 'The box changed while translating; nothing was written.',
currentNodeParams: 'Parameters',
currentNodeSave: 'Save these values',
currentNodeSaveName: "Name these values",
currentNodeSaved: "Saved: {name}. Select a node of this kind to use them here.",
currentNodeSavedBefore: "Exactly these values are saved already: {name}",
currentNodeDelete: "Delete",
currentNodeDeleteConfirm: "Delete the saved “{name}”? Values saved together with it for other nodes go too, to the Recycle Bin.",
currentNodeDeleteFailed: "Could not delete it; try again.",
currentNodeSaveFailed: 'Could not save these values',
currentNodeSearch: 'Search…',
currentNodeNoSets: "No values saved for this kind of node yet. Values saved here, nodes saved from an image's parameters and recipe parameter sets show up here.",
currentNodeNoMatch: 'Nothing matches',
currentNodeLoadFailed: 'Could not read the saved values',
currentNodeFromSet: 'Parameter set of the workflow “{recipe}”',
currentNodeSetPictures: '{count} {count|picture|pictures} made',
currentNodeOpenSet: 'Open',
currentNodeFromPicture: 'Kept with the picture {name}',
currentNodeSeePicture: 'See it',
currentNodeFromHere: 'Saved here in Current node',
currentNodeKeepSeed: 'seeds stay',
currentNodeKeepModel: 'change models above',
currentNodeKeepMissing: 'not on this computer',
currentNodeKeptLine: 'Staying as they are: {names}',
currentNodeKeptPart: '{names} ({why})',
currentNodeKeptSep: '; ',
currentNodeShowAll: 'Show all {count}',
currentNodeShowLess: 'Show less',
currentNodeCompare: '⇄ Compare',
currentNodeCompareHint: 'Compare the whole workflow with the canvas, not only this node',
currentNodeCompareFailed: "Could not read this set's workflow",
currentNodeViewCards: 'Cards',
currentNodeViewTable: 'Side by side',
currentNodeNow: 'Now',
currentNodeApplyShort: 'Use {count}',
currentNodeAllSame: 'All of these match the current values.',
currentNodeAppliedLast: 'Last put in: “{name}” · {when}',
currentNodeAppliedSame: 'unchanged since',
currentNodeAppliedChanged: 'changed since: {changes}',
currentNodeAppliedMore: 'and {count} more',
currentNodeAppliedRestore: 'Put them back',
currentNodeToday: 'today {time}',
currentNodeLastBadge: 'Last put in',
currentNodeMatches: 'The values now match “{name}”',
currentNodeMatchesMore: ' ({count} more match too)',
currentNodeClosest: 'Closest to “{name}”, apart from: {changes}',
currentNodeApply: 'Apply these {count}',
currentNodeSame: 'Same as now',
doctorLead: 'Checks whether this computer has the models the open workflow uses. The workflow carries each model\'s file fingerprint (hash), so a model you renamed or moved is still recognised; only a file with the same fingerprint is put in.',
doctorChecking: 'Checking…',
doctorStatUsed: 'Models used',
doctorStatHere: 'On this computer',
doctorStatFixable: 'Can be put back',
doctorStatMissing: 'Need you',
doctorPutInAll: 'Put in {count}',
doctorPutIn: 'Put in',
doctorUseCandidate: 'Use it',
doctorPick: 'Pick one',
doctorRecheck: 'Check again',
doctorSources: 'Where to download',
doctorNoModels: 'The open workflow uses no model files.',
doctorAllHere: 'All models are on this computer ({count}); the workflow can run.',
doctorHowItWorks: '"Put in" only uses the same file (same fingerprint). A missing model whose source is certain (found on Civitai by its fingerprint, a file link the workflow carries, or a file of the same name and fingerprint in ComfyUI-Manager\'s model list) can be downloaded right here; a same-name file from that list without a fingerprint to check is offered as "Download by name", for you to decide. For the others, pick a local model yourself or look on Civitai.',
doctorToHandle: 'To handle',
doctorReplaced: 'Just put in',
doctorWas: 'Was {file}',
doctorHereList: 'Models on this computer ({count})',
doctorWhyFound: 'This computer has the same file under another name or folder: {file}',
doctorWhySpelling: 'Only the slashes in the path differ: {file}',
doctorWhyCandidate: 'This computer has a file of exactly the same size: {file}. The workflow has no fingerprint for it, so it may not be the same model; your call.',
doctorWhySameName: "This computer has a file of the same name: {file}. The workflow has no fingerprint for it, and the same name is not always the same model; your call.",
doctorWhyLikely: "This computer has a file of the same name and exactly the same size: {file}, very likely the one. The workflow has no fingerprint for it, so you confirm.",
doctorLevelSure: "Sure",
doctorLevelLikely: "Likely",
doctorLevelMaybe: "Maybe",
doctorLevelUnclear: "Unclear",
doctorLevelConflict: "Does not match",
doctorLevelNone: "Not found",
doctorWhyConflict: 'The fingerprint and the size point to different files; nothing was replaced.',
doctorWhyAmbiguous: 'Several files on this computer could be it; cannot tell which.',
doctorWhyChanged: 'The file is there, but its content differs from when the workflow was saved (maybe another version). ComfyUI uses it as usual.',
doctorWhyNotHere: 'Looked for its fingerprint on this computer: not here.',
doctorWhyNoRecord: 'The workflow has no fingerprint for it, so it cannot be found automatically. Pick one or download it.',
downloadLooking: 'Looking for a download…',
downloadOne: 'Download · {size}',
downloadOneNoSize: 'Download',
downloadAll: 'Download all {count} ({size})',
downloadNoNetwork: 'Cannot reach the download sites right now.',
downloadDifferentFile: 'The workflow\'s link points to a different file, so it is not offered.',
downloadGated: 'This file needs a Hugging Face login and accepting its terms; download it on the page.',
downloadTitle: 'Download the missing model',
downloadTitleMany: 'Download {count} missing models',
downloadSaveTo: 'Save to',
downloadRootNew: '(not there yet, will be created)',
downloadUnsafeFormat: '⚠ A .ckpt / .pt kind of file can run code it carries when it loads. Only download it from a source you trust.',
downloadNoCheck: 'ⓘ The source gives no fingerprint, so the file cannot be checked after downloading.',
downloadSpace: 'Downloading {need}; {free} free on the disk.',
downloadRules: 'Change where downloads go by default in Settings → Models',
downloadStart: 'Download',
downloadQueued: 'Waiting…',
downloadVerifying: 'Checking the file…',
downloadProgress: '{percent}% · {done} / {total}',
downloadRetry: 'Retry',
downloadSetKey: 'Set API key',
downloadDone: 'Downloaded: {name}',
downloadDonePutIn: 'Downloaded and put in: {name}',
downloadSourceMirror: 'Hugging Face (China mirror)',
downloadOneByName: 'Download by name · {size}',
downloadOpenPage: 'Open the page',
downloadOneByNameNoSize: 'Download by name',
downloadByName: '⚠ Only a file of the same name in ComfyUI-Manager\'s model list ({name}). The workflow has no fingerprint for this model, so it cannot be checked to be the same file; download it only if you are sure.',
downloadViaManager: 'ⓘ The link comes from ComfyUI-Manager\'s model list ({name}); the workflow\'s fingerprint confirms it is the same file.',
downloadListSite: "The list's file is on {site}",
downloadSearchHf: 'Search Hugging Face',
downloadSearchHfHint: 'No download source was found. Search Hugging Face for the file name; a common name may find many, so pick the right one yourself.',
downloadNoManager: 'With ComfyUI Manager installed, its list of common models is one more place to download from.',
downloadTryMirror: 'In mainland China, turn on "Hugging Face through the China mirror" in Settings → Model downloads and try again.',
downloadError_network: 'The download broke off (network). Retry continues where it stopped.',
downloadError_needs_key: 'This model needs a Civitai login: set your Civitai API key, then download again.',
downloadError_forbidden: 'The site refused the download (a login or permission may be needed).',
downloadError_gone: 'The site no longer has this file.',
downloadError_hash_mismatch: 'The downloaded file does not match the workflow\'s fingerprint; it was thrown away, not put into the models folder.',
downloadError_exists: 'A file of that name is already there and is never replaced. Choose another place or name.',
downloadError_already: 'This file is already downloading.',
downloadError_no_space: 'Not enough disk space.',
downloadError_not_a_file: 'The site sent a web page instead of the model (probably a login).',
downloadError_bad_name: 'The name must end in a model format such as .safetensors.',
downloadError_bad_path: 'Not a place it can go: only inside the models folder.',
downloadError_bad_source: 'This download source is not one of the allowed sites.',
downloadError_bad_type: 'Cannot tell which kind of models folder this goes into.',
downloadError_bad_root: 'That models folder no longer exists.',
downloadError_unknown: 'The download failed; the ComfyUI console says why.',
doctorProof: 'Fingerprint',
doctorProofSaved: 'In the workflow',
doctorProofLocal: 'Local file of that name',
doctorProofNone: 'none',
doctorChangedMeanwhile: 'This node changed after the check; nothing was replaced. Checked again.',
doctorScanHint: '{count} {count|model|models} in your library have not been scanned yet. Their fingerprints are unknown until scanned; scan, then check again.',
doctorToScan: 'Go to scanning',
doctorBannerMissing: 'This workflow uses {count} {count|model|models} this computer does not have.',
doctorBannerStill: '{count} still missing.',
doctorBannerFixable: '{count} of them are here under another name or folder and can be put back.',
doctorBannerPutIn: 'Put in {count} {count|model|models}.',
doctorBannerShow: 'Show',
doctorBannerClose: 'Close',
doctorBannerLabel: 'Model Check: ',
doctorBannerMute: "Don't show again",
doctorBannerMuteHint: 'Stop checking workflows when they open; Settings → Workflows turns it back on',
doctorBannerMuted: 'Workflows will no longer be checked when they open. To turn it back on: Settings → Workflows → Check for missing models when a workflow opens.',
assistantSelectNode: 'select any node in the canvas',
assistantSelectedNode: 'Selected node',
assistantQuickActions: 'Quick actions',
assistantChangeWidget: 'Change {name}',
assistantChangeCurrent: 'Change current model',
assistantVisualPicker: '{type} · Visual picker',
assistantInsertBefore: 'Insert LoRA before',
assistantInsertAfter: 'Insert LoRA after',
assistantConnectInputs: 'Connect to node inputs',
assistantConnectOutputs: 'Connect to node outputs',
assistantPreviewFailed: 'Failed to load preview',
assistantHistoryTitle: 'History ({count})',
assistantViewAll: 'View All →',
assistantRestoreWorkflow: 'Click to restore workflow',
assistantViewGallery: 'Click to view full gallery',
pickerNoCompatible: 'No compatible models are available.',
pickerEyebrow: 'Current node · Model Picker',
pickerInsertBeforeTitle: '⬅ Insert LoRA Before Node',
pickerInsertAfterTitle: 'Insert LoRA After Node ➡',
pickerChangeTitle: '🔀 Change Current Model',
pickerFolders: 'Folders',
pickerSearch: '🔍 Search name or full path…',
pickerMainAll: 'Main model: All types',
pickerNameAsc: 'Name A–Z',
pickerNameDesc: 'Name Z–A',
pickerByFolder: 'By Folder',
pickerLoadingCovers: '⏳ Loading model covers…',
pickerCancel: 'Cancel',
pickerInsertConfirm: 'Insert & Auto-Connect',
pickerReplaceConfirm: 'Confirm Replacement',
pickerCoversFailed: '⚠️ Covers failed to load; models remain selectable by name.',
doctorLoadingPreview: 'Loading preview...',
doctorNoPreview: 'No preview',
doctorProfile: '📖 View Profile',
doctorBase: 'Base',
doctorTriggerWords: 'Trigger Words',
doctorClickCopy: 'Click to copy',
doctorCopyAll: '📋 Copy All',
doctorNotes: '📝 My Notes',
pickerSelected: 'Selected: {path}',
pickerChooseModel: 'Choose a model. Existing connections and strengths will be preserved.',
pickerCompatibleMain: '✨ Compatible LoRAs are filtered for the main model {name}. Use the filter above to show all types.',
pickerCompatibleTag: '✨ No connected main model was identified, so the current LoRA tag {name} is used.',
pickerCompatibleNoTags: 'ℹ Main model {name} was identified, but no matching LoRA tags were found, so all models remain visible.',
pickerCompatibleUnknown: 'ℹ The main model type could not be identified. All LoRAs remain visible and can be filtered manually.',
pickerAllModels: 'All Models',
pickerResults: '{count} {count|result|results}',
pickerCurrent: 'Current',
pickerBaseModel: 'Base model',
pickerRoot: 'Root',
pickerNoMatches: 'No models match the current filters.',
pickerOperationFailed: 'Operation failed: ',
notebookSelectMain: 'Please select a Main Model first.',
notebookPromptPlaceholder: "Enter prompt here (comma-separated for tags, bilingual translation supported)...",
notebookUnlabeledBase: 'No base model listed',
notebookUnetNeedsTextEncoder: 'UNet models have no text encoder: after sending to the canvas, connect your CLIP loader to the two prompt nodes. LoRAs are loaded model-only.',
mainPreflightTitle: 'Pre-flight Import Workflow',
mainOpenTitle: 'Open Anomalous Model Browser',
mainInterfaceCategory: 'Interface',
mainLanguageSetting: 'Plugin language',
mainLanguageTooltip: 'Follow ComfyUI\'s native language by default, or override this plugin to use Chinese or English.',
mainLanguageAuto: 'Follow ComfyUI',
mainLanguageChinese: '中文',
mainLanguageEnglish: 'English',
themeDomainActivated: '🌊🩸 Domain Expansion: Abyssal Scarlet!',
themeDomainDeactivated: '🌕 Domain Collapse: Default Vision Restored.',
themeEasterEggHint: 'The abyss stares back... ({count}/5)',
mainEntryModeSetting: 'Browser entry mode',
mainEntryModeTooltip: 'Choose exactly one entry: a floating button, an action-bar button beside the run controls, or the Extensions menu command only.',
mainEntryModeFloating: 'Floating entry',
mainEntryModeTopbar: 'Top action bar',
mainEntryModeMenu: 'Extensions menu only',
mainShortcutSetting: 'Open-browser shortcut',
mainShortcutTooltip: 'Show the active key combination and change it with ComfyUI\'s native recorder. ComfyUI handles conflicts, overwrites, and reserved-key warnings.',
mainShortcutUnassigned: 'Unassigned',
mainShortcutCustomize: 'Customize',
mainShortcutOpenFailed: 'Could not open the ComfyUI keybinding editor. Use Settings → Keybinding instead.',
mainTopbarTriggerLabel: 'Model Browser',
mainFloatingTriggerLabel: 'Model Browser',
mainFloatingTriggerSizeSetting: 'Floating entry size',
mainFloatingTriggerSizeTooltip: 'Choose a small, standard, or large preset. Drag bounds follow the actual rendered size.',
mainFloatingTriggerSizeSmall: 'Small',
mainFloatingTriggerSizeMedium: 'Standard',
mainFloatingTriggerSizeLarge: 'Large',
mainFloatingTriggerStyleSetting: 'Floating entry style',
mainFloatingTriggerStyleTooltip: 'Choose a circular icon or a labeled pill.',
mainFloatingTriggerStyleIcon: 'Circular icon',
mainFloatingTriggerStylePill: 'Labeled pill',
mainResetFloatingTriggerPosition: 'Reset floating entry position',
mainRetryInit: '插件界面初始化失败,点击可重试',
mainRetryInitEn: 'The plugin UI failed to initialize. Click to retry.',
mainShareFingerprints: "{hashed} of {total} {total|model|models} carry a fingerprint, so others can find the same file even under another name.",
mainShareNoFingerprint: "{count} have none (not scanned, or not on this computer); others can only go by name or size, so scan first if you can.",
mainShareProvenanceOff: "\"Record model fingerprints in workflows\" is off in Settings, so the code carries no fingerprints or download links.",
mainShareLinks: "Include model download links ({count})",
mainClose: 'Close',
shareTitle: 'Share and import',
shareExportHeading: 'Share the canvas workflow',
shareExportHelp: 'The workflow on the canvas as a short code to post in a chat or a comment; pasting it here opens it.',
shareEmptyCanvas: 'There are no nodes on the canvas.',
shareStats: 'Chinese-character code: {hanzi} {hanzi|character|characters} · letter code: {letters}.',
shareWhole: 'This workflow uses subgraphs or unusual nodes, so the code holds all of it and is longer.',
shareCopyHanzi: 'Copy the character code',
shareCopyLetters: 'Copy the letter code',
shareCodeHelp: 'The character code is the shortest. If a chat or a comment section will not post it, or others cannot see it (a word filter), use the letter code: it posts anywhere.',
shareCopied: 'Copied the {kind} ({count} {count|character|characters})',
shareKindHanzi: 'character code',
shareKindLetters: 'letter code',
shareImportHeading: 'Import',
shareImportPlaceholder: 'Paste a share code (AMB2-, AMB1- or AMB0-) or workflow JSON, or drop a workflow file, an image with a workflow, a recipe package or a backup .zip here.',
shareImportButton: 'Import',
shareChooseFile: 'Choose file…',
shareImported: 'Opened the workflow ({count} {count|node|nodes})',
shareImportEmpty: 'Paste a share code or drop a file first.',
shareImportFailed: 'Could not open it: {error}',
shellHome: "Home",
shellVoices: "Voices",
voiceTabCharacters: "Characters",
shellAudioGallery: "Audio",
shellTitleModels: "Model library",
homeTitle: "What would you like to do?",
homeLead: "Anomalous takes care of the chores around ComfyUI: models, outputs, workflows, combos, prompts and character voices. Pick a card to start.",
homeCardModelsTitle: "Find a model, put it on a node",
homeCardModelsBody: "Browse models by type with previews; drag one onto a canvas node to use it.",
homeCardDoctorTitle: "Fix missing models",
homeCardDoctorBody: "A shared workflow shows red nodes? Model Check finds your matching local models and swaps them in.",
homeCardVoicesTitle: "Give a character a voice",
homeCardVoicesBody: "Pick a character, paste the lines, choose an emotion per line and generate speech.",
homeCardGalleryTitle: "Look through your outputs",
homeCardGalleryBody: "Browse your results by time and see what made them. Star a good one to keep it as a workflow, a combo or its prompts.",
homeCardRecipesTitle: "Keep workflows you reuse",
homeCardRecipesBody: "Save a tuned workflow with its models and parameters and use it again later.",
homeCardCombosTitle: "Lay out a combo you like",
homeCardCombosBody: "Keep a main model, LoRAs and a prompt as a combo, and put them on the canvas, wired, with one press.",
homeCardPromptsTitle: "Put prompts together",
homeCardPromptsBody: "Prompt Studio: the selected prompt node edited tag by tag, cards added with a click, Chinese translated to English. It can move beside the canvas.",
homeStartLabel: "New here?",
homeStartSetup: "Set up",
firstRunTitle: "New here? Let's get set up",
firstRunLead: "Four steps, a few minutes. Afterwards your models have names, covers and base models, and a workflow's missing models are recognised.",
firstRunLater: "Later",
firstRunDone: "Done",
firstRunNetTitle: "1 · Check the network",
firstRunNetBody: "The scan asks Civitai for your models' names and covers. Some regions need a proxy for it.",
firstRunNetChecking: "Reaching Civitai…",
firstRunNetOk: "Reachable · {ms} ms",
firstRunNetDown: "Unreachable",
firstRunNetFail: "Civitai did not answer ({error}). Turn on your proxy and retry, or scan offline for now: the files are read, but names and covers wait until an online scan later.",
firstRunCheck: "Check",
firstRunRetry: "Retry",
firstRunScanOffline: "Scan offline",
firstRunKeyTitle: "2 · Civitai key (optional)",
firstRunKeyBody: "Some models can only be looked up with a Civitai login. You can go on without one and set it on the scan page later.",
firstRunKeyRefused: "Civitai refuses this key: it may be mistyped or expired. Set another, or clear it.",
firstRunKeyHas: "Set",
firstRunKeySet: "Set",
firstRunKeyChange: "Change",
firstRunScanTitle: "3 · Scan your models",
firstRunScanBody: "{count} {count|model has|models have} not been scanned. The scan reads the files and looks up names and covers; it changes none of your files and runs in the background while you use ComfyUI.",
firstRunScanNothingNew: "Every model has been scanned. Scan again to look everything up anew.",
firstRunScanNone: "No models yet. Put some in ComfyUI's models folder, or drop them onto AMB, then come back to scan.",
firstRunScanRunning: "Scanning. Go ahead and use something else; the result waits here.",
firstRunScanPreparing: "Preparing…",
firstRunScanStart: "Start scan",
firstRunScanDone: "Done",
firstRunScanDoneBody: "The scan is done.",
firstRunScanFailed: "The scan did not run; the scan progress box says why. Try again.",
firstRunTourTitle: "4 · Find your way around",
firstRunTourBody: "A 30-second tour of where everything is.",
firstRunTourStart: "Start the tour",
firstRunGo: "Set up for me",
firstRunGoNote: "Does steps 1, 3 and 4 in order, and stops to ask if the network is down. Step 2 can wait.",
homeStartScan: "Scan model folders",
homeStartTour: "Tour the interface",
homeStartNews: "What's new",
shellActivity: "Activity",
activityTitle: "Activity",
activityLead: "What Anomalous changed: which node settings it changed on the canvas, which nodes it added or removed, and changes to models, recipes, combos, prompts, images, audio and other files. Canvas changes can be undone here until something changes them again; the rest is only recorded.",
activityAll: "All",
activityCanvas: "Canvas",
activityFiles: "Files",
activityClear: "Clear",
activityClearConfirm: "Clear the whole activity log? Only the log is deleted; no change is undone.",
activityEmpty: "Nothing yet. Changes Anomalous makes to canvas nodes and files show up here.",
activityLoadFailed: "Could not read the log:",
activityRecent: "Recent activity",
activityViewAll: "View all",
activityToday: "Today",
activityYesterday: "Yesterday",
activityCanvasChanged: "Changed {count} {count|thing|things} on the canvas",
activityByAi: "AI: {summary}",
mcpDidPositive: "The AI rewrote the positive prompt (Ctrl+Z undoes it)",
mcpDidNegative: "The AI rewrote the negative prompt (Ctrl+Z undoes it)",
mcpDidModel: "The AI switched the model to {name} (Ctrl+Z undoes it)",
mcpDidLora: "The AI added the LoRA {name} (Ctrl+Z undoes it)",
mcpDidCombo: "The AI placed the combo “{name}” (Ctrl+Z undoes it)",
mcpDidFix: "The AI put back {count} missing models (Ctrl+Z undoes it)",
mcpDidRun: "The AI started the workflow",
activityCanvasOpened: "Opened workflow {name} ({count} {count|node|nodes})",
activityChangedValue: "{node} · {widget}: {before} → {after}",
activityAdded: "Added node {node}",
activityRemoved: "Removed node {node}",
activityMore: "{count} more not listed",
activityEmptyValue: "(empty)",
activityLocate: "Find on canvas",
activityUndo: "Undo",
activityUndone: "Undone",
activityUndoGone: "Can't undo: the canvas changed since",
activityLocateMissing: "This node is not on the current canvas any more.",
activityWithTarget: "{action}: {target}",
activityUnknown: "Other change",
activityModelDelete: "Deleted model",
activityModelEdit: "Edited model info",
activityModelCover: "Changed model cover",
activityScan: "Scanned models",
activityScanDone: "{scope}: {counts}",
activityFieldFilename: "file name",
activityFileMoved: "Moved to the Recycle Bin: {name}",
activityFieldChange: "{field}: {before} → {after}",
activityRecipeSave: "Saved workflow recipe",
activityRecipeEdit: "Edited recipe",
activityRecipeDelete: "Deleted recipe",
activityRecipeRestore: "Restored an older recipe version",
activityRecipeCover: "Set recipe cover",
activityRecipeImport: "Imported recipe package",
activityMaterialSave: "Saved prompts or values",
activityMaterialEdit: "Edited saved prompts or values",
activityMaterialDelete: "Deleted saved prompts or values",
activityNoteSave: "Saved combo",
activityNoteDelete: "Deleted combo",
activityPresetSave: "Saved parameter preset",
activityPresetRename: "Renamed parameter preset",
activityPresetDelete: "Deleted parameter preset",
activityImageDelete: "Deleted image",
activityAudioDelete: "Deleted audio",
activityAudioSave: "Saved audio",
activityCacheClear: "Cleared cache",
activityVoiceImport: "Imported character",
activityVoiceSettings: "Changed character settings",
activityModelDownload: "Downloaded a model",
activityModelImport: "Imported a model",
activityModelMove: "Moved a model",
activityDownloadLine: "{file} ({size}, from {source})",
activityDownloadChecked: "✓ Fingerprint matches",
activityDownloadUnchecked: "The source gave no fingerprint; not checked",
activityDownloadFor: "The workflow named it {value}",
sidebarToggle: 'Show or hide the list',
sidebarDoctor: 'Model Check',
sidebarAssistant: 'Current node',
sidebarSettings: "Settings",
settingsBack: "‹ Back",
settingsOpen: "Open",
settingsAppearance: "Look",
settingsViewModeHelp: "Compact fits the most; immersive shows larger cards over a soft cover backdrop.",
settingsAtmosphereHelp: "How strong the backdrop is in immersive mode.",
settingsScaleHelp: "Scales the text and buttons of this window only, not ComfyUI.",
settingsTheme: "Theme",
settingsThemeHelp: "Follow ComfyUI: light or dark as ComfyUI's color palette is. Abyssal Scarlet is a dark deep-red palette.",
settingsThemeAuto: "Follow ComfyUI",
settingsThemeDark: "Dark",
settingsThemeLight: "Light",
settingsThemeAbyssal: "Abyssal Scarlet",
settingsCards: "Model cards and memory",
settingsCardQualityHelp: "Thumbnails are 512 px copies kept in ComfyUI's user folder, so a restart does not redo them; a model's detail still shows the original. Originals look sharper on cards but dozens of large pictures on screen take clearly more memory and video memory.",
settingsVideoHelp: "Video covers and the gallery's videos show their first frame and play (muted) when the pointer is on them. Always playing decodes every video on screen at once, which takes more video memory and power.",
settingsCacheTitle: "Thumbnail cache",
settingsCacheLoading: "Counting…",
settingsCacheHelp: "{count} cached, {size} (at most {limit}; the least recently used go when it is full). Emptied, they are made again when shown; models and covers are not touched.",
settingsCacheUnknown: "Could not read the cache size.",
settingsCacheClear: "Empty",
settingsFolders: "Model folders",
settingsFoldersHelp: "Which model types show on the Models page, in what order, and how they are grouped.",
foldersBack: "‹ Back to settings",
foldersLead: "Choose which models show on the Models page and in what order. Those switched off are neither read nor scanned. Changes apply at once.",
foldersGrouping: "How models are grouped",
foldersByType: "By model type (recommended)",
foldersByDisk: "By folders on disk",
foldersByTypeHelp: "By ComfyUI's model types: Checkpoint, LoRA, VAE… Models of a type in extra model paths count with them.",
foldersByDiskHelp: "By the names of the folders on disk, for libraries you have arranged yourself.",
foldersShown: "Shown on the Models page",
foldersHidden: "Not shown (not read or scanned)",
foldersNoneShown: "Nothing is shown yet; switch some on below.",
foldersRare: "{count} more (rarely needed)",
foldersMoveUp: "Move up",
foldersMoveDown: "Move down",
foldersSaveFailed: "Could not save: {error}",
foldersLoadFailed: "Could not read the folder list.",
settingsWorkflows: "Workflows",
settingsCheckOnOpen: 'Check for missing models when a workflow opens',
settingsCheckOnOpenHelp: 'When you open or drop in a workflow, a bar over the canvas says which models are missing and puts in the ones this computer has under another name in one press. Turned off, run Model Check from the rail when you want it.',
settingsNetwork: 'Network',
settingsProxy: 'Proxy address',
settingsProxyHelp: "The proxy the plugin's own requests use (scans, model downloads, translation, update checks). Empty: the system proxy. When your VPN app uses a PAC script or only proxies the browser, put its HTTP port here, e.g. 127.0.0.1:7890. Only this plugin uses it.",
settingsProxyPlaceholder: 'Empty = system proxy',
settingsProxyBad: 'Not saved: write it as 127.0.0.1:7890 or http://127.0.0.1:7890.',
settingsProxySocks: "Not saved: the plugin cannot use a SOCKS proxy; give your VPN app's HTTP port (in its settings, often 7890, 7897 or 10809).",
settingsNetworkTest: 'Test connection',
settingsNetworkTestHelp: 'Whether Civitai answers now (through the proxy above).',
settingsNetworkTesting: 'Connecting to Civitai…',
settingsNetworkOk: 'Civitai answers ({ms} ms).',
settingsNetworkOkRed: 'civitai.red (Civitai\'s other address) answers ({ms} ms), civitai.com does not: models are looked up on civitai.red, so names and trigger words come; the covers are on civitai.com\'s side and may not download, use the proxy above if you need them.',
settingsNetworkFail: 'Civitai cannot be reached: {why}.',
settingsNetworkKeyRefused: 'Civitai answers, but refuses the current API key.',
netFailureTimeout: 'no answer for a long time, often because the request did not go through a proxy',
netFailureRefused: 'the connection was refused: a wrong proxy address or port, or the VPN app is off',
netFailureDns: 'civitai.com could not be found: no connection, or name lookup is interfered with',
netFailureSsl: 'the secure connection failed: intercepted, or the computer clock is wrong',
netFailureReset: 'the connection was cut off, often because the request did not go through a proxy',
netFailureProxy: 'the proxy refused the connection',
netFailureHttp: 'Civitai answered with an error (HTTP {code}), probably a passing problem on its side',
netFailureOther: 'a network error',
settingsDownloads: 'Model downloads and imports',
settingsSidecars: 'Files that come with models',
settingsSidecarsWhere: 'Where info and kept pictures go',
settingsSidecarsWhereHelp: 'What a scan found (.info), your names and notes (.anomalous.json), and Civitai’s picture kept while your own cover shows. Covers always stay beside the model: ComfyUI and other plugins look for them there.',
settingsSidecarsBeside: 'Beside the model',
settingsSidecarsHidden: 'In a hidden .amb folder',
settingsSidecarsTidy: 'Drop duplicate cover copies',
settingsSidecarsTidyHelp: 'Scans used to keep a copy of Civitai’s picture identical to the cover. Once dropped, a copy is kept only when you change the cover.',
settingsSidecarsTidyButton: 'Check and tidy',
settingsSidecarsCounting: 'Looking through every model folder…',
settingsSidecarsConfirmHidden: 'Move {moves} files into each folder’s .amb and send {duplicates} copies identical to their covers to the Recycle Bin? Files are only moved; you can switch back any time.',
settingsSidecarsConfirmBeside: 'Move {moves} files out of .amb beside their models and send {duplicates} copies identical to their covers to the Recycle Bin?',
settingsSidecarsMoving: 'Moving files…',
settingsSidecarsDone: '✓ Moved {moved} files, dropped {deduped} duplicate copies.',
settingsSidecarsPartly: 'Moved {moved} files, dropped {deduped} duplicate copies; {failed} did not move and still work where they are (the browser console says why).',
settingsSidecarsFailed: 'This did not finish; the browser console says why.',
settingsBackup: 'Backup',
settingsBackupExport: 'Export a backup',
settingsBackupExportHelp: 'Workflow Recipes, combos, materials and saved prompts, parameter sets, and the names, notes and covers you gave your models, in one .zip. Keep it on a cloud drive or a USB stick and bring it back on a new computer.',
settingsBackupExportButton: 'Export',
settingsBackupImport: 'Import a backup',
settingsBackupImportHelp: 'Puts an exported .zip back. It first lists what is inside; by default only what this computer lacks is added, and nothing is deleted.',
settingsBackupImportButton: 'Choose file',
backupExportTitle: 'Export a backup',
backupExportIntro: 'Workflow Recipes, combos, materials and saved prompts, parameter sets and the plugin settings are included.',
backupExportModels: "Your models' names, notes and own covers",
backupExportModelsHint: 'Found again by file hash on another computer. What a scan fetched from Civitai is not needed: scan again.',
backupExportComfyHint: "The workflows saved in ComfyUI's workflow menu (user/default/workflows).",
backupExportScan: "Models' scan results",
backupExportScanHint: 'Names, trigger words and base models a scan found on Civitai (.info, small). Safe even if Civitai removes the model.',
backupExportCivitaiCovers: 'Civitai covers',
backupExportCivitaiCoversHint: 'The cover images and videos scans downloaded; can be hundreds of MB. Without them, scanning again after the import downloads them.',
backupDoneScan: 'Scan results: {model_infos} put back, {model_civitai_covers} Civitai covers (only where this computer has none).',
backupExportLibrary: 'Model list',
backupExportLibraryHint: "Each model's place, size, fingerprint and download link (small). On a new computer, the models it lacks can be downloaded again from the import.",
backupLibraryMissing: 'This computer lacks {count} of the models the backup knows ({size}).',
backupLibraryAllHere: 'All {total} {total|model|models} of the model list are on this computer.',
backupLibraryDownload: 'Find downloads…',
backupDownloadTitle: 'Download the missing models ({count})',
backupDownloadLooking: 'Looking for the downloads of {count} {count|model|models}…',
backupDownloadFound: 'A download was found for {found} of {count}. Tick the ones to download:',
backupDownloadNoSource: 'No download found (neither on Civitai nor by the saved link).',
backupDownloadByName: '⚠ Found by file name only, so it cannot be checked to be the same file; not ticked.',
backupDownloadTotal: '{count} chosen, {need} in all; {free} free on the disk.',
backupDownloadWhere: "Each goes to the folder and file name it had on the old computer, one after another, checked against its fingerprint and scanned after. Closing this window does not stop them. Their names and notes are put back by importing the same backup again once they are downloaded.",
backupDownloadStart: 'Download the chosen',
backupDownloadDone: '✓ Downloaded',
backupDownloadHide: 'Close (downloads go on)',
backupExportKey: 'The Civitai API key is never put in a backup.',
backupExportStart: 'Export',
backupExporting: 'Packing…',
backupExported: 'Downloaded: {name} ({size}). Keep it on a cloud drive or a USB stick.',
backupFailed: 'That did not work: {error}',
backupImportTitle: 'Import a backup',
backupReading: 'Reading {name}…',
backupFrom: '{name}: made {date}, plugin version {version}. Choose what to import:',
backupPart_recipes: 'Workflow Recipes',
backupPart_combos: 'Combos',
backupPart_materials: 'Materials and saved prompts',
backupPart_parameters: 'Parameter sets',
backupPart_comfy_workflows: "ComfyUI's own saved workflows",
backupCounts: '{new} new · {same} the same · {differs} different',
backupModels: "Models' names, notes and covers: {matched} of {total} {total|model|models} found on this computer",
backupModelsMissing: '{count} not found (maybe not downloaded yet): {names}',
backupSettings: 'Plugin settings',
backupSettingsHint: "Which model folders are shown, where downloads go and so on. Replaces this computer's settings; this computer's Civitai key stays.",
backupNothing: 'There is nothing to import in this backup.',
backupModeTitle: 'When this computer has a different file of the same name',
backupModeKeep: "Keep this computer's (recommended)",
backupModeReplace: "Take the backup's; this computer's goes to the Recycle Bin",
backupImportStart: 'Import',
backupImporting: 'Importing…',
backupDone: '{added} {added|file|files} added, {replaced} replaced, {skipped} skipped (the same, or this computer\'s kept).',
backupDoneModels: "Models: {model_notes} names and notes and {model_covers} {model_covers|cover|covers} put back; {covers_kept} of this computer's own covers kept; {models_missing} {models_missing|model is|models are} not on this computer.",
backupDoneSettings: "The plugin settings are now the backup's.",
backupFailedItems: 'Not done:',
backupDoneHint: 'Open the pages again to see them. Replaced files are in the Recycle Bin.',
activityBackupExport: 'Exported a backup',
activityBackupImport: 'Imported a backup',
settingsDownloadPlace: 'Download missing models to',
settingsDownloadPlaceHelp: '"Where the workflow says": into the subfolder the workflow names, so the node needs no change; a model without one goes into the folder below. "A set folder": always into the folder below, and the node is changed to the new place afterwards (Ctrl+Z undoes it). The dialog before each download can still change it.',
settingsDownloadPlaceWorkflow: 'Where the workflow says',
settingsDownloadPlaceFolder: 'A set folder',
settingsDownloadFolder: 'Folder',
settingsDownloadFolderHelp: 'Where downloaded and imported models go inside each kind\'s own models folder (loras, checkpoints…). Typed by hand, {base} becomes the model\'s base model, such as SDXL, Flux or Illustrious; a folder of that name you already have (any case or punctuation) is used; empty means the kind\'s folder itself.',
settingsDownloadFolderRoot: '(the kind\'s folder itself)',
settingsHfMirror: 'Hugging Face through the China mirror',
settingsHfMirrorHelp: 'Downloads from Hugging Face go through hf-mirror.com, usually much faster and steadier in mainland China. On by default for the Chinese interface. Only Hugging Face is affected; Civitai has no mirror.',
settingsDownloadKey: 'Civitai API key',
settingsDownloadKeyHelp: 'Some models need a Civitai login to download; your key lets them. Kept on this computer only.',
settingsDownloadKeySet: 'Set…',
settingsTabLook: 'Look',
settingsTabModels: 'Models',
settingsTabWorkflows: 'Workflows',
settingsTabCanvas: 'Canvas',
settingsTabPacks: 'Node packs',
settingsTabPrompts: 'Prompts',
settingsTabBackup: 'Backup',
settingsTabHelp: 'Help',
settingsDownloadFolderPreset0: 'By base model (such as loras/SDXL)',
settingsDownloadFolderPreset1: 'In Downloads, then by base model',
settingsDownloadFolderPreset2: 'All in a Downloads folder',
settingsDownloadFolderPreset3: 'Straight in the type\'s folder',
settingsDownloadFolderCustom: 'Type my own…',
settingsDownloadFolderExample: 'For example: {path}',
importChip: '+ Import',
importChipTitle: 'Put downloaded model files into the right folders (or drop the files on this page)',
importDropHint: 'Drop to put the models into the right folders',
importNoModels: 'Only model files go here (.safetensors, .gguf, .ckpt and so on)',
importTitle: 'Import {count} model(s)',
importIntro: 'Check what each file is and where it will go; change anything that is wrong.',
importFromDownloads: 'Found in Downloads: it will be moved',
importFromDesktop: 'Found on the Desktop: it will be moved',
importWillUpload: 'Its folder is unknown: a copy will be sent',
importRemove: 'Leave this one out',
importKind: 'Type',
importKindPick: 'Choose a type…',
importKind_checkpoints: 'Checkpoint',
importKind_loras: 'LoRA',
importKind_vae: 'VAE',
importKind_text_encoders: 'Text encoder (CLIP / T5)',
importKind_diffusion_models: 'Diffusion model (UNet)',
importKind_controlnet: 'ControlNet',
importKind_embeddings: 'Embedding',
importKind_clip_vision: 'CLIP Vision',
importKind_upscale_models: 'Upscale model',
importKind_ipadapter: 'IPAdapter',
importKindHelp_checkpoints: 'Checkpoint: the main image model, with its VAE and text encoder inside; loaded with "Load Checkpoint".',
importKindHelp_loras: 'LoRA: a small add-on for a character, style or idea, chained after the main model; its base model must match.',
importKindHelp_vae: 'VAE: turns images into latents and back, affecting colour and detail; most checkpoints carry one, separate ones go here.',
importKindHelp_text_encoders: 'Text encoder: turns the prompt into what the model understands (CLIP, T5…). Flux, SD3 and Wan load it separately.',
importKindHelp_diffusion_models: 'Diffusion model: only the main part of a model (Flux, Wan and others ship this way); it needs a VAE and text encoder of its own.',
importKindHelp_controlnet: 'ControlNet: guides the composition from line art, a pose, a depth map and so on.',
importKindHelp_embeddings: 'Embedding: a tiny prompt pack, used by writing its name in the prompt (often in the negative).',
importKindHelp_clip_vision: 'CLIP Vision: lets a model see a reference image; IPAdapter and image-to-video use it.',
importKindHelp_upscale_models: 'Upscale model: enlarges an image and adds detail.',
importKindHelp_ipadapter: 'IPAdapter: steers the style or a person from a reference image.',
importKindUnknown: 'Cannot tell what kind of model this is; choose its type above.',
importKindUnreadable: 'This format cannot be looked into safely; choose its type above.',
importBase: 'Base model: {base}',
importBaseNone: 'Base model: cannot tell (goes in the type\'s folder)',
importBaseShared: 'Works with several base models: goes in the type\'s folder',
importBaseCivitai: '(confirmed by Civitai)',
importChecking: 'reading the whole file and asking Civitai…',
importCivitaiDown: 'Civitai cannot be reached; judged from the file header',
importCivitaiUnknown: 'Civitai does not know this file; judged from the file header',
importCivitaiName: 'On Civitai: {name}',
importDuplicate: 'You already have this file: {path} (identical)',
importSameFile: 'A file of the same name and size is already there: {path}; probably the same',
importSameName: 'A file of that name exists: {path}. In the same place, this one is saved as "name (2)"',
importStillPut: 'Put it in anyway',
importLooking: 'Looking at the file…',
importPlaced: '✓ Put in {path}',
importMoving: 'Moving…',
importCopying: 'Copying…',
importUploading: 'Sending {percent}%',
importKeepOriginal: 'Keep the original (copy instead of move)',
importPutAll: 'Put in place ({count})',
importDone: 'Put {count} model(s) in place; reading their information',
importError_gone: 'The original file is gone (moved or deleted?)',
importError_io: 'Could not write the file (disk full, or no permission?)',
importError_incomplete: 'The file arrived incomplete; try again.',
importError_network: 'The connection dropped; try again.',
importError_not_local: 'Files can only be moved on the computer ComfyUI runs on.',
importError_not_model: 'Not a model file.',
importError_bad_type: 'Choose a type first.',
importError_unknown: 'The import failed; the ComfyUI console says why.',
tidyChip: 'Tidy',
tidyChipTitle: 'Find models in the wrong folder and files that are there twice',
tidyLoading: 'Checking…',
tidyDeepRunning: 'Reading the files to compare them; large ones can take a minute or two…',
tidyFailed: 'The check failed; the ComfyUI console says why.',
tidyBreaks: 'Here "{loader}" cannot read it; it needs "{right}".',
tidyMove: 'Move there',
tidyMoved: '✓ Moved {name} to {path}.',
tidyMovedHint: 'Workflows that already use it need "{to}" in place of "{from}".',
tidyLeft: '{count} of its files (cover, info) could not come along and stayed where they were.',
tidyDupGroup: '{count} identical files, {size} each',
tidyUnchecked: '{groups} more groups of same-size, unscanned files were not compared; comparing reads {size}.',
tidyDeep: 'Compare',
tidyLoader_checkpoints: 'Load Checkpoint',
tidyLoader_loras: 'Load LoRA',
tidyLoader_vae: 'Load VAE',
tidyLoader_text_encoders: 'Load CLIP',
tidyLoader_diffusion_models: 'Load Diffusion Model',
tidyLoader_controlnet: 'Load ControlNet Model',
tidyLoader_embeddings: 'embedding:name in the prompt',
tidyLoader_clip_vision: 'Load CLIP Vision',
tidyLoader_upscale_models: 'Load Upscale Model',
tidyLoader_ipadapter: 'IPAdapter loader',
modelTabAll: 'All models',
modelBasesLabel: 'Filter by base model',
modelBasesAll: 'All',
modelBasesUnknown: 'Unknown',
tidyLead: 'Each model is told by the "table of contents" inside its file; models in the wrong folder and identical files are found. Nothing changes here until you press a button.',
tidyAllGood: '✓ All tidy',
tidyChecked: '{count} model files checked: none in the wrong folder, none there twice.',
tidyStepMisplaced: 'In the wrong folder ({count}) · they fail to load there',
tidyStepDuplicates: 'Identical files ({count} {count|group|groups}) · wasted disk space',
tidyWhy_diffusion_models: 'This file is only the main part of a model, without VAE or text encoder; "{loader}" cannot read it, it needs "{right}".',
tidyWhy_checkpoints: 'This is a whole checkpoint (with its VAE and text encoder); it loads with "{right}".',
tidyWhy_loras: 'This is a LoRA: it goes after a main model with "{right}" and cannot be found here.',
tidyWhy_text_encoders: 'This is a text encoder (it turns the prompt into what the model understands); it loads with "{right}".',
tidyWhy_vae: 'This is a VAE; it loads with "{right}".',
tidyChangePlace: 'Change place',
tidyDupWhy: 'These files are exactly the same; one is enough. Click a cover to choose the one to keep.',
tidyKeep: 'Keep',
tidyExtra: 'Extra',
tidyRecycleExtra: 'Recycle the extra copies ({count})',
tidyRecycleConfirm: 'Send {count} extra copies ({size}) with their covers and info to the Recycle Bin? Kept: {keep}',
tidyRecycled: '✓ Sent {count} extra copies to the Recycle Bin, {size} freed.',
tidyUsageTitle: 'Models not used lately',
tidyUsagePacksTitle: 'Node packs not used lately',
tidyUsagePacksElsewhere: 'Node packs are tidied in Settings → Node packs →',
tidyUsageLead: 'Judged by the runs and opened workflows AMB notes, what your images and sounds record, your saved workflows (recipes and combos too) and the tabs open now. Anything here for less than 30 days is left out. These are suggestions: have a look before removing anything.',
tidyUsageRun: 'Look for them',
tidyUsageLedger: 'Runs and opened workflows noted since {date} ({days} days).',
tidyUsageLedgerShort: 'AMB has noted runs and opened workflows only since {date} ({days} days), less than this group asks; before that only the outputs and saved workflows tell, so the result may be incomplete.',
tidyUsageLedgerNone: 'AMB notes runs and opened workflows from this version on and has noted nothing yet; for now only the outputs and saved workflows tell, so the result may be incomplete.',
tidyUsageRunning: 'Reading the run record, your outputs and saved workflows… this takes a while with many images.',
tidyUsageFailed: 'The search failed; the browser console says why.',
tidyUsage30: 'Not used for 30 days',
tidyUsage90: 'Not used for 90 days',
tidyUsageNever: 'Never used',
tidyUsageAgain: 'Look again',
tidyUsageSeen: 'Read {outputs} outputs (images and sounds) and {saved} saved files.',
tidyUsageSeenCapped: 'Read {outputs} outputs (images and sounds) and {saved} saved files (too many to read them all; the result may be incomplete).',
tidyUsageNoOutput: 'No sign of use: never run, and in no opened workflow, output or saved workflow',
tidyUsageLast: 'Last used: {date} ({days} days ago)',
tidyUsageSaved: 'Used by {count} saved workflow(s) / recipe(s) / combo(s)',
tidyUsagePicked: '{count} picked, {size}',
tidyUsagePickHint: 'Tick the models to clear out',
tidyUsageRecycle: 'Move to the Recycle Bin',
tidyUsageConfirm: 'Move the {count} picked models ({size}) with their covers and notes to the Recycle Bin? They can be restored from there.',
tidyUsageRecycleFailed: 'Some models could not be moved to the Recycle Bin; the browser console says why.',
tidyUsageRecycled: '✓ Sent {count} models to the Recycle Bin, {size} freed.',
tidyUsageNone: 'No models in this group.',
tidyUsageMore: '{count} more ({size}) not listed; deal with the ones above first.',
tidyUsagePacksLead: 'These packs work only through their nodes, and none of their nodes was run, opened or saved in this period (on the canvas or in an open tab counts as use). "Installed" counts from the day its folder was made. The plugin leaves node packs alone: "Find it in the Manager" opens ComfyUI Manager searched for the pack (its name is copied too, to paste in the search box if nothing shows); there, Disable it (it can be enabled again) or Uninstall it, then restart ComfyUI.',
tidyUsageNoManager: 'ComfyUI Manager was not found. Once it is installed, node packs can be disabled or removed there.',
tidyUsageNodes: '{count} nodes',
tidyUsageNoNodes: 'No nodes',
tidyUsageInstalled: 'installed {days} days ago',
tidyUsageFeeds: 'The nodes of {packs} take what it makes: check those are not needed before disabling it',
tidyUsageFind: 'Find it in the Manager',
tidyUsageKeep: 'I still use it',
tidyUsageUnkeep: 'Unmark',
tidyUsageKeepFailed: 'The mark could not be saved; the browser console says why.',
tidyUsageKept: 'Marked as still in use',
tidyUsageKeptLead: 'You said you still use these packs, so they are not listed above. "Unmark" lets the records judge it again.',
tidyUsageUiPacks: 'Nodes unused for long, but it also works on the page',
tidyUsageUiPacksLead: 'The nodes of these packs went unused in this period, but the packs also add to the ComfyUI page (buttons, menus, panels, monitors…). Using only a panel or a button leaves no record, so it cannot be told here. Consider disabling one only if you no longer use what it adds to the page either.',
tidyUsagePageOnly: 'Working on the page or the server',
tidyUsagePageOnlyLead: 'These packs have no nodes: they work on the page or the server (menus, monitors, download tools…). No record can tell whether they are used; you know best.',
tidyUsagePacksNone: 'No pack in this group works only through nodes and went unused.',
settingsTranslation: 'Translation',
settingsDeeplKey: 'DeepL key',
settingsDeeplKeyHelp: "Prompts are translated with Google's free endpoint, or MyMemory (small allowance) when Google cannot be reached. With your own DeepL key, DeepL comes first and translates better. The Free plan gives 500,000 characters a month: sign up for DeepL API Free at deepl.com and copy the key from your account's API Keys page. Kept on this computer only, and never put in a backup.",
settingsDeeplKeyOn: 'Set',
settingsDeeplKeyOff: 'Not set',
settingsDeeplKeyPrompt: 'Paste your DeepL API key (a Free key ends in :fx). Clear the field and press OK to remove the saved key.',
settingsDeeplKeyCleared: 'DeepL key removed; translation uses Google and MyMemory again.',
settingsDeeplKeyWorks: 'The key works. A test sentence: {text}',
settingsDeeplKeyFailed: 'The key is saved, but DeepL did not translate: {why}. Until it does, Google translates.',
settingsDeeplKeySaveFailed: 'Could not save: {error}',
settingsDeeplBadKey: 'DeepL does not accept this key; check that all of it was copied',
settingsDeeplQuota: "this month's allowance is used up",
settingsDeeplBusy: 'DeepL is busy right now; try again in a while',
settingsOpening: "Opening and window",
settingsEntryHelp: "Where you open this browser from. Shortcuts are set in ComfyUI's settings under Anomalous Model Browser. While it is open, 1–9 go to the pages on the left, from the top.",
settingsFollowNode: "Open for the selected node",
settingsFollowNodeHelp: "When the browser opens with a text node selected on the canvas, Prompt Studio opens on it; with any other node (a KSampler, a model loader…), Current node. With nothing selected, the page you used last.",
shellRailKey: "{name} ({key})",
settingsLayout: "Window layout",
settingsLayoutHelp: "Window position, size, docking, scale and view mode back to their defaults.",
settingsReset: "Reset",
settingsHelp: "Help and feedback",
settingsTour: "Interface tour",
settingsTourHelp: "Points at each part of the window in turn: where each button is and what it does.",
settingsNewsHelp: "What changed in this version.",
settingsGuide: "Full guide",
settingsGuideHelp: "The complete written guide on GitHub, kept up to date with each release.",
settingsStart: "Start",
settingsOpenGuide: "Open",
feedbackTitle: "Found a problem, or have an idea?",
feedbackLead: "Tell me on GitHub; a sentence or two is enough. Versions and hardware are attached for you.",
feedbackReport: "Report a problem",
feedbackSuggest: "Suggest something",
starButton: "⭐ Star on GitHub",
starHint: "If the browser helps you, a Star on GitHub helps others find it",
settingsStar: "Star it on GitHub",
settingsStarHelp: "If the browser helps you, a Star helps others find it. Opens the project page: press ☆ Star at the top right.",
settingsStarOpen: "Open GitHub",
feedbackCopy: "Copy diagnostics",
feedbackCopyHint: "Plugin and ComfyUI versions, GPU and browser, without file paths or personal details; paste it anywhere.",
feedbackCopied: "Copied",
feedbackCopyFailed: "Could not copy",
feedbackWrite: "Write",
feedbackDialogLead: "Say what went wrong; a sentence or two is enough, in any language. \"Submit on GitHub\" opens a page with it written in; you only press Submit there (a GitHub login is needed).",
feedbackDialogSuggestLead: "A feature you want or something awkward; anything goes. \"Submit on GitHub\" opens a page with it written in; you only press Submit there (a GitHub login is needed).",
feedbackReportPlaceholder: "e.g. The scan on the Models page stops at 30%.",
feedbackSuggestPlaceholder: "e.g. I'd like to filter prompts by tag.",
feedbackScreenshotHint: "Screenshots or error messages can be dropped onto the GitHub page.",
feedbackAttach: "Attach the environment (plugin and ComfyUI versions, GPU, browser; no file paths or personal details)",
feedbackShowAttach: "See what is attached",
feedbackSubmit: "Submit on GitHub",
feedbackIssueBugPrefix: "[Bug] ",
feedbackIssueIdeaPrefix: "[Idea] ",
feedbackIssueEnvironment: "Environment (filled in automatically)",
settingsReportHelp: "Write a sentence or two here, then submit it on GitHub; versions and hardware are attached for you.",
settingsSuggestHelp: "A feature you want, or something that feels awkward.",
sidebarScan: 'Scan models',
sidebarGlobalWizardTitle: 'Global Scan Wizard',
sidebarProvenance: 'Record model fingerprints in workflows',
sidebarProvenanceDesc: "Generated images and saved workflows also store each model's fingerprint and download link, so Model Check can find the model after a rename or on another computer, and whoever gets the workflow knows where to download it.",
sidebarScanning: '⏳ Scanning...',
sidebarScanDone: '✅ Scan Complete',
scanProgressTitle: 'Model scan progress',
scanProgressPreparing: 'Preparing scan folders…',
scanProgressCounting: 'Counting models to inspect…',
scanProgressFolder: 'Folder {current}/{total} · {folder}',
scanProgressModel: 'Model {current}/{total} · {filename}',
scanProgressFinished: 'Scan results have been refreshed.',
scanProgressProblem: 'Scan interrupted',
scanProgressInterrupted: 'A scan state left by the previous abnormal exit was detected and cleared automatically.',
scanProgressRetryReady: 'Scanning is available again and can be restarted now.',
scanProgressLastError: 'Most recent error: {error}',
sidebarUiScale: "Interface scale",
sidebarViewMode: 'View Mode',
sidebarViewModeCompact: 'Compact',
sidebarViewModeStandard: 'Standard',
sidebarViewModeAesthetic: 'Aesthetic',
sidebarBgAtmosphere: 'Background Atmosphere',
sidebarResetConfirm: 'Reset window position, scale and dock state?',
promptLibrarySyncFailed: "Saved prompts did not sync. Existing cards are kept; retrying automatically.",
promptLibrarySource: "A prompt you saved; you can rename or delete it",
promptCardPositive: "⊕ Positive",
promptCardNegative: "⊖ Negative",
promptCardCopy: "Copy",
promptCardCopied: "Copied",
promptCardCopyHint: "Copy the prompt text",
promptCardPin: "Pin",
promptCardPinned: "Pinned",
promptCardPinHint: "Keep the preview open",
promptCardClose: "Close the preview",
promptCardAddHint: "Click a card to add it to the prompt box, or drag it onto a prompt box on the canvas",
promptCardAdd: "Add",
promptCardAddTitle: "Add it to the matching prompt box",
promptStudioTitle: "Prompt Studio",
promptStudioResize: "Drag to resize, double-click to reset",
promptStudioDockLeft: "Dock left",
promptStudioDockRight: "Dock right",
promptStudioDock: "Beside the canvas",
promptStudioDockHint: "Move it beside the canvas to see the canvas while you edit. The browser window folds away.",
promptStudioUndock: "Back to the window",
promptStudioUndockHint: "Put it back on the browser's Prompts page.",
promptStudioViewTags: "Tags",
promptStudioViewText: "Text",
promptStudioViewHint: "Show the prompt as tags or as the whole text",
promptStudioGlossOff: "No meanings",
promptStudioGlossIn: "Meaning in {language}",
promptStudioGlossHint: "Show each tag's meaning under it (looked up with the translation service)",
promptStudioEditing: "Editing {node}",
promptStudioDraft: "Draft (not in any node)",
promptStudioDraftHint: "Select a prompt node on the canvas to edit it here. A draft can be saved, or dragged onto the canvas by its ⠿ handle.",
promptStudioUseDraftHint: "Stop editing this node and write in a blank draft",
promptStudioUndo: "Undo",
promptStudioUndoHint: "Undo the last change made in the studio (Ctrl+Z on the canvas works too)",
promptStudioPositive: "positive",
promptStudioNegative: "negative",
promptStudioWrongBox: "A {card} card can't go into a {box} prompt box",
promptStudioNoBoxFor: "This node has no box for a {card} prompt",
promptStudioAddPlaceholder: "Type a prompt and press Enter",
promptStudioAddHint: "Several at once, separated by commas; text in other languages is translated to English",
promptStudioTranslating: "Translating…",
promptStudioTranslateFailed: "Could not translate; try again later",
promptStudioHasForeign: "Some words here are not English; most models only read English.",
promptStudioToEnglish: "Translate to English",
promptStudioCopy: "Copy",
promptStudioCopied: "Copied",
promptStudioSave: "Save",
promptStudioSaveHint: "Save as a card under My prompts",
promptStudioSaveName: "Name this prompt",
promptStudioSaved: "Saved as {name}, under My prompts",
promptStudioSavedBefore: "Already saved as {name}",
promptStudioSaveFailed: "Could not save; try again",
promptStudioDragOut: "Drag onto the canvas: onto a prompt box to fill it, onto empty canvas for a new prompt node",
promptStudioEmpty: "No prompt yet. Click a card, or type here.",
promptStudioWeight: "Weight {weight}",
promptStudioWeightDown: "Weaker",
promptStudioWeightUp: "Stronger",
promptStudioEditTag: "Edit",
promptStudioRemoveTag: "Remove",
promptStudioTagHint: "Click to select (and set its weight), double-click to edit, drag to move",
promptStudioAllThere: "Those tags are there already",
promptStudioRefTitle: "Reference: {name}",
promptStudioRefClose: "Close the reference",
promptStudioRefBack: "‹ Cards",
promptStudioRefAddAll: "Add all",
promptStudioRefAddAllHint: "Add every tag of this card at once (those there already are not added twice)",
promptStudioRefNote: "Click a tag to add just that one to the prompt being edited; ticked ones are there already.",
promptStudioRefTake: "Add just this tag",
promptStudioRefThere: "This tag is there already",
promptStudioRefHint: "A clicked card now opens as a reference, to pick its tags one by one; to add it whole, press “Add all” on the reference.",
promptStudioAddedSkipped: "Added {count}; {skipped} were there already",
promptDeckSearch: "Search cards…",
promptDeckNew: "New card",
promptDeckNewName: "Card name (optional)",
promptDeckNewText: "Prompt text, tags separated by commas",
promptDeckPresets: "Common",
promptDeckSaved: "My prompts",
promptDeckRolePositive: "Positive",
promptDeckRoleNegative: "Negative",
promptDeckTagCount: "{count} {count|tag|tags}",
promptDeckNoMatch: "No matching cards",
promptDeckSavedEmpty: "None yet. Prompts kept with the gallery's ☆, saved from a prompt box, or made with + show up here.",
promptPresetQuality: "Quality",
promptPresetNegative: "Common negative",
promptPresetAnatomy: "Hands and anatomy",
currentNodeEditInStudio: "Edit in Prompt Studio",
promptCardRename: "Rename",
promptCardRenameHint: "Rename this saved prompt",
promptCardRenameAsk: "New name",
promptCardRenameFailed: "Could not rename it; try again.",
promptCardDelete: "Delete",
promptCardDeleteHint: "Delete this saved prompt (to the Recycle Bin)",
promptCardDeleteConfirm: "Delete “{name}”? Its positive and negative parts go together, to the Recycle Bin.",
promptCardDeleteFailed: "Could not delete it; try again.",
promptCardDragCanvas: "Release: a new prompt node here",
promptNodePositive: "CLIP Text Encode (Positive)",
promptNodeNegative: "CLIP Text Encode (Negative)",
toolWorkflowTransferTitle: "Share and import",
toolModelSourcesTitle: "Where each model is downloaded; any site's link can go here",
toolModelSourcesShort: 'Sources',
modelSourcesTitle: "Model sources",
modelSourcesLead: "Where each model is downloaded. A link is kept in the model's own information (the editor's download link is the same), from any site; links of this workflow's models are kept in the workflow too, so they travel with it.",
modelSourcesOpen: "Open",
modelSourcesSave: "Save",
modelSourcesSavedBoth: "Saved in the model's information and this workflow",
modelSourcesSavedWorkflow: "Saved in this workflow (the model is not on this computer)",
modelSourcesSaveFailed: "Not saved: {error}",
modelSourcesFound: "Found one; check it, then Save",
modelSourcesNotFound: "Nothing found; paste the link yourself",
modelSourcesStats: "With a link: {done} / {total}",
modelSourcesKeepAll: "Keep all links in the workflow",
modelSourcesKeptAll: "Kept {count} {count|link|links} in the workflow",
modelSourcesWorkflowEmpty: "The canvas uses no models",
modelSourcesNoteTitle: "Model sources",
modelSourcesNoteFile: "File",
modelSourcesNoteLink: "Link",
modelSourcesNoteCount: "{count} {count|model|models}",
modelSourcesScopeWorkflow: "This workflow",
modelSourcesScopeLibrary: "All models",
modelSourcesFilterAll: "All",
modelSourcesFilterResolved: "With a link",
modelSourcesFilterUnresolved: "No link yet",
modelSourcesSearchPlaceholder: "Search models or nodes",
modelSourcesGenerateNoteNode: "Add a note to the canvas",
modelSourcesCopySummary: "Copy the list",
modelSourcesCopied: "List copied",
modelSourcesNoteCreated: "Added a sources note to the canvas",
modelSourcesAutoDetect: "Find it",
modelSourcesSavedLocal: "Saved in the model's information",
modelSourcesStatusMissingOnDisk: "Not on this computer",
modelSourcesStatusUnfilled: "no link yet",
modelSourcesStatusUnfilledOptional: "optional",
modelSourcesComponentsAdvanced: "{count} {count|component|components}",
modelSourcesComponentsOptionalHint: "VAE, text encoders and the like; a link is optional",
modelSourcesLibraryLoading: "Loading all models…",
modelSourcesLibraryLoadFailed: "All models could not be loaded.",
modelSourcesRetry: 'Retry',
modelSourcesTypeTextEncoder: 'Text encoder',
modelSourcesTypeVae: 'VAE',
modelSourcesTypeVaeApprox: 'Preview VAE',
modelSourcesTypeVisionEncoder: 'Vision encoder',
modelSourcesLocalTargetUnknown: "This model's file is not on this computer, so the link has nowhere to go.",
modelSourcesNoModelsFound: "No models match",
modelSourcesUrlPlaceholder: "Paste the download page's link, any site",
sidebarManageFolders: 'Manage Folders',
sidebarVideoPlayback: "Video covers",
sidebarAlwaysPlay: "Always play",
sidebarHoverPlay: "Play on hover (recommended)",
sidebarCardQuality: "Card pictures",
sidebarOptimizedThumbnail: "Thumbnails (recommended)",
sidebarOriginalCover: "Originals",
delSure: 'Confirm Delete?',
dockTitle: 'Dock to Left',
maximizeTitle: 'Full window / restore (or double-click the title bar)',
replaceAll: 'Replace All',
editRaw: 'Edit full text',
findPlaceholder: 'Find...',
replacePlaceholder: 'Replace with...',
models: 'Models',
gallery: 'Gallery',
settingsBtn: 'Settings',
importBtn: 'Import Workflow (Share Code)',
recipeTitle: 'Workflows',
recipeSaveCurrent: 'Save Current Workflow',
recipeSaveTitle: 'Save Workflow Recipe',
recipeName: 'Name',
recipeDefaultName: 'New Workflow Recipe',
recipeNameRequired: 'Enter a recipe name.',
recipeTags: 'Tags',
recipeTagsHint: 'For example: portrait, SDXL, upscale',
recipeNotes: 'Notes',
recipeNotesHint: 'Why this version works well…',
recipeThumbnail: 'Workflow thumbnail',
recipeCancel: 'Cancel',
recipeSave: 'Save',
recipeSaving: 'Saving…',
recipeVerificationMissing: '{count} model reference(s) are missing verified identity',
recipeVerifyOnSave: 'Verify and save full SHA-256 hashes',
recipeVerifyOnSaveHint: 'Off by default. Saving may take longer when enabled.',
recipeSaveReceipt: 'Saved: {nodes} {nodes|node|nodes}, {links} {links|link|links}, {groups} {groups|group|groups}.',
recipeSaveReceiptMismatch: 'Saved, but the integrity receipt differs from the current canvas. Reopen the recipe to verify it.',
recipeLoadError: 'Could not load Workflow Recipes.',
recipeUntitled: 'Untitled Recipe',
recipeSearchPlaceholder: 'Search names, notes, or tags…',
recipeNoMatches: 'No recipes match. Clear the search or tag filters.',
recipeExport: 'Export recipe package',
recipePackageExportTitle: 'Export recipe package: {name}',
recipePackageExportIntro: "This recipe's workflow, name, notes, tags, parameters, cover and model thumbnails in one .zip to give to someone. Dropped into the ⇅ of their Workflows page, it becomes a recipe card.",
recipePackageHistory: 'Include its versions',
recipePackageHistoryHint: 'The older versions you saved. Usually not needed by others.',
recipePackageExportStart: 'Export',
recipePackageExported: 'Downloaded: {name} ({size}). In chat apps, send it as a file.',
recipePackageImportTitle: 'Import recipe package',
recipePackageImportWhat: 'Recipe "{name}": {cover}, {pictures} model thumbnails.',
recipePackageImportCover: 'a cover',
recipePackageImportNoCover: 'no cover',
recipePackageImportHistory: 'It also carries {count} older versions.',
recipePackageImportRenamed: 'You already have a recipe of that name; this one is kept as "{name}" and yours stays.',
recipePackageImportModels: 'Model Check tells which models are missing when the workflow opens, and can download them.',
recipePackageKeep: 'Keep as recipe',
recipePackageKeepAndOpen: 'Keep and open',
recipePackageImported: 'Kept as recipe: {name}',
recipeAppendCanvas: 'Append to Canvas',
recipeAppendError: 'Could not append this recipe to the current canvas.',
recipeOpenCanvas: 'Open in New Canvas',
recipeOpenError: 'Could not open this recipe in a new canvas.',
recipeDragHint: 'Drag onto canvas to load workflow',
recipeDragTargetCanvas: 'Drop to load workflow onto canvas',
recipeCardDragHint: 'Hold & drag card onto canvas to load workflow',
recipeCardPrimaryActionTooltipComplete: 'Open workflow in new canvas (or drag & drop card directly)',
recipeCardPrimaryActionTooltipPartial: 'Append module to current canvas (or drag & drop card directly)',
recipeEmptyGuideTitle: 'Workflow Recipe Studio is Empty',
recipeEmptyGuideSubtitle: "Keep a tuned workflow with its models and settings, and use it again next time.",
recipeEmptyStep1Title: '1. Save Current Workflow',
recipeEmptyStep1Desc: "Press Save current workflow at the top right to keep the canvas and its settings as a recipe.",
recipeEmptyStep2Title: '2. Drag onto Canvas',
recipeEmptyStep2Desc: "Drag a recipe card onto empty canvas and let go: the whole workflow loads, no rewiring.",
recipeEmptyStep3Title: "3. Missing models",
recipeEmptyStep3Desc: "When a recipe opens, Model Check finds models you renamed or moved on this computer and puts them in.",
recipeEmptySaveCurrentBtn: 'Save Current Workflow',
recipeScopePartialSaveHint: "This is not a workflow that runs on its own (no output node, say), so it is saved as a module you add to an open canvas.",
recipeScopeCompleteSaveHint: "This workflow runs on its own; you can open it on a new canvas later.",
recipeDelete: 'Delete',
recipeDeleteConfirm: 'Delete this Workflow Recipe? The recipe, its versions and images go to the Recycle Bin.',
recipeDeleteError: 'Could not delete this Workflow Recipe.',
recipeSaveError: 'Could not save this Workflow Recipe.',
recipeCopyParameter: 'Copy parameter value',
recipeCopied: 'Copied',
recipeCopyFailed: 'Copy failed',
recipeAdvancedInfo: 'Advanced information',
recipeInlineEditName: 'Click to edit the name',
recipeInlineEditNotes: 'Click to edit notes',
recipeInlineEditTags: 'Edit tags',
recipeMissingNodes: 'These node types are currently missing; the restored workflow may not run',
recipeBindImage: 'Cover',
recipeNoImage: 'No cover',
recipeCanvasPreview: 'Current canvas',
recipeLoadingRecentImages: 'Loading recent outputs…',
recipeRecentImagesUnavailable: 'Recent outputs are currently unavailable.',
recipeKeepImage: 'Keep current cover',
recipeEdit: 'Edit',
recipeEditTitle: 'Edit Workflow Recipe',
recipeHistory: 'Version history',
recipeHistoryEmpty: 'No prior version yet. The previous version is retained automatically on update.',
recipeUnknownVersion: 'Unknown time',
recipeRestoreVersion: 'Restore this version',
recipeRestoreVersionConfirm: 'Restore this version? The current recipe will first be retained in history.',
recipeEditCanvas: 'Edit on canvas',
recipeEditCanvasConfirm: 'Loading replaces the current canvas. After structural edits, use Update Current Recipe to save a new version. Continue?',
recipeUpdate: 'Save updates',
recipeUpdateCurrent: 'Update Current Recipe',
recipeUpdateError: 'Could not update this Workflow Recipe.',
recipeDetailBack: 'Back to recipes',
recipeGallery: 'Gallery',
recipeGalleryLoading: 'Finding matching history images…',
recipeGalleryEmpty: 'No matching result was found in the latest 200 PNGs with workflow metadata.',
recipeGalleryRefresh: 'Refresh matches',
recipeGalleryLoadError: 'Could not load the recipe gallery.',
recipeGalleryScanHint: 'Checked the latest {count} {count|PNG|PNGs} with workflow metadata.',
recipeGalleryOpenImage: 'View full image',
recipeGalleryDifferenceHint: 'These are node-parameter differences; gallery matching only uses node types.',
recipeParameterSnapshots: 'Parameter snapshots',
recipeParameterLoading: 'Loading parameter snapshots…',
recipeParameterLoadError: 'Could not load parameter snapshots.',
recipeParameterUntitled: 'Untitled parameter snapshot',
recipeParameterDelete: 'Delete set',
recipeParameterDeleteConfirm: 'Delete the parameter note “{name}”? It goes to the Recycle Bin.',
recipeParameterDeleteError: 'Could not delete the parameter note. Please try again.',
recipeParameterNew: 'New parameter note',
recipeParameterReadCurrent: 'Read current and create',
recipeParameterReadCurrentError: 'Could not read parameters from the current canvas.',
recipeParameterSkeletonMismatch: 'The current canvas is missing recipe skeleton nodes; nothing was changed.',
recipeParameterWidgetMismatch: 'The current node widgets do not match this parameter note:',
recipeParameterNodeUnavailable: 'Could not resolve a matching node on the current canvas:',
recipeParameterApply: 'Apply to current workflow',
recipeParameterApplied: 'Applied {count} {count|parameter|parameters}',
recipeParameterApplyError: 'Could not apply parameters; the current canvas was not fully changed.',
recipeParameterNewHint: 'Edit node parameters from the current recipe skeleton. Runtime-changing values such as seeds are ignored. Saving creates a new read-only snapshot and never overwrites history.',
recipeParameterName: 'Note name',
recipeParameterSave: 'Save parameter note',
recipeParameterCancel: 'Cancel editing',
recipeParameterSaveError: 'Could not save the parameter note.',
recipeParameterSensitiveHidden: 'Sensitive widget hidden',
recipeDetailUnknownNode: 'Unnamed node',
recipeDetailWidget: 'Widget',
recipeDetailScheduler: 'Scheduler',
recipeDetailSteps: 'Steps',
recipeDetailCFG: 'CFG',
recipeDetailDenoise: 'Denoise',
recipeDetailNoSavedParameters: 'This recipe has no displayable parameters.',
recipeDetailVersions: 'Versions',
recipeDetailModelComposition: "Models it uses",
recipeDetailBaseModel: 'Base model',
recipeDetailNotIndexed: 'Not indexed yet',
recipeDetailSampler: 'Sampler',
recipeDetailResolution: 'Resolution',
recipeDetailUnavailable: 'Unavailable',
recipeDetailNoNotes: 'No notes.',
recipeDetailUpdated: 'Updated',
recipeDetailCopyFingerprint: 'Copy workflow fingerprint',
recipeDetailPrompts: 'Prompts',
recipeDetailNoPrompts: 'This recipe has no safe prompt summary to show.',
recipePromptSupportNotice: 'Automatic detection currently supports ComfyUI CLIPTextEncode and known official connections only. Label third-party text nodes manually.',
recipePromptRoleChoose: 'Choose prompt role',
recipePromptRoleAutomatic: 'Automatic',
recipePromptRoleManual: 'Manually labelled',
recipePromptRolePositive: 'Positive prompt',
recipePromptRoleNegative: 'Negative prompt',
recipePromptRoleBoth: 'Shared positive / negative',
recipePromptRoleIgnored: 'Ignore',
recipePromptRoleUnknown: 'Role unknown',
recipePromptRoleSaveError: 'Could not save the prompt role. Please try again.',
recipeDetailVolatileIgnored: 'Runtime-changing value ignored',
recipeDetailExpandValue: 'Show full value',
recipeDetailCollapseValue: 'Collapse value',
recipeDetailAvailable: 'Available locally',
recipeDetailMissing: 'Missing locally',
recipeDetailAvailabilityNotChecked: 'Not checked locally',
recipeDetailNoModelReferences: 'No supported model loaders were detected. Other custom widgets remain in Parameters and the full workflow.',
recipeDetailModel: 'Model',
recipeOpenLocalModel: 'Open local model details',
recipeModelNoteAdd: 'Add Model Note',
recipeModelNoteEdit: 'Edit Model Note',
recipeModelNoteEmpty: 'No personal model note',
recipeModelNoteTitle: 'Personal Model Note',
recipeModelNotePrompt: 'Record usage, suggested weight, or cautions for this model in the current recipe. Save an empty value to remove the note.',
recipeModelNoteError: 'Could not save the model note.',
recipeDetailCurrentVersion: 'Current version',
recipeCompareVersion: 'Compare version',
recipeDiffLoading: 'Comparing…',
recipeDiffSummary: 'Change summary',
recipeDiffBefore: 'Before',
recipeDiffAfter: 'After',
recipeDiffNoChanges: 'No meaningful changes were detected between these versions.',
recipeDiffError: 'Could not read this historical version.',
recipeDiffPinned: 'Pinned parameters',
recipeDiffPrompts: 'Prompts',
recipeDiffModels: 'Model references',
recipeDiffParameters: 'Parameter summary',
recipeDiffWorkflow: 'Workflow structure',
recipeDiffPresentation: 'Presentation',
recipeDiffOther: 'Other',
recipeDetailUnknownTime: 'Unknown time',
recipeParameterRename: 'Rename',
recipeParameterRenamePrompt: 'Enter a new name for this parameter notebook:',
recipeParameterRenameError: 'Failed to rename parameter notebook',
recipeStatusReady: "Every model is on this computer",
recipeStatusChecking: "Checking which models are on this computer…",
recipeStatusNoModels: "No model loaders found",
recipeMissingHint: "Once it is on the canvas, Model Check looks for them on this computer (renamed or moved ones too) and says where to download the rest.",
recipeModelDownloadPage: "Download page",
recipeStatusMissing: "{count} {count|model|models} missing",
recipeStatusChecking: '⏳ Checking Environment…',
recipeRawNodesShowMore: 'Show {count} more nodes…',
recipeCardSpecsSteps: 'Steps',
recipeCardSpecsSampler: 'Sampler',
recipeCardSpecsResolution: 'Size',
audioVoiceClipCount: "{count} {count|clip|clips}",
audioSearchCharacters: "Search characters or emotions",
audioPlay: "Play",
audioCopyTagLabel: "Copy {tag}",
audioCopyMainHint: "Paste into the speech text: what follows goes back to the main voice",
audioCopyEmotionHint: "Paste into the speech text: what follows is read in the “{emotion}” voice",
audioCopied: "Copied",
audioGuideTitle: "Audio studio guide",
audioGuideFilesTitle: "1. Import characters",
audioGuideFilesBody: "Press \"Import character\" or drop the GPT and SoVITS models and reference clips here (several characters or whole folders work too, sorted by name). On a card, \"Edit emotions\" picks a reference clip per emotion and \"Pronunciation\" fixes words it keeps misreading. Where characters are kept and pretrained files are under \"GPT-SoVITS settings\" at the bottom of the sidebar.",
audioGuideDragTitle: "Drag: a character onto a node",
audioGuideDragBody: "Drag a character card's header (or the character in the sidebar) onto a \"Character Speech (GPT-SoVITS)\" node to select that character. While dragging, the hint says what releasing will do; a wrong node is refused with the reason, and nothing is written.",
audioGuideTagsTitle: "Emotions come from {tags} in the text",
audioGuideTagsBody: "Tags in the text switch emotion: {happy} (or {开心}) uses that emotion's reference, {main} goes back to the main voice. Characters with emotions have a “Copy {tag}” button on each row. [Character] changes speaker and [pause:1s] adds a pause, written straight into the text.",
audioGuideScriptTitle: "Voice-over: no hand-written tags",
audioGuideScriptBody: "On Voices, switch to \"Voice-over\" at the top, click the character to read in the list on the left, paste the script and press \"Split into lines\". Each sentence becomes a card: click to pick it (Ctrl / Shift for more), double-click to edit it, and to have another character read it click that character on the left or the name on the card. Each card has its emotion and can be split, merged or deleted. ▶ on a line lets you listen; then press \"Generate\". To use your own workflow instead, \"Into your own workflow\" below pushes to a node, drags onto one or copies, filling in both the character and the text.",
audioGuideGenerateTitle: "Generate and find it in the audio gallery",
audioTourImportTitle: "Import characters",
audioTourImportBody: "Import the GPT and SoVITS models and reference clips here, or drop files or a whole folder onto this page.",
audioTourDragTitle: "Drag onto a node",
audioTourDragBody: "Hold a character card's header and drop it on a \"Character Speech (GPT-SoVITS)\" node on the canvas to switch it to that character.",
audioTourEditTitle: "Emotions and pronunciation",
audioTourEditBody: "\"Edit emotions\" picks a reference clip per emotion, \"Pronunciation\" fixes words it keeps misreading, \"Add files\" adds clips to this character.",
audioTourTagTitle: "Emotion tags",
audioTourTagBody: "Click to copy this {tag}; written in the text, the lines after it use that emotion's voice.",
audioTourScriptTitle: "Voice-over",
audioTourScriptBody: "Writing lines and generating speech happens here: paste a whole script, pick an emotion per line and generate right away, or push it to a node to use your own workflow.",
audioTourGalleryTitle: "Audio gallery",
audioTourGalleryBody: "Everything generated is here, to play and search by text.",
audioTourSettingsTitle: "GPT-SoVITS settings",
audioTourSettingsBody: "Where the characters are, downloading the base files, and the tone they use: all set here.",
audioGuideGenerateBody: "Press \"Generate\" on the Voice-over page, without touching the canvas; results go to output/audio/<character>/, and a single line can be redone on its own. Afterwards the audio gallery lets you play results and search by text; preview-only results can be saved there.",
audioEngineInstallTitle: "{engine} needs the {pack} node pack",
audioEngineDesc: "GPT-SoVITS (Anomalous TTS) uses your trained GPT-SoVITS character models for a faithful voice, with batched lines, multi-character dialogue and pause tags.",
audioEngineInstallHow: "To install: open ComfyUI Manager, search for \"{search}\" and install it (or follow the project page), then restart ComfyUI.",
audioEngineOpenRepo: "Open project page",
audioSectionCharactersOf: "{engine} characters",
audioDragCardHint: "Drag the header → GPT-SoVITS node",
audioDragCharacterTitle: "Drop onto a GPT-SoVITS node to set its character to {character}. Switch emotions with {tags} in the text.",
ttsPronounceOpen: 'Pronunciation',
ttsPronounceTitle: 'Pronunciation: {name}',
ttsPronounceSubtitle: 'When the script says the left text, this character reads the right text. Scripts and subtitles stay as written; only the voice changes',
ttsPronounceTips: 'Longest match first, replaced once. A Japanese model speaking Chinese: swap sounds it cannot say (ü as in 选, -ng as in 模型) for easier same-sounding characters, or put a character before the word; write Latin letters as Chinese characters that sound alike (C站 → 西站); fix a misread polyphone with a same-sounding character (粘进 → 沾进). Leave the right side empty to skip the text.',
ttsPronounceLanguage: 'Preview language',
ttsPronounceFromPlaceholder: 'Text in the script',
ttsPronounceToPlaceholder: 'Read it as',
ttsPronounceNow: 'Now',
ttsPronounceNowHint: 'Hear how this character reads the left text now (the saved table applies)',
ttsPronounceAfter: 'After',
ttsPronounceAfterHint: 'Hear the right text read aloud',
ttsPronounceAdd: '+ Add a line',
ttsPronounceFromMissing: 'A line has only a reading ({to}); write the script text on the left',
ttsPronounceDuplicate: '"{from}" is listed twice; keep one line',
ttsEditorOpen: "Reference audio and emotions",
ttsRefsTitle: "Reference audio · {name}",
ttsRefsSubtitle: "Pick a voice on top, then its reference clips below: the main reference sets the tone and way of speaking, auxiliary ones blend in their timbre. Saved to anomalous_tts.json in the character folder.",
ttsRefsMainVoice: "Main voice",
ttsRefsCountMain: "1 main",
ttsRefsCountAux: "1 main, {aux} aux",
ttsRefsCountAuto: "automatic",
ttsRefsCountAutoAux: "automatic + {aux} aux",
ttsRefsCountNone: "no main reference yet",
ttsRefsNewEmotion: "New emotion",
ttsRefsNewEmotionPrompt: "The new emotion's name, e.g. happy (lines marked with it use this voice)",
ttsRefsNameMissing: "An emotion needs a name",
ttsRefsRename: "Rename",
ttsRefsRenamePrompt: "The emotion's new name (lines marked with the old one need it too)",
ttsRefsDelete: "Delete this emotion",
ttsRefsDeleteConfirm: "Delete the emotion “{name}”? The audio files stay; it is just not used any more.",
ttsRefsMainHint: "Lines without an emotion use the main voice.",
ttsRefsMainAuto: "The node picks the main voice's reference itself ({file}). Click Main below to use the one you pick.",
ttsRefsBackToAuto: "Let the node pick again",
ttsRefsEmotionHint: "Lines marked “{name}” use this voice.",
ttsRefsFromFilename: "This emotion comes from a file name (name.emotion.wav): its main reference can change and aux ones can be added; to rename or delete it, rename the file.",
ttsRefsSearch: "Search lines or file names",
ttsRefsFilter_all: "All {count}",
ttsRefsFilter_here: "This voice {count}",
ttsRefsFilter_used: "In use {count}",
ttsRefsFilter_noline: "No line {count}",
ttsRefsNoLine: "No line found: click to type it",
ttsRefsLineBack: "Back to the file's line once saved",
ttsRefsNeedsUpdate: "Auxiliary references and fixed lines need Anomalous_TTS 1.1.0 (interface 18): update it in GPT-SoVITS settings.",
ttsRefsSeconds: "{seconds} s",
ttsRefsTooLongShort: "A main reference needs 3–10 s; this one can be an auxiliary one.",
ttsRefsUse_main: "{name} · main",
ttsRefsUse_aux: "{name} · aux",
ttsRefsUse_auto: "picked by the node",
ttsRefsMain: "Main",
ttsRefsAux: "Aux",
ttsRefsMainHintRow: "This voice's main reference (sets the tone and way of speaking; just one)",
ttsRefsMainOffHint: "Click again to let the node pick",
ttsRefsAuxHintRow: "An auxiliary reference: its timbre is averaged with the main one; any number, no line needed",
ttsRefsAuxVersion: "This character is a {version} model: only v1 / v2 / v2Pro use auxiliary references.",
ttsRefsNote: "Auxiliary references work best from the same speaker, 2–4 clean clips.",
ttsRefsNothing: "No clip matches.",
ttsRefsShowMore: "Show more ({count} left)",
ttsRefsNoMain: "The emotion “{name}” has no main reference yet.",
ttsRefsCloseUnsaved: "There are unsaved changes. Close anyway?",
ttsEditorRemove: "Remove this row",
ttsEditorSave: "Save",
ttsEditorSaveFailed: "Could not save: {error}",
ttsEditorLoadingFiles: "Reading this character's audio files…",
ttsEditorFileCount: "{count} audio files in this character.",
ttsEditorLoadFailed: "Could not read the audio files: {error}",
ttsEditorUnknownAudio: "{file} is not in this character's folder",
ttsEditorNameInvalid: "The emotion name \"{name}\" cannot be used: not main, and no {} [] characters",
ttsEditorNameDuplicate: "The emotion name \"{name}\" is used twice",
ttsCharacterError: "This character could not be read: {error}",
ttsMainMissing: "No suitable main voice (a 3–10 s reference clip) was found. Use \"Edit emotions\" to pick one.",
ttsEmptyTitle: "No characters yet",
ttsEmptyDesc: "Drop a GPT model (.ckpt), a SoVITS model (.pth) and reference clips here, or press the button below, to make your first character.",
ttsSetupTitle: "GPT-SoVITS settings",
ttsSetupCharacters: "{count} {count|character|characters}",
ttsSetupDownloading: "downloading pretrained files…",
ttsSetupPackagesMissing: "{count} Python packages missing",
ttsSetupPretrained: "Pretrained files",
ttsSetupPackages: "Python packages",
ttsSetupRemote: "These actions only work on the computer running ComfyUI (this page was opened from another device).",
ttsSetupFailed: "Could not do that: {error}",
ttsSetupDotPretrained: "Some pretrained files are not downloaded yet; open to see",
ttsSetupDotPackages: "Python packages are missing; open to see how to install them",
ttsReminderText: "{count} pretrained files your characters use are not downloaded yet (~{size}). They download on first use, or get them now.",
ttsReminderDownload: "Download now",
ttsReminderDismiss: "Don't remind me",
ttsImportPretrainedNote: "Generating also needs pretrained files: {files} (~{size}); they download on first use.",
ttsSetupStorage: "Where characters are kept",
ttsSetupOtherPlaces: "Other places",
ttsStorageHint: "Imported characters are kept here. To change the place, move the character folders yourself, then edit the settings file below (storage).",
ttsOtherPlacesHint: "Characters in these places keep working. Places from the settings file (libraries) are removed there and stop being listed after ComfyUI restarts; no files are deleted.",
ttsLibrarySource_default: "default",
ttsLibrarySource_yaml: "yaml config",
ttsLibrarySource_app: "settings file",
ttsLibraryMissing: "folder not found",
ttsNeededFor_all: "all models",
ttsNeededFor_zh: "Chinese",
ttsNeededFor_en: "English",
ttsNeededFor_ja: "Japanese",
ttsNeededFor_v2pro: "v2Pro models",
ttsPresetsTitle: "Tones",
ttsPresetsHint: "For every character, saved at once. A character can pick its own under Own settings on its card; numbers changed on the node go first.",
ttsPresetsSaved: "Saved.",
ttsPresetsSaveFailed: "Could not save: {error}",
ttsPresetsNeedsNode: "Generation presets need Anomalous_TTS v1.1.0 or newer; update it under \"Anomalous_TTS version\" below.",
ttsPreset_stable: "Steady",
ttsPreset_standard: "Natural",
ttsPreset_lively: "Lively",
ttsPresetDesc_stable: "fewer slips, flatter",
ttsPresetDesc_standard: "neither fast nor slow, the old default",
ttsPresetDesc_lively: "more feeling, slips now and then",
ttsPresetsLanguages: "Which tone a character uses when it speaks another language than its reference (a Japanese character speaking Chinese).",
ttsPresetsPair: "{ref} characters speaking {lang}",
ttsPresetsCross: "Any other pair of languages",
ttsPresetCustom: "yours",
ttsPresetDescCustom: "made by you",
ttsPresetWas: "was {value}",
ttsPresetResetOne: "Reset",
ttsPresetNew: "+ New",
ttsFeelSteady: "← Steadier, fewer slips",
ttsFeelLively: "Livelier, more ups and downs →",
ttsFeelLegend: "Ring: {base} Dot: this one",
ttsFeel_about: "About the same as {base}.",
ttsFeel_steadier: "A little steadier than {base}.",
ttsFeel_muchSteadier: "Much steadier than {base}.",
ttsFeel_livelier: "A little livelier than {base}.",
ttsFeel_muchLivelier: "Much livelier than {base}.",
ttsFeelYourDefault: "your default ({name})",
ttsFeelIsDefault: "This is your default; the others are compared with it.",
ttsFeelEditHint: "Click to change; it is saved into this preset at once",
ttsListen: "▶ Listen to this one",
ttsListenAgain: "▶ Play again",
ttsListenMaking: "Making it…",
ttsListenHint: "The same line with the same seed, only the mode changes, so they compare. The first take loads the model and is slower.",
ttsListenHeard: "Heard:",
ttsListenWho: "Listen with:",
ttsPresetDefaultBadge: "default",
ttsPresetIsDefault: "Every character uses this one by default",
ttsPresetMakeDefault: "Make default",
ttsPresetNewName: "Name of the new preset (up to {count} characters). Its numbers start as a copy of \"{from}\".",
ttsPresetRename: "Rename",
ttsPresetRenameAsk: "New name for \"{name}\"",
ttsPresetNameTaken: "There is already a preset called \"{name}\". Try another name.",
ttsPresetTooMany: "You can make up to {count} presets.",
ttsPresetDelete: "Delete",
ttsPresetDeleteAsk: "Delete the preset \"{name}\"?",
ttsPresetDeleteUses: "Used by: {list}. They go back to the general setting.",
ttsPresetUseDefault: "the default preset",
ttsTuningOpen: "Own settings",
ttsTuningTitle: "Own settings: {name}",
ttsTuningSubtitle: "Which preset and speed this character uses for each language. Left empty, the general presets (GPT-SoVITS Settings) apply. Under each row are the numbers in effect; blue ones differ from the general setting.",
ttsTuningAll: "All languages",
ttsTuningLang: "Speaking {lang}",
ttsTuningFollow: "General ({preset})",
ttsTuningSpeed: "Speed",
ttsTuningNumbers: "Numbers",
ttsTuningNumbersHint: "Empty ones use the preset's number (shown in grey).",
ttsTuningBadNumber: "The number for \"{name}\" is out of range.",
ttsTuningActual: "In effect:",
ttsTuningSameAsGeneral: "Same as the general setting:",
ttsTuningGeneralValue: "General setting: {value}",
ttsVersionTitle: "Anomalous_TTS version",
ttsVersionHint: "Stable releases of Anomalous_TTS. Nothing goes online until \"Check for updates\"; an update takes effect after restarting ComfyUI, and \"Back to\" undoes it.",
ttsVersionCheck: "Check for updates",
ttsVersionChecking: "Looking at the published releases…",
ttsVersionUpToDate: "This is the newest stable release",
ttsVersionNew: "New stable release {tag}",
ttsVersionUpdate: "Update to {tag}",
ttsVersionNotes: "What's new",
ttsVersionUndo: "Back to {tag}",
ttsVersionConfirm: "Update Anomalous_TTS from {from} to {tag}?\n\nIt takes effect after restarting ComfyUI.",
ttsVersionUpdated: "Anomalous_TTS is now {tag}.",
ttsVersionUnknown: "version unknown",
ttsVersionNoGit: "Only an Anomalous_TTS installed from GitHub with git (as ComfyUI Manager does) can be updated here. This one is not; update it in ComfyUI Manager.",
versionError_tts_missing: "No Anomalous_TTS installed with git was found. Update it in ComfyUI Manager.",
ttsNeededFor_v3: "v3 models",
ttsNeededFor_v4: "v4 models",
ttsNeededFor_v5dev: "v5dev models",
ttsNeededFor_v5turbo: "v5turbo models",
ttsModelVersion: "GPT-SoVITS {version} model",
ttsPretrainedOk: "ready",
ttsPretrainedMissing: "missing",
ttsPretrainedOptional: "missing (optional)",
ttsPretrainedQueued: "queued",
ttsPretrainedDownloading: "downloading {percent}%",
ttsPretrainedError: "download failed",
ttsPretrainedDownload: "Download (~{size})",
ttsPretrainedDownloadAll: "Download all (~{size})",
ttsPretrainedSource: "pretrained source",
ttsPretrainedHint: "Pretrained files are also downloaded on first use; Japanese-only characters do not need the Chinese ones. \"Optional\" ones only improve quality. If a GPT-SoVITS package is already on this computer, list it in the settings file below (pretrained) to use its files.",
ttsPackagesFor: "{lang}: missing {packages}",
ttsPackagesHint: "Run the command above in a terminal, then restart ComfyUI.",
ttsCopyCommand: "Copy command",
ttsCopied: "Copied",
ttsCopyPath: "Copy path",
ttsSettingsFile: "Settings file",
ttsSettingsFileHint: "The storage place (storage), other character folders (libraries) and GPT-SoVITS packages (pretrained) are changed in this file, not here: the node takes no paths on this computer from a web page. Write full paths, e.g. \"storage\": \"D:/voices\"; no restart needed.",
ttsKind_gpt: "GPT",
ttsKind_sovits: "SoVITS",
ttsKind_audio: "audio",
ttsKind_text: "text",
ttsImportOpenShort: "Import character",
ttsImportOpen: "+ Import character",
ttsImportAddOpen: "Add files",
ttsImportTitle: "Import a GPT-SoVITS character",
ttsBatchPickFolder: "Choose folder…",
ttsBatchScanTruncated: "Too many files; only the first {count} are listed.",
ttsBatchNewDraft: "+ New character",
ttsBatchUnnamed: "Unnamed character",
ttsBatchTray: "Unassigned",
ttsBatchSubmit: "Import {count} {count|character|characters}",
ttsBatchMoveTo: "Which character it belongs to",
ttsBatchRowProblem: "A file failed or cannot be imported: deal with the red row",
ttsBatchDuplicateName: "Two characters in the list are both named \"{name}\"; rename one",
ttsBatchNoAudio: "Add at least one reference clip",
ttsStepFiles: "Add files",
ttsStepImport: "Import",
ttsHeroTitle: "Drop a character's files here",
ttsHeroClips: "Reference clips",
ttsHeroDesc: "Each character needs a GPT model, a SoVITS model and a few reference clips; bring line files (.list / .lab / .txt) too if you have them. Several characters or a whole folder at once is fine: they are sorted by name.",
ttsHeroClipsLength: "3–10 s",
ttsLayoutTitle: "📁 Suggested folder layout",
ttsLayoutRoot: "My voices",
ttsLayoutRootNote: "choose this folder",
ttsLayoutCharA: "Arona",
ttsLayoutCharB: "Plana",
ttsLayoutCharNote: "one folder per character, named after it",
ttsLayoutClip: "good_morning",
ttsLayoutClipNote: "reference clip, 3–10 s, several are fine",
ttsLayoutLineNote: "its line, same name (optional)",
ttsLayoutMore: "other characters the same way",
ttsLayoutFoot: "A GPT-SoVITS package works too, choose the whole package: the models in GPT_weights and SoVITS_weights are sorted into characters by file name. Files that cannot be sorted are listed for you to assign.",
ttsMenuUploadHint: "upload from the browser",
ttsAddMore: "+ Add more",
ttsToolbarFound: "{count} {count|character|characters}",
ttsToolbarAdding: "Adding to \"{name}\"",
ttsFooterWaiting: "{count} need a look",
ttsFooterTray: "{count} {count|file|files} unassigned",
ttsFooterSaveTo: "Saved to {path}",
ttsFooterImportOne: "Import",
ttsDropCover: "Drop to add",
ttsCardReady: "ready",
ttsCardBusy: "working…",
ttsCardDone: "imported",
ttsCardFileProblem: "file problem",
ttsCardFailed: "import failed",
ttsCardEmotionProblem: "emotion name",
ttsCardGpt: "GPT model",
ttsCardSovits: "SoVITS model",
ttsCardClips: "{count} {count|clip|clips}",
ttsCardAddTo: "Add to",
ttsCardNamePlaceholder: "Name the character",
ttsCardNameTitle: "Character name, edit it here",
ttsCardFold: "Fold",
ttsCardUnfold: "Unfold",
ttsCardRemove: "Remove this character",
ttsCardRemoveConfirm: "Remove \"{name}\" and its {count} {count|file|files}? The originals are not touched.",
ttsCardClipsTitle: "Reference clips · {count}",
ttsCardClipsHint: "Pick a clear 3–10 s clip as the main voice; give the others an emotion name such as \"happy\"",
ttsCardAddClips: "+ Add clips",
ttsCardLineFiles: "Line files",
ttsCardAddLineFile: "+ Add",
ttsCardMainOn: "The main voice: used where the script names no emotion",
ttsCardMainEmotion: "main voice",
ttsCardMoveHere: "In {name}",
ttsCardMoveTo: "Move to {name}",
ttsCardTrayTitle: "{count} {count|file matches|files match} no character",
ttsCardTrayHint: "Pick the character each file belongs to on its right; remove the ones you do not need with ×.",
ttsStepChoose: "Choose",
ttsChooseTitle: "What do you have?",
ttsMode_single: "One character",
ttsMode_single_desc: "Its GPT model, SoVITS model and a few reference clips. You're walked through it step by step.",
ttsMode_batch: "Many characters / a package",
ttsMode_batch_desc: "Several characters at once, or a GPT-SoVITS package folder; files are sorted by name.",
ttsMode_add: "Add to a character",
ttsMode_add_desc: "Add reference clips, line files or new models to a character you already imported.",
ttsModePickCharacter: "Which character?",
ttsChooseAgain: "‹ Choose another way",
ttsToolbarSingle: "New character",
ttsSoloDropHint: "You can also drop files anywhere in this window",
ttsTourReplay: "Show the guide",
ttsCardSteps: "{count} {count|step|steps} left",
ttsCardPickFile: "Choose file",
ttsCardPickShort: "choose",
ttsCheckGpt: "Add the GPT model (.ckpt, in the package's GPT_weights folder)",
ttsCheckGptDone: "GPT model",
ttsCheckSovits: "Add the SoVITS model (.pth, in the package's SoVITS_weights folder)",
ttsCheckSovitsDone: "SoVITS model",
ttsCheckSovitsUnsupported: "This SoVITS is a {version} model; the installed Anomalous_TTS is too old for it, update it",
ttsCheckSovitsUnknown: "This SoVITS file's version is unknown; use a .pth trained with GPT-SoVITS",
ttsCheckAudio: "Add a few reference clips (clear, 3–10 s)",
ttsCheckAudioDone: "{count} reference clips",
ttsCheckMain: "Press ☆ on a clip below to make it the main voice",
ttsCheckMainDone: "Main voice: {file}",
ttsCheckMainGo: "Pick one",
ttsCheckName: "Name the character",
ttsCheckNameTaken: "\"{name}\" already exists; pick another name",
ttsCheckNameTwice: "Another character in the list is \"{name}\"; pick another name",
ttsCheckNameDone: "Name: {name}",
ttsCheckNameGo: "Enter name",
ttsCheckFiles: "Add reference clips, line files or new models",
ttsCheckFilesDone: "{count} {count|file|files} to add",
ttsBatchNoMain: "Pick a 3–10 s clip as the main voice",
ttsTourSingleTitle: "Just one character? Start here",
ttsTourSingleBody: "You're walked through the GPT model, the SoVITS model and the reference clips, with the button for each step right there.",
ttsTourBatchTitle: "Many characters or a package",
ttsTourBatchBody: "Drop many files or a whole folder: they are sorted into characters by name, and anything unclear is listed for you to assign.",
ttsTourAddTitle: "Add to a character",
ttsTourAddBody: "Add reference clips or emotions to a character you already imported. \"Add files\" on a character card brings you here too.",
ttsTourHelpTitle: "See this again",
ttsTourHelpBody: "Press ? to replay the guide for the current screen.",
ttsTourChecklistTitle: "Checklist",
ttsTourChecklistBody: "What this character still needs. Each item is ticked when done; when all are ticked you can import.",
ttsTourNextTitle: "Your next step",
ttsTourNextBody: "The highlighted item is the next step, with its button beside it. You can also drop files into the window; they go to the right place.",
ttsTourHeadTitle: "Name and progress",
ttsTourHeadBody: "Edit the name here; next to it you see how many steps are left, turning into a green \"ready\" when done.",
ttsTourImportTitle: "Import at the end",
ttsTourImportBody: "This button works once the checklist is complete. Files are copied; the originals stay.",
ttsCheckAudioNoneUsable: "None of these clips is 3–10 s long; add a few that are",
ttsImportLeftOut: "left out",
ttsCardShowAll: "Show all {count} {count|clip|clips}",
ttsCardLeftOut: "Left out · {count} {count|clip|clips} not 3–10 s long (the node cannot use them), with their line files",
ttsCardTrayFolder: "{folder} · {count} {count|file|files}",
ttsCardTrayTop: "(top level)",
ttsCardTrayMoveAll: "Move the whole folder to…",
ttsUploadLargeTitle: "A lot to upload",
ttsUploadLarge: "This would upload {count} {count|file|files}, {size} in all. It takes a while and the window may be sluggish meanwhile. Go ahead?",
ttsSkippedFolders: "Skipped these folders (Python environments, base models, or a package's program and training folders): {folders}.",
ttsImportKeptBestMany: "Each character uses its GPT and SoVITS weights of the latest epoch ({count} {count|other|others} not used).",
ttsImportAddTitle: "Add files · {name}",
ttsImportNameTaken: "There is already a character named \"{name}\".",
ttsImportNameTakenVariant: "\"{name}\" already has these versions: {variants}. Please pick another name.",
ttsImportSwitchToAdd: "Add to that character instead",
ttsImportKeptBest: "{kind}: using the latest epoch, {file} ({count} {count|other|others} left out).",
ttsImportUnsupportedBlock: "{file} is a {version} model, which the installed Anomalous_TTS cannot use yet. Update Anomalous_TTS in GPT-SoVITS Settings (or ComfyUI Manager), then import it.",
ttsImportUnknownBlock: "The version of the SoVITS weight {file} is unknown. Use a .pth trained with GPT-SoVITS.",
ttsImportOutOfRange: "Not 3–10 s long: the node cannot use it, so it is left out",
ttsTextSource_txt: "Line from the .txt of the same name",
ttsTextSource_lab: "Line from the .lab of the same name",
ttsTextSource_list: "Line from the annotation file",
ttsTextSource_filename: "Line taken from the file name; please check it",
ttsTextSource_file: "Line from {file}",
ttsTextSource_missing: "{file} has no entry for this clip",
ttsTextSource_none: "No line found: paste it, or drop a .txt / .lab / .list on the box. Left empty, the clip is used without reference text (lower quality).",
ttsImportPickFiles: "Choose files…",
ttsImportSkipped: "Skipped unsupported or duplicate files: {files}",
ttsImportRenamed: "{count} {count|file|files} had the same name as another file of the character; their folder's name was put in front.",
ttsImportRenamedFrom: "Renamed; original file: {file}",
ttsBatchLater: "Many files: one batch is open; {count} more characters are in the next batch, which opens once this one is imported.",
ttsBatchNext: "Next batch ({count} {count|character|characters})",
ttsBatchImported: "The {count} {count|character|characters} of the last batch are imported; here is the next batch.",
ttsFooterPending: "{count} {count|character|characters} in the next batch",
ttsPreviewStop: "Stop",
ttsPreviewFailed: "Cannot play: {error}",
ttsPreviewUnreadable: "the browser cannot read this audio",
ttsImportRowSkip: "already there, skipped",
ttsImportRowMerge: "new lines merged",
ttsImportRowConflict: "a different file has this name",
ttsImportRowUnsupported: "not supported",
ttsImportExistingDifferent: "The character already has a different file named {file}. Rename it and add it again, or remove that row.",
ttsImportRowUploading: "uploading {percent}%",
ttsImportRowNotSent: "uploads once in a character",
ttsImportRowReady: "✓ ready",
ttsImportRowError: "✕ {error}",
ttsImportSeconds: "{seconds} s",
ttsImportUnsupported: "{version} (not supported)",
ttsImportMain: "Main voice",
ttsImportMainTitle: "Use as the main voice (for text without an emotion tag)",
ttsImportEmotionPlaceholder: "Emotion (optional)",
ttsImportTextPlaceholder: "Reference line (you can drop a .txt / .lab / .list here)",
ttsImportLanguage: "Character's language",
ttsImportLanguageAuto: "Detect",
ttsImportLanguageAutoFound: "Detect (found {lang})",
ttsImportAddSubmit: "Add",
ttsImportFailed: "Import failed: {error}",
ttsImportNoLibrary: "The storage place cannot be written: {path}. Check that folder, or change storage in the settings file named under GPT-SoVITS settings.",
ttsImportNoFiles: "No files added yet",
ttsImportNameMissing: "Enter a character name",
ttsImportWeightsMissing: "A new character needs at least one GPT weight (.ckpt) and one SoVITS weight (.pth)",
ttsDropNew: "Drop to import as a new character",
ttsDropAddTo: "Drop to add to \"{name}\"",
scriptDirectorMainMissing: "This character has no main voice yet. Pick a reference clip with \"Edit emotions\" on its card first",
scriptDirectorNoCharacters: "No GPT-SoVITS characters yet.",
audioDragCharacterHint: "{character} (whole character) → drop onto the {node} node",
audioDropCharacterTarget: "Release: the {node} node uses {character}",
audioDropReject_unsupported: "This node is not supported (supported: {supported})",
audioDropReject_notListed: "{node} does not list {file} yet: press R in ComfyUI to refresh nodes, then retry",
audioDropReject_noMainVoice: "{character} has no main voice yet: pick a reference clip with \"Edit emotions\" on its card",
audioListSeparator: ", ",
audioSidebarTitle: "Voice Categories",
audioRefresh: "Refresh Voices",
audioSidebarSearch: "Search characters or emotions",
audioSidebarNoMatch: "No matching characters",
audioSidebarLanguageUnknown: "Language not set",
audioSidebarMainClip: "main",
audioSidebarShowClips: "Show clips",
audioSidebarHideClips: "Hide clips",
audioAllVoices: "All Voices",
audioGalleryTitle: "Generated speech",
audioGallerySubtitle: "Each keeps its lines and character; 💬 takes it back to Voice-over for another take",
audioGalleryEmpty: "The gallery is empty: press \"Generate\" on the Voice-over page, or connect a Save Audio node after the node, and generated audio will appear here",
audioDeleteConfirm: "Delete this audio file? It goes to the Recycle Bin.",
audioDownload: "Download",
audioDelete: "Delete",
scriptDirectorSubtitle: "Pick a character, paste the lines, click an emotion for each line, then generate.",
draftsBox: "Drafts",
draftsBoxCount: "Drafts ({count})",
draftsNew: "New",
draftsNewHint: "Start a blank script; this one stays in Drafts",
draftsNewBlank: "New blank script",
draftsNewScript: "New script",
draftsClose: "Close script",
draftsCloseHint: "It is saved: open it again from Drafts any time",
draftsBackToScript: "Back to the script",
draftsUntitled: "Untitled script",
draftsRename: "Rename",
draftsRenameHint: "Click to rename",
draftsRenamePrompt: "A name for this script (left empty, its first line names it)",
draftsCopy: "Copy",
draftsCopyName: "{name} (copy)",
draftsDelete: "Delete",
draftsDeleteHint: "Moves it to Recently deleted, back for 30 days",
draftsRestore: "Bring back",
draftsLines: "{count} {count|line|lines}",
draftsEditingNow: "Open now",
draftsSaving: "Saving…",
draftsSaved: "Saved",
draftsSaveFailed: "Not saved; it tries again on the next change",
draftsUnreadable: "Drafts could not be read, so nothing is saved for now (reload to try again)",
draftsBusy: "A line is being generated. Wait until it is done to change scripts.",
draftsEmpty: "No drafts yet. Paste lines and they are kept as one.",
draftsDeletedCount: "Recently deleted ({count})",
draftsDeletedHint: "Deleted scripts stay here for 30 days, then they go.",
draftsDeletedAt: "deleted {when}",
draftsJustNow: "just now",
draftsMinutesAgo: "{count} min ago",
draftsTodayAt: "today {time}",
draftsYesterdayAt: "yesterday {time}",
draftsDate: "{month}/{day}",
draftsDateYear: "{year}/{month}/{day}",
scriptRunHint: 'Generates in ComfyUI without changing the canvas; saved to output/audio/{character}/',
scriptRunNeedsUpdate: 'Generating here needs a newer Anomalous_TTS (interface 11 or later). Until then, push to a node and run it on the canvas.',
scriptRunLanguage: 'Language',
scriptRunLang_auto: "Detect",
scriptRunLang_zh: 'Chinese',
scriptRunLang_ja: 'Japanese',
scriptRunLang_en: 'English',
scriptRunSpeed: 'Speed',
scriptRunParamName_top_k: "Candidates",
scriptRunParamName_top_p: "Candidate share",
scriptRunParamName_temperature: "Randomness",
scriptRunParamName_repetition_penalty: "Repetition guard",
scriptRunSaveDefaults: "Always read like this",
scriptRunMode: "Tone",
scriptRunModeAuto: "Usual",
scriptRunModeAutoBase: "usual",
scriptRunModeIsAuto: "This character's usual tone.",
scriptRunModeAutoShort: "From the tones and this character's own settings (shown: speaking {lang}).",
scriptRunModeSaved: "Saved into \"{name}\", for every character using it.",
scriptRunOpenPresets: "Tones",
scriptRunOpenTuning: "{name}'s own settings",
scriptRunDefaultsSaved: 'Saved',
scriptRunDefaultsFailed: 'Could not save the defaults: {error}',
scriptRunSettingsBroken: 'This character\'s settings file has a problem; fix it before saving: {error}',
scriptRunSaveDefaultsHint: "Keeps this character's speed and language as its usual ones, for later scripts too. For a tone to stay, use Own settings.",
scriptRunParamHint_speed: 'Speaking speed, 1 = normal',
scriptRunParamHint_top_k: 'Pick among the k likeliest candidates at each step. Lower: steadier and flatter; higher: livelier and more error-prone',
scriptRunParamHint_top_p: 'Pick among candidates up to cumulative probability p. 1 = no limit',
scriptRunParamHint_temperature: 'Randomness. Lower: steadier, flatter; higher: more expressive and more misreadings',
scriptRunParamHint_repetition_penalty: 'Discourages repeats. Raise it a little when a line stalls or repeats sounds',
scriptRunGenerate: 'Generate',
scriptRunNewTake: 'New take of all',
scriptRunNewTakeHint: 'New seed: generate the whole script again',
scriptRunCancel: 'Cancel',
scriptRunQueued: 'Queued…',
scriptRunRunning: 'Generating…',
scriptRunProgress: 'Generating {value}/{max}',
scriptRunDone: "Done in {seconds} s",
scriptRunSavedLink: "Saved to Audio ›",
scriptRunCancelled: 'Cancelled',
scriptRunFailed: 'Generation failed: {error}',
scriptRunNoAudio: 'No audio came back',
scriptRunRetakeLine: 'New take of this line only (the others stay)',
scriptDirectorTitle: "Voice-over",
scriptDirectorListenLine: "Listen to this line in the mode picked on the right",
scriptDirectorPreviewEmotion: "Hear the reference clip of “{emotion}”",
scriptDirectorWorkflowTitle: "Into your own workflow",
scriptDirectorSplitter: "Drag to share the width; double-click to reset",
scriptPageNoCharacters: "No characters yet. Import one under Characters, then come back to write lines.",
scriptPageGoVoices: "Import a character",
scriptDirectorInputPlaceholder: "Paste the lines here, one per line, or a whole passage split by punctuation.\n\nOnce split, each line gets its own emotion (main voice, happy…).",
scriptDirectorParse: "Split into lines",
scriptDirectorClear: "Clear",
scriptDirectorInject: "Push to node",
scriptDirectorSuccess: "Written to node",
scriptDirectorNoNode: "No {node} node on the canvas",
audioLoading: "Loading…",
audioGallerySearch: "Search speech or file name",
audioPreviewsTitle: "Unsaved previews",
audioPreviewsHint: "From Preview Audio nodes; cleared when ComfyUI restarts",
audioSavePreview: "Save to gallery",
audioPreviewSaved: "Saved",
audioSaveFailed: "Save failed: {error}",
audioCopySpeech: "Copy speech",
audioVoiceAgain: "Open in Voice-over for another take",
audioSpeechCopied: "Speech copied",
audioNoMatches: "No matching audio",
audioVoiceLabel: "voice {name}",
audioSeedLabel: "seed {seed}",
audioExpandSpeech: "Show / hide the full speech",
audioLoadFailed: "Failed to load: {error}",
audioTrackCount: "{shown} / {total} {total|track|tracks}",
audioLoadMore: "Load more",
audioDeleteFailed: "Delete failed: {error}",
scriptDirectorPickNode: "Several {node} nodes are on the canvas. Select the one to write to first.",
scriptDirectorOverwriteConfirm: "The target node's text field already has text. Overwrite it?",
scriptDirectorPickCharacter: "Choose a character first",
scriptDirectorMainEmotion: "main",
scriptDirectorEdit: "Edit the text",
scriptDirectorLinesCount: "{count} {count|line|lines}",
scriptDirectorDeleteLine: "Delete line",
scriptDirectorPackageSummary: "{count} {count|line|lines} · using {emotions}",
scriptDirectorPackageSummaryCast: "{count} {count|line|lines} · read by {speakers}",
scriptDirectorSpeakerUnusable: "A line is given to a character that cannot read now (removed, or without a main voice); give it to another.",
scriptDirectorPasteFor: "Pasted lines go to {name} first (click a character on the left to change)",
scriptDirectorEmptyLine: "(empty; double-click to write the line)",
scriptDirectorEditHint: "Double-click to edit",
scriptDirectorEditLine: "Edit the line",
scriptDirectorSpeakerMenu: "Who reads it",
scriptDirectorCardsHint: "Click a line to pick it, double-click to edit it",
scriptCastHint: "Click a line to pick it (Ctrl / Shift for more) and change who reads it and how on the right; double-click to edit it",
scriptCastPicked: "{count} {count|line|lines} picked: change who reads {count|it|them} and how on the right (Esc lets go)",
scriptCastListHint: "Click a character: the right side shows how it reads in this script; it also reads the lines pasted or added from now on",
scriptCardTuneHint: "This line is set for itself. Click it to change that on the right, or ↺ to follow the layer above",
scriptTuneScript: "Whole script",
scriptTuneScriptMeta: "{count} {count|line|lines} · {speakers} {speakers|character|characters}",
scriptTuneLineCount: "{count} {count|line|lines}",
scriptTuneOwnCount: "{count} set for {count|itself|themselves}",
scriptTuneCharacterMeta: "Reads {count|line|lines} {lines} ({count})",
scriptTuneCharacterNone: "No lines for this character in the script yet",
scriptTuneResetLines: "{count} {count|line|lines} set for {count|itself|themselves}: let them follow this character",
scriptTuneResetAll: "Let these lines follow the layer above in everything",
scriptTuneLine: "Line {n}",
scriptTuneLines: "{count} lines picked",
scriptTuneWho: "Read by",
scriptTuneFromLine: "This line",
scriptTuneFromUsual: "{name}'s usual",
scriptTuneFromDefault: "Default",
scriptTuneFromMixed: "Varies",
scriptTuneFromHint_line: "Set for this line; ↺ follows the layer above again",
scriptTuneFromHint_character: "Set for {name} in this script; click to go there",
scriptTuneFromHint_script: "Set for the whole script; click to go there",
scriptTuneFromHint_usual: "{name}'s usual setting (saved); click to go to {name}",
scriptTuneFromHint_default: "Nobody changed it: the default",
scriptTuneUsualHint: "From the tones and the character's own settings",
scriptTuneNumbers: "Numbers",
scriptTuneLasting: "Lasting settings:",
scriptTuneResetScript: "Set the whole script back to the defaults",
scriptTuneResetCharacter: "Undo what was changed for this character here",
scriptTuneChangedHere: "changed here",
scriptTuneCast: "Characters (click one to change only it)",
scriptTuneListen: "▶ Listen to this line",
ttsPresetsPick: "Which tone to use",
ttsPresetWhat: "{name}: {about}",
ttsStatusReady: "✓ All set",
ttsStatusMissing: "{count} base {count|file|files} not downloaded",
ttsSetupTab_tones: "Tones",
ttsSetupTab_languages: "Other languages",
ttsSetupTab_files: "Base files",
ttsSetupTab_places: "Where things are",
ttsSetupTab_version: "Version",
ttsTonesSimple: "Simple",
ttsTonesNumbers: "Numbers",
ttsStatusDownloading: "Downloading base files…",
ttsStatusPackages: "{count} Python {count|package|packages} missing",
scriptTuneOtherCharacters: "Other characters ({count}) ▾",
scriptDirectorSpeakerSearch: "Search characters…",
scriptTuneReset: "Follow the layer above",
scriptTuneOldTts: "Settings per character and per line need Anomalous_TTS interface 17 (1.1.0). Until then the whole script is read as its first line's character reads; update it in GPT-SoVITS Settings.",
scriptDirectorCopy: "Copy script",
scriptDirectorCopied: "Copied",
scriptDirectorDragHandle: "Drag to node",
scriptDirectorDragHint: "Drop onto the {node} node to set its character and text",
scriptDirectorPushHint: "Write into the selected (or only) {node} node",
scriptDirectorDropNotTts: "Drop onto the {node} node",
scriptDirectorEmotionMissing: "This character has no such emotion; pick another",
scriptDirectorSplitSentence: "Split by sentence",
scriptDirectorSplitLine: "Split by line (one card per line)",
scriptDirectorMergeNext: "Merge with the next segment (keeps this card's emotion)",
scriptDirectorAddLine: "+ Add segment",
scriptDirectorSplitAtCaret: "Split into two at the cursor",
scriptDirectorSplitHint: "Click where the text should break, then press ✂",
scriptDirectorEmpty: "No lines yet. Paste a script and parse it first.",
scriptDirectorVoiceUnusable: "Some lines use an emotion this character does not have; pick another",
scriptDirectorSampleNotListed: "The {node} node does not list {file} yet. Refresh node definitions in ComfyUI (press R) and try again."
}
};
const DEFAULT_LOCALE = 'zh';
const FALLBACK_LOCALE = 'en';
const hasOwn = (object, key) => Object.prototype.hasOwnProperty.call(object, key);
export const supportedLocales = Object.freeze(Object.keys(i18n));
export function normalizeLocale(value) {
const raw = String(value ?? '').trim().toLowerCase().replace(/_/g, '-');
if (!raw) return '';
const base = raw.split('-')[0];
return hasOwn(i18n, base) ? base : '';
}
export function resolveLocale(value = globalThis.anomalous_browser_lang) {
return normalizeLocale(value) || DEFAULT_LOCALE;
}
export // `{count}` is the value; `{count|file|files}` picks the word for one or for any other number.
function formatTranslation(template, params = {}) {
if (typeof template !== 'string') return template;
return template.replace(/\{([A-Za-z0-9_.-]+)(?:\|([^|{}]*)\|([^|{}]*))?\}/g, (token, key, one, other) => {
if (!hasOwn(params, key)) return token;
if (one === undefined) return String(params[key]);
return Number(params[key]) === 1 ? one : other;
});
}
export function translate(key, params = {}, locale = resolveLocale()) {
const activeLocale = resolveLocale(locale);
const template = i18n[activeLocale]?.[key]
?? i18n[FALLBACK_LOCALE]?.[key]
?? i18n[DEFAULT_LOCALE]?.[key]
?? key;
return formatTranslation(template, params);
}
export function createTranslator(locale) {
return (key, params = {}) => translate(key, params, locale);
}