TMGeneralTranslation

通过翻译服务器对游戏内球员名字进行汉化

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         TMGeneralTranslation
// @namespace    https://trophymanager.com/
// @version      1.0.20
// @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.20"
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);

    // 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);
            console.log(responseData);

            // 获取翻译结果数组
            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;

    if(document.querySelector("#toggle_b_team") != undefined){
        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,
    });
})();