您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
翻译
当前为
// ==UserScript== // @name Atcoder 中文版 // @namespace http://tampermonkey.net/ // @version 2024-08-15 // @description 翻译 // @author You // @match https://atcoder.jp/* // @run-at document-start // @grant none // @license GNU GPL v3 // ==/UserScript== (function () { const TEXT = { "(local time)": "(本地时间)", "Active Users": "活跃用户", "Affiliation": "工作单位", "Algorithm": "算法竞赛", "All": "全部", "All Submissions": "所有提交", "All Users": "所有用户", "Auto Refresh": "自动刷新", "Back to Home": "返回主页", "Birth Year": "出生年份", "Category": "类别", "Change Password": "更换密码", "Change Photo": "更换头像", "Change/Verify Email address": "更改/验证电子邮件地址", "Clarifications": "提问", "Company": "公司信息", "Competition History": "历史比赛", "Contact": "联系方式", "Contest": "比赛", "Contest Archive": "比赛记录", "Contest Name": "比赛名字", "Contest Status": "比赛记录", "Country/Region": "国家/地区", "Custom Test": "自定义测试", "Customize": "自定义", "Duration": "持续时间", "Editorial": "题解", "Email Notifications": "邮箱提醒", "FAQ": "常见问题", "General Settings": "基本设置", "Glossary": "术语", "Heuristic": "启发式竞赛", "Heuristic Contest": "启发式比赛", "Highest Rating": "最高等级分", "Home": "首页", "Information": "公告", "Information Protection Policy": "信息保护政策", "Last Contest Result": "上次比赛结果", "Manage Fav": " 管理收藏", "More...": "更多...", "My Profile": "我的主页", "My Score": "我的分数", "My Submissions": "我的提交", "Nickname": "昵称", "Other": "其他", "Page Top": "页首", "Past Contests": "往届比赛", "Permanent Contests": "永久性比赛", "Present Contests": "当前比赛", "Privacy Policy": "隐私政策", "Profile": "简介", "Rank": "排名", "Ranking": "排名", "Rated Range": "等级范围", "Rating": "等级分", "Rating Distribution": "评级分布", "Recent Contests": "最近的比赛", "Refresh": "刷新", "Register": "报名", "Reset": "重置", "Restructuring of contests": "比赛调整", "Results": "结果", "Rule": "规则", "Search": "搜索", "Search in Archive": "在存档中搜索", "Settings": "设置", "Sign In": "登录", "Sign Out": "退出登录", "Sign Up": "注册", "Sponsored ABC": "赞助入门赛(ABC)", "Sponsored ARC": "赞助常规赛(ARC)", "Sponsored Heuristic Contest": "赞助启发式比赛", "Sponsored Parallel(rated)": "赞助平行赛(评级)", "Sponsored Parallel(unrated)": "赞助平行赛(未评级)", "Sponsored Tournament": "赞助锦标赛", "Standings": "排名", "Start Time": "开始时间", "Submit": "提交", "Tasks": "题目", "Terms of service": "服务条款", "The file size must be at most 1MB.": "文件大小不得超过1MB。", "The width and height must be at most 512px.": "宽度和高度不得超过512px。", "There is no clarifications yet.": "目前还没有提示。", "This user has not competed in a rated contest yet.": "该用户没有参加过有评级的比赛。", "This user has not competed yet.": "该用户没有参加过比赛。", "Top": "首页", "Unofficial(unrated)": "非官方(未评级)", "Upcoming Contests": "即将到来的比赛", "Update": "更新", "Upload": "上传", "User": "用户", "View all": "查看全部", "Virtual Participation": "虚拟参与", "Virtual Standings": "虚拟排名", "You can use only jpg/png files.": "您只能使用jpg/png文件。", "last update": "上次更新", "【Important Notice】 Please beware of fake sites impersonating AtCoder": "【重要提示】请注意假冒AtCoder的虚假网站" } function ObjSort(arys) { var newkey = Object.keys(arys).sort(); var newObj = {}; for (var i = 0; i < newkey.length; i++) newObj[newkey[i]] = arys[newkey[i]]; return newObj; //返回排好序的新对象 } console.log("词汇表:"); console.log(ObjSort(TEXT)); let cnt = 0, id, flag = sessionStorage["translate"], bflag = 0; if (flag == undefined) { flag = 1; sessionStorage["translate"] = 1; } function translate(x) { if (x.nodeType == 3) { let str = x.nodeValue, l = 0, ls = "", r = 0, rs = ""; while (" \n\t".includes(str[l])) ls += str[l], l++; while (" \n\t".includes(str[str.length - 1 - r]) && str.length - 1 - r >= l) rs += str[str.length - 1 - r], r++; if (str[str.length - 1 - r] == ":") rs += ":", r++; if (TEXT[str.substring(l, str.length - r)] != undefined) { str = TEXT[str.substring(l, str.length - r)]; x.old = x.nodeValue; x.nodeValue = ls + str + rs; } return; } let c = Array.from(x.childNodes) for (let i of c) translate(i); } function back(x) { if (x.nodeType == 3) { if (x.old != undefined) { x.nodeValue = x.old x.old = undefined; } return; } let c = Array.from(x.childNodes) for (let i of c) back(i); } function main() { if (bflag == 0) { let a = document.getElementsByClassName("nav navbar-nav navbar-right")[0]; if (a != undefined) { bflag = 1; let bu = document.createElement("button"); bu.innerText = (flag == 1) ? "关闭翻译" : "开启翻译"; bu.onclick = function () { if (bu.innerText == "关闭翻译") { bu.innerText = "开启翻译"; back(document.body); flag = 0; } else { bu.innerText = "关闭翻译"; flag = 1; } sessionStorage["translate"] = flag; } a.appendChild(bu); } } if (flag != 0) translate(document.body); cnt++; if (cnt == 1000) { // 网页启动时高频刷新,启动后 1 秒降低刷新频率,降低压力 clearInterval(id); setInterval(main, 100); } } id = setInterval(main, 1); })();