// ==UserScript== // @name Torn翻译 // @namespace WOOH // @version 0.1.1104a // @description UI翻译 // @author Woohoo- // @match https://www.torn.com/* // @grant none // ==/UserScript== !(function () { 'use strict'; const $ = window.jQuery; /** * 飞行 */ if (window.location.href.indexOf('index.php') >= 0 && $('.travelling h4').length !== 0) { const travelingDict = { // todo jsonify 'Recruit Citizens': '招募玩家', 'Torn to London.': '正在飞往英国伦敦(London)。', 'London to Torn.': '正从英国伦敦(London)回城。', // todo 所有目的地 '\nRemaining Flight Time -\n': ' 剩余时间 - ', }; $('#skip-to-content')[0].firstChild.nodeValue += '飞行中'; // eg. Remaining Flight Time - $('span.remaining-time')[0].firstChild.nodeValue = travelingDict[$('span.remaining-time')[0].firstChild.nodeValue]; $("#recruit-citizens")[0].firstChild.nodeValue = travelingDict[$("#recruit-citizens")[0].firstChild.nodeValue]; // eg. Torn to London. new MutationObserver(mutations => { $('span.description')[0].firstChild.nodeValue = travelingDict[$('span.description')[0].firstChild.nodeValue]; }).observe($('span.description')[0], {attributes: true, childList: true, subtree: true}); return; } /** * 边栏 */ const sidebarDict = { // todo 从json加载 'Money': '现金', 'Level': '等级', 'Points': 'PT', 'Merits': '技能点', 'Energy': '能量E', 'Nerve': '犯罪N', 'Happy': '快乐', 'Life': '血量', 'Chain': '连击链Chain', 'Home': '主页', 'Items': '物品', 'City': '城市', 'Job': '工作', 'Gym': '健身房', 'Properties': '房产', 'Education': '教育', 'Crimes': '犯罪', 'Missions': '任务', 'Newspaper': '报纸', 'Jail': '监狱', 'Hospital': '医院', 'Casino': '赌场', 'Forums': '论坛', 'Hall of Fame': '名人堂', 'My Faction': '帮派', 'Recruit Citizens': '招募玩家', 'Competitions': '活动日历', 'Community Events': '社区事件', 'Friends': '好友', 'Enemies': '敌人', }; const sidebarInterval = setInterval(() => { if ($('div[class^="sidebar"]').length === 0) return; // 边栏块标题 $('h2[class^="header"]')[0].firstChild.nodeValue = '信息'; $('h2[class^="header"]')[1].firstChild.nodeValue = '区域'; // todo 当前文字替换会触发torn js bug $('h2[class^="header"]')[2].firstChild.nodeValue = '列表'; // 边栏人物名字 $('span[class^="menu-name"]')[0].firstChild.nodeValue = '名字:'; // 钱 等级 pt 技能点 $('p[class^="point-block"]').each((i, e) => { e.firstChild.firstChild.nodeValue = sidebarDict[e.firstChild.firstChild.nodeValue]; }); // 4条 状态条 $('p[class^="bar-name"]').each((i, e) => { e.firstChild.nodeValue = sidebarDict[e.firstChild.nodeValue]; }); // 边栏菜单 $('span[class^="linkName"]').each((i, e) => { e.firstChild.nodeValue = sidebarDict[e.firstChild.nodeValue]; }); // [use]按钮 if ($('#pointsMerits').length !== 0) $('#pointsMerits')[0].firstChild.nodeValue = '[使用]'; if ($('#pointsPoints').length !== 0) $('#pointsPoints')[0].firstChild.nodeValue = '[使用]'; clearInterval(sidebarInterval); }, 1000); // 浮窗 const tootipDict = { 'Full ': '回满', 'energy': '能量E', 'happy': '快乐', ' in ': '还需', 'You have full ': '你已有满', 'life': '血量', 'nerve': '犯罪N', 'You are currently traveling': '你正在飞行中', 'You don\'t own a Laptop!': '你没有笔记本电脑!', 'You are not in Torn': '你不在城里', 'Rank': '阶级', }; let tooltip = $('div.ToolTipPortal')[0]; let intervalID = setInterval(() => { tooltip = $('div.ToolTipPortal')[0]; if (tooltip) { clearInterval(intervalID); new MutationObserver(mutations => { let barDescr = $('div[class^="tooltip"]').children('p[class^="bar-descr"]'); if (barDescr.length !== 0) { barDescr[0].childNodes.forEach(i => { if (tootipDict[i.nodeValue]) i.nodeValue = tootipDict[i.nodeValue]; }) } let miniprof_tooltip = $("#body > div.ToolTipPortal > div > div:nth-child(2)"); if (miniprof_tooltip.length !== 0) { if (tootipDict[miniprof_tooltip[0].firstChild.nodeValue]) { miniprof_tooltip[0].firstChild.nodeValue = tootipDict[miniprof_tooltip[0].firstChild.nodeValue]; } } else { //todo 通配符匹配 } }).observe(tooltip, {attributes: true, childList: true, subtree: true}); } }, 500); /** * 主页 */ if (window.location.href.indexOf('index.php') >= 0 && $('h4#skip-to-content').text().indexOf('Home') >= 0) { } /** * 通知 */ if (window.location.href.indexOf('events.php') >= 0) { let events;// = $('span.mail-link'); const eventMutation = new MutationObserver(() => { events = $('span.mail-link'); eventsTrans(); }); //初始化中内容未加载 let eventInterval = setInterval(() => { events = $('span.mail-link'); if (events.length === 0) { return; } clearInterval(eventInterval); eventMutation.observe($('div#events-main-wrapper')[0], {childList: true, subtree: true}); eventsTrans(); }, 1000); function eventsTrans() { if (events.length === 0) return; events.each((i, e) => { /** * 赛车 * You finished 5th in the Hammerhead race. Your best lap was 01:14.87. * You finished 1st in the Docks race. Your best lap was 04:01.33. * You finished 1st in the Hammerhead race and have received 3 racing points! Your best lap was 01:06.92. * You finished 4th in the Docks race. Your best lap was 03:29.27 beating your previous best lap record of 03:35.77 by 00:06.50. * You have crashed your Honda NSX on the Sewage race! The upgrades Paddle Shift Gearbox (Short Ratio) and Carbon Fiber Roof were lost. * You have crashed your Ford Mustang on the Docks race! Your car has been recovered. */ if ($(e).text().indexOf('finished') >= 0) { if ($(e).text().indexOf('crashed') >= 0) return; // todo 撞车 const isGainRacingPoint = $(e).text().indexOf('racing point'); let racingPoint = isGainRacingPoint >= 0 ? $(e).text()[isGainRacingPoint - 2] : null; const isBeat = $(e).text().indexOf('beating') >= 0; let record, bestBy; if (isBeat) { record = $(e).text().split('record of ')[1].split(' by ')[0]; bestBy = $(e).text().split('record of ')[1].split(' by ')[1].split('. ')[0]; } const pos = e.childNodes[1].firstChild.nodeValue.match(/[0-9]+/)[0]; const splitList = e.childNodes[2].nodeValue.split(' '); const bestLap = e.childNodes[2].nodeValue.split(' best lap was ')[1].split(' ')[0]; let map = splitList[3]; map = map === 'Two' ? 'Two Islands' : map; map = map === 'Stone' ? 'Stone Park' : map; e.firstChild.nodeValue = '你在赛车比赛 ' + map + ' 中获得了第 '; e.childNodes[1].firstChild.nodeValue = pos; e.childNodes[2].nodeValue = ' 名。'; if (isGainRacingPoint >= 0) { e.childNodes[2].nodeValue += '你获得了' + racingPoint + '赛车点数。'; } e.childNodes[2].nodeValue += '你的最佳成绩是 ' + bestLap; if (isBeat) e.childNodes[2].nodeValue += ',比上次成绩 ' + record + ' 快 ' + bestBy; e.childNodes[2].nodeValue += '。' e.childNodes[2].nodeValue += ' ['; e.childNodes[3].firstChild.nodeValue = '查看'; return; } /** * 还贷 */ if ($(e).text().indexOf('Loan Shark') >= 0) { const node1Value = e.firstChild.nodeValue; // You have been charged $29,000 for your loan. You can pay this by visiting the //e.childNodes[1].firstChild.nodeValue; // Loan Shark // const node3Value=e.childNodes[2].nodeValue; 内容是 ". " let charge = node1Value.split(' ')[4]; let replace; replace = '你需要支付 '; replace += charge; replace += ' 贷款利息,点此支付:'; e.firstChild.nodeValue = replace; e.childNodes[1].firstChild.nodeValue = '鲨客借贷(Loan Shark)'; e.childNodes[2].nodeValue = '。'; return; } /** * 收到钱物 * You were sent $21,000,000 from * JNZR * . * 附带信息: with the message: Manuscript fee OCT * e.firstChild.nodeValue * e.childNodes[1].firstChild.nodeValue * e.childNodes[2].nodeValue * * You were sent 4x Xanax from RaichuQ with the message: Manuscript fee OCT * You were sent $21,000,000 from JNZR. * You were sent some Xanax from runningowl * You were sent 1x Present from Duke with the message: Is it your birthday? * You were sent Duke's Safe from DUKE * You were sent a Diamond Bladed Knife from charapower */ if ($(e).text().indexOf('sent') >= 0) { const isWithMsg = $(e).text().indexOf('message') >= 0; const msg = isWithMsg ? $(e).text().split(' with the message: ')[1] : null; const wordsList = e.firstChild.nodeValue.split(' '); console.log(wordsList); // 发送的数量 let number; if (wordsList[3] === 'some' || wordsList[3] === 'a') // 收到一个可数的不可堆叠或不可数的东西 number = '1x'; else if (wordsList[3][wordsList[3].length - 1] === 'x') // 收到可数的可堆叠东西 number = wordsList[3]; else number = null; const item = number === null ? wordsList.slice(3, wordsList.length - 2) : wordsList.slice(4, wordsList.length - 2); console.log(item); // 你收到了来自someone的【数量】物品,附带信息:xxx。 e.firstChild.nodeValue = '你收到了来自 '; e.childNodes[2].nodeValue = ' 的 '; if (number) e.childNodes[2].nodeValue += number e.childNodes[2].nodeValue += ' ' + item; if (isWithMsg) e.childNodes[2].nodeValue += ',附带信息:' + msg; e.childNodes[2].nodeValue += '。'; return; } /** * bazaar * Dewei3 bought 2 x Toyota MR2 from your bazaar for $56,590. * ['', 'bought', '2', 'x', 'Toyota', 'MR2', 'from', 'your', 'bazaar', 'for', '$56,590.\n'] * e.childNodes[1].nodeValue */ if ($(e).text().indexOf('bazaar') >= 0) { const bazEN = e.childNodes[1].nodeValue; const spl = bazEN.split(' '); const num = spl[2]; const item = spl.slice(4, spl.indexOf('from')).join(' '); const money = spl[spl.length - 1].replace('.', ''); e.childNodes[1].nodeValue = ' 花费 ' + money + ' 从你的 bazaar 买了 ' + num + ' 个 ' + ' ' + item + '。'; return; } /** * 交易 */ if ($(e).text().indexOf('trade') >= 0) { const PCHC = '点此继续'; if ($(e).text().indexOf('You must now accept') >= 0) { /** * 接受交易 * JNZR * has accepted the trade titled "g't". You must now accept to finalize it. * Please click here to continue. * JNZR已经接受了名为 "g't "的交易。你现在必须接受以完成它。 */ const firstWords = e.childNodes[1].nodeValue.split('. You must')[0]; const tradeName = firstWords.slice(31, firstWords.length); e.childNodes[1].nodeValue = ' 已经接受了名为 ' + tradeName + ' 的交易。你现在必须接受以完成它。'; e.childNodes[2].firstChild.nodeValue = PCHC; return; } if ($(e).text().indexOf('expired') >= 0) { /** * 交易过期 * The trade with * sabrina_devil * has expired * 与sabrina_devil的交易已经过期。 */ e.firstChild.nodeValue = '与 '; e.childNodes[2].nodeValue = ' 的交易已过期。'; return; } if ($(e).text().indexOf('initiated') >= 0) { /** * 交易发起 * sabrina_devil * has initiated a trade titled "gt". * Please click here to continue. * sabrina_devil发起了一项名为 "gt "的交易。 */ const node2 = e.childNodes[1].nodeValue; const tradeName = node2.slice(30, node2.length - 2); e.childNodes[1].nodeValue = ' 发起了标题为 ' + tradeName + ' 的交易。'; e.childNodes[2].firstChild.nodeValue = PCHC; return; } if ($(e).text().indexOf('now complete') >= 0) { /** * 交易完成 * Tmipimlie * has accepted the trade. The trade is now complete. * Tmipimlie已经接受交易。现在交易已经完成。 */ e.childNodes[1].nodeValue = ' 已经接受交易。该交易现已完成。'; return; } if ($(e).text().indexOf('canceled') >= 0) { /** * 交易完成 * WOW * has canceled the trade. * WOW已经取消了这项交易。 */ e.childNodes[1].nodeValue = ' 已经取消了这个交易。'; return; } if ($(e).text().indexOf('commented') >= 0) { /** * 交易评论 * QIJI * commented on your * pending trade * : "Thank you for trading with me! The total is $19,461,755 and you can view your receipt here: https://www.tornexchange.com/receipt/mhWuuL7hrE" */ e.childNodes[1].nodeValue = ' 对'; e.childNodes[2].firstChild.nodeValue = '进行中的交易'; e.childNodes[3].nodeValue = '添加了一条评论' + e.childNodes[3].nodeValue; return; } return; } /** * 被mug */ if ($(e).text().indexOf('mugged') >= 0) { const spl = $(e).text().trim().split(' '); if (spl.length > 7) return; // 多人运动暂时跳过 const money = spl[spl.length - 2]; if (spl[0] === 'Someone') { // 被匿名mug e.firstChild.nodeValue = '有人打劫了你 ' + money + ' ['; e.childNodes[1].firstChild.nodeValue = '查看'; } else { e.childNodes[1].nodeValue = ' 打劫了你 ' + money + ' ['; e.childNodes[2].firstChild.nodeValue = '查看'; } return; } /** * 被打 */ if ($(e).text().indexOf('attacked') >= 0) { // 被打 /** * 攻击方式 词数=spl.length * 匿名 4 Someone attacked you [view] * - hosp 6 Someone attacked and hospitalized you [view] * -- 有人袭击了你并安排你住院 * 实名 4 EternalSoulFire attacked you [view] * - lost 6 EternalSoulFire attacked you but lost [view] * - hosp 6 * - 逃跑esc 6 Dr_Bugsy_Siegel attacked you but escaped [view] * - 25回合平手stale 6 Tharizdun attacked you but stalemated [view] * - 起飞或bug 6 Mrew tried to attack you [view] * * You attacked Cherreh but timed out [view] * * 多人运动 todo * 10 Pual (and 2 others) attached you and hospitalized you [view] * 9 Argozdoc attacked you but Norm fought him off [view] */ const spl = $(e).text().trim().split(' '); if (spl.length > 6) { // 多人运动暂时跳过 /** * 超时自动失败 */ if (spl[4] === 'timed') { if (e.firstChild.firstChild) { // 由第一个节点是否有子节点判断 被攻击 e.childNodes[1].nodeValue = ' 袭击你但是超时了 ['; e.childNodes[2].firstChild.nodeValue = '查看'; return; } e.firstChild.nodeValue = '你袭击 '; e.childNodes[2].nodeValue = ' 但是超时了 ['; e.childNodes[3].firstChild.nodeValue = '查看'; return; } return; ; } if (spl[0] === 'Someone') { // 被匿名 if (spl.length === 6 && spl[3] === 'hospitalized') { // 匿名hos e.firstChild.nodeValue = '有人袭击你并安排你住院 ['; e.childNodes[1].firstChild.nodeValue = '查看'; return; } e.firstChild.nodeValue = '有人袭击了你 ['; e.childNodes[1].firstChild.nodeValue = '查看'; return; } if (spl.length === 4) { // 实名leave e.childNodes[1].nodeValue = ' 袭击了你 ['; e.childNodes[2].firstChild.nodeValue = '查看'; return; } if (spl.length === 6) { // 实名的情况 switch (spl[4]) { case 'lost': e.childNodes[1].nodeValue = ' 袭击你但输了 ['; e.childNodes[2].firstChild.nodeValue = '查看'; return; case 'escaped': e.childNodes[1].nodeValue = ' 袭击你但逃跑了 ['; e.childNodes[2].firstChild.nodeValue = '查看'; return; case 'stalemated': e.childNodes[1].nodeValue = ' 袭击你但打成了平手 ['; e.childNodes[2].firstChild.nodeValue = '查看'; return; } switch (spl[3]) { case 'attack': // Mrew tried to attack you [view] e.childNodes[1].nodeValue = ' 尝试袭击你 ['; e.childNodes[2].firstChild.nodeValue = '查看'; return; case 'hospitalized': e.childNodes[1].nodeValue = ' 袭击你并安排你住院 ['; e.childNodes[2].firstChild.nodeValue = '查看'; return; } } } /** * 每日彩票 * 有人在Lucky Shot彩票中赢得11,832,100,000美元! * zstorm won $5,574,200 in the Daily Dime lottery! */ if ($(e).text().indexOf('lottery') >= 0) { const split = e.childNodes[1].nodeValue.split(' '); const type = split[split.length - 3] + ' ' + split[split.length - 2]; const money = split[2]; e.childNodes[1].nodeValue = ' 在 ' + type + ' 彩票中赢得了 ' + money + '!'; return; } if ($(e).text().indexOf('organized crime') >= 0) { // oc开启 return; } if ($(e).text().indexOf('You and your team') >= 0) { // oc结束 return; } /** * bust 捞人 * Spookyt * failed to bust you out of jail. */ if ($(e).text().indexOf('bust') >= 0) { // 劫狱成功 if ($(e).text().indexOf('to bust') >= 0) { // 劫狱失败 e.childNodes[1].nodeValue = ' 想捞你出来但是把自己搭了进去。'; return; } e.childNodes[1].nodeValue = ' 成功把你捞了出来。'; return; } /** * new virus病毒 * You completed the Simple Virus which is now in your inventory. You can begin programming a new virus * here * . * * 你完成了 "简单病毒",它现在在你的库存中。你可以【点此】开始编程一个新的病毒。 */ if ($(e).text().indexOf('new virus') >= 0) { const virusName = e.firstChild.nodeValue.split(' ').slice(3, 5).join(' '); e.firstChild.nodeValue = '你完成了 ' + virusName + ' ,它现在在你的物品库存中。你可以'; e.childNodes[1].firstChild.nodeValue = '点此'; e.childNodes[2].nodeValue = '开始编程一个新的病毒。'; return; } if ($(e).text().indexOf('doorstep') >= 0) { // 蓝星奖励 return; } }); } } })();