(node)
| 916 | } |
| 917 | |
| 918 | function translate(node) { |
| 919 | let model = util.getValue('model') |
| 920 | |
| 921 | if (!node.innerText.trim()) return; // 空文本,跳过 |
| 922 | |
| 923 | // 检测语言类型,如果是中文则不翻译 |
| 924 | baiduDetectLang(node.innerText).then(lang => { |
| 925 | if (lang === langManager.getTo()) return; // 与目标语言相同,不翻译 |
| 926 | |
| 927 | // 如果是机器翻译,则翻译 outerHTML,否则递归获取文本 |
| 928 | let origin = isMachineTrans(model) ? node.outerHTML : getTextWithNode(node); |
| 929 | |
| 930 | let spinner = createLoadingSpinner(node); // 插入转圈动画 |
| 931 | let timeout = setTimeout(() => { |
| 932 | createFailedTip(node, new Error(errorManager.netError).toString(), spinner); |
| 933 | }, 60000); |
| 934 | |
| 935 | // 调用翻译服务 |
| 936 | transModelFn[model](origin).then(text => { |
| 937 | |
| 938 | clearTimeout(timeout) // 取消超时 |
| 939 | spinner.remove() // 移除 spinner |
| 940 | |
| 941 | // console.log("翻译前的句子:", origin); |
| 942 | // console.log("翻译后的句子:", text); |
| 943 | |
| 944 | if (!text || origin === text) return; |
| 945 | |
| 946 | let oldOuterHtml = node.outerHTML // 保存旧的 outerHTML |
| 947 | |
| 948 | let newOuterHtml = text |
| 949 | if (isMachineTrans(model)) { |
| 950 | // 机器翻译 |
| 951 | if (!node.parentNode) return; |
| 952 | let fn = compatFn[url.host]; |
| 953 | if (fn) { |
| 954 | oldOuterHtml = node.outerHTML; |
| 955 | fn(node, text); |
| 956 | newOuterHtml = node.outerHTML; |
| 957 | } else { |
| 958 | node.outerHTML = safeFluentRead ? safeFluentRead.createHTML(text) : text; |
| 959 | } |
| 960 | } else { |
| 961 | // LLM 翻译 |
| 962 | node.innerHTML = safeFluentRead ? safeFluentRead.createHTML(text) : text; |
| 963 | newOuterHtml = node.outerHTML; |
| 964 | } |
| 965 | |
| 966 | localStorageManager.setTransCache(oldOuterHtml, newOuterHtml); // 设置缓存 |
| 967 | // 延迟 newOuterHtml,删除 oldOuterHtml |
| 968 | delayRemoveCache(newOuterHtml); |
| 969 | outerHTMLSet.delete(oldOuterHtml); |
| 970 | }).catch(e => { |
| 971 | console.log(e) |
| 972 | clearTimeout(timeout); |
| 973 | createFailedTip(node, e.toString() || errorManager.unknownError, spinner); |
| 974 | }) |
| 975 | }).catch(e => { |
no test coverage detected