您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A script that translates common text on Hpoi - anime figures database
// ==UserScript== // @name Hpoi fan translation // @namespace https://takkkane.tumblr.com/scripts/hpoiTranslation // @supportURL https://twitter.com/TaxDelusion // @description A script that translates common text on Hpoi - anime figures database // @version 0.4.3 // @include https://www.hpoi.net/* // @include https://www.hpoi.net.cn/* // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/locale/zh-cn.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/expect/1.10.0/expect.min.js // @license MIT // @grant none // ==/UserScript== (function () { /* Expect library by mjackson https://github.com/mjackson/expect */ /* worthy examples: * working with hpoi: https://github.com/ntzyz/hpoi-info-tgbot/blob/master/src/entry.ts * tricky html items: https://greasyfork.org/en/scripts/384708-bilibili-danmaku-translator/code */ /* ==== RESOURCES ===== */ const TRANSLATIONS = { // 'dictionary' : { // 'word' : 'translation', } en: { 'profile_stats': { '关注': 'followed', '粉丝': 'followers', '赞!': 'likes', '获赞 ': 'likes',/* additional space for GK makers in home page*/ '获赞': 'likes' }, 'profile_desc': { '还没有信仰_(:з」∠)_': 'not much to say _(:з」∠)_', }, /* HOME PAGE - FEEDS */ 'home_username_info_type': { '制作决定': 'New item announced', '官图更新': 'Official pictures update', '预订时间': 'Preorders opened', '预定时间': 'Preorders opened', '出荷延期': 'Release postponed', '出荷时间': 'Release time', '再版确定': 'Re-release confirmed', '情报更新': 'Info updated', }, 'home_image_type_name': { '手办': 'Figure', '动漫模型': 'A. model', '真实模型': 'R. model', '毛绒布偶': 'Plushie', 'Doll娃娃': 'Doll', '相册': 'Album', '厂商': 'Manufacturer', '系列': 'Line', '作品': 'Series', '角色': 'Character', }, /* ITEM PAGE */ 'more_button': { '更多': 'more', '换一换': 'refresh', '新建相册': 'new album', '写简评': 'new review', '添加': 'add' }, 'load_more_button': { '加载更多': 'Load more', }, 'search-searchbox': { /*在结果中查找*/ 'placeholder': 'Search within the results' }, // types (filter) 'x_generic_all': { '全部': 'all', '不限': 'all', // actualy - non required '周边': 'all', }, 'x_generic_all_capitalized': { '全部': 'All', '不限': 'All', // actualy - non required '周边': 'All', }, '其它': 'other', /* SORTED DIC */ 'x_item_types': { '手办': 'Figure', '动漫模型': 'Anime model', '真实模型': 'Real model', '毛绒布偶': 'Plushie', 'Doll娃娃': 'Doll', '动漫周边': 'Merch', '其它': 'Other', }, 'x_item_types_plural': { '手办': 'Figures', '动漫模型': 'Anime models', '真实模型': 'Real models', '毛绒布偶': 'Plushies', 'Doll娃娃': 'Dolls', 'doll娃娃': 'Dolls', 'GK/DIY模型': 'Garage kits/models', 'GK/其他': 'Garage kits/other' }, 'x_subtypes_figures': { '比例人形': 'Scale figure', 'Q版人形': 'Chibi figure', '盒蛋/扭蛋': 'Blind box/gacha', '怪兽/机械': 'Monster/mecha', '仿真人物': 'Real person', '配件': 'Accessory', '场景': 'Diorama', '其它': 'Other', }, 'x_subtypes_anime_models': { '机甲-拼装': 'Mecha - to assembly', '机甲-完成品': 'Mecha - completed', '机甲-配件': 'Mecha - accessory', '特摄英雄': 'Tokusatsu hero', '特摄怪兽': 'Tokusatsu monster', '特摄配件': 'Tokusatsu accessory', '扭蛋/玩具': 'Gacha/toy', '驱动模型-四驱车': 'Vehicle (4 wheels)', '驱动模型-配件': 'Vehicle accessory', '其它': 'Other', }, 'x_subtypes_real_models': { '拼装': 'To assembly', '完成品': 'Completed', '人形': 'Person', '场景配件': 'Diorama accessory', '工具材料': 'Tool', }, 'x_subtypes_plushies': { '拟人形': 'Anthropomorphic', '人形': 'Human', '动植物': 'Flora and fauna', }, 'x_subtypes_dolls': { 'Doll完成品': 'Complete doll', }, 'x_subtypes_merch': { '立牌/摆件': 'Character stand', '箱包鞋服': 'Bags and shoes', '穿戴配饰': 'Clothes', '徽章/挂件': 'Badges / keychains', '海报/装饰画': 'Artworks', '抱枕/家纺': 'Daily use / stationery', '日用/文具': 'Linens', '数码/配件': 'Digital / accesories', '拼图纸膜': 'Papercraft', '其它周边': 'Other merch', }, 'x_other': { '其它': 'Other', '其他': 'Other', }, 'x_series_types': { '动画': 'Anime', '小说': 'Novel', '游戏': 'Game', '其它': 'Other', }, } }; const PLACES = { /* OTHER */ 'logged_in_indicator': '.hpoi-navpersonal', 'profile_stats': '.user-box-content > .row > div', 'profile_desc': '.user-box-content-detail > small', /* HOME ITEM PAGE */ 'home_item_props': 'div.hpoi-database-content > div > div.hpoi-dataBase-item > div > div.hpoi-database-text > div > span:nth-of-type(1)', /* OTHER */ 'more_button': '.hpoi-btn-border > span', 'search-searchbox': '#realPage-keyword', }; /* ==== TRANSLATE ===== */ /* * itemInQuestion - name of the jsquery selector/dictionary * subDictionaries - list of disctionaries, used in dic_first method only * methodType - 'item_first' - replace the exact string appearing in itemInQuestion results - 'dic_first' - check all keys listed in subDictionaries and replace them with translations stored in values * elementsInQuestion - optional if you'd like to use */ const doTranslation = function (itemInQuestion, subDictionaries = [], methodType = 'item_first', elementsInQuestion) { if (subDictionaries.length) { methodType = 'dic_first'; } let items; if (!elementsInQuestion) items = $(PLACES[itemInQuestion]); else items = elementsInQuestion; let textItems = items.contents().filter(function () { return this.nodeType === Node.TEXT_NODE; }); textItems.each(function (i, e) { if (methodType == 'item_first') { let bad = e.textContent.trim(); let translation = TRANSLATIONS.en[itemInQuestion][bad]; if (translation) { e.textContent = translation; } } else if (methodType == 'dic_first') { let translationDone = 0; e.textContent = e.textContent.trim(); let toTranslate = e.textContent; for (const subDictionary of subDictionaries) { for (const subDictionaryEntry of Object.entries(TRANSLATIONS.en[subDictionary])) { /*[0] key [1] value*/ e.textContent = toTranslate.replace(subDictionaryEntry[0], subDictionaryEntry[1]); if (e.textContent != toTranslate) { translationDone = 1; break; } } if (translationDone) { break; } } } }); }; const doDateFormat = function (dateCn) { let date, dateEn; if (dateCn.indexOf('日') != -1 && dateCn.indexOf('月') != -1 && dateCn.indexOf('年') != -1) { date = moment(dateCn, "YYYY年MM月DD日"); dateEn = date.format("DD/MM/YYYY"); } else if (dateCn.indexOf('日') == -1 && dateCn.indexOf('月') != -1 && dateCn.indexOf('年') != -1) { date = moment(dateCn, "YYYY年MM月"); dateEn = date.format("MM/YYYY"); } else if (dateCn.indexOf('日') == -1 && dateCn.indexOf('月') == -1 && dateCn.indexOf('年') != -1) { date = moment(dateCn, "YYYY年"); dateEn = date.format("YYYY"); } else if (dateCn.indexOf('日') != -1 && dateCn.indexOf('月') != -1 && dateCn.indexOf('年') == -1) { date = moment(dateCn, "MM月DD日"); dateEn = date.format("DD/MM/20[XX]"); } return dateEn; }; const translateFixedDate = function (cnDateElements) { cnDateElements.each(function (i, e) { let bad = e.textContent.trim(); if (bad == '未知') { e.textContent = 'Unknown'; } else { e.textContent = (doDateFormat(bad)); } }); }; const translateRelativeDate = function (datesTextesReleaseDate) { datesTextesReleaseDate.each(function (i, e) { let bad = e.textContent.trim(); let good = bad; if (bad == "刚刚") good = "just now"; else if (bad == "1分钟前") good = "a minute ago"; else if (bad.includes('分钟前')) good = bad.replace("分钟前", " minutes ago"); else if (bad == "1小时前") good = "an hour ago"; else if (bad.includes('小时前')) good = bad.replace("小时前", " hours ago"); else if (bad == "1天前") good = "a day ago"; else if (bad.includes('天前')) good = bad.replace("天前", " days ago"); else if (bad == "1个月前") good = "a month ago"; else if (bad.includes('个月前')) good = bad.replace("个月前", " months ago"); else if (bad == "1年前") good = "a year ago"; else if (bad.includes('年前')) good = bad.replace("年前", " years ago"); else console.log("unresolved relative date [" + bad + "]"); e.textContent = good; }); }; /* ==== TESTS ===== */ const testTranslationMap = function (submapToCheck) { expect(PLACES[submapToCheck]).toExist("jquery for [" + submapToCheck + "] should exists."); expect($(PLACES[submapToCheck])).toExist("items found via jquery for [" + submapToCheck + "] should exist."); $(PLACES[submapToCheck]).each(function (i, e) { expect(Object.values(TRANSLATIONS.en[submapToCheck]).find(translation => translation.includes(e.textContent.trim()))) .toBeTruthy("No translation provided for [" + e.textContent + "] in [" + submapToCheck + "] map!"); }); }; const testTranslationMapForDic = function (placeToCheck, dictionaries) { expect(PLACES[placeToCheck]).toExist("jquery for [" + placeToCheck + "] should exists."); expect($(PLACES[placeToCheck])).toExist("items found via jquery for [" + placeToCheck + "] should exist."); $(PLACES[placeToCheck]).each(function (i, e) { let translationIsDone = 0; let translatedText = e.textContent.trim(); if (translatedText.length == 0) { return; /*continue*/ } for (const subDictionary of dictionaries) { let subDictionaryEntries = []; if ($.type(subDictionary) === "string") { subDictionaryEntries = Object.entries(TRANSLATIONS.en[subDictionary]); } else { subDictionaryEntries = subDictionary; } for (const subDictionaryEntry of subDictionaryEntries) { /*[0] key [1] value*/ translationIsDone = translatedText.includes(subDictionaryEntry[1]); if (translationIsDone) { break; } } if (translationIsDone) { break; } } expect(translationIsDone).toBeTruthy( "No translation provided for [" + translatedText + "] in [" + dictionaries.join() + "] maps!"); }); }; /* SECTIONS */ const section = { translations: {}, places: {}, doTranslation(itemInQuestion, subDictionaries = [], elementsInQuestion) { const me = this; let items; if (!elementsInQuestion) items = $(this.places[itemInQuestion]); else items = elementsInQuestion; let mainFunction = function (i, e) { if (!subDictionaries.length) { e.textContent = e.textContent.trim(); const bad = e.textContent; let translation = me.translations.en[itemInQuestion][bad]; if (translation) { e.textContent = translation; } } else { let translationDone = 0; e.textContent = e.textContent.trim(); let toTranslate = e.textContent; for (const subDictionaryName of subDictionaries) { let subDictionary; if (typeof(subDictionaryName) === 'string') { subDictionary = me.translations.en[subDictionaryName]; } else { subDictionary = subDictionaryName; } for (const subDictionaryEntry of Object.entries(subDictionary)) { /*[0] key [1] value*/ e.textContent = toTranslate.replace(subDictionaryEntry[0], subDictionaryEntry[1]); if (e.textContent != toTranslate) { translationDone = 1; break; } } if (translationDone) { break; } } } }; if (!!(items.contents) == true) { var textItems = items.contents().filter(function () { return this.nodeType === Node.TEXT_NODE; }); textItems.each(mainFunction); } else if (Array.isArray(items)) { $.each(items, mainFunction); } }, createAndUseObserverForList(callback, place) { callback(); let Observer = new MutationObserver(callback); Observer.observe(place, {childList: true}); }, testTranslationMap(submapToCheck) { const me = this; expect(me.places[submapToCheck]).toExist("jquery for [" + submapToCheck + "] should exists."); expect($(me.places[submapToCheck])).toExist("items found via jquery for [" + submapToCheck + "] should exist."); $(me.places[submapToCheck]).each(function (i, e) { expect(Object.values(me.translations.en[submapToCheck]).find(translation => translation.includes(e.textContent.trim()))) .toBeTruthy("No translation provided for [" + e.textContent + "] in [" + submapToCheck + "] map!"); }); }, testTranslationMapForDic(placeToCheck, dictionaries) { const me = this; expect(me.places[placeToCheck]).toExist("jquery for [" + placeToCheck + "] should exists."); expect($(me.places[placeToCheck])).toExist("items found via jquery for [" + placeToCheck + "] should exist."); $(me.places[placeToCheck]).each(function (i, e) { let translationIsDone = 0; let translatedText = e.textContent.trim(); if (translatedText.length == 0) { return; /*continue*/ } for (const subDictionaryName of dictionaries) { let subDictionary; if (typeof(subDictionaryName) === 'string') { subDictionary = me.translations.en[subDictionaryName]; } else { subDictionary = subDictionaryName; } for (const subDictionaryEntry of Object.entries(subDictionary)) { /*[0] key [1] value*/ translationIsDone = translatedText.includes(subDictionaryEntry[1]); if (translationIsDone) { break; } } if (translationIsDone) { break; } } expect(translationIsDone).toBeTruthy( "No translation provided for [" + translatedText + "] in [" + dictionaries.join() + "] maps!"); }); }, }; let glyph_tile_old_section = Object.create(section); let glyph_tile_section = Object.create(section); let nav_top_section = Object.create(section); let home_user_section = Object.create(section); let home_item_section = Object.create(section); let login_form_section = Object.create(section); let settings_section = Object.create(section); let global_search_section = Object.create(section); let encyclopedia_section = Object.create(section); let item_section = Object.create(section); let search_section = Object.create(section); /* new type tile for items */ glyph_tile_old_section.translations = { en: { 'tile_properties': { '厂商': 'Man', // manufacturer '出荷': 'Rele.', // Release date '新增': 'Add.', // Addition date '价格': 'Price', // Price '愿望': 'Wish', // Wished by x people '浏览': 'Hits', // how many views '评分': 'Rate', // overal rate //collection only '途径': 'Way', // channel? shop? shipment? '补款': 'Due', // how many money yet to paid // line only '名称': 'Name', '作品': 'Count', '更新': 'Upd.', }, }, }; glyph_tile_old_section.places = { 'tile_properties': '.hpoi-database-text > div > span:nth-child(1)', 'tile_values' : '.hpoi-database-text > div > span:nth-child(2)', }; glyph_tile_old_section.translate = function () { const me = this; me.doTranslation('tile_properties'); // translate release dates let tilePropertiesDic = me.translations.en['tile_properties']; let cnDateTextElementsToTranslate = [tilePropertiesDic['出荷'], tilePropertiesDic['新增'], tilePropertiesDic['更新']]; let cnTileValues = $(me.places['tile_values']); let cnDateTextElements = cnTileValues.filter(function () { let previousSiblingText = this.previousElementSibling.innerHTML; if (cnDateTextElementsToTranslate.includes(previousSiblingText)) { return true; } }); translateFixedDate(cnDateTextElements); }; glyph_tile_old_section.testTranslation = function () { this.testTranslationMap('tile_properties'); }; /* new type tile for items */ glyph_tile_section.translations = { en: { 'tile_properties': { '厂商:': 'Man.: ', // manufacturer '出荷:': 'Released: ', // Release date '新增:': 'Added: ', // Addition date '价格:': 'Price: ', // Price '愿望:': 'Wish: ', // Wished by x people '浏览:': 'Hits: ', // how many views '评分:': 'Rate: ', // overal rate //collection only '途径:': 'Way: ', // channel? shop? shipment? '补款:': 'Due: ', // how many money yet to paid // line only '名称:': 'Name: ', '作品:': 'Count: ', '更新:': 'Updated: ', }, }, }; glyph_tile_section.places = { 'tile_properties': 'ul.hpoi-glyphicons-list > li > .hpoi-detail-grid-right > .hpoi-detail-grid-info > span > em', }; glyph_tile_section.translate = function () { this.doTranslation('tile_properties'); // translate release dates let cnDateTextElementsToTranslate = [this.translations.en['tile_properties']['出荷:'], this.translations.en['tile_properties']['新增:'], this.translations.en['tile_properties']['更新:']]; let cnDateRows = $('.hpoi-detail-grid-info > span'); let cnDateTextElements = cnDateRows.contents().filter(function () { if (this.nodeType === Node.TEXT_NODE) { let previousSiblingText = this.previousElementSibling.innerHTML; if (cnDateTextElementsToTranslate.includes(previousSiblingText)) { return true; } } }); translateFixedDate(cnDateTextElements); }; glyph_tile_section.testTranslation = function () { this.testTranslationMap('tile_properties'); }; nav_top_section.translations = { en: { 'nav_top_left_menu': { 'GK/DIY': 'GK/DIY', }, 'nav_top_left_submenu': { '分区首页': 'Home', '资料库': 'Database', '相册': 'Albums', '最新发售': 'Latest releases', '最新入库': 'Newly added', '好评': 'Best rated', '再版愿望': 'Most wished', '我的收藏': 'My collection', '上报缺失': 'Report missing info', /* DIY only */ '原创作品': 'Made from scratch', '灰模上色': 'Painted', '改造': 'Customs', '翻新修复': 'Repairs', '发布': 'Publish' }, 'nav_top_right_menu': { '讨论板': 'Forum', '360°照片': '360° pics', '厂商': 'Makers', '小黑屋': 'Reports', '商城': 'Mall', '消息': 'Notifications', '登录': 'Login', }, 'nav_top_right_get_app': { '下载客户端': 'Apps', }, 'nav_top_get_app_submenu': { '点击下载APP': 'Download the app', '扫码关注公众号': 'Scan to follow WeChat account', '扫码加入Q群:884038717': 'Scan to join WeChat group', }, 'nav_top_right_submenu': { '厂商首页': 'Home', '我的收藏': 'My collection', '上报缺失': 'Report missing info', '商品上新': 'Recent sales', '二手专区': 'Preowned', '淘宝自营店': 'Taobao own shop', '淘宝天狗店': 'Taobao Tengu shop', '淘宝周边店': 'Taobao other shop', '淘宝一番赏': 'Taobao rewards' }, 'nav_top_personal': { '个人中心': 'Profile', '我的收藏': 'My collection', '返现申请': 'Cashback', '好友': 'Friends', '消息': 'Messages', '私信': 'Messages', '账号设置': 'Settings', '退出': 'Logout', }, 'nav_top_search_drop_list': { '全部周边': 'All', '角色': 'Character', '作品': 'Series', '系列': 'Line', '人物': 'Person', '厂商': 'Company', '用户': 'User', }, 'nav_top_search_drop_list_default': { '全部周边': 'All', }, 'nav_top_register_bubble_text': { '登录后你可以:': 'With an account, you\'re able to:', '免费看高清大图': 'view high quality photos', '发表简评/评论': 'post comments and reviews', '多端同步收藏': 'manage your collection', '周边情报看不停': 'keep track of new merch', }, 'nav_top_register_bubble_button': { '登录': 'Sign in', }, 'nav_top_register_bubble_first_time': { '首次使用?': 'First time? ', }, 'nav_top_register_bubble_register': { '点击注册': 'Sign up', }, 'nav_top_notifications': { '系统消息': 'System info', '回复我的': 'New replies', '收到的赞': 'Likes received', '官方推送': 'Official', '关注消息': 'Followed info', '商品信息': 'Shopping related', '私信': 'Messages', }, 'nav_top_notification_settings': { '设置': 'Settings', }, 'nav_top_notification_read': { '全部标记已读': 'Mark as read', } }, }; nav_top_section.places = { 'nav_top_left_menu': '.hpoi-nav-tabbox > .nav-conters-left > li > a', 'nav_top_left_submenu': '.hpoi-nav-tabbox > .nav-conters-left > li > .hpoi-garagekit-box > li > a', 'nav_top_right_menu': '.hpoi-nav-tabbox > .nav-conters-right > li > a:not(.icon-Mobile-phone)', 'nav_top_right_get_app': 'nav.nav-conters > div.hpoi-nav-tabbox > ul.nav-conters-right > li > .icon-Mobile-phone span', 'nav_top_right_get_app_submenu': 'nav.nav-conters > div.hpoi-nav-tabbox > ul.nav-conters-right > li > ul.hpoi-Downloadclient > li > a > div', 'nav_top_right_submenu': '.hpoi-nav-tabbox > .nav-conters-right > li > .hpoi-garagekit-box > li > a', 'nav_top_personal': 'ul.hpoi-navpersonal > li > a', 'nav_top_search_drop_list': '.nav-conters-right .dropdown-menu > li > a', 'nav_top_search_drop_list_default': '#searchItemTypeText', 'nav_top_register_bubble_text': '.hpoi-nav-user-login > p, .hpoi-nav-user-login > .content > div', 'nav_top_register_bubble_button': '.nav-login-btn', 'nav_top_register_bubble_first_time': '.nav-register-box', 'nav_top_register_bubble_register': '.nav-register-box > a', 'nav_top_narrow_screen_menu': '.nav-conters-s > .hpoi-nav-boxs > .nav-boxs-item > a:not(.hpoi-icon-phonebox)', 'nav_top_narrow_screen_get_app': '.nav-conters-s > .hpoi-nav-boxs > .nav-boxs-item > a.hpoi-icon-phonebox > span', 'nav_top_narrow_screen_get_app_submenu': '.nav-conters-s > .hpoi-nav-boxs > .nav-boxs-item > a.hpoi-icon-phonebox + ul > li > a > div', 'nav_top_narrow_screen_submenu': '.nav-conters-s > .hpoi-nav-boxs > .nav-boxs-item > a:not(.hpoi-icon-phonebox) + ul > li > a', 'nav_top_notifications': '.hpoi-news-box > li > a', 'nav_top_notification_settings': '.hpoi-news-box > li > div > a', 'nav_top_notification_read': '#msgHaveRead', }; nav_top_section.translate = function () { this.doTranslation('nav_top_left_menu', [TRANSLATIONS.en['x_item_types_plural'], 'nav_top_left_menu']); this.doTranslation('nav_top_left_submenu'); $('.hpoi-garagekit-box').css('width', '178px'); this.doTranslation('nav_top_right_menu'); this.doTranslation('nav_top_right_get_app'); this.doTranslation('nav_top_right_get_app_submenu', ['nav_top_get_app_submenu']); this.doTranslation("nav_top_right_submenu"); this.doTranslation("nav_top_personal"); this.doTranslation('nav_top_search_drop_list', ['nav_top_search_drop_list', TRANSLATIONS.en['x_item_types']]); this.doTranslation('nav_top_search_drop_list_default'); this.doTranslation('nav_top_register_bubble_text'); this.doTranslation('nav_top_register_bubble_button'); this.doTranslation('nav_top_register_bubble_first_time'); this.doTranslation('nav_top_register_bubble_register'); this.doTranslation('nav_top_narrow_screen_menu', [TRANSLATIONS.en['x_item_types_plural'], 'nav_top_left_menu', 'nav_top_right_menu']); this.doTranslation('nav_top_narrow_screen_get_app', ['nav_top_right_get_app']); this.doTranslation('nav_top_narrow_screen_get_app_submenu', ['nav_top_get_app_submenu']); this.doTranslation('nav_top_narrow_screen_submenu', ['nav_top_personal', 'nav_top_left_submenu', 'nav_top_right_submenu']); this.doTranslation('nav_top_notifications'); this.doTranslation('nav_top_notification_settings'); this.doTranslation('nav_top_notification_read'); $(this.places['nav_top_notification_settings']).css('font-size', '13px'); $(this.places['nav_top_notification_read']).css('font-size', '13px'); }; nav_top_section.testTranslation = function () { this.testTranslationMapForDic("nav_top_left_menu", [TRANSLATIONS.en['x_item_types_plural'], 'nav_top_left_menu']); this.testTranslationMap("nav_top_left_submenu"); this.testTranslationMap("nav_top_right_menu"); this.testTranslationMap("nav_top_right_get_app"); this.testTranslationMapForDic('nav_top_right_get_app_submenu', ['nav_top_get_app_submenu']); this.testTranslationMap("nav_top_right_submenu"); this.testTranslationMap("nav_top_personal"); this.testTranslationMapForDic('nav_top_search_drop_list', ['nav_top_search_drop_list', TRANSLATIONS.en['x_item_types']]); this.testTranslationMap('nav_top_search_drop_list_default'); this.testTranslationMap('nav_top_register_bubble_text'); this.testTranslationMap('nav_top_register_bubble_button'); this.testTranslationMapForDic('nav_top_register_bubble_first_time', ['nav_top_register_bubble_first_time']); this.testTranslationMap('nav_top_register_bubble_register'); this.testTranslationMapForDic('nav_top_narrow_screen_menu', [TRANSLATIONS.en['x_item_types_plural'], 'nav_top_left_menu', 'nav_top_right_menu']); this.testTranslationMapForDic('nav_top_narrow_screen_get_app', ['nav_top_right_get_app']); this.testTranslationMapForDic('nav_top_narrow_screen_get_app_submenu', ['nav_top_get_app_submenu']); this.testTranslationMapForDic('nav_top_narrow_screen_submenu', ['nav_top_personal', 'nav_top_left_submenu', 'nav_top_right_submenu']); this.testTranslationMap('nav_top_notifications'); this.testTranslationMap('nav_top_notification_settings'); this.testTranslationMap('nav_top_notification_read'); }; home_user_section.translations = { en: { 'home_activity_type_filter': { '全部': 'All', '情报': 'Info', '相册': 'Albums', '用户': 'Users', '条目': 'Entries' }, 'home_activity_type_filter_action_type': { '发布相册': 'Add album', '分类订阅': 'Filter feed', '报错/报缺/催更': 'Report', '设置屏蔽动态': 'Block settings', }, 'home_activity_type_filter_info': { '全部': 'All', '制作': 'New items', '更图': 'New pics', '开订': 'Preorders', '延期': 'Delays', '出荷': 'Released', '再版': 'Re-releases', }, 'home_activity_type_filter_user': { '全部': 'All', '关注': 'Followed', }, 'home_activity_type_filter_entry': { '全部条目': 'All', '关注条目': 'Followed', }, 'home_activity_type_filter_by_header': { '包含分类:': 'Filter by category: ', '屏蔽动态:': 'Block action: ', '包含内容:': 'Filter by type: ' }, 'home_activity_type_filter_by_action': { '情报': 'Info', '评论': 'Comment', '图片上传': 'Uploaded pics', '出售': 'Sale', '收购': 'Hunt', /* actually it's buying*/ }, 'home_activity_type_filter_by_content': { '条目': 'Entries', '相册': 'Albums', '文章': 'Articles', '图片': 'Pictures' }, 'home_activity_type_filter_by_item_type_save': { '保存': 'Save', }, 'home_activity_card_action_type': { '传图': 'Uploaded pics', '评论': 'Comment', '出售': 'Sale', '收购': 'Hunt', /* actually it's buying*/ '情报': 'Info', }, 'home_side_header' : { '待补款': 'Waiting to pay', '商品推荐': 'Featured products', }, 'home_side_praise_header': { '获赞排行榜': 'Appreciation ranking' }, 'home_side_praise_periods': { '今日': 'Today', '一周': 'Week', '一月': 'Month', }, 'home_side_figures': { '周边期待榜': 'Most ordered', '近期发售': 'Released soon' }, 'home_side_reccomendations': { '热门推荐': 'Let\'s check', }, 'home-page-searchbox': { /* 请输入关键/条目ID/JAN码等 如: GSC 路人女主 */ 'placeholder': 'Please enter the keyword / entry ID / JAN code etc. like: POP UP PARADE', }, }, }; home_user_section.places = { 'home-page-searchbox': '.hpoi-search-text', 'profile_stats': '.user-box-content > .text-center > .row > div', 'profile_desc': '.user-box-content-detail > small', 'home_activity_type_filter': 'div.user-home div.action-type ul.action-type-nav > li > a', 'home_activity_type_filter_active': 'div.user-home div.action-type ul.action-type-nav > li > a.active', 'home_activity_type_filter_sub': 'div.user-home div.action-type ul.action-sub-nav > li > a', 'home_activity_type_filter_action_type': '.action-type-nav > li > div.hpoi-action-more > ul.hpoi-menu-box > li > a', 'home_activity_type_filter_by_header' : '#hpoi-classification-conter > #updSettingHobby > .hpoi-classification-up > span', 'home_activity_type_filter_by_category' : '#hpoi-classification-conter > #updSettingHobby > .hpoi-classification-up:nth-of-type(1) > div > label > span', 'home_activity_type_filter_by_action' : '#hpoi-classification-conter > #updSettingHobby > .hpoi-classification-up:nth-of-type(2) > div > label > span', 'home_activity_type_filter_by_content' : '#hpoi-classification-conter > #updSettingHobby > .hpoi-classification-up:nth-of-type(3) > div > label > span', 'home_activity_type_filter_by_item_type_save' : '#hpoi-classification-conter > div > button', 'home_activity_card_action_type': '.home-info .home-info-content span.type-action', 'home_activity_card_info_type': 'div.home-info > .row > .home-info-content div:not(.has-user) > .user-name', 'home_activity_card_type_name': '.home-info .type-name', 'home_side_header': '.home-left > div > .hpoi-box-title > .hpoi-title-left > span', 'home_side_praise_header': '.home-left > div.top-praise > .hpoi-home-praise-head > .hpoi-ranking-neon', 'home_side_praise_periods': '.home-left > div.top-praise > .hpoi-home-praise-head > .item-head-more > a', 'home_side_figures': '.home-right > .hpoi-home-box-rt > .hpoi-hobby-tabs > a', 'home_side_reccomendations': '.home-right > .hpoi-home-box-rt > .hpoi-box-title > .hpoi-title-left > span', }; home_user_section.isToTranslate = function () { const me = this; const PATHNAME = window.location.pathname; const loggedInIndicator = $(PLACES['logged_in_indicator']).length; if (['/', '/index', '/index/home', '/user/home'].includes(PATHNAME) && loggedInIndicator > 0) { return true; } return false; }; home_user_section.typeFilterToDicMap = { 'Info': 'home_activity_type_filter_info', 'Users': 'home_activity_type_filter_user', 'Entries': 'home_activity_type_filter_entry', }; home_user_section.translate = function () { const me = this; if (!me.isToTranslate()) { return; } var searchboxes = $(me.places['home-page-searchbox']); for (const searchbox of searchboxes) { searchbox.attributes['placeholder'].textContent = me.translations.en['home-page-searchbox']['placeholder']; } me.doTranslation('profile_stats', [TRANSLATIONS.en['profile_stats']]); me.doTranslation('profile_desc', [TRANSLATIONS.en['profile_desc']]); me.doTranslation('home_activity_type_filter'); me.doTranslation('home_activity_type_filter_action_type'); let activitySectionType = $(me.places['home_activity_type_filter_active'])[0].text; let typeFilterDic = me.typeFilterToDicMap[activitySectionType]; if (typeFilterDic != null) { me.doTranslation('home_activity_type_filter_sub', [typeFilterDic]); } me.doTranslation('home_activity_type_filter_by_header'); $(me.places['home_activity_type_filter_by_header']).css('font-size', '12px'); me.doTranslation('home_activity_type_filter_by_category', [TRANSLATIONS.en['x_item_types_plural']]); me.doTranslation('home_activity_type_filter_by_action'); me.doTranslation('home_activity_type_filter_by_content'); me.doTranslation('home_activity_type_filter_by_item_type_save'); var translateActivityCards = function() { me.doTranslation('home_activity_card_action_type'); $(PLACES['home_activity_card_action_type']).prev().css('width', ''); me.doTranslation('home_activity_card_info_type',[TRANSLATIONS.en['home_username_info_type']]); me.doTranslation('home_activity_card_type_name',[TRANSLATIONS.en['home_image_type_name']]); $('.home-box-comment > div > .has-user > .user-name > span:nth-child(1)').css('width', ''); $('.home-box-comment > div > .has-user > .user-sign > span:nth-child(1)').css('width', '70%'); let relativeTimes = $('span.type-time'); translateRelativeDate(relativeTimes); }; me.createAndUseObserverForList(translateActivityCards, $('.main-content')[0]); me.doTranslation('home_side_header'); var translatePraiseSection = function() { me.doTranslation('home_side_praise_header'); me.doTranslation('home_side_praise_periods'); } me.createAndUseObserverForList(translatePraiseSection, $('.top-praise')[0]); me.doTranslation('home_side_figures'); me.doTranslation('home_side_reccomendations'); }; home_user_section.testTranslation = function () { const me = this; if (!me.isToTranslate()) { return; } me.testTranslationMapForDic('profile_stats', [TRANSLATIONS.en['profile_stats']]); me.testTranslationMapForDic('profile_desc', [TRANSLATIONS.en['profile_desc']]); me.testTranslationMap('home_activity_type_filter'); me.testTranslationMap('home_activity_type_filter_action_type'); let activitySectionType = $(me.places['home_activity_type_filter_active'])[0].text; let typeFilterDic = me.typeFilterToDicMap[activitySectionType]; if (typeFilterDic != null) { me.testTranslationMapForDic('home_activity_type_filter_sub', [typeFilterDic]); } me.testTranslationMap('home_activity_type_filter_by_header'); me.testTranslationMapForDic('home_activity_type_filter_by_category', [TRANSLATIONS.en['x_item_types_plural']]); me.testTranslationMap('home_activity_type_filter_by_action'); me.testTranslationMap('home_activity_type_filter_by_content'); me.testTranslationMap('home_activity_type_filter_by_item_type_save'); me.testTranslationMap('home_activity_card_action_type'); me.testTranslationMapForDic('home_activity_card_info_type',[TRANSLATIONS.en['home_username_info_type']]); me.testTranslationMapForDic('home_activity_card_type_name',[TRANSLATIONS.en['home_image_type_name']]); me.testTranslationMap('home_side_header'); me.testTranslationMap('home_side_praise_header'); me.testTranslationMap('home_side_praise_periods'); me.testTranslationMap('home_side_figures'); me.testTranslationMap('home_side_reccomendations'); // TODO test for search placeholders }; home_item_section.translations = { 'en': { 'home-page-searchbox': { /* 请输入关键/条目ID/JAN码等 如: GSC 路人女主 */ 'placeholder': 'Please enter the keyword / entry ID / JAN code etc. like: POP UP PARADE', }, 'home_item_title_section': { '大家在看': 'Everyone\'s watching', '资料库': 'Database', '最新相册': 'Recent albums', '日亚捡漏': 'Amazon jp pick up', }, 'home_item_database_tabs': { '最新入库': 'Recently added', '热门预定': 'Most ordered', '热门出荷': 'Close release', }, 'home_item_popular_tabs': { '每日热门': 'Best today', '每周热门': 'Best this week', '好评top': 'Best', }, 'home_item_popular_hits': { '浏览': 'Hits', }, 'home_item_amazon_buy': { '捡!': 'Buy!', }, 'home_item_latest_information_title' : { '最新情报': 'Latest information', }, 'home_item_info_sub_filter': { '全部': 'All', '制作': 'New items', '更图': 'New pics', '开订': 'Preorders', '延期': 'Delays', '出荷': 'Released', '再版': 'Re-releases', }, 'home_item_info_action_type': { '情报': 'Info', }, 'home_item_info_type_long': { '制作决定': 'New item announced', '官图更新': 'Official pictures update', '预订时间': 'Preorders opened', '预定时间': 'Preorders opened', '出荷延期': 'Release postponed', '出荷时间': 'Release time', '再版确定': 'Re-release confirmed', '情报更新': 'Info updated', }, 'home_item_recommended_title': { '热门推荐': 'Let\'s check', } } }; home_item_section.places = { 'home-page-searchbox': '.hpoi-search-text', 'home_item_main_title_section': '.hpoi-loucen > .hpoi-box-title > .hpoi-title-left > span', 'home_item_main_gk_maker_stat': '.hpoi-fansFabulous > span', 'home_item_title_section': 'div.hpoi-box-title > .hpoi-title-left span', 'home_item_database_tabs': '#database-newAdd, #database-hotOrder, #database-release', 'home_item_album_load_more': '.hpoi-latestalbum-more', 'home_item_popular_tabs': 'div.hpoi-databas-popular > div > div > div.database-select > a', 'home_item_popular_hits': 'div.hpoi-populartext-box', 'home_item_amazon_buy': 'div.hpoi-nichiapick > div.hpoi-nichiapick-box > div > div.hpoi-nichiapick-item > div.hpoi-nichiapick-content > div.hpoi-nichiapick-text > a.hpoi-nichia-pick', 'home_item_latest_information_title': '.hpoi-latestinformation-left > .hpoi-box-title > .hpoi-title-left > span', 'home_item_info_sub_filter': 'div.hpoi-latestinformation-left > div.hpoi-box-title > div.hpoi-title-left > a', 'home_item_info_action_type': 'div.hpoi-latestinformation-left > div.hpoi-conter-ltsifrato > div.hpoi-conter-left > div.right-leioan > div:nth-of-type(2) > span', 'home_item_info_type_long': 'div.hpoi-latestinformation-left > div.hpoi-conter-ltsifrato > div.hpoi-conter-left > div.right-leioan > div:nth-of-type(1) > span:nth-of-type(1)', 'home_item_info_time': 'div.hpoi-latestinformation-left > div.hpoi-conter-ltsifrato > div.hpoi-conter-left > div.right-leioan > div:nth-of-type(1) > span:nth-last-of-type(1)', 'home_item_info_type_name': 'div.hpoi-latestinformation-left > div.hpoi-conter-ltsifrato > div.hpoi-conter-left > div.left-leioan > span', 'home_item_recommended_title': '.hpoi-latestinformation-right > .hpoi-box-title > .hpoi-title-left > span', }; home_item_section.getPageType = function() { const PATHNAME = window.location.pathname; const loggedInIndicator = $(PLACES['logged_in_indicator']).length; if (['/', '/index', '/index/home'].includes(PATHNAME) && loggedInIndicator == 0) return 'main'; else if (PATHNAME.endsWith('/hobby/')) return 'figures'; else if (PATHNAME.endsWith('/hobby/model')) return 'anime models'; else if (PATHNAME.endsWith('/hobby/real')) return 'real models'; else if (PATHNAME.endsWith('/hobby/moppet')) return 'plushies'; else if (PATHNAME.endsWith('/hobby/doll')) return 'dolls'; return; }; home_item_section.isToTranslate = function() { return !!this.getPageType(); }; home_item_section.translate = function() { const me = this; if (!me.isToTranslate()) { return; } const pageType = me.getPageType(); if (pageType == 'main') { var searchboxes = $(me.places['home-page-searchbox']); for (const searchbox of searchboxes) { searchbox.attributes['placeholder'].textContent = me.translations.en['home-page-searchbox']['placeholder']; } me.doTranslation('home_item_main_title_section', [TRANSLATIONS.en['x_item_types_plural']]); me.doTranslation('home_item_main_gk_maker_stat', [TRANSLATIONS.en['profile_stats']]); } else { me.doTranslation('home_item_title_section'); me.doTranslation('home_item_database_tabs'); var translateDatabaseGlyphs = function() { glyph_tile_old_section.translate(); } me.createAndUseObserverForList(translateDatabaseGlyphs, $('#hpoi-dataBase-Box-List')[0]); //me.doTranslation('home_item_album_load_more', TRANSLATIONS.en['load_more_button']); me.doTranslation('home_item_popular_tabs'); var translatePopularHits = function() { me.doTranslation('home_item_popular_hits', ['home_item_popular_hits']); } me.createAndUseObserverForList(translatePopularHits, $('#hpoi-dataBase-Box-List')[0]); me.doTranslation('home_item_amazon_buy'); } me.doTranslation('home_item_latest_information_title'); $(me.places['home_item_latest_information_title']).css('width', '100px'); me.doTranslation('home_item_info_sub_filter'); var translateLatestInformationContent = function (mutations) { me.doTranslation('home_item_info_action_type'); me.doTranslation('home_item_info_type_long'); let relativeTimes = $(me.places['home_item_info_time']); translateRelativeDate(relativeTimes); const pageTypeToDicMap = { 'main': 'home_image_type_name', 'figures': 'x_subtypes_figures', 'anime models': 'x_subtypes_anime_models', 'real models': 'x_subtypes_real_models', 'plushies': 'x_subtypes_plushies', 'dolls': 'x_subtypes_dolls', }; me.doTranslation('home_item_info_type_name', [TRANSLATIONS.en[pageTypeToDicMap[pageType]]]); } me.createAndUseObserverForList(translateLatestInformationContent, $('.hpoi-conter-ltsifrato')[0]); me.doTranslation('home_item_recommended_title'); }; home_item_section.testTranslation = function() { const me = this; if (!me.isToTranslate()) { return; } const pageType = me.getPageType(); if (pageType == 'main') { me.testTranslationMapForDic('home_item_main_title_section', TRANSLATIONS.en['x_item_types_plural']); me.testTranslationMapForDic('home_item_main_gk_maker_stat', [TRANSLATIONS.en['profile_stats']]); } else { me.testTranslationMap('home_item_title_section'); me.testTranslationMap('home_item_database_tabs'); glyph_tile_old_section.testTranslation(); //me.testTranslationMapForDic('home_item_album_load_more', TRANSLATIONS.en['load_more_button']); me.testTranslationMap('home_item_popular_tabs'); me.testTranslationMapForDic('home_item_popular_hits', ['home_item_popular_hits']); me.testTranslationMap('home_item_amazon_buy'); } me.testTranslationMap('home_item_latest_information_title'); me.testTranslationMap('home_item_info_sub_filter'); me.testTranslationMap('home_item_info_action_type'); me.testTranslationMap('home_item_info_type_long'); const pageTypeToDicMap = { 'main': 'home_image_type_name', 'figures': 'x_subtypes_figures', 'anime models': 'x_subtypes_anime_models', 'real models': 'x_subtypes_real_models', 'plushies': 'x_subtypes_plushies', 'dolls': 'x_subtypes_dolls', }; me.testTranslationMapForDic('home_item_info_type_name', [TRANSLATIONS.en[pageTypeToDicMap[pageType]]]); me.testTranslationMap('home_item_recommended_title'); }; login_form_section.translations = { en: { 'login_form_title': { '登录到Hpoi': 'Log in to Hpoi', }, 'login_qr_code_title': { '扫码登录': 'Scan code to log in', }, 'login_qr_code_hint': { '请使用Hpoi APP 扫码登录或扫码下载APP': 'Scan the code to log in via Hpoi APP or download the app', }, 'login_tab': { '密码登录': 'with password', '短信登录': 'with SMS' }, 'login_form_placeholder': { '输入手机号/邮箱':'Phone number/email', '密码':'Password', '请输入图形验证码':'Put code from the image', '手机号码':'Phone number', '请输入短信验证码':'Put code from the text message', }, 'login_form_verify_code_button': { '获取验证码': 'Send SMS' }, 'login_form_register_button': { '注册': 'Register' }, 'login_form_login_button': { '登录': 'Log in' }, 'login_form_forgot_link': { '忘记密码': 'Forgot the password?' }, 'login_form_email_error' : { '请输入邮箱地址或手机号码' : 'Email/phone number cannot be empty', '请输入密码' : 'Password cannot be empty', '请输入验证码': 'Verification code cannot be empty', '账号或密码错误' : 'Invalid email/phone number and/or password' }, 'login_form_phone_error': { '请输入手机号': 'Phone number cannot be empty', '请输图形入验证码': 'Code from the image cannot be empty', '请输入短信验证码' : 'Code from SMS cannot be empty', '请输入验证码' : 'Verification code cannot be empty', '验证码错误' : 'Invalid verification code', '账号或验证码错误': 'Invalid phone number and/or verification code(s)', }, 'login_form_alert' : { '请关联手机号' : '' }, 'login_form_agreements': { '登录或完成注册即代表你同意': 'By registering or log in, you agree to following terms: ', '《用户协议》': '"Terms of service"', '、': ', ', '《隐私协议》': '"Privacy Policy"', '《发布协议》': '"Copyrights"', '若此电脑非个人使用,需要在使用后退出登录': '. If you are using a public computer, please remember to log out. ' } } }; login_form_section.places = { 'login_form_title': 'div.hpoi-irrigation-banner > span', 'login_qr_code_container': 'div.login-container-code', 'login_qr_code_title': 'div.login-container-code > p.title', 'login_qr_code_box': 'div.login-container-code > div.qrcode-box', 'login_qr_code_hint': 'div.login-container-code > p.hint', 'login_tab': 'div.hpoi-login-box > div.login-tabs > a', 'login_form_placeholder': '.login-form-box > div input', 'login_form_verify_code_button': 'div.input-item > button.btn-code', 'login_form_register_button': 'div.hpoi-login-box > div.login-btn-box > a.login-reg-btn', 'login_form_login_button': 'div.hpoi-login-box > div.login-btn-box > button.login-btn', 'login_form_forgot_link': 'div.hpoi-login-box > div.login-bottom > a', 'login_form_agreements': 'div.hpoi-login-footer *', 'login_form_email_error': '#form-email-err-text', 'login_form_phone_error': '#form-phone-err-text', }; login_form_section.isToTranslate = function () { const me = this; const PATHNAME = window.location.pathname; if (['/user/login'].includes(PATHNAME)) { return true; } return false; }; login_form_section.translate = function () { const me = this; if (!me.isToTranslate()) { return; } me.doTranslation('login_form_title'); $(me.places['login_qr_code_container']).css('width', '200px'); $(me.places['login_qr_code_box']).css('margin', 'auto'); $(me.places['login_qr_code_box']).css('width', '160px'); me.doTranslation('login_qr_code_title'); me.doTranslation('login_qr_code_hint'); $('.hpoi-login-line').css('margin', '0 80px 0 40px'); me.doTranslation('login_tab'); //me.doTranslation('search_condition_toogle_hide', ['search_condition_toogle']); var formBoxes = $(me.places['login_form_placeholder']); for (const formBox of formBoxes) { formBox.attributes['placeholder'].textContent = me.translations.en['login_form_placeholder'][formBox.attributes['placeholder'].textContent]; } me.doTranslation('login_form_verify_code_button'); var translateEmailErrors = function() { me.doTranslation('login_form_email_error'); }; me.createAndUseObserverForList(translateEmailErrors, $(me.places['login_form_email_error'])[0]); var translatePhoneErrors = function() { me.doTranslation('login_form_phone_error'); }; me.createAndUseObserverForList(translatePhoneErrors, $(me.places['login_form_phone_error'])[0]); me.doTranslation('login_form_register_button'); me.doTranslation('login_form_login_button'); me.doTranslation('login_form_forgot_link'); me.doTranslation('login_form_agreements'); }; login_form_section.testTranslation = function () { const me = this; if (!me.isToTranslate()) { return; } //me.testTranslationMapForDic('search_filter_main_type', [TRANSLATIONS.en['x_item_types_plural'], TRANSLATIONS.en['x_generic_all_capitalized']]); me.testTranslationMap('login_form_title'); me.testTranslationMap('login_qr_code_title'); me.testTranslationMap('login_qr_code_hint'); me.testTranslationMap('login_tab'); me.testTranslationMap('login_form_register_button'); me.testTranslationMap('login_form_login_button'); me.testTranslationMap('login_form_forgot_link'); //me.doTranslation('login_form_agreements'); }; search_section.translations = { en: { 'search_condition_title': { '类型:': 'Type:', '属性:': 'Attribute:', '比例:': 'Scale:', '限制:': 'Rating:', '添加筛选:': 'Add filter:', }, 'search_condition_attribute_list': { '汉子': 'Male', '妹子': 'Female', '景品': 'Prizes', '军用': 'Military', 'GK': 'Garage kits', '可变形': 'Deformed', '民用': 'Civil', '海上': 'Maritime', '可动': 'Movable', '陆地': 'On land', '航空': 'Aircraft', '可脱': 'Alternate parts', '展示品': 'Prototype', '需拼装': 'To assembly', '未上色': 'Uncolored', }, 'search_condition_rating_list': { '全年龄': 'General', //0 '轻微露出': 'Ecchi', //12 '一般露出': 'Revealing', //15 '普通露出': 'Revealing', //15 '露出-': 'Explicit-', //18 '露出+': 'Explicit+', //20 '低于轻微露出': 'Ecchi and below', //115 }, 'search_condition_filter': { '添加': 'add', }, 'search_condition_filter_list': { '系列': 'Line', '作品': 'Series', '角色': 'Character', '制作厂商': 'Manufacturer', '发行厂商': 'Distributor', '发售时间': 'Release time', '入库时间': 'Added time', }, 'search_condition_toogle': { '收起': 'hide', '展开': 'show', }, 'search_sort_list': { '发售': 'Sort by release date', '入库': 'Added date', '总热度': 'Hits overall', '一周热度': 'Hits in a week', '一天热度': 'Hits today', '评价': 'Rating' }, 'search_view': { '视图:': 'View:' }, 'search_view_list': { '超小': 'Very small', '小': 'Small', '中': 'Medium', '超大': 'Very large', '大': 'Large', }, 'search_page_ibox': { '热门制作厂商': 'Top manufacturers', '发售时间': 'Release date', }, 'search_modal_window_header': { '选择时间': 'Select date period', }, 'search_modal_window_body': { '开始:': 'Start: ', '结束:': 'End: ', }, 'search_modal_window_footer': { '确定': 'OK', }, } }; search_section.places = { 'search_filter_main_type': '.hpoi-database-tabs > .item', 'search_condition_title': '.hpoi-database-condition > .item-box > span', 'search_condition_type_list': '.hpoi-database-condition > .item-box:nth-child(1) > .item-list > button', 'search_condition_attribute_list': '.hpoi-database-condition > .item-box:nth-last-child(4) > .item-list > button', 'search_condition_scale_all_button': '.hpoi-database-condition > .item-box:nth-last-child(3) > .item-list > button:nth-child(1)', 'search_condition_rating_list': '.hpoi-database-condition > .item-box:nth-last-child(2) > .item-list > button', 'seach_condition_filter_selected': '.hpoi-database-condition > .item-box:nth-last-child(1) > .item-list-add > .hpoi-group-add > div', 'search_condition_filter': '.hpoi-database-condition > .item-box:nth-last-child(1) > .item-list-add > .hpoi-icon-add > button', 'search_condition_filter_list': '.hpoi-database-condition > .item-box:nth-last-child(1) > .item-list-add > .hpoi-icon-add > ul > li > a', 'search_condition_toogle_show': '.item-box:nth-last-child(4) > .item-list > .hpoi-btn-operate', 'search_condition_toogle_hide': '.item-box > .item-list-add > .hpoi-btn-operate', 'search_sort_list': '.hpoi-database-ibox > .hpoi-database-ibox-head > .ibox-head-left > a', 'search_view': '.hpoi-database-ibox > .hpoi-database-ibox-head > .ibox-head-right > a', 'search_view_list': '.hpoi-database-ibox > .hpoi-database-ibox-head > .ibox-head-right > ul > li > a', 'search_page_ibox': '.hpoi-database-ibox .hpoi-title-left > span', 'search_modal_window_header': '#selectDateModal .modal-header > h4.modal-title', 'search_modal_window_body': "#selectDateModal .modal-body label", 'search_modal_window_footer': "#selectDateModal .modal-footer > button", }; search_section.isToTranslate = function () { const PATHNAME = window.location.pathname; if (PATHNAME.includes('/hobby/all')) { return true; } return false; }; search_section.translate = function () { const me = this; if (!me.isToTranslate()) { return; } me.doTranslation('search_filter_main_type', [TRANSLATIONS.en['x_item_types_plural'], TRANSLATIONS.en['x_generic_all_capitalized']]); me.doTranslation('search_condition_title'); const typeToTypeDic = function (categoryId) { if (categoryId <= 100) return 'x_subtypes_figures'; if (categoryId <= 200) return 'x_subtypes_anime_models'; if (categoryId <= 300) return 'x_subtypes_dolls'; if (categoryId <= 400) return 'x_subtypes_plushies'; if (categoryId <= 500) return 'x_subtypes_real_models'; if (categoryId <= 900) return 'x_subtypes_merch'; }; let category = new URL(window.location).searchParams.get("category"); if (category == null || category == 10000) { //do nothing } else { me.doTranslation('search_condition_type_list', [TRANSLATIONS.en[typeToTypeDic(category)], TRANSLATIONS.en['x_generic_all_capitalized']]); } me.doTranslation('search_condition_attribute_list', ['search_condition_attribute_list', TRANSLATIONS.en['x_generic_all_capitalized']]); me.doTranslation('search_condition_scale_all_button', [TRANSLATIONS.en['x_generic_all_capitalized']]); me.doTranslation('search_condition_rating_list'); me.doTranslation('seach_condition_filter_selected', ['search_condition_filter_list']); me.doTranslation('search_condition_filter'); me.doTranslation('search_condition_filter_list'); me.doTranslation('search_condition_toogle_hide', ['search_condition_toogle']); me.doTranslation('search_condition_toogle_show', ['search_condition_toogle']); me.doTranslation('search_sort_list'); me.doTranslation('search_view', ['search_view']); me.doTranslation('search_view', ['search_view_list']); me.doTranslation('search_view_list'); if ($(me.places['search_view'])[0].textContent.includes(me.translations.en['search_view_list']['中'])) { glyph_tile_section.translate(); } me.doTranslation('search_page_ibox'); me.doTranslation('search_modal_window_header'); me.doTranslation('search_modal_window_body'); me.doTranslation('search_modal_window_footer'); }; search_section.testTranslation = function () { const me = this; if (!me.isToTranslate()) { return; } me.testTranslationMapForDic('search_filter_main_type', [TRANSLATIONS.en['x_item_types_plural'], TRANSLATIONS.en['x_generic_all_capitalized']]); me.testTranslationMap('search_condition_title'); me.testTranslationMapForDic('search_condition_attribute_list', ['search_condition_attribute_list', TRANSLATIONS.en['x_generic_all_capitalized']]); me.testTranslationMapForDic('search_condition_scale_all_button', [TRANSLATIONS.en['x_generic_all_capitalized']]); me.testTranslationMap('search_condition_rating_list'); me.testTranslationMapForDic('seach_condition_filter_selected', ['search_condition_filter_list']); me.testTranslationMap('search_condition_filter'); me.testTranslationMap('search_condition_filter_list'); me.testTranslationMapForDic('search_condition_toogle_hide', ['search_condition_toogle']); me.testTranslationMapForDic('search_condition_toogle_show', ['search_condition_toogle']); me.testTranslationMap('search_sort_list'); me.testTranslationMapForDic('search_view', ['search_view']); me.testTranslationMapForDic('search_view', ['search_view_list']); me.testTranslationMap('search_view_list'); if ($(me.places['search_view'])[0].textContent.includes(me.translations.en['search_view_list']['中'])) { glyph_tile_section.testTranslation(); } me.testTranslationMap('search_page_ibox'); me.testTranslationMap('search_modal_window_header'); me.testTranslationMap('search_modal_window_body'); me.testTranslationMap('search_modal_window_footer'); }; global_search_section.translations = { en: { 'search_global_advanced_search_button': { '高级检索': 'Advanced', }, 'search_global_main_nav': { '周边': 'Items', '图片': 'Pictures', '相册': 'Albums', '角色': 'Chars', '作品': 'Series', '系列': 'Lines', '人物': 'Persons', '厂商': 'Makers', '用户': 'Users', }, 'search_global_option_title': { '综合排序': 'Complex search', '全部周边': 'All types', '全部手办': 'All figures', '全部动漫模型': 'All anime models', '全部真实模型': 'All real models', '全部毛绒布偶': 'All plushies', '全部Doll娃娃': 'All dolls', '立牌/摆件': 'Character stand', '全部厂商': 'All companies', '不限年份': 'Any year', }, 'search_global_option_sort': { '相关度最高': 'Most revelant', '最热门': 'Popular first', '最新添加': 'Newly added', '最晚发售': 'Latest released', '评分最高': 'Best rated', }, 'search_global_option_album_search': { '默认搜索': 'Search by default', '条目名称': 'Item name only', '相册标题': 'Album title only', }, 'search_global_option_album_sort': { '推荐排序': 'Sort by default', '最新创建': 'Newly created', '最近更新': 'Newly updated', '图片数量': 'Number of pictures', '总热度': 'Hits overall', '一天热度': 'Hits today', }, 'search_global_result_tags': { '角色': 'Character', '周边系列': 'Line', '人物': 'Person', '厂商': 'Company', }, 'search_global_results_none': { '什么也没找到~': 'Couldn\'t find anything~', }, 'search_global_page_ibox': { '说明': 'How to use', '大家在找': 'Most popular', }, 'search_global_ibox_description': { '1、尽量用日语原文作关键字,因为很多还没翻译,或者翻译不标准': '1. If possible, use Japanese names to search over Chinese ones, as not all items are translated, or Chinese names are not common.', '2、分类、排序、样式都还要完善,先用着吧_(:з」∠)_': '2. Sorting and filtering by types and all clasifications are your friends, use them first _(:з」∠)_', '3、如果要按性质(如可脱)查找,也可以看看': '3. If you want more detailed filtering (like for figures with alternate parts), take a look at ', '高级检索': 'an advanced search.', }, } }; global_search_section.places = { 'search_global_advanced_search_button': 'div.page-search-btn ~ a.btn-link', 'search_global_main_nav': 'div.taobao-nav > div', 'search_global_option_title': '.search-option-nav > div:nth-of-type(1)', 'search_global_option_sort': '.search-option-nav:nth-of-type(3) > div:not(:nth-of-type(1))', 'search_global_option_item_types': '.search-option-nav:nth-of-type(4) > div:not(:nth-of-type(1))', 'search_global_option_item_type_active': '.search-option-nav:nth-of-type(4) > div.active', 'search_global_option_item_subtypes': '.search-option-nav:nth-of-type(5) > div:not(:nth-of-type(1))', 'search_global_option_sort': '.search-option-nav:nth-of-type(3) > div:not(:nth-of-type(1))', 'search_global_option_album_search': '.search-option-nav:nth-of-type(3) > div', 'search_global_option_album_sort': '.search-option-nav:nth-of-type(4) > div', 'search_global_result_tags': '#result-content > .media-list .ibox-content > .media-body > div > span.label-tag', 'search_global_users_stats': '#result-content .user-i-box .row > div', 'search_global_results_none': 'div#result-content > div:not(.pull-right) > div.hpoi-no-content > p', 'search_global_albums_none': '#waterfall > div', 'search_global_page_ibox': '.container > .row .ibox > .ibox-title > h5', 'search_global_ibox_description': '.container > .row .ibox:first > .ibox-content *', }; global_search_section.isToTranslate = function () { const PATHNAME = window.location.pathname; if (PATHNAME.includes('/search')) { return true; } return false; }; global_search_section.translate = function () { const me = this; if (!me.isToTranslate()) { return; } me.doTranslation('search_global_advanced_search_button'); me.doTranslation('search_global_main_nav'); let searchCategoryCode = new URL(window.location.href).searchParams.get("category"); // filters and sorts if (searchCategoryCode == null || parseInt(searchCategoryCode) <= 10000) { // items me.doTranslation('search_global_option_title'); me.doTranslation('search_global_option_sort'); me.doTranslation('search_global_option_item_types', [TRANSLATIONS.en['x_item_types_plural'], TRANSLATIONS.en['x_other']]); let activeSubtype = $(me.places['search_global_option_item_type_active']); let dicToTranlateSubtypes = ''; if (activeSubtype.length) { var subtype = activeSubtype[0].innerText.trim(); let subtypeToPlaceMap = { 'All types': '', 'Figures': 'x_subtypes_figures', 'Anime models': 'x_subtypes_anime_models', 'Real models': 'x_subtypes_real_models', 'Plushies': 'x_subtypes_plushies', 'Dolls': 'x_subtypes_dolls', 'Other': 'x_subtypes_merch', }; dicToTranlateSubtypes = subtypeToPlaceMap[subtype]; } else { dicToTranlateSubtypes = 'x_subtypes_merch'; } if (dicToTranlateSubtypes != '') { me.doTranslation('search_global_option_item_subtypes', [TRANSLATIONS.en[dicToTranlateSubtypes], TRANSLATIONS.en['x_other']]); } } else if (searchCategoryCode == '60001') { // albums me.doTranslation('search_global_option_album_search'); me.doTranslation('search_global_option_album_sort'); } //results if (['50000', '70100', '30000', '40000'].includes(searchCategoryCode)) // characters, lines, persons, makers me.doTranslation('search_global_result_tags'); else if (searchCategoryCode == '20000') // series me.doTranslation('search_global_result_tags', [TRANSLATIONS.en['x_series_types']]); else if (searchCategoryCode == '1000002') // users me.doTranslation('search_global_users_stats', [TRANSLATIONS.en['profile_stats']]); else if (searchCategoryCode == '60001') // albums me.doTranslation('search_global_albums_none', ['search_global_results_none']); else me.doTranslation('search_global_results_none'); //right column me.doTranslation('search_global_page_ibox'); me.doTranslation('search_global_ibox_description'); }; global_search_section.testTranslation = function () { const me = this; if (!me.isToTranslate()) { return; } me.testTranslationMap('search_global_advanced_search_button'); me.testTranslationMap('search_global_main_nav'); let searchCategoryCode = new URL(window.location.href).searchParams.get("category"); if (searchCategoryCode == null || parseInt(searchCategoryCode) <= 10000) { me.testTranslationMap('search_global_option_title'); me.testTranslationMap('search_global_option_sort'); me.testTranslationMapForDic('search_global_option_item_types', [TRANSLATIONS.en['x_item_types_plural'], TRANSLATIONS.en['x_other']]); //TODO sublist } else if (searchCategoryCode == '60001') { // albums me.testTranslationMap('search_global_option_album_search'); me.testTranslationMap('search_global_option_album_sort'); } else if (['50000', '70100', '30000', '40000'].includes(searchCategoryCode)) // characters, lines, persons, makers me.testTranslationMap('search_global_result_tags'); else if (searchCategoryCode == '20000') // series me.testTranslationMapForDic('search_global_result_tags', [TRANSLATIONS.en['x_series_types']]); else if (searchCategoryCode == '1000002') // users me.testTranslationMapForDic('search_global_users_stats', [TRANSLATIONS.en['profile_stats']]); if (searchCategoryCode == '60001') { me.testTranslationMapForDic('search_global_albums_none', ['search_global_results_none']); } else { me.testTranslationMap('search_global_results_none'); } me.testTranslationMap('search_global_page_ibox'); // me.testTranslationMap('search_global_ibox_description'); }; encyclopedia_section.translations = { en: { 'encyclopedia_entry_type': { '角色': 'Character', '作品': 'Series', '系列': 'Line', '人物': 'Person', '原画': 'Designer', '厂商': 'Company', }, 'encyclopedia_name_header': { '中文名:': 'Chinese name: ' }, 'encyclopedia_infobox_props': { '名称:': 'Name: ', '中文名:': 'Chinese name: ', '别名:': 'Aliases: ', '地区:': 'Country: ', '官网:': 'Website: ', '官方网站:': 'Official website: ', '官方微博:': 'Official Weibo: ', '推特:': 'Twitter: ', '微博:': 'Weibo: ', '成立时间:': 'Founded date: ', '成立日期:': 'Founded date: ', '所在地:': 'Location: ', '性别:': 'Sex: ', '生日:': 'Birthday date: ', '星座:': 'Zodiac: ', '家庭情况:': 'Family info: ', '前任监护人:': 'Former guardian: ', '监护人:': 'Guardian: ', '血型:': 'Blood type: ', '引用来源:': 'Info source: ', 'Anidb ID:': 'Anidb ID: ', '母亲:': 'Mother: ', '学籍:': 'Student status: ', '种族:': 'Race: ', '身高:': 'Height: ', '年龄:': 'Age: ', '体重:': 'Weight: ', '三围:': 'Body meas.: ', '出生地:': 'Place of birth: ', '国籍:': 'Nationality: ', '声优:': 'Voice actor: ', '音源:': 'Voice provider: ', '稀有度:': 'Rarity: ', '编号:': 'Number: ', '阵营:': 'Faction: ', '来源:': 'Source: ', '人设:': 'Character design', '类型:': 'Type: ', '时间:': 'Time: ', '话数:': 'Episodes: ', '放送星期:': 'Week day of stream.: ', '发行日期:': 'Released: ', '开发:': 'Developed: ', }, 'encyclopedia_items_section': { '详情': 'Info', '自营周边': 'Sold by Hpoi', '相关商品': 'Related products', '最新作品': 'Latest items', '关联手办': 'Related figures', '相关手办': 'Related figures', '系列': 'Lines', '制作周边': 'Items manufactured', '发行周边': 'Items distributed', '关联周边': 'Related items', '相关周边': 'Related items', '参与周边': 'Items worked on', '她参与的手办': 'Figures worked on', '他参与的手办': 'Figures worked on', '评论': 'Comments' }, 'encyclopedia_items_section_sub_made': { '制作周边': 'Items manufactured', '发行周边': 'Items distributed', }, 'encyclopedia_items_section_sub_issued': { '发行周边': 'Items distributed', }, 'encyclopedia_items_more': { '全部': 'more', }, }, }; encyclopedia_section.places = { /* ENCYCLOPEDIA */ 'encyclopedia_header_type': '.hpoi-company-info .info-head > span:nth-of-type(1)', 'encyclopedia_name_header': '.hpoi-company-info .info-head > span:nth-of-type(2)', 'encyclopedia_infobox_props': '.company-ibox > div.row > div.item-details', 'encyclopedia_items_more': '.company-ibox > .item-head a.hpoi-btn-more > span', 'encyclopedia_items_header_list': '.hpoi-company-nav > div > a.nav-item', 'encyclopedia_items_header': '.company-ibox > .item-head > div > h3', 'encyclopedia_items_header_sub_made': '.company-ibox > .item-head > div.hpoi-slider-active > a.hpoi-slider-make', 'encyclopedia_items_header_sub_issued': '.company-ibox > .item-head > div.hpoi-slider-active > a.hpoi-slider-issued', 'encyclopedia_items_header_count': '.company-ibox > .item-head > div > span', }; encyclopedia_section.isToTranslate = function () { const PATHNAME = window.location.pathname; if (PATHNAME.includes('/company/') || PATHNAME.includes('/series/') || PATHNAME.includes('/works') || PATHNAME.includes('/charactar/') || PATHNAME.includes('/person/')) { return true; } return false; }; /* do stuff to translate text like 共8个相关商品 => Total 8 related products 共153条 => Total 153 (lines, comments) 共3723个 => Total 153 (items) 共91个相关周边 => Total 91 related items 共29个相关手办 => Total 29 related figures 共1个, 评分4.38 => Total 153 (items), Rating 4.38 1st part > up to counter like 个, 条 2nd part > after counter, translate according to dictionary 3rd part > after a coma, change coma to normal coma and translate with dictionary */ encyclopedia_section.translateEncyclopediaItemsHeader = function (element, dicDef) { let textToTranslate = element.textContent.trim(); let translation = ""; // split at parts let counterSymbol = ['个', '条']; let partsSplittedByCounters = textToTranslate.split(new RegExp('['+ counterSymbol.join('') + ']', 'i')); if (partsSplittedByCounters[1].indexOf(',') !== -1) { secondAndThirdPart = partsSplittedByCounters[1].split(','); partsSplittedByCounters[1] = secondAndThirdPart; partsSplittedByCounters = partsSplittedByCounters.flat(); } let numberPart = partsSplittedByCounters[0]; let number = numberPart.substring(1); translation += "Total "; translation += number; let secondPartTranslation = ""; let secondPartExists = partsSplittedByCounters.length >= 2; if (secondPartExists && partsSplittedByCounters[1].length > 0) { secondPartTranslation = (dicDef[partsSplittedByCounters[1]]).toLowerCase(); translation += " "; translation += secondPartTranslation; } let thirdPartTranslation = ""; let thirdPartExists = partsSplittedByCounters.length == 3; if (thirdPartExists && partsSplittedByCounters[2].length > 0) { thirdPartTranslation = partsSplittedByCounters[2].replace('评分', 'rate: '); translation += ', '; translation += thirdPartTranslation; } element.textContent = translation; }; encyclopedia_section.translate = function () { const me = this; if (me.isToTranslate()) { me.doTranslation('encyclopedia_header_type', ['encyclopedia_entry_type']); me.doTranslation('encyclopedia_name_header', ['encyclopedia_name_header']); me.doTranslation('encyclopedia_items_header_list', ['encyclopedia_items_section']); $(me.places['encyclopedia_items_header_list']).css('margin-left', '20px'); me.doTranslation('encyclopedia_items_header', ['encyclopedia_items_section']); me.doTranslation('encyclopedia_items_header_sub_made', ['encyclopedia_items_section_sub_made']); me.doTranslation('encyclopedia_items_header_sub_issued', ['encyclopedia_items_section_sub_issued']); me.doTranslation('encyclopedia_infobox_props', ['encyclopedia_infobox_props']); me.doTranslation('encyclopedia_items_more'); $(me.places['encyclopedia_items_header_count']).each(function (index, element) { me.translateEncyclopediaItemsHeader(element, me.translations['en']['encyclopedia_items_section']); }); glyph_tile_section.translate(); } }; encyclopedia_section.testTranslation = function () { if (this.isToTranslate()) { this.testTranslationMapForDic('encyclopedia_header_type', ['encyclopedia_entry_type']); this.testTranslationMapForDic('encyclopedia_items_header_list', ['encyclopedia_items_section']); this.testTranslationMapForDic('encyclopedia_items_header', ['encyclopedia_items_section']); this.testTranslationMapForDic('encyclopedia_items_header_sub_made', ['encyclopedia_items_section_sub_made']); this.testTranslationMapForDic('encyclopedia_items_header_sub_issued', ['encyclopedia_items_section_sub_issued']); this.testTranslationMapForDic('encyclopedia_infobox_props', ['encyclopedia_infobox_props']); this.testTranslationMap('encyclopedia_items_more'); glyph_tile_section.testTranslation(); } }; item_section.translations = { en: { 'item_nav': { '概览': 'Overview', '精品摄影': 'Official photos', '用户相册': 'User albums', '传图': 'Upload pics', '报错/催更': 'Report/remind', '编辑': 'Edit', '举报': 'Review', }, 'item_nav_list': { '屏蔽本条目': 'Block this entry', '报错/催更': 'Report/remind', '举报': 'Review', /* -unused? - */ '实物相册': 'User album', '基本资料': 'General info', '封面': 'Picture', '发售/价格/版本': 'Release', '关联资料': 'Related info', '关联手办': 'Related figures', '关联动漫模型': 'Related anime models', '关联真实模型': 'Related real models', '关联毛绒布偶': 'Related plushies', '关联Doll娃娃': 'Related dolls', }, 'item_nav_push': { '推上首页': 'Push to home page', }, 'item_chinese_name': { '中文名称': 'Chinese name', }, 'item_related_title': { '关联条目': 'Related items:', }, 'item_related_item' : { '异色版': 'Variant', '同企画': 'Theme', }, 'item_properties': { '名称': 'Name', '别名': 'Alias', '属性': 'Attributes', '定价': 'Price', '发售日': 'Release date', '发售': 'Release', '比例': 'Scale', '制作': 'Maker', '发行': 'Distributor', '系列': 'Line', '原型': 'Sculptor', '涂装': 'Coloring', '原画': 'Designer', '角色': 'Characters', '作品': 'Origin', '版权元': "M. copyrights", '素材': 'Materials', '材质': 'Materials', '数量': 'Quantity', '洗涤': 'Washing', '尺寸': 'Size', '版权': 'Copyrights', '版权标记': 'Copyrights', '原型协力': 'Producer', '官网': 'Website', '官方链接': 'Off. links', '外部链接': 'Ref. links', }, 'item_collection_top': { '收藏&评分': 'Favs & rates', '条目访问': 'Hits', }, 'item_collection_status': { '关注': 'Interested', '想买': 'Wished', '预订': 'Preorder', '已入': 'Bought', }, 'item_collection_rate': { '我的评分:': 'My rating: ', }, 'rating_label': { '神物': 'grail', '满足': 'good', '眼缘': 'fleeting', '微妙': 'tricky', '邪神': 'poop', '未评分': 'none', }, 'item_collection_rate_mean': { '评分:': 'Rating: ', }, 'item_collection_sale': { '日亚': 'Amazon', '我要卖': 'Want to sell?', '再版许愿': 'Ask for reprint', }, 'item_section_title': { '官图·情报': 'Official information', '关联商品': 'Related products', '实物照片': 'User photos', '实物相册': 'User albums', '简评': 'Brief reviews', '评论': 'Comments', '关联二手': 'Selling preowned', '贡献用户': 'Contributors', }, 'item_process_title': { '进程': 'Production timeline', }, 'item_process_up': { '制作决定': 'Announced', '官图更新': 'Pictures update', '预订时间': 'Preorders opened', '出荷延期': 'Release delay', '出荷时间': 'Release time', '再版确定': 'Re-release announced', }, 'item_process_down': { '制作决定': 'Announced', '原型展示': 'Prototype display', '彩色原型公开': 'Colored prototype display', '官图更新': 'Pictures update', '制作决定&原型展示': 'Announced & prototype', // '2021年11月22日开订': 'Preorders open 2021/11/22' '明日开订': 'Preorders open next day', // '2022年6月出荷': 'Release in 2022/06' // '延期至2021年12月出荷': 'Delayed to 2021/12' // '2021年11月29日出荷': 'Release in 2021/11/29' '再版确定': 'Re-release announced', }, 'item_contribution_type': { '创建': 'Created', '更新资料': 'Updated info', '更新封面': 'Updated main pic', '更新发售/版本': 'Updated release/version', }, } }; item_section.places = { 'item_nav': '.navbar-header > ul.navbar-nav > li > a', 'item_nav_list': '.nav > .dropdown > ul > li > a', 'item_nav_push': '#addfav', 'item_chinese_name': '.hpoi-ibox-title > p', 'item_related_title': '.hpoi-relation-text', 'item_related_item': '.hpoi-entry-item > span', 'item_properties': '.hpoi-ibox-content > .infoList-box > .hpoi-infoList-item > span', 'item_properties_attributes': '.hpoi-infoList-item:nth-of-type(2) > p > a', 'item_collection_top': '.hpoi-collection-score > span', 'item_collection_status': '.hpoi-btn-collection', 'item_collection_rate': '.hpoi-entry-score-box > div > span', 'item_collection_rate_selected': '#kv-caption > span', 'item_collection_rate_mean': '.hpoi-entry-score-num-box > div > div:nth-of-type(1)', 'item_collection_sale': '.hpoi-item-box p', 'rating_label': '.rating-bar-chart > .graphFieldrating_barchart > .graphLabelrating_barchart', 'item_section_title': 'div.hpoi-box-title > .hpoi-title-left span', 'item_process_title': '.process-title > span', 'item_process_up': '.items-process > .item-time > span:nth-of-type(1):not(:empty)', 'item_process_time': '.items-process > .item-time > span:nth-of-type(2):not(:empty)', 'item_process_down': '.items-process > .item-detail:not(:empty)', 'item_contribution_type': 'div.hpoi-user-content > div', 'item_properties_table': '.table-condensed > tbody > tr > td.info-box-left', }; item_section.isToTranslate = function() { const PATHNAME = window.location.pathname; if (PATHNAME.includes("/hobby/") && !home_item_section.isToTranslate() && !search_section.isToTranslate()) { return true; } return false; }; item_section.translate = function() { const me = this; if (!me.isToTranslate()) { return; } me.doTranslation('item_nav'); me.doTranslation('item_nav_list'); me.doTranslation('item_nav_push'); me.doTranslation('item_chinese_name', ['item_chinese_name']); me.doTranslation('item_related_title'); me.doTranslation('item_related_item'); me.doTranslation('item_properties', ['item_properties']); let itemPropertiesNameList = $(this.places['item_properties']); for (const itemPropertiesName of itemPropertiesNameList) { itemPropertiesName.innerHTML = itemPropertiesName.innerHTML.replace(':',':'); }; let itemAttributesTitle = $('.hpoi-infoList-item > span:contains("Attributes")'); let itemAttributesList = itemAttributesTitle.parent().find('a'); for (const attributeLink of itemAttributesList) { let attributeHrefSearchParams = new URL(window.location.origin + '/' + attributeLink.getAttribute('href')).searchParams; //item_properties_attributes //for every link check attributes if (attributeHrefSearchParams.get('sex') != null) { //contains sex parameter - settings_general_form_gender (search one has different words) attributeLink.innerHTML = (settings_section.translations.en['settings_general_form_gender'][attributeLink.innerHTML]) .toLowerCase(); } else if (attributeHrefSearchParams.get('r18') != null) { // contains r18 parameter - search_condition_rating_list attributeLink.innerHTML = (search_section.translations.en['search_condition_rating_list'][attributeLink.innerHTML]) .toLowerCase(); } else if (attributeHrefSearchParams.get('specs') != null) { // contains specs - search_condition_attribute_list attributeLink.innerHTML = (search_section.translations.en['search_condition_attribute_list'][attributeLink.innerHTML]) .toLowerCase(); } else { // the rest - x_subtypes map, like with search, based on category let categoryId = attributeHrefSearchParams.get('category'); const typeToTypeDic = function (categoryId) { if (categoryId <= 100) return 'x_subtypes_figures'; if (categoryId <= 200) return 'x_subtypes_anime_models'; if (categoryId <= 300) return 'x_subtypes_dolls'; if (categoryId <= 400) return 'x_subtypes_plushies'; if (categoryId <= 500) return 'x_subtypes_real_models'; if (categoryId <= 900) return 'x_subtypes_merch'; }; attributeLink.innerHTML = (TRANSLATIONS.en[typeToTypeDic(categoryId)][attributeLink.innerHTML]) .toLowerCase(); } }; //TODO price // 15,800日元 (908元) // 6,800日元 (含税,391元) // TODO version // 2021/7/28 , ¥15,800 let itemPropertiesValueList = $('.hpoi-infoList-item > p'); for (const itemPropertiesValue of itemPropertiesValueList) { itemPropertiesValue.innerHTML = itemPropertiesValue.innerHTML.replaceAll('、 ',', '); itemPropertiesValue.innerHTML = itemPropertiesValue.innerHTML.replaceAll('、',', '); }; me.doTranslation('item_collection_top', ['item_collection_top']); me.doTranslation('item_collection_status'); $(me.places['item_collection_status']).css('width', '23%'); me.doTranslation('item_collection_rate'); var translateMyRateResult = function() { me.doTranslation('item_collection_rate_selected', ['rating_label']); $(me.places['item_collection_rate_selected']).css('margin-left', '8px') .css('position', 'relative').css('top', '6px').css('font-size', '12px'); }; me.createAndUseObserverForList(translateMyRateResult, $('#kv-caption')[0]); me.doTranslation('item_collection_rate_mean'); let ratingPeopleCountNode = $('.hpoi-entry-score-num-box > div > div:nth-of-type(2)')[0]; let ratingPeopleCount = ratingPeopleCountNode.textContent.replace('共有', '').replace('个评分', ''); let ratingPeopleTranslated = 'Rated by ' + ratingPeopleCount + ' users'; ratingPeopleCountNode.textContent = ratingPeopleTranslated; var translateRateChart = function() { me.doTranslation('rating_label'); }; me.createAndUseObserverForList(translateRateChart, $('#rating_barchart')[0]); me.doTranslation('item_collection_sale'); me.doTranslation('item_section_title'); me.doTranslation('item_process_title'); me.doTranslation('item_process_up'); let relativeProcessTimes = $(me.places['item_process_time']); translateRelativeDate(relativeProcessTimes); me.doTranslation('item_process_down'); // TODO: translate ones with dates me.doTranslation('item_contribution_type', ['item_contribution_type']); me.doTranslation('item_properties_table', ['item_properties']); }; item_section.testTranslation = function() { const me = this; if (!me.isToTranslate()) { return; } me.testTranslationMap('item_nav'); me.testTranslationMap('item_nav_list'); me.testTranslationMap('item_nav_push'); me.testTranslationMapForDic('item_chinese_name', ['item_chinese_name']); me.testTranslationMapForDic('item_properties', ['item_properties']); me.testTranslationMapForDic('item_collection_top', ['item_collection_top']); /* TODO: think about delayed testing */ // me.testTranslationMap('item_collection_status'); me.testTranslationMap('item_collection_rate'); me.testTranslationMap('item_section_title'); me.testTranslationMap('item_process_title'); me.testTranslationMapForDic('item_contribution_type', ['item_contribution_type']); me.testTranslationMapForDic('item_properties_table', ['item_properties']); }; settings_section.translations = { en: { 'settings_list': { '基本资料': 'General info', '屏蔽设置': 'Block settings', '隐私设置': 'Privacy settings', '推送设置': 'Notification settings', '修改密码': 'Change password', '更换邮箱': 'Change e-mail', '更换手机号': 'Change phone number', '账号关联': 'Account linking', '头像': 'Avatar', '用户设置': 'User settings', '账号注销': 'Delete account', '注销': 'Delete account', }, 'settings_panel_button': { '保存': 'Save', '更换': 'Change', '更换邮箱': 'Change', '获取': 'Obtain', }, 'settings_general_form': { '昵称:': 'Nickname:', '签名:': 'Signature:', '性别:': 'Gender:', '生日:': 'Birthday:', '自我介绍:': 'About:', }, 'settings_general_form_gender': { '男': 'Male', '女': 'Female', '保密': 'Secret', '无性别': 'Genderless' }, 'settings_block_form': { 'NSFW内容:': 'NSFW content:', '屏蔽动态显示:': 'Dynamic list content:', '邮件通知:': 'Email notifications:', '短信通知:': 'SMS notifications:', '条目评论区:': 'Entry page comment section', }, 'settings_block_form_radio': { '提示我': 'Prompt me', '不显示': 'Don\'t show', '显示': 'Show', '直接显示': 'Show directly', '手动展开': 'Show when requested', '情报': 'Info', '评论': 'Comment', '图片上传': 'New pics', '出售': 'Sale', '求购': 'Hunt', }, 'settings_privacy_headers': { '周边条目': 'Collection', '收藏内容': 'Favorites', '收藏统计': 'Collection stats', '其他内容': 'Other', '关注、粉丝': 'Followed, followers', '讨论板个人主页': 'Forum profile' }, 'settings_privacy_form': { '手办、动漫模型、真实模型、毛绒布偶、Doll娃娃': 'figures, dolls, plushies etc', '相册、图片、文章': 'albums, pics, articles', '历史消费、入手数量、待补款等': 'activity, items quantity, ordered etc.', '系列、厂商、角色、人物、作品': 'lines, companies, characters, people, series', }, 'settings_privacy_form_radio': { '所有人可见': 'For all', '互相关注可见': 'For friends', '仅自己可见': 'For me', }, 'settings_notification_header': { '推荐内容:': 'Recommended content:', '关注消息:': 'Followed entries updates:', '互动通知:': 'Social interactions:', '商品信息': 'Product updates', }, 'settings_notification_radio': { '推荐内容推送': 'enable', '关注up主更新推送': 'main updates', '关注的周边情报推送': 'related items', '关注厂商信息推送': 'companies info', '关注系列信息推送': 'lines info', '关注作品信息推送': 'series info', '关注角色信息推送': 'characters info', '关注人物信息推送': 'people\'s info', '评论回复': 'new replies', '私信': 'new messages', '收到的赞': 'likes received', }, 'settings_notification_product_info_form': { '开订:': 'Order start:', '截单:': 'Order end:', '出荷:': 'Release date:', }, 'settings_notification_product_info_radio': { '站内推送': ' on site', '邮件通知': ' via e-mail', '短信通知': ' via SMS', }, 'settings_password_form': { '旧密码:': 'Old password:', '新密码:': 'New password:', '确认密码:': 'Confirm new password:', }, 'settings_password_forgot': { '忘记密码?': 'Forgot password?', }, 'settings_email_link_avatar_form': { '当前邮箱:': 'Old e-mail:', '更换邮箱:': 'New e-mail:', '旺旺ID:': 'WangWang ID:', '原图': 'Original image', '缩略图': 'Thumbnail', '使用新图': 'Use new image', }, 'settings_phone_form': { '原手机号:': 'Old phone number:', '密码:': 'Password:', '新手机号:': 'New phone number', '获取验证码:': 'Verification code:', }, 'settings_phone_form_placeholder': { '图片验证': 'A picture text', '填写短信验证码': 'Fill in a code from SMS', }, 'settings_avatar_form_placeholder': { '在线上传请在此输入地址': 'Paste image URL', '如需本地上传,请选择文件': 'Select image file', }, 'settings_avatar_form_button_upload': { '在线上传': 'Upload', '本地上传': 'Upload', }, 'settings_avatar_form_button_cancel': { '还是算了': 'Cancel', }, 'settings_delete_title': { '账号注销协议': 'Account Removal Agreement', }, 'settings_delete_agreement': { '我已了解并同意《账号注销协议》': 'I have understood and agreed to the "Account Removal Agreement"', }, 'settings_delete_button': { '下一步': 'Next', } }, }; settings_section.places = { 'settings_list': '.list-group > .list-group-item', 'settings_panel_title': '.panel > .panel-heading', 'settings_panel_button': '.form-group > div > button', 'settings_general_form': '#editData > .form-group > label', 'settings_general_form_gender': '#editData > .form-group > div > label.radio-inline', 'settings_block_form': '#updSetting > .form-group > label', 'settings_block_form_radio': '#updSetting > .form-group > div > label.radio-inline', 'settings_privacy_headers': '#updSetting > .form-group > div.row > h4', 'settings_privacy_form': '#updSetting > .form-group > div.row > span', 'settings_privacy_form_radio': '#updSetting > .form-group > div > div > label.radio-inline', 'settings_notification_header': '#updSetting > div.form-group > label', 'settings_notification_radio': '#updSetting div.push-text', 'settings_notification_product_info_form': '#updSetting > div.form-group > div > div.row > .control-label', 'settings_notification_product_info_radio': '#updSetting > div.form-group > div > div.row > div > label.radio-inline', 'settings_password_form': 'form#updPwd > div.form-group > label', 'settings_password_forgot': 'form#updPwd > div.form-group > div > a', 'settings_email_link_avatar_form': 'form.form-horizontal > div.panel > div.panel-body > div.form-group > label', 'settings_phone_form': 'form#updPhone > div.form-group > label', 'settings_phone_form_placeholder': 'form#updPhone > div.form-group > div > input[placeholder]', 'settings_avatar_form_placeholder': '.form-group > div > div.input-group > input[placeholder]', 'settings_avatar_form_button_upload': '.form-group > div > div.input-group > span.input-group-btn > button', 'settings_avatar_form_button_cancel': '.form-group > div.bs-example > a.btn', 'settings_delete_title': 'div#step-one > div > h2', 'settings_delete_agreement': '#withdrawCheckbox', 'settings_delete_button': '#withdrawButton', }; settings_section.isToTranslate = function () { const PATHNAME = window.location.pathname; if (PATHNAME.includes('/user/edit/')) { return true; } return false; }; settings_section.translate = function () { const me = this; if (!me.isToTranslate()) { return; } const PATHNAME = window.location.pathname; me.doTranslation('settings_list'); me.doTranslation('settings_panel_title', ['settings_list']); me.doTranslation('settings_panel_button'); me.doTranslation('settings_general_form'); me.doTranslation('settings_general_form_gender'); if (PATHNAME.includes('/user/edit/shieldingSetting')) { me.doTranslation('settings_block_form'); me.doTranslation('settings_block_form_radio'); } me.doTranslation('settings_privacy_headers'); me.doTranslation('settings_privacy_form', ['settings_privacy_form']); me.doTranslation('settings_privacy_form_radio'); if (PATHNAME.includes('/user/edit/pushSettings')) { me.doTranslation('settings_notification_header'); me.doTranslation('settings_notification_radio'); me.doTranslation('settings_notification_product_info_form'); me.doTranslation('settings_notification_product_info_radio'); } me.doTranslation('settings_password_form'); me.doTranslation('settings_password_forgot'); // me.doTranslation('settings_email_link_avatar_form'); me.doTranslation('settings_phone_form'); me.doTranslation('settings_avatar_form_button_upload'); me.doTranslation('settings_avatar_form_button_cancel'); if (PATHNAME.includes('/user/edit/withdraw')) { me.doTranslation('settings_delete_title'); let deleteAgreementTitleContainer = $(me.places['settings_delete_title'])[0].parentNode; $(deleteAgreementTitleContainer).removeClass(); $(deleteAgreementTitleContainer).addClass('col-sm-offset-4'); let deleteAgreementText = $(me.places['settings_delete_agreement'])[0].nextSibling; me.doTranslation(null, ['settings_delete_agreement'], [deleteAgreementText]); let deleteAgreementTextContainer = deleteAgreementText.parentNode.parentNode; $(deleteAgreementTextContainer).removeClass(); $(deleteAgreementTextContainer).addClass('col-sm-offset-4'); me.doTranslation('settings_delete_button'); } var verifyboxes = $(me.places['settings_phone_form_placeholder']); for (const verifybox of verifyboxes) { verifybox.attributes['placeholder'].textContent = me.translations.en['settings_phone_form_placeholder'][verifybox.attributes['placeholder'].textContent]; } var uploadBoxes = $(me.places['settings_avatar_form_placeholder']); for (const uploadBox of uploadBoxes) { uploadBox.attributes['placeholder'].textContent = me.translations.en['settings_avatar_form_placeholder'][uploadBox.attributes['placeholder'].textContent]; } }; settings_section.testTranslation = function () { const me = this; if (!me.isToTranslate()) { return; } const PATHNAME = window.location.pathname; me.testTranslationMap('settings_list'); me.testTranslationMapForDic('settings_panel_title', ['settings_list']); me.testTranslationMap('settings_panel_button'); me.testTranslationMap('settings_general_form'); me.testTranslationMap('settings_general_form_gender'); if (PATHNAME.includes('/user/edit/shieldingSetting')) { me.testTranslationMap('settings_block_form'); me.testTranslationMap('settings_block_form_radio'); } me.testTranslationMap('settings_privacy_headers'); me.testTranslationMapForDic('settings_privacy_form', ['settings_privacy_form']); me.testTranslationMap('settings_privacy_form_radio'); if (PATHNAME.includes('/user/edit/pushSettings')) { me.testTranslationMap('settings_notification_header'); me.testTranslationMap('settings_notification_radio'); me.testTranslationMap('settings_notification_product_info_form'); me.testTranslationMap('settings_notification_product_info_radio'); } me.testTranslationMap('settings_password_form'); me.testTranslationMap('settings_password_forgot'); me.testTranslationMap('settings_email_link_avatar_form'); me.testTranslationMap('settings_phone_form'); me.testTranslationMap('settings_avatar_form_button_upload'); me.testTranslationMap('settings_avatar_form_button_cancel'); me.testTranslationMap('settings_delete_title'); me.testTranslationMap('settings_delete_button'); }; $(document).ready(function () { console.log('translating starting...'); const PATHNAME = window.location.pathname; nav_top_section.translate(); home_user_section.translate(); home_item_section.translate(); item_section.translate(); doTranslation('more_button'); login_form_section.translate(); search_section.translate(); global_search_section.translate(); encyclopedia_section.translate(); settings_section.translate(); let datesCnReleaseDate = $('.hpoi-ibox-content > .infoList-box > .hpoi-infoList-item > span:contains("date")').siblings('p').children('a'); let datesTextesReleaseDate = datesCnReleaseDate.contents().filter(function () { return this.nodeType === Node.TEXT_NODE; }); translateFixedDate(datesTextesReleaseDate); //translate home search placeholder var searchboxes2 = $(PLACES['search-searchbox']); for (const searchbox of searchboxes2) { searchbox.attributes['placeholder'].textContent = TRANSLATIONS.en['search-searchbox']['placeholder']; } console.log('translating completed'); console.log('tests starting...'); try { expect(TRANSLATIONS).toExist("TRANSLATIONS is empty!"); expect(TRANSLATIONS.en).toExist("English is somehow empty!"); nav_top_section.testTranslation(); home_user_section.testTranslation(); login_form_section.testTranslation(); search_section.testTranslation(); global_search_section.testTranslation(); encyclopedia_section.testTranslation(); settings_section.testTranslation(); item_section.testTranslation(); } catch (e) { console.error(e); } console.log('tests completed'); }); console.log('script loading finished'); })();