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!');
}
