针对 Nodes 2.0 VUE节点的兼容性更新

This commit is contained in:
Dontdrunk
2025-12-08 14:39:43 +08:00
parent bd630445ae
commit 0c40dadcfe
4 changed files with 117 additions and 10 deletions
+3 -2
View File
@@ -50,11 +50,12 @@ https://github.com/user-attachments/assets/1ec662ba-da6c-4712-8be7-61168b08940e
## 贡献者名单
感谢以下贡献者对于ComfyUI中文开源生态的支持
- msola-ht丶是小张啊丶alinuo666丶猪的飞行梦丶ZXSZS丶tanglangxia丶AIGCZero丶Artistjjw丶henrylaobai丶FanXiangTM丶xuchenxu168丶LovedeHua丶uiiiaiii丶fuxijun-max丶ANe5s丶cnolka 丶XXXAbit7
- msola-ht丶是小张啊丶alinuo666丶猪的飞行梦丶ZXSZS丶tanglangxia丶AIGCZero丶Artistjjw丶henrylaobai丶FanXiangTM丶xuchenxu168丶LovedeHua丶uiiiaiii丶fuxijun-max丶ANe5s丶cnolka 丶XXXAbit7 丶Yifo98
## 更新日志
### v2.0.0(2025-12-08)
### v2.0.0(2025-12-08) 【兼容性更新】
- 感谢贡献者(Yifo98)提供的新版本兼容示例,修复了ComfyUI Nodes 2.0节点的连线异常问题
- 合并贡献者(cnolka)的PR,现在通过Comfyui原生设置面板来开关翻译,并移除导致BUG的错误翻译文件
- 合并贡献者(cnolka) 对于ComfyUI-Easy-SAM3插件的翻译完善
- 合并贡献者(XXXAbit7)对于Depthflow节点的翻译补全
+87 -1
View File
@@ -1,7 +1,8 @@
import {
containsChineseCharacters,
nativeTranslatedSettings,
error
error,
isVueNodes2
} from "./utils.js";
/**
@@ -170,16 +171,101 @@ class TExe {
error("清理观察者出错:", e);
}
}
/**
* Safe text replacement for Vue mode (Text nodes and attributes only)
* @param {Node} target
*/
safeReplaceVue(target) {
try {
if (!target) return;
if (!this.T) return;
if (this.tSkip(target)) return;
// Text Node
if (target.nodeType === Node.TEXT_NODE) {
if (target.nodeValue && !containsChineseCharacters(target.nodeValue)) {
const translated = this.MT(target.nodeValue);
if (translated) {
target.nodeValue = translated;
}
}
return;
}
// Element Node
if (target.nodeType === Node.ELEMENT_NODE) {
// Skip canvas/graph to avoid layout issues
if (target.tagName === 'CANVAS' || target.classList?.contains('lgraphcanvas')) return;
// Attributes
if (target.title && !containsChineseCharacters(target.title)) {
const t = this.MT(target.title);
if (t) target.title = t;
}
if (target.placeholder && !containsChineseCharacters(target.placeholder)) {
const t = this.MT(target.placeholder);
if (t) target.placeholder = t;
}
// Button values (if input type=button)
if (target.tagName === "INPUT" && target.type === "button" && !containsChineseCharacters(target.value)) {
const t = this.MT(target.value);
if (t) target.value = t;
}
// Recurse
if (target.childNodes && target.childNodes.length) {
Array.from(target.childNodes).forEach(child => this.safeReplaceVue(child));
}
}
} catch (e) {
// error("Safe replace error:", e);
}
}
}
// 创建翻译执行器实例
let texe = new TExe();
function applyVueMenuTranslation(T) {
try {
// 1. Try comfyAPI i18n
if (window.comfyAPI && window.comfyAPI.i18n && window.comfyAPI.i18n.addTranslations) {
window.comfyAPI.i18n.addTranslations('zh-CN', T.Menu);
return;
}
// 2. Fallback: Safe MutationObserver
texe.safeReplaceVue(document.body);
const observer = observeFactory(document.body, (mutationsList) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => texe.safeReplaceVue(node));
} else if (mutation.type === 'characterData') {
texe.safeReplaceVue(mutation.target);
}
}
}, true); // subtree true
if (observer) texe.observers.push(observer);
} catch (e) {
error("Vue mode translation failed:", e);
}
}
export function applyMenuTranslation(T) {
try {
texe.cleanupObservers();
texe.T = T;
if (isVueNodes2()) {
applyVueMenuTranslation(T);
return;
}
texe.translateAllText(document.querySelector(".litegraph"));
const bodyObserver = observeFactory(document.querySelector("body.litegraph"), (mutationsList) => {
+19 -7
View File
@@ -9,7 +9,8 @@ import {
isTranslationEnabled,
toggleTranslation,
initConfig,
error
error,
isVueNodes2
} from "./utils.js";
export class TUtils {
@@ -504,7 +505,9 @@ const ext = {
async init(app) {
try {
await initConfig();
TUtils.enhandeDrawNodeWidgets();
if (!isVueNodes2()) {
TUtils.enhandeDrawNodeWidgets();
}
await TUtils.syncTranslation();
} catch (e) {
error("扩展初始化失败:", e);
@@ -514,7 +517,9 @@ const ext = {
try {
const isComfyUIChineseNative = document.documentElement.lang === 'zh-CN';
TUtils.addNodeTitleMonitoring(app);
if (!isVueNodes2()) {
TUtils.addNodeTitleMonitoring(app);
}
app.ui.settings.addSetting({
id: "🌐翻译设置.语言开关.Enable",
@@ -529,17 +534,24 @@ const ext = {
});
if (isTranslationEnabled()) {
TUtils.applyNodeTypeTranslation(app);
TUtils.applyContextMenuTranslation(app);
if (!isVueNodes2()) {
TUtils.applyNodeTypeTranslation(app);
TUtils.applyContextMenuTranslation(app);
}
// Menu translation needs to handle both modes internally or be split
if (!isComfyUIChineseNative) {
TUtils.applyMenuTranslation(app);
}
TUtils.addRegisterNodeDefCB(app);
if (!isVueNodes2()) {
TUtils.addRegisterNodeDefCB(app);
}
}
TUtils.addPanelButtons(app);
if (!isVueNodes2()) {
TUtils.addPanelButtons(app);
}
} catch (e) {
error("扩展设置失败:", e);
}
+8
View File
@@ -144,4 +144,12 @@ export async function toggleTranslation() {
} else {
error("切换翻译状态失败");
}
}
/**
* Check if running in ComfyUI Nodes 2.0 (Vue) mode
* @returns {boolean}
*/
export function isVueNodes2() {
return typeof window.comfyAPI !== 'undefined';
}