Hpoi fan translation

A script that translates common text on Hpoi - anime figures database

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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');

})();