- While a combo group follows the pointer, Esc removes it again; the activity log holds back until it is put down, so a cancelled group leaves no entry. - The positive and negative prompt nodes are always laid out (positive empty when the combo has no prompt); the negative takes Prompt Studio's common negative card (starter cards moved to prompt_composition.js as PROMPT_PRESETS). - The UNet "connect clip yourself" message shows once the group is down; it used to pop up while the group followed the pointer, and closing it put the group down. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3888 lines
255 KiB
JavaScript
3888 lines
255 KiB
JavaScript
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: "完成",
|
||
updateGuideNoticeLabel: "新指引",
|
||
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: "按住可拖拽至画布节点注入参数,或拖至空白处载入工作流",
|
||
updateGuideLayoutTitle: "新布局:左侧图标栏和主页",
|
||
updateGuideLayoutBody: "每个页面都在左侧图标栏上有一个图标,工具在下面,设置在最底下。再点一下当前页的图标可以收起或展开列表。打开插件先到主页:想做什么点哪张卡片,第一次用可以从“扫描模型文件夹”和“界面导览”开始。",
|
||
updateGuideModelTypesTitle: "模型按类型列出",
|
||
updateGuideModelTypesBody: "模型页顶部的标签切换 Checkpoint、LoRA、VAE 等类型,并显示数量,连同子文件夹一起列出。在左侧列表点某个文件夹只看那一个,点 ✕ 回到整个类型。",
|
||
updateGuideActivityTitle: "操作记录:插件改了什么一目了然",
|
||
updateGuideActivityBody: "图标栏的“记录”按天列出插件做过的改动:画布上哪个节点的设置从什么改成了什么、加了或删了哪些节点、打开了哪个工作流,以及改过的模型、封面、配方、搭配和提示词文件。点“在画布上找到”可以跳到那个节点。画布上的改动,在没被再改过之前可以点“撤销”;其余只记录。",
|
||
updateGuideVoicesTitle: "给角色配音",
|
||
updateGuideVoicesBody: "装上 Anomalous_TTS 节点包后,“角色语音”页有两个视图:“角色”导入 GPT-SoVITS 角色、设置情绪和读音;“配音”粘贴台词、每句选情绪,直接生成。生成的音频在“音频库”。音频页右上角的 ! 有分步说明。",
|
||
updateGuideMemoryTitle: "更省内存",
|
||
updateGuideMemoryBody: "图库改用小缩略图,翻几百张图也不会占满浏览器的内存和显存;拖到画布和看大图仍用原图。关闭插件一分半后,图片会释放。",
|
||
promptDrawerReplace: '替换这组文字',
|
||
promptDrawerAppend: '加入这组文字',
|
||
promptDrawerLoadAll: '载入整套提示词',
|
||
materialAppliedTarget: '已应用到:{name} · #{id}',
|
||
materialDropHint: '拖到兼容的节点上,松手应用;Esc 取消',
|
||
materialDropTarget: '松手应用到:{name}',
|
||
promptPreviewTag: "松手后变成",
|
||
promptDragText: '拖到提示词节点',
|
||
promptChooseTarget: '选择要写入的文本框',
|
||
materialApplyFailed: '应用失败,节点参数已恢复。',
|
||
materialUndo: "撤销这次应用",
|
||
materialUndone: "已撤销",
|
||
materialUndoChanged: "节点已发生其他变化,请使用 ComfyUI 的撤销操作。",
|
||
materialTargetChanged: "请重新选中一个节点后再应用。",
|
||
materialNoCompatibleValues: "这些值不能安全地写进这个节点。",
|
||
materialValueUnavailable: "有个选项在这个节点里没有(本机缺模型,或节点版本不同)。",
|
||
materialInspectOnly: "查看详情",
|
||
materialUseTextBlock: "选用此段文本",
|
||
promptCombinations: "提示词搭配",
|
||
promptSavedPlans: "已存方案",
|
||
promptPlanName: "方案名称",
|
||
promptCompositionHint: "填写提示词,选择放在前面或后面,再拖到提示词节点。保留节点原有文字,不自动运行。",
|
||
promptAddPart: "新建片段",
|
||
promptAddToDraft: "加入提示词搭配",
|
||
promptPartLimit: "每个方案最多添加 100 个片段。",
|
||
promptCurrentContent: "本次内容",
|
||
promptCurrent_positive: "本次正面词",
|
||
promptCurrent_negative: "本次负面词",
|
||
promptFinalPreview: "最终提示词",
|
||
promptFinal_positive: "正面提示词",
|
||
promptFinal_negative: "负面提示词",
|
||
promptCopy_positive: "复制正面词",
|
||
promptCopy_negative: "复制负面词",
|
||
promptSelectTextNode: "选中一个提示词节点,可将最终提示词写入;也可以直接复制。",
|
||
promptTargetWidget: "目标文本框",
|
||
promptTargetRole: "要写入的提示词",
|
||
promptAppend: "追加到节点",
|
||
promptReplace: "替换节点文本",
|
||
promptAddToPlan: "加入组合",
|
||
promptCardRole: "角色",
|
||
promptCardUnsaved: "未保存",
|
||
promptSaveCard: "存入库",
|
||
nodeValuesSaved: "已存下这些节点的参数。以后选中同类节点,在“当前节点”里就能套用。",
|
||
promptImportOverwrite: "覆盖",
|
||
promptImportAppend: "追加",
|
||
promptImportOverwritePrompt: "覆盖当前",
|
||
promptImportAppendPrompt: "追加到当前",
|
||
promptPositiveNote: "正向提示词便签",
|
||
promptNegativeNote: "负向提示词便签",
|
||
promptWordCount: "{count} 字符",
|
||
promptDragNoteHint: "按住卡头或便签,直接拖拽至画布节点",
|
||
promptClearText: "清空便签",
|
||
promptClearConfirm: "确定要清空该便签的内容吗?",
|
||
materialPromptStudio: "提示词工坊",
|
||
materialCollapseStudio: "收起工坊",
|
||
materialSendToStudio: "加入工坊便签",
|
||
recipeMoveKept: "以前从出图收下的完整工作流还有 {count} 个没移过来。它们现在都放在这里,以后在图库点 ☆ 也能直接存成配方。",
|
||
recipeMoveKeptButton: "移到这里",
|
||
recipeMovedKept: "移过来了 {count} 个。原来的文件还在,只是不再单独列出。",
|
||
recipeScopePill_all: "全部",
|
||
recipeScopePill_complete: "完整工作流",
|
||
recipeScopePill_partial: "功能模块",
|
||
recipeViewGrid: "网格视图",
|
||
recipeViewList: "列表视图",
|
||
recipeStatusUnverified: "模型待校验",
|
||
recipeReadinessHint: "检测工作流所需模型在本地环境中的就绪状态,点击卡片进入详情可进行智能比对与替换",
|
||
promptEnablePart: "启用这个片段",
|
||
promptUnnamedPart: "未命名片段",
|
||
promptPartCategory: "片段用途",
|
||
promptCategory_general: "通用",
|
||
promptCategory_specific: "专用",
|
||
promptPartName: "片段名称,例如默认质量词、模型风格",
|
||
promptMoveUp: "上移",
|
||
promptMoveDown: "下移",
|
||
promptRemovePart: "移除片段",
|
||
close: '关闭',
|
||
copy: '复制',
|
||
materialSavePromptAction: "保存提示词",
|
||
materialSaveGeneration: "保存这组生成参数",
|
||
materialSaveGenerationAction: "存下来",
|
||
materialGenerationScope: "保存采样与尺寸节点的整组参数,可在“当前节点”里套用。",
|
||
materialCopySuccess: "已复制",
|
||
materialCopyFailed: "复制失败",
|
||
materialClickToCopy: "点击复制数值",
|
||
materialTitleSaved: "标题已保存",
|
||
promptAdjustRole: "调整用途",
|
||
notebookCompanionModels: "配套模型",
|
||
notebookMore: "更多",
|
||
notebookDoneEditing: "📑 查看双语分词",
|
||
recipeSearchAndReplace: "词条替换与目标语言",
|
||
recipeDiffNone: "未选择",
|
||
loras: "LoRA 模型",
|
||
notebookPromptTitle: "提示词",
|
||
materialAllKinds: "全部类型",
|
||
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] 按钮以同步最新的模型列表。',
|
||
eco: '🔋 视频悬浮播放 (节能模式)',
|
||
autoPlay: '🎬 自动播放视频封面 (高能耗)',
|
||
togglePlayTitle: '切换播放模式',
|
||
clean: '🧹 清理无效的 .info 残留文件',
|
||
cleanTitle: '清理重复 Info',
|
||
cleanConfirm: '将扫描并删除所有无用的 .civitai.info 残留文件。是否继续?',
|
||
cleaning: '清理中',
|
||
cleanDone: '✅ 清理完毕!删除了',
|
||
files: '个文件。',
|
||
cleanFail: '❌ 清理失败: ',
|
||
cleanErr: '❌ 清理出错: ',
|
||
folders: '文件夹',
|
||
collapseAll: '收起全部',
|
||
expandAll: '展开全部',
|
||
scanPageTitle: "扫描模型",
|
||
scanPageLead: "扫描就是给模型配上封面和说明:插件算出每个模型文件的“指纹”,拿去 Civitai(最大的 AI 绘图模型网站)查它是哪个模型,查到就下载封面、触发词,并记下它配合哪个大模型用(底模)。查不到的,就从文件本身猜它的底模。扫过的不会重复下载。",
|
||
scanPageTotal: "模型总数",
|
||
scanPageMatched: "Civitai 上查到了",
|
||
scanPageUnmatched: "没查到",
|
||
scanPageNew: "还没扫过",
|
||
scanPageSummaryFailed: "暂时读不到模型数量,仍然可以扫描。",
|
||
scanPageScanNew: "扫描 {count} 个待查的模型",
|
||
scanPageScanAgain: "再检查一遍",
|
||
scanPageScanPicked: "扫描挑选的 {count} 个模型",
|
||
scanPageScanning: "正在扫描…",
|
||
scanPageRetry: "把 {count} 个没查到的再联网查一遍",
|
||
scanPageHint: "联网扫描先去 Civitai 查,查不到的从文件本身猜底模;连不上 Civitai 时自动改成只看文件,下次联网再补查。扫描在后台进行,可以关掉这个窗口继续用 ComfyUI。",
|
||
scanPageHintPicked: "只扫描在扫描设置里挑选的模型。",
|
||
scanSettingsTitle: "扫描设置",
|
||
scanSettingsChange: "更改 ›",
|
||
scanSettingsLead: "下一次扫描按这里的设置进行。刷新页面后恢复默认;“修改文件名”和“重新获取”扫完一次就自动关掉。",
|
||
scanChipPicked: "只扫挑选的 {count} 个",
|
||
scanChipOnline: "联网查 Civitai",
|
||
scanChipDisplayName: "用 Civitai 名称显示",
|
||
scanChipFileRename: "会改文件名",
|
||
scanChipForce: "全部重新获取",
|
||
scanChipAutoFix: "扫完修复工作流",
|
||
scanChipKeyOn: "API Key 已设置",
|
||
scanChipKeyOff: "没设 API Key",
|
||
scanPageScope: "扫描哪些模型",
|
||
scanPageScopeAll: "全部模型",
|
||
scanPageScopePicked: "只扫我挑的",
|
||
scanPageScopeAllHelp: "所有模型文件夹,设置里“文件夹管理”隐藏的除外。",
|
||
scanPagePickModels: "挑选模型…",
|
||
scanPagePickedCount: "已选 {count} 个",
|
||
scanPageNothingPicked: "还没有挑选模型。",
|
||
scanPageHow: "怎么扫描",
|
||
scanPageOnline: "联网扫描时",
|
||
scanPageOnlineOff: "联网扫描时(现在是离线扫描,用不到)",
|
||
scanPageAfter: "扫描完以后",
|
||
scanPageAccount: "Civitai 账号",
|
||
scanPageTagFiles: "会改动文件",
|
||
scanPageTagSlow: "很慢",
|
||
scanPageOffline: "离线扫描",
|
||
scanPageOfflineHelp: "不联网,只从模型文件推断底模,没有封面和触发词。之后联网扫描会自动补查这些模型。",
|
||
scanPageDisplayName: "用 Civitai 上的名称作为显示名",
|
||
scanPageDisplayNameHelp: "只改卡片上显示的名字,不改文件。你在编辑窗口里改过的名字会保留。",
|
||
scanPageFileRename: "同时修改磁盘上的文件名",
|
||
scanPageFileRenameHelp: "会真的给模型文件改名,用到这些模型的旧工作流要靠模型检查修复;遇到内容完全相同的重复副本,会把其中一个移到回收站;部分文件夹受保护,不会改名。扫描完自动关掉。",
|
||
scanPageForce: "重新获取已扫描的模型",
|
||
scanPageForceHelp: "每个模型都重新计算哈希并联网获取,很慢。只更新 Civitai 的信息和 Civitai 的封面;你改的名字、备注和自己换的封面都会保留。扫描完自动关掉。",
|
||
scanPageForceConfirm: "重新获取全部已扫描的模型?\n\n每个模型都要重新计算哈希、联网下载信息和封面,模型多时可能要很久。\n你改的名字、备注和自己换的封面都会保留;被替换的只有 Civitai 自己的旧封面。",
|
||
scanPageAutoFix: "扫描完自动修复当前工作流里缺失的模型",
|
||
scanPageAutoFixHelp: "像模型检查一样,把画布上找不到的模型换成本地对应的那个。",
|
||
scanPageApiKey: "Civitai API Key",
|
||
scanPageApiKeyOn: "已设置",
|
||
scanPageApiKeyOff: "未设置",
|
||
scanPageApiKeyHelp: "部分模型要登录 Civitai 才能查看信息,填上你的 Key 就能获取。保存在本机的插件设置里。",
|
||
scanPageApiKeySet: "设置…",
|
||
scanPageApiKeyPrompt: "输入 Civitai API Key(留空并确定可以清除):",
|
||
scanPageApiKeySaved: "API Key 已保存。",
|
||
scanPageApiKeyCleared: "API Key 已清除。",
|
||
scanPageApiKeyFailed: "保存失败:{error}",
|
||
scanPageStartFailed: "扫描没能开始:{error}",
|
||
scanReasonNotFound: "Civitai 上没有这个文件",
|
||
scanReasonNetwork: "当时连不上 Civitai",
|
||
scanReasonOffline: "离线扫描,还没查 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,之后的模型先从文件推断了底模。网络恢复后,下次扫描会自动补查它们。",
|
||
scanResultNothing: "没有模型需要更新({count} 个已是最新)。",
|
||
scanResultUnchanged: "另有 {count} 个模型已是最新,没有改动。",
|
||
scanListNew: "还没扫过的模型 · {count}",
|
||
scanListUnmatched: "Civitai 上没查到的模型 · {count}",
|
||
scanListNewHint: "这些模型放进来以后还没扫过,卡片上标着“未扫描”。点上面的按钮一起扫,或者点某一行的“扫描”只扫那一个;扫过一次,不管查没查到,都不会再留在这里。大文件算指纹要几十秒。",
|
||
scanListUnmatchedHint: "扫过了,但 Civitai 上没查到。常见原因:模型不是在 Civitai 发布的(语音、放大、识别这类模型多半来自 HuggingFace 或 GitHub),是自己训练或合并的,或者下载后被改过。不影响使用,只是没有封面和说明;想记下来源,点“查看”后在编辑里填上下载地址。标着“当时连不上”或“离线扫描”的,下次联网扫描会自动再查。",
|
||
scanListUnmatchedHintOffline: "扫过了,但 Civitai 上没查到。现在是离线扫描,不能重新查找;联网后再试。",
|
||
scanListSkipped: "不在扫描范围的模型文件 · {count}",
|
||
scanListSkippedHint: "这些模型文件不是 .safetensors 格式(比如 .pth、.ckpt、.bin),扫描只认 .safetensors,所以不会去查它们,卡片上也不会标“未扫描”。它们在 ComfyUI 里照样能用;想记下来源,点“查看”后在编辑里填上下载地址。",
|
||
scanPageSkippedNote: "另有 {count} 个其他格式的模型文件不在扫描范围,看看是哪些",
|
||
scanReasonNotImage: "也看不出是哪类绘图模型,可能是语音、放大之类的模型",
|
||
scanPageShowList: "查看是哪些模型",
|
||
scanPageScanNewOffline: "离线扫描 {count} 个新模型",
|
||
scanPageHintOffline: "离线扫描不联网,只看模型文件本身猜底模,没有封面和触发词。之后联网扫描会自动补查这些模型。",
|
||
scanProgressShowResult: "查看结果",
|
||
modelSourceLabel: "来源",
|
||
modelSourceCivitai: "Civitai",
|
||
modelSourceLocal: "从文件推断",
|
||
modelSourceLocalShort: "本地",
|
||
modelSourceLocalHint: "{reason},底模是从模型文件推断的。可以在扫描页重新联网查找。",
|
||
modelSourceNotScanned: "未扫描",
|
||
modelSourceNotScannedHint: "还没扫描:到扫描页补全封面、触发词和底模。",
|
||
modelSourceEdited: "你改过:{fields}",
|
||
modelSourceListSep: "、",
|
||
modelSourceFieldName: "名称",
|
||
modelSourceFieldNotes: "备注",
|
||
modelSourceFieldLink: "下载地址",
|
||
noModels: '此文件夹中没有找到模型。',
|
||
modelTypesLabel: '模型类型',
|
||
modelTypesRoot: '根目录',
|
||
modelTypesCrumbHint: '只显示这个文件夹里的模型。点击回到全部 {type}',
|
||
noPreview: '暂无预览图',
|
||
clickScan: '点击扫描',
|
||
back: '⬅️ 返回',
|
||
delModel: '删除',
|
||
delConfirm: '确定删除',
|
||
delConfirm2: '及其信息文件和预览图吗?它们会一起移到系统回收站,需要时可以从回收站还原。',
|
||
delSuccess: '✅ 删除成功!\n',
|
||
delNote: '\n\n⚠️ 提示:请重启 ComfyUI,否则由于缓存继续使用会报错',
|
||
delFail: '❌ 删除失败: ',
|
||
copyAll: '📋 复制全部',
|
||
copied: '✅ 已复制!',
|
||
clickToCopy: '点击复制: ',
|
||
compatibleModels: '🔗 兼容模型',
|
||
refresh: '刷新',
|
||
loading: '加载中…',
|
||
loadingCompatible: '加载中...',
|
||
backToPrev: '🔙 返回上一层',
|
||
applyToCanvas: '插入节点',
|
||
applySuccess: '✅ 已添加至工作流',
|
||
workspace: '创作工作台',
|
||
workspaceTitle: '创作工作台',
|
||
materialLoadError: "存过的提示词读取失败。",
|
||
materialModelSummary: '{count} 个模型引用',
|
||
materialOpenWorkflow: '打开完整工作流',
|
||
materialOpenError: "无法打开这张图里的工作流。",
|
||
materialViewDetails: '查看详情',
|
||
materialViewParameters: '查看参数',
|
||
materialDetailLoadError: "无法读取这条提示词。",
|
||
materialParameterNodes: '可用参数节点',
|
||
materialSourceImage: '来源图片',
|
||
materialImageDetail: '图片参数详情',
|
||
workbenchFullscreen: '全屏工作台',
|
||
workbenchWindowed: '窗口模式',
|
||
workbenchLoadToCanvas: '加载到画布',
|
||
workbenchLoadSuccess: '工作流已成功加载到 ComfyUI 画布!',
|
||
workbenchLoadFailed: '无法加载工作流到画布:',
|
||
workbenchNext: '下一张 (→)',
|
||
workbenchPrev: '上一张 (←)',
|
||
workbenchFilmstrip: '侧栏缩略图',
|
||
workbenchTabOverview: '概览',
|
||
workbenchTabPrompts: '提示词',
|
||
workbenchTabModels: '模型',
|
||
workbenchTabNodes: '全部参数',
|
||
workbenchZoomFit: '适应窗口',
|
||
workbenchZoomReset: '1:1 实际尺寸',
|
||
workbenchFilterNodes: '搜索/过滤节点…',
|
||
workbenchCopyWorkflowJson: '复制完整工作流 JSON',
|
||
materialInspecting: '正在读取图片中的工作流与参数…',
|
||
materialInspectError: "这张图片没有可复用的完整 UI 工作流。",
|
||
materialSaveHint: '完整工作流保留精确种子;作为单节点参数应用时会跳过种子。',
|
||
materialPromptRoleHelp: "已按工作流连线自动识别提示词角色;识别不准时可手动改为正面、负面、共用或忽略。每条提示词都能直接存进提示词库。",
|
||
materialNoPromptData: '(无嵌入提示词数据)',
|
||
materialSaveError: "没存上,请再试一次。",
|
||
materialNodeApplied: "参数已填进节点",
|
||
materialKeyParams: '核心生成参数',
|
||
materialPromptText: '提示词',
|
||
materialViewOriginal: '🔍 查看大图',
|
||
materialDenoise: '降噪',
|
||
materialScheduler: '调度',
|
||
materialReferencedModels: '引用的模型清单 ({count})',
|
||
materialModelBase: '主模型 / UNet',
|
||
materialModelLora: '🎨 LoRA 微调层',
|
||
materialModelVae: 'VAE 编码器',
|
||
materialModelClip: '👁️ 文本编码器 (CLIP)',
|
||
materialModelOther: '其它模型组件',
|
||
materialLoraStrength: '权重',
|
||
materialModelCountLora: '{count} LoRA',
|
||
materialModelCountClip: '{count} CLIP',
|
||
materialModelCountVae: '{count} VAE',
|
||
materialModelCountOther: '{count} 其它',
|
||
materialOpenModelDetail: '查看模型详情',
|
||
materialModelNotes: '备注',
|
||
materialIncludedNodes: '包含的节点清单 ({count})',
|
||
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: '输出文件名前缀',
|
||
materialExpandAll: '展开全部',
|
||
materialCollapse: '收起',
|
||
materialCopyAllParams: '📋 复制全部参数',
|
||
materialPromptCopied: '✅ 提示词已复制',
|
||
materialPromptNode: '提示词',
|
||
materialCopied: '✅ 已复制',
|
||
materialCopyPrompt: '📋 复制提示词',
|
||
materialSelectNodeForSaving: "选这个节点,存下它的参数",
|
||
materialSelectAllNodes: '全选节点',
|
||
materialClearNodeSelection: '清空选择',
|
||
materialSelectedNodeCount: '已选择 {count} 个节点',
|
||
materialSaveNode: '保存这组参数',
|
||
materialSaveNodeHint: '只保存这个节点的参数,在“当前节点”里套用',
|
||
materialSaveSelectedAction: '保存选中节点参数 ({count})',
|
||
materialSaving: '正在保存…',
|
||
materialSaved: '✓ 已存入',
|
||
materialSelectedNodesName: '选中 {count} 个节点',
|
||
saveNotebook: "保存",
|
||
deleteNotebook: '删除',
|
||
baseModel: '基础模型',
|
||
mainModel: '主模型',
|
||
shellCombos: "搭配",
|
||
shellPrompts: "提示词",
|
||
comboLead: "一个搭配 = 一个主模型 + 几个 LoRA + 一段提示词。按“放到画布”就把它们连好线放到画布上,也可以把卡片直接拖到画布上。",
|
||
comboDragHint: "拖到画布上松手,就在那里放一组连好线的节点;Esc 取消",
|
||
comboDragCanvas: "松手:在这里新建这个搭配的一组节点",
|
||
comboSearch: "搜索搭配、模型或提示词…",
|
||
comboNew: "新建搭配",
|
||
comboNewName: "新搭配叫什么?",
|
||
comboUse: "放到画布",
|
||
comboUseHint: "把主模型、LoRA 和正负提示词连好线放到画布上,跟着鼠标走,点一下放下,Esc 取消",
|
||
comboNoModel: "没选模型",
|
||
comboLoraCount: "{count} 个 LoRA",
|
||
comboNoPrompt: "(还没写提示词)",
|
||
comboEmpty: "还没有搭配。点“新建搭配”,选一个主模型和几个 LoRA,写好提示词;以后按一下“放到画布”就能连好线放出来。",
|
||
comboNoMatches: "没有符合的搭配。",
|
||
comboLoadError: "搭配读取失败,请重试。",
|
||
comboBack: "‹ 全部搭配",
|
||
noteNeedsClip: "UNet 模型不带文本编码器:画布上没有唯一的 CLIP 加载节点,提示词节点的 clip 要你自己接。",
|
||
translate: '翻译',
|
||
noBaseModel: '请先选择 Base Model',
|
||
dialogOk: '确定',
|
||
dialogCancel: '取消',
|
||
editModel: '编辑模型 (Edit)',
|
||
scanModelPrecisely: '精准扫描此模型',
|
||
unsupportedAutoApply: '不支持该类型模型的自动应用。',
|
||
createNodeFailed: '创建节点失败: ',
|
||
galleryLoading: '加载中...',
|
||
galleryErrorPrefix: '错误: ',
|
||
galleryDelete: '删除',
|
||
galleryKeep: "收藏:存成工作流、搭配或提示词",
|
||
galleryKept: "已收藏,点开看看存成了什么",
|
||
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_prompt: "已存下提示词:{name}",
|
||
keepExisted: "之前就存过了:{name}",
|
||
keepComboMissing: "有 {count} 个模型本机没有,搭配里先空着。",
|
||
keepOpen: "打开",
|
||
keepRemove: "取消收藏",
|
||
keepRemoveHint: "把存下的这一项移到系统回收站",
|
||
keepRemoveConfirm: "取消收藏后,存下的{what}“{name}”会移到系统回收站。确定吗?",
|
||
keepRemoved: "已取消收藏:{what}“{name}”在回收站里",
|
||
keepRemoveFailed: "没能取消收藏,请再试一次。",
|
||
keepNoun_recipe: "工作流配方",
|
||
keepNoun_combo: "搭配",
|
||
keepNoun_prompt: "提示词",
|
||
keepNoPrompt: "这张图的工作流里没找到提示词。",
|
||
keepNoWorkflow: "这张图没有带 ComfyUI 工作流,存不了。",
|
||
keepFailed: "没存上,请再试一次。",
|
||
galleryDeleteConfirm: '删除这张图片?',
|
||
galleryDeleteConfirmHint: '会移到系统回收站,需要时可以从回收站还原。',
|
||
galleryDeleting: '删除中...',
|
||
galleryDeleteFailed: '删除失败: ',
|
||
galleryNoMore: '没有更多图片了',
|
||
galleryScrollMore: '向下滚动加载更多',
|
||
galleryLoadFailed: '加载失败',
|
||
galleryEmpty: '图库为空',
|
||
gallerySearchPlaceholder: '输入后按回车变成一个搜索块:提示词、模型、LoRA、seed、文件名或模型哈希',
|
||
gallerySearchHelp: '每个搜索块单独匹配,所有块需同时满足;块里可以有空格,按整段短语匹配。8 位以上的十六进制按模型哈希匹配(例如 667B5E3B),改过名的模型文件也能找到。输入框为空时按退格删除最后一块。首次搜索需要读取图片信息,之后会快很多。',
|
||
searchChipHash: '哈希',
|
||
searchChipNumber: '数字',
|
||
searchChipRemove: '移除这个搜索块',
|
||
searchChipsClear: '清空搜索',
|
||
gallerySearchCount: '找到 {count} 张',
|
||
gallerySearchEmpty: '没有找到匹配的图片',
|
||
gallerySearching: '正在搜索…',
|
||
galleryClose: '关闭图库',
|
||
galleryHistoryTitle: '历史生成图库: {name}',
|
||
galleryScanning: '加载中,正在扫描图片元数据...',
|
||
galleryNoModelImages: '没有找到使用此模型生成的历史图片。',
|
||
gallerySetCover: '设为封面',
|
||
gallerySetCoverConfirm: '确定将此图片设为封面吗?',
|
||
galleryCoverSuccess: '设置成功!',
|
||
gallerySelectingCoverPrefix: '正在为模型 ',
|
||
gallerySelectingCoverSuffix: ' 选择封面。请点击下方的图片。',
|
||
galleryLoadImagesError: '加载历史图片失败',
|
||
galleryCancel: '取消',
|
||
detailBackDoctor: '⬅ 返回模型检查',
|
||
detailBackAssistant: '⬅ 返回助手面板',
|
||
detailJumpToBottom: '跳到底部',
|
||
detailEdit: '编辑',
|
||
detailNotesTitle: '📓 专属备注 (Notes)',
|
||
detailEditNotes: '编辑备注',
|
||
detailGeneratedGallery: '查看历史生成作品',
|
||
detailTrainedWords: '训练词:',
|
||
detailDescription: '描述:',
|
||
detailNotes: '备注:',
|
||
detailNoCompatibleModels: '没有找到兼容模型。',
|
||
detailCompatibleLoadFailed: '加载失败。',
|
||
detailToggleSound: '开启/关闭声音',
|
||
detailNoCover: '暂无封面',
|
||
detailPickGallery: '从历史图库挑选',
|
||
detailUploadLocal: '从本地上传',
|
||
detailUploadError: '错误: ',
|
||
detailUploadFailed: '上传失败: ',
|
||
detailModelInfo: '编辑模型信息',
|
||
detailFile: '文件:',
|
||
detailPhysicalFilename: '物理文件',
|
||
detailFullPath: '完整路径',
|
||
detailCopyPath: '复制路径',
|
||
detailPathCopied: '已复制',
|
||
detailPathCopyFailed: '复制失败',
|
||
detailCustomNamePlaceholder: '自定义名称 (留空则使用原名)',
|
||
detailNotesPlaceholder: '📓 专属备注... (支持多行)',
|
||
detailPhysicalRename: '同步物理重命名',
|
||
detailPhysicalRenameDesc: '若不勾选则仅虚拟重命名,安全不破坏原文件。',
|
||
detailPhysicalRenameProtectedDesc: 'VAE、CLIP/Text Encoder、CLIP Vision 等基础组件受保护,不允许物理重命名。',
|
||
detailResetAll: '重置设置',
|
||
detailResetConfirm: '确定要重置该模型的所有自定义信息(名称、封面、备注)吗?',
|
||
detailResetCoverPreserved: '未找到可恢复的 C 站备份或原始封面。为避免丢失唯一图片,当前封面已保留;自定义名称和备注仍已重置。',
|
||
detailResetCoverFailed: '封面恢复未能完整完成,请检查文件权限或占用情况;自定义名称和备注仍已重置。',
|
||
detailResetFailed: '重置失败。',
|
||
detailCancel: '取消',
|
||
detailSaveChanges: '保存更改',
|
||
detailSaving: '保存中...',
|
||
detailSelectModels: '选择模型',
|
||
detailFolders: '目录列表',
|
||
detailSelectedItems: '已选 {count} 项',
|
||
detailSelectedItemsPrefix: '已选 ',
|
||
detailSelectedItemsSuffix: ' 项',
|
||
detailNothingSelected: '暂未选择',
|
||
detailLoadedModels: '已加载 {loaded} / {total} 个模型',
|
||
detailComputing: '计算中...',
|
||
detailSelectNoPreview: '选无预览图',
|
||
detailSelectNoDesc: '选无介绍',
|
||
detailSelectAll: '全选',
|
||
detailClear: '清空',
|
||
detailConfirm: '确定',
|
||
detailLoading: '加载中 (Loading)...',
|
||
detailAllLoaded: '✅ 已加载全部',
|
||
detailScrollMore: '滑动加载更多...',
|
||
detailNoModels: '没有找到模型。',
|
||
detailApiRestart: '❌ 请求后端 API 失败!\n\n你必须重启 ComfyUI 进程,刚写入后端的代码才能生效。',
|
||
doctorGraphUnavailable: '当前画布或节点不可用。',
|
||
doctorMissingChainInputs: '节点没有完整的 MODEL/CLIP 输入。',
|
||
doctorUnconnectedChainInputs: 'MODEL/CLIP 输入尚未全部连接。',
|
||
doctorMissingChainOutputs: '节点没有完整的 MODEL/CLIP 输出。',
|
||
doctorAmbiguousBranches: '检测到多个下游分支,请先整理或选择明确链路。',
|
||
doctorInvalidDownstream: '现有下游连线无效,无法安全改写。',
|
||
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: '没能读出存过的参数',
|
||
currentNodeFromRecipe: '配方 · {name}',
|
||
currentNodeFromMaterial: "存下的参数",
|
||
currentNodeMoreChanges: '还有 {count} 项',
|
||
currentNodeKept: '保持不变:{names}(种子、模型和本机没有的选项不跟着换;模型在上面换)',
|
||
currentNodeApply: '套用这 {count} 项',
|
||
currentNodeSame: '和当前一样',
|
||
doctorLead: '检查当前工作流用到的模型在本机找不找得到。工作流里记着每个模型的文件指纹,改过名、换过文件夹的模型也能认出来;只有指纹对得上的文件才会被换上。',
|
||
doctorChecking: '正在检查…',
|
||
doctorStatUsed: '用到的模型',
|
||
doctorStatHere: '在本机',
|
||
doctorStatFixable: '能直接换上',
|
||
doctorStatMissing: '要你处理',
|
||
doctorPutInAll: '换上 {count} 个',
|
||
doctorPutIn: '换上',
|
||
doctorUseCandidate: '用它',
|
||
doctorPick: '自己挑',
|
||
doctorRecheck: '重新检查',
|
||
doctorSources: '模型去哪下载',
|
||
doctorNoModels: '当前工作流没有用到模型文件。',
|
||
doctorAllHere: '{count} 个模型都在本机,可以直接运行。',
|
||
doctorHowItWorks: '“换上”只会用同一个文件(指纹一致)。其余的请自己挑一个本地模型,或者去 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: '工作流里没有记下它的指纹,没法自动找,只能自己挑或下载。',
|
||
doctorProof: '指纹',
|
||
doctorProofSaved: '工作流里记的',
|
||
doctorProofLocal: '本机同名文件',
|
||
doctorProofNone: '没有',
|
||
doctorChangedMeanwhile: '这个节点在检查之后被改过,没有替换。已重新检查。',
|
||
doctorScanHint: '模型库里还有 {count} 个模型没扫描过。没扫描的模型认不出指纹,扫描后再检查一次,也许就找到了。',
|
||
doctorToScan: '去扫描页',
|
||
doctorBannerMissing: '这个工作流有 {count} 个模型在本机找不到。',
|
||
doctorBannerStill: '还有 {count} 个找不到。',
|
||
doctorBannerFixable: '其中 {count} 个本机有同一个文件(改过名或换了文件夹),可以直接换上。',
|
||
doctorBannerPutIn: '已换上 {count} 个模型。',
|
||
doctorBannerShow: '查看',
|
||
doctorBannerClose: '关闭提示',
|
||
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: '请先选择一个主模型。',
|
||
notebookUnlabeledBase: '未标注基础模型',
|
||
notebookUnetNeedsTextEncoder: 'UNet 模型不含文本编码器:发送到画布后,把你的 CLIP 加载器接到两个提示词节点上。LoRA 会用“仅模型”加载。',
|
||
mainPreflightTitle: '导入工作流 (预检海关)',
|
||
mainPreflightDesc: '请在此处粘贴工作流的 JSON 代码(未来将支持分享码)。我们将为您提取并校验所有模型依赖。',
|
||
mainCancel: '取消',
|
||
mainAnalyzePreflight: '🔍 解析并预检',
|
||
mainForceLoad: '强制载入画布',
|
||
mainNoDependencies: '✅ 未检测到任何模型依赖。',
|
||
mainDetectedModels: '扫描到 {count} 个模型资源:',
|
||
mainDownloadCivitai: '去 C站下载',
|
||
mainReady: '已就绪',
|
||
mainInvalidJson: '无效的 JSON!',
|
||
mainOpenTitle: '打开 Anomalous 模型浏览器',
|
||
mainInterfaceCategory: '界面',
|
||
mainLanguageSetting: '插件语言',
|
||
mainLanguageTooltip: '默认跟随 ComfyUI 的原生语言;也可以只为本插件固定使用中文或 English。',
|
||
mainLanguageAuto: '跟随 ComfyUI',
|
||
mainLanguageChinese: '中文',
|
||
mainLanguageEnglish: 'English',
|
||
mainAbyssalScarletThemeSetting: '启用深海血族界域 (Abyssal Scarlet)',
|
||
mainAbyssalScarletThemeTooltip: '切换至融合加坦杰厄深渊与红魔馆吸血鬼二次元哥特风格的暗黑华丽主题。',
|
||
themeDomainActivated: '🌊🩸 界域展开:深海血族!',
|
||
themeDomainDeactivated: '🌕 界域收拢:恢复原初视界。',
|
||
themeEasterEggHint: '深渊在凝视着你... ({count}/5)',
|
||
mainEntryModeSetting: '浏览器入口模式',
|
||
mainEntryModeTooltip: '三种模式严格互斥:悬浮按钮、运行按钮旁的顶部入口,或仅保留“扩展”菜单命令。',
|
||
mainEntryModeFloating: '悬浮入口',
|
||
mainEntryModeTopbar: '顶部动作栏',
|
||
mainEntryModeMenu: '仅扩展菜单',
|
||
mainShortcutSetting: '打开浏览器快捷键',
|
||
mainShortcutTooltip: '显示当前生效按键,并使用 ComfyUI 原生录入窗口修改。冲突、覆盖和保留按键提醒均由 ComfyUI 处理。',
|
||
mainMaterialsShortcutSetting: "打开提示词工坊快捷键",
|
||
mainMaterialsShortcutTooltip: '默认 Ctrl+Shift+L,可使用 ComfyUI 原生录入窗口修改。',
|
||
mainOpenMaterialsTitle: "打开 Anomalous 提示词工坊",
|
||
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.',
|
||
mainExportTitle: '导出工作流分享码',
|
||
mainSkeletonOption: '精简版 (推荐 B站评论区, 体积小, 丢失坐标)',
|
||
mainFullOption: '完整版 (保留所有坐标与颜色, 较长)',
|
||
mainShareFingerprints: "{total} 个模型里,{hashed} 个带了指纹:别人改过名也能找到同一个文件。",
|
||
mainShareNoFingerprint: "{count} 个没有指纹(没扫描过或本机没有),别人只能按名字或大小找;先扫描一下更好。",
|
||
mainShareProvenanceOff: "设置里关掉了“在工作流里记下模型指纹”,分享码里不带模型指纹和下载链接。",
|
||
mainShareLinks: "附带模型下载链接({count} 个)",
|
||
mainGenerate: '生成分享码',
|
||
mainCopyClipboard: '复制到剪贴板',
|
||
mainClose: '关闭',
|
||
mainCopied: '✅ 复制成功!',
|
||
mainImportTitle: '导入工作流分享码',
|
||
mainSharePlaceholder: '粘贴 AMB0- 或 AMB1- 开头的分享码...',
|
||
mainImportLoad: '导入并加载',
|
||
mainShareEmpty: '❌ 分享码为空',
|
||
mainImportedNodes: '✅ 成功导入 {count} 个节点配置',
|
||
mainDecodeFailed: '❌ 解析失败: ',
|
||
mainUnifiedTitle: "🔄 工作流导入导出",
|
||
mainExportWorkflow: "📤 导出当前工作流为分享码",
|
||
mainImportWorkflow: '从分享码导入工作流',
|
||
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: "第一次用?",
|
||
homeStartScan: "扫描模型文件夹",
|
||
homeStartTour: "界面导览",
|
||
homeStartNews: "看更新说明",
|
||
shellActivity: "记录",
|
||
activityTitle: "操作记录",
|
||
activityLead: "Anomalous 改过的东西都记在这里:画布上改了哪个节点的什么参数,增删了哪些节点,以及模型、配方、搭配、提示词、图片、音频等文件的改动。画布上的改动,在没被再改过之前可以点“撤销”;其余只记录。",
|
||
activityAll: "全部",
|
||
activityCanvas: "画布",
|
||
activityFiles: "文件",
|
||
activityClear: "清空记录",
|
||
activityClearConfirm: "清空全部操作记录?只删除记录本身,不会撤回任何改动。",
|
||
activityEmpty: "还没有记录。Anomalous 改画布上的节点、改文件时都会记在这里。",
|
||
activityLoadFailed: "读取记录失败:",
|
||
activityRecent: "最近操作",
|
||
activityViewAll: "查看全部",
|
||
activityToday: "今天",
|
||
activityYesterday: "昨天",
|
||
activityCanvasChanged: "改了画布上 {count} 处",
|
||
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: "修改角色设置",
|
||
activityVoiceStorage: "更改角色存放位置",
|
||
sidebarToggle: '收起/展开列表',
|
||
sidebarDoctor: '模型检查',
|
||
sidebarAssistant: '当前节点',
|
||
sidebarPreflight: '预检导入工作流',
|
||
sidebarSettings: "设置",
|
||
settingsBack: "‹ 返回",
|
||
settingsOpen: "打开",
|
||
settingsAppearance: "外观",
|
||
settingsViewModeHelp: "紧凑一屏放得多;沉浸卡片更大,背景带一层封面氛围。",
|
||
settingsAtmosphereHelp: "沉浸模式下背景氛围的浓淡。",
|
||
settingsScaleHelp: "只缩放这个浏览器窗口里的文字和按钮,不影响 ComfyUI。",
|
||
settingsTheme: "主题",
|
||
settingsThemeHelp: "深渊绯红是暗红色调的另一套配色。",
|
||
settingsThemeDefault: "默认",
|
||
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: "工作流",
|
||
settingsOpening: "打开方式与窗口",
|
||
settingsEntryHelp: "在哪里打开这个浏览器。快捷键在 ComfyUI 设置 → Anomalous Model Browser 里设置。",
|
||
settingsLayout: "窗口布局",
|
||
settingsLayoutHelp: "窗口位置、大小、停靠、缩放和展示模式恢复默认。",
|
||
settingsReset: "恢复默认",
|
||
settingsHelp: "帮助与反馈",
|
||
settingsTour: "界面导览",
|
||
settingsTourHelp: "在界面上一个个指给你看:每个按钮在哪、是做什么的。",
|
||
settingsNewsHelp: "这个版本改了什么。",
|
||
settingsGuide: "完整使用说明",
|
||
settingsGuideHelp: "在 GitHub 上看完整的文字说明,跟着每次更新一起改。",
|
||
settingsStart: "开始",
|
||
settingsOpenGuide: "去看看",
|
||
feedbackTitle: "遇到问题,或者有想法?",
|
||
feedbackLead: "在 GitHub 上告诉我,一两句话就行。版本、显卡这些信息会自动附上。",
|
||
feedbackReport: "报告问题",
|
||
feedbackSuggest: "提建议",
|
||
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: '扫描模型',
|
||
sidebarScanComplete: '✅ 扫描/重命名已完成!数据已为您更新。',
|
||
sidebarGlobalWizardTitle: '全局扫描向导',
|
||
sidebarProvenance: '在工作流里记下模型指纹',
|
||
sidebarProvenanceDesc: "生成图片或保存工作流时,把模型的指纹和下载链接一起存进去。以后模型改名、换电脑,模型检查也能找回来;别人拿到工作流,也知道模型去哪下。",
|
||
sidebarImportExport: '导入工作流 (分享码)',
|
||
sidebarGlobalQuickScan: '🌍 一键全盘极速扫描 (不下载封面/不改名)',
|
||
sidebarGlobalQuickScanShort: '🌍 一键全盘扫描 (不下载封面/不改名)',
|
||
sidebarGlobalQuickConfirm: '即将执行极速全盘扫描并同步Hash,此操作不改名也不下载封面,是否继续?',
|
||
sidebarScanning: '⏳ 扫描中...',
|
||
sidebarGlobalStarted: '全局扫描已后台启动!',
|
||
sidebarScanDone: '✅ 扫描完成',
|
||
scanProgressTitle: '模型扫描进度',
|
||
scanProgressPreparing: '正在准备扫描目录…',
|
||
scanProgressCounting: '正在统计需要检查的模型…',
|
||
scanProgressFolder: '目录 {current}/{total} · {folder}',
|
||
scanProgressModel: '模型 {current}/{total} · {filename}',
|
||
scanProgressFinished: '扫描结果已经刷新。',
|
||
scanProgressProblem: '扫描已中断',
|
||
scanProgressInterrupted: '检测到上次异常退出留下的扫描状态,现已自动清理。',
|
||
scanProgressRetryReady: '扫描功能已经恢复,可以立即重新扫描。',
|
||
scanProgressLastError: '最近一个错误:{error}',
|
||
sidebarError: '错误: ',
|
||
sidebarLocalScanOn: '☑ 开启非C站模型本地扫描 (读取内置参数) [已开启]',
|
||
sidebarLocalScanOff: '☐ 开启非C站模型本地扫描 (读取内置参数) [已关闭]',
|
||
sidebarLocalScanOnEn: '☑ Local metadata scan for non-Civitai [ON]',
|
||
sidebarLocalScanOffEn: '☐ Local metadata scan for non-Civitai [OFF]',
|
||
sidebarCheckMissing: '🔍 检查并极速录入缺失模型信息',
|
||
sidebarChecking: '⏳ 检查中...',
|
||
sidebarMissingScanning: '⚠️ 发现缺失,正在自动极速扫描...',
|
||
sidebarInfoComplete: '✅ 补全完成',
|
||
sidebarAllInfoComplete: '✨ 所有模型信息已完整',
|
||
sidebarUiScale: "界面缩放",
|
||
sidebarViewMode: '展示模式',
|
||
sidebarViewModeCompact: '紧凑模式',
|
||
sidebarViewModeStandard: '标准模式',
|
||
sidebarViewModeAesthetic: '沉浸模式',
|
||
sidebarBgAtmosphere: '背景氛围',
|
||
sidebarBgAtmosphereHelp: '调节底图星图蓝图的可见度(0%为纯净黑曜石)',
|
||
sidebarResetConfirm: '确认重置窗口位置、缩放和停靠状态吗?',
|
||
promptLibrarySyncFailed: "存过的提示词没同步上,已保留现有词卡,会自动重试",
|
||
promptLibrarySource: "你存过的提示词,可以改名或删除",
|
||
promptCardPositive: "⊕ 正向",
|
||
promptCardNegative: "⊖ 负向",
|
||
promptCardCopy: "复制",
|
||
promptCardCopied: "已复制",
|
||
promptCardCopyHint: "复制提示词到剪贴板",
|
||
promptCardPin: "固定",
|
||
promptCardPinned: "已固定",
|
||
promptCardPinHint: "固定浮窗,移开鼠标也不关",
|
||
promptCardClose: "关闭浮窗",
|
||
promptCardAddHint: "点卡片加进提示词框,或拖到画布的提示词框里",
|
||
promptCardAdd: "加入",
|
||
promptCardAddTitle: "加进对应的提示词框",
|
||
promptStudioTitle: "提示词工坊",
|
||
promptStudioResize: "拖动调整宽度,双击恢复默认",
|
||
promptStudioDockLeft: "停到左边",
|
||
promptStudioDockRight: "停到右边",
|
||
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: "这些词已经都有了",
|
||
promptStudioAddedSkipped: "加了 {count} 个,{skipped} 个已经有了",
|
||
promptDeckSearch: "搜索词卡…",
|
||
promptDeckNew: "新建词卡",
|
||
promptDeckNewName: "词卡名字(可不填)",
|
||
promptDeckNewText: "提示词,多个用逗号隔开",
|
||
promptDeckPresets: "常用",
|
||
promptDeckSaved: "我存的",
|
||
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: "粘贴下载页链接,哪个网站都行",
|
||
sidebarInjectHash: '🟢 注入工作流哈希',
|
||
sidebarSkipHash: '⚪ 不注入工作流哈希',
|
||
sidebarManageFolders: '文件夹管理',
|
||
sidebarVideoPlayback: "视频封面",
|
||
sidebarAlwaysPlay: "一直播放",
|
||
sidebarHoverPlay: "鼠标停上才播(推荐)",
|
||
sidebarCardQuality: "卡片图片",
|
||
sidebarOptimizedThumbnail: "缩略图(推荐)",
|
||
sidebarOriginalCover: "原图",
|
||
sidebarModuleNotLoaded: '模块尚未加载,请稍等或刷新页面!',
|
||
sidebarExpandAll: '展开全部',
|
||
sidebarCollapseAll: '收起全部',
|
||
sidebarSearchModels: '搜索模型...',
|
||
delSure: '确认删除?',
|
||
dockTitle: '侧边停靠',
|
||
replaceAll: '全部替换',
|
||
editRaw: '编辑全文',
|
||
findPlaceholder: '查找...',
|
||
replacePlaceholder: '替换为...',
|
||
models: '模型',
|
||
gallery: '图库',
|
||
apiKeyConfig: '🔑 Civitai API 密钥配置 (用于下载封面)',
|
||
apiKeyPrompt: '请输入你的 Civitai API Key:',
|
||
settingsBtn: '设置',
|
||
closeSettings: '✖ 关闭设置面板',
|
||
importBtn: '导入工作流 (分享码)',
|
||
recipeTitle: '工作流',
|
||
recipeClose: '关闭工作流配方',
|
||
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: '已保存,但完整性回执与当前画布不一致;请重新打开配方核对。',
|
||
recipeEmpty: '还没有工作流配方。保存一个已经跑通的工作流吧。',
|
||
recipeLoadError: '无法加载工作流配方。',
|
||
recipeUntitled: '未命名配方',
|
||
recipeSearchPlaceholder: '搜索名称、笔记或标签…',
|
||
recipeClearFilters: '清除筛选',
|
||
recipeDialogNo: '否',
|
||
recipeNoTags: '暂无标签',
|
||
recipeNoMatches: '没有匹配的配方。请清除搜索或标签筛选。',
|
||
recipeFilterByTag: '按此标签筛选',
|
||
recipeImport: '导入配方包',
|
||
recipeExport: '导出配方包',
|
||
recipeExportUnavailable: '配方包导出暂未开放',
|
||
recipeModel: '模型',
|
||
recipeLoras: 'LoRA',
|
||
recipePrompt: '正向提示词',
|
||
recipeSteps: '步数',
|
||
recipeRestore: '恢复版本',
|
||
recipeAppendCanvas: '追加到画布',
|
||
recipeAppendError: '无法追加此配方到当前画布。',
|
||
recipeOpenCanvas: '新画布打开',
|
||
recipeOpenError: '无法在新画布中打开此配方。',
|
||
recipeDragHint: '按住拖拽至画布打开工作流',
|
||
recipeDragTargetCanvas: '释放以在画布打开工作流',
|
||
recipeCardDragHint: '按住卡片可拖拽至画布打开工作流',
|
||
recipeDraggableBadge: '可拖拽',
|
||
recipeCardPrimaryActionTooltipComplete: '在新画布中打开工作流(也可直接按住卡片拖至画布)',
|
||
recipeCardPrimaryActionTooltipPartial: '追加模块至当前画布(也可直接按住卡片拖至画布)',
|
||
recipeDragGlobalHint: '提示:按住卡片直接拖拽到 ComfyUI 画布空白处释放,即可立即载入工作流',
|
||
recipeEmptyGuideTitle: '工作流配方工坊暂无配方',
|
||
recipeEmptyGuideSubtitle: "把调好的工作流连同模型和参数存下来,下次直接用。",
|
||
recipeEmptyStep1Title: '1. 保存当前工作流',
|
||
recipeEmptyStep1Desc: "点右上角“保存当前工作流”,把画布上的工作流和参数存成配方。",
|
||
recipeEmptyStep2Title: '2. 画布直接拖拽',
|
||
recipeEmptyStep2Desc: "按住配方卡片拖到画布空白处松开,整套工作流就载入了,不用重新连线。",
|
||
recipeEmptyStep3Title: "3. 缺模型也不怕",
|
||
recipeEmptyStep3Desc: "打开配方时,模型检查会在本机找出改过名、换过文件夹的模型,帮你换上。",
|
||
recipeEmptySaveCurrentBtn: '保存当前工作流',
|
||
recipeScope: '配方类型',
|
||
recipeScopePartial: '功能模块',
|
||
recipeScopeComplete: '完整工作流',
|
||
recipeScopePartialSaveHint: "这不是能单独运行的完整工作流(比如没有输出节点),会存成“功能模块”:用的时候加到现有画布上。",
|
||
recipeScopeCompleteSaveHint: "这是能单独运行的完整工作流,以后可以直接在新画布里打开。",
|
||
recipeDelete: '删除',
|
||
recipeDeleteConfirm: '确定删除这个工作流配方吗?配方、历史版本和图片会移到系统回收站。',
|
||
recipeDeleteError: '删除工作流配方失败。',
|
||
recipeSaveError: '保存工作流配方失败。',
|
||
recipeNodeParams: '节点参数',
|
||
recipeCopyParameter: '复制参数值',
|
||
recipeCopied: '已复制',
|
||
recipeCopyFailed: '复制失败',
|
||
recipeAdvancedInfo: '高级信息',
|
||
recipeInlineEditName: '点击修改名称',
|
||
recipeInlineEditNotes: '点击修改备注',
|
||
recipeInlineEditTags: '编辑标签',
|
||
recipeInlineSave: '保存',
|
||
recipeInlineCancel: '取消',
|
||
recipeInlineSaving: '保存中…',
|
||
recipeInlineError: '保存失败,请重试。',
|
||
recipeInlineNameRequired: '名称不能为空。',
|
||
recipeSomeParamsInWorkflow: '其余复杂或敏感参数仍保存在完整工作流中。',
|
||
recipeMoreNodesInWorkflow: '其余节点仍保存在完整工作流中。',
|
||
recipeMissingNodes: '当前缺少以下节点类型,恢复后可能无法运行',
|
||
recipeBindImage: '绑定封面图片',
|
||
recipeNoImage: '不绑定图片',
|
||
recipeCanvasPreview: '当前画布',
|
||
recipeLoadingRecentImages: '正在读取最近生成结果…',
|
||
recipeRecentImages: '最近生成结果',
|
||
recipeRecentImagesUnavailable: '暂时无法读取最近生成结果。',
|
||
recipeChoosePinnedParams: '选择关键参数',
|
||
recipePinnedParams: '关键参数',
|
||
recipeKeepImage: '保留当前封面',
|
||
recipeEdit: '编辑',
|
||
recipeEditTitle: '编辑工作流配方',
|
||
recipeEditNodeParams: '编辑节点参数',
|
||
recipeComplexParam: '复杂值仅展示;完整值仍安全保存在工作流中。',
|
||
recipeHistory: '版本历史',
|
||
recipeHistoryEmpty: '还没有历史版本。更新配方后会自动保留旧版本。',
|
||
recipeUnknownVersion: '未知时间',
|
||
recipeRestoreVersion: '恢复此版本',
|
||
recipeRestoreVersionConfirm: '恢复此版本会覆盖当前配方,但当前内容会先自动存入历史。继续吗?',
|
||
recipeEditCanvas: '载入画布编辑',
|
||
recipeEditCanvasConfirm: '载入会替换当前画布。完成结构编辑后,点击“更新当前配方”即可保存为新版本。继续吗?',
|
||
recipeUpdate: '保存更新',
|
||
recipeUpdateCurrent: '更新当前配方',
|
||
recipeUpdateError: '更新工作流配方失败。',
|
||
recipeViewDetails: '查看详情',
|
||
recipeDetailBack: '返回配方列表',
|
||
recipeDetailOverview: '配方概览',
|
||
recipeGallery: '图库',
|
||
recipeGalleryLoading: '正在查找匹配的历史出图…',
|
||
recipeGalleryEmpty: '未在最近 200 张含工作流数据的 PNG 中找到与此配方结构匹配的出图。',
|
||
recipeGalleryRefresh: '刷新匹配结果',
|
||
recipeGallerySetCover: '设为配方封面',
|
||
recipeGalleryCoverSaved: '已设为配方封面',
|
||
recipeGalleryCoverError: '无法设置配方封面。',
|
||
recipeGalleryLoadError: '无法读取配方图库。',
|
||
recipeGalleryScanHint: '已检查最近 {count} 张含工作流数据的 PNG。',
|
||
recipeGalleryOpenImage: '查看原图',
|
||
recipeGalleryCompare: '参数对比',
|
||
recipeGalleryComparison: '配方与出图参数',
|
||
recipeGalleryComparisonLoading: '正在读取这张图片的参数…',
|
||
recipeGalleryComparisonError: '无法读取这张图片的参数。',
|
||
recipeGalleryNoDifferences: '没有发现可显示的参数差异。',
|
||
recipeGalleryDifferenceHint: '以下是节点参数的差异;图库匹配本身只关注节点类型。',
|
||
recipeGalleryRecipeValue: '配方',
|
||
recipeGalleryImageValue: '图片',
|
||
recipeDetailModels: '模型装备清单',
|
||
recipeDetailParameters: '参数方案',
|
||
recipeDetailParametersHint: '这里展示此配方保存的全部生成参数。可直接一键应用到当前画布,或从当前画布保存新方案。',
|
||
recipeParameterSnapshots: '已存参数方案',
|
||
recipeParameterSnapshotsHint: '同一个工作流可保存多组不同的参数方案,方便随时切换。',
|
||
recipeParameterShowing: '当前选中的预设',
|
||
recipeParameterCurrentRecipe: '默认配方参数',
|
||
recipeParameterActive: '当前生效',
|
||
recipeParameterRefresh: '刷新预设',
|
||
recipeParameterLoading: '正在读取预设…',
|
||
recipeParameterLoadError: '无法读取预设列表。',
|
||
recipeParameterNoSnapshots: '当前配方还没有额外保存的参数方案。',
|
||
recipeParameterUntitled: '未命名参数方案',
|
||
recipeParameterDelete: '删除此预设',
|
||
recipeParameterDeleteConfirm: '确定删除参数方案“{name}”吗?会移到系统回收站。',
|
||
recipeParameterDeleteError: '无法删除预设,请稍后重试。',
|
||
recipeParameterNew: '新建参数方案',
|
||
recipeParameterReadCurrent: '从当前画布保存新方案',
|
||
recipeParameterReadCurrentSaving: '正在保存当前画布参数…',
|
||
recipeParameterReadCurrentError: '无法读取当前画布参数。',
|
||
recipeParameterSkeletonMismatch: '当前画布缺少配方必需的核心节点,无法直接应用参数。',
|
||
recipeParameterWidgetMismatch: '当前画布的节点输入项与预设不一致:',
|
||
recipeParameterNodeUnavailable: '无法在当前画布中定位匹配节点:',
|
||
recipeParameterApply: '应用到当前画布',
|
||
recipeParameterApplying: '正在检查骨架并应用…',
|
||
recipeParameterApplied: '已应用 {count} 项参数',
|
||
recipeParameterApplyError: '应用参数失败,当前画布未完成修改。',
|
||
recipeParameterNewHint: '基于当前配方骨架编辑节点参数;种子等运行时变化值会被忽略。保存后会生成新的只读快照,不会覆盖历史记录。',
|
||
recipeParameterName: '笔记名称',
|
||
recipeParameterSave: '保存参数方案',
|
||
recipeParameterCancel: '取消编辑',
|
||
recipeParameterSaveError: '参数方案保存失败。',
|
||
recipeParameterSensitiveHidden: '敏感控件已隐藏',
|
||
recipeDetailParameterSummary: '常用参数',
|
||
recipeDetailNodeParameters: '节点参数',
|
||
recipeDetailUnknownNode: '未命名节点',
|
||
recipeDetailWidget: '控件',
|
||
recipeDetailScheduler: '调度器',
|
||
recipeDetailSteps: '步数',
|
||
recipeDetailCFG: 'CFG',
|
||
recipeDetailDenoise: '降噪',
|
||
recipeDetailSeed: '种子',
|
||
recipeParameterGallery: '相同参数的出图',
|
||
recipeParameterGalleryLoading: '正在查找相同参数的历史出图…',
|
||
recipeParameterGalleryEmpty: '没有找到参数完全一致的历史出图。',
|
||
recipeParameterGalleryError: '无法读取参数图库。',
|
||
recipeDetailNoSavedParameters: '此配方没有可展示的参数。',
|
||
recipeDetailVersions: '版本',
|
||
recipeDetailModelComposition: "用到的模型",
|
||
recipeDetailBaseModel: '主模型',
|
||
recipeDetailIdentity: '已验证身份',
|
||
recipeDetailUnverified: '未验证模型',
|
||
recipeDetailMissingNodes: '缺失节点类型',
|
||
recipeDetailNotIndexed: '尚未索引',
|
||
recipeDetailLoraSummary: 'LoRA',
|
||
recipeDetailSampler: '采样器',
|
||
recipeDetailResolution: '分辨率',
|
||
recipeDetailUnavailable: '不可用',
|
||
recipeDetailNoNotes: '没有备注。',
|
||
recipeDetailUpdated: '更新时间',
|
||
recipeDetailCopyPrompt: '复制提示词',
|
||
recipeDetailCopyFingerprint: '复制工作流指纹',
|
||
recipeDetailPrompts: '提示词',
|
||
recipeDetailPositivePrompt: '正向提示词',
|
||
recipeDetailNegativePrompt: '负面提示词',
|
||
recipeDetailNoPrompts: '此配方没有可安全展示的提示词摘要。',
|
||
recipePromptSupportNotice: '当前仅自动识别 ComfyUI 原生 CLIPTextEncode 与已知官方连接;第三方文本节点请手动标注。',
|
||
recipePromptRoleChoose: '选择提示词角色',
|
||
recipePromptRoleAutomatic: '自动识别',
|
||
recipePromptRoleManual: '用户手动标注',
|
||
recipePromptRolePositive: '正面提示词',
|
||
recipePromptRoleNegative: '负面提示词',
|
||
recipePromptRoleBoth: '正负共用',
|
||
recipePromptRoleIgnored: '忽略',
|
||
recipePromptRoleUnknown: '角色未确定',
|
||
recipePromptRoleSaveError: '无法保存提示词角色,请稍后重试。',
|
||
recipeDetailVolatileIgnored: '运行时变化,已忽略',
|
||
recipeDetailExpandValue: '展开完整内容',
|
||
recipeDetailCollapseValue: '收起内容',
|
||
recipeDetailRefreshOrigin: '刷新来源信息',
|
||
recipeDetailRefreshOriginDesc: '刷新当前配方中的所有模型来源信息(支持补充旧配方数据)',
|
||
recipeDetailAvailable: '本机可用',
|
||
recipeDetailMissing: '本机缺失',
|
||
recipeDetailAvailabilityNotChecked: '尚未检查本机',
|
||
recipeDetailNoModelReferences: '没有识别到受支持的模型加载器。其他自定义控件保留在参数和完整工作流中。',
|
||
recipeDetailModel: '模型',
|
||
recipeOpenLocalModel: '打开本地模型详情',
|
||
recipeMatchRecipeModelsDesc: '根据模型哈希、文件大小和模型类别,在本地模型目录中查找对应文件;不会使用原作者路径。',
|
||
recipeRecipeMatchSummary: '已找到 {found}/{total} 个本地匹配',
|
||
recipeModelNoteAdd: '添加模型备注',
|
||
recipeModelNoteEdit: '编辑模型备注',
|
||
recipeModelNoteEmpty: '暂无个人模型备注',
|
||
recipeModelNoteTitle: '模型个人备注',
|
||
recipeModelNotePrompt: '记录这个模型在当前配方中的用法、建议权重或注意事项。留空保存即可删除备注。',
|
||
recipeModelNoteError: '无法保存模型备注。',
|
||
recipeDetailSearchParameters: '按节点、类型或控件名称搜索…',
|
||
recipeDetailNoParameters: '没有匹配的安全参数。',
|
||
recipeDetailCurrentVersion: '当前版本',
|
||
recipeCompareVersion: '对比此版本',
|
||
recipeDiffLoading: '正在比较…',
|
||
recipeDiffSummary: '变更摘要',
|
||
recipeDiffBefore: '之前',
|
||
recipeDiffAfter: '之后',
|
||
recipeDiffNoChanges: '两个版本没有检测到有意义的变更。',
|
||
recipeDiffError: '无法读取此历史版本。',
|
||
recipeDiffPinned: '钉选参数',
|
||
recipeDiffPrompts: '提示词',
|
||
recipeDiffModels: '模型引用',
|
||
recipeDiffParameters: '参数摘要',
|
||
recipeDiffWorkflow: '工作流结构',
|
||
recipeDiffPresentation: '展示信息',
|
||
recipeDiffOther: '其他',
|
||
recipeDetailUnknownTime: '未知时间',
|
||
recipeParameterNotebooks: '参数方案',
|
||
recipeParameterRename: '重命名',
|
||
recipeParameterRenamePrompt: '请输入参数方案的新名称:',
|
||
recipeParameterRenameError: '重命名参数方案失败',
|
||
recipeStatusReady: "模型都在本机",
|
||
recipeStatusChecking: "正在看本机有没有这些模型…",
|
||
recipeStatusNoModels: "没有识别到模型加载节点",
|
||
recipeMissingHint: "放到画布上以后,模型检查会帮你在本机找(改过名、换过文件夹的也能找到),找不到的会告诉你去哪下。",
|
||
recipeModelDownloadPage: "下载页",
|
||
recipeStatusMissing: "缺 {count} 个模型",
|
||
recipeStatusChecking: '⏳ 检查环境中…',
|
||
recipeQuickSpecs: '核心规格',
|
||
recipeRawNodesToggle: '节点参数',
|
||
recipeRawNodesCount: '个节点',
|
||
recipeRawNodesShowMore: '展开其余 {count} 个节点…',
|
||
recipeRawNodesLoadedCount: '已显示 {shown} / {total} 个节点',
|
||
recipeCardSpecsCheckpoint: '大模型',
|
||
recipeCardSpecsLoras: 'LoRA',
|
||
recipeCardSpecsSteps: '步数',
|
||
recipeCardSpecsSampler: '采样',
|
||
recipeCardSpecsResolution: '尺寸',
|
||
domainVisualBadge: "视觉",
|
||
domainAudioBadge: "音频",
|
||
audioVoiceClipCount: "{count} 条声音",
|
||
audioSearchCharacters: "搜索角色或情绪",
|
||
audioPlay: "播放试听",
|
||
audioPause: "暂停",
|
||
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: "在“角色语音”页顶部切到“配音”(或点角色卡片上的“配音”),左边列表或上方选谁来念,粘贴整段台词,点“分成句子”,每句会变成一张卡片,点一下就能选情绪,也可以拆分、合并、删除。然后点“生成语音”;想放进自己的工作流,下面“放进自己的工作流”里可以推送到节点、拖到节点或复制,角色和台词会一起填好。",
|
||
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: "编辑情绪",
|
||
ttsEditorTitle: "编辑情绪 · {name}",
|
||
ttsEditorSubtitle: "为主声音和每种情绪各挑一条参考音频(3~10 秒、有台词最好)。保存后写进角色文件夹里的 anomalous_tts.json。",
|
||
ttsEditorAudioPlaceholder: "输入或选择音频文件",
|
||
ttsEditorTextPlaceholder: "参考台词(留空自动查找)",
|
||
ttsEditorMainSection: "主声音",
|
||
ttsEditorEmotionSection: "情绪",
|
||
ttsEditorMainAuto: "不设置时,节点会自动使用:{file}",
|
||
ttsEditorMainHint: "留空:由节点自动挑一条 3~10 秒的音频",
|
||
ttsEditorEmotionPlaceholder: "情绪名,例如 开心",
|
||
ttsEditorRemove: "删除这一行",
|
||
ttsEditorAdd: "+ 添加情绪",
|
||
ttsEditorFilenameEmotions: "另外,文件名里带情绪的音频会被自动识别:{emotions}",
|
||
ttsEditorSave: "保存",
|
||
ttsEditorSaveFailed: "保存失败:{error}",
|
||
ttsEditorLoadingFiles: "正在读取这个角色的音频列表…",
|
||
ttsEditorFileCount: "这个角色有 {count} 条音频,输入文件名可以搜索。",
|
||
ttsEditorLoadFailed: "读取音频列表失败:{error}",
|
||
ttsEditorUnknownAudio: "{file} 不在这个角色的文件夹里",
|
||
ttsEditorNameMissing: "{file} 还没填情绪名",
|
||
ttsEditorNameInvalid: "情绪名“{name}”不能用:不能叫 main,也不能带 {} [] 这些符号",
|
||
ttsEditorNameDuplicate: "情绪名“{name}”重复了",
|
||
ttsEditorAudioMissing: "情绪“{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: "其他位置",
|
||
ttsSetupMoving: "正在移动角色 {done}/{total}",
|
||
ttsStorageChange: "更改…",
|
||
ttsStorageChangeTitle: "选择新的存放位置",
|
||
ttsStorageChangeHint: "以后导入的角色都放在这个文件夹里。选好后可以决定要不要把现有的角色一起移过去。",
|
||
ttsStorageHint: "导入的角色放在这里。换位置时可以把现有角色一起移过去;同一个盘上是瞬间完成,跨盘会复制完再删掉原来的。",
|
||
ttsStorageMoveAsk: "现在的存放位置里有 {count} 个角色。要把它们一起移到\n{path}\n吗?\n\n不移的话,它们留在原处照样能用,只是以后导入的放到新位置。",
|
||
ttsStorageMoveYes: "移过去",
|
||
ttsStorageMoveNo: "不移动",
|
||
ttsStorageMoving: "正在移动 {done}/{total}:{current}",
|
||
ttsStorageMovingBytes: "(已复制 {percent}%)",
|
||
ttsStorageMoveDone: "已把 {count} 个角色移到这里",
|
||
ttsStorageMoveError: "移动停下了:{error}(已移 {done}/{total},其余的留在原处,照样能用)",
|
||
ttsOtherPlacesHint: "这些位置里的角色照样能用。以前的存放位置点 × 就不再列出,文件不会删除。",
|
||
ttsLibrarySource_default: "默认",
|
||
ttsLibrarySource_yaml: "yaml 配置",
|
||
ttsLibrarySource_app: "以前的存放位置",
|
||
ttsLibraryMissing: "文件夹不存在",
|
||
ttsLibraryRemove: "移除",
|
||
ttsLibraryRemoveConfirm: "不再读取这个以前的存放位置?\n{path}\n\n文件不会删除,只是不再列出里面的角色。",
|
||
ttsNeededFor_all: "所有模型",
|
||
ttsNeededFor_zh: "中文",
|
||
ttsNeededFor_en: "英语",
|
||
ttsNeededFor_ja: "日语",
|
||
ttsNeededFor_v2pro: "v2Pro 模型",
|
||
ttsPretrainedOk: "已就绪",
|
||
ttsPretrainedMissing: "缺少",
|
||
ttsPretrainedOptional: "缺少(可选)",
|
||
ttsPretrainedQueued: "等待下载",
|
||
ttsPretrainedDownloading: "下载中 {percent}%",
|
||
ttsPretrainedError: "下载失败",
|
||
ttsPretrainedDownload: "下载(约 {size})",
|
||
ttsPretrainedDownloadAll: "全部下载(约 {size})",
|
||
ttsPretrainedUsePackage: "使用已有的 GPT-SoVITS 整合包",
|
||
ttsPretrainedPackageHint: "选择整合包里的 GPT_SoVITS 文件夹(里面有 pretrained_models 和 text),就不用再下载底模了。",
|
||
ttsPretrainedSource: "底模来源",
|
||
ttsPretrainedHint: "底模也会在第一次生成时自动下载;只说日语的角色不需要中文底模。标“可选”的缺了也能用,只是效果差一点。",
|
||
ttsPackagesFor: "{lang}缺少 {packages}",
|
||
ttsPackagesHint: "在命令行运行上面的命令,然后重启 ComfyUI。",
|
||
ttsCopyCommand: "复制命令",
|
||
ttsCopied: "已复制",
|
||
ttsKind_gpt: "GPT",
|
||
ttsKind_sovits: "SoVITS",
|
||
ttsKind_audio: "音频",
|
||
ttsKind_text: "台词",
|
||
ttsPickFolderTitle: "选择文件夹",
|
||
ttsPickFilesTitle: "选择文件",
|
||
ttsPickPathPlaceholder: "输入或粘贴路径,按回车打开",
|
||
ttsPickUp: "上一级",
|
||
ttsPickGo: "打开",
|
||
ttsPickThisFolder: "选择这个文件夹",
|
||
ttsPickAddFiles: "添加选中的文件({count})",
|
||
ttsPickEmpty: "这里没有可用的文件或文件夹",
|
||
ttsPickTruncated: "文件太多,只显示了前一部分",
|
||
ttsImportOpenShort: "导入角色",
|
||
ttsImportOpen: "+ 导入角色",
|
||
ttsImportAddOpen: "添加文件",
|
||
ttsImportTitle: "导入 GPT-SoVITS 角色",
|
||
ttsBatchPickFolder: "选择文件夹…",
|
||
ttsBatchPickLocalFolder: "从这台电脑选文件夹…",
|
||
ttsBatchPickLocalFolderHint: "选一个文件夹(比如 GPT-SoVITS 整合包或你整理好的声音文件夹),里面往下几层的模型、音频和台词文件都会列出来并自动分组,不用上传,更快。",
|
||
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 秒",
|
||
ttsHeroLocalFiles: "选文件",
|
||
ttsHeroLocalFolder: "选文件夹",
|
||
ttsHeroLocal: "文件就在这台电脑上?不用上传:",
|
||
ttsLayoutTitle: "📁 推荐的文件夹放法",
|
||
ttsLayoutRoot: "我的声音",
|
||
ttsLayoutRootNote: "选这个文件夹",
|
||
ttsLayoutCharA: "阿罗娜",
|
||
ttsLayoutCharB: "普拉娜",
|
||
ttsLayoutCharNote: "一个角色一个文件夹,文件夹名就是角色名",
|
||
ttsLayoutClip: "早上好",
|
||
ttsLayoutClipNote: "参考音频,3~10 秒,可以放好几段",
|
||
ttsLayoutLineNote: "这段音频的台词,同名(可选)",
|
||
ttsLayoutMore: "其他角色一样放",
|
||
ttsLayoutFoot: "GPT-SoVITS 整合包也可以直接选整个包:GPT_weights 和 SoVITS_weights 里的模型按文件名分成角色。分不出来的文件会单独列出来,让你选它属于谁。",
|
||
ttsMenuUploadHint: "从浏览器上传",
|
||
ttsMenuLocalFiles: "从这台电脑选文件…",
|
||
ttsMenuLocalHint: "直接读取,不用上传,更快",
|
||
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} 个文件?原文件不受影响。",
|
||
ttsCardFromThisPc: "从这台电脑选",
|
||
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} 模型,暂不支持,换一个 v1 / v2 / v2Pro 的",
|
||
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}。浏览器上传会很慢,也会让界面变卡。ComfyUI 就在这台电脑上,改用“从这台电脑选文件夹”可以直接复制,不用上传。",
|
||
ttsUploadUseLocal: "从这台电脑选文件夹",
|
||
ttsUploadAnyway: "仍然上传",
|
||
ttsSkippedFolders: "跳过了这些文件夹(Python 环境、底模,或整合包的程序和训练文件夹):{folders}。",
|
||
ttsScanTooDeep: "这些文件夹太深,没有列出:{folders}。需要的话直接选那个文件夹再加一次。",
|
||
ttsImportKeptBestMany: "每个角色的 GPT 和 SoVITS 都用了轮数最大的那个(另外 {count} 个没用)。",
|
||
ttsImportAddTitle: "添加文件 · {name}",
|
||
ttsImportNameTaken: "已经有叫“{name}”的角色了。",
|
||
ttsImportNameTakenVariant: "“{name}”已经有这些版本:{variants}。请换一个名字。",
|
||
ttsImportSwitchToAdd: "改成添加到这个角色",
|
||
ttsImportKeptBest: "{kind}:用了轮数最大的 {file}(另外 {count} 个没用)。",
|
||
ttsImportUnsupportedBlock: "{file} 是 {version} 模型,暂不支持。请换一个 v1、v2、v2Pro 或 v2ProPlus 的 SoVITS 权重。",
|
||
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: "选择文件…",
|
||
ttsImportPickLocal: "从本机路径选择…",
|
||
ttsImportPickLocalHint: "直接选择电脑上的文件(比如整合包里的 GPT_weights_v2 / SoVITS_weights_v2),不用上传,更快。",
|
||
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 设置里换一个存放位置。",
|
||
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: "全部音色",
|
||
audioSectionCharacters: "角色预设",
|
||
audioGalleryTitle: "生成的语音",
|
||
audioGallerySubtitle: "每条都带着当时的台词和角色;点 💬 可以拿回“配音”再配一版",
|
||
audioGalleryEmpty: "音频库还是空的:在“配音”页点“生成语音”,或在节点后面接「保存音频」节点,生成的音频就会出现在这里",
|
||
audioDeleteConfirm: "删除这个音频文件吗?会移到系统回收站。",
|
||
audioDeleteSuccess: "已删除音频文件",
|
||
audioDownload: "下载音频",
|
||
audioDelete: "删除",
|
||
audioFileSize: "文件大小",
|
||
audioDuration: "时长",
|
||
audioTime: "生成时间",
|
||
scriptDirectorSubtitle: "选一个角色,把台词贴进来,每句点一下选情绪,然后生成语音。",
|
||
scriptRunHint: '直接在 ComfyUI 里生成,不改动画布,结果存到 output/audio/{character}/',
|
||
scriptRunNeedsUpdate: '直接生成需要更新 Anomalous_TTS(接口版本 11 以上)。现在可以先推送到节点,在画布上运行。',
|
||
scriptRunLanguage: '语言',
|
||
scriptRunLang_auto: '自动',
|
||
scriptRunLang_zh: '中文',
|
||
scriptRunLang_ja: '日语',
|
||
scriptRunLang_en: '英语',
|
||
scriptRunSpeed: '语速',
|
||
scriptRunHow: "念法",
|
||
scriptRunFineTune: "细调(一般不用动)",
|
||
scriptRunFineTuned: " · 调过",
|
||
scriptRunParamName_top_k: "候选数量",
|
||
scriptRunParamName_top_p: "候选范围",
|
||
scriptRunParamName_temperature: "随机程度",
|
||
scriptRunParamName_repetition_penalty: "防重复",
|
||
scriptRunSaveDefaults: '把这套设置存为这个角色的默认',
|
||
scriptRunDefaultsSaved: '已保存',
|
||
scriptRunDefaultsFailed: '保存默认设置失败:{error}',
|
||
scriptRunSettingsBroken: '这个角色的设置文件有问题,先修好再保存:{error}',
|
||
scriptRunSaveDefaultsHint: '语言、语速和高级参数都会记住,下次打开这个角色直接用。种子不存:它只对这段台词有意义',
|
||
scriptRunAdvancedNote: "效果满意,可以存为这个角色的默认。跨语言时(比如日语角色说中文),节点会自动收紧候选数量和随机程度。",
|
||
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: "配音",
|
||
scriptDirectorPreviewEmotion: "听「{emotion}」原本的参考声音",
|
||
scriptDirectorOnlyMain: "这个角色只有主声音,每句都用它念。在“角色”里给它加情绪后,这里每句都能单独选。",
|
||
scriptDirectorUseCharacter: "配音",
|
||
scriptDirectorUseCharacterHint: "用{character}写台词、生成语音",
|
||
scriptDirectorWorkflowTitle: "放进自己的工作流",
|
||
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: "目标节点的台词栏已经有内容,要覆盖吗?",
|
||
scriptDirectorCharacter: "谁来念",
|
||
scriptDirectorPickCharacter: "请先选择角色",
|
||
scriptDirectorEmotionsAvailable: "可用情绪:{emotions}",
|
||
scriptDirectorMainEmotion: "主声音",
|
||
scriptDirectorEdit: "改原文",
|
||
scriptDirectorLinesCount: "{count} 句",
|
||
scriptDirectorDeleteLine: "删除这句",
|
||
scriptDirectorPackageSummary: "共 {count} 句 · 用到:{emotions}",
|
||
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: "Opens Prompt Studio beside the canvas: 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.",
|
||
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",
|
||
updateGuideNoticeLabel: "Guide",
|
||
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",
|
||
updateGuideLayoutTitle: "New layout: the rail and the home page",
|
||
updateGuideLayoutBody: "Every page has an icon on the rail at the left, with the tools below and Settings at the bottom. Click the current page's icon again to hide or show its list. The browser opens on Home: pick a card for what you want to do; first time here, start with \"Scan model folders\" and \"Tour the interface\".",
|
||
updateGuideModelTypesTitle: "Models by type",
|
||
updateGuideModelTypesBody: "Chips at the top of the models page switch between Checkpoint, LoRA, VAE and the other types, with their counts, and list each type with its subfolders. Click a folder in the list to see only that one; ✕ goes back to the whole type.",
|
||
updateGuideActivityTitle: "Activity: see what the plugin changed",
|
||
updateGuideActivityBody: "Activity on the rail lists, by day, what the plugin did: which node settings changed on the canvas and from what to what, nodes added or removed, workflows opened, and the model, cover, recipe, combo and prompt files it changed. \"Find on canvas\" jumps to the node. Canvas changes can be undone here until something changes them again; the rest is only recorded.",
|
||
updateGuideVoicesTitle: "Give your characters a voice",
|
||
updateGuideVoicesBody: "With the Anomalous_TTS node pack installed, Voices has two views: Characters imports GPT-SoVITS characters and sets their emotions and pronunciations; Voice-over takes a pasted script, an emotion per line, and generates it right there. Generated audio is in Audio. The ! at the top right of the audio pages has a step-by-step guide.",
|
||
updateGuideMemoryTitle: "Lighter on memory",
|
||
updateGuideMemoryBody: "The gallery shows small thumbnails, so scrolling through hundreds of outputs no longer fills the browser's memory and graphics memory; dragging to the canvas and the large viewer still use the original. A minute and a half after you close the browser, its pictures are released.",
|
||
promptDrawerReplace: 'Replace this text',
|
||
promptDrawerAppend: 'Add this text',
|
||
promptDrawerLoadAll: 'Load both prompts',
|
||
materialAppliedTarget: 'Applied to: {name} · #{id}',
|
||
materialDropHint: 'Drop on a compatible node to apply; Esc cancels',
|
||
materialDropTarget: 'Drop to apply to: {name}',
|
||
promptPreviewTag: "after release",
|
||
promptDragText: 'Drag to a prompt node',
|
||
promptChooseTarget: 'Choose the text field to update',
|
||
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).",
|
||
materialInspectOnly: "View details",
|
||
materialUseTextBlock: "Use This Text",
|
||
promptCombinations: "Prompt Combinations",
|
||
promptSavedPlans: "Saved plans",
|
||
promptPlanName: "Plan name",
|
||
promptCompositionHint: "Enter prompt text, choose beginning or end, then drag onto a prompt node. Existing text is preserved. This does not start generation.",
|
||
promptAddPart: "New fragment",
|
||
promptAddToDraft: "Add to prompt combination",
|
||
promptPartLimit: "A plan supports up to 100 fragments.",
|
||
promptCurrentContent: "Content for this run",
|
||
promptCurrent_positive: "Positive content for this run",
|
||
promptCurrent_negative: "Negative content for this run",
|
||
promptFinalPreview: "Final prompts",
|
||
promptFinal_positive: "Positive prompt",
|
||
promptFinal_negative: "Negative prompt",
|
||
promptCopy_positive: "Copy positive",
|
||
promptCopy_negative: "Copy negative",
|
||
promptSelectTextNode: "Select a prompt node to write the final prompt, or copy it directly.",
|
||
promptTargetWidget: "Target text field",
|
||
promptTargetRole: "Prompt to apply",
|
||
promptAppend: "Append to node",
|
||
promptReplace: "Replace node text",
|
||
promptAddToPlan: "Add to Plan",
|
||
promptCardRole: "Role",
|
||
promptCardUnsaved: "Unsaved",
|
||
promptSaveCard: "Save Card",
|
||
nodeValuesSaved: "Saved these nodes' values. Select a node of the same kind and they are in Current node.",
|
||
promptImportOverwrite: "Overwrite",
|
||
promptImportAppend: "Append",
|
||
promptImportOverwritePrompt: "Overwrite current",
|
||
promptImportAppendPrompt: "Append to current",
|
||
promptPositiveNote: "Positive Prompt Note",
|
||
promptNegativeNote: "Negative Prompt Note",
|
||
promptWordCount: "{count} chars",
|
||
promptDragNoteHint: "Hold card or header to drag onto canvas node",
|
||
promptClearText: "Clear note",
|
||
promptClearConfirm: "Are you sure you want to clear this note?",
|
||
materialPromptStudio: "Prompt Studio",
|
||
materialCollapseStudio: "Collapse Studio",
|
||
materialSendToStudio: "Send to Studio Note",
|
||
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",
|
||
promptEnablePart: "Enable this fragment",
|
||
promptUnnamedPart: "Untitled fragment",
|
||
promptPartCategory: "Fragment category",
|
||
promptCategory_general: "General",
|
||
promptCategory_specific: "Specific",
|
||
promptPartName: "Fragment name, e.g. quality defaults or model style",
|
||
promptMoveUp: "Move up",
|
||
promptMoveDown: "Move down",
|
||
promptRemovePart: "Remove fragment",
|
||
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",
|
||
materialTitleSaved: "Title saved",
|
||
promptAdjustRole: "Adjust role",
|
||
notebookCompanionModels: "Companion models",
|
||
notebookMore: "More",
|
||
notebookDoneEditing: "📑 View Bilingual Tags",
|
||
recipeSearchAndReplace: "Find, Replace & Language",
|
||
recipeDiffNone: "None",
|
||
loras: "LoRA Models",
|
||
notebookPromptTitle: "Prompt",
|
||
materialAllKinds: "All types",
|
||
materialAllTags: "All tags",
|
||
materialDuplicateConfirm: "This image and selection are already saved as “{name}”. Save another copy?",
|
||
materialCopyError: "Copy failed; retry",
|
||
materialChars: "{count} 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.',
|
||
eco: '🔋 Eco Mode (Play video on hover)',
|
||
autoPlay: '🎬 AutoPlay Videos (High perf cost)',
|
||
togglePlayTitle: 'Toggle Play Mode',
|
||
clean: '🧹 Clean orphaned .info files',
|
||
cleanTitle: 'Clean Duplicate Info',
|
||
cleanConfirm: 'This will globally scan and delete all redundant .civitai.info files. Continue?',
|
||
cleaning: 'Cleaning',
|
||
cleanDone: '✅ Clean Complete! Deleted',
|
||
files: 'files.',
|
||
cleanFail: '❌ Failed: ',
|
||
cleanErr: '❌ Error: ',
|
||
folders: 'Folders',
|
||
collapseAll: 'Collapse All',
|
||
expandAll: 'Expand All',
|
||
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.",
|
||
scanPageTotal: "Models",
|
||
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} models not looked up yet",
|
||
scanPageScanAgain: "Check again",
|
||
scanPageScanPicked: "Scan the {count} picked models",
|
||
scanPageScanning: "Scanning…",
|
||
scanPageRetry: "Look up the {count} not found again",
|
||
scanPageHint: "An online scan asks Civitai first and guesses the base model from the file for what Civitai does not know; when Civitai cannot be reached it only reads the files and looks again next time. Scans run in the background; you can close this window and keep using ComfyUI.",
|
||
scanPageHintPicked: "Only the models picked in the scan settings are scanned.",
|
||
scanSettingsTitle: "Scan settings",
|
||
scanSettingsChange: "Change ›",
|
||
scanSettingsLead: "The next scan follows these settings. Reloading the page resets them; renaming files and fetching again turn themselves off after one scan.",
|
||
scanChipPicked: "Only the {count} picked",
|
||
scanChipOnline: "Online, asks Civitai",
|
||
scanChipDisplayName: "Civitai names shown",
|
||
scanChipFileRename: "Renames files",
|
||
scanChipForce: "Fetches everything again",
|
||
scanChipAutoFix: "Fixes the workflow after",
|
||
scanChipKeyOn: "API key set",
|
||
scanChipKeyOff: "No API key",
|
||
scanPageScope: "Which models",
|
||
scanPageScopeAll: "All models",
|
||
scanPageScopePicked: "Only ones I pick",
|
||
scanPageScopeAllHelp: "Every model folder except those hidden in Settings → Folder manager.",
|
||
scanPagePickModels: "Pick models…",
|
||
scanPagePickedCount: "{count} picked",
|
||
scanPageNothingPicked: "No models picked yet.",
|
||
scanPageHow: "How to scan",
|
||
scanPageOnline: "When scanning online",
|
||
scanPageOnlineOff: "When scanning online (not used by an offline scan)",
|
||
scanPageAfter: "After the scan",
|
||
scanPageAccount: "Civitai account",
|
||
scanPageTagFiles: "changes files",
|
||
scanPageTagSlow: "slow",
|
||
scanPageOffline: "Offline scan",
|
||
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.",
|
||
scanPageDisplayName: "Use Civitai's name as the display name",
|
||
scanPageDisplayNameHelp: "Only the name shown on cards; files keep their names. Names you set in the model editor are kept.",
|
||
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.",
|
||
scanPageAutoFix: "Fix missing models in the open workflow afterwards",
|
||
scanPageAutoFixHelp: "Like Model Check, swaps models the canvas cannot find for your local copies.",
|
||
scanPageApiKey: "Civitai API key",
|
||
scanPageApiKeyOn: "set",
|
||
scanPageApiKeyOff: "not set",
|
||
scanPageApiKeyHelp: "Some models need a Civitai login to show their details; your key lets the scan fetch them. Saved in the plugin settings on this computer.",
|
||
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",
|
||
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} 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} 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.",
|
||
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}",
|
||
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 download 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 download link in the editor.",
|
||
scanPageSkippedNote: "{count} more model files in other formats are not scanned; see which",
|
||
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",
|
||
scanPageHintOffline: "An offline scan stays off the internet and only reads the files to guess the base model: no covers or trigger words. The next online scan looks these models up.",
|
||
scanProgressShowResult: "Show the result",
|
||
modelSourceLabel: "Source",
|
||
modelSourceCivitai: "Civitai",
|
||
modelSourceLocal: "Inferred from the file",
|
||
modelSourceLocalShort: "Local",
|
||
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: "download link",
|
||
noModels: 'No models found in this folder.',
|
||
modelTypesLabel: 'Model types',
|
||
modelTypesRoot: 'Top folder',
|
||
modelTypesCrumbHint: 'Only the models in this folder. Click to show every {type}',
|
||
noPreview: 'No preview available',
|
||
clickScan: 'Click Scan',
|
||
back: '⬅️ Back',
|
||
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...',
|
||
backToPrev: '🔙 Back to prev',
|
||
applyToCanvas: 'Add Node',
|
||
applySuccess: '✅ Added to workflow',
|
||
workspace: 'Workspace',
|
||
workspaceTitle: 'Creative Workspace',
|
||
materialLoadError: "Could not read your saved prompts.",
|
||
materialModelSummary: '{count} model references',
|
||
materialOpenWorkflow: 'Open Full Workflow',
|
||
materialOpenError: "Could not open this image's workflow.",
|
||
materialViewDetails: 'View Details',
|
||
materialViewParameters: 'View Parameters',
|
||
materialDetailLoadError: "Could not read this prompt.",
|
||
materialParameterNodes: 'Reusable Parameter Nodes',
|
||
materialSourceImage: 'Source Image',
|
||
materialImageDetail: 'Image Parameter Details',
|
||
workbenchFullscreen: 'Fullscreen Workbench',
|
||
workbenchWindowed: 'Windowed Mode',
|
||
workbenchLoadToCanvas: 'Load to Canvas',
|
||
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',
|
||
workbenchFilterNodes: 'Search/filter nodes…',
|
||
workbenchCopyWorkflowJson: 'Copy Workflow JSON',
|
||
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",
|
||
materialKeyParams: 'Key Parameters',
|
||
materialPromptText: 'Prompt',
|
||
materialViewOriginal: '🔍 Full View',
|
||
materialDenoise: 'Denoise',
|
||
materialScheduler: 'Scheduler',
|
||
materialReferencedModels: 'Referenced Models ({count})',
|
||
materialModelBase: 'Base Model / UNet',
|
||
materialModelLora: '🎨 LoRA Layers',
|
||
materialModelVae: 'VAE',
|
||
materialModelClip: '👁️ Text Encoder (CLIP)',
|
||
materialModelOther: 'Other Models',
|
||
materialLoraStrength: 'Weight',
|
||
materialModelCountLora: '{count} LoRA',
|
||
materialModelCountClip: '{count} CLIP',
|
||
materialModelCountVae: '{count} VAE',
|
||
materialModelCountOther: '{count} other',
|
||
materialOpenModelDetail: 'Open model details',
|
||
materialModelNotes: 'Notes',
|
||
materialIncludedNodes: 'Included Nodes ({count})',
|
||
materialParameterCount: '{count} 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',
|
||
materialExpandAll: 'Expand',
|
||
materialCollapse: 'Collapse',
|
||
materialCopyAllParams: '📋 Copy All Params',
|
||
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} 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',
|
||
saveNotebook: "Save",
|
||
deleteNotebook: 'Delete',
|
||
baseModel: 'Base Model',
|
||
mainModel: 'Main Model',
|
||
shellCombos: "Combos",
|
||
shellPrompts: "Prompts",
|
||
comboLead: "A combo is a main model, a few LoRAs and a prompt. 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",
|
||
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} 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',
|
||
noBaseModel: 'Select a Base Model first',
|
||
dialogOk: 'OK',
|
||
dialogCancel: 'Cancel',
|
||
editModel: 'Edit Model',
|
||
scanModelPrecisely: 'Scan This Model',
|
||
unsupportedAutoApply: 'Unsupported model type for auto-apply.',
|
||
createNodeFailed: 'Failed to create node: ',
|
||
galleryLoading: 'Loading...',
|
||
galleryErrorPrefix: 'Error: ',
|
||
galleryDelete: 'Delete',
|
||
galleryKeep: "Keep it as a workflow, a combo or its prompts",
|
||
galleryKept: "Kept; see what it was kept as",
|
||
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: "Main model, LoRAs and positive prompt, 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_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.",
|
||
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.',
|
||
galleryDeleting: 'Deleting...',
|
||
galleryDeleteFailed: 'Delete failed: ',
|
||
galleryNoMore: 'No more images',
|
||
galleryScrollMore: 'Scroll down to load more',
|
||
galleryLoadFailed: 'Load failed',
|
||
galleryEmpty: 'Gallery is empty',
|
||
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…',
|
||
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',
|
||
detailJumpToBottom: 'Jump to bottom',
|
||
detailEdit: 'Edit',
|
||
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.',
|
||
detailToggleSound: 'Toggle Sound',
|
||
detailNoCover: 'No Cover',
|
||
detailPickGallery: 'Pick from Gallery',
|
||
detailUploadLocal: 'Upload Local',
|
||
detailUploadError: 'Error: ',
|
||
detailUploadFailed: 'Upload failed: ',
|
||
detailModelInfo: 'Edit Model Info',
|
||
detailFile: 'File:',
|
||
detailPhysicalFilename: 'Physical file',
|
||
detailFullPath: 'Full path',
|
||
detailCopyPath: 'Copy path',
|
||
detailPathCopied: 'Copied',
|
||
detailPathCopyFailed: 'Copy failed',
|
||
detailCustomNamePlaceholder: 'Custom Name (Leave empty to use original)',
|
||
detailNotesPlaceholder: '📓 Custom Notes...',
|
||
detailPhysicalRename: 'Physical Rename on Disk',
|
||
detailPhysicalRenameDesc: 'Virtual rename only if unchecked. Safe for originals.',
|
||
detailPhysicalRenameProtectedDesc: 'Foundation components such as VAE, CLIP/Text Encoder, and CLIP Vision are protected from physical renaming.',
|
||
detailResetAll: 'Reset All',
|
||
detailResetConfirm: 'Reset all custom info for this model?',
|
||
detailResetCoverPreserved: 'No recoverable Civitai backup or original cover was found. The current cover was kept to avoid losing the only image; the custom name and notes were still reset.',
|
||
detailResetCoverFailed: 'The cover restore could not be completed. Check file permissions or locks; the custom name and notes were still reset.',
|
||
detailResetFailed: 'Reset failed.',
|
||
detailCancel: 'Cancel',
|
||
detailSaveChanges: 'Save Changes',
|
||
detailSaving: 'Saving...',
|
||
detailSelectModels: 'Select Models',
|
||
detailFolders: 'Folders',
|
||
detailSelectedItems: 'Selected {count} items',
|
||
detailSelectedItemsPrefix: 'Selected ',
|
||
detailSelectedItemsSuffix: ' items',
|
||
detailNothingSelected: 'Nothing selected',
|
||
detailLoadedModels: 'Loaded {loaded} / {total} models',
|
||
detailComputing: 'Computing...',
|
||
detailSelectNoPreview: 'Select No Preview',
|
||
detailSelectNoDesc: 'Select No Desc',
|
||
detailSelectAll: 'Select All',
|
||
detailClear: 'Clear',
|
||
detailConfirm: 'Confirm',
|
||
detailLoading: 'Loading...',
|
||
detailAllLoaded: '✅ All models loaded',
|
||
detailScrollMore: 'Scroll for more...',
|
||
detailNoModels: 'No models found.',
|
||
detailApiRestart: '❌ Backend API request failed!\n\nYou must restart the ComfyUI process for the newly written backend code to take effect.',
|
||
doctorGraphUnavailable: 'The current graph or node is unavailable.',
|
||
doctorMissingChainInputs: 'The node does not expose both MODEL and CLIP inputs.',
|
||
doctorUnconnectedChainInputs: 'Both MODEL and CLIP inputs must already be connected.',
|
||
doctorMissingChainOutputs: 'The node does not expose both MODEL and CLIP outputs.',
|
||
doctorAmbiguousBranches: 'Multiple downstream branches were detected; choose an explicit chain first.',
|
||
doctorInvalidDownstream: 'An existing downstream link is invalid and cannot be safely changed.',
|
||
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',
|
||
currentNodeFromRecipe: 'Recipe · {name}',
|
||
currentNodeFromMaterial: "Saved values",
|
||
currentNodeMoreChanges: '{count} more',
|
||
currentNodeKept: 'Kept: {names} (seeds, models and choices this computer lacks stay; change the model above)',
|
||
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 {count} models are on this computer; the workflow can run.',
|
||
doctorHowItWorks: '"Put in" only uses the same file (same fingerprint). For the others, pick a local model yourself or download it from 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.',
|
||
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} 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} 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} models.',
|
||
doctorBannerShow: 'Show',
|
||
doctorBannerClose: 'Close',
|
||
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} 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.',
|
||
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',
|
||
mainPreflightDesc: 'Paste the workflow JSON here. We will extract and validate all model dependencies before loading.',
|
||
mainCancel: 'Cancel',
|
||
mainAnalyzePreflight: '🔍 Analyze & Pre-flight',
|
||
mainForceLoad: 'Force Load to Canvas',
|
||
mainNoDependencies: '✅ No model dependencies detected.',
|
||
mainDetectedModels: 'Detected {count} model resources:',
|
||
mainDownloadCivitai: 'Download',
|
||
mainReady: 'Ready',
|
||
mainInvalidJson: 'Invalid JSON!',
|
||
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',
|
||
mainAbyssalScarletThemeSetting: 'Enable Abyssal Scarlet Mode',
|
||
mainAbyssalScarletThemeTooltip: 'Switch to the dark ornate anime gothic theme fusing abyssal eldritch and Scarlet Devil aesthetics.',
|
||
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.',
|
||
mainMaterialsShortcutSetting: "Open Prompt Studio shortcut",
|
||
mainMaterialsShortcutTooltip: 'Defaults to Ctrl+Shift+L and can be changed with ComfyUI\'s native recorder.',
|
||
mainOpenMaterialsTitle: "Open Anomalous Prompt Studio",
|
||
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.',
|
||
mainExportTitle: 'Export Workflow Share Code',
|
||
mainSkeletonOption: 'Skeleton (Compact, best for comments, loses coords)',
|
||
mainFullOption: 'Full (Keeps coords and colors, longer string)',
|
||
mainShareFingerprints: "{hashed} of {total} 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})",
|
||
mainGenerate: 'Generate',
|
||
mainCopyClipboard: 'Copy',
|
||
mainClose: 'Close',
|
||
mainCopied: '✅ Copied successfully!',
|
||
mainImportTitle: 'Import Workflow Share Code',
|
||
mainSharePlaceholder: 'Paste AMB0- or AMB1- share code here...',
|
||
mainImportLoad: 'Import & Load',
|
||
mainShareEmpty: '❌ Share code is empty',
|
||
mainImportedNodes: '✅ Successfully imported {count} nodes',
|
||
mainDecodeFailed: '❌ Decode Failed: ',
|
||
mainUnifiedTitle: "🔄 Workflow Import / Export",
|
||
mainExportWorkflow: "📤 Export Workflow to Share Code",
|
||
mainImportWorkflow: 'Import Workflow from Share Code',
|
||
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: "Opens Prompt Studio beside the canvas: the selected prompt node edited tag by tag, cards added with a click, Chinese translated to English.",
|
||
homeStartLabel: "New here?",
|
||
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} things on the canvas",
|
||
activityCanvasOpened: "Opened workflow {name} ({count} 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",
|
||
activityVoiceStorage: "Changed where characters are kept",
|
||
sidebarToggle: 'Show or hide the list',
|
||
sidebarDoctor: 'Model Check',
|
||
sidebarAssistant: 'Current node',
|
||
sidebarPreflight: 'Preflight Import',
|
||
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: "Abyssal Scarlet is an alternative deep-red palette.",
|
||
settingsThemeDefault: "Default",
|
||
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: "A video cover shows its first frame and plays when the pointer is on it. 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",
|
||
settingsOpening: "Opening and window",
|
||
settingsEntryHelp: "Where you open this browser from. Shortcuts are set in ComfyUI's settings under Anomalous Model Browser.",
|
||
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",
|
||
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',
|
||
sidebarScanComplete: '✅ Scan/Rename completed! Data updated.',
|
||
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.",
|
||
sidebarImportExport: 'Import Workflow (Share Code)',
|
||
sidebarGlobalQuickScan: '🌍 Global Quick Scan (No rename/No media)',
|
||
sidebarGlobalQuickScanShort: '🌍 Global Quick Scan (No rename/No media)',
|
||
sidebarGlobalQuickConfirm: 'Start global quick scan to sync all hashes?',
|
||
sidebarScanning: '⏳ Scanning...',
|
||
sidebarGlobalStarted: 'Global Scan started in background!',
|
||
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}',
|
||
sidebarError: 'Error: ',
|
||
sidebarLocalScanOn: '☑ Local metadata scan for non-Civitai [ON]',
|
||
sidebarLocalScanOff: '☐ Local metadata scan for non-Civitai [OFF]',
|
||
sidebarLocalScanOnEn: '☑ Local metadata scan for non-Civitai [ON]',
|
||
sidebarLocalScanOffEn: '☐ Local metadata scan for non-Civitai [OFF]',
|
||
sidebarCheckMissing: '🔍 Check & Auto-Scan Missing Info',
|
||
sidebarChecking: '⏳ Checking...',
|
||
sidebarMissingScanning: '⚠️ Missing info found, Auto-Scanning...',
|
||
sidebarInfoComplete: '✅ Info Complete',
|
||
sidebarAllInfoComplete: '✨ All Model Info is Complete',
|
||
sidebarUiScale: "Interface scale",
|
||
sidebarViewMode: 'View Mode',
|
||
sidebarViewModeCompact: 'Compact',
|
||
sidebarViewModeStandard: 'Standard',
|
||
sidebarViewModeAesthetic: 'Aesthetic',
|
||
sidebarBgAtmosphere: 'Background Atmosphere',
|
||
sidebarBgAtmosphereHelp: 'Adjust blueprint backdrop opacity (0% is pure solid dark)',
|
||
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",
|
||
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",
|
||
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",
|
||
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: "Workflow Import / Export Center",
|
||
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} links in the workflow",
|
||
modelSourcesWorkflowEmpty: "The canvas uses no models",
|
||
modelSourcesNoteTitle: "Model sources",
|
||
modelSourcesNoteFile: "File",
|
||
modelSourcesNoteLink: "Link",
|
||
modelSourcesNoteCount: "{count} 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} 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",
|
||
sidebarInjectHash: '🟢 Inject Workflow Hash',
|
||
sidebarSkipHash: '⚪ Skip Workflow Hash',
|
||
sidebarManageFolders: 'Manage Folders',
|
||
sidebarVideoPlayback: "Video covers",
|
||
sidebarAlwaysPlay: "Always play",
|
||
sidebarHoverPlay: "Play on hover (recommended)",
|
||
sidebarCardQuality: "Card pictures",
|
||
sidebarOptimizedThumbnail: "Thumbnails (recommended)",
|
||
sidebarOriginalCover: "Originals",
|
||
sidebarModuleNotLoaded: 'Module not loaded, please refresh!',
|
||
sidebarExpandAll: 'Expand All',
|
||
sidebarCollapseAll: 'Collapse All',
|
||
sidebarSearchModels: 'Search models...',
|
||
delSure: 'Confirm Delete?',
|
||
dockTitle: 'Dock to Left',
|
||
replaceAll: 'Replace All',
|
||
editRaw: 'Edit full text',
|
||
findPlaceholder: 'Find...',
|
||
replacePlaceholder: 'Replace with...',
|
||
models: 'Models',
|
||
gallery: 'Gallery',
|
||
apiKeyConfig: '🔑 Civitai API Key Config (For downloading previews)',
|
||
apiKeyPrompt: 'Enter your Civitai API Key:',
|
||
settingsBtn: 'Settings',
|
||
closeSettings: '✖ Close Settings',
|
||
importBtn: 'Import Workflow (Share Code)',
|
||
recipeTitle: 'Workflows',
|
||
recipeClose: 'Close Workflow Recipes',
|
||
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, {links} links, {groups} groups.',
|
||
recipeSaveReceiptMismatch: 'Saved, but the integrity receipt differs from the current canvas. Reopen the recipe to verify it.',
|
||
recipeEmpty: 'No Workflow Recipes yet. Save a workflow that is working well.',
|
||
recipeLoadError: 'Could not load Workflow Recipes.',
|
||
recipeUntitled: 'Untitled Recipe',
|
||
recipeSearchPlaceholder: 'Search names, notes, or tags…',
|
||
recipeClearFilters: 'Clear filters',
|
||
recipeNoTags: 'No tags yet',
|
||
recipeNoMatches: 'No recipes match. Clear the search or tag filters.',
|
||
recipeFilterByTag: 'Filter by this tag',
|
||
recipeImport: 'Import package',
|
||
recipeExport: 'Export package',
|
||
recipeExportUnavailable: 'Recipe package export is temporarily unavailable',
|
||
recipeDialogNo: 'No',
|
||
recipeModel: 'Model',
|
||
recipeLoras: 'LoRAs',
|
||
recipePrompt: 'Positive prompt',
|
||
recipeSteps: 'Steps',
|
||
recipeRestore: 'Restore version',
|
||
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',
|
||
recipeDraggableBadge: 'Draggable',
|
||
recipeCardPrimaryActionTooltipComplete: 'Open workflow in new canvas (or drag & drop card directly)',
|
||
recipeCardPrimaryActionTooltipPartial: 'Append module to current canvas (or drag & drop card directly)',
|
||
recipeDragGlobalHint: 'Tip: Drag and drop cards directly onto ComfyUI canvas to load workflows',
|
||
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',
|
||
recipeScope: 'Recipe type',
|
||
recipeScopePartial: 'Partial recipe',
|
||
recipeScopeComplete: 'Complete recipe',
|
||
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.',
|
||
recipeNodeParams: 'Node parameters',
|
||
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',
|
||
recipeInlineSave: 'Save',
|
||
recipeInlineCancel: 'Cancel',
|
||
recipeInlineSaving: 'Saving…',
|
||
recipeInlineError: 'Could not save. Try again.',
|
||
recipeInlineNameRequired: 'Name cannot be empty.',
|
||
recipeSomeParamsInWorkflow: 'Other complex or sensitive parameters remain in the full workflow.',
|
||
recipeMoreNodesInWorkflow: 'Other nodes remain in the full workflow.',
|
||
recipeMissingNodes: 'These node types are currently missing; the restored workflow may not run',
|
||
recipeBindImage: 'Bind cover image',
|
||
recipeNoImage: 'No image',
|
||
recipeCanvasPreview: 'Current canvas',
|
||
recipeLoadingRecentImages: 'Loading recent outputs…',
|
||
recipeRecentImages: 'Recent outputs',
|
||
recipeRecentImagesUnavailable: 'Recent outputs are currently unavailable.',
|
||
recipeChoosePinnedParams: 'Choose key parameters',
|
||
recipePinnedParams: 'Key parameters',
|
||
recipeKeepImage: 'Keep current cover',
|
||
recipeEdit: 'Edit',
|
||
recipeEditTitle: 'Edit Workflow Recipe',
|
||
recipeEditNodeParams: 'Edit node parameters',
|
||
recipeComplexParam: 'Complex values are shown only; the full value remains safely stored in the workflow.',
|
||
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.',
|
||
recipeViewDetails: 'View details',
|
||
recipeDetailBack: 'Back to recipes',
|
||
recipeDetailOverview: 'Overview',
|
||
recipeGallery: 'Gallery',
|
||
recipeGalleryLoading: 'Finding matching history images…',
|
||
recipeGalleryEmpty: 'No matching result was found in the latest 200 PNGs with workflow metadata.',
|
||
recipeGalleryRefresh: 'Refresh matches',
|
||
recipeGallerySetCover: 'Set as recipe cover',
|
||
recipeGalleryCoverSaved: 'Recipe cover set',
|
||
recipeGalleryCoverError: 'Could not set the recipe cover.',
|
||
recipeGalleryLoadError: 'Could not load the recipe gallery.',
|
||
recipeGalleryScanHint: 'Checked the latest {count} PNGs with workflow metadata.',
|
||
recipeGalleryOpenImage: 'View full image',
|
||
recipeGalleryCompare: 'Compare parameters',
|
||
recipeGalleryComparison: 'Recipe vs image parameters',
|
||
recipeGalleryComparisonLoading: 'Reading this image parameters…',
|
||
recipeGalleryComparisonError: 'Could not read this image parameters.',
|
||
recipeGalleryNoDifferences: 'No displayable parameter differences were found.',
|
||
recipeGalleryDifferenceHint: 'These are node-parameter differences; gallery matching only uses node types.',
|
||
recipeGalleryRecipeValue: 'Recipe',
|
||
recipeGalleryImageValue: 'Image',
|
||
recipeDetailModels: 'Models & reproducibility',
|
||
recipeDetailParameters: 'Parameter Set',
|
||
recipeDetailParametersHint: 'This view contains the saved parameters. Long values can be expanded and copied. The parameter gallery matches values, not local paths.',
|
||
recipeParameterSnapshots: 'Parameter snapshots',
|
||
recipeParameterSnapshotsHint: 'Each recipe save creates one read-only snapshot.',
|
||
recipeParameterShowing: 'Showing parameter note',
|
||
recipeParameterCurrentRecipe: 'Current recipe parameters',
|
||
recipeParameterActive: 'Current',
|
||
recipeParameterRefresh: 'Refresh snapshots',
|
||
recipeParameterLoading: 'Loading parameter snapshots…',
|
||
recipeParameterLoadError: 'Could not load parameter snapshots.',
|
||
recipeParameterNoSnapshots: 'This recipe has no parameter snapshots yet.',
|
||
recipeParameterUntitled: 'Untitled parameter snapshot',
|
||
recipeParameterDelete: 'Delete parameter note',
|
||
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',
|
||
recipeParameterReadCurrentSaving: 'Reading and saving…',
|
||
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',
|
||
recipeParameterApplying: 'Checking the skeleton and applying…',
|
||
recipeParameterApplied: 'Applied {count} 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',
|
||
recipeDetailParameterSummary: 'Common parameters',
|
||
recipeDetailNodeParameters: 'Node parameters',
|
||
recipeDetailUnknownNode: 'Unnamed node',
|
||
recipeDetailWidget: 'Widget',
|
||
recipeDetailScheduler: 'Scheduler',
|
||
recipeDetailSteps: 'Steps',
|
||
recipeDetailCFG: 'CFG',
|
||
recipeDetailDenoise: 'Denoise',
|
||
recipeDetailSeed: 'Seed',
|
||
recipeParameterGallery: 'Outputs with the same parameters',
|
||
recipeParameterGalleryLoading: 'Finding historical outputs with the same parameters…',
|
||
recipeParameterGalleryEmpty: 'No historical output with identical parameters was found.',
|
||
recipeParameterGalleryError: 'Could not load the parameter gallery.',
|
||
recipeDetailNoSavedParameters: 'This recipe has no displayable parameters.',
|
||
recipeDetailVersions: 'Versions',
|
||
recipeDetailModelComposition: "Models it uses",
|
||
recipeDetailBaseModel: 'Base model',
|
||
recipeDetailIdentity: 'Verified identities',
|
||
recipeDetailUnverified: 'Unverified models',
|
||
recipeDetailMissingNodes: 'Missing node types',
|
||
recipeDetailNotIndexed: 'Not indexed yet',
|
||
recipeDetailLoraSummary: 'LoRA',
|
||
recipeDetailSampler: 'Sampler',
|
||
recipeDetailResolution: 'Resolution',
|
||
recipeDetailUnavailable: 'Unavailable',
|
||
recipeDetailNoNotes: 'No notes.',
|
||
recipeDetailUpdated: 'Updated',
|
||
recipeDetailCopyPrompt: 'Copy prompt',
|
||
recipeDetailCopyFingerprint: 'Copy workflow fingerprint',
|
||
recipeDetailPrompts: 'Prompts',
|
||
recipeDetailPositivePrompt: 'Positive prompt',
|
||
recipeDetailNegativePrompt: 'Negative prompt',
|
||
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',
|
||
recipeDetailRefreshOrigin: 'Refresh Origin Info',
|
||
recipeDetailRefreshOriginDesc: 'Refresh all model origin information in this recipe (supports backfilling old recipes)',
|
||
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',
|
||
recipeMatchRecipeModelsDesc: 'Find local files by model hash, file size, and model category; the author’s path is not used.',
|
||
recipeRecipeMatchSummary: 'Found {found}/{total} local matches',
|
||
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.',
|
||
recipeDetailSearchParameters: 'Search node, type, or widget name…',
|
||
recipeDetailNoParameters: 'No safe parameters match the search.',
|
||
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',
|
||
recipeParameterNotebooks: 'PARAMETER SETS',
|
||
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} models missing",
|
||
recipeStatusChecking: '⏳ Checking Environment…',
|
||
recipeQuickSpecs: 'Quick Specs',
|
||
recipeRawNodesToggle: 'Raw Node Parameters',
|
||
recipeRawNodesCount: 'nodes',
|
||
recipeRawNodesShowMore: 'Show {count} more nodes…',
|
||
recipeRawNodesLoadedCount: 'Loaded {shown} / {total} nodes',
|
||
recipeCardSpecsCheckpoint: 'Base',
|
||
recipeCardSpecsLoras: 'LoRA',
|
||
recipeCardSpecsSteps: 'Steps',
|
||
recipeCardSpecsSampler: 'Sampler',
|
||
recipeCardSpecsResolution: 'Size',
|
||
domainVisualBadge: "Visual",
|
||
domainAudioBadge: "Audio",
|
||
audioVoiceClipCount: "{count} clips",
|
||
audioSearchCharacters: "Search characters or emotions",
|
||
audioPlay: "Play",
|
||
audioPause: "Pause",
|
||
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 \"角色语音 (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 (or press a character card's \"Voice-over\"), pick who speaks in the list or above, paste the script and press \"Split into lines\". Each sentence becomes a card where you click an emotion; you can split, merge or delete cards. 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 \"角色语音 (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 characters are kept, pretrained downloads and packages are 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: "Edit emotions",
|
||
ttsEditorTitle: "Edit emotions · {name}",
|
||
ttsEditorSubtitle: "Pick one reference clip (3–10 s, with its line) for the main voice and each emotion. Saved to anomalous_tts.json in the character folder.",
|
||
ttsEditorAudioPlaceholder: "Type or pick an audio file",
|
||
ttsEditorTextPlaceholder: "Reference line (blank: found automatically)",
|
||
ttsEditorMainSection: "Main voice",
|
||
ttsEditorEmotionSection: "Emotions",
|
||
ttsEditorMainAuto: "When unset, the node uses: {file}",
|
||
ttsEditorMainHint: "Blank: the node picks a 3–10 s clip itself",
|
||
ttsEditorEmotionPlaceholder: "Emotion name, e.g. happy",
|
||
ttsEditorRemove: "Remove this row",
|
||
ttsEditorAdd: "+ Add emotion",
|
||
ttsEditorFilenameEmotions: "Clips with an emotion in their file name are also found automatically: {emotions}",
|
||
ttsEditorSave: "Save",
|
||
ttsEditorSaveFailed: "Could not save: {error}",
|
||
ttsEditorLoadingFiles: "Reading this character's audio files…",
|
||
ttsEditorFileCount: "{count} audio files in this character. Type to search.",
|
||
ttsEditorLoadFailed: "Could not read the audio files: {error}",
|
||
ttsEditorUnknownAudio: "{file} is not in this character's folder",
|
||
ttsEditorNameMissing: "{file} has no emotion name yet",
|
||
ttsEditorNameInvalid: "The emotion name \"{name}\" cannot be used: not main, and no {} [] characters",
|
||
ttsEditorNameDuplicate: "The emotion name \"{name}\" is used twice",
|
||
ttsEditorAudioMissing: "Emotion \"{name}\" has no audio yet",
|
||
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} 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",
|
||
ttsSetupMoving: "moving characters {done}/{total}",
|
||
ttsStorageChange: "Change…",
|
||
ttsStorageChangeTitle: "Choose a new place for characters",
|
||
ttsStorageChangeHint: "Imported characters go to this folder from now on. You can then choose whether the current characters move there too.",
|
||
ttsStorageHint: "Imported characters are kept here. When you change the place, the current characters can move along: instant on the same disk; across disks they are copied first and the originals deleted after.",
|
||
ttsStorageMoveAsk: "The current place holds {count} characters. Move them to\n{path}\ntoo?\n\nIf not, they stay where they are and keep working; only new imports go to the new place.",
|
||
ttsStorageMoveYes: "Move them",
|
||
ttsStorageMoveNo: "Don't move",
|
||
ttsStorageMoving: "Moving {done}/{total}: {current}",
|
||
ttsStorageMovingBytes: " ({percent}% copied)",
|
||
ttsStorageMoveDone: "Moved {count} characters here",
|
||
ttsStorageMoveError: "The move stopped: {error} ({done}/{total} moved; the rest stay where they were and keep working)",
|
||
ttsOtherPlacesHint: "Characters in these places keep working. Press × on an earlier place to stop listing it; no files are deleted.",
|
||
ttsLibrarySource_default: "default",
|
||
ttsLibrarySource_yaml: "yaml config",
|
||
ttsLibrarySource_app: "earlier place",
|
||
ttsLibraryMissing: "folder not found",
|
||
ttsLibraryRemove: "Remove",
|
||
ttsLibraryRemoveConfirm: "Stop reading this earlier place?\n{path}\n\nNo files are deleted; its characters are just no longer listed.",
|
||
ttsNeededFor_all: "all models",
|
||
ttsNeededFor_zh: "Chinese",
|
||
ttsNeededFor_en: "English",
|
||
ttsNeededFor_ja: "Japanese",
|
||
ttsNeededFor_v2pro: "v2Pro models",
|
||
ttsPretrainedOk: "ready",
|
||
ttsPretrainedMissing: "missing",
|
||
ttsPretrainedOptional: "missing (optional)",
|
||
ttsPretrainedQueued: "queued",
|
||
ttsPretrainedDownloading: "downloading {percent}%",
|
||
ttsPretrainedError: "download failed",
|
||
ttsPretrainedDownload: "Download (~{size})",
|
||
ttsPretrainedDownloadAll: "Download all (~{size})",
|
||
ttsPretrainedUsePackage: "Use an existing GPT-SoVITS package",
|
||
ttsPretrainedPackageHint: "Pick the package's GPT_SoVITS folder (it has pretrained_models and text); nothing needs downloading then.",
|
||
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.",
|
||
ttsPackagesFor: "{lang}: missing {packages}",
|
||
ttsPackagesHint: "Run the command above in a terminal, then restart ComfyUI.",
|
||
ttsCopyCommand: "Copy command",
|
||
ttsCopied: "Copied",
|
||
ttsKind_gpt: "GPT",
|
||
ttsKind_sovits: "SoVITS",
|
||
ttsKind_audio: "audio",
|
||
ttsKind_text: "text",
|
||
ttsPickFolderTitle: "Choose a folder",
|
||
ttsPickFilesTitle: "Choose files",
|
||
ttsPickPathPlaceholder: "Type or paste a path, press Enter",
|
||
ttsPickUp: "Up",
|
||
ttsPickGo: "Open",
|
||
ttsPickThisFolder: "Choose this folder",
|
||
ttsPickAddFiles: "Add selected files ({count})",
|
||
ttsPickEmpty: "No usable files or folders here",
|
||
ttsPickTruncated: "Too many files: only the first ones are shown",
|
||
ttsImportOpenShort: "Import character",
|
||
ttsImportOpen: "+ Import character",
|
||
ttsImportAddOpen: "Add files",
|
||
ttsImportTitle: "Import a GPT-SoVITS character",
|
||
ttsBatchPickFolder: "Choose folder…",
|
||
ttsBatchPickLocalFolder: "Choose a folder on this PC…",
|
||
ttsBatchPickLocalFolderHint: "Pick a folder (a GPT-SoVITS package or your own voice folder). Weights, clips and line files a few levels down are listed and grouped, with no upload.",
|
||
ttsBatchScanTruncated: "Too many files; only the first {count} are listed.",
|
||
ttsBatchNewDraft: "+ New character",
|
||
ttsBatchUnnamed: "Unnamed character",
|
||
ttsBatchTray: "Unassigned",
|
||
ttsBatchSubmit: "Import {count} 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",
|
||
ttsHeroLocalFiles: "choose files",
|
||
ttsHeroLocalFolder: "choose a folder",
|
||
ttsHeroLocal: "Files on this PC? No upload needed:",
|
||
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",
|
||
ttsMenuLocalFiles: "Choose files on this PC…",
|
||
ttsMenuLocalHint: "read directly, no upload, faster",
|
||
ttsAddMore: "+ Add more",
|
||
ttsToolbarFound: "{count} characters",
|
||
ttsToolbarAdding: "Adding to \"{name}\"",
|
||
ttsFooterWaiting: "{count} need a look",
|
||
ttsFooterTray: "{count} 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} 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} files? The originals are not touched.",
|
||
ttsCardFromThisPc: "From this PC",
|
||
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} 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} 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, not supported yet; use a v1 / v2 / v2Pro one",
|
||
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} 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} clips",
|
||
ttsCardLeftOut: "Left out · {count} clips not 3–10 s long (the node cannot use them), with their line files",
|
||
ttsCardTrayFolder: "{folder} · {count} files",
|
||
ttsCardTrayTop: "(top level)",
|
||
ttsCardTrayMoveAll: "Move the whole folder to…",
|
||
ttsUploadLargeTitle: "A lot to upload",
|
||
ttsUploadLarge: "This would upload {count} files, {size} in all. Uploading through the browser is slow and makes the window sluggish. ComfyUI runs on this computer: choosing the folder from this computer copies it directly, without uploading.",
|
||
ttsUploadUseLocal: "Choose the folder on this computer",
|
||
ttsUploadAnyway: "Upload anyway",
|
||
ttsSkippedFolders: "Skipped these folders (Python environments, base models, or a package's program and training folders): {folders}.",
|
||
ttsScanTooDeep: "These folders are too deep and were not listed: {folders}. Choose such a folder directly to add it.",
|
||
ttsImportKeptBestMany: "Each character uses its GPT and SoVITS weights of the latest epoch ({count} 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} others left out).",
|
||
ttsImportUnsupportedBlock: "{file} is a {version} model, which is not supported yet. Use a v1, v2, v2Pro or v2ProPlus SoVITS weight.",
|
||
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…",
|
||
ttsImportPickLocal: "Choose from this computer…",
|
||
ttsImportPickLocalHint: "Pick files on the computer directly (e.g. a package's GPT_weights_v2 / SoVITS_weights_v2): no upload, faster.",
|
||
ttsImportSkipped: "Skipped unsupported or duplicate files: {files}",
|
||
ttsImportRenamed: "{count} 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} characters)",
|
||
ttsBatchImported: "The {count} characters of the last batch are imported; here is the next batch.",
|
||
ttsFooterPending: "{count} 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}. Choose another one under GPT-SoVITS settings at the bottom of the sidebar.",
|
||
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",
|
||
audioSectionCharacters: "Characters",
|
||
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.",
|
||
audioDeleteSuccess: "Audio file deleted",
|
||
audioDownload: "Download",
|
||
audioDelete: "Delete",
|
||
audioFileSize: "Size",
|
||
audioDuration: "Duration",
|
||
audioTime: "Created At",
|
||
scriptDirectorSubtitle: "Pick a character, paste the lines, click an emotion for each line, then generate.",
|
||
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: 'Auto',
|
||
scriptRunLang_zh: 'Chinese',
|
||
scriptRunLang_ja: 'Japanese',
|
||
scriptRunLang_en: 'English',
|
||
scriptRunSpeed: 'Speed',
|
||
scriptRunHow: "How it is read",
|
||
scriptRunFineTune: "Fine-tuning (usually left alone)",
|
||
scriptRunFineTuned: " · tuned",
|
||
scriptRunParamName_top_k: "Candidates",
|
||
scriptRunParamName_top_p: "Candidate share",
|
||
scriptRunParamName_temperature: "Randomness",
|
||
scriptRunParamName_repetition_penalty: "Repetition guard",
|
||
scriptRunSaveDefaults: 'Save these settings as this character\'s default',
|
||
scriptRunDefaultsSaved: 'Saved',
|
||
scriptRunDefaultsFailed: 'Could not save the defaults: {error}',
|
||
scriptRunSettingsBroken: 'This character\'s settings file has a problem; fix it before saving: {error}',
|
||
scriptRunSaveDefaultsHint: 'Language, speed and the advanced parameters are kept for this character. The seed is not: it only means something for this script',
|
||
scriptRunAdvancedNote: "When a take sounds right, save it as this character's default. Across languages (a Japanese voice speaking Chinese) the node narrows the candidates and the randomness by itself.",
|
||
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",
|
||
scriptDirectorPreviewEmotion: "Hear the reference clip of “{emotion}”",
|
||
scriptDirectorOnlyMain: "This character has only its main voice, so every line uses it. Add emotions under Characters and each line can pick one here.",
|
||
scriptDirectorUseCharacter: "Voice-over",
|
||
scriptDirectorUseCharacterHint: "Write lines for {character} and generate them",
|
||
scriptDirectorWorkflowTitle: "Into your own workflow",
|
||
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} 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?",
|
||
scriptDirectorCharacter: "Who speaks",
|
||
scriptDirectorPickCharacter: "Choose a character first",
|
||
scriptDirectorEmotionsAvailable: "Available emotions: {emotions}",
|
||
scriptDirectorMainEmotion: "main",
|
||
scriptDirectorEdit: "Edit the text",
|
||
scriptDirectorLinesCount: "{count} lines",
|
||
scriptDirectorDeleteLine: "Delete line",
|
||
scriptDirectorPackageSummary: "{count} lines · using {emotions}",
|
||
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 function formatTranslation(template, params = {}) {
|
||
if (typeof template !== 'string') return template;
|
||
return template.replace(/\{([A-Za-z0-9_.-]+)\}/g, (token, key) => (
|
||
hasOwn(params, key) ? String(params[key]) : token
|
||
));
|
||
}
|
||
|
||
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);
|
||
}
|