如何用篡改猴把https://atcoder.jp/contests/从英文翻译中文
时间: 2025-06-04 16:41:39 浏览: 21
<think>好的,用户想用篡改猴(Tampermonkey)脚本把AtCoder的竞赛页面从英文翻译成中文。首先,我需要确定AtCoder的网站结构,看看哪些部分需要翻译。通常,Tampermonkey脚本通过JavaScript操作DOM元素,替换文本内容。
用户可能不太熟悉如何编写用户脚本,所以得一步步来。首先,安装Tampermonkey扩展是必须的,然后创建一个新脚本。需要确定目标网址是https://atcoder.jp/contests/,所以脚本的@match或@include要包含这个URL。
接下来,要考虑翻译的方式。有两种方法:直接替换页面上的文本,或者调用翻译API。直接替换需要维护一个词汇表,比较麻烦,可能不全面。而调用API,比如Google Translate,可能更方便,但需要注意API的使用限制和费用,以及跨域请求的问题。不过,用户可能希望免费且简单的方法,所以可能需要用内置的JavaScript翻译功能,或者利用浏览器的内置API,比如`translate.googleapis.com`,但要注意跨域请求是否被允许。
另外,页面可能是动态加载的,比如SPA,但AtCoder的竞赛页面似乎是静态的,所以可能只需要在页面加载完成后运行脚本。使用DOMContentLoaded事件或者MutationObserver来检测动态变化的内容。
然后,编写脚本的大致步骤:选择需要翻译的元素,获取其文本内容,发送到翻译API,替换回页面。比如,选择body元素下的所有文本节点,但要注意排除代码部分或其他不需要翻译的内容。可能需要更精确的选择器,比如只处理特定的div或class。
但直接调用Google Translate API可能会有CORS问题,因为Tampermonkey脚本在页面上下文中运行,跨域请求会被浏览器拦截。这时候可能需要使用JSONP或者代理,但会增加复杂性。或者使用fetch的no-cors模式,但可能无法获取响应结果。这可能是一个难点,需要找到解决办法。
另外,用户可能希望自动翻译整个页面,而不需要手动维护词汇表。这时候可以考虑使用浏览器的内置翻译功能,但用户可能想通过脚本自动化,而不是每次手动点击翻译。但浏览器自带翻译可能已经满足需求,用户可能不知道这个功能。不过,用户明确要求用Tampermonkey,所以可能需要其他方法。
或者,使用JavaScript的text节点遍历,将所有文本节点提取出来,替换成翻译后的内容。但需要处理异步翻译的问题,因为API调用是异步的,可能需要分批处理或使用Promise.all。
可能还需要处理速率限制,比如短时间内发送太多请求会被阻止。所以可能需要延迟请求或分批处理。
总结步骤:1. 创建Tampermonkey脚本,匹配AtCoder的contests页面。2. 遍历需要翻译的文本节点。3. 调用翻译API获取中文翻译。4. 替换原文本。5. 处理异步和CORS问题。
现在需要解决的关键问题是如何绕过CORS限制调用翻译API。一种方法是使用公共的翻译API端点,比如Google Translate的,但需要注意是否允许跨域。或者使用代理服务器,但普通用户可能无法自己搭建。另一个方法是利用某些允许跨域的免费API,但可能存在稳定性问题。
或者,用户可以使用Yandex Translate或其他提供免费层且CORS允许的API。需要查找可用的翻译服务。
假设使用Yandex的API,注册获取API key,然后在脚本中使用。但用户需要自己申请API key,这可能增加步骤,但这是可行的。
另外,页面结构方面,需要定位到需要翻译的部分,比如竞赛名称、时间、表格头等,避免翻译整个页面导致问题,比如按钮功能失效。或者更简单地翻译所有文本,但可能影响功能。
综上,可能需要编写一个脚本,使用Yandex Translate API,用户自行申请API key,插入到脚本中,然后遍历指定元素进行翻译。但考虑到复杂度,可能用户希望一个更简单的解决方案,比如直接替换文本,但不够全面。
或者,使用浏览器内置的翻译功能,提示用户启用自动翻译,但可能不符合用户想用Tampermonkey的需求。
可能最终给出两种方案:一种是使用API,需要API key;另一种是简单文本替换,但效果有限。需要详细说明步骤,让用户选择。</think>你可以通过以下步骤使用 Tampermonkey 将 AtCoder 竞赛页面(https://atcoder.jp/contests/)自动翻译为中文:
---
### **方法一:调用免费翻译 API(需 API 密钥)**
1. **安装 Tampermonkey 扩展**
- 在 Chrome/Firefox 等浏览器中安装 [Tampermonkey](https://www.tampermonkey.net/)。
2. **获取翻译 API 密钥**
- 注册 [Yandex Translate](https://translate.yandex.com/developers) 或 [DeepL](https://www.deepl.com/pro-api) 的免费 API。
3. **创建 Tampermonkey 脚本**
```javascript
// ==UserScript==
// @name AtCoder 中文翻译
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 自动翻译 AtCoder 竞赛页面为中文
// @author YourName
// @match https://atcoder.jp/contests/*
// @grant GM_xmlhttpRequest
// ==/UserScript==
(async function() {
'use strict';
// 替换为你的 API 密钥和端点(以 Yandex 为例)
const API_KEY = 'your_api_key';
const API_URL = `https://translate.yandex.net/api/v1.5/tr.json/translate?key=${API_KEY}&lang=en-zh`;
// 选择需要翻译的区域(根据页面结构调整选择器)
const elementsToTranslate = document.querySelectorAll('.panel-default, .table, .list-group');
elementsToTranslate.forEach(async (element) => {
const text = element.innerText;
const response = await translateText(text, API_URL);
element.innerText = response;
});
async function translateText(text, url) {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: 'POST',
url: url,
data: `text=${encodeURIComponent(text)}`,
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
onload: function(response) {
const result = JSON.parse(response.responseText);
resolve(result.text.join(' '));
},
onerror: function(error) {
reject(error);
}
});
});
}
})();
```
---
### **方法二:简单文本替换(无需 API)**
如果不想使用 API,可以手动替换关键词汇(效果有限):
```javascript
// ==UserScript==
// @name AtCoder 简单中文化
// @namespace http://tampermonkey.net/
// @match https://atcoder.jp/contests/*
// @grant none
// ==/UserScript==
const translations = {
"Active Contests": "当前比赛",
"Upcoming Contests": "近期比赛",
"Past Contests": "历史比赛",
"Start": "开始时间",
"End": "结束时间",
"Rated Range": "评级范围"
};
function replaceText() {
document.body.innerHTML = document.body.innerHTML.replace(
/\b(Active Contests|Upcoming Contests|Past Contests|Start|End|Rated Range)\b/gi,
matched => translations[matched] || matched
);
}
// 监听页面变化(针对动态内容)
new MutationObserver(replaceText).observe(document.body, {
childList: true,
subtree: true
});
replaceText(); // 初始替换
```
---
### **注意事项**
1. **API 限制**:免费翻译 API 通常有调用次数限制。
2. **页面结构变化**:如果 AtCoder 更新页面 HTML,需调整选择器。
3. **浏览器翻译**:更简单的方法是直接使用 Chrome 右键菜单的「翻译成中文」功能。
推荐优先尝试浏览器的内置翻译,若需定制化操作再使用 Tampermonkey 脚本。
阅读全文
相关推荐


















