// ==UserScript==
// @name Torn翻译
// @namespace WOOH
// @version 0.1.1124b
// @description Torn UI翻译
// @author Woohoo-[2687093] sabrina_devil[2696209]
// @match https://www.torn.com/*
// @grant none
// ==/UserScript==
(function () {
'use strict';
const ___window___ = window || window.unsafeWindow;
if (___window___.WHTRANS) return;
___window___.WHTRANS = true;
const $ = window.jQuery;
const titleDict = {
'Home': '主页',
'Estate Agents': '地产中介',
'Newspaper': '报纸',
'Job Listing': '工作列表',
'Freebies': '壁纸',
'Classified Ads': '分类广告',
'Properties': '房产',
'All Properties': '所有房产',
'City': '城市',
'Education': '教育',
'Gym': '健身房',
'Biology Modules': '生物学课程',
'Traveling': '飞行中',
'Events': '通知',
'Hospital': '医院',
'Received Events': '收到的通知',
'Saved Events': '保存的通知',
'Awards': '勋章',
'Faction': '帮派',
'Your Properties': '你的房产',
'Stock Market': '股市',
'Spouse\'s Properties': '配偶的房产',
};
const titleLinksDict = {
'Personal stats': '个人统计信息',
'Log': '日志',
'Tell your story': '说出你的故事',
'Rental Market': '租赁市场',
'Selling Market': '销售市场',
'City': '城市',
'Back to Estate Agents': '返回地产中介',
'Tutorial': '教程',
'Back to Education': '返回',
'Recruit Citizens': '招募玩家',
'Events': '通知',
'Travel Home': "回国",
'Rehabilitation': "戒毒康复",
'People': "用户列表",
'Computer': '电脑',
'Market': '市场',
'Back': '返回',
'Hospital': '医院',
'Everyone': '所有人',
'Nobody': '仅自己',
'Friends & faction': '好友 & 帮派成员',
'Forum': '论坛',
'Leave Faction': '离开帮派',
'Properties': '所有房产',
'Back to Properties': '返回所有房产',
};
const sidebarDict = { // todo 从json加载
'Money': '现金',
'Level': '等级',
'Points': 'PT',
'Merits': '天赋点',
'Energy': '能量E',
'Nerve': '犯罪N',
'Happy': '快乐',
'Life': '血量',
'Chain': '连击链Chain',
'Home': '主页',
'home': '主页',
'Items': '物品',
'City': '城市',
'Job': '工作',
'job': '工作',
'Gym': '健身房',
'Properties': '房产',
'property': '房产',
'Education': '教育',
'edu': '教育',
'Crimes': '犯罪',
'Missions': '任务',
'Newspaper': '报纸',
'News': '报纸',
'Jail': '监狱',
'Hospital': '医院',
'Casino': '赌场',
'Forums': '论坛',
'Hall of Fame': '名人堂',
'ranks': '名人堂',
'My Faction': '帮派',
'faction': '帮派',
'Recruit Citizens': '招募玩家',
'recruit': '招募玩家',
'Competitions': '日历',
'comps': '日历',
'Community Events': '社区事件',
'Community': '社区事件',
'Friends': '好友',
'Enemies': '敌人',
'Information': '信息',
'Areas': '区域',
'Lists': '列表',
'messages': '信息',
'events': '通知',
'awards': '勋章',
};
const tooltipDict = {
'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': '阶级',
};
const statusDict = {
'Traveling to Mexico': '正在飞往墨西哥',
'Traveling to Cayman Islands': '正在飞往开曼群岛',
'Traveling to Canada': '正在飞往加拿大',
'Traveling to Hawaii': '正在飞往夏威夷',
'Traveling to United Kingdom': '正在飞往英国',
'Traveling to Argentina': '正在飞往阿根廷',
'Traveling to Switzerland': '正在飞往瑞士',
'Traveling to Japan': '正在飞往日本',
'Traveling to China': '正在飞往中国',
'Traveling to UAE': '正在飞往 UAE',
'Traveling to South Africa': '正在飞往南非',
'Returning to Torn from Mexico': '正从墨西哥返回',
'Returning to Torn from Cayman Islands': '正从开曼群岛返回',
'Returning to Torn from Canada': '正从加拿大返回',
'Returning to Torn from Hawaii': '正从夏威夷返回',
'Returning to Torn from United Kingdom': '正从英国返回',
'Returning to Torn from Argentina': '正从阿根廷返回',
'Returning to Torn from Switzerland': '正从瑞士返回',
'Returning to Torn from Japan': '正从日本返回',
'Returning to Torn from China': '正从中国返回',
'Returning to Torn from UAE': '正从 UAE 返回',
'Returning to Torn from South Africa': '正从南非返回',
'In Mexico': '在墨西哥',
'In Cayman Islands': '在开曼群岛',
'In Canada': '在加拿大',
'In Hawaii': '在夏威夷',
'In United Kingdom': '在英国',
'In United Argentina': '在阿根廷',
'In United Switzerland': '在瑞士',
'In United Japan': '在日本',
'In United China': '在中国',
'In United UAE': '在 UAE',
'In South Africa': '在南非',
};
const miniProfileDict = {};
const homeDict = {
'General Information': '基本信息',
'Property Information': '房产信息',
'Battle Stats': '战斗能力 (BS)',
'Working Stats': '工作能力 (WS)',
'Equipped Armor': '已装防具',
'Equipped Weapons': '已装武器',
'Skill Levels': '技能等级',
'Latest Messages': '近期信息',
'Job Information': '工作信息',
'Latest Events': '近期通知',
'Latest Attacks': '近期攻击',
'Faction Information': '帮派信息',
'Criminal Record': '犯罪记录',
'Personal Perks': '个人加成',
'Property': '房产',
'Cost': '花费',
'Fees': '开销费用',
'Job': '工作',
'Company': '公司',
'Days in company': '在公司的天数',
'Type': '公司类型',
'Position': '职位',
'Income': '公司收入',
'Job points': '工作点数',
'Rating': '星级',
'Faction': '帮派',
'Days in faction': '在帮派的天数',
'Respect': '面子',
'Members': '成员',
'Illegal products': '非法产品',
'Theft': '盗窃',
'Auto theft': '汽车盗窃',
'Drug deals': '非法药品交易',
'Computer crimes': '计算机犯罪',
'Murder': '谋杀',
'Fraud crimes': '诈骗犯罪 (Fraud crimes)',
'Other': '其他犯罪',
'Total': '总计',
'Name': '名字',
'Money': '现金',
'Points': 'PT',
'Level': '等级',
'Rank': '阶级',
'Life': '血量',
'Age': '年龄',
'Marital status': '婚姻状态',
'Networth': '身价',
'Strength': '力量 STR',
'Defense': '防御 DEF',
'Speed': '速度 SPD',
'Dexterity': '敏捷 DEX',
'Hunting skill': '狩猎技能',
'Racing skill': '赛车技能',
'Manual labor': '体力 MAN',
'Intelligence': '智力 INT',
'Endurance': '耐心 END',
};
const attackDict = {
"mugged": "打劫了 ",
"attached": "攻击了 ",
"arrested": "逮捕了 ",
"hospitalized": "暴力殴打了 ",
"but": "但是",
"Someone": "有人",
"lost": "失败了"
};
const newspaperDict = {
'front page': '头版',
'archive': '归档',
'job listing': '工作',
'properties': '房产',
'freebies': '壁纸',
'classified ads': '广告',
'personals': '交友',
'bounties': '悬赏',
'comics': '漫画',
'chronicles': '纪事档案馆',
'TCSE Market Index': 'TCSE 股票指数',
'Weekly bazaars': '每周小店',
'LOTTERY': '幸运彩票',
'BOUNTIES': '精选悬赏',
'TC PERSONALS': '托恩交友',
'Why not visit our sponsor?': '何不看下赞助广告?',
'View all': '查看所有',
'Advertise here': '在此刊登广告',
'Submit your own comic and earn 250 points!': '提交你创作的漫画赚取250PT!',
'Welcome to personal page! Who are you seeking?': '欢迎来到交友页面!你想找谁?',
'Search or put up your own ad!': '搜索或刊登你自己的广告!',
'Put up your own personal advertisement': '发布你自己的交友广告',
'Go to an interview to see if you can get the job, or check out one of the companies that take your fancy, someone might give you the chance of being their employee?':
'参加面试,看看你是否能得到这份工作?或者去看看那些让你心动的公司,有人可能会提供你成为他们的员工的机会?',
'To claim the rewards, please click claim and hospitalize the person.': '',
'Put a bounty on someone': '',
};
const propertyDict = {
'Shack': '棚屋',
'Trailer': '拖车',
'Apartment': '公寓',
'Semi - Detached': '半独立式住宅',
'Semi-Detached House': '半独立式住宅',
'Semi Detached house': '半独立式住宅',
'Detached House': '独立式住宅',
'Beach House': '海滩小屋',
'Chalet': '小别墅',
'Villa': '别墅',
'Penthouse': '顶层公寓',
'Mansion': '豪宅',
'Ranch': '山庄',
'Palace': '宫殿',
'Castle': '城堡',
'Private Island': '私人岛屿 (PI)',
'Owner': '所有人',
'Owner:': '所有人:',
'Happiness': '快乐值',
'Happiness:': '快乐值:',
'Cost': '花费',
'Cost:': '花费:',
'Cost per Day': '平均日花费',
'Rental Period': '租期',
'Rental period:': '租期:',
'Rent': '租赁',
'Info': '信息',
'Buy': '购买',
'Property:': '房屋:',
'Modifications': '改造设施',
'Upkeep:': '维护费:',
'Staff:': '雇员费用:',
'Leased to': '租给了 ',
'Owned by your spouse': '为你的配偶所有',
'Owned by you': '为你所有',
'All Properties': '所有房产',
'Your Properties': '你的房产',
"Spouse's Properties": '配偶的房产',
"Spouse's": '配偶的',
'All': '所有',
'Yours': '你的',
'Customize this property': '自定义该房产',
'Travel': '起飞',
'Kick your spouse out of this property': '把你的配偶赶出该房产',
'Pay upkeep': '支付维护费',
'Move into this property': '搬进该房产',
'Sell this property': '出售该房产',
'Lease this property': '出租该房产',
'Give this property to someone': '赠送该房产给某人',
'Pay bills': '支付账单',
'Recent upkeep payments': '最近的维护费用',
};
const travelingDict = {
'Remaining Flight Time -': '剩余时间 - ',
'Torn to London.': '正在飞往英国伦敦 (London)。',
'London to Torn.': '正从英国伦敦 (London) 回城。',
'Torn to Zurich.': '正在飞往瑞士苏黎世 (Zurich)。',
'Zurich to Torn.': '正从瑞士苏黎世 (Zurich) 回城。',
'Torn to Honolulu.': '正在飞往夏威夷檀香山 (Honolulu)。',
'Honolulu to Torn.': '正从夏威夷檀香山 (Honolulu) 回城。',
'Torn to Buenos Aires.': '正在飞往阿根廷布宜诺斯艾利斯 (Buenos Aires)。',
'Buenos Aires to Torn.': '正从阿根廷布宜诺斯艾利斯 (Buenos Aires) 回城。',
};
const tipsDict = {
'According 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.': "根据经济学人信息部提供的生活质量指数,瑞士是世界上第二个最适合出生的地方,仅次于丹麦。尽管世界上只有194个公认的国家,但托恩却排名第224位。",
'The 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.': "托恩的就业机会广泛而多样,从动物园和肉类仓库的工作,到脱衣舞俱乐部的奇妙开场--这是一个很少用来形容在那里工作的人的描述。",
'One 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.': "在托恩举行婚礼的主要要求之一就是购买一枚戒指。你可以从珠宝店购买,也可以选择在偷窃戒指中选择一种很浪漫的方式,但是你冷静下来想想的话,这也是需要付出更大代价的。",
"Despite 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.": "尽管没有明显的法院系统,托恩仍然在其司法服务部门雇用了几千人。没有人知道这些人整天都在做什么,但如果我们必须猜测,我们会说是接龙。",
"At 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.": "托恩城市学院一度开设了双持近战课程,收费50,000,000美元,但当托恩的市民意识到他们实际上是在花钱学习如何同时持有两样东西时,这个课程就停止了。",
};
const cityDict = {
'Map': '地图',
'Quick Links': '快速链接',
'Key of Symbols': '标志建筑',
'Financial': '金融',
'Administrative': '行政',
'inactive-mode1': '地图上只显示你的帮派的和临近的地盘。',
'inactive-mode2': '启用【全地盘视图】将下载完整地图,大约2.75mb。',
'active-mode': '【全地盘视图】已启用。',
'ADMINISTRATIVE': '行政',
'City Hall': '市政厅',
'Hospital': '医院',
'Jail': '监狱',
'Visitor Center': "WIKI",
"Staff": "Torn City 员工",
"Committee": "委员会",
"Community Center": "社区中心",
"Chronicle Archives": "纪事档案馆",
"Bank": "银行",
"Stock Exchange": "股票交易所",
"Item Market": "交易市场",
"Sweet Shop": "糖果店",
"Msg Inc": "广告公司",
"Donator House": "捐赠者中心",
"Big Al's Gun Shop": "Big Al的枪店",
"Cyber Force": "赛博军团",
"Church": "教堂",
"Education": "教育",
"Travel Agency": "旅行社",
"Auction House": "拍卖行",
"Points Building": "PT 商店",
"Points Market": "PT 市场",
"Docks": "码头车行",
"Estate Agents": "地产中介",
"Jewelry Store": "珠宝店",
"Pawn Shop": "PT 当铺",
"Post Office": "邮局",
"Super Store": "电器商店",
"TC Clothing": "TC服装店",
"Token Shop": "Token 商店",
"Casino": "赌场",
"Dump": "垃圾场",
"Missions": "任务",
"Loan Shark": "鲨客借贷",
"Race Track": "赛车场",
"City Center": "城市中心",
"East Side": "东部地区",
"West Side": "西部地区",
"North Side": "北部地区",
"Red-Light": "红灯区",
"Residential": "住宅区",
'Sort by:': '分类排序方式:',
'Area': '地区',
"Type": "类型",
"Name": "名称",
"Popularity": "人数",
'FINANCIAL': '金融',
'LEISURE': '休闲',
'Leisure': '休闲',
'MISC': '杂项',
'Miscellaneous': '杂项',
'REAL ESTATE': '房地产',
'Real Estate': '房地产',
'SHOPPING': '购物',
'Nikeh Sports': '',
"Bits 'n' Bobs": '胖鲍勃的杂货店',
// '':'',
};
const gymDict = {
'Strength': '力量 STR',
'Defense': '防御 DEF',
'Speed': '速度 SPD',
'Dexterity': '敏捷 DEX',
'STR': '力量',
'DEF': '防御',
'SPD': '速度',
'DEX': '敏捷',
'TRAIN': '锻炼',
'Welcome to': '欢迎来到 ',
'!': '!',
'You walk into the gym and begin browsing the exercises available.':
'你走进健身房,开始浏览可用的健身器材。',
'You have': '你有',
'available to use.': '可用于锻炼。',
'energy': '能量',
'Estimated Energy progress:': '(TornTools) 预估健身房解锁进程:',
'What would you like to train today?': '今天想练点什么?',
'You do not have enough energy left': '你没有足够的剩余能量?',
'BACK TO GYM': '返回健身房',
'ACTIVATE MEMBERSHIP': '激活会员身份',
'BUY MEMBERSHIP': '购买健身房会员',
'Cancel': '返回',
'Chance of hitting opponent': '击中对手的概率',
'Chance of hitting': '击中对手的概率',
"Ability to withstand damage": "承受伤害的能力",
"Withstand damage": "承受伤害的能力",
"Damage you make on impact": "攻击造成的伤害",
"Damage on impact": "攻击造成的伤害",
'Ability to evade an attack': '躲避攻击的能力',
'energy per train': ' 能量/次',
'Class:': '健身房类别:',
"Membership cost:": "会员价格: ",
"Energy usage:": "能量消耗: ",
'Heavyweight': '重量级',
'Strength Gains': '力量增益',
"Speed Gains": "速度增益",
"Defense Gains": "防御增益",
"Dexterity Gains": "敏捷增益",
'Boxing': '拳击',
'Are you sure you would like to buy this membership?': '确定购买这个健身房会员吗?',
'Not Available': '不可用',
'Unavailable': '不可用',
"Middleweight": "中量级",
"Lightweight": "轻量级",
'5 per train': '5 能量/次',
'10 per train': '10 能量/次',
'50 per train': '50 能量/次',
'Bicep Curls': '二头肌弯举',
'Cycling': '自行车',
'Yoga': '瑜伽',
'Press-ups': '俯卧撑',
'Running': '跑步',
'Karate': '空手道',
'Catch': '',
'Leg Curls': '腿部弯举',
'Muay Thai': '泰拳',
"Woody's Slalom Sprint": '无敌回旋冲刺',
'Frisbee': '飞盘',
'Sit-ups': '仰卧起坐',
'Wrestling': '摔跤',
'Lateral Raises': '侧抬',
'Interval Training': '间歇训练',
'Judo': '柔道',
'Balance Board': '平衡板',
'Planking': '长板',
'Kick Boxing': '跆拳道',
'Zumba': '尊巴运动',
'Chin-ups': '引体向上',
'Jujitsu': '柔道',
'Pilates': '普拉提',
'Tricep-dips': '三头肌下蹲',
'Sprint Training': '短跑训练',
'Taekwondo': '跆拳道',
'Squash': '壁球',
'Squats': '深蹲',
'Explosive Kettle Bell': '',
'Darts': '飞镖',
'Chest Flys': '',
'Fartlek Training': '',
'Badminton': '羽毛球',
'Shoulder Shrugs': '肩部耸立',
'Speedball': '迅速球',
'Pool': '',
'Chest Press': '胸部按压',
'Skipping': '跳绳',
'Batting': '',
'Shoulder Press': '肩部推举',
'Viper Belt Training': '',
'Swimming': '游泳',
'Bench Press': '卧推',
'Agility Training Course': '',
'Table Tennis': '敏捷性训练',
'Suicide Running': '',
'Aerobics': '有氧健身操',
'Tricep Pulldowns': '三头肌下拉',
'Incline Sprinting': '',
'Basketball': '篮球',
'Weighted Chin-ups': '负重引体向上',
};
const gymList = {
'Premier Fitness': '首席健身',
'Average Joes': '平衡乔伊',
"Woody's Workout Club": '无敌健身',
'Beach Bods': '沙滩之恋',
'Silver Gym': '白银健身',
'Pour Femme': '女士健身',
'Davies Den': '戴维斯之家',
'Global Gym': '全球健身房',
'Knuckle Heads': '手指头',
'Pioneer Fitness': '先锋健身',
'Anabolic Anomalies': '代谢异常',
'Core': '主干力量',
'Racing Fitness': '竞速健身',
'Complete Cardio': '完全有氧',
// 'Legs, Bums and Tums': '腿,臀和腹部',
'Legs, Bums and Tums': '底盘训练',
'Deep Burn': '深燃',
'Apollo Gym': '阿波罗健身',
'Gun Shop': '枪店健身',
'Force Training': '暴力训练',
"Cha Cha's": '茶茶',
'Atlas': '阿特拉斯健身房',
'Last Round': '最后一轮',
'The Edge': '临界点',
"George's": '乔治',
'Balboas Gym': '巴尔博斯健身房',
'Frontline Fitness': '前线健身',
'Gym 3000': '健身3000',
'Mr. Isoyamas': '伊索亚玛斯先生',
'Total Rebound': '全面反弹',
'Elites': '精英',
'The Sports Science Lab': '运动科学实验室',
'The Jail Gym': '监狱健身房',
};
const eduDict = {
'Biology': '生物学',
'Business': '商学',
'Combat Training': '战斗训练',
'Computer Science': '计算机科学',
'General Studies': '基础学科',
'Health & Fitness': '健康与健身',
'History': '历史学',
'Law': '法学',
'Mathematics': '数学',
'Psychology': '心理学',
'Self Defense': '自卫',
'Sports Science': '运动科学',
'Biology Modules': '生物学课程',
'Introduction to Biochemistry': '生物化学概论',
'Physiological Testing': '生理测试',
'You do not meet the requirements for this course. Please complete the prerequisites first.':
'你不符合本课程的要求。请先学习前置课程。',
'Description:': '描述:',
'Learning outcomes:': '学习后可获得:',
'Prerequisites:': '前置课程:',
'Parameters:': '课程参数:',
'As the ultimate module - you will focus on maximum gym gain with the least amount of input.': '',
'Ability to withdraw and deliver blood': '抽取和输送血液的能力 (使用血包)',
// 'Gain {$1} {$2} upon completion': '获得{$1}点{$2}',
'intelligence': '智力(INT)',
'endurance': '耐心(END)',
'manual labor': '体力(MAN)',
'[Leave this course]': '[退出课程]',
'You are taking the': '你正在学习',
'education course.': '课程',
'This course will be completed in': '该课程将完成于',
'Strength and Conditioning': '力量和体能训练',
'[Leave course]': '[确认退出课程]',
'Are you sure you want to leave the': '你确定你要退出',
'course?': '课程吗?',
'course.': '课程。',
'course!': '课程!',
'It will take': '这将需要',
'to complete.': '来完成。',
'You have started the': '你已开始学习',
'You are currently taking this course.': '你目前正在学习这个课程。',
'You have completed this course!': '你已学习过该课程!',
'You are currently taking an education course already. This course must be completed before you can start another.':
'你已经参加了一个课程。在你开始另一个课程之前,必须先完成这个课程。',
'The current progress will be canceled and you\'ll have to start all over again.': '目前的进度将被取消,你将需要重新开始。',
'Sports Science Modules': '运动科学模块',
'Introduction to Sports Science': '运动科学概论',
"Are you the missing link? At the end of this course you'll know more about Neanderthal man than the Discovery Channel.":
'你是缺失的那一环吗?在本课程结束时,你对尼安德特人的了解将超过探索频道的内容。',
"Congratulations! You have completed the": '恭喜!你已完成了',
"You have gained the following:": '你已经获得了以下:',
"upon completion": '于课程完成后',
"Gain": '获得',
"Length": '时长',
"Cost": '费用',
"Tier: 2": '级别: T2',
"Tier: 1": '级别: T1',
"Tier: 3": '级别: T3',
"Gain a 1% bonus to strength gains in the gym": '健身房锻炼时获得1%的力量增长增益',
"Bonus:": '增益:',
'Introduction to General Studies': '基础学科入门',
'Driving License': '驾照',
'Gain access to driving related crimes': '可进行驾驶相关的犯罪 (解锁11系列)',
"You'll need this to get around the city. Our crash course should give you a license without fail.":
'你将需要这个来在城市中穿梭。我们的速成班应该能让你顺利拿到驾照。',
'Astronomy': '天文学',
'Mechanical Arts': '机械艺术',
'General Mechanics': '通用机械学',
'Basic English': '基础英语',
'Ivory Crafting': '象牙工艺',
'Intravenous Therapy': '静脉注射',
'Put that fear of needles behind you by learning how to successfully administer a blood transfusion.':
'通过学习如何成功地进行输血,将对针头的恐惧抛在脑后。',
'Networking': '网络',
'Gain access to hacking crimes': '可进行黑客犯罪 (解锁18系列)',
'Computer Security and Defense': '计算机安全与防御',
'Gain a 10% increase in hacking crime success rate': '提高黑客犯罪10%的成功率',
};
const headerDict = {
"User's Name / ID": '用户名或ID',
"Name": '用户名',
'Faction': '帮派',
'Company': '帮派',
'Places': '地点',
'Item Market': '交易市场',
'Forum posts': '论坛',
'Help': '帮助',
'search...': '搜索',
'Search users by...': '高级用户搜索',
'Property': '住房',
'Male': '男性',
'Female': '女性',
'to': '到',
'Condition': '条件',
'Married': '在已婚状态',
'Travelling': '在飞行中',
'In a faction': '在帮派中',
'In a company': '在公司中',
'In hospital': '在医院里',
'In jail': '在监狱里',
'In Federal jail': '在联邦监狱里',
'Level': '等级',
'Days old': '游戏天数',
'Offences': '违法行为',
'Last action': '上次动作',
'Reset': '重置',
'Search': '搜索',
'0 - 15 min': '0 - 15 分钟',
'15 min - 1 hour': '15 分钟 - 1 小时',
'1 hour - 1 day': '1 小时 - 1 天',
'1 day - 1 week': '1 天 - 1 周',
'1 week - 1 month': '1 周 - 1 月',
'1 month - 1 year': '1 月 - 1 年',
'longer than 1 year ago': '久于 1 年前',
'Not': '不',
'View Log': '查看日志',
'View Profile': '查看个人资料',
'Settings': '设置',
'Server:': '服务器 ',
'Dark Mode': '黑夜模式',
'News Ticker': '滚动通知',
'Desktop View': '桌面视图',
'Logout': '登出',
'Gender': '性别',
};
const eventsDict = {
// "ALL EVENTS": "所有通知",
// "RECEIVED": "收到的通知",
// "SAVED": "已保存通知",
"Delete selected": " 删除已选",
"Save selected": " 保存已选",
"Check All": " 全选",
"Uncheck All": " 取消全选",
// "Events": "通知",
// "Log": "日志",
// "Back": "返回",
// "Recruit Citizens": "招募市民",
// "Tutorial": "教程",
'ALL EVENTS (': '全部通知 (',
'All Events': '全部通知',
'RECEIVED (': '收到的通知 (',
'Received Events': '收到的通知',
'SAVED (': '保存的通知 (',
'Saved Events': '保存的通知',
'hospitalized': '强制住院了',
'and earned your': ',赢得',
'bounty reward': '赏金',
'Someone hospitalized': '某人强制住院了',
'You pop the LSD pill into your mouth and down a glass of water. A headache is followed by nausea and vomiting. You have overdosed.':
'你把 LSD 塞进嘴里,然后喝下一杯水。头痛之后是恶心和呕吐。你用药过量了(OD)。',
'Your application to join the company': '加入公司 ',
'has been declined': ' 的申请已被拒绝。',
'has been accepted': ' 的申请已被通过。',
'You have been given a bazaar for your 250 points. You can now sell items there.':
'你收到了花费 250 PT 买来的集市。现在你可以在那里出售物品。',
'You have received a Stock Ticker in exchange for 25 points. Now you can access the Stock Market and start buying shares.':
'你收到了花费 25 PT 买来的股票交易机。现在你可以进入股票市场并开始购买股票。',
'You have received a Racing License in exchange for 50 points. You can now access the Race Track in the city.':
'你收到了花费 50 PT 买来的赛车执照。你现在可以进入城市的赛车场了。',
'You have been given a display cabinet for your 100 points. Now you can store special items there. Go to the items page to start using it.':
'你收到了花费 100 PT 买来的展示柜。现在你可以在那里储存特殊物品。进入物品页面,开始使用它。',
'successfully revived you.': ' 成功复活了你',
'Save': '保存',
'Send': '发送',
'SEND': '发送',
'Cancel': '取消',
'Send Event': '发送通知',
'Delete': '删除',
'failed to revive you.': ' 没能复活你。',
'User ID:': '用户:',
'You have successfully referred': '你已经成功推荐了 ',
'. Once they have validated, they will be added to your':
'。一旦他成功验证,他将被添加到你的',
'referral list': '推荐人列表',
'and you will start earning rewards from them as they level up.':
'中,且你会当他们等级提升时获得奖励。',
'You have used the reward bonus code {$} and have received a boost of +250 energy.':
'你已使用奖励兑换码 {$},收到了 250 能量E。',
', the director of':
' (',
'MAN': '体力 (MAN)',
'END': '耐心 (END)',
'INT': '智力 (INT)',
'You took some Xanax and downed a glass of water. A headache was followed by nausea and vomiting. You overdosed.':
'你吃了一些 Xanax,喝了一杯水。头痛之后是恶心和呕吐。你用药过量了(OD)。',
};
const chatDict = {
'Global': '世界',
'Faction': '帮派',
'People': '联系人',
'Settings': '设置',
'Trade': '交易',
'Jail': '监狱',
'Hospital': '医院',
'Company': '公司',
'Height': '高度',
'Width': '宽度',
'Jail & Hospital': '监狱和医院',
'Traveling': '海外',
'Competition': '活动',
'Private': '私聊',
'Room sound': '音效',
'Who is allowed to initiate chat with you?': '谁可以与你发起私聊?',
'Disabled': '关闭',
'Enabled': '开启',
'Flash notifier': '闪烁提示',
'Chirp 1': '啁啾声 1',
'Chirp 2': '啁啾声 2',
'Chirp 3': '啁啾声 3',
'Flash & sound': '闪烁和音效',
'Click 1': '点击音 1',
'Click 2': '点击音 2',
'Data 1': '哒嗒 1',
'Data 2': '哒嗒 2',
'Data 3': '哒嗒 3',
'Double 2': '',
'Electronic 1': '',
'Electronic 2': '',
'Future 1': '',
'Future 2': '',
'Plink 1': '',
'Plink 2': '',
'Soft beep 1': '',
'Soft beep 2': '',
'Subtle': '',
'Transmission 1': '',
'Transmission 2': '',
'Warble 1': '',
'Warble 2': '',
'Only people you know or have met': '只有你认识或遇到过的人',
'Anyone can initiate chat with you': '任何人',
'Recent': '最近',
'Friends': '好友',
'Blocked': '拉黑',
'All': '全部',
'Enter a name or ID to add to this list': '输入用户名或ID来添加到这个列表',
'This list is empty.': '这个列表是空的。',
};
const hosDict = {
"You take a trip down to the hospital to see who's been unlucky today.": "你来了一趟医院,看看今天是谁那么倒霉",
"Nobody can revive you.": "现在没有玩家可以复活你",
"Anyone can now revive you.": "现在任何玩家都能复活你",
"Only those on your friends list & your faction members can now revive you.": "现在只有好友以及帮派成员可以复活你",
"in Hospital": "在住院",
"People are": "名玩家",
"Time": "时长",
"Level": "等级",
"Reason": "原因",
"Overdosed on Xanax": "吸食Xanax过量",
"Shot while attempting to take down a president": "在试图袭击总统时受了枪伤",
"Taken down by guards": "被保安击倒",
"Got a nasty surprise in the post.": "收到并打开了一个伤害性包裹",
"Dropped by Swiss Guards": "被瑞士警卫队抛下",
"Mauled by a guard dog": "被警卫犬袭击受伤",
"Collapsed after taking Ketamine": "服用Ketamine后昏倒",
"Collapsed after taking PCP": "服用PCP昏倒",
"Burned in an arson attempt": "在一次纵火案中被烧伤",
"Fallen ill with radiation poisoning": "因辐射中毒而病倒",
"Taken down by members of Aftermath": "被Aftermath的成员击倒了",
"Crashed his": "出车祸并撞毁了他的",
"Crashed her": "出车祸并撞毁了她的",
"Taken down by members of The Black Hand": "被黑手党成员拿下",
"Got derailed": "火车脱轨致伤",
"Third degree burns on back from explosion": "爆炸造成的背部三度烧伤",
"general": "被玩家 ",
"Hit in the head by flying metal": "被飞来的金属击中头部",
"Shot themselves in the foot": "打了自己腿一枪",
"Hospitalized by someone": "被某人殴打并送入医院",
"Attacked by someone": "被某人攻击",
"Mugged by someone": "被某人抢劫",
"Gunned down by FBI agents": "被联邦调查局特工枪击",
"Taken down by a SWAT marksman": "被一名特警射手击倒",
"Exploded": "被炸伤",
"Fell from a two story building while on a hitman mission": "在执行杀手任务时从两层的建筑坠落",
"Suffering from an acute hemolytic transfusion reaction": "患上了急性溶血性输血反应疾病",
"Choked out by Leslie": "被Leslie掐喉",
"Shot in the back": "背部中枪",
"Lost to": "输给了 ",
};
const awDict = {
'Honors (': '荣誉 (',
'Medals (': '勋章 (',
'Merits (': '天赋加点 (',
'As you progress, you will unlock new honors. To add an Honor to your name, click the one you want.':
'新的荣誉条将随着你的进步解锁。请点击想要在你的名字上显示的荣誉条。',
'As you progress, you will unlock new medals. Your medals will be pinned on your profile to show your\nprestige.':
'新的勋章将随着你的进步解锁。勋章将显示在个人资料上。',
'You have': '你有 ',
'merits': '天赋点',
'merit': '天赋点',
'medals': '勋章',
'honors': '荣誉',
'Available Merits:': '可用天赋点:',
'Merits Used:': '已用天赋点:',
"to spend on anything you would like on\nthe list below.\nYou've earned these merits by attaining":
' 可用于升级以下列表中的任意天赋。这些天赋点是通过 ',
'and': ' 和 ',
".\nThe enhancements are incremental and will go up in cost the more you upgrade them.\nFor example, if you pay one merit to upgrade an improvement,\nnext time you want to upgrade it you will need to pay two merits, after that three etc.":
' 获得的。天赋升级的花费是递增的,等级越高升级需要的天赋点就越高。如果花费1天赋点来升级一个天赋,下次就需要花费2天赋点升级该天赋,之后是三个等依次类推。',
'Awards you are about to unlock': '即将解锁的勋章',
'Upgrade': '升级',
'Progress': '升级进程',
'Expand All': '展开所有',
'Latest': '近期获得',
'Defaults': '默认荣誉条',
'Attacking': '攻击',
'Camo': '迷彩',
'Weapons': '武器',
'Education': '教育',
'Crimes': '犯罪',
'Drugs': '药章',
'Jail & Hospital': '监狱与医院',
'Travel': '旅行',
'Gym': '锻炼',
'Level': '等级',
'Competitions': '节日活动',
'Money': '金钱',
'Items': '物品',
'Commitment': '足迹',
'Casino': '赌场',
'Missions': '任务',
'Misc': '杂项',
'General': '一般',
'Rank': '阶级',
'Networth': '身价',
'SPEND': '升级',
'CHANGE': '更改',
'Cancel': '取消',
'Are you sure you want to change your name background to this Honor?': '确定修改你的名字背景为这个荣誉吗?',
'Nerve Bar': '犯罪N上限',
'Critical Hit Rate': '暴击率',
'Life Points': '血量',
'Crime Experience': '犯罪经验',
'Education Length': '教育时长',
'Awareness': '感知能力',
'Bank Interest': '银行利润',
'Masterful Looting': '大师掠夺',
'Stealth': '隐身',
'Hospitalizing': '送医时长',
'Addiction Mitigation': '毒瘾缓解',
'Employee Effectiveness': '员工效率',
'Brawn': '臂力',
'Protection': '保护',
'Sharpness': '敏锐',
'Evasion': '回避',
'Heavy Artillery Mastery': '重炮精通 (Heavy Artillery)',
'Machine Gun Mastery': '机枪精通 (Machine Gun)',
'Rifle Mastery': '步枪精通',
'SMG Mastery': '冲锋枪精通',
'Shotgun Mastery': '霰弹枪精通',
'Pistol Mastery': '手枪精通',
'Club Mastery': '冲击武器精通 (Clubbing)',
'Piercing Mastery': '穿刺武器精通',
'Slashing Mastery': '切割武器精通',
'Mechanical Mastery': '机械武器精通',
'Temporary Mastery': '临时武器精通',
'Increases maximum nerve bar by 1 point': '增加 1 点犯罪N上限',
'Increases critical hit rate by 0.5%': '提高 0.5% 暴击率',
'Increases maximum life by 5%': '提高 5% 血量上限',
'Increases crime success rate': '提高犯罪成功率',
'Decreases education course length by 2%': '降低教育课程 2% 时长',
'Increases frequency of items found in the city': '提高城市中发现物品的频率',
'Increases bank interest by 5%': '提高 5% 银行利息',
'Increases money gained from mugging by 5%': '提高 5% 抢劫获得的金钱',
'Increases ability to stealth attacks': '增加攻击后匿名的概率',
'Increases hospitalization time by 5%': '提高被强制送往医院玩家 5% 的住院时长',
'Reduces the negative effects of addiction by 2%': '降低 2% 毒瘾负面效果',
'Increases employee effectiveness by +1': '增加 +1 员工效率',
'Gives a passive bonus to strength of 3%': '获得力量 3% 被动增益',
'Gives a passive bonus to defense of 3%': '获得防御 3% 被动增益',
'Gives a passive bonus to speed of 3%': '获得速度 3% 被动增益',
'Gives a passive bonus to dexterity of 3%': '获得敏捷 3% 被动增益',
'Increases proficiency with heavy artillery': '提高重炮精通',
'Increases proficiency with machine guns': '提高机枪精通',
'Increases proficiency with rifles': '提高步枪精通',
'Increases proficiency with submachine guns': '提高冲锋枪精通',
'Increases proficiency with shotguns': '提高霰弹枪精通',
'Increases proficiency with pistols': '提高手枪精通',
'Increases proficiency with clubbing weapons': '提高冲击武器精通',
'Increases proficiency with piercing weapons': '提高穿刺武器精通',
'Increases proficiency with slashing weapons': '提高切割武器精通',
'Increases proficiency with mechanical devices': '提高切割武器精通',
'Increases proficiency with temporary weapons': '提高临时武器精通',
'Increases damage and accuracy of heavy artillery weapons': '提高重炮伤害与命中',
'Increases damage and accuracy of machine gun weapons': '提高机枪伤害与命中',
'Increases damage and accuracy of rifle weapons': '提高步枪伤害与命中',
'Increases damage and accuracy of submachine gun weapons': '提高冲锋枪伤害与命中',
'Increases damage and accuracy of shotgun weapons': '提高霰弹枪伤害与命中',
'Increases damage and accuracy of pistol weapons': '提高手枪伤害与命中',
'Increases damage and accuracy of axe & clubbing weapons': '提高斧头和冲击武器的伤害与命中',
'Increases damage and accuracy of piercing weapons': '提高穿刺武器的伤害与命中',
'Increases damage and accuracy of slashing weapons': '提高切割武器的伤害与命中',
'Increases damage and accuracy of mechanical devices': '提高机械武器的伤害与命中',
'Increases damage and accuracy of temporary weapons': '提高临时武器的伤害与命中',
'Are you sure you want to spend': '确定要花费 ',
'on': '在',
'upgrade?': '升级上吗?',
'You have upgraded this merit upgrade to the maximum already.':
'你已将该升级升满。',
'This upgrade will give you one extra nerve point on your maximum nerve.':
'该升级会增加 1 犯罪N上限。',
"This upgrade will give you an extra 0.5% chance at getting a critical hit during attacks. Critical hits are blows made on an opponent's head, throat or heart during an attack.":
'这个升级将使你在攻击时有额外的 0.5% 几率获得暴击。暴击是指在攻击过程中击中对手的头部、喉咙或心脏。',
"This upgrade will increase your maximum life by 5%. This upgrade works great with your defense and might keep you going a little longer during attacks.":
'这个升级将使你的最大生命值增加 5%。这个升级对你的战斗有很大作用,可能会让你在攻击中坚持更久。',
"This upgrade will give you a continuous boost of 3% (per upgrade) to the effect of your crime experience resulting in increased success rates.":
'这项升级将使你在每次成功犯罪时获得的经验持续提升 3% (每次升级),从而提高犯罪成功率。',
"This upgrade will decrease the amount of days you have to wait to complete an education course. This upgrade will start working on the next education course you start.":
'这项升级将减少你完成教育课程所需的等待天数。这项升级将在你的下一个教育课程中生效。',
'This upgrade will increase the amount of items you can find in the city, however it will not necessarily increase their quality.':
'该升级会增加你在城市中能找到的物品数量,但不一定能提高它们的质量。',
'This upgrade will give you an increase of 5% to your investment bank interest. This upgrade will start working on your next investment.':
'这一升级将使你的银行利息增加 5%。这项升级将在下一次银行投资中生效。',
'This upgrade will give you a 5% boost in money that you mug from opponents. Perfect for experienced muggers, looking for some extra cash.':
'这个升级将使你从对手那里抢来的钱增加5%。非常适合有经验的抢劫者,赚些额外的钱钱。',
"This upgrade will make you more likely to stay stealthed when beating an opponent by increasing your stealth level by 0.2 per increment. When you're stealthed, your name will be listed as 'Someone' so your enemy will not know who hit them.":
'这个升级将提升 0.2 隐身级别,使你在击败对手时更有可能保持隐身状态。当你处于隐身状态时,你的名字将被列为“某人”,所以你的敌人不会知道是谁攻击了他们。',
"This upgrade will increase the amount of time you hospitalize someone by 5%. Make sure they feel the burn with 50% extra hospital time when fully upgraded.":
'这项升级将使你增加 5% 被强制住院玩家的住院时间。完全升级后,确保他们感受到50%的额外住院时间。',
"This upgrade will reduce the negative effects addiction causes towards your battle stats, employee effectiveness, and education / gym access.":
'这一升级将减少毒瘾对你的战斗能力、员工效率、教育和访问健身房的负面影响。',
"This upgrade will provide an additional minor bonus to employee effectiveness, helping you to earn more money for the company you work for.":
'这一升级将为员工的工作效率提供额外的轻量加成,帮助你为你的公司赚更多钱。',
"This upgrade will give you a passive bonus to your strength stat. This upgrade will not increase your actual viewable stat number, but you will notice the effects during attacks.":
'这个升级将给你带来力量被动加成。这个升级不会增加实际可查看的战力,但你会在攻击时注意到其效果。',
"This upgrade will give you a passive bonus to your defense stat. This upgrade will not increase your actual viewable stat number, but you will notice the effects during attacks.":
'这个升级将给你带来防御被动加成。这个升级不会增加实际可查看的战力,但你会在攻击时注意到其效果。',
"This upgrade will give you a passive bonus to your speed stat. This upgrade will not increase your actual viewable stat number, but you will notice the effects during attacks.":
'这个升级将给你带来速度被动加成。这个升级不会增加实际可查看的战力,但你会在攻击时注意到其效果。',
"This upgrade will give you a passive bonus to your dexterity stat. This upgrade will not increase your actual viewable stat number, but you will notice the effects during attacks.":
'这个升级将给你带来敏捷被动加成。这个升级不会增加实际可查看的战力,但你会在攻击时注意到其效果。',
"This upgrade will improve the damage and accuracy of these weapons when you use them in attacks. Heavy Artillery weapons include: Flamethrower, RPG Launcher, and Type 98 Anti Tank.":
'这种升级将提高使用这些武器进行攻击时的伤害和命中。重炮包括:火焰喷射器 (Flamethrower)、RPG发射器 (RPG Launcher)、98式反坦克 (Type 98 Anti Tank)。',
"This upgrade will improve the damage and accuracy of these weapons when you use them in attacks. Machine Gun weapons include: M249 SAW, Rheinmetall MG 3, and Snow Cannon.":
'这种升级将提高使用这些武器进行攻击时的伤害和命中。机枪包括:M249 SAW、Rheinmetall MG 3、Snow Cannon。',
"This upgrade will improve the damage and accuracy of these weapons when you use them in attacks. Rifle weapons include: AK-47, Enfield SA-80, and ArmaLite M-15A4.":
'这种升级将提高使用这些武器进行攻击时的伤害和命中。步枪包括:AK-47、Enfield SA-80、ArmaLite M-15A4。',
"This upgrade will improve the damage and accuracy of these weapons when you use them in attacks. SMG weapons include: P90, MP5 Navy and 9mm Uzi.":
'这种升级将提高使用这些武器进行攻击时的伤害和命中。冲锋枪包括:P90、MP5 Navy、9mm Uzi。',
"This upgrade will improve the damage and accuracy of these weapons when you use them in attacks. Shotgun weapons include: Jackhammer, Mag 7, and Ithaca 37.":
'这种升级将提高使用这些武器进行攻击时的伤害和命中。霰弹枪包括:Jackhammer、Mag 7、Ithaca 37。',
"This upgrade will improve the damage and accuracy of these weapons when you use them in attacks. Pistol weapons include: Glock 17, Desert Eagle, and Flare Gun.":
'这种升级将提高使用这些武器进行攻击时的伤害和命中。手枪包括:格洛克 (Glock 17)、沙漠之鹰 (Desert Eagle)、Flare Gun。',
"This upgrade will improve the damage and accuracy of these weapons when you use them in attacks. Clubbing weapons include: Baseball Bat, Frying Pan, and Axe (Melee weapons that usually just cause a heavy blow).":
'这种升级将提高使用这些武器进行攻击时的伤害和命中。冲击武器包括:棒球棒 (Baseball Bat)、平底锅 (Frying Pan)、斧头 (Axe) (造成沉重冲击的近战武器)。',
"This upgrade will improve the damage and accuracy of these weapons when you use them in attacks. Piercing weapons include: Pen Knife and Dagger (Melee weapons that you stab with to pierce the skin).":
'这种升级将提高使用这些武器进行攻击时的伤害和命中。穿刺武器包括:折叠刀 (Pen Knife)、匕首 (Dagger) (刺穿皮肤的近战武器)。',
"This upgrade will improve the damage and accuracy of these weapons when you use them in attacks. Slashing weapons include: Samurai Sword and Scimitar (Swords and other weapons that you would slash with).":
'这种升级将提高使用这些武器进行攻击时的伤害和命中。切割武器包括:武士刀 (Samurai Sword)、弯刀 (Scimitar)(用来劈砍的剑或其他近战武器)。',
"This upgrade will improve the damage and accuracy of these weapons when you use them in attacks. Mechanical devices include: Chainsaw and Taser (Weapons with an electronic or engineered system).":
'这种升级将提高使用这些武器进行攻击时的伤害和命中。机械武器包括:电锯 (Chainsaw)、电击枪 (Taser) (带有电子或工程系统的近战武器)。',
"This upgrade will improve the damage and accuracy of these weapons when you use them in attacks. Temporary weapons include: Grenade, Ninja Star, and Molotov Cocktail (Temporary weapons that cause damage).":
'这种升级将提高使用这些武器进行攻击时的伤害和命中。临时武器包括:手雷 (Grenade)、忍者飞镖 (Ninja Star)、鸡尾酒 (Molotov Cocktail) (造成伤害的临时武器)。',
"Go to hospital 250 times (Very Common)": '住院 250 次 (非常常见)',
};
const playerTitleList = {
'_wiki_url_': 'https://wiki.torn.com/wiki/Title',
'Accomplice': '',
'Addict': '',
'Alcoholic': '',
'Antagonist': '',
'Bondsman': '',
'Booster': '',
'Boxer': '',
'Buster': '',
'Coward': '',
'Citizen': '',
'Damage Dealer': '',
'Deserter': '',
'Druggy': '',
'Egotist': '',
'Felon': '',
'Healer': '',
'Hitman': '',
'Hoarder': '',
'Importer': '',
'Intimidator': '',
'Investor': '',
'Jobsworth': '',
'Killer': '',
'Loser': '',
'Marksman': '',
'Medalist': '',
'Mercenary': '',
'Merchant': '',
'Mobster': '',
'Newcomer': '',
'Nudist': '',
'One Hit Killer': '',
'Outcast': '',
'Punchbag': '',
'Samaritan': '',
'Sage': '',
'Scavenger': '',
'Silent Killer': '',
'Slayer': '',
'Soldier': '',
'Socialite': '',
'Tank': '',
'Thief': '',
'Tourist': '',
'Trader': '',
'Tycoon': '',
};
const ocList = {
'blackmail someone': '敲诈某人',
'blackmailed someone': '敲诈某人',
'kidnap someone': '绑架某人',
'kidnapped someone': '绑架某人',
'make a bomb threat': '炸弹袭击',
'made a bomb threat': '炸弹袭击',
// 'planned robbery':'有计划的抢劫',
// 'rob a money train':'抢劫运钞车',
// 'take over a cruise liner':'攻占一艘游轮',
// 'hijack a plane':'劫持飞机',
// 'political assassination':'政治暗杀 (PA)',
};
const profileDict = {
'User Information': '用户信息',
'Actions': '动作',
'Status': '',
'Medals': '',
'Basic Information': '',
'Personal Information': '',
'Competition Status': '',
'Level': '',
'Rank': '',
'Age': '',
'What would you like to do?': '你想做什么?',
'Give some money to {$}': '给予 {$} 一些钱',
'Initiate a chat with {$}': '与 {$} 发起聊天',
'Initiate a trade with {$}': '与 {$} 发起交易',
'Send {$} a message': '给 {$} 发送消息',
'Add {$} to your enemy list': '添加 {$} 到你的敌人列表',
'Add {$} to your friend list': '添加 {$} 到你的朋友列表',
'View {$}\'s personal statistics': '查看 {$} 的个人统计数据',
'{$} is currently traveling': '{$} 目前正在飞行',
'{$} has no items in their bazaar': '{$} 的集市上没有物品',
'View {$}\'s bazaar': '{$} 的集市上没有物品',
'Place a bounty on {$}': '悬赏 {$}',
'Report {$} to staff': '向 Torn City 工作人员举报 {$}',
'Attack {$}': '攻击 {$}',
'{$} has not been online in the last 6 hours': '{$} 在过去6小时内没有上线',
'{$} is on your friend list': '{$} 在你的朋友列表中',
'{$} is on your enemy list': '{$} 在你的敌人列表中',
'You do not have enough energy to attack {$}': '你没有足够的能量E来攻击 {$}',
'Description': '描述',
'{$} characters left': '剩余 {$} 可用字符',
'ADD': '添加',
'ENEMY': '敌人',
'FRIEND': '朋友',
'Cancel': '取消',
'You are currently traveling': '目前你还在飞行中',
'You are not in Torn': '你不在城内',
'You don\'t own a Laptop!': '你没有笔记本电脑',
'View {$}\'s display cabinet': '查看 {$} 的展示柜',
};
const sendCashDict = {
'Some players may be out to part you from your money, using any means necessary. Use the secure trade feature if you want to protect an exchange and check the contents very carefully.':
'有些玩家可能会利用任何必要的手段来骗走你的钱。如果你想保护交易,请使用更安全的“交易”功能,并仔细检查交易的内容。',
'Do not fall for scams!': '切勿上当受骗!',
'For more info please visit here.': '欲了解更多信息,请点击访问。',
'SEND': '发送',
'Cancel': '取消',
'Message (optional, up to 200 characters)': '附带信息 (可选,最多200字符)',
'Click here to add the maximum amount, or use shortcuts like
5k, 1.5m, max, half, quarter, 1/2, 1/3, 1/4, 25%':
'点此添加最大额度,或输入快捷选项如
5k, 1.5m, max, half, quarter, 1/2, 1/3, 1/4, 25%',
};
const stockDict = {
'Stock': '股票',
'Name': '名称',
'Price': '单价',
'1h': '1时',
'24h': '24时',
'7d': '7天',
'1m': '1月',
'1y': '1年',
'Live': '实时',
'live': '实时',
'Last hour': '过去一小时',
'Last day': '过去一天',
'Last week': '过去一周',
'Last month': '过去一个月',
'Last year': '过去一年',
'All time': '有史以来',
'Owned': '持有',
'Dividend': '分红',
'West Side University': '西城大学',
'Insured On Us': '托恩人保',
'Torn City Investments': 'Torn City 投资',
'Torn & Shanghai Banking': 'Torn 和上海银行',
'Symbiotic Ltd.': '共生公司',
'Crude & Co': '原油公司',
'Feathery Hotels Group': '飞亚达酒店集团',
'Mc Smoogle Corp': '麦斯莫格公司',
'Wind Lines Travel': '风线旅行',
'Performance Ribaldry': '低俗演绎',
'Syscore MFG': '系统核心 MFG',
'Evil Ducks Candy Corp': '邪恶鸭糖果公司',
'Munster Beverage Corp.': '明斯特饮料公司',
'Torn City Clothing': 'Torn City 服饰',
'Lucky Shots Casino': '幸运赌场',
'TC Media Productions': 'TC 媒体制作公司',
'International School TC': 'TC 国际学校',
'Big Al\'s Gun Shop': '大艾尔枪店',
'Torn City Health Service': 'TC 健康服务中心',
'Alcoholics Synonymous': '',
'Torn City Motors': 'TC 汽车',
'Legal Authorities Group': '权威法律集团',
'The Torn City Times': '托恩时代',
'Grain': '谷物',
'Eaglewood Mercenary': '鹰林佣兵',
'Home Retail Group': '家庭零售集团',
'Empty Lunchbox Traders': '空饭盒贸易商',
'Messaging Inc.': '信息公司',
'TC Music Industries': 'TC 音乐工业公司',
'I Industries Ltd.': '一号工业有限公司',
'Tell Group Plc.': '讲述集团',
'Yazoo': '',
// '1x Drug Pack': '',
// '1x Feathery Hotel Coupon': '',
// '1x Erotic DVD': '',
// '1x Six Pack of Energy Drink': '',
// '1x Clothing Cache': '',
// '1x Lottery Voucher': '',
// '1x Ammunition Pack': '',
// '1x Box of Medical Supplies': '',
// '1x Six Pack of Alcohol': '',
// '1x Lawyer Business Card': '',
// '1x Box of Grenades': '',
'1x Random Property': '1 个随机房产',
'10% Bank Interest Bonus': '10% 银行利润增益',
'a 10% Bank Interest Bonus': '10% 银行利润增益',
'100 Energy': '100 能量E',
'Private Jet Access': '解锁私人飞机',
'1000 Happiness': '1000 快乐',
'Advanced Firewall': '高级防火墙',
'an Advanced Firewall': '高级防火墙',
'Company Sales Boost': '提升公司销量',
'a Company Sales Boost': '提升公司销量',
'Free Education Courses': '免费教育课程',
'a Free Education Courses': '免费教育课程',
'10% Racing Skill Boost': '提升 10% 赛车技能增长',
'10% Home Upgrade Discount': '10% 房屋设施费用折扣',
'Free Classified Advertising': '免费分类广告',
'50% Coding Time Reduction': '缩减 50% 编程时间',
'Company Advertising Boost': '公司广告增益',
'a Company Advertising Boost': '公司广告增益',
'10% Course Time Reduction': '缩减 10% 教育时间',
'a 10% Education Course Time Reduction': '缩减 10% 教育时间',
'Free Banner Advertising': '免费横幅广告',
'a Free Banner Advertising': '免费横幅广告',
'Inactive': '未激活',
'Benefit active': '分红已激活',
'provides': '将提供',
'Every': '在每',
'when holding at least': '后,仅当持有至少',
'shares currently valued at': '股时,目前总价:',
'days': '日',
'Buy': '购买',
'more shares for': '股,目前总价',
'to unlock the': '用以解锁',
'increment': '增益',
'After': '在',
'You currently have': '你目前有',
'benefit': '增益',
'You cannot buy shares while traveling': '你在旅行时无法购买',
'You cannot sell shares while traveling': '你在旅行时无法出售',
'How many shares would you like to': '多少股你想',
'buy': '买入',
'sell': '卖出',
'will buy you': '可以买',
'shares': '股',
'share': '股',
'Your': '你持有的',
'shares are worth': '股目前值',
'Do you want to': '你想',
'shares at': '股',
'each?': '单价?',
'For a total of': '总价:',
'Back': '返回',
'Confirm Transaction': '确认交易',
'Price updating...': '价格更新中',
'after the': '已扣除',
'fee of': '手续费:',
'You have': '你已',
'sold': '卖出',
'bought': '购入',
'each': '单价',
'Buy date': '购入日期',
'Shares': '购入数量',
'Value': '购入总价',
'Bought': '购入单价',
'Current': '目前单价',
'Change': '变化',
'Profit': '利润',
'View': '查看',
'Sell': '售出',
'Merge': '合并',
};
// 默认开启通知翻译
if (!localStorage.getItem('wh_trans_event')) {
localStorage.setItem('wh_trans_event', 'true');
}
/**
* 时分秒转换
*/
String.prototype.replaceHMS = function replaceHMS() {
return this.replace('hours', '小时')
.replace('hour', '小时')
.replace('minutes', '分钟')
.replace('minute', '分钟')
.replace('seconds', '秒钟')
.replace('second', '秒钟');
};
/**
* regexp test
*/
String.prototype.contains = function contains(keywords) {
if (typeof keywords === 'string') {
return new RegExp(keywords).test(this);
}
if (keywords.test) {
return keywords.test(this);
}
}
/**
* 数词转换 a an some
*/
String.prototype.numWordTrans = function numWordTrans() {
return this.replace(/\ban\b/, '1 个')
.replace(/\ba\b/, '1 个')
.replace(/\bsome\b/, '1 个')
.replace(/([0-9])x\b/, '$1 个');
};
/**
* 边栏
* 目前默认所有页面调用边栏翻译
*/
let sidebarTimeOut = 60;
const sidebarInterval = setInterval(() => {
// 60秒后取消定时
if ($('div[class^="sidebar"]').length === 0) {
sidebarTimeOut--;
if (sidebarTimeOut < 0) {
clearInterval(sidebarInterval);
}
return;
}
// 边栏块标题
$('h2[class^="header"]').each((i, e) => {
if (!sidebarDict[e.firstChild.nodeValue]) return;
e.firstChild.nodeValue = sidebarDict[e.firstChild.nodeValue];
// if ($(e).css('display')!=='none' && sidebarDict[e.firstChild.nodeValue]) {
// let original=$(e).clone(true);
// original.text(original.text().replace(e.firstChild.nodeValue,sidebarDict[e.firstChild.nodeValue]));
// $(e).css('display', 'none').after(original);
// $(original).append($(e).children('i'));
// }
});
// 边栏人物名字
$('span[class^="menu-name"]').each((i, e) => {
e.firstChild.nodeValue = '名字:';
});
// 钱 等级 pt 天赋点
$('p[class^="point-block"]').each((i, e) => {
if (sidebarDict[e.firstChild.firstChild.nodeValue])
e.firstChild.firstChild.nodeValue = sidebarDict[e.firstChild.firstChild.nodeValue];
});
// 4条 状态条
$('p[class^="bar-name"]').each((i, e) => {
if (sidebarDict[e.firstChild.nodeValue])
e.firstChild.nodeValue = sidebarDict[e.firstChild.nodeValue];
});
// 边栏菜单
$('span[class^="linkName"]').each((i, e) => {
if (sidebarDict[e.firstChild.nodeValue])
e.firstChild.nodeValue = sidebarDict[e.firstChild.nodeValue];
});
// [use]按钮
if ($('#pointsMerits').length !== 0)
$('#pointsMerits')[0].firstChild.nodeValue = '[使用]';
if ($('#pointsPoints').length !== 0)
$('#pointsPoints')[0].firstChild.nodeValue = '[使用]';
if ($('#pointsLevel').length !== 0)
$('#pointsLevel')[0].firstChild.nodeValue = '[升级]';
// 手机 区域菜单
$('div[class*="areas-mobile"] span:nth-child(2)').contents().each((i, e) => {
//console.log(e);
if (sidebarDict[e.nodeValue])
e.nodeValue = sidebarDict[e.nodeValue];
});
// let barDescr = $('div[class^="tooltip"]').children('p[class^="bar-descr"]');
// if (barDescr.length !== 0) {
// barDescr[0].childNodes.forEach(i => {
// if (tooltipDict[i.nodeValue]) i.nodeValue = tooltipDict[i.nodeValue];
// })
// }
clearInterval(sidebarInterval);
}, 1000);
/**
* 迷你资料卡 全局 todo
*/
const miniProfile = function miniprof() {
const miniprofOB = new MutationObserver(_ => {
miniprofOB.disconnect();
miniprofTrans();
miniprofOB.observe($('div.profile-mini-root').get(0), {attributes: true, childList: true, subtree: true});
});
const miniprofTrans = function miniprofTrans() {
// 迷你资料卡状态
$('div.profile-mini-root div.description span')
.contents().each((i, e) => {
if (e.nodeType === 3) {
if (statusDict[e.nodeValue.trim()])
e.nodeValue = statusDict[e.nodeValue.trim()];
else if (hosDict[e.nodeValue.trim()])
e.nodeValue = hosDict[e.nodeValue.trim()];
// 医院 监狱
else {
const spl = e.nodeValue.split(' ');
if (spl[1] === 'hospital')
e.nodeValue = e.nodeValue
.replace('In hospital for', '住院')
.replaceHMS();
else if (spl[1] === 'jail')
e.nodeValue = e.nodeValue
.replace('In jail for', '坐牢')
.replaceHMS();
else if (spl[1] === 'jail')
return;
}
}
});
// 转钱
sendCashTrans('div.profile-mini-root');
};
if ($('div.profile-mini-root').length > 0)
miniprofTrans();
else {
const intervalInit = setInterval(() => {
const miniProfileFirst = $('div.profile-mini-root').get(0);
if (miniProfileFirst) {
clearInterval(intervalInit);
miniprofTrans();
miniprofOB.observe(miniProfileFirst, {attributes: true, childList: true, subtree: true});
}
}, 1000);
}
// 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 (tooltipDict[i.nodeValue]) i.nodeValue = tooltipDict[i.nodeValue];
// })
// }
// let miniprof_tooltip = $("#body > div.ToolTipPortal > div > div:nth-child(2)");
// if (miniprof_tooltip.length !== 0) {
// if (tooltipDict[miniprof_tooltip[0].firstChild.nodeValue]) {
// miniprof_tooltip[0].firstChild.nodeValue = tooltipDict[miniprof_tooltip[0].firstChild.nodeValue];
// }
// } else {
// //todo 通配符匹配
// }
// }).observe(tooltip, {attributes: true, childList: true, subtree: true});
// }
// }, 1000);
};
miniProfile();
/**
* header
*/
if ($('div#header-root').length > 0) {
const headerOB = new MutationObserver(_ => {
headerOB.disconnect();
headerTrans();
headerOB.observe($('div#header-root')[0], {childList: true, subtree: true, attributes: true});
});
const headerTrans = function headerTrans() {
// 搜索内容下拉框中的文字 已选中
if (headerDict[$('div.find button.toggler.down').text()])
$('div.find button.toggler.down').text(headerDict[$('div.find button.toggler.down').text()]);
// pc端 搜索下拉框点击后的搜索类型文字
$('div.find li.item').each((i, e) => {
if (headerDict[$(e).text()])
$(e).text(headerDict[$(e).text()]);
});
// 手机端 搜索下拉框点击后的搜索类型文字
$('li[class^="search-type-"] label').each((i, e) => {
if (headerDict[$(e).text()])
$(e).text(headerDict[$(e).text()]);
});
// 搜索框placeholder
if (headerDict[$('input[class^="searchInput"]').attr('placeholder')])
$('input[class^="searchInput"]').attr('placeholder',
headerDict[$('input[class^="searchInput"]').attr('placeholder')]);
// 高级搜索框 search by
if (headerDict[$('div#header-root legend.title').text()])
$('div#header-root legend.title').text(headerDict[$('div#header-root legend.title').text()]);
// 高级搜索框的条件 左 键
$('ul.advancedSearchFormBody label.label').each((i, e) => {
if (headerDict[$(e).text()])
$(e).text(headerDict[$(e).text()]);
});
// 高级搜索框的已选中
$('ul.advancedSearchFormBody div.select-wrapper button.toggler.down').each((i, e) => {
// console.log($(e).text())
if (headerDict[$(e).text().trim()])
$(e).text(headerDict[$(e).text().trim()]);
else if (propertyDict[$(e).text().trim()])
$(e).text(propertyDict[$(e).text().trim()]);
});
// 高级搜索的下拉选项
$('ul.advancedSearchFormBody li.item').each((i, e) => {
if (headerDict[$(e).text()])
$(e).text(headerDict[$(e).text()]);
else if (propertyDict[$(e).text()])
$(e).text(propertyDict[$(e).text()]);
});
// 高级搜索的"Not"
$('ul.advancedSearchFormBody label.search-condition-not').each((i, e) => {
if (headerDict[$(e).text()])
$(e).text(headerDict[$(e).text()]);
});
// 高级搜索的"to"
$('ul.advancedSearchFormBody label[for*="To"]').each((i, e) => {
if (headerDict[$(e).text()])
$(e).text(headerDict[$(e).text()]);
});
// 高级搜索的reset search按钮
$('form.form-search-extend div.bottom button').each((i, e) => {
if (headerDict[$(e).text()])
$(e).text(headerDict[$(e).text()]);
});
// log按钮“view log”
if (headerDict[$('div.recentHistory a[class^="link"] span[class^="text"]').text().trim()])
$('div.recentHistory a[class^="link"] span[class^="text"]')
.text(headerDict[$('div.recentHistory a[class^="link"] span[class^="text"]').text().trim()]);
// 点击头像打开的菜单
$('ul.settings-menu span').each((i, e) => {
if (headerDict[$(e).text()] && e.childNodes.length === 1)
$(e).text(headerDict[$(e).text()]);
else if (e.childNodes.length === 3)
if (headerDict[e.firstChild.nodeValue])
e.firstChild.nodeValue = headerDict[e.firstChild.nodeValue];
});
};
headerTrans();
headerOB.observe($('div#header-root')[0], {childList: true, subtree: true, attributes: true});
}
/**
* chatbox
*/
if ($('div#chatRoot').length > 0) {
const chatOB = new MutationObserver(_ => {
chatOB.disconnect();
chatTrans();
chatOB.observe($('div#chatRoot').get(0), {childList: true, subtree: true, attributes: true});
});
const chatTrans = function chatTrans() {
// 聊天框的标题
$('div#chatRoot div[class^="chat-box-title"] span[class^="name"]').each((i, e) => {
if (chatDict[$(e).text().trim()])
$(e).text(chatDict[$(e).text().trim()]);
});
// 聊天设置的左边label
$('div[class^="chat-settings-opts"] div[class*="label"]').each((i, e) => {
if ($(e).next().children('div.rc-slider').length > 0) {
// 高度和宽度有响应式的%
if (chatDict[$(e).text().split(' ')[0]]) {
$(e).text($(e).text().replace($(e).text().split(' ')[0], chatDict[$(e).text().split(' ')[0]]));
}
return;
}
if (chatDict[$(e).text().trim()])
$(e).text(chatDict[$(e).text().trim()]);
});
// 选项下拉栏
$('div[class^="dropdown-root"]').find('*').contents().each((i, e) => {
if (e.nodeType !== 3) return;
if (chatDict[e.nodeValue])
e.nodeValue = chatDict[e.nodeValue];
});
// 设置的两个选项
$('label[class^="privacy-label"]').each((i, e) => {
if (chatDict[$(e).text().trim()])
$(e).text(chatDict[$(e).text().trim()]);
});
// people中的5个分类 faction friend...
$('ul[class^="type-list"] li a').each((i, e) => {
if (chatDict[$(e).text().trim()])
$(e).text(chatDict[$(e).text().trim()]);
});
// people中的列表添加框placeholder
$('div.ac-wrapper input.ac-search').each((i, e) => {
if (chatDict[$(e).attr('placeholder')])
$(e).attr('placeholder', chatDict[$(e).attr('placeholder')]);
});
//
if (eventsDict[$('div#chatRoot div[class^="overview"] > div > div:nth-child(2)').text().trim()]) {
$('div#chatRoot div[class^="overview"] > div > div:nth-child(2)')
.text(
eventsDict[$('div#chatRoot div[class^="overview"] > div > div:nth-child(2)').text().trim()]
);
}
};
chatTrans();
chatOB.observe($('div#chatRoot').get(0), {childList: true, subtree: true, attributes: true});
}
/**
* 搜索玩家的4个分类按钮
*/
function playerSearchBoxTrans() {
const psbtOB = new MutationObserver(_ => {
if ($('div.ac-wrapper').length === 0) return;
psbtOB.disconnect();
$('div.ac-wrapper li a').each((i, e) => {
if (chatDict[$(e).text().trim()])
$(e).text(chatDict[$(e).text().trim()]);
});
psbtOB.observe(document, {childList: false, subtree: true, attributes: true});
});
psbtOB.observe(document, {childList: false, subtree: true, attributes: true});
}
playerSearchBoxTrans();
/**
* 飞行页面
*/
if (window.location.href.indexOf('index.php') >= 0 &&
$('div.travelling h4').length !== 0) {
const travelOB = new MutationObserver(travelOBInit);
function travelOBInit() {
travelOB.disconnect();
travelTrans();
travelOB.observe($('div.content-wrapper')[0], {childList: true, subtree: true});
}
function travelTrans() {
titleTrans();
contentTitleLinksTrans();
// 气泡
if (tipsDict[$('div.inner-popup').text().trim()])
$('div.inner-popup').text(tipsDict[$('div.inner-popup').text().trim()]);
// Remaining Flight Time -
$('div.destination-title span').contents().each((i, e) => {
if (e.childNodes.length !== 0) return;
if (!e.nodeValue) return;
if (travelingDict[e.nodeValue.trim()])
e.nodeValue = travelingDict[e.nodeValue.trim()];
});
// torntools扩展插件落地时间
if ($('div.tt-landing-time span.description').text().split(' ')[0] === 'Landing') {
const landingTime = $('div.tt-landing-time span.description').text().slice(11, 19);
$('div.tt-landing-time span.description').text('于 ' + landingTime + ' 降落');
}
}
travelTrans();
travelOB.observe($('div.content-wrapper')[0], {childList: true, subtree: true});
return;
}
/**
* 主页 todo
*/
if (window.location.href.indexOf('index.php') >= 0 &&
$('h4#skip-to-content').text().indexOf('Home') >= 0) {
titleTrans();
contentTitleLinksTrans();
//let homeEvents = null;
// 主页黑框标题文字翻译
$('h5.box-title').each((i, e) => {
if (!homeDict[e.firstChild.nodeValue]) return;
// 翻译最近5条通知
if (e.firstChild.nodeValue === 'Latest Events') {
//homeEvents = $(e).parent().next().find('span');
eventsTrans($(e).parent().next().find('span'));
}
// 翻译最近5个攻击
else if (e.firstChild.nodeValue === 'Latest Attacks') {
$(e).parent().next().find('span').each(function () {
let nodes = $(this)[0].childNodes;
nodes.forEach((v, i) => {
if (v.nodeValue !== null) {
let waitToTsf = v.nodeValue.toString().indexOf(" ");
let words = v.nodeValue.replace("\n", "").toString().split(" ");
words.forEach((word, j) => {
if (attackDict.hasOwnProperty(word)) {
if (word === "Someone") {
$(this)[0].childNodes[i].nodeValue = $(this)[0].childNodes[i].nodeValue.replace(" ", "");
}
let change = $(this)[0].childNodes[i].nodeValue.replace(word, attackDict[word]);
$(this)[0].childNodes[i].nodeValue = change;
}
})
}
}, this);
});
}
//e.firstChild.nodeValue = homeDict[e.firstChild.nodeValue];
// 隐藏原dom元素避免与torntools发生冲突
if ($(e).css('display') !== 'none')
$(e).css('display', 'none').after(`
You dug deep and completed 15 minutes of incline sprints
*You gained 1,854.05 speed
*/ //$(e).attr('class').match(/gained/) if (gymDict[$(e).text()]) $(e).text(gymDict[$(e).text()]); }); // 健身房信息 标题 $('div[class^="gymTitle"] h3').each((i, e) => { if (gymDict[$(e).text()]) $(e).text(gymDict[$(e).text()]); else if (gymList[$(e).text().trim()]) $(e).text(gymList[$(e).text().trim()]); }); // 健身房信息 属性名 $('ul[class^="gymInfo"] b').each((i, e) => { if (gymDict[$(e).text().trim()]) $(e).text(gymDict[$(e).text().trim()]); }); // 健身房状态信息 // $('div[class^="gymStats"] b').each((i, e) => { // console.log(e) // if (gymDict[$(e).text().trim()]) // $(e).text(gymDict[$(e).text().trim()]); // }); // // // 健身房状态值 // $('div[class^="gymStats"] span[class^=value]').each((i, e) => { // if ($(e).text().indexOf("per train") > 0) // $(e).text($(e).text().split(" ")[0] + gymDict["per train"]); // else if (gymDict[$(e).text().trim()]) // $(e).text(gymDict[$(e).text().trim()]); // }); // 健身房信息 属性值 $('ul[class^="gymInfo"] span[class^="value"]').each((i, e) => { if (gymDict[$(e).text().trim()]) $(e).text(gymDict[$(e).text().trim()]); }); // 健身房信息 具体锻炼项目 $('span[class^="exerciseName"]').each((i, e) => { if (gymDict[$(e).text().trim()]) $(e).text(gymDict[$(e).text().trim()]); }); // 购买提示信息 $('div[class^="confirmMessage"] p[role="alert"]').each((i, e) => { if (gymDict[$(e).text().trim()]) $(e).text(gymDict[$(e).text().trim()]); }); } gymTrans(); gymOB.observe($('div.content-wrapper')[0], {childList: true, subtree: true, attributes: true}); return; } /** * 股票 */ if (window.location.href.contains(/page\.php\?sid=stocks/)) { const stockOB = new MutationObserver(() => { stockOB.disconnect(); titleTrans(); contentTitleLinksTrans(); stockTrans(); stockOB.observe($('.content-wrapper').get(0), { characterData: true, attributes: true, subtree: true, childList: true }); }); const stockTrans = function stockTrans() { // 表头 $('ul.title-black').find('*').contents().each((i, e) => { if (e.nodeType === 3 && stockDict[e.nodeValue.trim()]) { e.nodeValue = stockDict[e.nodeValue.trim()]; } }); // 名称 $('div[class^="nameContainer"]').each((i, e) => { if (e.childNodes[0].nodeValue && stockDict[e.childNodes[0].nodeValue.trim()]) { e.childNodes[0].nodeValue = stockDict[e.childNodes[0].nodeValue.trim()]; } }); // 右侧bb名 $('div[class^="dividendInfo"] p').each((i, e) => { if (stockDict[$(e).text().trim()]) { $(e).text(stockDict[$(e).text().trim()]); } }); // 股价详情 $('#panel-priceTab ul[role="tablist"] label span:last-child').each((i,e)=>{ if (stockDict[$(e).text()]) { $(e).text(stockDict[$(e).text()]); } }); // 点开购买后 $('div#panel-ownedTab div[class^="manageBlock"] *').contents().each((i, e) => { if (e.nodeType === 1) { if (stockDict[$(e).text().trim()]) { $(e).text(stockDict[$(e).text().trim()]); } } else if (e.nodeType === 3) { if (stockDict[e.nodeValue.trim()]) e.nodeValue = stockDict[e.nodeValue.trim()]; else if (/\$[0-9]+ after the 0\.1% fee of \$[0-9]+$/.test(e.nodeValue.trim())) { e.nodeValue = e.nodeValue.trim() .replace('after the', stockDict['after the']) .replace('fee of', stockDict['fee of']); } } }); // 点开购买后的历史栏 $('div#panel-ownedTab div[class^="transactionsContainer"] li').each((i, e) => { e = e.childElementCount === 0 ? e : e.children[0]; if (stockDict[$(e).text().trim()]) { $(e).text(stockDict[$(e).text().trim()]); } }); // 点开分红后文字 $('div#panel-dividendTab div[class^="message"] *').contents().each((i, e) => { if (e.nodeType !== 3) return; if (!e.nodeValue.trim()) return; if (stockDict[e.nodeValue.trim()]) { e.nodeValue = stockDict[e.nodeValue.trim()]; } // 第n个increment 1st 2nd 3rd 4th else if (/[0-9][snrt][tdh]$/.test(e.nodeValue.trim())) { e.nodeValue = `第${e.nodeValue.trim().slice(0, -2)}个`; } // 物品 else if (/[0-9]x$/.test(e.nodeValue.trim().split(' ')[0])) { const spl = e.nodeValue.trim().split(' '); const itemName = spl.slice(1).join(' '); e.nodeValue = ` ${spl[0].replace('x', '个')} ${itemName}`; } else { if (/[\u4e00-\u9fa5]/.test(e.nodeValue)) return; if (/\b\$?[0-9,]+$/.test(e.nodeValue)) return; console.log(`未找到翻译:[${e.nodeValue.trim()}]`); } }); }; stockTrans(); stockOB.observe($('.content-wrapper').get(0), { characterData: true, attributes: true, subtree: true, childList: true }); return; } /** * 教育页面 */ if (window.location.href.indexOf('education.php') >= 0) { const eduOB = new MutationObserver(eduOBInit); function eduOBInit() { eduOB.disconnect(); eduTrans(); eduOB.observe($('div.content-wrapper')[0], {childList: true, subtree: true}); } function eduTrans() { titleTrans(); contentTitleLinksTrans(); // 大科目、学院标题 $('div.content-wrapper div.title').each((i, e) => { if (eduDict[$(e).text().trim()]) e.firstChild.nodeValue = eduDict[$(e).text().trim()]; }); // 教育主页提示内容 和 学院详情 小课程提示信息 $('div.content-wrapper div[class^="msg"]').find('*').contents().each((i, e) => { if (e.nodeValue === null) return; if (eduDict[e.nodeValue.trim()]) { e.nodeValue = eduDict[e.nodeValue.trim()]; } else if (e.nodeValue.indexOf('second') >= 0 || e.nodeValue.indexOf('minute') >= 0 || e.nodeValue.indexOf('hour') >= 0 || e.nodeValue.indexOf('day') >= 0) { e.nodeValue = e.nodeValue .replace('days', '天') .replace('day', '天') .replace('hours', '时') .replace('hour', '时') .replace('minutes', '分') .replace('minute', '分') .replace('and', '和') .replace('seconds', '秒') .replace('second', '秒'); } }); // 学院详情标题 $('div.content-wrapper div.title-black').each((i, e) => { if (e.childNodes.length === 3) if (eduDict[e.lastChild.nodeValue.trim()]) e.lastChild.nodeValue = ' ' + eduDict[e.lastChild.nodeValue.trim()]; if (eduDict[$(e).text().trim()]) $(e).text(eduDict[$(e).text().trim()]); }); // 学院详情 小课程标题 $('div.content-wrapper span.module-name').each((i, e) => { if (eduDict[$(e).text().trim()]) $(e).text(eduDict[$(e).text().trim()]); }); // 学院详情 课程的描述 $('div.content-wrapper p.desc').each((i, e) => { if (eduDict[$(e).text().trim()]) $(e).text(eduDict[$(e).text().trim()]); }); // 课程详情 7 标题 $('div.module-desc p.title').each((i, e) => { if (eduDict[$(e).text().trim()]) $(e).text(eduDict[$(e).text().trim()]); }); // 课程介绍中的所有li元素 $('div.module-desc ul.info').find('*').contents().each((i, e) => { if (e.nodeValue === null) return; if (eduDict[e.nodeValue.trim()]) e.nodeValue = eduDict[e.nodeValue.trim()]; else if (e.nodeValue.indexOf('Length') >= 0) { e.nodeValue = e.nodeValue.replace('Length', eduDict['Length']) .replace('d ', '日') .replace('h ', '时') .replace('m ', '分'); } else if (e.nodeValue.indexOf('Cost') >= 0) { e.nodeValue = e.nodeValue.replace('Cost', eduDict['Cost']); } else if (e.nodeValue.indexOf('manual labor') >= 0) { e.nodeValue = e.nodeValue.replace('manual labor', eduDict['manual labor']) .replace('Gain', eduDict['Gain']) .replace('upon completion', eduDict['upon completion']); } else if (e.nodeValue.indexOf('endurance') >= 0) { e.nodeValue = e.nodeValue.replace('endurance', eduDict['endurance']) .replace('Gain', '获得') .replace('upon completion', eduDict['upon completion']); } else if (e.nodeValue.indexOf('intelligence') >= 0) { e.nodeValue = e.nodeValue.replace('intelligence', eduDict['intelligence']) .replace('Gain', '获得') .replace('upon completion', eduDict['upon completion']); } }); } eduTrans(); eduOB.observe($('div.content-wrapper')[0], {childList: true, subtree: true}); return; } /** * profile 玩家资料页面 */ if (window.location.href.contains(/profiles.php\?XID=[0-9]+/)) { const profileOB = new MutationObserver(() => { profileOB.disconnect(); titleTrans(); contentTitleLinksTrans(); profileTrans(); profileOB.observe($('.content-wrapper').get(0), { characterData: true, attributes: true, subtree: true, childList: true }); }); const profileTrans = function profileTrans() { const playerName = document.title.trim().split("'s ").length === 2 ? document.title.trim().split("'s ")[0] : null; if (!playerName) { console.log('错误:获取用户名失败。'); return; } // 黑框标题 $('.content-wrapper .title-black').each((i, e) => { if (i === 1) { if (profileDict[e.firstChild.nodeValue.trim().replace(playerName, '{$}')]) { e.firstChild.nodeValue = ( profileDict[$(e).text().trim().replace(playerName, '{$}')] .replace('{$}', playerName) ); } return; } if (profileDict[$(e).text().trim()]) { $(e).text(profileDict[$(e).text().trim()]); } }); // 行动框的描述 const action_desc = $('#profile-container-description.profile-container-description'); if (profileDict[action_desc.text().trim()]) { action_desc.html(`${profileDict[action_desc.text().trim()]}`); } else if (profileDict[action_desc.text().trim().replace(playerName, '{$}')]) { action_desc.html( `${profileDict[action_desc.text().trim().replace(playerName, '{$}')] .replace('{$}', playerName)}` ); } else if (action_desc.text().contains(/is on your (friend|enemy) list/)) { const spl = action_desc.text().trim().split(' '); const mark = spl.length === 6 ? null : spl.slice(7).join(' '); switch (spl[4]) { case 'friend': if (profileDict['{$} is on your friend list']) { action_desc.html( `${ profileDict['{$} is on your friend list'] .replace('{$}', playerName) }${ mark ? ' : ' + mark : '' }` ); } break; case 'enemy': if (profileDict['{$} is on your enemy list']) { action_desc.html( `${ profileDict['{$} is on your enemy list'] .replace('{$}', playerName) }${ mark ? ' : ' + mark : '' }` ); } break; } } else { if ($('.wh-translated').length > 0) return; console.log(`未找到翻译: “${action_desc.text().trim()}”`); } // 添加敌人或朋友的界面 $('.add-user .reason-wrapper').find('*').contents().each((i, e) => { if (e.nodeType === 3) { if (profileDict[e.nodeValue.trim()]) { e.nodeValue = profileDict[e.nodeValue.trim()]; } else if (/\b[1-4]?[0-9]\b/.test(e.nodeValue.trim().slice(0, 2))) { const left = e.nodeValue.trim().slice(0, 2); if (profileDict['{$} characters left']) { e.nodeValue = profileDict['{$} characters left'].replace('{$}', left); } } } }); sendCashTrans(); }; profileTrans('.content-wrapper'); profileOB.observe($('.content-wrapper').get(0), { characterData: true, attributes: true, subtree: true, childList: true }); return; } /** * 报纸 */ if (window.location.href.contains(/(newspaper|joblist|freebies|newspaper_class|personals|bounties|comics)\.php/)) { const newspaperOB = new MutationObserver(() => { newspaperOB.disconnect(); newspaperTrans(); newspaperOB.observe($('div.content-wrapper')[0], {childList: true, subtree: true}); }); function newspaperTrans() { titleTrans(); contentTitleLinksTrans(); if ($('a.newspaper-link').length === 0) return; // 导航菜单 $('a.newspaper-link').contents().each((i, e) => { if (newspaperDict[e.nodeValue]) e.nodeValue = newspaperDict[e.nodeValue]; }); // 公众号广告 $('div.price.left').contents()[2].nodeValue = '文章翻译请关注中文公众号Torncity'; // 日期翻译 const date = new Date($('span.date-label').text()); if (date.format('yyyy') !== 'NaN') $('span.date-label').text(date.format('yyyy年MM月dd日')); // 菜单下的信息 工作 壁纸 广告 悬赏 $('div.help-message').find('*').contents().each((i, e) => { if (!e.nodeValue || e.nodeValue.trim() === '') return; //console.log(e.nodeValue); if (newspaperDict[e.nodeValue.trim()]) e.nodeValue = newspaperDict[e.nodeValue.trim()]; }); // 交友 $('div.personals-wrap span.msg').find('*').contents().each((i, e) => { if (!e.nodeValue || e.nodeValue.trim() === '') return; if (newspaperDict[e.nodeValue.trim()]) e.nodeValue = newspaperDict[e.nodeValue.trim()]; }); // 漫画 if (newspaperDict[$('div.bonus-wrap a').text().trim()]) $('div.bonus-wrap a').text(newspaperDict[$('div.bonus-wrap a').text().trim()]); // 右边栏 $('div[class^="sideCont"] [class^="title"]').contents().each((i, e) => { if (newspaperDict[e.nodeValue]) e.nodeValue = newspaperDict[e.nodeValue]; }); // 彩票信息 $('span[class^="winner"]').each((i, e) => { }); // 底部链接 // Why not visit our sponsor? if (newspaperDict[$('div.link-left').text().trim()]) $('div.link-left').text(newspaperDict[$('div.link-left').text().trim()]); // View all | Advertise here $('div.link-right a').contents().each((i, e) => { if (newspaperDict[e.nodeValue.trim()]) e.nodeValue = newspaperDict[e.nodeValue.trim()]; }) } newspaperTrans(); newspaperOB.observe($('div.content-wrapper')[0], {childList: true, subtree: true}); return; } /** * npc买房 estateagents */ if (window.location.href.indexOf('estateagents.php') >= 0) { titleTrans(); contentTitleLinksTrans(); $('div.estate-info div.title').each((i, e) => { if (propertyDict[e.firstChild.nodeValue]) e.firstChild.nodeValue = propertyDict[e.firstChild.nodeValue]; }); return; } /** * properties房屋页面 todo */ if (window.location.href.indexOf('properties.php') >= 0) { const isRent = window.location.href.indexOf('rent') >= 0; // const isRentOrSell = isRent || window.location.href.indexOf('sell') >= 0; // const isOption = window.location.href.indexOf('p=options') >= 0; // const isExtension = window.location.href.indexOf('step=viewOfferExtension') >= 0; const propertyOB = new MutationObserver(() => { propertyOB.disconnect(); titleTrans(); contentTitleLinksTrans(); propertyTrans(); propertyOB.observe($('div.content-wrapper').get(0), {childList: true, subtree: true}); }); const propertyTrans = function propertyTrans() { // 从玩家处租或买 if (isRent || window.location.href.indexOf('sell') >= 0) { // 黑框标题 $('div.title-black span').each((i, e) => { e.firstChild.nodeValue = '您想查看哪些房产?'; }); // 房屋汉化 $('ul.info-cont label.marker-css').contents().each((i, e) => { if (propertyDict[e.nodeValue]) e.nodeValue = propertyDict[e.nodeValue]; }); //搜索按钮 $('div.btn-search button').text('搜索'); $('div.search-text a').text('搜索'); // 表头信息 $('div.users-list-title div').each((i, e) => { if (propertyDict[$(e).text()]) $(e).text(propertyDict[$(e).text()]); }); // 确认购买提示 $('div[class="confirm-text"] span.question').each((i, e) => { const propName = e.firstElementChild.innerText.trim().split(' ').slice(8).join(' '); const hasAnother = $(e).text().indexOf('another') > 0; if (hasAnother) { e.firstElementChild.firstChild.nodeValue = '你确定要'; e.firstElementChild.firstChild.nodeValue += isRent ? '租用' : '购买'; e.firstElementChild.childNodes[1].firstChild.nodeValue = '另一个'; e.firstElementChild.childNodes[2].nodeValue = propertyDict[propName]; } else { e.firstElementChild.firstChild.nodeValue = '你确定要'; e.firstElementChild.firstChild.nodeValue += isRent ? '租用' : '购买'; e.firstElementChild.firstChild.nodeValue += propertyDict[propName]; } e.children[1].firstChild.nodeValue = '花费 '; e.children[1].childNodes[2].nodeValue = isRent ? ' 租期 ' : '?'; if (isRent) e.children[1].childNodes[4].nodeValue = ' 天?'; }); // 房屋详情表格 $('div.info-block span.bold').each((i, e) => { if (e.childElementCount === 2) { /** * On "Market" Price ":" */ e.firstElementChild.firstChild.nodeValue = ''; e.childNodes[2].nodeValue = '市场价'; e.childNodes[3].firstChild.nodeValue = ''; e.childNodes[4].nodeValue = ':'; } else { if (propertyDict[e.firstChild.nodeValue.trim()]) e.firstChild.nodeValue = propertyDict[e.firstChild.nodeValue.trim()]; } }); $('div.rental-period span.bold').each((i, e) => { if (propertyDict[e.firstChild.nodeValue.trim()]) e.firstChild.nodeValue = propertyDict[e.firstChild.nodeValue.trim()]; }); // 窄边 cost happy $('span.title-laptop.bold').each((i, e) => { if (propertyDict[$(e).text().trim()]) $(e).text(propertyDict[$(e).text().trim()]); }); // modification $('div.title.bold.left').each((i, e) => { if (propertyDict[e.firstChild.nodeValue]) e.firstChild.nodeValue = propertyDict[e.firstChild.nodeValue]; }); return; } // 房屋选项 if (window.location.href.indexOf('p=options') >= 0) { // 页面的黑框标题 $('div.content-wrapper div.title-black').each((i, e) => { if (propertyDict[$(e).text().trim()]) $(e).text(propertyDict[$(e).text().trim()]); }); // 所有li内容 // $('div.content-wrapper div.customize-opt li').find('*') // .contents().each((i,e)=>{ // if(e.nodeType!==3)return;console.log(e) // }); return; } // 房屋详情 if (window.location.href.indexOf('p=propertyinfo') >= 0) { return; } // 延期、合同 if (window.location.href.indexOf('step=viewOfferExtension') >= 0) { return; } // 自己的所有房产 页面 { // 顶部3标题 $('ul.property-tabs a.ui-tabs-anchor div').contents().each((i, e) => { if (propertyDict[e.nodeValue]) { e.nodeValue = propertyDict[e.nodeValue]; } }); // 图片下的描述部分 $('ul.properties-list div.image-description').find('*') .contents().each((i, e) => { if (e.nodeType !== 3) return; if (!propertyDict[e.nodeValue.trim()]) return; e.nodeValue = propertyDict[e.nodeValue.trim()]; }); // 图片下的按钮的title浮动框文字 $('div#properties-page-wrap a[title]').each((i, e) => { if (propertyDict[$(e).attr('title')]) $(e).attr('title', propertyDict[$(e).attr('title')]); }); } }; propertyTrans(); propertyOB.observe($('div.content-wrapper').get(0), {childList: true, subtree: true}); return; } /** * 通知页面 */ if (window.location.href.indexOf('events.php') >= 0) { const ob = new MutationObserver(() => { ob.disconnect(); titleTrans(); contentTitleLinksTrans(); eventsTrans(); ob.observe($('div.content-wrapper')[0], {childList: true, subtree: true}); }); eventsTrans(); ob.observe($('div.content-wrapper')[0], {childList: true, subtree: true}); return; // let events; // const eventMutation = new MutationObserver(() => { // eventMutation.disconnect(); // // events = $('span.mail-link'); // // eventsTrans(events); // eventsTrans(); // eventMutation.observe($('div#events-main-wrapper')[0], {childList: true, subtree: true}); // }); // // //初始化中内容未加载 // 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(events); // }, 1000); } /** * awards.php */ if (window.location.href.indexOf('awards.php') >= 0) { const awOB = new MutationObserver(() => { awOB.disconnect(); awTrans(); awOB.observe($('div.content-wrapper')[0], {childList: true, subtree: true, attributes: true}); }); const awTrans = function awTrans() { titleTrans(); contentTitleLinksTrans(); // 顶部的3个分类 Honors (106) Medals (44) Merits (3) $('div.content-wrapper a.ui-tabs-anchor span.bold').contents().each((i, e) => { if (e.nodeType !== 3) return; if (awDict[e.nodeValue.trim()]) e.nodeValue = awDict[e.nodeValue.trim()]; }); // 分类标题下的描述 $('div.awards-msg').contents().each((i, e) => { // 文字节点 if (e.nodeType === 3) { if (awDict[e.nodeValue.trim()]) e.nodeValue = awDict[e.nodeValue.trim()]; } // 子节点 else if (e.nodeType === 1) { if (awDict[$(e).text().trim()]) $(e).text(awDict[$(e).text().trim()]); else if ($(e).text().indexOf('medals') >= 0) $(e).text($(e).text().replace('medals', awDict['medals'])); else if ($(e).text().indexOf('honors') >= 0) $(e).text($(e).text().replace('honors', awDict['honors'])); } }); // 荣誉的描述 $('div#awards-tab-menu a[data-title]').each((i, e) => { const desc = $(e).attr('data-title').split(' ')[0]; if (awDict[desc]) $(e).attr('data-title', $(e).attr('data-title').replace(desc, awDict[desc])); }); // 改变荣誉条时的提示 $('div#honors div.msg').each((i, e) => { if (awDict[$(e).text().trim()]) $(e).text(awDict[$(e).text().trim()]); }); // 改变荣誉条时的提示按钮 change $('div#honors div.confirm-msg button').each((i, e) => { if (awDict[$(e).text().trim()]) $(e).text(awDict[$(e).text().trim()]); }); // 改变荣誉条时的提示按钮 cancel $('div#honors div.confirm-msg a.cancel').each((i, e) => { if (awDict[$(e).text().trim()]) $(e).text(awDict[$(e).text().trim()]); }); // 天赋页面 Available Merits: x Merits Used: x $('div.awards-msg p').contents().each((i, e) => { if (e.nodeType === 3) if (awDict[e.nodeValue.trim()]) e.nodeValue = e.nodeValue.replace(e.nodeValue.trim(), awDict[e.nodeValue.trim()]); }); // 勋章下 即将解锁的勋章框标题 天赋加点的表头标题 $('div.title-black').contents().each((i, e) => { // 勋章下 即将解锁的勋章框标题 if (e.nodeType === 1) { if (awDict[$(e).text().trim()]) $(e).text(awDict[$(e).text().trim()]); } // 天赋加点的表头标题 else if (e.nodeType === 3) { if (awDict[e.nodeValue.trim()]) e.nodeValue = awDict[e.nodeValue.trim()]; } }); // 荣誉和勋章的左边栏分类选择菜单 $('div.tab-menu-cont li.ui-state-default a').each((i, e) => { if (awDict[$(e).text().trim()]) $(e).text(awDict[$(e).text().trim()]); }); // 天赋点名字 $('ul#merits-list span.name').each((i, e) => { if (awDict[$(e).text().trim()]) $(e).text(awDict[$(e).text().trim()]); }); // 天赋点短描述 $('ul#merits-list span.desc span[class^="t-"]').each((i, e) => { // const slash = $(e).attr('class') === 't-show' ? '- ' : ''; const isShow = $(e).attr('class') === 't-hide'; const key = isShow ? $(e).text().slice(2) : $(e).text(); if (awDict[key]) $(e).text((isShow ? '- ' : '') + awDict[key]); }); // 天赋点展开详细描述与确认 $('ul#merits-list div.msg').contents().each((i, e) => { // x merit(s) if (e.nodeType === 1) { const spl = $(e).text().split(' '); if (awDict[spl[1]]) $(e).text(spl[0] + ' ' + awDict[spl[1]]); } // 文字片段 else if (e.nodeType === 3) { if (awDict[e.nodeValue.trim()]) { e.nodeValue = awDict[e.nodeValue.trim()] + ''; return; } const spl = e.nodeValue.trim().split('\n'); // 未升级完成 if (spl.length === 3) { const upgradeName = spl[1].slice(5, -9); const on = spl[0]; const upgrade = spl[1].slice(-8); const desc = spl[2]; if (awDict[on] && awDict[upgrade] && awDict[upgradeName] && awDict[desc]) e.nodeValue = ' ' + awDict[on] + awDict[upgradeName] + awDict[upgrade] + awDict[desc]; } // 升级完成 else if (spl.length === 1) { const upgraded = e.nodeValue.trim().slice(0, 60); const desc = e.nodeValue.trim().slice(61); if (awDict[upgraded]) e.nodeValue = awDict[upgraded]; if (awDict[desc]) e.nodeValue += awDict[desc]; } } }); // spend cancel按钮 $('ul#merits-list div.confirm-cont a').each((i, e) => { if (awDict[$(e).text().trim()]) $(e).text(awDict[$(e).text().trim()]); }); }; awTrans(); awOB.observe($('div.content-wrapper')[0], {childList: true, subtree: true, attributes: true}); return; } /** * 升级页面 */ if (window.location.href.indexOf('level2.php') >= 0) { } /** * 医院页面 */ if (window.location.href.indexOf("hospitalview.php") >= 0) { const hospitalOB = new MutationObserver(hosOBInit); function hosOBInit() { hospitalOB.disconnect(); hospTrans(); hospitalOB.observe($('div.content-wrapper')[0], {childList: true, subtree: true}); } function hospTrans() { titleTrans(); contentTitleLinksTrans(); // 顶部提示信息 $('div[class^="msg right-round"]').contents().each((i, e) => { if (hosDict[e.nodeValue.trim()]) e.nodeValue = hosDict[e.nodeValue.trim()]; }); //玩家列表标题 $('div[class^="users-list-title title-black top-round m-top10"] span').contents().each((i, e) => { if (e.nodeValue && hosDict[e.nodeValue.trim()]) { e.nodeValue = e.nodeValue.replace(e.nodeValue, hosDict[e.nodeValue.trim()]); } }) //玩家列表住院理由 $('ul[class^="user-info-list-wrap"] span[class^="reason"]').each((i, e) => { let reasonStr = $(e).get(0).childNodes[1].nodeValue.trim(); if (hosDict[reasonStr]) { $(e)[0].childNodes[1].nodeValue = hosDict[reasonStr]; } else if (reasonStr.indexOf("Crashed") >= 0) { $(e)[0].childNodes[1].nodeValue = reasonStr .replace("Crashed her", hosDict["Crashed her"]) .replace("Crashed his", hosDict["Crashed his"]); } else { switch (reasonStr) { case "Attacked by": $(e)[0].childNodes[1].nodeValue = hosDict["general"]; $(e).append(" 攻击"); break; case "Hospitalized by": $(e)[0].childNodes[1].nodeValue = hosDict["general"]; $(e).append(" 殴打并送入医院"); break; case "Mugged by": $(e)[0].childNodes[1].nodeValue = hosDict["general"]; $(e).append(" 抢劫"); break; } } }) } hospTrans(); hospitalOB.observe($('div.content-wrapper')[0], {childList: true, subtree: true}); return; } /** * 帮派页面 */ if (window.location.href.indexOf("actions.php") >= 0) { const factionOB = new MutationObserver(factionOBInit); function factionOBInit() { factionOB.disconnect(); factionTrans(); factionOB.observe($('div.content-wrapper')[0], {childList: true, subtree: true}); } const factionDict = { "INFO": "信息", "TERRITORY": "地盘", "RANK": "名次", "CRIMES": "组织犯罪", "UPGRADES": "升级", "ARMORY": "军械库", "CONTROLS": "控制面板", "FACTION": "帮派", "YOUR FACTION IS NOT IN A WAR": "你的帮派没有处于战争状态", "TIER": "级别", "RESPECT": "声望", "No active chain": "暂无攻击链", "Main News": "主要消息", "Attacking": "攻击", "Funds": "资金流动", "Armory": "军械库", "Crimes": "组织犯罪", "Membership": "成员资格", "has claimed sovereignty of": "", "has abandoned": "放弃了地盘", "Achieved a chain of": "达成了连击链值", "and": "和", "respect [": "点声望 [", "deposited ${$1}": "存放了${$1}", "Leadership was transferred to": "帮派领导权被移交给了 ", "Someone mugged": "有人抢劫了 ", "hospitalized": " 暴打了 ", "mugged": " 抢劫了 ", "attacked": " 攻击了 ", "but lost": " 但是输了", "Someone attacked": "有人攻击了 ", "Someone hospitalized": "有人暴打了 " } function factionTrans() { titleTrans(); contentTitleLinksTrans(); //帮派大标题 $('span[class^="tab-name"]').each((i, e) => { if (factionDict[$(e).text().trim()]) { $(e).text(factionDict[$(e).text().trim()]); } }) //帮派战争状态 $('div[class^="f-msg"]').contents().each((i, e) => { let word2Trans = $(e).text().trim().split(":")[0]; if (word2Trans && factionDict[word2Trans]) { $(e).text($(e).text().replace(word2Trans, factionDict[word2Trans])); } }) //攻击链盒 $('div[class^="chain-box"]').contents().each((i, e) => { if (factionDict[$(e).text().trim()]) { $(e).text(factionDict[$(e).text().trim()]); } }) //帮派消息类别 $('div[class^="newsHeader"]').contents().each((i, e) => { if (factionDict[$(e).text().trim()]) { $(e).text(factionDict[$(e).text().trim()]); } }) //帮派主要消息日志 $('button[class^="tab"] ').each((i, e) => { if ($(e).attr('class').indexOf("active") >= 0) { console.log($(e).text()); switch ($(e).text().trim()) { case "主要消息": $('ul[class^="news-list"] span[class^="info"]').contents().each((i, u) => { if (factionDict[$(u).text().trim()]) { u.nodeValue = u.nodeValue.replace($(u).text().trim(), factionDict[$(u).text().trim()]); } }) break; case "攻击": $('ul[class^="news-list"] span[class^="info"]').find('*').contents().each((i, u) => { console.log($(u).text().trim()) if (factionDict[$(u).text().trim()]) { u.nodeValue = factionDict[$(u).text().trim()]; } }) break; case "资金流动": $('ul[class^="news-list"] span[class^="info"]').contents().each((i, u) => { if (u.nodeValue) { u.nodeValue = u.nodeValue.replace("deposited", "存放了"); } }) break; } } }) // //帮派主要消息日志 // $('ul[class^="news-list"] span[class^="info"]').contents().each((i, e) => { // if (factionDict[$(e).text().trim()]) { // e.nodeValue = e.nodeValue.replace($(e).text().trim(), factionDict[$(e).text().trim()]); // } // }) } factionTrans(); factionOB.observe($('div.content-wrapper')[0], {childList: true, subtree: true}); return; } /** * itemuseparcel.php */ /** * 通知翻译函数 * @param events */ function eventsTrans(events = $('span.mail-link')) { const index = window.location.href.indexOf('events.php#/step=received') >= 0 ? 1 : 0; const isReceived = index === 1; // 通知的类型选择栏 $('ul.mailbox-action-wrapper a').contents().each((i, e) => { if (e.nodeValue) if (eventsDict[e.nodeValue.trim()]) e.nodeValue = eventsDict[e.nodeValue.trim()]; }); // 桌面版右边按钮浮动提示消息 $('div.mailbox-container i[title]').each((i, e) => { if (eventsDict[$(e).attr('title')]) { $(e).attr('title', eventsDict[$(e).attr('title')]); } }); // 手机版底部按钮 $('.mobile-mail-actions-wrapper div:nth-child(2)').each((i, e) => { if (eventsDict[$(e).text().trim()]) $(e).text(eventsDict[$(e).text().trim()]); }); // 黑框标题 $('#events-main-wrapper .title-black').each((i, e) => { if (eventsDict[$(e).text().trim()]) { $(e).text(eventsDict[$(e).text().trim()]); } }); // 发送的两个按钮 + user id $('#events-main-wrapper div.send-to a.btn').each((i, e) => { if (eventsDict[$(e).text().trim()]) { $(e).text(eventsDict[$(e).text().trim()]); } }); $('#events-main-wrapper div.send-to span.cancel a').each((i, e) => { if (eventsDict[$(e).text().trim()]) { $(e).text(eventsDict[$(e).text().trim()]); } }); $('#events-main-wrapper div.send-to span.name').each((i, e) => { if (eventsDict[$(e).text().trim()]) { $(e).text(eventsDict[$(e).text().trim()]); } }); // 通知翻译的开关 if (!$('div#event-trans-msg').get(0) && !window.location.href.contains(/index\.php/)) { msgBox(``); $('input#eventTransCheck').attr('checked', localStorage.getItem('wh_trans_event') === 'true'); $('input#eventTransCheck').change(function () { if ($(this).attr('checked') === undefined) { localStorage.setItem('wh_trans_event', 'false'); } else { localStorage.setItem('wh_trans_event', 'true'); } eventsTrans(); }); } if (localStorage.getItem('wh_trans_event') === 'false') return; if (events.length === 0) return; events.each((i, e) => { // todo “收到的信息” 暂时删除发送人节点 不影响显示 if (isReceived) { $(e).children('a.sender-name').remove(); } if (eventsDict[$(e).text().trim()]) { $(e).text(eventsDict[$(e).text().trim()]); return; } /** * 赛车 * 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].slice(0, 8);//.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 + '赛车点数 (Racing Points)。'; } 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 = '鲨客借贷'; 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().contains(/You were sent .+ from/)) { // 数量 物品 信息 // spl = [You were sent 1x Birthday Present from] const spl = $(e).contents().get(0).nodeValue.trim().split(' '); const msgSpl = $(e).text().trim().split('with the message: '); const num = /^\$[0-9,]+\b/.test(spl[3]) ? '' : spl[3].numWordTrans(); const item = num === '' ? spl[3] : spl.slice(4, -1).join(' '); const msg = msgSpl[1] ? msgSpl[1] : null; e.childNodes[0].nodeValue = `你收到了 ${num} ${item},来自 `; if (e.childNodes[2]) { e.childNodes[2].nodeValue = `。`; } if (msg) { e.childNodes[2].nodeValue = `,附带信息:${msg}。`; } 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().contains(/bought .+ from your bazaar for/)) { 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 + ' 从你的店铺购买了 ' + 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; // todo 多人运动暂时跳过 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 ($(e).find('a').text().toLowerCase().indexOf('someone') < 0 && // 避免玩家名带有someone字样 $(e).text().split(' ')[0].toLowerCase() === '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().contains(/, the director of .+, has/)) { $(e).contents().each((i, e) => { if (e.nodeType === 3) { if (eventsDict[e.nodeValue.trim()]) { e.nodeValue = eventsDict[e.nodeValue.trim()]; } else { // 工资改变 if (e.nodeValue.contains(/wage/)) { const money = e.nodeValue.trim().slice(27, -9); e.nodeValue = ` 的老板) 将你的每日工资改为 ${money}。`; return; } // 职位改变 if (e.nodeValue.contains(/rank/)) { const pos = e.nodeValue.trim().slice(27, -1); e.nodeValue = ` 的老板) 将你的公司职位改为 ${pos}。`; return; } if (e.nodeValue.contains(/assigned/)) { e.nodeValue = ` 的老板) 将你指派为新的公司老板。`; return; } // 火车 if (e.nodeValue.contains(/trained/)) { const spl = e.nodeValue.trim().split(' '); const pri = spl[10]; const sec = spl[13].slice(0, -1); e.nodeValue = ` 的老板) 从公司训练了你。你获得了 50 ${eventsDict[pri]} 和 25 ${eventsDict[sec]}。`; } } } }); return; } /** * 悬赏已被领取 */ if ($(e).text().contains(/bounty reward/)) { $(e).contents().each((i, e) => { if (e.nodeType === 3) { if (eventsDict[e.nodeValue.trim()]) { e.nodeValue = ` ${eventsDict[e.nodeValue.trim()]} `; } else { if (e.nodeValue.contains(/bounty reward/)) { const bountyAmount = e.nodeValue.trim().split(' ')[3]; if (eventsDict['and earned your'] && eventsDict['bounty reward']) { e.nodeValue = ` ${eventsDict['and earned your']} ${bountyAmount} ${eventsDict['bounty reward']}`; } } } } }); return; } /** * oc开启 * You have been selected by * endlessway * to participate in an organized crime. You, along with 2 others will make up the team to * make a bomb threat * in 72 hours. * * 你被endlessway选中参与一项有组织的犯罪活动。你和另外两个人将组成一个团队,在72小时内进行炸弹威胁。 */ if ($(e).text().indexOf('organized crime') >= 0) { const time = e.childNodes[4].nodeValue.split(' ')[2]; const OCName = e.childNodes[3].firstChild.nodeValue; let others = e.childNodes[2].nodeValue.split(' ')[10]; others = others === 'one' ? '1' : others; e.firstChild.nodeValue = '你被 '; e.childNodes[2].nodeValue = ` 选中参与一项组织犯罪(OC)。你和另外${others}人将组成一个团队,在${time}小时后进行 `; e.childNodes[3].firstChild.nodeValue = ocList[OCName] ? ocList[OCName] : OCName; e.childNodes[4].nodeValue = '。'; return; } /** * oc结束 * - You and your team tried to make a bomb threat but failed! View the details * - You and your team successfully blackmailed someone! View the details * here * ! */ if ($(e).text().indexOf('You and your team') >= 0) { let rs = '成功'; let OCName = e.firstChild.nodeValue.slice(31, -19); if ($(e).text().indexOf('fail') >= 0) { rs = '失败'; OCName = e.firstChild.nodeValue.slice(27, -30); } e.firstChild.nodeValue = `你和团队的组织犯罪(OC) ${ocList[OCName] ? ocList[OCName] : OCName} ${rs}了!`; e.childNodes[1].firstChild.nodeValue = '点此查看详情'; e.childNodes[2].nodeValue = '!'; return; } /** * bust * Spookyt * failed to bust you out of jail. */ if ($(e).text().indexOf('bust') >= 0) { if (e.childNodes[1].nodeValue[1] === 'f') { // 失败 e.childNodes[1].nodeValue = ' 没能把你从监狱救出来。'; return; } if (e.childNodes[1].nodeValue[1] === 'w') { // 失败被抓 e.childNodes[1].nodeValue = ' 在尝试救你出狱时被抓了。'; return; } if (e.childNodes[1].nodeValue[1] === 's') { e.childNodes[1].nodeValue = ' 成功把你从监狱里救了出来。'; return; } } /** * 保释 */ if ($(e).text().indexOf('bailed') >= 0) { const cost = e.childNodes[1].nodeValue.trim().slice(27, -1); e.childNodes[1].nodeValue = ' 花费 ' + cost + ' 保释了你。'; return; } /** * 收到帮派的钱 */ if ($(e).text().contains(/You were given \$[0-9,]+ from your faction/)) { const money = e.firstChild.nodeValue.split(' ')[3]; let isNamed = e.childNodes.length > 1; if (isNamed) { e.firstChild.nodeValue = ''; e.childNodes[2].nodeValue = ' 为你从帮派取了 ' + money + '。'; } else { e.firstChild.nodeValue = '你得到了从帮派取出的 ' + money + '。'; } return; } /** * 被下悬赏 */ if ($(e).text().contains(/has placed .+ bount.+ on you/)) { // 是否匿名 悬赏个数 悬赏单价 原因 const spl = $(e).text().trim().split(' '); const reasonSpl = $(e).text().trim().split(' and the reason: '); const someone = !e.children.length; const num = spl[3] === 'a' ? '1' : spl[3]; const price = reasonSpl[0].split(' ').slice(-1)[0]; const reason = reasonSpl[1] ? reasonSpl[1] : null; const trans = `${someone ? '某人' : ' '}对你进行了 ${num} 次赏金为 ${price} 的悬赏${reason ? ',原因:' + reason : ''}`; // 匿名悬赏 if (someone) { $(e).text(trans); } // 实名悬赏 else { $(e).contents().get(1).nodeValue = trans; } return; } /** * 成功复活 */ if ($(e).text().contains(/successfully revived you/)) { if (e.children.length !== 1) return; if (eventsDict[$(e).contents().get(1).nodeValue.trim()]) { $(e).contents().get(1).nodeValue = eventsDict[$(e).contents().get(1).nodeValue.trim()] } return; } /** * 失败复活 */ if ($(e).text().contains(/failed to revive you/)) { if (e.children.length !== 1) return; if (eventsDict[$(e).contents().get(1).nodeValue.trim()]) { $(e).contents().get(1).nodeValue = eventsDict[$(e).contents().get(1).nodeValue.trim()] } return; } /** * 收到帮派的pt */ if ($(e).text().contains(/You were given [0-9,]+ points? from your faction/)) { const pt = e.firstChild.nodeValue.split(' ')[3]; e.firstChild.nodeValue = '你得到了从帮派取出的 ' + pt + ' PT。' return; } /** * 帮派借东西 */ if ($(e).text().contains(/loaned you .+ from the faction armory/)) { const [num, item] = (() => { const spl = e.lastChild.nodeValue.trim().slice().slice(11, -25).split(' '); return spl.length === 1 ? [spl[0], null] : [spl[0], spl.slice(1).join(' ')]; })(); if (num && item) { e.lastChild.nodeValue = ` 从帮派军械库中借给你 ${num.numWordTrans()} ${item}。`; } return; } /** * 教育完成 * The education course you were taking has ended. Please click here. */ if ($(e).text().indexOf('edu') >= 0) { if ($(e).text().trim().split(' ')) e.firstChild.firstChild.nodeValue = '你的课程已学习结束,请点此继续。'; return; } /** * LSD od */ if ($(e).text().contains(/LSD .+ overdosed/)) { if (eventsDict[$(e).text().trim()]) $(e).text(eventsDict[$(e).text().trim()]); return; } /** * 公司申请 */ if ($(e).text().contains(/Your application to join the company .+ has been/)) { $(e).contents().each((i, e) => { if (e.nodeType === 3) { if (eventsDict[e.nodeValue.trim()]) { e.nodeValue = eventsDict[e.nodeValue.trim()]; } } }); return; } /** * 银行完成 */ if ($(e).text().contains(/Your bank investment has ended/)) { $(e).children().text('你的银行投资已经结束。请点击这里领取你的资金。'); return; } /** * 人物升级 * Congratulations! You upgraded your level to 31! */ if ($(e).text().indexOf('upgraded') >= 0) { const level = e.firstChild.nodeValue.slice(44, -2); e.firstChild.nodeValue = '恭喜!你已升至' + level + '级!'; return; } /** * 开新健身房 * You have successfully purchased membership in Deep Burn. * 你已成功购买Deep Burn的健身房会员卡。 */ if ($(e).text().contains(/You have successfully purchased membership in/)) { const gymName = e.firstChild.nodeValue.trim().slice(46, -1); e.firstChild.nodeValue = `你已购买【${gymList[gymName]}】健身房会员卡。`; return; } /** * 人物称号 */ if ($(e).text().contains(/You are now known in the city as a/)) { const trans = '现在你在这个城市中被称为'; const title = $(e).text().trim().split(' ').slice(9).join(' ').slice(0, -1); $(e).text(`${trans} ${title}。`); return; } /** * 收下线 */ if ($(e).text().contains(/You have successfully referred/)) { $(e).contents().each((i, e) => { // 文字 if (e.nodeType === 3) { if (eventsDict[e.nodeValue.trim()]) { e.nodeValue = eventsDict[e.nodeValue.trim()]; } } // referral list else if (e.nodeType === 1) { if (eventsDict[$(e).text().trim()]) { $(e).text(eventsDict[$(e).text().trim()]); } } }); 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().contains(/You found .+ and .+ on your doorstep/)) { const [item1, item2] = $(e).text().trim().slice(10, -18).split(' and '); const bookTitle = item2.contains(/a book titled/) ? item2.slice(15, -1) : null; if (bookTitle) { $(e).text(`你在家门口发现了 ${item1.numWordTrans()} 和《${bookTitle}》。`); } else { $(e).text(`你在家门口发现了 ${item1.numWordTrans()} 和 ${item2.numWordTrans()}。`); } return; } /** * 季度邮件奖励 */ if ($(e).text().contains(/used the reward bonus code/)) { const code = $(e).text().trim().split(' ')[7]; if (eventsDict[$(e).text().trim().replace(code, '{$}')]) $(e).text(eventsDict[$(e).text().trim().replace(code, '{$}')] .replace('{$}', code)); return; } /** * 求婚 */ if ($(e).text().contains(/accepted your proposal, you are now engaged/)) { const spouse = $(e).children(':first').text().trim(); if (e.childNodes[1]) { e.childNodes[1].nodeValue = ` 接受了你的求婚,你现在和 ${spouse} 订婚了!前往`; } if (e.childNodes[2] && e.childNodes[2].firstChild) { e.childNodes[2].firstChild.nodeValue = `这里`; } if (e.childNodes[3]) { e.childNodes[3].nodeValue = `完成仪式。`; } return; } /** * 帮派职位变更 * Your position in * Silver Hand * changed from Recruit to Knight. */ if ($(e).text().indexOf('position') >= 0) { let prePos, curPos; const node3Spl = e.childNodes[2].nodeValue.split(' to '); if (node3Spl.length === 2) { prePos = node3Spl[0].slice(14, node3Spl[0].length); curPos = node3Spl[1].slice(0, node3Spl[1].length - 2); } else { console.log('职位出现" to "');// todo return; } e.firstChild.nodeValue = '你在 '; e.childNodes[2].nodeValue = ` 的职位从 ${prePos} 变为 ${curPos}。`; return; } /** * 加入帮派结果 */ if ($(e).text().indexOf('join the faction') >= 0) { const rsName = e.childNodes[2].nodeValue.trim().split(' ')[2]; const rsDict = {'accepted': '通过', 'declined': '拒绝',}; e.firstChild.nodeValue = '加入帮派 '; e.childNodes[2].nodeValue = ` 的申请已${rsDict[rsName]}。`; return; } }); } /** * 页标题按钮content-title-links */ function contentTitleLinksTrans() { const $links = $('div.content-title span:nth-child(2)').length === 0 ? $('div[class^="topSection"] span[class*="Title"]') : $('div.content-title span:nth-child(2)'); $links.each((i, e) => { if (titleLinksDict[$(e).text()]) { $(e).text(titleLinksDict[$(e).text()]); } else if ($(e).attr('id') === 'events') { if (titleLinksDict[$(e).text().split(' ')[0]]) $(e).text($(e).text() .replace( $(e).text().split(' ')[0], titleLinksDict[$(e).text().split(' ')[0]] )); } }); } /** * 页标题翻译 */ function titleTrans() { const $title = $('h4#skip-to-content').length === 0 ? $('h4[class^="title"]') : $('h4#skip-to-content'); const title = titleDict[$title.text().trim()]; if (title && $title.css('display') !== 'none') $title.after($title.clone().text(title)).css('display', 'none'); } /** * 翻译插件提示 */ function msgBox(htmlCont = '') { if ($('div.wh-trans-msg').length === 0) { console.log('翻译插件消息框已创建'); $('div.content-title').after(`