mirror of
https://mirror.ghproxy.com/https://github.com/CxJuice/ScWeb_Chinese_Translate.git
synced 2024-12-23 00:23:44 +08:00
Create userscript.js
This commit is contained in:
parent
a1f08db380
commit
d74aa9b4bf
182
userscript.js
Normal file
182
userscript.js
Normal file
@ -0,0 +1,182 @@
|
||||
// ==UserScript==
|
||||
// @name UEX汉化脚本
|
||||
// @namespace Violentmonkey Scripts
|
||||
// @match https://uexcorp.space/*
|
||||
// @grant none
|
||||
// @version 0.2
|
||||
// @author CxJuice
|
||||
// @description 2022/7/28 12:48:01
|
||||
|
||||
// ==/UserScript==
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
const SUPPORT_LANG = ["zh-CN", "ja"];
|
||||
const lang = (navigator.language || navigator.userLanguage);
|
||||
const locales = getLocales(lang)
|
||||
|
||||
translateByCssSelector();
|
||||
translateDesc();
|
||||
traverseElement(document.body);
|
||||
watchUpdate();
|
||||
|
||||
function getLocales(lang) {
|
||||
if(lang.startsWith("zh")) { // zh zh-TW --> zh-CN
|
||||
lang = "zh-CN";
|
||||
}
|
||||
if(SUPPORT_LANG.includes(lang)) {
|
||||
return JSON.parse(GM_getResourceText(lang));
|
||||
}
|
||||
return {
|
||||
css: [],
|
||||
dict: {}
|
||||
};
|
||||
}
|
||||
|
||||
function translateRelativeTimeEl(el) {
|
||||
const datetime = $(el).attr('datetime');
|
||||
$(el).text(timeago.format(datetime, lang.replace('-', '_')));
|
||||
}
|
||||
|
||||
function translateElement(el) {
|
||||
// Get the text field name
|
||||
let k;
|
||||
if(el.tagName === "INPUT") {
|
||||
if (el.type === 'button' || el.type === 'submit') {
|
||||
k = 'value';
|
||||
} else {
|
||||
k = 'placeholder';
|
||||
}
|
||||
} else {
|
||||
k = 'data';
|
||||
}
|
||||
|
||||
const txtSrc = el[k].trim();
|
||||
const key = txtSrc.toLowerCase()
|
||||
.replace(/\xa0/g, ' ') // replace ' '
|
||||
.replace(/\s{2,}/g, ' ');
|
||||
|
||||
if(locales.dict[key]) {
|
||||
el[k] = el[k].replace(txtSrc, locales.dict[key])
|
||||
}
|
||||
}
|
||||
|
||||
function shoudTranslateEl(el) {
|
||||
const blockIds = ["readme", "wiki-content"];
|
||||
const blockClass = [
|
||||
"CodeMirror",
|
||||
"css-truncate" // 过滤文件目录
|
||||
];
|
||||
const blockTags = ["CODE", "SCRIPT", "LINK", "IMG", "svg", "TABLE", "ARTICLE", "PRE"];
|
||||
|
||||
if(blockTags.includes(el.tagName)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(el.id && blockIds.includes(el.id)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(el.classList) {
|
||||
for(let clazz of blockClass) {
|
||||
if(el.classList.contains(clazz)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function traverseElement(el) {
|
||||
if(!shoudTranslateEl(el)) {
|
||||
return
|
||||
}
|
||||
|
||||
for(const child of el.childNodes) {
|
||||
if(["RELATIVE-TIME", "TIME-AGO"].includes(el.tagName)) {
|
||||
translateRelativeTimeEl(el);
|
||||
return;
|
||||
}
|
||||
|
||||
if(child.nodeType === Node.TEXT_NODE) {
|
||||
translateElement(child);
|
||||
}
|
||||
else if(child.nodeType === Node.ELEMENT_NODE) {
|
||||
if(child.tagName === "INPUT") {
|
||||
translateElement(child);
|
||||
} else {
|
||||
traverseElement(child);
|
||||
}
|
||||
} else {
|
||||
// pass
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function watchUpdate() {
|
||||
const m = window.MutationObserver || window.WebKitMutationObserver;
|
||||
const observer = new m(function (mutations, observer) {
|
||||
for(let mutationRecord of mutations) {
|
||||
for(let node of mutationRecord.addedNodes) {
|
||||
traverseElement(node);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
observer.observe(document.body, {
|
||||
subtree: true,
|
||||
characterData: true,
|
||||
childList: true,
|
||||
});
|
||||
}
|
||||
|
||||
// translate "about"
|
||||
function translateDesc() {
|
||||
$(".repository-content .f4").append("<br/>");
|
||||
$(".repository-content .f4").append("<a id='translate-me' href='#' style='color:rgb(27, 149, 224);font-size: small'>翻译</a>");
|
||||
$("#translate-me").click(function() {
|
||||
// get description text
|
||||
const desc = $(".repository-content .f4")
|
||||
.clone()
|
||||
.children()
|
||||
.remove()
|
||||
.end()
|
||||
.text()
|
||||
.trim();
|
||||
|
||||
if(!desc) {
|
||||
return;
|
||||
}
|
||||
|
||||
GM_xmlhttpRequest({
|
||||
onload: function(res) {
|
||||
if (res.status === 200) {
|
||||
$("#translate-me").hide();
|
||||
// render result
|
||||
const text = res.responseText;
|
||||
$(".repository-content .f4").append("<span style='font-size: small'>TK翻译</span>");
|
||||
$(".repository-content .f4").append("<br/>");
|
||||
$(".repository-content .f4").append(text);
|
||||
} else {
|
||||
alert("翻译失败");
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function translateByCssSelector() {
|
||||
if(locales.css) {
|
||||
for(var css of locales.css) {
|
||||
if($(css.selector).length > 0) {
|
||||
if(css.key === '!html') {
|
||||
$(css.selector).html(css.replacement);
|
||||
} else {
|
||||
$(css.selector).attr(css.key, css.replacement);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
})();
|
Loading…
Reference in New Issue
Block a user