您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
I18n Function
// ==UserScript== // @name Includes : I18n // @description I18n Function // @author You // @version 1.0 // @include nowhere // @exclude * // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // @grant GM_xmlhttpRequest // @grant GM_getResourceText // @namespace https://greasyfork.org/users/1385333 // ==/UserScript== /************************************************************************** This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. **************************************************************************/ var I18n = { get locale() { return GM_getValue("locale", navigator.language) || ""; }, set locale(value) { GM_setValue("locale", value); }, get: function (item_str, item, obj, callback) { var section = I18n.locale.toLowerCase().replace(/[_-]+/g, "-").split(",").map(function ($0) { return (~$0.indexOf("-") ? $0.substring(0, $0.indexOf("-")) : $0); }), i18n = JSON.parse(GM_getValue("i18n") || '{"version" : -1, "languages" : {}}'), res = { "version" : 0, "languages": {}, }; if (!("languages" in i18n)) { GM_deleteValue("i18n"); i18n = { "version" : -1, "languages" : {} }; } if (typeof item == "function") { callback = item; item = null; obj = null; } else if (typeof obj == "function") { callback = obj; obj = null; } if (item instanceof Array) { obj = item; item = null; } var cb2 = function (str) { return (obj ? str.replace(/\{(\d+)\}/g, function ($0, $1) { return ($1 in obj ? obj[$1] : $0); }) : str); }, cb = function (str) { if (callback) { callback(str, obj); } return cb2(str); }; if (!item) { item = item_str.toLowerCase().replace(/[^\u0100-\uffff\w?,.-]+/g, ""); if (item_str.length && !item) { item = item_str; } } // For compatibility with v2.0.1.0 try { res = JSON.parse(GM_getResourceText("i18n").replace(/^\(|\)$/g, "") || "{}"); if (!("languages" in res)) { res.version = 0; res.languages = res; } } catch (e) { } if (i18n.version < res.version) { i18n.version = res.version; i18n.languages = {}; GM_setValue("i18n", JSON.stringify(i18n)); } if (section.length) { for (let lang of section) { // Updated loop if (lang in res.languages && item in res.languages[lang]) { return cb(res.languages[lang][item]); } else if (lang in i18n.languages && item in i18n.languages[lang]) { return cb(i18n.languages[lang][item]); } } var def = res["default"] || "en", meta = typeof GM_info != "undefined" && GM_info.scriptMetaStr || ""; try { meta = GM_getResourceText("meta"); } catch (e) { } meta += "\n// @language " + def; var metaLang = /^\/\/ @language\s+(\w+)/m.test(meta) && RegExp.$1, translate = function (text, from, to, item) { Translate.execute(text.replace(/\n/g, "<br />"), from, to, function (result) { if (result.translation) { var data = JSON.parse(GM_getValue("i18n") || '{"version":0,"languages":{}}'); if (!(to in data.languages)) { data.languages[to] = {}; } data.languages[to][item] = result.translation.replace(/\s*<br\s*\/?>\s*/g, "\n"); GM_setValue("i18n", JSON.stringify(data)); return cb(data.languages[to][item]); } }); }; for (var key in section) { if (def in res.languages && item in res.languages[def] && res.languages[def][item] != null) { translate(res.languages[def][item], def, section[key], item); return cb2(res.languages[def][item]); } for (var lang in res.languages) { if (lang != def && item in res.languages[lang] && res.languages[lang][item] != null) { translate(res.languages[lang][item], lang, section[key], item); return cb2(res.languages[lang][item]); } } if (metaLang != section[key]) { translate(item_str, metaLang, section[key], item); return cb2(item_str); } } } return cb(item_str); }, }; function __ () { return I18n.get.apply(I18n, Array.prototype.slice.apply(arguments)); }