您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
通过翻译服务器对游戏内球员名字进行汉化
当前为
// ==UserScript== // @name TMGeneralTranslation // @namespace https://trophymanager.com/ // @version 1.0.18 // @author 提瓦特元素反应(https://trophymanager.com/club/4731723/) // @description 通过翻译服务器对游戏内球员名字进行汉化 // @license MIT // @match https://trophymanager.com/* // @grant GM_xmlhttpRequest // @run-at document-end // ==/UserScript== var VERSION = "1.0.18" var DEBUG_MODE = true; var BACK_END = "https://trans.tm.kit.ga"; //let LOCAL = []; //空表示全部翻译 let WISH_LOCAL = ['cn', 'hk', 'jp', 'tw']; let LOCAL = JSON.parse(localStorage.getItem('LOCAL')) || WISH_LOCAL; var DEFAULT_COUNTRY = getCountry(document.querySelector('.top_user_info .clubs_block img').getAttribute('src')); function measureAjaxLoadTime(url, callback) { const startTime = performance.now(); // 请求开始的时间 GM_xmlhttpRequest({ method: 'GET', url: BACK_END, onload: function(response) { const endTime = performance.now(); // 请求完成的时间 let roundedLoadTime = endTime - startTime; // 计算加载时间 roundedLoadTime = Math.round(roundedLoadTime * 100) / 100; callback(roundedLoadTime); }, onerror: function(error) { console.error('请求出错:', error); } }); } (function() { 'use strict'; const newParagraph = document.createElement('a'); const switchButton = document.createElement('a'); const bodyEndElement = document.querySelector('.body_end'); if (bodyEndElement && bodyEndElement.firstChild) { measureAjaxLoadTime(BACK_END, function(roundedLoadTime){ newParagraph.textContent = 'TMGT已启动,有翻译错误/不满意/BUG/请联系作者 翻译服务器连接耗时:'+ roundedLoadTime + "ms"; switchButton.textContent = `调整翻译国/地区籍 (Current: ${LOCAL.length === 0 ? "ALL" : LOCAL})`; switchButton.href = '#'; switchButton.addEventListener('click', function(event) { event.preventDefault(); // 阻止默认链接行为 // 切换 LOCAL 的值 if (LOCAL.length === 0) { LOCAL = WISH_LOCAL; } else { LOCAL = []; } // 将新值保存到 localStorage localStorage.setItem('LOCAL', JSON.stringify(LOCAL)); // 重新加载 location.reload(); }); newParagraph.href = 'https://qm.qq.com/q/QIo7VakoYW' document.querySelector('.body_end').insertBefore(newParagraph, document.querySelector('.body_end').firstChild); document.querySelector('.body_end').insertBefore(document.createElement('br'), document.querySelector('.body_end').firstChild); document.querySelector('.body_end').insertBefore(switchButton, document.querySelector('.body_end').firstChild); }) } })(); function getCountry(str){ if(str.includes('flag of') && str.split(' ').length >= 3){ return str.split(' ')[2]; } if(str.includes('/pics/flags/gradient/') && str.split('/').length >= 5){ return str.split('/')[4].split('.')[0]; } if(str.includes('/national-teams/') && str.split('/').length >= 4){ return str.split('/')[2]; } } // 请求翻译 function translateNumbers(players, callback, update) { players = players.filter(item => item.ID !== null && item.English !== null && item.English !== undefined && !item.English.includes('@')); let copyPlayers = []; for(let i = 0; i < players.length; i++){ let player = {} if(filterCosName(players[i].English) !== ''){ player.English = filterName(players[i].English); } else { player.English = players[i].English; } player.ID = players[i].ID player.Country = players[i].Country copyPlayers.push(player); } // 将输入的整数数组转换为JSON字符串 const jsonData = JSON.stringify({"version": VERSION, "data": copyPlayers, "update":update, "local": LOCAL}); // console.log(jsonData); // 发送 POST 请求 GM_xmlhttpRequest({ method: "POST", url: BACK_END + "/translate", data: jsonData, headers: { "Content-Type": "application/json" }, onload: function(response) { // 解析返回的 JSON 数据 const responseData = JSON.parse(response.responseText); // 获取翻译结果数组 callback(responseData); } }); } // 请求上传 function updateTranslation(player){ let jsonData = JSON.stringify(player); // console.log(jsonData); GM_xmlhttpRequest({ method: "POST", url: BACK_END + "/update-player", data: jsonData, headers: { "Content-Type": "application/json" }, onload: function(response) { console.log("Response received: ", response.responseText); alert("更新完成:" + response.responseText); location.reload(); }, onerror: function(error) { console.error("Error occurred: ", error); } }); } function filterName(name){ if(name.split('\'').length === 3){ return name.split('\'')[0] + name.split('\'')[2]; } return name; } function filterCosName(name){ if(name.split('\'').length === 3){ return name.split('\'')[1]; } return ''; } // 球员详情 (function() { 'use strict'; if (window.location.pathname === '/players' || window.location.pathname === '/players/' || !window.location.pathname.includes('/players/')) { return; } var player = {}; // 检查国籍 player.Country = getCountry(document.querySelector('.box_sub_header .country_link ib').getAttribute('alt')); // 查找包含 id 的元素 const element = document.querySelector('#change_player_link'); // 遍历每个元素并提取 id if(element.getAttribute('onclick').split(',').length === 3 && element.getAttribute('onclick').split(',')[0].split('(').length === 2){ player.ID = parseInt(element.getAttribute('onclick').split(',')[0].split('(')[1]); player.English = document.querySelector("div.large").querySelector("strong").textContent.split(". ")[1]; } else { return; } // 找到具有 'large' 类的 <div>,然后选择第一个 <strong> 元素 var largeDiv = document.querySelector("div.large"); if (largeDiv) { var strongElement = largeDiv.querySelector("strong"); if (strongElement) { // 修改 <strong> 的文本内容 // 调用函数并传入整数数组作为参数 translateNumbers([player], function(translations) { if(filterCosName(player.English) !== ''){ strongElement.textContent = '\'' + filterCosName(player.English) + '\' '+ translations[0].Chinese; } else { strongElement.textContent = document.querySelector("div.large").querySelector("strong").textContent.split(". ")[0] + ". " + translations[0].Chinese; } }, true); } } })(); // 战术-列表 (function() { 'use strict'; if (!(window.location.pathname.includes('/tactics'))) { return; } let translationsResult = ''; function modifyNamesAndExtractIdsForNames() { var players = []; document.querySelectorAll("span.player_name").forEach(element => { var player = {}; // 检查国籍 let parent = element.parentElement; if(parent.querySelectorAll('ib').length !== 0){ player.Country = getCountry(parent.querySelector('ib').getAttribute('alt')); } else { player.Country = DEFAULT_COUNTRY; } player.English = element.textContent; player.ID = parseInt(element.getAttribute("player_id")); players.push(player); }); document.querySelectorAll('.field_player_name').forEach(element => { var player = {}; if (element.firstChild && element.firstChild.nodeType === Node.TEXT_NODE) { player.English = element.firstChild.nodeValue; } // 检查国籍 let parent = element.parentElement; if(parent.querySelectorAll('ib').length !== 0){ player.Country = getCountry(parent.querySelector('ib').getAttribute('alt')); } else { player.Country = DEFAULT_COUNTRY; } const parentDiv = element.closest('.field_player'); if (parentDiv) { player.ID = parseInt(parentDiv.getAttribute('player_id')); } players.push(player); }); document.querySelectorAll('.bench_player_name').forEach(element => { var player = {}; if (element.firstChild && element.firstChild.nodeType === Node.TEXT_NODE) { player.English = element.firstChild.nodeValue; } // 检查国籍 let parent = element.parentElement; if(parent.querySelectorAll('ib').length !== 0){ player.Country = getCountry(parent.querySelector('ib').getAttribute('alt')); } else { player.Country = DEFAULT_COUNTRY; } const parentLi = element.closest('li.bench_player'); if (parentLi) { player.ID = parseInt(parentLi.getAttribute('player_id')); } players.push(player); }); function startTrans(translations){ document.querySelectorAll("span.player_name").forEach(element => { translations.forEach(function(translation) { if (translation.ID === parseInt(element.getAttribute("player_id"))) { element.textContent = translation.Chinese; } }) }); document.querySelectorAll('.field_player_name').forEach(element => { const parentDiv = element.closest('.field_player'); if (parentDiv) { translations.forEach(function(translation) { if (translation.ID === parseInt(parentDiv.getAttribute('player_id'))) { if (element.firstChild && element.firstChild.nodeType === Node.TEXT_NODE) { element.firstChild.nodeValue = translation.Chinese; } } }) } }); document.querySelectorAll('.bench_player_name').forEach(element => { const parentLi = element.closest('li.bench_player'); if (parentLi) { translations.forEach(function(translation) { if (translation.ID === parseInt(parentLi.getAttribute('player_id'))) { if (element.firstChild && element.firstChild.nodeType === Node.TEXT_NODE) { element.firstChild.nodeValue = translation.Chinese; } } }) } }); document.querySelectorAll('.cond_order div[player_link]').forEach(element => { translations.forEach(function(translation) { if (translation.ID === parseInt(element.getAttribute('player_link'))) { element.textContent = translation.Chinese; } }) }); } if(translationsResult !== ''){ startTrans(translationsResult); } else { translateNumbers(players, function(translations) { translationsResult = translations; startTrans(translationsResult); }, true); } } function modifyNamesForSubstitute() { let translations = translationsResult; document.querySelectorAll('.parm_select.player_select').forEach(element => { translations.forEach(function(translation) { if (translation.ID === parseInt(element.getAttribute('player_link'))) { element.firstChild.nodeValue = translation.Chinese; // 修改第一个文本节点内容 } }) }); } // 监控特定元素并应用回调函数 function bindObserver(selector, callback) { const elements = document.querySelectorAll(selector); elements.forEach(element => { // 创建一个 MutationObserver 实例并应用给定的回调 const observer = new MutationObserver(callback); observer.observe(element, { childList: true }); }); } // 处理 DOM 变化的函数 const handleMutations = mutations => { mutations.forEach(mutation => { // 检查新增的节点 mutation.addedNodes.forEach(node => { if (node.id === 'popup_action' || node.matches && node.matches('#popup_action')) { modifyNamesForSubstitute(); } }); }); }; bindObserver('#tactics_list_list', modifyNamesAndExtractIdsForNames); bindObserver('#cond_orders_list', modifyNamesAndExtractIdsForNames); // 创建全局观察者来监控元素的删除和重建 const globalObserver = new MutationObserver(handleMutations); globalObserver.observe(document.body, { childList: true, subtree: true }); })(); // 其他球队 && 工资 && 联赛最佳/统计 (function() { 'use strict'; if (!( window.location.pathname === '/finances/wages' || window.location.pathname === '/finances/wages/' || window.location.pathname.includes('/league/team-of-the-round') || window.location.pathname.includes('/statistics/league') || window.location.pathname.includes('/club/') || window.location.pathname.includes('/national-teams/') )) { return; } var players = []; var links = []; let canUpdate = (!window.location.pathname.includes('/club/') && !window.location.pathname.includes('/league/team-of-the-round') && !window.location.pathname.includes('/national-teams/')) || (window.location.pathname.includes('/club/') && (window.location.pathname.includes('squad/') || window.location.pathname.includes('statistics/'))); let defaultCountry = (window.location.pathname.includes('/club/')) ? getCountry(document.querySelector(".box_sub_header a.country_link").getAttribute("href")) : DEFAULT_COUNTRY; defaultCountry = window.location.pathname.includes('/national-teams/') ? getCountry(document.querySelector(".box_sub_header ib").getAttribute("alt")) : defaultCountry; document.querySelectorAll("a[player_link]").forEach(function(element) { var link = element; var player = {}; // 检查国籍 let parent = element.parentElement; player.Country = defaultCountry; parent.querySelectorAll(`img[src]`).forEach(function(img){ if(img.getAttribute("src").includes('/pics/flags/gradient/')){ player.Country = getCountry(img.getAttribute("src")); } if(img.getAttribute("src").includes('/pics/flags/gradient/')){ player.Country = getCountry(img.getAttribute("src")); } }) parent.querySelectorAll(`a[href]`).forEach(function(a){ if(a.getAttribute("href").includes('/national-teams/')){ player.Country = getCountry(a.getAttribute("href")); } if(a.getAttribute("href").includes('/national-teams/')){ player.Country = getCountry(a.getAttribute("href")); } }) if (link) { player.English = link.textContent; player.ID = parseInt(link.getAttribute("player_link")); players.push(player) links.push(link); } }); translateNumbers(players, function(translations) { links.forEach(function(link) { translations.forEach(function(translation) { if (translation.ID === parseInt(link.getAttribute("player_link"))) { if(filterCosName(link.textContent) !== ''){ link.textContent = '\'' + filterCosName(link.textContent) + '\' '+ translation.Chinese; } else { link.textContent = translation.Chinese; } } }) }); }, canUpdate); })(); function createTooltip(message) { const tooltip = document.createElement('div'); tooltip.className = 'custom-tooltip'; tooltip.textContent = message; tooltip.style.position = 'absolute'; tooltip.style.backgroundColor = '#333'; tooltip.style.color = '#fff'; tooltip.style.padding = '5px'; tooltip.style.borderRadius = '3px'; tooltip.style.zIndex = '1000'; tooltip.style.visibility = 'hidden'; document.body.appendChild(tooltip); return tooltip; } function addHoverTooltip(element, message) { const tooltip = createTooltip(message); element.onmouseover = function(event) { tooltip.style.left = event.pageX + 'px'; tooltip.style.top = event.pageY + 'px'; tooltip.style.visibility = 'visible'; }; element.onmouseout = function() { tooltip.style.visibility = 'hidden'; }; } function createPopup(player_id) { const popup = document.createElement('div'); popup.style.border = '2px solid #000000'; popup.setAttribute('tabindex', '-1'); popup.style.position = 'absolute'; popup.style.display = 'none'; popup.style.backgroundColor = '#41631F'; const inputTitle = document.createElement('a'); inputTitle.textContent = '修改翻译:'; inputTitle.style.textDecoration = 'none'; // 禁用默认下划线 inputTitle.onmouseover = () => {inputTitle.style.textDecoration = 'none'}; inputTitle.onmouseleave = () => {inputTitle.style.textDecoration = 'none'}; addHoverTooltip(inputTitle, '请确保你的翻译没有违背球员姓名的意思,禁止绰号/别名'); const input = document.createElement('input'); input.type = 'text'; input.style.borderBottom = '3px solid black'; input.style.backgroundColor = '#41631F'; input.style.padding = '3px'; input.style.color = 'white'; input.style.fontFamily = ' Tahoma, Verdana, sans-serif'; input.style.fontWeight = 'normal'; input.style.border = 'none'; const confirmBtn = document.createElement('a'); confirmBtn.style = 'padding: 3px;'; confirmBtn.textContent = '确认'; confirmBtn.onclick = () => { let player = {} player.ID = player_id; player.Chinese = input.value; updateTranslation(player); }; const closeBtn = document.createElement('a'); closeBtn.style = 'padding: 3px;'; closeBtn.textContent = '取消'; closeBtn.onclick = () => {popup.style.display = 'none'}; popup.appendChild(inputTitle); popup.appendChild(input); popup.appendChild(confirmBtn); popup.appendChild(closeBtn); return popup; } function addEditButton(element, player_id){ element.parentNode.style.position = 'relative'; const img = document.createElement('img'); img.src = 'data:image/png;base64,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'; img.width="20"; img.style.position = 'absolute'; img.style.top = '3px'; img.style.cursor = 'pointer'; img.onclick = (event) => { const popup = element.parentNode.querySelector('.notification_content') || createPopup(player_id); // 获取按钮的位置 const rect = img.getBoundingClientRect(); popup.style.top = rect.top + window.scrollY - 3 + 'px'; popup.style.left = rect.right + window.scrollX + 'px'; popup.style.display = 'block'; document.body.appendChild(popup); }; element.parentNode.appendChild(img); } // 球员列表 (function() { 'use strict'; if (!( window.location.pathname === '/players' || window.location.pathname === '/players/' )) { return; } var players = []; var links = []; let canUpdate = (!window.location.pathname.includes('/club/') && !window.location.pathname.includes('/league/team-of-the-round')) || (window.location.pathname.includes('/club/') && (window.location.pathname.includes('squad/') || window.location.pathname.includes('statistics/'))); let defaultCountry = window.location.pathname.includes('/club/') ? getCountry(document.querySelector(".box_sub_header a.country_link").getAttribute("href")) : DEFAULT_COUNTRY; let translationsResult = ""; let firstLoad = true; document.querySelector("#toggle_b_team").addEventListener('click', function(event) { if(document.querySelector("#toggle_b_team img").getAttribute("src") == "/pics/sort_btn_gray_on.gif" && firstLoad){ location.reload(); } firstLoad = false; }); function startTranslate(){ document.querySelectorAll("a[player_link]").forEach(function(element) { var link = element; var player = {}; // 检查国籍 let parent = element.parentElement; player.Country = defaultCountry; parent.querySelectorAll(`img[src]`).forEach(function(img){ if(img.getAttribute("src").includes('/pics/flags/gradient/')){ player.Country = getCountry(img.getAttribute("src")); } if(img.getAttribute("src").includes('/pics/flags/gradient/')){ player.Country = getCountry(img.getAttribute("src")); } }) parent.querySelectorAll(`a[href]`).forEach(function(a){ if(a.getAttribute("href").includes('/national-teams/')){ player.Country = getCountry(a.getAttribute("href")); } if(a.getAttribute("href").includes('/national-teams/')){ player.Country = getCountry(a.getAttribute("href")); } }) if (link) { player.English = link.textContent; player.ID = parseInt(link.getAttribute("player_link")); players.push(player) links.push(link); } }); if(translationsResult == ""){ translateNumbers(players, function(translations) { translationsResult = translations; links.forEach(function(link) { translations.forEach(function(translation) { if (translation.ID === parseInt(link.getAttribute("player_link"))) { link.textContent = translation.Chinese; addEditButton(link, parseInt(link.getAttribute("player_link"))); } }) }); }, canUpdate); } else { let translations = translationsResult; links.forEach(function(link) { translations.forEach(function(translation) { if (translation.ID === parseInt(link.getAttribute("player_link"))) { link.textContent = translation.Chinese; } }) }); }} // Mutation Observer 实例化 const mutationObserver = new MutationObserver((mutations) => { startTranslate(); }); // 监视整个文档的变化 mutationObserver.observe(document.querySelector('#sq'), { childList: true, subtree: true, }); startTranslate(); })(); // 转会 (function() { 'use strict'; if (!( window.location.pathname.includes('/transfer') )) { return; } var players = []; var links = []; // Mutation Observer 实例化 const mutationObserver = new MutationObserver((mutations) => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node.matches && node.matches('table')) { document.querySelectorAll("#transfer_list a[player_link]").forEach(function(element) { var link = element; // 检查国籍 var player = {}; if(true){ let parent = element.parentElement.parentElement.parentElement; player.Country = getCountry(parent.querySelector('ib').getAttribute("alt")); } if (link) { player.English = link.textContent; player.ID = parseInt(link.getAttribute("player_link")); players.push(player) links.push(link); } }); translateNumbers(players, function(translations) { links.forEach(function(link) { translations.forEach(function(translation) { if (translation.ID === parseInt(link.getAttribute("player_link"))) { link.textContent = translation.Chinese; } }) }); }, true); } }); }); }); // 监视整个文档的变化 mutationObserver.observe(document.querySelector('#transfer_list'), { childList: true, subtree: true, }); })(); // 训练 (function() { 'use strict'; if (!( window.location.pathname === '/training/' || window.location.pathname === '/training' )) { return; } let translationResults = ""; function transTrain(){ let players = []; let links = []; document.querySelectorAll(".team .player").forEach(function(element) { var link = element; if (link) { var player = {}; player.English = link.querySelector(".player_name").textContent; player.ID = parseInt(link.getAttribute("player_link")); players.push(player) links.push(link); } }); if(translationResults !== ""){ let translations = translationResults; links.forEach(function(link) { translations.forEach(function(translation) { if (translation.ID === parseInt(link.getAttribute("player_link"))) { link.querySelector(".player_name").textContent = translation.Chinese; } }) }) } else { translateNumbers(players, function(translations) { links.forEach(function(link) { translations.forEach(function(translation) { if (translation.ID === parseInt(link.getAttribute("player_link"))) { link.querySelector(".player_name").textContent = translation.Chinese; } }) }); }, false); } } // 监控特定元素并应用回调函数 function bindObserver(selector, callback) { const elements = document.querySelectorAll(selector); elements.forEach(element => { // 创建一个 MutationObserver 实例并应用给定的回调 const observer = new MutationObserver(callback); observer.observe(element, { childList: true }); }); } // Mutation Observer 实例化 const mutationObserver = new MutationObserver((mutations) => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node.matches && node.matches('#team1, #team2, #team3, #team4, #team5, #team6, #team7')) { if(document.querySelectorAll("#team1, #team2, #team3, #team4, #team5, #team6, #team7").length === 7){ bindObserver("#team1, #team2, #team3, #team4, #team5, #team6, #team7", transTrain); setTimeout(function(){ transTrain(); }, 1000); } } }); }); }); // 监视整个文档的变化 mutationObserver.observe(document.querySelector(".training"), { childList: true, subtree: true, }); })(); // 主页 && 俱乐部 && 联赛 (function() { 'use strict'; if (!(window.location.pathname === '/home/'|| window.location.pathname === '/home'|| window.location.pathname.includes('/club')|| window.location.pathname === '/league' || window.location.pathname === '/league/' )) { return; } function transBox(){ var players = []; var links = []; document.querySelectorAll(".box_body span[onclick]").forEach(function(element) { var link = element; if (link && link.getAttribute("onclick").split('/').length === 5) { var player = {}; player.English = link.textContent; player.ID = parseInt(link.getAttribute("onclick").split('/')[4]); players.push(player) links.push(link); } }); translateNumbers(players, function(translations) { links.forEach(function(link) { translations.forEach(function(translation) { if (translation.ID === parseInt(link.getAttribute("onclick").split('/')[4])) { link.textContent = translation.Chinese; } }) }); }, false); } // Mutation Observer 实例化 const mutationObserver = new MutationObserver((mutations) => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node.matches && node.matches('#feed .feed_content')) { setTimeout(function(){ let players = []; let links = []; document.querySelectorAll("a[player_link]").forEach(function(element) { let link = element; if (link) { let player = {}; player.English = link.textContent; player.ID = parseInt(link.getAttribute("player_link")); players.push(player) links.push(link); } }); translateNumbers(players, function(translations) { links.forEach(function(link) { translations.forEach(function(translation) { if (translation.ID === parseInt(link.getAttribute("player_link"))) { link.textContent = translation.Chinese; } }) }); }, false); }, 800); } if (node.matches && node.matches('.column3_a .box:nth-of-type(2)')) { setTimeout(function(){ transBox(); }, 800); } }); }); }); // 监视整个文档的变化 mutationObserver.observe(document.body, { childList: true, subtree: true, }); })(); // 关注名单 (function() { 'use strict'; if (!( window.location.pathname.includes('/shortlist') )) { return; } let players = []; let links = []; document.querySelectorAll("a[player_link]").forEach(function(link) { let parent = link.parentElement.parentElement.parentElement; // 检查国籍 let player = {}; parent.querySelectorAll("img[src]").forEach(function(img) { if(img.getAttribute('src').includes("/pics/flags/gradient")){ player.Country = getCountry(img.getAttribute('src')); } }) player.English = link.textContent; player.ID = parseInt(link.getAttribute("player_link")); players.push(player) links.push(link); }); translateNumbers(players, function(translations) { links.forEach(function(link) { translations.forEach(function(translation) { if (translation.ID === parseInt(link.getAttribute("player_link"))) { link.textContent = translation.Chinese; } }) }); }, true); })(); // 当前竞价 (function() { 'use strict'; if (!( window.location.pathname.includes('/bids') )) { return; } // Mutation Observer 实例化 const mutationObserver = new MutationObserver((mutations) => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node.matches && node.matches('div')) { let players = []; let links = []; document.querySelectorAll("a[player_link]").forEach(function(link) { let parent = link.parentElement; let player = {}; parent.querySelectorAll("a[href]").forEach(function(a) { if(a.getAttribute('href').includes('/national-teams/')){ player.Country = getCountry(a.getAttribute('href')); } }) player.English = link.textContent; player.ID = parseInt(link.getAttribute("player_link")); players.push(player) links.push(link); }); translateNumbers(players, function(translations) { links.forEach(function(link) { translations.forEach(function(translation) { if (translation.ID === parseInt(link.getAttribute("player_link"))) { link.textContent = translation.Chinese; } }) }); }, true); } }); }); }); // 监视整个文档的变化 mutationObserver.observe(document.querySelector('.column2_c .box_body .transfer-box'), { childList: true, subtree: true, }); })(); // 比赛 (function() { 'use strict'; if (!(window.location.pathname.includes('/matches/') )) { return; } function translateBoard(){ let players = []; let links = []; document.querySelectorAll("a.normal.no_hover").forEach(function(element) { var link = element; if (link) { var player = {}; player.English = link.querySelector('.name').textContent; player.ID = parseInt(link.getAttribute("href").split('/')[2]); players.push(player) links.push(link); } }); translateNumbers(players, function(translations) { links.forEach(function(link) { translations.forEach(function(translation) { if (translation.ID === parseInt(link.getAttribute("href").split('/')[2])) { if(link.querySelector('.name').textContent.split('.').length > 1 && '9' >= link.querySelector('.name').textContent.split('.')[0][0] && link.querySelector('.name').textContent.split('.')[0][0] >= '0'){ link.querySelector('.name').textContent = link.querySelector('.name').textContent.split('.')[0] + ". " + translation.Chinese; } else { link.querySelector('.name').textContent = translation.Chinese; } } }) }); }, false); } function translateQuestionable(){ let players = []; let links = []; document.querySelectorAll("a.white.normal").forEach(function(element) { var link = element; if (link) { var player = {}; player.English = link.textContent; player.ID = parseInt(link.getAttribute("href").split('/')[2]); players.push(player) links.push(link); } }); translateNumbers(players, function(translations) { links.forEach(function(link) { translations.forEach(function(translation) { if (translation.ID === parseInt(link.getAttribute("href").split('/')[2])) { link.textContent = translation.Chinese; } }) }); }, false); } function translateReport(){ let players = []; let ids = new Set(); let links = []; document.querySelectorAll(".report_list a[href], .event_list a[href]").forEach(function(element) { var link = element; if (link.getAttribute("href").split('/').length === 3) { var player = {}; player.ID = parseInt(link.getAttribute("href").split('/')[2]); player.English = link.textContent; if(!ids.has(parseInt(link.getAttribute("href").split('/')[2]))){ ids.add(player.ID); players.push(player) } links.push(link); } }); translateNumbers(players, function(translations) { links.forEach(function(link) { translations.forEach(function(translation) { if (translation.ID === parseInt(link.getAttribute("href").split('/')[2])) { link.textContent = translation.Chinese; } }) }); }, false); } // Mutation Observer 实例化 const mutationObserver = new MutationObserver((mutations) => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { // Mutation Observer 实例化 if (node.matches && (node.matches('div[tab="field"]'))) { translateBoard(); translateQuestionable(); } if (node.matches && node.matches('.post_report')) { setTimeout(function(){ translateBoard(); translateQuestionable(); translateReport(); }, 800); } }); }); }); // 监视整个文档的变化 mutationObserver.observe(document.body, { childList: true, subtree: true, }); })();