Remove the 32 screen words no code uses any more

Old toolbar, scan-wizard and workspace labels and a few hints, in both languages; each
checked against the web files, tests and the backend (no t() use, no key built in a
template, no error message used as a key). The UI map's scanner read a quoted string with
an escape ('\n') wrong and missed the key after it on the same line (delNote is used).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
DemonGatanjieu
2026-10-25 14:45:14 +08:00
co-authored by Claude Opus 5.5
parent b220fc8a31
commit ce35145e67
3 changed files with 2 additions and 66 deletions
+1 -1
View File
@@ -111,4 +111,4 @@ node tools/ui_map.mjs build 写出 docs/ui-map.md:按页面列
## 还没统一的
- `node tools/ui_map.mjs build` 的最后一节列出没有文件用到的文字(目前 33 条),清理前先确认不是拼出来的 key。
- `node tools/ui_map.mjs build` 的最后一节列出没有文件用到的文字(2026-10-25 清理过一次,当时为 0),清理前先确认不是拼出来的 key、也不是后端错误信息当 key 用的(`t(error.message)`)。
+1 -1
View File
@@ -96,7 +96,7 @@ function cssIndex() {
}
const KEY_LIKE = /^[a-zA-Z][A-Za-z0-9_]{2,}$/;
const STRING = /'([^'\\\n]*)'|"([^"\\\n]*)"/g;
const STRING = /'((?:[^'\\\n]|\\.)*)'|"((?:[^"\\\n]|\\.)*)"/g; // a '\n' inside is part of the string
const TEMPLATE = /`([^`]*)`/g;
/** What one web file uses: words (key -> lines), addresses, classes (class -> lines), imports. */
-64
View File
@@ -87,7 +87,6 @@ export const i18n = {
versionError_no_previous: "没有可以撤销的切换。",
versionError_no_default_branch: "无法确定默认分支。",
updateGuideTourBanner: "💡 想在主界面实地体验?点击开启按键遮罩导览 ›",
materialCardDragHint: "按住可拖拽至画布节点注入参数,或拖至空白处载入工作流",
updateGuideImportTitle: "模型拖进来,自动放对地方",
updateGuideImportBody: "在模型页点“+ 导入”,或者直接把模型文件拖到模型页上:每个文件会说明它是什么(Checkpoint、LoRA、VAE、文本编码器…)、什么底模、要放到哪个文件夹,放的位置可以改。本机已经有的同一个文件会指出来,什么都不会被覆盖,放好后自动扫描。",
updateGuideTidyTitle: "整理:放错文件夹的、重复的模型",
@@ -109,9 +108,7 @@ export const i18n = {
materialTargetChanged: "请重新选中一个节点后再应用。",
materialNoCompatibleValues: "这些值不能安全地写进这个节点。",
materialValueUnavailable: "有个选项在这个节点里没有(本机缺模型,或节点版本不同)。",
promptCompositionHint: "填写提示词,选择放在前面或后面,再拖到提示词节点。保留节点原有文字,不自动运行。",
nodeValuesSaved: "已存下这些节点的参数。以后选中同类节点,在“当前节点”里就能套用。",
promptDragNoteHint: "按住卡头或便签,直接拖拽至画布节点",
recipeMoveKept: "以前从出图收下的完整工作流还有 {count} 个没移过来。它们现在都放在这里,以后在图库点 ☆ 也能直接存成工作流。",
recipeMoveKeptButton: "移到这里",
recipeMovedKept: "移过来了 {count} 个。原来的文件还在,只是不再单独列出。",
@@ -132,7 +129,6 @@ export const i18n = {
materialCopyFailed: "复制失败",
materialClickToCopy: "点击复制数值",
promptAdjustRole: "调整用途",
notebookCompanionModels: "配套模型",
notebookMore: "更多",
notebookDoneEditing: "📑 查看双语分词",
loras: "LoRA 模型",
@@ -143,18 +139,6 @@ export const i18n = {
materialChars: "{count} 字符",
materialCopyPromptText: "复制提示词",
notebookSaveError: '保存失败,修改仍留在编辑器中,请重试。',
title: 'Anomalous 模型浏览器',
scan: '🔄 扫描目录并同步 C 站数据',
scanTitle: '扫描目录',
scanConfirm: '注意:\n扫描过程将会自动比对 Civitai 并重命名本地模型,同时清理损坏文件。\n确定要开始扫描吗?',
scanning: '扫描中...',
scanBg: '扫描后台启动!',
scanDone: '完成',
scanCompleteMsg: '✅ 扫描完成!\n\n⚠️ 提示:由于部分模型已被重命名或去重,请点击 ComfyUI 的 [Refresh] 按钮以同步最新的模型列表。',
togglePlayTitle: '切换播放模式',
clean: '🧹 清理无效的 .info 残留文件',
cleanTitle: '清理重复 Info',
files: '个文件。',
folderOpen: '打开',
folderOpenHint: '在资源管理器里打开这个文件夹',
folderAll: '全部',
@@ -388,15 +372,12 @@ export const i18n = {
loading: '加载中…',
loadingCompatible: '加载中...',
applyToCanvas: '插入节点',
workspace: '创作工作台',
workspaceTitle: '创作工作台',
materialLoadError: "存过的提示词读取失败。",
materialOpenWorkflow: '打开完整工作流',
materialOpenError: "无法打开这张图里的工作流。",
materialViewDetails: '查看详情',
materialViewParameters: '查看参数',
materialDetailLoadError: "无法读取这条提示词。",
materialSourceImage: '来源图片',
workbenchLoadSuccess: '工作流已成功加载到 ComfyUI 画布!',
workbenchLoadFailed: '无法加载工作流到画布:',
workbenchNext: '下一张 (→)',
@@ -416,7 +397,6 @@ export const i18n = {
workbenchLocateModel: '🔎 定位模型',
materialInspecting: '正在读取图片中的工作流与参数…',
materialInspectError: "这张图片没有可复用的完整 UI 工作流。",
materialSaveHint: '完整工作流保留精确种子;作为单节点参数应用时会跳过种子。',
materialPromptRoleHelp: "已按工作流连线自动识别提示词角色;识别不准时可手动改为正面、负面、共用或忽略。每条提示词都能直接存进提示词库。",
materialNoPromptData: '(无嵌入提示词数据)',
materialSaveError: "没存上,请再试一次。",
@@ -635,11 +615,9 @@ export const i18n = {
comboLoadError: "搭配读取失败,请重试。",
comboBack: "← 全部搭配",
noteNeedsClip: "UNet 模型不带文本编码器:画布上没有唯一的 CLIP 加载节点,提示词节点的 clip 要你自己接。",
translate: '翻译',
dialogOk: '确定',
dialogCopySelected: '已选中,按 Ctrl+C',
dialogCancel: '取消',
scanModelPrecisely: '精准扫描此模型',
galleryLoading: '加载中...',
galleryErrorPrefix: '错误: ',
galleryDelete: '删除',
@@ -1110,7 +1088,6 @@ export const i18n = {
notebookPromptPlaceholder: "在此输入提示词内容(英文词条用逗号分隔,支持自动双语切词翻译)...",
notebookUnlabeledBase: '未标注基础模型',
notebookUnetNeedsTextEncoder: 'UNet 模型不含文本编码器:发送到画布后,把你的 CLIP 加载器接到两个提示词节点上。LoRA 会用“仅模型”加载。',
mainPreflightTitle: '导入工作流 (预检海关)',
mainOpenTitle: '打开 Anomalous 模型浏览器',
mainInterfaceCategory: '界面',
mainLanguageSetting: '插件语言',
@@ -1692,7 +1669,6 @@ export const i18n = {
aiGistPictures: "{count} 张图",
aiGistModels: "{count} 个模型",
aiGistMap: "节点结构",
aiStageEmpty: "AI 画的面板会出现在这里。",
aiTasksToggle: "收起 / 展开任务列表(收起时鼠标移上来就能看)",
aiSideResize: "拖动调整宽度,双击恢复默认;点一下后也可以按 ← → 调",
aiKind_user: "你",
@@ -2398,7 +2374,6 @@ export const i18n = {
settingsReportHelp: "先在这里写一两句话,再去 GitHub 提交;版本、显卡这些信息会自动附上。",
settingsSuggestHelp: "想要的功能、哪里不顺手,都可以写。",
sidebarScan: '扫描模型',
sidebarGlobalWizardTitle: '全局扫描向导',
sidebarProvenance: '在工作流里记下模型指纹',
sidebarProvenanceDesc: "生成图片或保存工作流时,把模型的指纹和下载链接一起存进去。以后模型改名、换电脑,模型检查也能找回来;别人拿到工作流,也知道模型去哪下。",
sidebarScanning: '⏳ 扫描中...',
@@ -2518,7 +2493,6 @@ export const i18n = {
promptNodePositive: "CLIP 文本编码器 (正向)",
promptNodeNegative: "CLIP 文本编码器 (负向)",
toolWorkflowTransferTitle: "分享与导入",
toolModelSourcesTitle: "每个模型去哪下载,链接可以改成任何网站",
toolModelSourcesShort: '模型来源',
modelSourcesTitle: "模型来源",
modelSourcesLead: "每个模型从哪下载。链接存在模型自己的信息里(编辑窗口里的“下载地址”就是它),哪个网站都行;“当前工作流”里的链接还会存进工作流,分享时一起带走。",
@@ -2578,10 +2552,6 @@ export const i18n = {
editRaw: '编辑全文',
findPlaceholder: '查找...',
replacePlaceholder: '替换为...',
models: '模型',
gallery: '图库',
settingsBtn: '设置',
importBtn: '导入工作流 (分享码)',
recipeTitle: '工作流',
recipeSaveCurrent: '保存当前工作流',
recipeSaveTitle: "保存为工作流",
@@ -2680,7 +2650,6 @@ export const i18n = {
recipeGalleryLoadError: "无法读取这个工作流的图库。",
recipeGalleryScanHint: '已检查最近 {count} 张含工作流数据的 PNG。',
recipeGalleryOpenImage: '查看原图',
recipeGalleryDifferenceHint: '以下是节点参数的差异;图库匹配本身只关注节点类型。',
recipeParameterSnapshots: '已存参数方案',
recipeParameterLoading: '正在读取预设…',
recipeParameterLoadError: '无法读取预设列表。',
@@ -2897,7 +2866,6 @@ export const i18n = {
ttsSetupCharacters: "{count} 个角色",
ttsSetupDownloading: "基础文件下载中…",
ttsSetupPackagesMissing: "缺 {count} 个 Python 包",
ttsSetupPretrained: "基础文件",
ttsSetupPackages: "Python 包",
ttsSetupRemote: "这些操作只能在运行 ComfyUI 的那台电脑上进行(当前是从别的设备打开的)。",
ttsSetupFailed: "操作失败:{error}",
@@ -3507,7 +3475,6 @@ export const i18n = {
versionError_no_previous: "There is no switch to undo.",
versionError_no_default_branch: "Couldn't determine the default branch.",
updateGuideTourBanner: "💡 Prefer to see them in action? Start Spotlight Tour ›",
materialCardDragHint: "Hold and drag onto canvas nodes to inject values, or drop on empty canvas to load workflow",
updateGuideImportTitle: "Drop a model in, it goes to the right folder",
updateGuideImportBody: "Models page → + Import, or drop model files on the models page: each file says what it is (Checkpoint, LoRA, VAE, text encoder…), its base model and the folder it will go to, which you can change. A file you already have is pointed out, nothing is ever replaced, and the new files are scanned right after.",
updateGuideTidyTitle: "Tidy: models in the wrong folder, files you have twice",
@@ -3529,9 +3496,7 @@ export const i18n = {
materialTargetChanged: "Select one node again before applying.",
materialNoCompatibleValues: "These values cannot be put into this node safely.",
materialValueUnavailable: "One of the choices is not available on this node (a model this computer lacks, or another node version).",
promptCompositionHint: "Enter prompt text, choose beginning or end, then drag onto a prompt node. Existing text is preserved. This does not start generation.",
nodeValuesSaved: "Saved these nodes' values. Select a node of the same kind and they are in Current node.",
promptDragNoteHint: "Hold card or header to drag onto canvas node",
recipeMoveKept: "{count} whole workflows kept from your images earlier are not here yet. They belong here now; the gallery's star keeps new ones as workflows.",
recipeMoveKeptButton: "Move them here",
recipeMovedKept: "Moved {count}. The original files stay; they are just not listed on their own.",
@@ -3552,7 +3517,6 @@ export const i18n = {
materialCopyFailed: "Copy failed",
materialClickToCopy: "Click to copy",
promptAdjustRole: "Adjust role",
notebookCompanionModels: "Companion models",
notebookMore: "More",
notebookDoneEditing: "📑 View Bilingual Tags",
loras: "LoRA Models",
@@ -3563,18 +3527,6 @@ export const i18n = {
materialChars: "{count} {count|character|characters}",
materialCopyPromptText: "Copy prompt",
notebookSaveError: 'Save failed. Your edits remain in the editor; please retry.',
title: 'Anomalous Model Browser',
scan: '🔄 Scan folder and sync Civitai data',
scanTitle: 'Scan Folder',
scanConfirm: 'Notice:\nThe scan process will automatically compare with Civitai and rename your local files.\nStart scan?',
scanning: 'Scanning...',
scanBg: 'Scan started in background!',
scanDone: 'Done',
scanCompleteMsg: '✅ Scan Complete!\n\n⚠️ Note: Please click [Refresh] to sync the model list since files were renamed.',
togglePlayTitle: 'Toggle Play Mode',
clean: '🧹 Clean orphaned .info files',
cleanTitle: 'Clean Duplicate Info',
files: 'files.',
folderOpen: 'Open',
folderOpenHint: 'Open this folder in the file manager',
folderAll: 'All',
@@ -3808,15 +3760,12 @@ export const i18n = {
loading: 'Loading…',
loadingCompatible: 'Loading...',
applyToCanvas: 'Add Node',
workspace: 'Workspace',
workspaceTitle: 'Creative Workspace',
materialLoadError: "Could not read your saved prompts.",
materialOpenWorkflow: 'Open Full Workflow',
materialOpenError: "Could not open this image's workflow.",
materialViewDetails: 'View Details',
materialViewParameters: 'View Parameters',
materialDetailLoadError: "Could not read this prompt.",
materialSourceImage: 'Source Image',
workbenchLoadSuccess: 'Workflow loaded to ComfyUI canvas successfully!',
workbenchLoadFailed: 'Could not load workflow into canvas: ',
workbenchNext: 'Next (→)',
@@ -3836,7 +3785,6 @@ export const i18n = {
workbenchLocateModel: '🔎 Show model',
materialInspecting: 'Reading the embedded workflow and parameters…',
materialInspectError: "This image has no complete UI workflow to reuse.",
materialSaveHint: 'The full workflow keeps the exact seed; single-node application skips seed widgets.',
materialPromptRoleHelp: "Prompt roles are detected from workflow links. Correct them as positive, negative, shared, or ignored when needed. Each prompt can be saved to your prompts.",
materialNoPromptData: '(No embedded prompt data)',
materialSaveError: "It was not saved; try again.",
@@ -4055,11 +4003,9 @@ export const i18n = {
comboLoadError: "Could not load the combos; try again.",
comboBack: "← All combos",
noteNeedsClip: "A UNet model has no text encoder and the canvas has no single CLIP loader, so connect the prompt nodes' clip yourself.",
translate: 'Translate',
dialogOk: 'OK',
dialogCopySelected: 'Selected: press Ctrl+C',
dialogCancel: 'Cancel',
scanModelPrecisely: 'Scan This Model',
galleryLoading: 'Loading...',
galleryErrorPrefix: 'Error: ',
galleryDelete: 'Delete',
@@ -4530,7 +4476,6 @@ export const i18n = {
notebookPromptPlaceholder: "Enter prompt here (comma-separated for tags, bilingual translation supported)...",
notebookUnlabeledBase: 'No base model listed',
notebookUnetNeedsTextEncoder: 'UNet models have no text encoder: after sending to the canvas, connect your CLIP loader to the two prompt nodes. LoRAs are loaded model-only.',
mainPreflightTitle: 'Pre-flight Import Workflow',
mainOpenTitle: 'Open Anomalous Model Browser',
mainInterfaceCategory: 'Interface',
mainLanguageSetting: 'Plugin language',
@@ -5112,7 +5057,6 @@ export const i18n = {
aiGistPictures: "{count} {count|picture|pictures}",
aiGistModels: "{count} {count|model|models}",
aiGistMap: "Node map",
aiStageEmpty: "The AI's panels show here.",
aiTasksToggle: "Fold or show the task list (folded, point here to peek)",
aiSideResize: "Drag to resize; double-click for the usual width; once clicked, ← → resize too",
aiKind_user: "You",
@@ -5818,7 +5762,6 @@ export const i18n = {
settingsReportHelp: "Write a sentence or two here, then submit it on GitHub; versions and hardware are attached for you.",
settingsSuggestHelp: "A feature you want, or something that feels awkward.",
sidebarScan: 'Scan models',
sidebarGlobalWizardTitle: 'Global Scan Wizard',
sidebarProvenance: 'Record model fingerprints in workflows',
sidebarProvenanceDesc: "Generated images and saved workflows also store each model's fingerprint and download link, so Model Check can find the model after a rename or on another computer, and whoever gets the workflow knows where to download it.",
sidebarScanning: '⏳ Scanning...',
@@ -5938,7 +5881,6 @@ export const i18n = {
promptNodePositive: "CLIP Text Encode (Positive)",
promptNodeNegative: "CLIP Text Encode (Negative)",
toolWorkflowTransferTitle: "Share and import",
toolModelSourcesTitle: "Where each model is downloaded; any site's link can go here",
toolModelSourcesShort: 'Sources',
modelSourcesTitle: "Model sources",
modelSourcesLead: "Where each model is downloaded. A link is kept in the model's own information (the editor's download link is the same), from any site; links of this workflow's models are kept in the workflow too, so they travel with it.",
@@ -5998,10 +5940,6 @@ export const i18n = {
editRaw: 'Edit full text',
findPlaceholder: 'Find...',
replacePlaceholder: 'Replace with...',
models: 'Models',
gallery: 'Gallery',
settingsBtn: 'Settings',
importBtn: 'Import Workflow (Share Code)',
recipeTitle: 'Workflows',
recipeSaveCurrent: 'Save Current Workflow',
recipeSaveTitle: "Save workflow",
@@ -6100,7 +6038,6 @@ export const i18n = {
recipeGalleryLoadError: "Could not load this workflow's gallery.",
recipeGalleryScanHint: 'Checked the latest {count} {count|PNG|PNGs} with workflow metadata.',
recipeGalleryOpenImage: 'View full image',
recipeGalleryDifferenceHint: 'These are node-parameter differences; gallery matching only uses node types.',
recipeParameterSnapshots: 'Parameter snapshots',
recipeParameterLoading: 'Loading parameter snapshots…',
recipeParameterLoadError: 'Could not load parameter snapshots.',
@@ -6317,7 +6254,6 @@ export const i18n = {
ttsSetupCharacters: "{count} {count|character|characters}",
ttsSetupDownloading: "downloading pretrained files…",
ttsSetupPackagesMissing: "{count} Python packages missing",
ttsSetupPretrained: "Pretrained files",
ttsSetupPackages: "Python packages",
ttsSetupRemote: "These actions only work on the computer running ComfyUI (this page was opened from another device).",
ttsSetupFailed: "Could not do that: {error}",