steam 网页语言切换小工具

这个脚本用于添加一个小按钮来 只更改网页前端语言设置,不更改用户的语言设置。并且使所有的链接指向指定的语言。

// ==UserScript==
// @name              steam 网页语言切换小工具
// @name:en           steam Webpage language switch widget
// @name:ja           steam ウェブ言語スイッチ
// @namespace         jasaj.me
// @match             https://store.steampowered.com/*
// @version           0.1.6
// @description       这个脚本用于添加一个小按钮来 只更改网页前端语言设置,不更改用户的语言设置。并且使所有的链接指向指定的语言。
// @description:en    This script is used to add a small button to change only the front-end language setting of the web page, not the language set by the user. and make all links point to the specified language.
// @description:ja    このスクリプトは、(ユーザーの言語設定を変更せずに)WebページのUI言語のみを変更するスイッチをページに追加。そして、すべてのリンクが指定した言語に移動するようにする。
// @author            Jasaj
// ==/UserScript==

/* jshint esversion: 6 */

{
	const add_lang_change_btn = (l_txt, l_URL, l_iso) => {
		let theURL = new URL(window.location);
		theURL.searchParams.set("l", l_URL);
		let ele = document.createElement('div');
		ele.classList.add('store_header_btn');
		let elle = ele.appendChild(document.createElement('a'));
		elle.style.padding = "0 5px";
		elle.classList.add('store_header_btn_content');
		elle.appendChild(document.createTextNode(l_txt));
		if (((new URL(window.location)).searchParams.get("l") == l_URL) || (document.documentElement.lang == l_iso)) {
			ele.style["background-color"] = "rgb(255 255 255 / 10%)";
			ele.style.cursor = "not-allowed";
			elle.style.color = "rgb(255 255 255 / 50%)";
		} else {
			ele.classList.add('store_header_btn_gray');
			ele.style.cursor = "pointer";
			elle.onclick = () => { window.location = theURL.href; };
		}
		document.getElementById("cart_status_data").append(ele);
	};

	const change_all_url_lang = (l_URL) => {
		let nodes = document.querySelectorAll('a[href]');
		for (let node of nodes) {
			let theURL = new URL(node.href);
			let hostmap = ["steamcommunity.com", "store.steampowered.com"];
			if (hostmap.includes(theURL.host)) {
				theURL.searchParams.set("l", l_URL);
				node.href = theURL.href;
			}
		}
	};

	const change_all_url_lang_to_current_page_lang = () => {
		steam_lang_btn_map.forEach(v => {
			if (document.documentElement.lang == v[2]) {
				change_all_url_lang(v[1]);
			}
		});
	};

	const hide_es_language_warning = () => {
		let es_language_warning_s = document.getElementsByClassName("es_language_warning");
		if (es_language_warning_s.length > 0) { es_language_warning_s[0].style.display = "none"; }
	};

	// label displayed on button, language tag for URL parameter, iso style language tag for <html lang="xxx">
	let steam_lang_btn_map = [["中", "schinese", "zh-cn"], ["日", "japanese", "ja"], ["英", "english", "en"]];

	steam_lang_btn_map.forEach(v => { add_lang_change_btn(v[0], v[1], v[2]); });



	change_all_url_lang_to_current_page_lang();
	hide_es_language_warning();

	const observer = new MutationObserver(() => { change_all_url_lang_to_current_page_lang(); hide_es_language_warning(); });
	observer.observe(document.body, {
		childList: true,
		subtree: true
	});
}