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();
}
})();