From 1a226511311ce04e437badf1f230afe3d87b28e7 Mon Sep 17 00:00:00 2001 From: woohoo Date: Mon, 22 Nov 2021 19:39:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=AA=E4=BA=BA=E8=B5=84?= =?UTF-8?q?=E6=96=99=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- torn-trans-zhcn.user.js | 168 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 154 insertions(+), 14 deletions(-) diff --git a/torn-trans-zhcn.user.js b/torn-trans-zhcn.user.js index de65a54..7c70c41 100644 --- a/torn-trans-zhcn.user.js +++ b/torn-trans-zhcn.user.js @@ -1056,6 +1056,41 @@ // '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': '{$} 的集市上没有物品', + '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': '取消', + }; // 默认开启通知翻译 if (!localStorage.getItem('wh_trans_event')) { @@ -1791,20 +1826,111 @@ 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 (profileDict[$(e).text().trim()]) { + $(e).text(profileDict[$(e).text().trim()]); + } else if (profileDict[$(e).text().trim().replace(playerName,'{$}')]) { + $(e).text( + profileDict[$(e).text().trim().replace(playerName,'{$}')] + .replace('{$}',playerName) + ); + } + }); + + // 行动框的描述 + 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); + } + } + } + }); + }; + profileTrans(); + profileOB.observe($('.content-wrapper').get(0), {characterData:true,attributes: true, subtree: true, childList: true}); + return; + } + /** * 报纸 */ - if (window.location.href.indexOf('newspaper.php') >= 0 || window.location.href.indexOf('joblist.php') >= 0 || - window.location.href.indexOf('freebies.php') >= 0 || window.location.href.indexOf('newspaper_class.php') >= 0 || - window.location.href.indexOf('personals.php') >= 0 || window.location.href.indexOf('bounties.php') >= 0 || - window.location.href.indexOf('comics.php') >= 0) { - const newspaperOB = new MutationObserver(newspaperOBInit); - - function newspaperOBInit() { + 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(); @@ -2796,21 +2922,20 @@ * 公司职位变更 */ if ($(e).text().contains(/, the director of .+, has/)) { - $(e).contents().each((i,e)=>{ + $(e).contents().each((i, e) => { if (e.nodeType === 3) { if (eventsDict[e.nodeValue.trim()]) { e.nodeValue = eventsDict[e.nodeValue.trim()]; - } - else { + } else { // 工资改变 if (e.nodeValue.contains(/wage/)) { - const money = e.nodeValue.trim().slice(27,-9); + 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); + const pos = e.nodeValue.trim().slice(27, -1); e.nodeValue = ` 的老板) 将你的公司职位改为 ${pos}。`; return; } @@ -2822,7 +2947,7 @@ if (e.nodeValue.contains(/trained/)) { const spl = e.nodeValue.trim().split(' '); const pri = spl[10]; - const sec = spl[13].slice(0,-1); + const sec = spl[13].slice(0, -1); e.nodeValue = ` 的老板) 从公司训练了你。你获得了 50 ${eventsDict[pri]} 和 25 ${eventsDict[sec]}。`; } } @@ -3237,4 +3362,19 @@ ${htmlCont}
} } + /** + * 发钱翻译 + */ + function sendCashTrans() { + const sc = $('.send-cash'); + if (sc.length === 0) return; + sc.find('*').contents().each((i,e)=>{ + if (e.nodeType === 1) { + + } else if (e.nodeType === 3) { + + } + }); + } + }());