// ==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': '招募玩家',
'Events': '事件',
'Torn to London.': '正在飞往英国伦敦(London)。',
'London to Torn.': '正从英国伦敦(London)回城。', // todo 所有目的地
'\nRemaining Flight Time -\n': ' 剩余时间 - ',
'Travel Home': "回国",
'Rehabilitation': "戒毒康复",
'People': "用户列表"
};
//界面tips
const tipsDict = {
'\nAccording to the Economist Intelligence Unit\'s Quality of Life Index, Switzerland is the second best place in the world to be born, after Denmark. Torn ranked 224th, despite there being only 194 recognised nations in the world.\t': "根据经济学人信息部提供的生活质量指数,瑞士是世界上第二个最适合出生的地方,仅次于丹麦。尽管世界上只有194个公认的国家,但托恩却排名第224位。",
'\nThe opportunities for employment in Torn are wide and varied, from jobs in the zoo and the meat warehouse through to fantastic openings at the strip club - a description rarely used to refer to those who work there.\t':
"托恩的就业机会广泛而多样,从动物园和肉类仓库的工作,到脱衣舞俱乐部的奇妙开场--这是一个很少用来形容在那里工作的人的描述。",
'\nOne of the main requirements for a wedding to take place in Torn is the procurement of a ring. You may either purchase one from the Jewellery Store, or you can choose the more romantic option of stealing one, which requires far more effort if you think about it.\t': "在托恩举行婚礼的主要要求之一就是购买一枚戒指。你可以从珠宝店购买,也可以选择在偷窃戒指中选择一种很浪漫的方式,但是你冷静下来想想的话,这也是需要付出更大代价的。",
"\nDespite having no discernible court system Torn still employs several thousand people within its Judicial Services department. Nobody knows what the hell these people do all day, but if we had to guess, we'd say Solitaire.\t": "尽管没有明显的法院系统,托恩仍然在其司法服务部门雇用了几千人。没有人知道这些人整天都在做什么,但如果我们必须猜测,我们会说是接龙。",
"\nAt one point a Dual Wield Melee course was available at Torn City College for a fee of $50,000,000, but this was discontinued when Torn's citizens realized they were effectively paying to learn how to hold two things at once.\t": "托恩城市学院一度开设了双持近战课程,收费50,000,000美元,但当托恩的市民意识到他们实际上是在花钱学习如何同时持有两样东西时,这个课程就停止了。"
};
//如果在飞行页面
if ($('span.remaining-time')[0] != null) {
$('#skip-to-content')[0].firstChild.nodeValue += '飞行中';
//飞行提示小文章
document.querySelector("#mainContainer > div.content-wrapper.logged-out.left.autumn.travelling > div.travel-agency-travelling > div.popup-info > div.inner-popup").textContent = '\nOne of the main requirements for a wedding to take place in Torn is the procurement of a ring. You may either purchase one from the Jewellery Store, or you can choose the more romantic option of stealing one, which requires far more effort if you think about it.\t'
document.querySelector("#mainContainer > div.content-wrapper.logged-out.left.autumn.travelling > div.travel-agency-travelling > div.popup-info > div.inner-popup").textContent =
tipsDict[document.querySelector("#mainContainer > div.content-wrapper.logged-out.left.autumn.travelling > div.travel-agency-travelling > div.popup-info > div.inner-popup").textContent];
// 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];
}
//Events
$("#events")[0].firstChild.nodeValue = travelingDict[$("#events")[0].firstChild.nodeValue]
// eg. Torn to London.
if ($("#travel-home")[0] != null) {
$("#travel-home")[0].firstChild.nodeValue = travelingDict[$("#travel-home")[0].firstChild.nodeValue];
$("#rehab")[0].firstChild.nodeValue = travelingDict[$("#rehab")[0].firstChild.nodeValue];//todo 在瑞士就加rehab
$("#people")[0].firstChild.nodeValue = travelingDict[$("#people")[0].firstChild.nodeValue];
}
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;
}
});
}
}
})();