export const i18n = { zh: { actionTools: "工具", actionScan: "扫描", actionDoctor: "医生", actionAssistant: "助手", actionMaterials: "素材", actionSettings: "设置", actionToolsHint: "打开提示词工具、模型来源和导入导出中心", actionScanHint: "扫描本地模型,补充模型信息和预览", actionDoctorHint: "检查工作流中缺失的模型并修复路径", actionAssistantHint: "操作选中的节点,应用模型或参数方案", actionMaterialsHint: "浏览和使用保存的提示词、参数与工作流素材", actionSettingsHint: "调整语言、界面和插件选项", updateGuideTitle: "本次更新", updateGuideReplay: "查看更新引导", updateGuideSkip: "跳过", updateGuideBack: "上一步", updateGuideNext: "下一步", updateGuideDone: "知道了", updateGuideProgress: "第 {current} / {total} 步", updateGuideNoticeLabel: "新指引", updateGuideNoticeTooltip: "查看更新引导", shortcutBarPinned: "已固定", shortcutBarPin: "固定到快捷栏", shortcutBarUnpin: "从快捷栏移除", shortcutBarMoveLeft: "向左移动", shortcutBarMoveRight: "向右移动", shortcutBarCapacityFull: "快捷栏已满,请先将一个工具移回工具箱", shortcutBarReset: "恢复默认快捷栏", shortcutBarResetConfirm: "确定要将快捷栏恢复为默认布局吗?", shortcutDropHint: "拖到下方,固定常用工具;拖回这里,收起快捷入口", shortcutDropRelease: "松开,从快捷栏移除", shortcutBarAnchorTip: "固定入口,不可移动", updateGuideStartTour: "🎯 界面按键遮罩导览", updateGuideTourBanner: "💡 想在主界面实地体验?点击开启按键遮罩导览 ›", materialDragGlobalHint: "💡 提示:按住卡片直接拖到画布节点上注入参数,拖到空白处载入工作流", materialCardDragHint: "按住可拖拽至画布节点注入参数,或拖至空白处载入工作流", materialEmptyGuideTitle: "素材库暂无素材", materialEmptyGuideSubtitle: "集中归档带有生成参数的图片与工作流片段,支持画布直接拖拽与参数复用。", materialEmptyStep1Title: "1. 存入素材", materialEmptyStep1Desc: "在「图库」图片详情中点击底部“存入素材库”,或在配方工坊中保存参数。", materialEmptyStep2Title: "2. 画布直接拖拽", materialEmptyStep2Desc: "按住素材卡片拖到画布节点上覆盖参数,拖到空白处直接载入完整工作流。", materialEmptyStep3Title: "3. 提示词工坊拼装", materialEmptyStep3Desc: "在「提示词工坊」中,已存素材中的提示词标签会自动提炼并同步,支持一键拼装。", updateGuideNavigationTitle: "悬停,看懂每个入口", updateGuideNavigationBody: "左下角的按钮保持原来的大小。鼠标悬停或用键盘选中时,图标会切换成文字;稍作停留可以查看完整用途。依次为工具箱、扫描、模型医生、节点助手、素材库和设置。", updateGuideTransferTitle: "导入导出,统一到工具箱", updateGuideTransferBody: "已验证的工作流分享码导入导出中心现在位于工具箱。配方包导入导出、素材库文件导入和工坊文件导出暂不提供。保存到本地库、使用已有素材,以及图片和工作流附带的哈希信息不受影响。", updateGuideLibraryTitle: "素材库词卡,自动来到工坊", updateGuideLibraryBody: "打开提示词工坊后,素材库提示词会自动同步,并标注来源。源素材更新或删除时,词卡会随自动刷新变化。它们由素材库管理,不能在工坊删除;加入拼装台的副本仍可自由编辑。", updateGuideRecipesTitle: "工作流配方工坊:参数预设与模型匹配", updateGuideRecipesBody: "顶栏新增“工作流”工作室,可保存和管理工作流配方。支持参数预设深度拆解与一键复制、缺失模型智能比对与本地直接替换,并支持版本快照回滚。", updateGuideMaterialsTitle: "素材库与提示词工坊:拖拽拼装与节点互译", updateGuideMaterialsBody: "全新素材库支持把素材卡片直接拖拽到 ComfyUI 画布节点注入参数与模型;提示词工坊提供双分栏工作台,左栏素材词卡可拖拽或一键加入右栏拼装台;选中画布节点还可自动吸取词句并实时双语互译与反向写回。", updateGuideSourcesTitle: "模型来源中心:工作流模型一键寻源", updateGuideSourcesBody: "从工具箱打开模型来源中心,自动侦测当前工作流用到的所有模型并匹配 Civitai/HuggingFace 官方页面,支持一键跳转与本地绑定,并可在工作流与全库间自如切换。", updateGuideScanTitle: "单模型精准雷达直扫,一键发布到画布", updateGuideScanBody: "鼠标悬浮模型卡片,点击雷达图标即可原地直接扫描该模型获取信息与底模归类,彻底告别繁琐向导与阻断弹窗;点击加号(+)即可一键创建对应节点发布到画布。", promptFullTextEditHint: '修改全文会将当前方向已启用的词块合并为一个词块。', materialNoPromptContent: '这份素材没有已明确分类的提示词,请先在详情中检查提示词角色。', promptDrawerReplace: '替换这组文字', promptDrawerAppend: '加入这组文字', promptDrawerLoadAll: '载入整套提示词', materialAppliedTarget: '已应用到:{name} · #{id}', materialDropHint: '拖到兼容的节点上,松手应用;Esc 取消', materialDropTarget: '松手应用到:{name}', materialDragParameters: '拖到节点 · 替换参数', promptInsertPosition: '拖入节点时的位置', promptInsert_before: '放在前面', promptInsert_after: '放在后面', promptDragText: '拖到提示词节点', promptChooseTarget: '选择要写入的文本框', materialApplyFailed: '应用失败,节点参数已恢复。', materialUndo: "撤销这次应用", materialUndone: "已撤销", materialUndoChanged: "节点已发生其他变化,请使用 ComfyUI 的撤销操作。", materialTargetChanged: "请重新选中一个节点后再应用。", materialNoCompatibleValues: "这份素材没有可安全应用到该节点的参数。", materialValueUnavailable: "素材中的选项在当前节点不可用。请先检查本地模型或节点版本。", materialApplyingTo: "应用目标:{name} · #{id}", materialSelectedTarget: "已选节点:{name} · #{id}", materialSelectOneNode: "选中画布上的一个节点,即可筛选并应用对应素材。", materialApplyContextHint: "应用模式下点击素材卡片即可写入参数;保留连线、位置和种子。", materialBrowseAll: "浏览全部素材", materialShowCompatible: "查看可用素材", materialInspectOnly: "查看详情", materialApplyCard: "应用到所选节点", materialChooseBlock: "选择要使用的那组参数", materialUseBlock: "选用此组参数", materialUseTextBlock: "选用此段文本", expandText: "展开全部 ▾", collapseText: "收起 ▴", assistantApplyScheme: "⚡ 应用方案", assistantApplying: "⏳ 应用中...", assistantApplied: "✅ 已应用", assistantSchemeDetails: "方案参数详情", assistantSchemeSource: "来源", assistantHoverToInspect: "悬停可预览详细参数", promptCombinations: "提示词搭配", promptPlan: "提示词方案", promptSavedPlans: "已存方案", promptPlanName: "方案名称", promptCompositionHint: "填写提示词,选择放在前面或后面,再拖到提示词节点。保留节点原有文字,不自动运行。", promptDraftHint: "草稿在本次页面中保留;刷新前请保存方案。保存后独立于原始素材。", promptAddPart: "新建片段", promptChooseMaterial: "从素材中选取", promptAddToDraft: "加入提示词搭配", promptPartLimit: "每个方案最多添加 100 个片段。", promptReplaceDraft: "将替换当前搭配草稿。未保存的修改会丢失,是否继续?", promptCurrentContent: "本次内容", promptCurrent_positive: "本次正面词", promptCurrent_negative: "本次负面词", promptFinalPreview: "最终提示词", promptFinal_positive: "正面提示词", promptFinal_negative: "负面提示词", promptCopy_positive: "复制正面词", promptCopy_negative: "复制负面词", promptSelectTextNode: "选中一个提示词节点,可将最终提示词写入;也可以直接复制。", promptTargetWidget: "目标文本框", promptTargetRole: "要写入的提示词", promptAppend: "追加到节点", promptReplace: "替换节点文本", promptSavePlan: "保存组合", promptNewDraft: "新建", promptAddToPlan: "加入组合", promptReadSelectedNode: "读取选中节点", promptSortByCategory: "按分类排序", promptCardRole: "角色", promptRolePositive: "✨ 正向提示词", promptRoleNegative: "🚫 负向提示词", promptCardUnsaved: "未保存", promptSaveCard: "存入库", promptSaveCardSuccess: "词卡已保存至素材库!", promptSaveCardFailed: "词卡保存失败,请重试。", promptImportFromMaterials: "从素材库导入", promptImportOverwrite: "覆盖", promptImportAppend: "追加", promptImportOverwritePrompt: "覆盖当前", promptImportAppendPrompt: "追加到当前", promptPositiveNote: "正向提示词便签", promptNegativeNote: "负向提示词便签", promptWordCount: "{count} 字符", promptDragNoteHint: "按住卡头或便签,直接拖拽至画布节点", promptDrawerTitle: "素材库提示词速选", promptDrawerSearchPlaceholder: "搜索素材名称、标签或节点类型...", promptDrawerEmpty: "未在素材库中找到可用的提示词素材", promptClearText: "清空便签", promptClearConfirm: "确定要清空该便签的内容吗?", materialViewGrid: "网格视图", materialViewList: "列表视图", materialPromptStudio: "提示词工坊", materialCollapseStudio: "收起工坊", materialSendToStudio: "加入工坊便签", materialKindPill_all: "全部", materialKindPill_workflow: "工作流", materialKindPill_params: "参数方案", materialKindPill_prompts: "提示词", recipeScopePill_all: "全部", recipeScopePill_complete: "完整工作流", recipeScopePill_partial: "局部子图", recipeViewGrid: "网格视图", recipeViewList: "列表视图", recipeDragHint: "按住拖拽至画布打开新工作流", recipeDragTargetCanvas: "释放以在画布打开新工作流", recipeStatusReady: "模型全部就绪", recipeStatusUnverified: "模型待校验", recipeStatusMissing: "模型缺失", recipeReadinessHint: "检测工作流所需模型在本地环境中的就绪状态,点击卡片进入详情可进行智能比对与替换", promptEnablePart: "启用这个片段", promptUnnamedPart: "未命名片段", promptPartCategory: "片段用途", promptCategory_general: "通用", promptCategory_specific: "专用", promptPartName: "片段名称,例如默认质量词、模型风格", promptMoveUp: "上移", promptMoveDown: "下移", promptRemovePart: "移除片段", close: '关闭', copy: '复制', materialDismissReceipt: "关闭保存提示", materialNoteCopyName: "{name} · 素材副本", materialSavePromptAction: "保存提示词", materialSavedToLibrary: "已保存到素材库", materialViewSaved: "查看素材", materialPromptNoteBundle: "提示词笔记", materialPromptTextKind: "提示词片段", materialSaveNoteBundle: "保存整份笔记", materialSavePromptText: "仅保存提示词", materialNoteScopeHint: "整份笔记包含提示词、翻译和配套模型;仅提示词不包含模型。", materialRestoreNote: "载入为新笔记", materialRestoreNoteHint: "创建一份可编辑的新笔记,保留这份素材。配套模型可在笔记中调整。", materialSaveGeneration: "保存这组生成参数", materialSaveGenerationAction: "存入素材库", materialGenerationScope: "保存采样与尺寸节点的整组参数,可在节点助手中使用。", materialCopySuccess: "已复制", materialCopyFailed: "复制失败", materialClickToCopy: "点击复制数值", materialOtherNodeTypes: "另 {count} 类", materialQuickEditTitle: "修改短标题", materialTitleSaved: "标题已保存", materialChooseParameters: "选择部分参数", materialFinishSelection: "完成选择", promptAdjustRole: "调整用途", notebookCompanionModels: "配套模型", notebookMore: "更多", notebookDoneEditing: "📑 查看双语分词", editRaw: "✏️ 编辑原始文本", saveNotebook: "保存笔记", deleteNotebook: "删除笔记", delSure: "确认删除?", sendToCanvas: "发送到画布", createNotebook: "新建笔记", newNotebookName: "新笔记名称...", recipeSearchAndReplace: "词条替换与目标语言", findPlaceholder: "查找...", replacePlaceholder: "替换为...", replaceAll: "全部替换", recipeDiffNone: "未选择", loras: "LoRA 模型", baseModel: "底模", mainModel: "主模型", nbNavHeading: "快速直达", nbNotesHeading: "我的笔记", nbNavModels: "配套模型", nbNavPrompt: "提示词编辑", nbNavTools: "查找替换", nbNavArchive: "素材归档", notebookPromptTitle: "提示词", materialSearchHint: "搜索名称、标签或节点类型", materialTags: "标签", materialTagsHint: "标签,用逗号分隔(最多 20 个)", materialFilterKind: "素材类型", materialAllKinds: "全部类型", materialAllTags: "全部标签", materialNoMatches: "没有匹配的素材,试试其他关键词或筛选条件。", materialPageSummary: "第 {page} / {pages} 页 · 共 {count} 份素材", materialPrevious: "上一页", materialNext: "下一页", materialPagination: "素材分页", materialEditDetails: "编辑名称和标签", materialSaveDetails: "保存修改", materialUpdateError: "修改未保存,请检查名称和标签后重试。", 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: '展开全部', noModels: '此文件夹中没有找到模型。', noPreview: '暂无预览图', clickScan: '点击扫描', back: '⬅️ 返回', delModel: '删除', delConfirm: '确定彻底删除', delConfirm2: '及其所有关联配置、预览图和缓存文件吗?此操作不可逆!', delSuccess: '✅ 删除成功!\n', delNote: '\n\n⚠️ 提示:请重启 ComfyUI,否则由于缓存继续使用会报错', delFail: '❌ 删除失败: ', copyAll: '📋 复制全部', copied: '✅ 已复制!', clickToCopy: '点击复制: ', compatibleModels: '🔗 兼容模型', refresh: '刷新', loading: '加载中…', loadingCompatible: '加载中...', backToPrev: '🔙 返回上一层', applyToCanvas: '插入节点', applySuccess: '✅ 已添加至工作流', help: '帮助', helpTitle: '📖 使用手册', helpContent: `
workflows/anomalous_recipes 与 workflows/anomalous_parameters 文件夹。模型预览快照不包含模型文件,不能代替模型备份。1. 🔄 前置准备 (扫描向导)
具体位置:界面左侧底部的 扫描向导 (🔄)。
这是最重要的前置操作!请先打开扫描向导执行扫描。切记保持网络畅通。部分 C站限制级模型信息需要在设置中填入 API-KEY。扫描完成后,插件的各项功能基本激活。
2. 🩺 拯救爆红 (模型医生)
具体位置:左侧底部第二个 听诊器 (🩺) 按钮。
当导入别人使用该插件输出的工作流或者图片时,若模型路径爆红,点击模型医生就能智能识别当前所有节点实现正确路径的替换。
3. 🤖 选中交互与参数预设 (节点助手)
具体位置:左侧第三个 机器人 (🤖) 按钮。
在画布上选中节点后,“动作”页可以可视化替换模型,或在兼容的 MODEL + CLIP 链前后插入 LoRA。“参数方案”页会按配方分组读取工作流配方保存的同类型节点参数;点击一条记录即可把参数应用到当前选中节点。例如选中 KSampler 后,可一键载入配方中的采样器、调度器、步数、CFG 与降噪等值;种子等每次运行变化的参数会被忽略。
4. 工作流配方、参数方案与素材库
具体位置:打开 创作工作台。
配方会保存工作流、封面、标签、备注、模型引用及常用参数。未闭合的局部配方默认追加到当前画布,可独立运行的整体配方会在新画布打开;配方包导入和导出暂未开放。详情页包含概览、参数方案、图库和版本:可匹配本地模型、查看与复制完整参数、比较历史出图参数、比较或恢复配方版本。主图库或配方图库的图片悬浮后可进入参数详情,把原图、完整工作流和节点参数保存为一个素材快照;素材库可打开完整工作流,节点助手则按当前节点类型筛选并应用其中的参数。参数方案可从当前画布读取同一骨架的新参数,也可编辑安全控件并保存;“应用到当前工作流”只会在骨架匹配后写入参数。
5. 个性化配置 (设置面板)
具体位置:左侧底部的 齿轮 () 按钮。
可以调节语言、主页面字体大小;进入“模型设置”可选择视频封面始终播放或悬停播放,以及卡片使用流畅缩略图或原始封面。详情页始终保留原图画质。
6. 📑 顶部导航与提示词笔记
具体位置:右侧顶部的按钮分别为 模型 ()、图库 ()、创作工作台 (📑)、停靠侧边栏 (◧)。
进入创作工作台的“提示词笔记”,点击新建 。选择基础模型、主模型和 LoRA 后,可通过 📝纯文本/粘贴 填入提示词并进行双语对照、分块、查找替换和标签编辑,最后点击 发送到画布 一键组装节点。
7. 文件夹管理 (Folder Manager)
具体位置:设置 () 面板内的 文件夹管理。
可以用来隐藏不需要的内置文件夹。隐藏后的文件夹不仅从侧边栏消失,后端的静默扫描和本地读取也会完全跳过,实现真正的“零性能损耗”。并且可以在这里拖拽调整文件夹在侧边栏显示的顺序。
8. 工作流导入导出 (分享码)
打开实用工具箱 → 导入导出,通过已有的 AMB0/AMB1 分享码导入或导出工作流。素材库的文件导入入口已关闭;图片和工作流附带的哈希信息保持现状。
9. 💬 提交反馈 / 报告问题
具体位置:设置 () 面板内的 💬 提交反馈 / 报告问题。
当你遇到插件报错或有新功能建议时,点击该按钮可一键直达 GitHub Issues 页面提交反馈。
.safetensors 及其所有附属文件名,彻底告别乱码文件名。',
sidebarPhysicalRenameProtectedNotice: '基础组件保护已启用:VAE、VAE Approx、CLIP/Text Encoder 与 CLIP Vision 仍会扫描元数据,但不会修改物理文件名。',
sidebarStep3: 'Step 3. 工作流保障与修复',
sidebarProvenance: '模型溯源绑定',
sidebarProvenanceDesc: '全局生效。每次生成图片或保存工作流时,将模型的精确哈希值隐式写入到图像元数据与工作流 JSON 中,防止未来模型改名或换环境后报错找不到。',
sidebarOverwrite: '强制覆盖已有配置',
sidebarOverwriteDesc: '扫描时忽略本地已存在的 .info 文件,强制重新计算哈希并覆盖下载。用于修复匹配错乱的模型。',
sidebarSmartFix: '智能修复当前工作流',
sidebarSmartFixDesc: '扫描完成后,自动尝试用最新数据修复当前画布中提示缺失的报错模型节点。',
sidebarNoModelsSelected: '未选择任何模型',
sidebarScanFailed: '扫描失败: ',
sidebarCancel: '取消',
sidebarExecute: '执行扫描',
sidebarSwitchToEnglish: '🌐 Language: EN',
sidebarSwitchToChinese: '🌐 语言: 中文',
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: 'UI 缩放',
sidebarViewMode: '展示模式',
sidebarViewModeCompact: '紧凑模式',
sidebarViewModeStandard: '标准模式',
sidebarViewModeAesthetic: '沉浸模式',
sidebarBgAtmosphere: '背景氛围',
sidebarBgAtmosphereHelp: '调节底图星图蓝图的可见度(0%为纯净黑曜石)',
sidebarResetLayout: '↺ 恢复默认窗口布局',
sidebarResetConfirm: '确认重置窗口位置、缩放和停靠状态吗?',
sidebarToolbox: '实用工具箱',
toolboxTitle: '实用工具箱',
promptLibraryAutoSync: "素材库词卡自动同步",
promptLibrarySyncFailed: "素材库同步失败,已保留现有词卡,将自动重试",
promptLibraryBadge: "🔒 来自素材库",
promptLibrarySource: "来自素材库:{name}({filename})",
promptLibraryReadOnly: "由源素材管理,不能在工坊删除;拼装台中的副本可自由编辑。",
toolWorkflowTransferShort: "导入导出",
toolWorkflowTransferTitle: "工作流导入导出中心",
toolWorkflowTransferDesc: "使用已验证的 AMB0/AMB1 分享码导入或导出工作流。",
toolboxSubtitle: '模型维护与拓展辅助工具',
toolboxPlanned: '规划中',
toolboxReady: '就绪',
toolboxHintFooter: '💡 持续扩展中:模型批量重整、孤立缓存清理、哈希重算等运维工具将在此聚合。',
toolPromptStudioTitle: '提示词工坊',
toolPromptStudioShort: '提示词工坊',
toolPromptStudioDesc: '可视化提示词调配工坊,支持结构化混音调配与画布节点应用。',
toolPromptTranslatorTitle: '提示词翻译助手',
toolPromptTranslatorShort: '翻译助手',
toolPromptTranslatorDesc: '多语言智能翻译、标签化拆分、一键写回当前画布节点。',
toolOrphanCleanerTitle: '孤立缓存与临时文件清理',
toolOrphanCleanerShort: '缓存清理',
toolOrphanCleanerDesc: '扫描并清理已删除模型的未引用缩略图缓存与临时残余文件。',
toolBatchRenameTitle: '批量命名与标签重整',
toolBatchRenameShort: '批量重整',
toolBatchRenameDesc: '对指定目录下的模型批量规范命名规则或批量附加分类标签。',
toolCivitaiJumpTitle: 'Civitai 页面一键直达',
toolCivitaiJumpShort: 'Civitai',
toolCivitaiJumpDesc: '根据模型 SHA256 哈希或名称直接在浏览器打开对应发布页。',
toolModelSourcesTitle: '模型来源与发布页中控',
toolModelSourcesShort: '模型来源',
toolModelSourcesDesc: '统一查看和编辑画布或本地模型的来源链接,支持一键识别、网页直达、工作流同步与画布便签生成。',
toolPromptNotesTitle: '提示词笔记',
toolPromptNotesShort: '提示词笔记',
toolPromptNotesDesc: '管理和归纳分段提示词、模型绑定与节点组装。',
modelSourcesModalTitle: '🌐 模型来源统一中控中心',
modelSourcesScopeWorkflow: '当前工作流',
modelSourcesScopeLibrary: '全部本地模型库',
modelSourcesFilterAll: '全部',
modelSourcesFilterResolved: '已填写来源',
modelSourcesFilterUnresolved: '来源待补充',
modelSourcesSearchPlaceholder: '搜索模型名称 / 节点...',
modelSourcesAutoFetchAll: '⚡ 一键获取全部来源',
modelSourcesGenerateNoteNode: '📝 在画布生成来源便签',
modelSourcesSaveToWorkflow: '💾 保存至工作流',
modelSourcesSyncToWorkflow: '🔄 同步工作流来源',
modelSourcesCopySummary: '📋 复制当前可见范围',
modelSourcesCopied: '✓ 已复制模型清单到剪贴板!',
modelSourcesSavedToWorkflow: '✓ 已将模型来源保存至工作流!',
modelSourcesSyncedToWorkflow: '✓ 已同步更新工作流中的模型来源!',
modelSourcesNoteCreated: '✓ 已在画布生成【模型来源便签】节点!',
modelSourcesJump: '↗️ 直达',
modelSourcesAutoDetect: '⚡ 识别',
modelSourcesSaveLocal: '💾 记住到本地',
modelSourcesSavedLocal: '✓ 已将来源链接保存至本地模型信息!',
modelSourcesStatusMissingOnDisk: '本地未安装',
modelSourcesStatusReady: '本地就绪',
modelSourcesStatusUnfilled: '来源待补充',
modelSourcesStatusUnfilledOptional: '未填写(可选)',
modelSourcesComponentsAdvanced: '基础组件(高级) · {count}',
modelSourcesComponentsOptionalHint: '来源可选,不计入待补',
modelSourcesComponentsMissing: '缺少本地文件 × {count}',
modelSourcesComponentsNoSearchMatch: '当前搜索没有匹配的基础组件',
modelSourcesMainStats: '主要模型来源:已填写',
modelSourcesLibraryRangeHint: '本地库范围跟随设置 → 文件夹管理',
modelSourcesLibraryLoading: '正在盘点当前文件夹管理范围…',
modelSourcesLibraryLoadFailed: '本地模型库加载失败,请重试。',
modelSourcesRetry: '重试',
modelSourcesTypeTextEncoder: '文本编码器',
modelSourcesTypeVae: 'VAE',
modelSourcesTypeVaeApprox: '预览 VAE',
modelSourcesTypeVisionEncoder: '视觉编码器',
modelSourcesLocalTargetUnknown: '尚未确定本地文件位置,可先将链接保存到工作流。',
modelSourcesNoModelsFound: '未检测到任何模型',
modelSourcesUrlPlaceholder: '输入或粘贴来源链接 (Civitai / Hugging Face / Liblib / 网盘 等)...',
toolHashRecalcTitle: '哈希快查',
toolHashRecalcShort: '哈希快查',
toolHashRecalcDesc: '快速计算并校验模型文件的 SHA256 哈希值。',
toolFormatConvertTitle: '格式转换',
toolFormatConvertShort: '格式转换',
toolFormatConvertDesc: '模型权重的 FP8/FP16 精度或格式互转辅助工具。',
toolCustomScriptsTitle: '扩展脚本',
toolCustomScriptsShort: '扩展脚本',
toolCustomScriptsDesc: '通过开放接口注册并执行自定义 Python / JS 运维动作。',
sidebarInjectHash: '🟢 注入工作流哈希',
sidebarSkipHash: '⚪ 不注入工作流哈希',
sidebarManageFolders: '文件夹管理',
sidebarFeedback: '💬 提交反馈 / 报告问题',
sidebarModelSettings: '模型设置',
sidebarModelCardSettings: '模型卡片设置',
sidebarModelCardDescription: '只调整模型浏览器里的卡片显示,不会修改模型文件或原始封面。',
sidebarVideoPlayback: '视频封面播放',
sidebarVideoHelp: '始终播放更有动感;悬停播放更省显存与电量。',
sidebarAlwaysPlay: '始终播放',
sidebarHoverPlay: '悬停播放(推荐)',
sidebarCardQuality: '卡片图片清晰度',
sidebarCardQualityHelp: '流畅缩略图只用于卡片;打开详情仍显示原始封面。',
sidebarOptimizedThumbnail: '流畅缩略图(推荐)',
sidebarOriginalCover: '原始封面(更占资源)',
sidebarModelSettingsNote: '缩略图由插件自动缓存和回收;视频离开视野或关闭浏览器后会自动释放。',
sidebarDone: '完成',
sidebarModuleNotLoaded: '模块尚未加载,请稍等或刷新页面!',
sidebarExpandAll: '展开全部',
sidebarCollapseAll: '收起全部',
sidebarSearchModels: '搜索模型...',
sidebarFolderManagerTitle: '侧边栏文件夹管理',
sidebarFolderManagerDesc: '上下拖拽调整侧边栏的显示顺序。点击眼睛图标可隐藏不需要显示的底层文件夹。隐藏的文件夹不会被扫描,完全不占用性能。',
sidebarCategoryMode: '分类模式 (ComfyUI)',
sidebarPhysicalMode: '物理模式 (本地文件夹)',
sidebarFolderLoadFailed: '加载文件夹类型失败。',
sidebarFolderModeError: '切换模式失败',
sidebarVisible: '可见',
sidebarHidden: '隐藏',
sidebarSaveReload: '保存并刷新',
sidebarSaveConfigError: '保存配置失败: ',
hashResolverFixed: '🪄 Anomalous 成功修复了 {count} 个缺失的模型!\n\n💡 提示:ComfyUI V1 对报错的缓存极深。请务必手动点击侧边栏【工作流总览】中的【刷新】按钮,或者直接按 F5 刷新浏览器,否则切换工作流时节点可能会再次变红。',
closeHelp: '关闭说明',
delSure: '确认删除?',
dockTitle: '侧边停靠',
replaceAll: '全部替换',
editRaw: '编辑全文',
findPlaceholder: '查找...',
replacePlaceholder: '替换为...',
models: '模型',
gallery: '图库',
apiKeyConfig: '🔑 Civitai API 密钥配置 (用于下载封面)',
apiKeyPrompt: '请输入你的 Civitai API Key:',
settingsBtn: '设置',
closeSettings: '✖ 关闭设置面板',
doctorBtn: '节点助手',
importBtn: '导入工作流 (分享码)',
recipeTitle: '工作流',
recipeBetaNotice: '工作流配方仍在测试。更新插件以及导入、恢复、删除或应用参数前,请保存当前画布并备份用户 workflows 目录中的 anomalous_recipes 与 anomalous_parameters。',
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: '导入配方包',
recipeImportUnavailable: '配方包导入暂未开放',
recipeExport: '导出配方包',
recipeExportUnavailable: '配方包导出暂未开放',
recipeModel: '模型',
recipeLoras: 'LoRA',
recipePrompt: '正向提示词',
recipeSteps: '步数',
recipeRestore: '恢复版本',
recipeAppendCanvas: '追加到画布',
recipeAppendError: '无法追加此配方到当前画布。',
recipeOpenCanvas: '新画布打开',
recipeOpenError: '无法在新画布中打开此配方。',
recipeDragHint: '按住拖拽至画布打开工作流',
recipeDragTargetCanvas: '释放以在画布打开工作流',
recipeCardDragHint: '按住卡片可拖拽至画布打开工作流',
recipeDraggableBadge: '可拖拽',
recipeCardPrimaryActionTooltipComplete: '在新画布中打开工作流(也可直接按住卡片拖至画布)',
recipeCardPrimaryActionTooltipPartial: '追加模块至当前画布(也可直接按住卡片拖至画布)',
recipeDragGlobalHint: '提示:按住卡片直接拖拽到 ComfyUI 画布空白处释放,即可立即载入工作流',
recipeEmptyGuideTitle: '工作流配方工坊暂无配方',
recipeEmptyGuideSubtitle: '保存、管理与复用 ComfyUI 完整或局部工作流,支持画布直接拖拽载入与模型自愈。',
recipeEmptyStep1Title: '1. 保存当前工作流',
recipeEmptyStep1Desc: '点击右上角“保存当前工作流”按钮,即可将当前画布节点网络与参数保存为配方。',
recipeEmptyStep2Title: '2. 画布直接拖拽',
recipeEmptyStep2Desc: '按住配方卡片直接拖拽到 ComfyUI 画布空白处释放,瞬间载入整套工作流,无需重新接线。',
recipeEmptyStep3Title: '3. 缺失模型自愈',
recipeEmptyStep3Desc: '若配方中的模型在本地缺失,点击卡片进入详情可智能比对并一键替换为同类可用模型。',
recipeEmptySaveCurrentBtn: '保存当前工作流',
recipeScope: '配方类型',
recipeScopePartial: '功能模块',
recipeScopeComplete: '完整工作流',
recipeScopePartialSaveHint: '检测到未闭合的节点链,将保存为可追加到当前画布的功能模块。',
recipeScopeCompleteSaveHint: '检测到完整可独立运行的工作流,将保存为完整工作流;支持在新画布中独立打开。',
recipeDelete: '删除',
recipeDeleteConfirm: '确定删除这个工作流配方吗?',
recipeDeleteError: '删除工作流配方失败。',
recipeSaveError: '保存工作流配方失败。',
recipeNodeParams: '节点参数',
recipeUnknownNode: '未知节点',
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: '版本',
recipeDetailSummary: '摘要',
recipeDetailModelComposition: '模型组成',
recipeDetailBaseModel: '主模型',
recipeDetailIdentity: '已验证身份',
recipeDetailUnverified: '未验证模型',
recipeDetailMissingNodes: '缺失节点类型',
recipeDetailFingerprint: '工作流指纹',
recipeDetailNotIndexed: '尚未索引',
recipeDetailLoraSummary: 'LoRA',
recipeDetailSampler: '采样器',
recipeDetailResolution: '分辨率',
recipeDetailUnavailable: '不可用',
recipeDetailEditOrigin: '编辑来源',
recipeOriginDialogTitle: '编辑模型来源信息',
recipeOriginOfficialName: '官方模型名称',
recipeOriginModelUrl: '官方网址 (Model URL)',
recipeOriginFetchHash: '🌍 通过 Hash 自动获取',
recipeOriginFetching: '获取中...',
recipeOriginFetchFailed: '未找到或网络异常',
recipeOriginFetchSuccess: '已成功获取!',
recipeDetailNoNotes: '没有备注。',
recipeDetailUpdated: '更新时间',
recipeDetailCopyPrompt: '复制提示词',
recipeDetailCopyFingerprint: '复制工作流指纹',
recipeDetailCopyHash: '复制完整哈希',
recipeDetailPrompts: '提示词',
recipeDetailPositivePrompt: '正向提示词',
recipeDetailNegativePrompt: '负面提示词',
recipeDetailNoPrompts: '此配方没有可安全展示的提示词摘要。',
recipePromptSupportNotice: '当前仅自动识别 ComfyUI 原生 CLIPTextEncode 与已知官方连接;第三方文本节点请手动标注。',
recipePromptRoleChoose: '选择提示词角色',
recipePromptRoleAutomatic: '自动识别',
recipePromptRoleManual: '用户手动标注',
recipePromptRolePositive: '正面提示词',
recipePromptRoleNegative: '负面提示词',
recipePromptRoleBoth: '正负共用',
recipePromptRoleIgnored: '忽略',
recipePromptRoleUnknown: '角色未确定',
recipePromptRoleSaveError: '无法保存提示词角色,请稍后重试。',
recipeDetailVolatileIgnored: '运行时变化,已忽略',
recipeDetailExpandValue: '展开完整内容',
recipeDetailCollapseValue: '收起内容',
recipeIdentityVerified: '身份已核验',
recipeIdentityUnverified: '本地可用,未核验',
recipeIdentityUnavailable: '本机未找到',
recipeIdentityHelpDesc: '核验的是物理文件是否一致,不代表判断模型画质或可用性。',
recipeDetailRefreshAvailability: '检查本机可用性',
recipeDetailRefreshOrigin: '刷新来源信息',
recipeDetailRefreshOriginDesc: '刷新当前配方中的所有模型来源信息(支持补充旧配方数据)',
recipeDetailRefreshing: '检查中…',
recipeDetailRefreshError: '检查本机可用性失败',
recipeDetailAvailable: '本机可用',
recipeDetailMissing: '本机缺失',
recipeDetailAvailabilityNotChecked: '尚未检查本机',
recipeDetailNoModelReferences: '没有识别到受支持的模型加载器。其他自定义控件保留在参数和完整工作流中。',
recipeDetailModel: '模型',
recipeModelPath: '模型路径',
recipeOpenLocalModel: '打开本地模型详情',
recipeMatchLocalModel: '匹配本地模型',
recipeMatchingLocalModel: '正在匹配本地模型…',
recipeMatchRecipeModels: '匹配配方模型',
recipeMatchRecipeModelsDesc: '根据模型哈希、文件大小和模型类别,在本地模型目录中查找对应文件;不会使用原作者路径。',
recipeMatchingRecipeModels: '正在匹配配方模型…',
recipeRecipeMatchSummary: '已找到 {found}/{total} 个本地匹配',
recipeAllModelsMatched: '配方中的模型都已匹配或无需匹配',
recipeApplyLocalMatch: '应用此匹配',
recipeConfirmSizeCandidate: '确认使用同大小候选',
recipeApplyLocalMatchDesc: '将匹配到的本地模型路径写入配方工作流',
recipeApplyingLocalMatch: '正在应用匹配…',
recipeApplyLocalMatchSuccess: '已应用本地模型匹配',
recipeApplyLocalMatchError: '无法应用此模型匹配',
recipeModelNoteAdd: '添加模型备注',
recipeModelNoteEdit: '编辑模型备注',
recipeModelNoteEmpty: '暂无个人模型备注',
recipeModelNoteTitle: '模型个人备注',
recipeModelNotePrompt: '记录这个模型在当前配方中的用法、建议权重或注意事项。留空保存即可删除备注。',
recipeModelNoteError: '无法保存模型备注。',
recipeLocalModelNotFound: '暂未找到匹配的本地模型。',
recipeLocalModelIdentityConflict: '模型大小与哈希身份冲突,已拒绝匹配。',
recipeLocalModelAmbiguous: '找到多个候选,请先补充模型身份信息。',
recipeLocalModelMatchError: '匹配失败,请稍后重试。',
recipeDetailSearchParameters: '按节点、类型或控件名称搜索…',
recipeDetailNoParameters: '没有匹配的安全参数。',
recipeDetailCurrentVersion: '当前版本',
recipeCompareVersion: '对比此版本',
recipeDiffLoading: '正在比较…',
recipeDiffSummary: '变更摘要',
recipeDiffBefore: '之前',
recipeDiffAfter: '之后',
recipeDiffNoChanges: '两个版本没有检测到有意义的变更。',
recipeDiffError: '无法读取此历史版本。',
recipeDiffPinned: '钉选参数',
recipeDiffPrompts: '提示词',
recipeDiffModels: '模型引用',
recipeDiffParameters: '参数摘要',
recipeDiffWorkflow: '工作流结构',
recipeDiffPresentation: '展示信息',
recipeDiffOther: '其他',
recipeDetailUnknownTime: '未知时间',
recipeDetailLoadingPreviews: '正在加载本机模型预览…',
recipeDetailCurrentPreview: '当前本机预览',
recipeDetailNoPreview: '暂无预览',
recipeDetailSavedSnapshot: '已保存快照',
recipeParameterNotebooks: '参数方案',
recipeParameterRename: '重命名',
recipeParameterRenamePrompt: '请输入参数方案的新名称:',
recipeParameterRenameError: '重命名参数方案失败',
assistantTabActions: '动作',
assistantTabPresets: '参数方案',
assistantRecipeGroup: '配方',
assistantDeletedRecipe: '已删除配方',
assistantUnboundRecipe: '全局无绑定',
assistantNotebook: '笔记本',
assistantApplyTo: '应用到',
assistantNoPresets: '该节点类型暂无参数预设。',
recipeStatusReady: '🟢 全部模型就绪',
recipeStatusNeedAttention: '🟡 发现可用匹配 ({count})',
recipeStatusMissing: '🔴 缺少模型 ({count})',
recipeStatusChecking: '⏳ 检查环境中…',
recipeQuickSpecs: '核心规格',
recipeApplyAllMatches: '一键应用全部匹配',
recipeApplyingAllMatches: '正在应用全部匹配…',
recipeApplyAllMatchesSuccess: '✅ 已成功应用全部匹配!',
recipeRawNodesToggle: '节点参数',
recipeRawNodesCount: '个节点',
recipeRawNodesShowMore: '展开其余 {count} 个节点…',
recipeRawNodesLoadedCount: '已显示 {shown} / {total} 个节点',
recipeCardSpecsCheckpoint: '大模型',
recipeCardSpecsLoras: 'LoRA',
recipeCardSpecsSteps: '步数',
recipeCardSpecsSampler: '采样',
recipeCardSpecsResolution: '尺寸',
},
en: {
actionTools: "Tools",
actionScan: "Scan",
actionDoctor: "Fix",
actionAssistant: "Node",
actionMaterials: "Lib",
actionSettings: "Prefs",
actionToolsHint: "Open prompt tools, model sources and workflow import/export",
actionScanHint: "Scan local models for metadata and previews",
actionDoctorHint: "Find missing workflow models and repair their paths",
actionAssistantHint: "Work with the selected node and apply models or parameter sets",
actionMaterialsHint: "Browse and use saved prompts, parameters and workflow materials",
actionSettingsHint: "Adjust language, appearance and plugin preferences",
updateGuideTitle: "What's new",
updateGuideReplay: "View update guide",
updateGuideSkip: "Skip",
updateGuideBack: "Back",
updateGuideNext: "Next",
updateGuideDone: "Got it",
updateGuideProgress: "Step {current} of {total}",
updateGuideNoticeLabel: "Guide",
updateGuideNoticeTooltip: "View update guide",
shortcutBarPinned: "Pinned",
shortcutBarPin: "Pin to shortcuts",
shortcutBarUnpin: "Remove from shortcuts",
shortcutBarMoveLeft: "Move left",
shortcutBarMoveRight: "Move right",
shortcutBarCapacityFull: "Shortcut bar is full. Move a tool back to Toolbox first",
shortcutBarReset: "Reset shortcut bar",
shortcutBarResetConfirm: "Reset the shortcut bar to default layout?",
shortcutDropHint: "Drag down to pin shortcuts; drag back here to unpin",
shortcutDropRelease: "Release to remove from shortcuts",
shortcutBarAnchorTip: "Fixed anchor, cannot be moved",
updateGuideStartTour: "🎯 Spotlight Tour",
updateGuideTourBanner: "💡 Prefer to see them in action? Start Spotlight Tour ›",
materialDragGlobalHint: "💡 Tip: Drag cards onto canvas nodes to inject values, or onto empty canvas to load the workflow",
materialCardDragHint: "Hold and drag onto canvas nodes to inject values, or drop on empty canvas to load workflow",
materialEmptyGuideTitle: "Material Library is Empty",
materialEmptyGuideSubtitle: "Curate image snapshots and workflow snippets with direct canvas drag and parameter reuse.",
materialEmptyStep1Title: "1. Collect Materials",
materialEmptyStep1Desc: "Open image details in Gallery and click 'Save to Materials', or save parameter presets in Recipe Studio.",
materialEmptyStep2Title: "2. Direct Canvas Drag",
materialEmptyStep2Desc: "Drag cards onto canvas nodes to overwrite parameters, or drop onto empty canvas to load the full workflow.",
materialEmptyStep3Title: "3. Prompt Studio Mixer",
materialEmptyStep3Desc: "Prompt tags from saved materials automatically sync to the Prompt Studio workbench for one-click assembly.",
updateGuideNavigationTitle: "Hover to identify each action",
updateGuideNavigationBody: "The lower-left buttons keep their compact size. Hover or focus with the keyboard to replace an icon with a short label; pause for its full description. The actions are Toolbox, Scan, Model Doctor, Node Assistant, Material Library and Settings.",
updateGuideTransferTitle: "Workflow sharing lives in Toolbox",
updateGuideTransferBody: "The verified workflow share-code Import / Export Center now lives in Toolbox. Recipe package transfers, library file import and studio file export are unavailable. Local saves, existing materials and image/workflow hash metadata are unaffected.",
updateGuideLibraryTitle: "Library prompts sync automatically",
updateGuideLibraryBody: "Open Prompt Studio to sync Material Library prompts automatically, with their source shown. Source edits and deletions appear on refresh. These cards are managed in the library and cannot be deleted in the studio; copies in the mixer remain editable.",
updateGuideRecipesTitle: "Workflow Recipe Studio: Presets & Model Matching",
updateGuideRecipesBody: "Access the new Workflow Studio from the top bar to manage recipes. Inspect deep node parameters in Bento cards with one-click copy, resolve missing models with local replacements, and restore historical snapshots.",
updateGuideMaterialsTitle: "Material Library & Prompt Studio: Drag Assembly & Node Sync",
updateGuideMaterialsBody: "Drag material cards directly onto ComfyUI canvas nodes to inject parameters and models. Prompt Studio offers a dual-column workbench to drag-assemble cards into mixer chains, plus automatic text extraction and real-time translation for selected canvas nodes.",
updateGuideSourcesTitle: "Model Sources Hub: Attribution & Scope",
updateGuideSourcesBody: "Launch the Sources Hub from Toolbox to detect active workflow models and match their official Civitai/HuggingFace links with local sidecar binding, plus seamless switching between workflow and library views.",
updateGuideScanTitle: "Direct Precision Scan & Instant Canvas Addition",
updateGuideScanBody: "Hover over any model card and click the radar icon to scan it immediately with factual base-model feedback—no wizard modals or blocking alerts. Click the plus icon (+) to add it to the canvas instantly.",
promptFullTextEditHint: 'Editing the full text merges the enabled blocks in this direction into one block.',
materialNoPromptContent: 'This material has no classified prompts. Check its prompt roles in details first.',
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}',
materialDragParameters: 'Drag to node · Replace parameters',
promptInsertPosition: 'Position when dropped onto a node',
promptInsert_before: 'Add to beginning',
promptInsert_after: 'Add to end',
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: "This material has no safe parameters for this node.",
materialValueUnavailable: "A saved option is unavailable on this node. Check local models or the node version first.",
materialApplyingTo: "Apply to: {name} · #{id}",
materialSelectedTarget: "Selected node: {name} · #{id}",
materialSelectOneNode: "Select one canvas node to find and apply matching materials.",
materialApplyContextHint: "In apply mode, click a material card to set parameters. Links, position and seed stay intact.",
materialBrowseAll: "Browse all materials",
materialShowCompatible: "Show matching materials",
materialInspectOnly: "View details",
materialApplyCard: "Apply to selected node",
materialChooseBlock: "Choose the parameter block to use",
materialUseBlock: "Use Parameters",
materialUseTextBlock: "Use This Text",
expandText: "Expand All ▾",
collapseText: "Collapse ▴",
assistantApplyScheme: "⚡ Apply Scheme",
assistantApplying: "⏳ Applying...",
assistantApplied: "✅ Applied",
assistantSchemeDetails: "Scheme Details",
assistantSchemeSource: "Source",
assistantHoverToInspect: "Hover to preview full parameters",
promptCombinations: "Prompt Combinations",
promptPlan: "Prompt Plan",
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.",
promptDraftHint: "The draft lasts for this page session. Save before reloading. Saved plans are independent of their source materials.",
promptAddPart: "New fragment",
promptChooseMaterial: "Choose from materials",
promptAddToDraft: "Add to prompt combination",
promptPartLimit: "A plan supports up to 100 fragments.",
promptReplaceDraft: "Replace the current combination draft? Unsaved changes will be lost.",
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",
promptSavePlan: "Save Plan",
promptNewDraft: "New",
promptAddToPlan: "Add to Plan",
promptReadSelectedNode: "Read Selected Node",
promptSortByCategory: "Sort by Category",
promptCardRole: "Role",
promptRolePositive: "✨ Positive",
promptRoleNegative: "🚫 Negative",
promptCardUnsaved: "Unsaved",
promptSaveCard: "Save Card",
promptSaveCardSuccess: "Prompt card saved to library!",
promptSaveCardFailed: "Failed to save prompt card. Please retry.",
promptImportFromMaterials: "Import from Materials",
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",
promptDrawerTitle: "Material Library Prompts",
promptDrawerSearchPlaceholder: "Search material name, tags or node type...",
promptDrawerEmpty: "No prompt materials found in library",
promptClearText: "Clear note",
promptClearConfirm: "Are you sure you want to clear this note?",
materialViewGrid: "Grid View",
materialViewList: "List View",
materialPromptStudio: "Prompt Studio",
materialCollapseStudio: "Collapse Studio",
materialSendToStudio: "Send to Studio Note",
materialKindPill_all: "All",
materialKindPill_workflow: "Workflow",
materialKindPill_params: "Params",
materialKindPill_prompts: "Prompts",
recipeScopePill_all: "All",
recipeScopePill_complete: "Full Workflow",
recipeScopePill_partial: "Sub-graph",
recipeViewGrid: "Grid View",
recipeViewList: "List View",
recipeDragHint: "Hold & drag onto canvas to load workflow",
recipeDragTargetCanvas: "Drop to load workflow in canvas",
recipeStatusReady: "All Models Ready",
recipeStatusUnverified: "Models to Verify",
recipeStatusMissing: "Models Missing",
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',
materialDismissReceipt: "Dismiss save notification",
materialNoteCopyName: "{name} · Material copy",
materialSavePromptAction: "Save prompt",
materialSavedToLibrary: "Saved to Material Library",
materialViewSaved: "View material",
materialPromptNoteBundle: "Prompt note",
materialPromptTextKind: "Prompt text",
materialSaveNoteBundle: "Save entire note",
materialSavePromptText: "Save prompt only",
materialNoteScopeHint: "An entire note includes prompts, translations and companion models; prompt-only excludes models.",
materialRestoreNote: "Load as a new note",
materialRestoreNoteHint: "Create an editable new note and keep this material. Companion models can be adjusted in the note.",
materialSaveGeneration: "Save these generation settings",
materialSaveGenerationAction: "Save to Material Library",
materialGenerationScope: "Saves complete sampler and size node settings for reuse in Node Assistant.",
materialCopySuccess: "Copied",
materialCopyFailed: "Copy failed",
materialClickToCopy: "Click to copy",
materialOtherNodeTypes: " +{count} more",
materialQuickEditTitle: "Edit title",
materialTitleSaved: "Title saved",
materialChooseParameters: "Select some parameters",
materialFinishSelection: "Done selecting",
promptAdjustRole: "Adjust role",
notebookCompanionModels: "Companion models",
notebookMore: "More",
notebookDoneEditing: "📑 View Bilingual Tags",
editRaw: "✏️ Edit Raw Prompt",
saveNotebook: "Save Note",
deleteNotebook: "Delete Note",
delSure: "Confirm Delete?",
sendToCanvas: "Send to Canvas",
createNotebook: "New Note",
newNotebookName: "New note name...",
recipeSearchAndReplace: "Find, Replace & Language",
findPlaceholder: "Find...",
replacePlaceholder: "Replace with...",
replaceAll: "Replace All",
recipeDiffNone: "None",
loras: "LoRA Models",
baseModel: "Base Model",
mainModel: "Main Model",
nbNavHeading: "Quick Jump",
nbNotesHeading: "My Notes",
nbNavModels: "Companion Models",
nbNavPrompt: "Prompt Editor",
nbNavTools: "Find & Replace",
nbNavArchive: "Save to Library",
notebookPromptTitle: "Prompt",
materialSearchHint: "Search names, tags or node types",
materialTags: "Tags",
materialTagsHint: "Tags, separated by commas (up to 20)",
materialFilterKind: "Material type",
materialAllKinds: "All types",
materialAllTags: "All tags",
materialNoMatches: "No matching materials. Try another search or filter.",
materialPageSummary: "Page {page} / {pages} · {count} materials",
materialPrevious: "Previous",
materialNext: "Next",
materialPagination: "Material pages",
materialEditDetails: "Edit name and tags",
materialSaveDetails: "Save changes",
materialUpdateError: "Changes were not saved. Check the name and tags, then retry.",
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',
noModels: 'No models found in this folder.',
noPreview: 'No preview available',
clickScan: 'Click Scan',
back: '⬅️ Back',
delModel: 'Delete',
delConfirm: 'Are you sure you want to permanently delete',
delConfirm2: ' and all its associated configs, previews, and cache files? This action is irreversible!',
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',
help: 'Help',
helpTitle: '📖 User Manual',
helpContent: `
workflows/anomalous_recipes and workflows/anomalous_parameters folders in your ComfyUI user directory. Model preview snapshots do not contain model files and are not model backups.1. 🔄 Prerequisites (Scan Wizard)
Location: The Scan (🔄) icon at the bottom left.
This is the most crucial step! Open the Scan Wizard and execute a scan. Keep your network connected. (API-KEY may be needed in Settings for NSFW Civitai models). Scanning activates all core features.
2. 🩺 Fix Broken Nodes (Model Doctor)
Location: The 2nd icon (Stethoscope 🩺) from the bottom left.
When importing a workflow/image exported by this plugin and nodes turn red, open the Model Doctor to intelligently identify and replace them with correct local paths.
3. 🤖 Node actions and parameter presets (Node Assistant)
Location: The 3rd icon (Robot 🤖) from the bottom left.
After selecting a canvas node, Actions can visually replace its model or insert a LoRA before/after a compatible MODEL + CLIP chain. Parameter Presets reads same-type node values saved by Workflow Recipes and groups them by recipe. Click one record to apply it to the selected node. For example, selecting a KSampler can load its sampler, scheduler, steps, CFG, and denoise values in one click; volatile values such as seeds are ignored.
4. Workflow Recipes and Parameter Sets
Location: Open the Creative Workspace and switch to Workflow Recipes.
A recipe saves the workflow, cover, tags, notes, model references, and common parameters. Open partial recipes append to the current canvas, while independently runnable complete recipes open in a new canvas; recipe package import and export are temporarily unavailable. Details include Overview, Parameter Set, Gallery, and Versions for local model matching, full parameter viewing/copying, output comparison, and version comparison/restoration. Parameter notes can capture fresh values from a matching live canvas or edit safe controls; Apply to Current Workflow writes only after the recipe skeleton matches. Third-party prompt nodes that cannot be classified reliably can be labelled manually.
5. Settings Panel
Location: The Gear () icon at the bottom left.
Adjust language and UI scale. Open “Model Settings” to choose always-play or hover-play video covers and optimized thumbnails or original covers. Detail pages always retain original image quality.
6. 📑 Top Navigation & Prompt Notes
Location: Top-right tabs Models (), Gallery (), Creative Workspace (📑), and Dock (◧).
Open Prompt Notes in the Creative Workspace and click . Select a Base Model, Main Model, and LoRAs; use 📝 Edit Raw/Paste for bilingual prompts, chunking, find/replace, and tag editing; then click Send to Canvas to assemble the nodes.
7. Folder Manager
Location: Inside the Settings () panel, click Manage Folders.
Use this to hide unneeded built-in folders. Hidden folders will be completely skipped by background scans and I/O reads, achieving true "zero performance cost". You can also drag and drop to reorder how folders appear in the sidebar.
8. Workflow Import / Export (Share Code)
Open Toolbox → Import / Export to import or export AMB0/AMB1 workflow share codes. File import from the Material Library is closed; image/workflow hash metadata is unchanged.
9. 💬 Submit Feedback / Report Bug
Location: Inside the Settings () panel, click 💬 Submit Feedback / Report Bug.
If you encounter bugs or have feature requests, click this to go directly to our GitHub Issues page.
.safetensors and associated files on disk.',
sidebarPhysicalRenameProtectedNotice: 'Foundation-component protection is active: VAE, VAE Approx, CLIP/Text Encoder, and CLIP Vision metadata will still be scanned, but their physical filenames will not change.',
sidebarStep3: 'Step 3. Workflow Protection & Fix',
sidebarProvenance: 'Model Provenance Binding',
sidebarProvenanceDesc: 'Global effect. Implicitly embed exact model hashes into generated images and saved workflows, ensuring missing models can always be auto-fixed.',
sidebarOverwrite: 'Force Overwrite Configs',
sidebarOverwriteDesc: 'Ignore existing .info files and force re-scan/overwrite. Useful for fixing mismatched models.',
sidebarSmartFix: 'Smart Fix Current Workflow',
sidebarSmartFixDesc: 'After scanning, automatically attempt to fix missing model errors on the current canvas.',
sidebarNoModelsSelected: 'No models selected',
sidebarScanFailed: 'Scan failed: ',
sidebarCancel: 'Cancel',
sidebarExecute: 'Execute Scan',
sidebarSwitchToEnglish: '🌐 Language: EN',
sidebarSwitchToChinese: '🌐 语言: 中文',
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: 'UI Scale',
sidebarViewMode: 'View Mode',
sidebarViewModeCompact: 'Compact',
sidebarViewModeStandard: 'Standard',
sidebarViewModeAesthetic: 'Aesthetic',
sidebarBgAtmosphere: 'Background Atmosphere',
sidebarBgAtmosphereHelp: 'Adjust blueprint backdrop opacity (0% is pure solid dark)',
sidebarResetLayout: '↺ Reset Window Layout',
sidebarResetConfirm: 'Reset window position, scale and dock state?',
sidebarToolbox: 'Toolbox Hub',
toolboxTitle: 'Toolbox Hub',
promptLibraryAutoSync: "Material Library cards sync automatically",
promptLibrarySyncFailed: "Library sync failed. Existing cards are kept; retrying automatically.",
promptLibraryBadge: "🔒 From Material Library",
promptLibrarySource: "Material Library: {name} ({filename})",
promptLibraryReadOnly: "Managed by the source material; cannot be deleted here. Mixer copies remain editable.",
toolWorkflowTransferShort: "Import / Export",
toolWorkflowTransferTitle: "Workflow Import / Export Center",
toolWorkflowTransferDesc: "Import or export workflows using the verified AMB0/AMB1 share-code tools.",
toolboxSubtitle: 'Model Maintenance & Utility Tools',
toolboxPlanned: 'Planned',
toolboxReady: 'Ready',
toolboxHintFooter: '💡 Expanding: Batch organizer, orphan cache cleaner, and hash recalculation tools will be hosted here.',
toolPromptStudioTitle: 'Prompt Studio',
toolPromptStudioShort: 'Prompt Studio',
toolPromptStudioDesc: 'Visual prompt composer with block mixing and direct canvas apply.',
toolPromptTranslatorTitle: 'Prompt Translator',
toolPromptTranslatorShort: 'Translator',
toolPromptTranslatorDesc: 'Bilingual translation, tag breakdown, and direct write to active canvas node.',
toolOrphanCleanerTitle: 'Orphan Cache & Temp Cleaner',
toolOrphanCleanerShort: 'Cache Clean',
toolOrphanCleanerDesc: 'Scan and remove unreferenced thumbnails and temporary files for deleted models.',
toolBatchRenameTitle: 'Batch Rename & Tagging',
toolBatchRenameShort: 'Batch Rename',
toolBatchRenameDesc: 'Standardize model filenames or batch-assign taxonomy tags to folders.',
toolCivitaiJumpTitle: 'Civitai Quick Jump',
toolCivitaiJumpShort: 'Civitai',
toolCivitaiJumpDesc: 'Quickly open official model release pages in browser by SHA256 hash or title.',
toolModelSourcesTitle: 'Model Source Hub',
toolModelSourcesShort: 'Sources',
toolModelSourcesDesc: 'View and edit model sources, auto-resolve links, jump to release pages, sync to workflow, and generate canvas note nodes.',
toolPromptNotesTitle: 'Prompt Notes',
toolPromptNotesShort: 'Prompt Notes',
toolPromptNotesDesc: 'Manage structured prompt notes, model bindings, and canvas node assembly.',
modelSourcesModalTitle: '🌐 Model Source Hub',
modelSourcesScopeWorkflow: 'Active Workflow',
modelSourcesScopeLibrary: 'All Local Models',
modelSourcesFilterAll: 'All',
modelSourcesFilterResolved: 'Source provided',
modelSourcesFilterUnresolved: 'Source needed',
modelSourcesSearchPlaceholder: 'Search model name or node...',
modelSourcesAutoFetchAll: '⚡ Auto-Fetch All',
modelSourcesGenerateNoteNode: '📝 Create Note on Canvas',
modelSourcesSaveToWorkflow: '💾 Save to Workflow',
modelSourcesSyncToWorkflow: '🔄 Sync to Workflow',
modelSourcesCopySummary: '📋 Copy Visible Range',
modelSourcesCopied: '✓ Model sources copied to clipboard!',
modelSourcesSavedToWorkflow: '✓ Model sources saved to workflow!',
modelSourcesSyncedToWorkflow: '✓ Model sources synced in workflow!',
modelSourcesNoteCreated: '✓ Created Model Sources Note node on canvas!',
modelSourcesJump: '↗️ Open',
modelSourcesAutoDetect: '⚡ Detect',
modelSourcesSaveLocal: '💾 Save Local',
modelSourcesSavedLocal: '✓ Saved source link to local model metadata!',
modelSourcesStatusMissingOnDisk: 'Not installed locally',
modelSourcesStatusReady: 'Installed',
modelSourcesStatusUnfilled: 'Source needed',
modelSourcesStatusUnfilledOptional: 'Not provided (optional)',
modelSourcesComponentsAdvanced: 'Foundation components (advanced) · {count}',
modelSourcesComponentsOptionalHint: 'Sources are optional and excluded from source-needed counts',
modelSourcesComponentsMissing: 'Missing local files × {count}',
modelSourcesComponentsNoSearchMatch: 'No foundation components match this search',
modelSourcesMainStats: 'Main model sources filled',
modelSourcesLibraryRangeHint: 'Local library scope follows Settings → Folder Manager',
modelSourcesLibraryLoading: 'Loading the current Folder Manager scope…',
modelSourcesLibraryLoadFailed: 'Failed to load the local model library. Please retry.',
modelSourcesRetry: 'Retry',
modelSourcesTypeTextEncoder: 'Text encoder',
modelSourcesTypeVae: 'VAE',
modelSourcesTypeVaeApprox: 'Preview VAE',
modelSourcesTypeVisionEncoder: 'Vision encoder',
modelSourcesLocalTargetUnknown: 'Local file location is not resolved. You can save the link to the workflow.',
modelSourcesNoModelsFound: 'No models detected',
modelSourcesUrlPlaceholder: 'Enter or paste source URL (Civitai / Hugging Face / Liblib / etc)...',
toolHashRecalcTitle: 'Hash Check',
toolHashRecalcShort: 'Hash Check',
toolHashRecalcDesc: 'Quickly compute and verify model file SHA256 hash.',
toolFormatConvertTitle: 'Format Convert',
toolFormatConvertShort: 'Convert',
toolFormatConvertDesc: 'Helper tools for model FP8/FP16 precision and format conversion.',
toolCustomScriptsTitle: 'Custom Scripts',
toolCustomScriptsShort: 'Scripts',
toolCustomScriptsDesc: 'Register and run custom Python / JS maintenance scripts via API.',
sidebarInjectHash: '🟢 Inject Workflow Hash',
sidebarSkipHash: '⚪ Skip Workflow Hash',
sidebarManageFolders: 'Manage Folders',
sidebarFeedback: '💬 Submit Feedback / Report Bug',
sidebarModelSettings: 'Model Settings',
sidebarModelCardSettings: 'Model Card Settings',
sidebarModelCardDescription: 'Only changes cards in the model browser. Model files and original covers remain untouched.',
sidebarVideoPlayback: 'Video cover playback',
sidebarVideoHelp: 'Always play is more lively; hover play uses less GPU memory and power.',
sidebarAlwaysPlay: 'Always play',
sidebarHoverPlay: 'Play on hover (Recommended)',
sidebarCardQuality: 'Card image quality',
sidebarCardQualityHelp: 'Optimized thumbnails are card-only; details still show the original cover.',
sidebarOptimizedThumbnail: 'Optimized thumbnail (Recommended)',
sidebarOriginalCover: 'Original cover (More resource use)',
sidebarModelSettingsNote: 'The plugin automatically caches and evicts thumbnails, and releases videos offscreen or when closed.',
sidebarDone: 'Done',
sidebarModuleNotLoaded: 'Module not loaded, please refresh!',
sidebarExpandAll: 'Expand All',
sidebarCollapseAll: 'Collapse All',
sidebarSearchModels: 'Search models...',
sidebarFolderManagerTitle: 'Manage Folders',
sidebarFolderManagerDesc: 'Drag and drop to reorder folders. Click the eye icon to hide unneeded folders. Hidden folders are skipped during scanning and consume zero performance.',
sidebarCategoryMode: 'Category Mode (ComfyUI)',
sidebarPhysicalMode: 'Physical Mode (Local)',
sidebarFolderLoadFailed: 'Failed to load folder types.',
sidebarFolderModeError: 'Error switching mode',
sidebarVisible: 'Visible',
sidebarHidden: 'Hidden',
sidebarSaveReload: 'Save & Reload',
sidebarSaveConfigError: 'Error saving config: ',
hashResolverFixed: '🪄 Anomalous successfully fixed {count} missing model(s)!\n\n💡 Tip: ComfyUI V1 caches errors heavily. Please manually click the [Refresh] button in the "Workflow Overview" side panel, or refresh your browser (F5) to prevent them from turning red again on workflow switch.',
closeHelp: 'Close Manual',
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',
doctorBtn: 'Node Assistant',
importBtn: 'Import Workflow (Share Code)',
recipeTitle: 'Workflows',
recipeBetaNotice: 'Workflow Recipes are still in beta. Before updating the plugin or importing, restoring, deleting, or applying parameters, save the canvas and back up anomalous_recipes and anomalous_parameters under your user workflows directory.',
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',
recipeImportUnavailable: 'Recipe package import is temporarily unavailable',
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: 'Curate, manage and reuse ComfyUI complete or partial workflows with canvas drag-and-drop and model self-healing.',
recipeEmptyStep1Title: '1. Save Current Workflow',
recipeEmptyStep1Desc: 'Click "Save Current" at top right to snapshot the current canvas node graph and parameters as a recipe.',
recipeEmptyStep2Title: '2. Drag onto Canvas',
recipeEmptyStep2Desc: 'Hold and drag recipe card directly onto empty canvas to load the workflow instantly without rewiring.',
recipeEmptyStep3Title: '3. Model Self-Healing',
recipeEmptyStep3Desc: 'If models in the recipe are missing locally, open details to intelligently match and replace them.',
recipeEmptySaveCurrentBtn: 'Save Current Workflow',
recipeScope: 'Recipe type',
recipeScopePartial: 'Partial recipe',
recipeScopeComplete: 'Complete recipe',
recipeScopePartialSaveHint: 'Open required connections or no output node were detected. This will be saved as a partial recipe and appended to the current canvas by default.',
recipeScopeCompleteSaveHint: 'This graph is independently runnable. It will be saved as a complete recipe and opened in a new canvas.',
recipeDelete: 'Delete',
recipeDeleteConfirm: 'Delete this Workflow Recipe?',
recipeDeleteError: 'Could not delete this Workflow Recipe.',
recipeSaveError: 'Could not save this Workflow Recipe.',
recipeNodeParams: 'Node parameters',
recipeUnknownNode: 'Unknown node',
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}”? This cannot be undone.',
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',
recipeDetailSummary: 'Summary',
recipeDetailModelComposition: 'Model composition',
recipeDetailBaseModel: 'Base model',
recipeDetailIdentity: 'Verified identities',
recipeDetailUnverified: 'Unverified models',
recipeDetailMissingNodes: 'Missing node types',
recipeDetailFingerprint: 'Workflow fingerprint',
recipeDetailNotIndexed: 'Not indexed yet',
recipeDetailLoraSummary: 'LoRA',
recipeDetailSampler: 'Sampler',
recipeDetailResolution: 'Resolution',
recipeDetailUnavailable: 'Unavailable',
recipeDetailEditOrigin: 'Edit Origin',
recipeOriginDialogTitle: 'Edit Model Origin',
recipeOriginOfficialName: 'Official Model Name',
recipeOriginModelUrl: 'Official Model URL',
recipeOriginFetchHash: '🌍 Auto-fetch via Hash',
recipeOriginFetching: 'Fetching...',
recipeOriginFetchFailed: 'Not found or network error',
recipeOriginFetchSuccess: 'Successfully fetched!',
recipeDetailNoNotes: 'No notes.',
recipeDetailUpdated: 'Updated',
recipeDetailCopyPrompt: 'Copy prompt',
recipeDetailCopyFingerprint: 'Copy workflow fingerprint',
recipeDetailCopyHash: 'Copy full hash',
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',
recipeIdentityVerified: 'Identity verified',
recipeIdentityUnverified: 'Local available, unverified',
recipeIdentityUnavailable: 'Not found locally',
recipeIdentityHelpDesc: 'Verification checks if the physical file matches the saved hash, it does not judge model quality.',
recipeDetailRefreshAvailability: 'Check local availability',
recipeDetailRefreshOrigin: 'Refresh Origin Info',
recipeDetailRefreshOriginDesc: 'Refresh all model origin information in this recipe (supports backfilling old recipes)',
recipeDetailRefreshing: 'Checking…',
recipeDetailRefreshError: 'Could not check local availability.',
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',
recipeModelPath: 'Model path',
recipeOpenLocalModel: 'Open local model details',
recipeMatchLocalModel: 'Match local model',
recipeMatchingLocalModel: 'Matching local model…',
recipeMatchRecipeModels: 'Match recipe models',
recipeMatchRecipeModelsDesc: 'Find local files by model hash, file size, and model category; the author’s path is not used.',
recipeMatchingRecipeModels: 'Matching recipe models…',
recipeRecipeMatchSummary: 'Found {found}/{total} local matches',
recipeAllModelsMatched: 'All recipe models are already matched or need no match',
recipeApplyLocalMatch: 'Apply match',
recipeConfirmSizeCandidate: 'Confirm Same-size Candidate',
recipeApplyLocalMatchDesc: 'Write the matched local model path into the recipe workflow',
recipeApplyingLocalMatch: 'Applying match…',
recipeApplyLocalMatchSuccess: 'Local model match applied',
recipeApplyLocalMatchError: 'Could not apply this model match',
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.',
recipeLocalModelNotFound: 'No matching local model was found.',
recipeLocalModelIdentityConflict: 'Model size and hash identity conflict; match rejected.',
recipeLocalModelAmbiguous: 'Multiple candidates found; add model identity information first.',
recipeLocalModelMatchError: 'Matching failed. Try again later.',
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',
recipeDetailLoadingPreviews: 'Loading local model previews…',
recipeDetailCurrentPreview: 'Current Local Preview',
recipeDetailNoPreview: 'No Preview',
recipeDetailSavedSnapshot: 'Snapshot Saved',
recipeParameterNotebooks: 'PARAMETER SETS',
recipeParameterRename: 'Rename',
recipeParameterRenamePrompt: 'Enter a new name for this parameter notebook:',
recipeParameterRenameError: 'Failed to rename parameter notebook',
assistantTabActions: 'Actions',
assistantTabPresets: 'Parameter Presets',
assistantRecipeGroup: 'Recipe',
assistantDeletedRecipe: 'Deleted Recipe',
assistantUnboundRecipe: 'Global Unbound',
assistantNotebook: 'Notebook',
assistantApplyTo: 'Apply to',
assistantNoPresets: 'No parameter presets found for this node type.',
recipeStatusReady: '🟢 Ready to Run',
recipeStatusNeedAttention: '🟡 Matches Available ({count})',
recipeStatusMissing: '🔴 Missing Models ({count})',
recipeStatusChecking: '⏳ Checking Environment…',
recipeQuickSpecs: 'Quick Specs',
recipeApplyAllMatches: 'Apply All Matches',
recipeApplyingAllMatches: 'Applying all matches…',
recipeApplyAllMatchesSuccess: '✅ Applied all local matches!',
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',
}
};
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);
}