HLV中文化

手动替换一些HLTV数据页容易被错误机翻的词汇

目前為 2025-02-12 提交的版本,檢視 最新版本

// ==UserScript==
// @name         HLV中文化
// @namespace    http://tampermonkey.net/
// @version      1.2.1
// @license      MIT
// @description  手动替换一些HLTV数据页容易被错误机翻的词汇
// @author       ST
// @match        https://www.hltv.org/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 词典
    const dictionary = {
        // 地图翻译
        'Dust2': '沙漠2',
        'Dust 2': '沙漠2',
        'Inferno': '炼狱小镇',
        'Mirage': '荒漠迷城',
        'Nuke': '核子危机',
        'Overpass': '死亡游乐园',
        'Vertigo': '殒命大厦',
        'Ancient': '远古遗迹',
        'Train': '列车停放站',
        'Cache': '仓库',
        'Anubis':'阿努比斯',

        // 大洲名称
        'Grouped events':'各地区赛事日历',
        'Location':'地区',
        'Asia': '亚洲',
        'AS': '亚洲',
        'Europe': '欧洲',
        'EU': '欧洲',
        'North America': '北美洲',
        'NA': '北美洲',
        'South America': '南美洲',
        'SA': '南美洲',
        'Oceania': '大洋洲',
        'OCE': '大洋洲',
        'Africa': '非洲',
        'AF': '非洲',
        'Pacific':'太平洋',
        'Asia-Pacific':'亚太地区',

        // 赛事相关
        'Group': '小组赛',
        'Playoffs': '季后赛',
        'Qualifier': '预选赛',
        'Grand Final': '总决赛',
        'Closed': '封闭',
        'Prize pool':'总奖金',
        'Date':'日期',
        'Teams':'战队',
        'Related events':'关联赛事',
        'Formats':"安排",
        'Group stage':'小组赛阶段',
        'the Upper bracket':'胜者组',
        'the Lower bracket':'败者组',
        'Upper bracket':'胜者组',
        'Lower bracket':'败者组',        
        'Double elimination':'双败',
        'with 1-0 map advantage for':'图一直接获胜对于',
        'places go to':'名前往',
        'semi-finals':'半决赛',
        'quarter-finals':'1/4决赛',
        'Round 1':'第一轮',
        'Round-robin':'循环赛',
        'Matches, past 3 months':'过去3个月对战数据',

        // 导航菜单
        'Ranking': '战队排名',
        'Matches': '赛事列表',
        'Stats': '数据统计',
        'Events': '赛事日历',
        'Results': '赛果速递',
        'Galleries': '赛事图集',
        'Overview': '概览',
        'Detailed':'详细的',
        

        // 比赛数据
        'KD diff': '击杀差',
        'Kills': '击杀数',
        'Headshot %': '爆头率',
        'ADR': '场均伤害',
        'Team': '战队',
        'Online':'线上',
        'Map pool':'地图池',
        'Map stats':'地图数据',
        'removed':"Ban掉了",
        'picked ':'选择了',
        'picked':'选择了',
        'Winner qualifies for':'胜者晋级',
        'was left over':'剩下了',
        'Analytics center':'数据分析',
        'Pick a winner':'预测胜者',
        'Scoreboard':'数据统计',
        'Game log':'比赛日志',
        'Live win probability':'实时胜率',
        'Fantasy games':'',
        'Best of':'BO',
        'Maps':'地图',
        'Watch':'观看',
        'Hide minimap':'隐藏小地图',
        'Normal':'常规',
        'Advanced':'高级',
        'Op.duels':'对位单杀',
        "2+kills":'多杀',
        '1vsX':'一打多',
        'Live win probability':'实时胜率',
        'Head to head':'正面交锋',
        'Side':'阵营',
        'match win streak':'场连胜',
        'World rank':'世界排名',
        'Top player in match':'单局最佳',
        'RECENT ACTIVITY':'最新消息',
        'Team stats':'战队数据',
        'TOP 30 TRANSFERS':'转会TOP30',
        'Semi-final':'半决赛',


        
        // 战队信息
        'Roster': '战队阵容',
        'Coach': '教练',
        'Stand-in': '替补选手',
        'Lineups':'阵容',


        
        };

    // 高级配置
    const config = {
        skipTags: ['SCRIPT', 'STYLE', 'TEXTAREA', 'CODE', 'PRE', 'TIME'], // 新增跳过时间标签
        skipClasses: ['moment-timestamp'], // 跳过时间组件
        mainContainer: 'div.contentCol' // 只处理主要内容区域
    };

    // 智能替换函数
    function replaceText(node) {
        if (node.nodeType === Node.TEXT_NODE &&
            node.textContent.trim() &&
            !config.skipClasses.some(c => node.parentElement.classList.contains(c))) {

            let text = node.textContent;
            const sortedKeys = Object.keys(dictionary)
                .sort((a, b) => b.length - a.length);

            sortedKeys.forEach(key => {
                // 修改后的正则表达式(增强单词边界检测)
                const regex = new RegExp(`\\b${key}\\b(?![^<]*?>)`, 'gi');
                text = text.replace(regex, match => {
                    // 保持原始大小写格式
                    return dictionary[key].toUpperCase() === dictionary[key]
                        ? dictionary[key]
                        : match[0] === match[0].toUpperCase()
                            ? dictionary[key][0].toUpperCase() + dictionary[key].slice(1)
                            : dictionary[key];
                });
            });

            node.textContent = text;
        }
    }

    // 优化版DOM遍历
    function walkDOM(target) {
        const container = document.querySelector(config.mainContainer) || target;
        const treeWalker = document.createTreeWalker(
            container,
            NodeFilter.SHOW_TEXT,
            {
                acceptNode: node =>
                    config.skipTags.includes(node.parentNode.nodeName)
                        ? NodeFilter.FILTER_REJECT
                        : NodeFilter.FILTER_ACCEPT
            },
            false
        );

        let currentNode;
        while ((currentNode = treeWalker.nextNode())) {
            replaceText(currentNode);
        }
    }

    // 初始化执行
    walkDOM(document.body);
})();