From ce35145e6776e59eda56daa6dec7610cafb3c4d9 Mon Sep 17 00:00:00 2001 From: DemonGatanjieu <207458273+DemonGatanjieu@users.noreply.github.com> Date: Sun, 25 Oct 2026 14:45:14 +0800 Subject: [PATCH] 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 --- docs/architecture/ui-flows.md | 2 +- tools/ui_map_scan.mjs | 2 +- web/modules/locales.js | 64 ----------------------------------- 3 files changed, 2 insertions(+), 66 deletions(-) diff --git a/docs/architecture/ui-flows.md b/docs/architecture/ui-flows.md index 77879d0..16b37b3 100644 --- a/docs/architecture/ui-flows.md +++ b/docs/architecture/ui-flows.md @@ -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)`)。 diff --git a/tools/ui_map_scan.mjs b/tools/ui_map_scan.mjs index 225432b..c31708d 100644 --- a/tools/ui_map_scan.mjs +++ b/tools/ui_map_scan.mjs @@ -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. */ diff --git a/web/modules/locales.js b/web/modules/locales.js index 1868935..f9a9945 100644 --- a/web/modules/locales.js +++ b/web/modules/locales.js @@ -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}",