wuhu-torn-helper/src/func/translate/translateMain.ts
2022-09-23 18:15:45 +08:00

2089 lines
92 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {
attackDict,
awDict,
calDict,
CC_set,
chatDict,
cityDict,
eduDict,
eventsDict,
gymDict,
gymList,
headerDict,
homeDict,
hosDict,
itemNameDict,
itemPageDict,
newspaperDict,
npcShopDict,
pcDict,
profileDict,
propertyDict,
sendCashDict,
sidebarDict,
stockDict,
tipsDict,
titleDict,
tornSettingsDict,
travelingDict
} from "../../dictionary/translation";
import sendCashTrans from "./sendCashTrans";
import eventsTrans from "./eventsTrans";
import playerStatusTrans from "./playerStatusTrans";
import initOB from "./initOB";
import titleTrans from "./titleTrans";
import contentTitleLinksTrans from "./contentTitleLinksTrans";
import showItemInfoTrans from "./showItemInfoTrans";
import log from "../utils/@deprecated/log";
import contentTitleLinksTransReact from "./contentTitleLinksTransReact";
import titleTransReact from "./titleTransReact";
export default function translateMain(href: string): void {
// 时分秒转换
String.prototype.replaceHMS = function replaceHMS() {
return this.replace('and', '')
.replace('days', '天')
.replace('days', '天')
.replace('hours', '小时')
.replace('hour', '小时')
.replace('minutes', '分钟')
.replace('minute', '分钟')
.replace('seconds', '秒钟')
.replace('second', '秒钟');
};
// 数词转换 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];
});
// 边栏人物名字
$('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 (document.querySelector('#pointsMerits'))
$('#pointsMerits')[0].firstChild.nodeValue = '[使用]';
if (document.querySelector('#pointsPoints'))
$('#pointsPoints')[0].firstChild.nodeValue = '[使用]';
if (document.querySelector('#pointsLevel'))
$('#pointsLevel')[0].firstChild.nodeValue = '[升级]';
// 手机 区域菜单
$('div[class*="areas-mobile"] span:nth-child(2)').contents().each((i, e) => {
//log(e);
if (sidebarDict[e.nodeValue])
e.nodeValue = sidebarDict[e.nodeValue];
});
clearInterval(sidebarInterval);
}, 1000);
// header
if (document.querySelector('div#header-root')) {
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[document.querySelector('div#header-root legend.title').innerText])
$('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) => {
// 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”
const $view_log = $('div.recentHistory a[class^="link"] span[class^="text"]')
if (headerDict[$view_log.text().trim()])
$view_log
.text(headerDict[$view_log.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 (document.querySelector('div#chatRoot')) {
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[document.querySelector('div#chatRoot div[class^="overview"] > div > div:nth-child(2)').innerText.trim()]
);
}
};
chatTrans();
chatOB.observe($('div#chatRoot').get(0), { childList: true, subtree: true, attributes: true });
}
// 搜索玩家的4个分类按钮
const playerSearchBoxTrans = function playerSearchBoxTrans() {
const opt = {
childList: true,
subtree: true,
};
const psbtOB = new MutationObserver(mutation => {
const $people_cat = $('ul.ac-options li a');
psbtOB.disconnect();
mutation.forEach((e) => {
if ((<HTMLElement>e.target).className === 'ac-wrapper') {
$people_cat.each((i, e) => {
if (chatDict[$(e).text().trim()])
$(e).text(chatDict[$(e).text().trim()]);
});
}
})
psbtOB.observe(document.body, opt);
});
psbtOB.observe(document.body, opt);
}
playerSearchBoxTrans();
// 飞行页面
if (href.includes('index.php') &&
!!document.querySelector('div.travelling h4')) {
let travelTrans = function travelTrans() {
titleTrans();
contentTitleLinksTrans();
// 气泡
if (tipsDict[document.querySelector('div.inner-popup').innerText.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 (document.querySelector('div.tt-landing-time span.description').innerText.split(' ')[0] === 'Landing') {
let node = $('div.tt-landing-time span.description');
const landingTime = node.text().slice(11, 19);
node.text('于 ' + landingTime + ' 降落');
}
}
let travelOBInit = function travelOBInit() {
travelOB.disconnect();
travelTrans();
travelOB.observe($('div.content-wrapper')[0], { childList: true, subtree: true });
}
const travelOB = new MutationObserver(travelOBInit);
travelTrans();
travelOB.observe(document.querySelector('div.content-wrapper'), { childList: true, subtree: true });
}
// 主页
if (href.contains(/index\.php/) && document.querySelector('h4#skip-to-content').innerText.contains(/Home/)) {
titleTrans();
contentTitleLinksTrans();
// 主页黑框标题文字翻译
$('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(`<h5 class="box-title">` + homeDict[e.firstChild.nodeValue] + `</h5>`);
});
// 各表格左边的键
$('span.divider span').each((i, e) => {
if (homeDict[$(e).text()])
$(e).text(homeDict[$(e).text()]);
});
return;
}
// city
if (href.includes('city.php')) {
let cityTrans = function cityTrans() {
titleTrans();
contentTitleLinksTrans();
// Map or Quick Links
$('a.ui-tabs-anchor span').each((i, e) => {
if (cityDict[$(e).text()])
$(e).text(cityDict[$(e).text()]);
});
// 标志建筑 标题
if (cityDict[$('div.title-black').text()])
$('div.title-black').text(cityDict[$('div.title-black').text()]);
// 标志建筑 6个分类
$('ul.map-symbols span').each((i, e) => {
if (cityDict[$(e).text()])
$(e).text(cityDict[$(e).text()]);
});
// 地图显示模式
// 不完全显示 文字
$('span.inactive-mode').html(cityDict['inactive-mode1'] + `<br>` + cityDict['inactive-mode2']);
// 完全显示 文字
$('span.active-mode').text(cityDict['active-mode']);
// 开关
$('div.on-label').text('已开启');
$('div.off-label').text('已关闭');
// 快速链接中的分类标题
$('li.title').each((i, e) => {
if (cityDict[$(e).text()])
$(e).text(cityDict[$(e).text()]);
});
// 快速链接中的区域
$('li a[class^="font-num-"] span').each((i, e) => {
// log($(e).prev().attr('class')==='cql-gym')
if (cityDict[$(e).text()]) {
$(e).text(cityDict[$(e).text()]);
} else if ($(e).prev().attr('class') === 'cql-your-property') {
if (propertyDict[$(e).text().trim().slice(5)]) {
$(e).text('你的' + propertyDict[$(e).text().trim().slice(5)]);
}
} else if ($(e).prev().attr('class') === 'cql-gym') {
if (gymList[$(e).text().trim()]) {
$(e).text(gymList[$(e).text()]);
} else if (gymList[$(e).text().trim().split(' ').slice(0, 2).join(' ')]) {
$(e).text(gymList[$(e).text().trim().split(' ').slice(0, 2).join(' ')]);
}
}
});
// 快速链接中的分类选择
$('div.sort-by label.marker-css').each((i, e) => {
if (cityDict[$(e).text()])
$(e).text(cityDict[$(e).text()]);
});
// 快速链接中的sort by
$('span#wai-sort-by').each((i, e) => {
if (cityDict[$(e).text()])
$(e).text(cityDict[$(e).text()]);
});
}
let cityOBInit = function cityOBInit() {
cityOB.disconnect();
cityTrans();
cityOB.observe($('div.content-wrapper')[0], { childList: true, subtree: true });
}
const cityOB = new MutationObserver(cityOBInit);
cityTrans();
cityOB.observe(document.querySelector('div.content-wrapper'), { childList: true, subtree: true });
return;
}
// gym健身房页面
if (href.includes('gym.php')) {
let gymTrans = function gymTrans() {
titleTrans();
contentTitleLinksTrans();
const gymName = $('div[class^="notificationText"] b').text();
// 顶部提示信息
$('div[class^="notificationText"] p').contents().each((i, e) => {
if (e.nodeName === 'B' && gymList[$(e).text().trim()]) {
$(e).text(gymList[$(e).text().trim()]);
return;
}
if (e.childNodes.length === 0 && gymDict[e.nodeValue.trim()])
e.nodeValue = gymDict[e.nodeValue.trim()];
});
// 4属性标题
$('h3[class^="title"]').each((i, e) => {
if (gymDict[$(e).text().trim()])
$(e).text(gymDict[$(e).text().trim()]);
});
// 4属性的介绍 与冰蛙冲突
$('div[class^="description"] p:nth-child(1)').each((i, e) => {
if (gymDict[$(e).text().trim()])
$(e).text(gymDict[$(e).text().trim()]);
});
// 每次锻炼的花销
$('div[class^="description"] p:nth-child(2)').each((i, e) => {
if (e.childNodes.length === 1) {
if (gymDict[$(e).text().trim()])
$(e).text(gymDict[$(e).text().trim()]);
} else if (e.childNodes.length === 2) {
if (gymDict[e.lastChild.nodeValue.trim()]) {
e.lastChild.nodeValue = gymDict[e.lastChild.nodeValue.trim()];
}
}
});
// 锻炼页面所有按钮
$('button[class^="button"]').each((i, e) => {
if (gymDict[$(e).text().trim()])
$(e).text(gymDict[$(e).text().trim()]);
});
// cancel按钮
$('button[class^="cancel"]').each((i, e) => {
if (gymDict[$(e).text().trim()])
$(e).text(gymDict[$(e).text().trim()]);
});
// 锻炼的提示信息
$('div[class^="messageWrapper"] p').each((i, e) => {
/**
* todo
* <p>You dug deep and completed 15 minutes of incline sprints</p>
* <p role="alert" class="gained___3T_GZ">You gained 1,854.05 speed</p>
*/
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) => {
// 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()]);
});
}
let gymOBInit = function gymOBInit() {
gymOB.disconnect();
gymTrans();
gymOB.observe($('div.content-wrapper')[0], { childList: true, subtree: true, attributes: true });
}
const gymOB = new MutationObserver(gymOBInit);
gymTrans();
gymOB.observe($('div.content-wrapper')[0], { childList: true, subtree: true, attributes: true });
return;
}
// 物品页面
if (href.contains(/item\.php/)) {
if (href.includes('item.php?temp=')) return;
// 标题和右边的链接
initOB(document.querySelector('.content-title'), { childList: true },
() => {
titleTrans();
contentTitleLinksTrans();
});
// 套装预览中间的文字
const $loadouts_root = document.getElementById('loadoutsRoot');
if ($loadouts_root) {
initOB($loadouts_root, { subtree: true, attributes: true }, () => {
const el = $loadouts_root.querySelector('div[class^="type___"]');
if (el && itemPageDict[el.innerText.trim()]) {
el.innerText = itemPageDict[el.innerText.trim()];
}
});
}
// 手机选项按钮 物品名 物品详情
const options = {
attributes: true,
subtree: true,
attributeFilter: ["aria-hidden",]
};
const translated = { cat: '', count: -1 };
const translatedOnce = { item_opt: -1, opt_icon_count: -1 };
initOB(document.getElementById('category-wrap'), options, () => {
// 手机操作选项
const $item_opt = document.querySelectorAll(`ul.itemsList span.opt-name`);
if (translatedOnce.item_opt !== $item_opt.length - 1) {
let count = -1;
$item_opt.forEach((e, i) => {
if (itemPageDict[e.firstChild.nodeValue.trim()]) {
e.firstChild.nodeValue = itemPageDict[e.firstChild.nodeValue.trim()];
}
count = i;
});
translatedOnce.item_opt = count !== -1 ? count : -1;
}
// 物品名
const $active_tab = document.querySelector('ul.itemsList[aria-expanded="true"]');
if (!$active_tab) return;
const $active_item_list = $active_tab.querySelectorAll('span.name');
const itemCat = $active_tab.id;
if ($active_item_list.length - 1 !== translated.count || itemCat !== translated.cat) {
let count = -1;
// 物品名
$active_item_list.forEach((e, i) => {
if (!e.classList.contains('wh-translated')) {
if (itemNameDict[e.innerText.trim()]) {
e.classList.add('wh-translated');
const trans_dom = document.createElement('span');
trans_dom.classList.add('wh-translate');
trans_dom.setAttribute('style', 'margin: 0 0 0 1em');
trans_dom.append(itemNameDict[e.innerText.trim()]);
e.after(trans_dom);
// .after(`<span class="wh-translate" style="margin: 0 0 0 1em">${itemNameDict[$(e).text().trim()]}</span>`);
}
}
count = i;
});
if (count !== -1) {
translated.cat = itemCat;
translated.count = count;
}
}
// 物品详情
const $show_item_info: HTMLElement = $active_tab.querySelector('li.show-item-info');
showItemInfoTrans($show_item_info);
// 物品右操作按钮
const $opt_icon_tooltip = $('ul.actions-wrap span.icon-h');
if (translatedOnce.opt_icon_count !== $opt_icon_tooltip.length - 1) {
let count = -1
$opt_icon_tooltip.each((i, e) => {
if (itemPageDict[e.getAttribute('title')]) {
e.setAttribute('title', itemPageDict[e.getAttribute('title')]);
}
count = i;
});
if (count !== -1) {
translatedOnce.opt_icon_count = count;
}
}
});
// 黑框
const $title_black = document.querySelector('div.title-black');
if ($title_black) {
const $your_items = $title_black.querySelector('span.m-hide');
if (itemPageDict[$your_items.innerText.trim()]) {
$your_items.innerText = itemPageDict[$your_items.innerText.trim()];
}
// 黑框分类标题
const $items_type_name = $title_black.querySelector('span.items-name');
initOB($items_type_name, { childList: true }, () => {
if (itemPageDict[$items_type_name.innerText.trim()]) {
$items_type_name.innerText = itemPageDict[$items_type_name.innerText.trim()];
}
});
}
// 分类浮动文字
const $data_type = document.querySelectorAll('li#categoriesItem a');
$data_type.forEach((e) => {
if (itemPageDict[e.getAttribute('title')]) {
e.setAttribute('title', itemPageDict[e.getAttribute('title')]);
}
});
return;
}
// npc商店
if (href.contains(/(shops|bigalgunshop)\.php/)) {
// 标题和右边的链接
const $cont_title = document.querySelector('.content-title');
initOB($cont_title, { childList: true, subtree: true }, () => {
titleTrans();
contentTitleLinksTrans();
});
const $wrapper = document.querySelector('.content-wrapper');
// [购买部分]
const $buy_items_wrapper = $wrapper.querySelector('.buy-items-wrap');
if ($buy_items_wrapper) {
// 黑框标题
const $buy_black_title = $buy_items_wrapper.querySelector('.title-black');
if ($buy_black_title && npcShopDict[$buy_black_title.firstChild.nodeValue.trim()]) {
$buy_black_title.firstChild.nodeValue = npcShopDict[$buy_black_title.firstChild.nodeValue.trim()];
}
// 各个物品
const $items = $buy_items_wrapper.querySelectorAll('ul.items-list > li.torn-divider');
$items.forEach(e => {
// 物品名
const $item_name = e.querySelector('span.desc span.name.bold');
if ($item_name && itemNameDict[$item_name.innerText.trim()]) {
$item_name.innerText = `${ itemNameDict[$item_name.innerText.trim()] }(${ $item_name.innerText.trim() })`;
}
// 类型和存货
const $item_stock = e.querySelector('span.desc span.stock');
if ($item_stock) $item_stock.childNodes.forEach(e => {
if (e.nodeType === 1) {
if (npcShopDict[(<HTMLElement>e).innerText.trim()]) (<HTMLElement>e).innerText = npcShopDict[(<HTMLElement>e).innerText.trim()];
} else {
if (npcShopDict[e.nodeValue.trim()]) e.nodeValue = npcShopDict[e.nodeValue.trim()];
}
});
// buy按钮
const $buy_btn = e.querySelector('button.wai-support');
if ($buy_btn && npcShopDict[$buy_btn.childNodes[0].nodeValue.trim()]) {
$buy_btn.childNodes[0].nodeValue = npcShopDict[$buy_btn.childNodes[0].nodeValue.trim()];
}
// 买前确认
const $confirm = e.querySelector('span.confirm');
const $confirm_msg = $confirm.querySelector('span');
if ($confirm_msg && npcShopDict[$confirm_msg.innerText.trim()]) {
$confirm_msg.innerText = npcShopDict[$confirm_msg.innerText.trim()];
}
const $amount_item_name = $confirm.querySelector('span.count').nextSibling;
if ($amount_item_name && !$amount_item_name.nodeValue.contains(CC_set)) {
const item_name = $amount_item_name.nodeValue.trim().split(' ').slice(1, -1).join(' ');
const item_name_trans = itemNameDict[item_name] || item_name;
$amount_item_name.nodeValue = `个[${ item_name_trans }],总计$`;
}
const $confirm_a = $confirm.querySelectorAll('span.confirm-act a');
$confirm_a.forEach(e => {
if (npcShopDict[e.innerText.trim()]) e.innerText = npcShopDict[e.innerText.trim()];
});
});
// 展开的物品详情
initOB($wrapper, { childList: true, subtree: true }, () => {
const $item_desc: HTMLElement = $wrapper.querySelector('.show-item-info') || $wrapper.querySelector('.view-item-info');
showItemInfoTrans($item_desc);
});
}
// [卖出部分]
const $sell_items_wrapper = $wrapper.querySelector('.sell-items-wrap');
if ($sell_items_wrapper) {
// 黑框标题
const $title = $sell_items_wrapper.querySelectorAll('ul.title li');
$title.forEach(el => {
el.childNodes.forEach(e => {
if (e.nodeType === 1) {
let node = e as HTMLElement;
if (npcShopDict[node.innerText.trim()]) {
node.innerText = npcShopDict[node.innerText.trim()];
return;
}
const spl = node.innerText.trim().split(' ');
if (spl.length > 3) {
const shop_name = spl[2] === 'the' ? spl.slice(3).join(' ') : spl.slice(2).join(' ');
const shop_name_trans = npcShopDict[shop_name] || titleDict[shop_name] || cityDict[shop_name] || null;
node.innerText = `物品给${ shop_name_trans || shop_name }`;
}
} else {
if (npcShopDict[e.nodeValue.trim()]) e.nodeValue = npcShopDict[e.nodeValue.trim()];
}
});
});
// 物品名
const $items_name = $sell_items_wrapper.querySelectorAll('span.name');
$items_name.forEach(el => {
if (itemNameDict[el.innerText.trim()]) el.innerText +=
` ${ itemNameDict[el.innerText.trim()] }`;
});
// 按钮
const $btn = $sell_items_wrapper.querySelectorAll('button');
$btn.forEach(e => {
if (npcShopDict[e.innerText.trim()]) e.innerText = npcShopDict[e.innerText.trim()];
});
// select btn
const $select_btn = $sell_items_wrapper.querySelector('li.select button.wai-btn');
if ($select_btn) {
initOB($select_btn, { childList: true }, () => {
if ($select_btn && npcShopDict[$select_btn.innerText.trim()]) {
$select_btn.innerText = npcShopDict[$select_btn.innerText.trim()];
}
});
}
// 取消按钮
const $cancel = $sell_items_wrapper.querySelector('span.cancel a');
if ($cancel && npcShopDict[$cancel.innerText.trim()]) {
$cancel.innerText = npcShopDict[$cancel.innerText.trim()];
}
// 卖出确认文字
const $sell_confirm = $sell_items_wrapper.querySelector('div.sell-confirm');
if ($sell_confirm) {
const $msg = $sell_confirm.childNodes[0];
if (npcShopDict[$msg.nodeValue.trim()]) $msg.nodeValue = npcShopDict[$msg.nodeValue.trim()];
const $total_value = $sell_confirm.querySelector('span.profit').childNodes[0];
if (npcShopDict[$total_value.nodeValue.trim()]) $total_value.nodeValue = npcShopDict[$total_value.nodeValue.trim()];
}
}
// [出售PT部分]
const $sell_pt_wrapper = $wrapper.querySelector('.sell-points-wrap');
if ($sell_pt_wrapper) {
// 黑框
const $title_black = $sell_pt_wrapper.querySelector('.title-black');
if (npcShopDict[$title_black.innerText.trim()]) {
$title_black.innerText = npcShopDict[$title_black.innerText.trim()];
}
}
return;
}
// 股票
if (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) => {
const spl = $(e).text().trim().split(' ');
if (stockDict[$(e).text().trim()]) {
$(e).text(stockDict[$(e).text().trim()]);
} else if (/[0-9]x$/.test(spl[0])) {
const itemName = spl.slice(1).join(' ');
const num = spl[0].slice(0, -1);
$(e).text(`${ num }${ itemNameDict[itemName] ? itemNameDict[itemName] : itemName }`);
}
});
// 股价详情
$('#panel-priceTab ul[role="tablist"] label span:last-child').each((i, e) => {
if (stockDict[$(e).text()]) {
$(e).text(stockDict[$(e).text()]);
}
});
$('ul[class^="priceInfoList___"] li').contents().each((i, e) => {
if (e.nodeType === 3) {
if (stockDict[e.nodeValue.trim()]) {
e.nodeValue = stockDict[e.nodeValue.trim()];
}
}
});
// 点开购买后
$('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] as HTMLElement;
if (stockDict[$(e).text().trim()]) {
$(e).text(stockDict[$(e).text().trim()]);
}
});
// 历史购买show more
const $show_more = document.querySelector('li[class^="showMore___"] button');
if ($show_more && $show_more.innerText.trim().contains(/^Show [0-9]+ more$/)) {
const number = $show_more.innerText.trim().split(' ')[1];
$show_more.innerText = `显示另外${ number }`;
}
// 点开bb后
$('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', '个')
} ${ itemNameDict[itemName] ? itemNameDict[itemName] : itemName
}`;
} else {
if (/[\u4e00-\u9fa5]/.test(e.nodeValue)) return;
if (/\b\$?[0-9,]+$/.test(e.nodeValue)) return;
log.info(`未找到翻译:[${ e.nodeValue.trim() }]`);
}
});
};
stockTrans();
stockOB.observe($('.content-wrapper').get(0), {
characterData: true,
attributes: true,
subtree: true,
childList: true
});
return;
}
// 教育页面
if (href.indexOf('education.php') >= 0) {
let eduTrans = 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']);
}
});
}
let eduOBInit = function eduOBInit() {
eduOB.disconnect();
eduTrans();
eduOB.observe($('div.content-wrapper')[0], { childList: true, subtree: true });
}
const eduOB = new MutationObserver(eduOBInit);
eduTrans();
eduOB.observe($('div.content-wrapper')[0], { childList: true, subtree: true });
return;
}
// profile 玩家资料页面
if (href.contains(/profiles\.php\?XID=\d+/)) {
const $wrapper = document.querySelector('.content-wrapper');
const profileOB = new MutationObserver(() => {
profileOB.disconnect();
titleTrans();
contentTitleLinksTrans();
profileTrans();
profileOB.observe($wrapper, {
characterData: true,
attributes: true,
subtree: true,
childList: true
});
});
const profileTrans = function profileTrans() {
const playerName = document.title.trim().contains(/('s |s' )/)
? document.title.trim().split(/('s |s' )/)[0]
: null;
if (!playerName) {
console.error('翻译助手错误:获取用户名失败。');
try {
profileOB.disconnect()
} catch {
}
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()]);
}
});
// level rank age
$('.profile-information-wrapper .box-info .box-name').each((i, e) => {
if (profileDict[e.innerText.trim()]) e.innerText = profileDict[e.innerText.trim()];
});
// todo player title
// todo player rank title
// 行动框的描述
const action_desc = $('#profile-container-description.profile-container-description');
if (profileDict[action_desc.text().trim()]) {
action_desc.html(`<span class="wh-translated">${ profileDict[action_desc.text().trim()] }</span>`);
} else if (profileDict[action_desc.text().trim().replace(playerName, '{$}')]) {
action_desc.html(
`<span class="wh-translated">${ profileDict[action_desc.text().trim().replace(playerName, '{$}')]
.replace('{$}', playerName) }</span>`
);
} 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(
`<span class="wh-translated">${ profileDict['{$} is on your friend list']
.replace('{$}', playerName)
}${ mark ? ' : ' + mark : ''
}</span>`
);
}
break;
case 'enemy':
if (profileDict['{$} is on your enemy list']) {
action_desc.html(
`<span class="wh-translated">${ profileDict['{$} is on your enemy list']
.replace('{$}', playerName)
}${ mark ? ' : ' + mark : ''
}</span>`
);
}
break;
}
} else {
if ($('.wh-translated').length <= 0) {
log.info(`未找到翻译: “${ 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);
}
}
}
});
// 状态
playerStatusTrans($('.profile-status .profile-container span'));
// 表格
$('ul.info-table li div').each((i, e) => {
const $e = $(e);
// 左
if ($e.attr('class').contains(/user-information-section/)) {
const elem = e.children[0];
const $elem = $(elem);
if (profileDict[$elem.text().trim()]) $elem.text(profileDict[$elem.text().trim()]);
}
// 右 值
else {
if (profileDict[$e.text().trim()]) {
$e.children().text(profileDict[$e.text().trim()]);
return;
}
switch (i) {
case 5: // 帮派
case 7: { // 公司
if ($e.text().contains(CC_set)) return;
const $span = e.children[0].children[0];
const pos = $span.firstChild.nodeValue.trim().split(' ').slice(0, -1).join(' ');
$span.firstChild.nodeValue = '';
$($span).append(`${ pos }`);
return;
}
case 11: {
// 住宅
$e.find('span *').contents().each((i, el) => {
if (el.nodeType === 3) {
if (profileDict[el.nodeValue.trim()]) {
el.nodeValue = profileDict[el.nodeValue.trim()]
} else if (propertyDict[el.nodeValue.trim()]) {
el.nodeValue = propertyDict[el.nodeValue.trim()]
}
}
});
return;
}
case 13: {
// 结婚状态
if ($e.text().contains(CC_set)) return;
const days = $e.text().contains(/ [0-9]+ /)
? $e.text().trim().split(' ')[4]
: null;
if (days) {
e.children[0].children[0].childNodes[0].nodeValue = '与 ';
e.children[0].children[0].childNodes[2].nodeValue = ` 结婚${ days }`;
} else {
$e.find('span *').contents().each((i, el) => {
if (el.nodeType === 3) {
if (profileDict[el.nodeValue.trim()]) {
el.nodeValue = profileDict[el.nodeValue.trim()]
}
}
});
}
return;
}
case 23: {
// 39 minutes ago
if ($e.text().contains(/ago/)) {
$e.children().text($e.text()
.replace('ago', '前')
.replace('and', '')
.replace('seconds', '秒')
.replace('second', '秒')
.replace('minutes', '分')
.replace('minute', '分')
.replace('hours', '时')
.replace('hour', '时')
.replace('days', '日')
.replace('day', '日')
.replaceAll(' ', '')
);
}
return;
}
}
/**
1 'Woohoo [2687093]'
3 'Civilian'
5 'Knight of Silver Hand'
7 'Director of -- FaFaFa --'
9 '1567 / 1567'
11 'Private Island (With Spouse)'
13 'Married to Sabrina_Devil for 42 days'
15 '153'
17 '4'
19 '4\n  好人\n  坏比指数: 1\n '
21 '2 (0 karma)'
23 '52 minutes ago'
*/
}
});
// doesnt wish to share
const $nShare = $('.personal-info p');
$nShare.contents().each((i, e) => {
if (e.nodeType === 3) {
if (profileDict[e.nodeValue.trim()]) e.nodeValue = profileDict[e.nodeValue.trim()];
}
});
// 活动状态
const $cmpSt = $('.profile-container.competition-wrap span')
$cmpSt.text(profileDict[$cmpSt.text().trim()] || $cmpSt.text());
sendCashTrans('.content-wrapper');
};
profileTrans();
profileOB.observe($wrapper, {
characterData: true,
attributes: true,
subtree: true,
childList: true
});
return;
}
// 报纸
if (href.contains(/(newspaper|joblist|freebies|newspaper_class|personals|bounties|comics)\.php/)) {
let newspaperTrans = 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_label = document.querySelector('span.date-label');
const date_reg = /^[FMSTW][adehinorstuy]+, [ADFJMNOS][abceglnoprtuvy]+ [1-3]?[0-9], 20[0-9][0-9]$/;
if ($date_label && $date_label.innerText.trim().contains(date_reg)) {
const date_format = $date_label.innerText.trim().replaceAll(',', '');
const date_spl = date_format.split(' ');
const date = { w: date_spl[0], m: date_spl[1], d: date_spl[2], y: date_spl[3] };
const month_trans = {
'Jan': 1,
'Feb': 2,
'Mar': 3,
'Apr': 4,
'May': 5,
'Jun': 6,
'Jul': 7,
'Aug': 8,
'Sep': 9,
'Oct': 10,
'Nov': 11,
'Dec': 12
};
$date_label.innerText = `${ date.y }${ month_trans[date.m] || date.m }${ date.d }`;
}
// 菜单下的信息 工作 壁纸 广告 悬赏
$('div.help-message').find('*').contents().each((i, e) => {
if (!e.nodeValue || e.nodeValue.trim() === '') return;
if (newspaperDict[e.nodeValue.trim()])
e.nodeValue = newspaperDict[e.nodeValue.trim()];
else if (newspaperDict[e.nodeValue.trim().slice(0, 50)])
e.nodeValue = newspaperDict[e.nodeValue.trim().slice(0, 50)];
});
// 右边栏
$('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()];
})
$('.bounties-list-title li').each((i, e) => {
if (newspaperDict[$(e).text().trim()]) {
$(e).text(newspaperDict[$(e).text().trim()]);
}
});
// 交友
if (window.location.href.contains(/personals/)) {
$('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 (window.location.href.contains(/freebies/)) {
if (newspaperDict[$('div.bonus-wrap a').text().trim()])
$('div.bonus-wrap a').text(newspaperDict[$('div.bonus-wrap a').text().trim()]);
}
// 悬赏
if (window.location.href.contains(/bounties/)) {
// 列表前的总数
const $total = $('.bounties-total');
if ($total.text().contains(/A total of [0-9]+ listings were found/)) {
const num = $total.text().trim().split(' ')[3];
if (newspaperDict['A total of {$} listings were found.']) {
$total.text(newspaperDict['A total of {$} listings were found.']
.replace('{$}', num));
}
}
// 列表
$('.user-info-wrap div *').contents().each((i, e) => {
if (e.nodeType === 3) {
if (newspaperDict[e.nodeValue.trim()]) {
e.nodeValue = newspaperDict[e.nodeValue.trim()];
}
}
});
// claim
$('ul.bounties-list div.claim button').each((i, e) => {
if (newspaperDict[$(e).text().trim()]) {
$(e).text(newspaperDict[$(e).text().trim()]);
}
});
$('ul.bounties-list div.claim a').each((i, e) => {
if (newspaperDict[$(e).text().trim()]) {
$(e).text(newspaperDict[$(e).text().trim()]);
}
});
// 3选项框
$('.add-bounties-wrap .name').contents().each((i, e) => {
if (e.nodeType === 3) {
if (newspaperDict[e.nodeValue.trim()]) {
e.nodeValue = newspaperDict[e.nodeValue.trim()];
}
} else if (e.nodeType === 1) {
if (newspaperDict[$(e).text().trim()]) {
$(e).text(newspaperDict[$(e).text().trim()]);
}
}
});
// 匿名选项
const $anony = $('.choice-container label');
if (newspaperDict[$anony.text().trim()]) {
$anony.text(newspaperDict[$anony.text().trim()]);
}
// 发钱按钮
const $$symbol = $('span.input-money-symbol');
if (sendCashDict[$$symbol.attr('title')]) {
$$symbol.attr('title', sendCashDict[$$symbol.attr('title')])
}
// 10/10滑动
const $slider_title = $('.slider-title');
if ($slider_title.text().contains(/Quantity:/)) {
$slider_title.text($slider_title.text().replace('Quantity', '数量'));
}
// 价钱信息
$('.confirm-bounties *').contents().each((i, e) => {
if (e.nodeType === 3) {
if (newspaperDict[e.nodeValue.trim()]) {
e.nodeValue = newspaperDict[e.nodeValue.trim()];
}
}
});
// 下单前确认对话
$('.confirm-buttons *').contents().each((i, e) => {
if (e.nodeType === 3) {
if (newspaperDict[e.nodeValue.trim()]) {
e.nodeValue = newspaperDict[e.nodeValue.trim()];
return;
}
switch (i) {
case 7:
case 10: {
if (e.nodeValue.contains(/[0-9] bounties/)) {
e.nodeValue = e.nodeValue.replace('bounties', '次')
} else if (e.nodeValue.contains(/with the reason: .+\?/)) {
e.nodeValue = e.nodeValue.replace('with the reason', '吗,悬赏原因')
}
break;
}
}
}
});
// place
const $place = $('.place-buttons input');
if (newspaperDict[$place.attr('value')]) {
$place.attr('value', newspaperDict[$place.attr('value')]);
}
// cancel
const $cancel = $('.place-buttons a.cancel');
if (newspaperDict[$cancel.text().trim()]) {
$cancel.text(newspaperDict[$cancel.text().trim()]);
}
}
}
const newspaperOB = new MutationObserver(() => {
newspaperOB.disconnect();
newspaperTrans();
newspaperOB.observe($('div.content-wrapper')[0], { childList: true, subtree: true });
});
newspaperTrans();
newspaperOB.observe($('div.content-wrapper')[0], { childList: true, subtree: true });
return;
}
// npc买房 estateagents
if (href.includes('estateagents.php')) {
titleTrans();
contentTitleLinksTrans();
$('div.estate-info div.title').each((i, e) => {
if (propertyDict[e.firstChild.nodeValue])
e.firstChild.nodeValue = propertyDict[e.firstChild.nodeValue];
});
return;
}
// properties房屋页面
if (href.includes('properties.php')) {
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) {
/**
* <span class="bold">
<span class="title-laptop">On </span>
"Market"
<span class="title-desktop"> Price</span>
":"
</span>
*/
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;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 (href.includes('events.php')) {
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 (href.includes('awards.php')) {
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(' <i>')[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;
}
// preferences设置
if (href.contains(/preferences\.php/)) {
const $$ = $('.content-wrapper');
const OB = new MutationObserver(() => {
OB.disconnect();
titleTrans();
contentTitleLinksTrans();
trans();
OB.observe($$.get(0), {
characterData: true,
attributes: true,
subtree: true,
childList: true
});
});
const trans = () => {
// 黑框标题
const $black_title = $('.title-black');
if (tornSettingsDict[$black_title.text().trim()]) {
$black_title.text(tornSettingsDict[$black_title.text().trim()]);
}
// 电脑版左边导航菜单
const $nav = $('.content-wrapper a.ui-tabs-anchor');
$nav.each((i, e) => {
if (tornSettingsDict[$(e).text().trim()]) {
$(e).text(tornSettingsDict[$(e).text().trim()]);
}
});
if (window.location.href.contains(/tab=api/)) {
// 描述
const $api_desc = $('.content-wrapper p[class^="apiDescription___"]');
if (tornSettingsDict[$api_desc.text().slice(0, 50)]) {
$api_desc.text(tornSettingsDict[$api_desc.text().slice(0, 50)]);
}
// 添加按钮
const $add_btn = $('button[class^="addKey___"] span');
if (tornSettingsDict[$add_btn.text().trim()]) {
$add_btn.text(tornSettingsDict[$add_btn.text().trim()]);
}
// new keys name
const $new_keys_name = $('input[placeholder="New key\'s name"]');
if (tornSettingsDict[$new_keys_name.attr('placeholder')]) {
$new_keys_name.attr('placeholder', tornSettingsDict[$new_keys_name.attr('placeholder')]);
}
// api类型
const $key_type = $('div[class*="typesDropdown___"] button.down');
if (tornSettingsDict[$key_type.text().trim()]) {
$key_type.text(tornSettingsDict[$key_type.text().trim()]);
}
// api类型选择框
const $type_down = $('div[class*="typesDropdown___"] div.down li');
$type_down.each((i, e) => {
if (tornSettingsDict[$(e).text().trim()]) {
$(e).text(tornSettingsDict[$(e).text().trim()]);
}
});
// return;
}
};
trans();
OB.observe($$.get(0), {
characterData: true,
attributes: true,
subtree: true,
childList: true
});
return;
}
// 展柜
if (href.contains(/displaycase\.php/)) {
const $page_wrapper = document.querySelector('#display-page-wrap');
initOB($page_wrapper, {
subtree: true,
attributes: true,
childList: true
},
() => {
// 标题和右边的链接
titleTrans();
// 右上角返回按钮
const $back_to_profile = $page_wrapper.querySelector('#back');
if ($back_to_profile) {
const spl = $back_to_profile.innerText.split(/('s |s' )/);
if (spl.length === 3 && spl[2] === 'Profile') {
$back_to_profile.innerText = `${ spl[0] }的个人资料`;
}
}
const $display_cabinet = $page_wrapper.querySelector('.display-cabinet');
if ($display_cabinet) {
// 物品名
const $item_name = $display_cabinet.querySelectorAll('div.b-item-name span:nth-of-type(2)');
$item_name.forEach((e) => {
if (itemNameDict[e.innerText]) {
e.innerText = itemNameDict[e.innerText];
}
});
// 展开详细框
const $show_item_info = $display_cabinet.querySelector('.show-item-info') as HTMLElement;
showItemInfoTrans($show_item_info);
}
});
return;
}
// 升级页面
if (href.includes('level2.php')) {
}
// 医院页面
if (href.includes("hospitalview.php")) {
let hospTrans = function hospTrans() {
titleTrans();
contentTitleLinksTrans();
// 顶部提示信息
$('div[class^="msg right-round"]').contents().each((i, e) => (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;
}
}
})
}
let hosOBInit = function hosOBInit() {
hospitalOB.disconnect();
hospTrans();
hospitalOB.observe($('div.content-wrapper')[0], { childList: true, subtree: true });
}
const hospitalOB = new MutationObserver(hosOBInit);
hospTrans();
hospitalOB.observe($('div.content-wrapper')[0], { childList: true, subtree: true });
return;
}
// 帮派页面
if (href.includes("actions.php")) {
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": "有人暴打了 "
}
let factionTrans = 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) {
log.info($(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) => {
log.info($(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()]);
// }
// })
}
let factionOBInit = function factionOBInit() {
factionOB.disconnect();
factionTrans();
factionOB.observe($('div.content-wrapper')[0], { childList: true, subtree: true });
}
const factionOB = new MutationObserver(factionOBInit);
factionTrans();
factionOB.observe($('div.content-wrapper')[0], { childList: true, subtree: true });
return;
}
// pc电脑
if (href.contains(/pc\.php/)) {
const $$ = $('.content-wrapper');
const OB = new MutationObserver(() => {
OB.disconnect();
titleTrans();
contentTitleLinksTrans();
trans();
OB.observe($$.get(0), {
characterData: true,
attributes: true,
subtree: true,
childList: true
});
});
const trans = () => {
// 黑框
const $black_title = $('div.title-black');
if (pcDict[$black_title.text().trim()]) {
$black_title.text(pcDict[$black_title.text().trim()]);
}
};
trans();
OB.observe($$.get(0), {
characterData: true,
attributes: true,
subtree: true,
childList: true
});
return;
}
// 日历
if (href.contains(/calendar\.php/)) {
const $root = document.querySelectorAll('#calendar-root');
$root.forEach(el => {
initOB(el, { childList: true, subtree: true }, () => {
// 页标题
const $h4_title = el.querySelectorAll('h4[class^="title___"]');
titleTransReact($h4_title);
// 页标题右侧链接
const $link_title = el.querySelectorAll('div[class^="linksContainer___"] span[class^="linkTitle___"]');
contentTitleLinksTransReact($link_title);
// 月标题
const $month_title = el.querySelectorAll('div[class^="monthName___"]');
$month_title.forEach(e => {
if (calDict[e.innerText.trim()]) e.innerText = calDict[e.innerText.trim()];
});
});
});
return;
}
// itemuseparcel.php
// 圣诞小镇
if (href.contains(/christmas_town\.php/)) {
let $root = document.querySelector('#christmastownroot');
const $title_wrapper = $root.querySelector('div[class^="appHeaderWrapper___"]');
// 标题和右边的链接
initOB($title_wrapper, { childList: true, subtree: true }, () => {
titleTransReact();
contentTitleLinksTransReact();
});
}
}