Files
CFspider/translate.js
2026-01-24 13:01:25 +08:00

394 lines
13 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const fs = require('fs');
// 读取原始文件
let code = fs.readFileSync('workers.js', 'utf8');
// 第一步:删除所有包含中文的注释行
code = code.split('\n').map(line => {
// 如果整行是注释且包含中文,删除
if (/^\s*\/\/.*[\u4e00-\u9fff]/.test(line)) return '';
// 如果行尾有包含中文的注释,删除注释部分
if (/\/\/.*[\u4e00-\u9fff]/.test(line)) {
return line.replace(/\/\/.*[\u4e00-\u9fff].*$/, '');
}
return line;
}).join('\n');
// 删除多行注释中包含中文的
code = code.replace(/\/\*[\s\S]*?[\u4e00-\u9fff][\s\S]*?\*\//g, '');
// 中文到英文的完整映射表 - 全部使用驼峰式(无空格)
const translations = {
// 敏感变量名和字符串替换
'cfspiderPath': 'apiPath',
'cfspider-public-00000000-0000': 'pub-node-00000000-0000',
'x-cfspider-header-': 'x-custom-header-',
'X-CFspider-Version': 'X-Worker-Version',
'X-CFspider-TwoProxy': 'X-Two-Proxy',
'CFspider/1.8.3': 'Mozilla/5.0',
'cfspider.get': 'client.get',
'CFspider-': 'Node-',
'#CFspider': '#Node',
// 原有翻译
// 变量名翻译
'反代IP': 'proxyIP',
'启用SOCKS5反代': 'enableSOCKS5Proxy',
'启用SOCKS5全局反代': 'enableGlobalSOCKS5',
'我的SOCKS5账号': 'mySOCKS5Account',
'缓存反代IP': 'cachedProxyIP',
'缓存反代解析数组': 'cachedProxyArray',
'缓存反代数组索引': 'cachedProxyIndex',
'启用反代兜底': 'enableProxyFallback',
'SOCKS5白名单': 'socks5Whitelist',
'Pages静态页面': 'pagesStaticUrl',
'管理员密码': 'adminPassword',
'加密秘钥': 'encryptKey',
'访问IP': 'clientIP',
'整理成数组': 'parseToArray',
// 配置对象属性名
'优选订阅生成': 'subGenerator',
'本地IP库': 'localIPPool',
'随机数量': 'randomCount',
'指定端口': 'specifiedPort',
'随机IP': 'randomIP',
'订阅转换配置': 'subConverterConfig',
'反代': 'reverseProxy',
'全局': 'globalMode',
'账号': 'account',
'白名单': 'whitelist',
'传输协议': 'transport',
'跳过证书验证': 'skipCertVerify',
'启用0RTT': 'enable0RTT',
'TLS分片': 'tlsFragment',
'随机路径': 'randomPath',
'本地': 'local',
'协议类型': 'protocolType',
// 新增翻译
'区分大小写访问': 'caseSensitivePath',
'输入密码': 'inputPassword',
'日志内容': 'logContent',
'待验证优选': 'pendingOptimal',
'请求优选': 'requestOptimal',
'完整优选': 'fullOptimal',
'完整优选列表': 'fullOptimalList',
'其他节点': 'otherNodes',
'节点': 'node',
'内容': 'content',
'优选': 'optimal',
'检测代理响应': 'checkProxyResponse',
'可用性验证': 'availabilityCheck',
'请求日志记录': 'requestLogRecord',
'保存自定义': 'saveCustom',
'生成': 'gen',
'订阅': 'sub',
'元素': 'element',
'地址备注分离': 'addrRemarkSplit',
'合并其他节点数组': 'mergeOtherNodes',
'器': 'er',
'器返回': 'erReturn',
'订阅行列表': 'subLineList',
'行内容': 'lineContent',
'地址匹配': 'addrMatch',
'地址端口': 'addrPort',
'备注': 'remark',
'备注匹配': 'remarkMatch',
'原始地址': 'origAddr',
'节点地址': 'nodeAddr',
'节点端口': 'nodePort',
'节点备注': 'nodeRemark',
'订阅转换': 'subConvert',
'订阅配置文件热补丁': 'subConfigHotfix',
'批量替换': 'batchReplace',
'获取': 'get',
'处理': 'handle',
'请求': 'request',
'伪装页': 'fakePage',
'新请求头': 'newHeaders',
'响应内容': 'respContent',
'响应': 'resp',
'判断是否是木马': 'checkIfTrojan',
'解析木马请求': 'parseTrojanReq',
'解析魏烈思请求': 'parseVlessReq',
'转发': 'forward',
'目标': 'target',
'否': 'no',
'所有': 'all',
'数组': 'arr',
'兜底': 'fallback',
'数组索引': 'arrIndex',
'地址': 'addr',
'端口': 'port',
'索引': 'idx',
'错误': 'err',
'且未': 'andNot',
'代理': 'proxy',
'解析地址端口': 'parseAddrPort',
'验证': 'verify',
'原始': 'raw',
'启用': 'enable',
'每行内容': 'eachLine',
'输出内容': 'output',
'备改内容': 'backup',
'正确内容': 'correct',
'容量限制': 'capLimit',
'当前': 'curr',
'日志数组': 'logArr',
'现有日志': 'existLog',
'三十分钟前': 'thirtyMinAgo',
'戳': 'stamp',
'掩码敏感信息': 'maskSensitive',
'文本': 'txt',
'前缀长度': 'prefixLen',
'后缀长度': 'suffixLen',
'前缀': 'prefix',
'后缀': 'suffix',
'星号数量': 'starCount',
'编码器': 'encoder',
'第一次哈希': 'hash1',
'第一次哈希数组': 'hash1Arr',
'第一次十六进制': 'hex1',
'字节': 'byte',
'第二次哈希': 'hash2',
'第二次哈希数组': 'hash2Arr',
'第二次十六进制': 'hex2',
'常用': 'common',
'目录': 'dir',
'随机数': 'randNum',
'随机替换通配符': 'randReplaceWildcard',
'字符集': 'charset',
'每组数量': 'groupCnt',
'打乱后数组': 'shuffledArr',
'重置配置': 'resetCfg',
'初始化开始': 'initStart',
'默认配置': 'defCfg',
'初始化': 'init',
'加载': 'load',
'官方优选': 'officialOptimal',
'替换后的内容': 'replaced',
'地址数组': 'addrArr',
'默认端口': 'defPort',
'超时': 'timeout',
'订阅链接响应的明文': 'subLinkPlain',
'需要订阅转换订阅': 'needSubConvert',
'预处理订阅明文内容': 'preSubPlain',
'国家': 'country',
'城市': 'city',
'路参': 'pathParam',
'解析': 'parse',
'地址失败': 'addrFailed',
'如': 'like',
'总计': 'totalCnt',
'查询': 'query',
'记录': 'record',
'解析地址端口字符串': 'parseAddrPortStr',
'排序后数组': 'sortedArr',
'目标根': 'targetRoot',
'洗牌后': 'shuffled',
'代理协议': 'proxyProto',
'完整代理': 'fullProxy',
'格式化': 'format',
'随机字符串': 'randStr',
'访问': 'visit',
'失败': 'failed',
// 函数和错误消息(全部驼峰式)
'荷兰节点': 'nlNode',
'香港节点': 'hkNode',
'未知IP': 'unknownIP',
'配置已保存': 'configSaved',
'配置已重置为默认值': 'configResetToDefault',
'配置不完整': 'incompleteConfig',
'配置重置失败': 'configResetFailed',
'失败原因': 'reason',
'保存配置失败': 'saveConfigFailed',
'保存自定义优选IP失败': 'saveCustomIPFailed',
'自定义优选IP已保存': 'customIPSaved',
'自定义IP已保存': 'customIPSaved',
'不支持的POST请求路径': 'unsupportedPOSTPath',
'重定向中': 'redirecting',
'请通过 Cloudflare Dashboard 或 wrangler.toml 设置 NEW_IP 环境变量': 'setNEWIPViaDashboard',
'请使用 Python cfspider.get() 配合 two_proxy 参数': 'useCfspiderGetWithTwoProxy',
'仅支持 HTTP 双层代理': 'onlyHTTPTwoProxySupported',
'不支持通过 /proxy API': 'notSupportedViaProxyAPI',
'隧道建立成功': 'tunnelEstablished',
'代理连接关闭': 'proxyClosed',
'无效的代理响应': 'invalidProxyResp',
'代理连接失败': 'proxyConnFailed',
'双层代理未配置': 'twoProxyNotConfigured',
'读取': 'read',
'出错': 'error',
'日志记录失败': 'logFailed',
'日志通知': 'logNotify',
'类型': 'type',
'位置': 'location',
'域名': 'domain',
'路径': 'path',
'时间': 'time',
'请求用量': 'requestUsage',
'统计结果': 'statResult',
'上限': 'limit',
'账户获取失败': 'accountGetFailed',
'未找到账户': 'accountNotFound',
'未找到账户数据': 'accountDataNotFound',
'查询失败': 'queryFailed',
'获取使用量错误': 'getUsageError',
'查询请求量失败': 'queryRequestFailed',
'验证优选API失败': 'verifyAPIFailed',
'缺少代理参数': 'missingProxyParam',
'无法连接到代理服务器': 'cannotConnectToProxy',
'关闭连接时出错': 'errorClosingConn',
// 日志消息
'尝试连接到': 'connectingTo',
'成功连接到': 'connectedTo',
'连接失败': 'connFailed',
'连接超时': 'connTimeout',
'尝试直连到': 'directConnTo',
'代理到': 'proxyTo',
'使用双层代理': 'usingTwoProxy',
'回退到默认方式': 'fallbackToDefault',
'目标站点': 'targetSite',
'随机种子': 'randSeed',
'解析完成': 'parseComplete',
'总数': 'total',
'个': '',
'读取缓存': 'readCache',
'启用 SOCKS5/HTTP 全局代理': 'enableGlobalProxy',
'所有反代连接失败': 'allProxyFailed',
'且未启用兜底': 'fallbackDisabled',
'连接终止': 'connTerminated',
'反代连接': 'proxyConn',
'反代解析': 'proxyParse',
'反代类型': 'proxyType',
'已启用': 'enabled',
'通过': 'via',
'连接到': 'connTo',
// 订阅相关
'优选订阅生成器异常': 'subGenError',
'订阅转换后端异常': 'subConverterError',
'订阅内容': 'subContent',
'不规范的IP格式已忽略': 'invalidIPIgnored',
// 解析相关
'解析William域名失败': 'parseWilliamFailed',
'DoH查询失败': 'dohQueryFailed',
'无效的': 'invalid',
'地址格式': 'addrFormat',
'认证部分必须是': 'authMustBe',
'的形式': 'format',
'端口号必须是数字': 'portMustBeNumber',
'地址必须用方括号括起来': 'addrMustBeBracketed',
// Singbox热补丁
'Singbox热补丁执行失败': 'singboxPatchFailed',
// 优选标签
'移动优选': 'CMCCOptimal',
'联通优选': 'CUOptimal',
'电信优选': 'CTOptimal',
'CF优选': 'CFOptimal',
// 密钥相关
'勿动此默认密钥有需求请自行通过添加变量KEY进行修改': 'doNotModifyDefaultKey',
// 双层代理
'双层代理': 'twoProxy',
'不支持通过': 'notSupportedVia',
'参数': 'param',
// 下载速度等
'下载速度': 'dlSpeed',
'数据中心': 'dataCenter',
'延迟': 'latency',
// 单字符和短语
'的': '',
'公开': 'public',
'返回完整': 'returnFull',
'配置': 'config',
'去掉': 'remove',
'快速': 'fast',
'登录页面和登录': 'loginPageAnd',
'后': 'after',
'管理页面': 'adminPage',
'量': 'amt',
'检查': 'check',
'为默认值': 'toDefault',
'操作': 'op',
'保存': 'save',
'保存到': 'saveTo',
'返回': 'return',
'配置文件': 'cfgFile',
'清除': 'clear',
'并跳转到登录页面': 'redirectToLogin',
'到期': 'expire',
'跳过空行': 'skipEmpty',
'这是': 'thisIs',
'行': 'line',
'提取': 'extract',
'或': 'or',
'可能带方括号': 'mayHaveBrackets',
'默认': 'def',
'默认为': 'defTo',
'本身': 'itself',
'列表': 'list',
'顶级属性的缩进': 'topLevelIndent',
'顶级属性缩进': 'topLevelIndent',
'强制使用现代方式': 'forceModern',
'移除': 'remove',
'因为已经改用': 'becauseChanged',
'了': '',
'果长度太短': 'ifTooShort',
'直接返回': 'directReturn',
'基于': 'basedOn',
'当': 'when',
'为': 'is',
'时生效': 'effective',
'数量': 'cnt',
'则使用': 'thenUse',
'内': 'in',
'更新': 'update',
'小时': 'hour',
'时强制将': 'forceChange',
'改为': 'changeTo',
'默认优先': 'defFirst',
'果明确指定': 'ifSpecified',
'系编码': 'encoding',
'优先尝试': 'tryFirst',
'追加': 'append',
'明文': 'plain',
'开头': 'start',
'带': 'with',
'无': 'none'
};
// 按长度排序(从长到短)
const sortedKeys = Object.keys(translations).sort((a, b) => b.length - a.length);
// 执行替换
for (const cn of sortedKeys) {
const en = translations[cn];
code = code.split(cn).join(en);
}
// 删除空行过多的情况
code = code.replace(/\n{3,}/g, '\n\n');
// 保存翻译后的文件
fs.writeFileSync('workers_translated.js', code, 'utf8');
console.log('Translation complete! Saved to workers_translated.js');
// 检查是否还有剩余中文
const remaining = code.match(/[\u4e00-\u9fff]+/g);
if (remaining) {
const unique = [...new Set(remaining)];
console.log('\nRemaining Chinese characters (' + unique.length + '):');
unique.forEach(c => console.log(' ' + c));
} else {
console.log('\nNo remaining Chinese characters!');
}