您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A Translation Script for Misskey Note | 一个用于misskey贴文的翻译脚本
// ==UserScript== // @name Misskey Translation Script // @namespace http://tampermonkey.net/ // @version 1.5 // @description A Translation Script for Misskey Note | 一个用于misskey贴文的翻译脚本 // @author dogcraft // @match https://m.dogcraft.cn/* // @grant none // ==/UserScript== var ApiUrl = 'https://test1-api.dogcraft.top/ts/'; (function () { 'use strict'; console.log('Misskey Translate Script v2.4'); var cat = localStorage.getItem('lang'); var vdog = localStorage.getItem('v'); if (cat == null) { var lang_dog = navigator.language || navigator.userLanguage; } else { lang_dog = cat; } //获取浏览器的语言 lang_dog = lang_dog.substr(0, 2); function dog_add_fy(eldog) { //添加翻译按钮、区域以及绑定点击事件 if (eldog.className == 'article') { dog_add_fy_old(eldog); return; } if (eldog.fanyi == 1) { // console.log('已经添加过了,重复添加。') } else { const dogbt = document.createElement('button'); const btclass = Array.from(eldog.getElementsByTagName('footer')).slice(- 1)[0].childNodes[1].getAttribute('class') dogbt.setAttribute('class', btclass); const nicon = document.createElement('i'); nicon.setAttribute('class', 'ti ti-language'); dogbt.appendChild(nicon); Array.from(eldog.getElementsByTagName('footer')).slice(- 1)[0].appendChild(dogbt); dogbt.addEventListener('click', dog_fy); //绑定翻译函数 const qhi = eldog.querySelector('div[style="container-type: inline-size;"]'); var ctp; var ctix; if (qhi != null) { ctp = qhi; ctix = qhi.getElementsByTagName('div')[0]; } else { const hui = eldog.childNodes[1].querySelector('span[style="white-space: pre-wrap;"]'); ctp = hui.parentElement.parentElement; ctix = hui.parentElement; } ctix.setAttribute('neko', 'fanyi-cont'); const fyc = document.createElement('div'); fyc.setAttribute('class', 'fanyi'); fyc.ct = 0; ctp.appendChild(fyc); eldog.fanyi = 1; } } function dog_add_fy_old(eldog) { if (eldog.fanyi == 1) { // console.log('已经添加过了,重复添加。') return; } const dogbt = document.createElement("button"); const btclass = Array.from(eldog.getElementsByTagName("footer")).slice(-1)[0].getElementsByClassName("button")[0].getAttribute("class") dogbt.setAttribute("class", btclass); const nicon = document.createElement("i"); nicon.setAttribute("class", "ti ti-language"); dogbt.appendChild(nicon); Array.from(eldog.getElementsByTagName("footer")).slice(-1)[0].appendChild(dogbt); dogbt.addEventListener('click', dog_fy);//绑定翻译函数 const ctdog = eldog.getElementsByClassName('content')[0]; const ydog = ctdog.getElementsByClassName('text')[0]; ydog.setAttribute("neko", "fanyi-cont"); const fyc = document.createElement("div"); fyc.setAttribute("class", "fanyi"); fyc.ct = 0; ctdog.appendChild(fyc); eldog.fanyi = 1; } async function dog_fy() { //从后端获得翻译文本并写入到html中 // console.log('翻译中'); const pdog = this.parentElement.parentElement; const ldog = pdog.getElementsByClassName('fanyi'); if (ldog) { const dog_fy_el = ldog[0]; if (dog_fy_el.ct == 0) { console.log('还没有翻译'); const hdog = pdog.querySelector('div[neko="fanyi-cont"]').innerText; post_dog = { 'c': hdog, 't': lang_dog }; dog_fy_el.innerText = '正在翻译中……'; uiy = await fetch(ApiUrl, { method: 'POST', body: JSON.stringify(post_dog), headers: new Headers({ 'Content-Type': 'application/json' }) }); if (uiy.status == 200) { rt = await uiy.json(); res_dog = rt.r; } else { res_dog = '接口不对劲'; } dog_fy_el.innerText = `${res_dog}`; dog_fy_el.style.cssText = " margin-top: 1em; border: dashed 2px;border-radius: 10px;padding: 16px;"; dog_fy_el.ct = 1 this.childNodes[0].setAttribute("class", "ti ti-language-off"); this.style = "color: red;"; } else { // console.log('已经翻译过了'); if (dog_fy_el.ct == 2) { dog_fy_el.style.display = ""; dog_fy_el.ct = 1; this.childNodes[0].setAttribute("class", "ti ti-language-off"); this.style = "color: red;"; } else if (dog_fy_el.ct == 1) { dog_fy_el.style.display = "none"; dog_fy_el.ct = 2; this.childNodes[0].setAttribute("class", "ti ti-language"); this.style = "color: blue;"; } } } else { console.log('有地方不对劲'); } } var config = { attributes: false, childList: true, subtree: true }; sj = [] // 当观察到突变时执行的回调函数 var callback = function (mutationsList) { mutationsList.forEach(function (item, index) { if (item.type == 'childList') { for (let iy_dog = 0; iy_dog < item.addedNodes.length; iy_dog++) { const iadog = item.addedNodes[iy_dog]; if (iadog.getElementsByTagName == undefined) { // console.log('不是元素'); } else { // console.log('是元素'); sld = iadog.getElementsByTagName('article'); if (sld.length > 0) { for (let ct_dog = 0; ct_dog < sld.length; ct_dog++) { const sdldog = sld[ct_dog]; if (sdldog.parentElement.tagName != "A") { dog_add_fy(sdldog); } else { // console.log('不是要找的元素'); } } } } } } }); }; function getar() { ar = document.getElementById('misskey_app'); if (ar == null) { console.log("没找到,等一秒"); setTimeout(getar, 1000); return null; } else { for (let si = 0; si < sl.length; si++) { const sl_dog = sl[si]; if (sl_dog.parentElement.tagName != "A") { dog_add_fy(sl_dog); } } console.log("找到了"); var observer = new MutationObserver(callback); observer.observe(ar, config); return "dog" } } window.onload = function () { console.log('页面加载完毕'); sl = document.getElementsByTagName('article'); getar(); } })();