-
${i18n("settingTitle")}
+
${i18n("settingTitle")}
${i18n("disableOnSite")}
${i18n("urlRegexpTips")}
@@ -1707,7 +1601,8 @@
if(!link){
if(targetA) link=targetA.href;
else link=prompt(i18n("inputLink"),"magnet:?xt=urn:btih:");
- }else{
+ }
+ if(link){
init();
showDiskIcons(link.trim(),mouseEve.pageY-10,mouseEve.pageX-10);
}
diff --git a/Easy offline/README.MD b/Easy offline/README.MD
index 6a26351630d..a0e3ba53343 100644
--- a/Easy offline/README.MD
+++ b/Easy offline/README.MD
@@ -37,14 +37,14 @@ https://github.rc1844.workers.dev${https?://[^/]+(.*)}@@RC1844@@github\.com.*(re
https://ghproxy.fsou.cc/$url@@Fsou@@github\.com.*(releases\/download|archive\/refs\/)@@@@ffff0f
-### 自定義例子2 - Aria2下載
+### 自定義例子2 - Aria2 下載
同樣是點擊下方導入
http://aria.hoothin.com/#!/new/$base64@@Aria2@@@@data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABOFBMVEUAAADSVF7SVF7SVF7LVWDSVF7QVF/SVF7SVF7SVF7SVF7SVF7SVF7RVF7SVF7SVF7SVF7SVF7SVF7SVF7SVF7SVF7SVF5ma4Di4uLSVF7v7+9DQ0NvaX1+ZniUYXGtXGppan+cYG+TYXLs7OyyW2h4tsiVlJWxs7ylpaWgoKBwaX2JZHVRVFxNT1VNTU1KSkxGRkd0uMzKysp5tceHipjDV2JYWFrr5ufa2tvT09Pjycu9v8a5u8PCwsK+vr6rrbego6+Tp62pqamZnKmloaGjj5l5fY+MfY60gozDfIa3foJkaHzTX2hYW2i6UVluSEuK2/Pd3d7X0NLExcm1tbWRlKKbm5uohJCOjo6GhoqOeInPgIh0coV8fHx7e3vRbXbObXaNY3SgX25hYmRhYWHJVmGOTFGNTFENIl9FAAAAF3RSTlMAJNEM+vr1iQjpyFfr6pybmjLusJhyIzaw7jcAAAHlSURBVDjLfZNnU+NADIbXduyQBBLq2fK6JcQmF0gvtOOOztGv90Ln//8Ddm3txkNmeD54vNI7klYrkRFaYT6f0/Vcfr6gkXGUklH13HoQ1F2vapSUZ+6JbKbsmIzvR/zrlDPZibT/lerXTc4fuDJj6r6aCjKTq5gJZwDH+FvJzcj0U8to/A+M93hYnlIwv+qh6RhijkQMNakj66PhF8BBr3cAZwEa/GxcYMbB8284CT90whOZxMnwJKUyHvurG/thpxPub3wykXKR9c8QATZtu7YT9nZqlvVVhDA0Uqji4XDVtrdeM95a1uYhGqsFMi2usGfb9uJWrcb81toeGr1pknfxf8nmLFox79Do5smkKOFNWrAkipgkevCSINBRMJ5CCmSK7ZTg47ZMMSqyHwt+fOOCbl8WObrm0OKC4R0X7A5PxTVlo87pFy5oNrngLz0XjZKtXqH/uIBSLmjRhmw1KSaP1WIuIdiltCUfiyjJc7cp/bm2vt5qd7ufbylt43OPBoayqFEUNZtRZJ42KE0GBkeuwgUr7FIAl5cArHWNdjxyWmpomd+8AXh8ALjmNcuhTY/9AODiAsCXYy9RVN/hGRLuXVafWJz06nmAeLh6z5d3AMjAKCpkHG1hTp3V9Vl1biG1/k8fR16xKi9r1wAAAABJRU5ErkJggg==@@ff2a00
*之所以把Aria2做成自定義是因為每個人的Aria2UI網址都不一樣,用我的伺服器管理本地的Aria2服務需要允許Chrome訪問本地資源,訪問 chrome://flags/#block-insecure-private-network-requests 並關閉即可。不想關閉的話直接打開設置把上面的網址換成自己本地的即可,例如 127.0.0.1
-### 自定義例子3 - Post請求RPC遠程下載
+### 自定義例子3 - Post 請求 RPC 遠程下載
p:http://192.168.32.1:6800/jsonrpc?id=$random&jsonrpc=2.0&method=aria2.addUri¶ms=["token:123456",["$url"]]@@Aria2RPC@@@@@@df2a00
@@ -68,6 +68,11 @@ https://translate.google.com/?client=gtx&dj=1&q=$text&sl=auto&tl=zh-CN&hl=zh-CN&
$text{[^\w\-_\.~!\*'();:@&=\+\$,\/\?#\[\]%]}@@GetLink@@@@@@f9ff9f
+### 自定義例子7 - Post 請求 OpenList(原AList)遠程下載
+
+p:https://alist.domain.com/api/fs/add_offline_download?path=/115网盘/OpList离线下载&tool=115%20Cloud&delete_policy=delete_on_upload_succeed&urls=["$url"]$headers{"Content-Type": "application/json","Authorization": "alist-50a563b4-and-more-token-chars", "Accept": "*/*", "Host": "alist.domain.com", "Connection": "keep-alive"}@@OpenList@@@@@@df2a11
+
+
### Update
- **`Alt + F9`** 自定義下載,選中文本超鏈則下載文本超鏈,鼠標指向鏈接則下載鏈接,沒有選中則彈框輸入鏈接下載
diff --git a/FlashViewer-HTML5 Video/README.md b/FlashViewer-HTML5 Video/README.md
index f066f20599a..94771d645c5 100644
--- a/FlashViewer-HTML5 Video/README.md
+++ b/FlashViewer-HTML5 Video/README.md
@@ -1,4 +1,4 @@
-# [FlashViewer](https://github.com/hoothin/UserScripts/raw/master/FlashViewer-HTML5%20Video/flashViewer.user.js)
+# [FlashViewer⬇️](https://hoothin.github.io/UserScripts/FlashViewer-HTML5%20Video/flashViewer.user.js)
HTML5 視頻增強腳本
原作者 NLF
diff --git a/FlashViewer-HTML5 Video/flashViewer.user.js b/FlashViewer-HTML5 Video/flashViewer.user.js
index f82c580a9d9..e3f508f5e90 100644
--- a/FlashViewer-HTML5 Video/flashViewer.user.js
+++ b/FlashViewer-HTML5 Video/flashViewer.user.js
@@ -2,9 +2,9 @@
// @name flashViewer
// @author NLF & Hoothin
// @description 围观Flash,增加 HTML5 视频速度与亮度调整
-// @version 1.2.1.8
+// @version 1.2.1.9
// @created 2013-12-27
-// @lastUpdated 2023-8-16
+// @lastUpdated 2025-9-24
// @grant none
// @run-at document-start
// @namespace http://userscripts.org/users/NLF
@@ -190,17 +190,17 @@
position: relative !important;
z-index: auto !important;
opacity: 1 !important;
-
+
}
#playBox {
z-index: auto !important;
}
*/
}).cssText,
-
+
},
];
-
+
// 用到的图标
var icons = {
// 浮动工具栏
@@ -219,9 +219,9 @@
restore: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0MjFERUVEODNBNzFFMzExOTZFOUJBOUM1MDc0MDBFNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo5MzBCNUQyMTcyRjMxMUUzOTM2RTg4MTQyQUEyRDU1MiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo5MzBCNUQyMDcyRjMxMUUzOTM2RTg4MTQyQUEyRDU1MiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjAyQkY0RjY0NUM3MUUzMTE5MEQ3RTAwRDBEMUUxQUQ5IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjQyMURFRUQ4M0E3MUUzMTE5NkU5QkE5QzUwNzQwMEU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+KuIDRQAAAPpJREFUeNpi+P//PwM1ACPIIEZGRmxyc4FYCU3sHhAnk2TQwoUL34mJiQkii7169ep9fHy8EDaDmBioBEYNoqNBLEhsbyCOhnH+/v3Liq4YKrYMSWgpEG9FSUfbt29P+fnzZ9OXL18EQBICAgLszMzMTGgG/fvw4cNPEJubm/sjBwdHraen5xyMBAk0LB7InwXks+HzBlDNL6CadKAhC3CmbKBhNkCxjUAxIRyGvAPK+QMNOUIwiwANUwaKbwaKa6IZcgMo5gM05C7ReQ1oGD9QbjVQzhVqyG4gOxRoyEdScz/IMFCs9oPUAXEB0JA/+AKOOgmJWgYBBBgAo+l8rgH6VgYAAAAASUVORK5CYII=',
close: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozMTNFNTRGM0VGNzJFMzExQTk3OEU1QTlDRTYyMTQxMSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1QzU4MzJGMTg4QjkxMUUzOTk4NzlCNUFFM0FFQkRBMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1QzU4MzJGMDg4QjkxMUUzOTk4NzlCNUFFM0FFQkRBMSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjNEMkFFNjFBOEU4OEUzMTFCNkY5QkM5REQ2QTE1QUNEIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjMxM0U1NEYzRUY3MkUzMTFBOTc4RTVBOUNFNjIxNDExIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+gwuo4wAAAahJREFUeNpi/P//PwM1ABMDtQA1XAQygwWJnwbEkUj8WUC8HE1PBBCnI/FXAPFMEANu0Pbt25WAlAOMv2bNGtm5c+e+BjL3QIVckpKSWkJDQ5WRDDrl6emJEUaVQCcug3GCg4OV/f39+4FMKyC2BLFDQkKUkbwDUlsB4zOC/MfIyAhzFdu/f//WMTExeYP4f//+/Tdx4sQLIDUFBQUGzMzMYIuBarYB1QQCXfMLFkYoBkEN4wIacBCoyQTE//37918QzcrKygw1/AxQzh5oyDfkwMYwCGqY6K9fv46ysbGpIosDxe4AxayAhrxGjzWs6Qjk5I6Ojpvo4kCxG0C538QmSHZxcfH+lJQUR3QJkJiEhAQoAtgJGcTCy8vb3NjYGCwlJcUNdfYPEAaxQWINDQ1BIDXISQfdIEZ2dvaq2traRHl5eT6oIX+A4RcOwiA2SAwkB1LDyclZBdKDYRAwOlOrqqqydHV1RWBhCDQgARgmm0AYxAaJgSRAaioqKrJAejAM2rp1q6KZmZk4kgurgAYsRYoAELsKxgepBemhTaalhmFUK48AAgwALD+0S2sZwIQAAAAASUVORK5CYII=',
},
-
+
};
-
+
// 第一时间备份一些方法,防止被页面脚本覆盖掉
var nativeMethods = {
forEach: Array.prototype.forEach,
@@ -249,6 +249,20 @@
};
};
+
+ var escapeHTMLPolicy;
+ if (window.trustedTypes && window.trustedTypes.createPolicy) {
+ escapeHTMLPolicy=window.trustedTypes.createPolicy('pvcep_default', {
+ createHTML: (string, sink) => string,
+ createScriptURL: string => string,
+ createScript: string => string
+ });
+ }
+
+ function createHTML(html){
+ return escapeHTMLPolicy?escapeHTMLPolicy.createHTML(html):html;
+ }
+
//获取窗口大小.
function getWindowSize() {
/*
@@ -287,35 +301,35 @@
x: 'pageXOffset' in window ? window.pageXOffset : de.scrollLeft || body.scrollLeft,
y: 'pageYOffset' in window ? window.pageYOffset : de.scrollTop || body.scrollTop,
};
- };
-
+ };
+
// 事件支持检测.
// 比如 eventSupported('fullscreenchange', document);
function eventSupported(eventName, elem) {
elem = elem || document.createElement('div');
var prefix = ['o', 'ms', 'moz', 'webkit', ''];
-
+
var l = prefix.length;
var pEventName;
var isFunction;
var setAttr;
-
+
while(l --) {
pEventName = 'on' + prefix[l] + eventName;
-
+
if (pEventName in elem) {
return pEventName.slice(2);
- } else if (typeof elem.setAttribute == 'function') { // setAttribute 是元素节点的方法
+ } else if (typeof elem.setAttribute == 'function') { // setAttribute 是元素节点的方法
setAttr = false;
if (!elem.hasAttribute(pEventName)) {
setAttr = true;
elem.setAttribute(pEventName, 'return;');
};
-
+
isFunction = typeof elem[pEventName] == 'function';
-
+
if (setAttr) elem.removeAttribute(pEventName);
-
+
if (isFunction) {
return pEventName.slice(2);
};
@@ -329,7 +343,7 @@
// 在指定对象上保存数据
var data = (function () {
'use strict';
-
+
var cache = {
objs: [],
data: {},
@@ -350,7 +364,7 @@
return cache.data[id][key] = value;
};
};
-
+
return data;
})();
@@ -367,7 +381,7 @@
mouseleave : 'mouseout',
mouseenter : 'mouseover',
};
-
+
return {
add : function (type, ele, callback) { //事件类型,元素,监听函数
if (support[type]) {
@@ -385,7 +399,7 @@
};
data(callback, 'mouseELListener', listener);
};
-
+
ele.addEventListener(map[type], listener, true);
};
},
@@ -411,7 +425,7 @@
// console.log(matched);
ret[matched[1]] = matched[2];
};
-
+
return ret;
};
@@ -419,12 +433,12 @@
function cloneObject(obj, deep) {
var value;
var ret = Array.isArray(obj) ? [] : {};
-
+
for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;
-
+
value = obj[key];
-
+
if (value === obj) {// 引用自己
ret[key] = ret;
} else if (deep && (Array.isArray(value) || Object.prototype.toString.call(value) == '[object Object]')) {
@@ -441,7 +455,7 @@
// 比如proSupported('requestFullscreen');
function proSupported(proName, obj) {
obj = obj || document.createElement("div");
-
+
if (proName in obj)
return proName;
@@ -536,38 +550,38 @@
return false;
};
-
+
// 特性支持情况
var support = {
MutationObserver: proSupported('MutationObserver', window),
cssBoxSizing: cssProSupported('box-sizing'),
-
+
// 请求全屏
requestFullscreen: proSupported('requestFullscreen') || proSupported('requestFullScreen'),
// 返回当前页面是否允许全屏
fullscreenEnabled: proSupported('fullscreenEnabled', document) || proSupported('fullScreenEnabled', document),
// 返回当前全屏的元素,否则返回null
fullscreenElement: proSupported('fullscreenElement', document)
- || proSupported('fullScreenElement', document)
+ || proSupported('fullScreenElement', document)
|| proSupported('currentFullScreenElement', document),
// fullscreen 事件
fullscreenchange: eventSupported('fullscreenchange', document),
-
+
};
// console.log(support);
-
+
// fx库
var fx = (function () {
'use strict';
-
+
function $(selector, context) {
return new init(selector, context);
};
-
+
function init(selector, context) {
-
+
if (selector instanceof HTMLElement) { // 单个 html element 节点
[].push.call(this, selector);
return this;
@@ -581,22 +595,22 @@
unique.push(node);
};
});
-
+
[].push.apply(this, unique);
return this;
};
-
+
if (typeof selector == 'string') {// css字符串
if (!context || !context.nodeType || context.nodeType != 1) {// 不是元素节点的话,context指向document
context = document;
};
selector = context.querySelectorAll(selector); // NodeList
-
+
[].push.apply(this, selector);
return this;
};
-
- if (selector instanceof NodeList) {// NodeList
+
+ if (selector instanceof NodeList) {// NodeList
// 去除非元素节点
var elems = [];
each(selector, function () {
@@ -604,11 +618,11 @@
elems.push(this);
};
});
-
+
[].push.apply(this, elems);
return this;
};
-
+
if (selector instanceof HTMLCollection) { // HTMLCollection
[].push.apply(this, selector);
return this;
@@ -622,9 +636,9 @@
fn.call(elem);
});
};
-
+
init.prototype = {
-
+
animate: function (pros, opts) {
// 判断pros是否有属性
for (var pro in pros) {
@@ -632,30 +646,30 @@
break;
};
if (!pro) return this;
-
+
// 修正opts参数
if (!opts) {
opts = {};
};
-
+
// 动画持续时间
if (typeof opts.duration != 'number') {
opts.duration = 400;
};
-
+
// 动画算法
if (!opts.easing || !easing[opts.easing]) {
opts.easing = 'swing';
};
-
+
// 是否将动画放入队列
if (opts.queue !== false) {
opts.queue = true;
};
-
+
// 为每个属性指定特定的动画方法
opts.specialEasing = opts.specialEasing || {};
-
+
// 每个元素的所有属性动画完成之后都会调用
opts.complete = opts.complete || emptyFn;
// 封装complete
@@ -666,14 +680,14 @@
$(this).dequeue();
};
};
-
+
// 每个元素的每个属性的每一步都会调用
opts.step = opts.step || emptyFn;
-
-
+
+
return this[opts.queue ? 'queue' : 'each'](function () {
var elem = this;
-
+
// 复制pros对象
var prosC = cloneObject(pros);
// 复制opts对象
@@ -698,16 +712,16 @@
// 判断toggle是该执行show还是hide动画
if (value === 'toggle') {
value = isHidden ? 'show' : 'hide';
-
+
for (pro in prosC) {
if (!prosC.hasOwnProperty(pro)) continue;
prosC[pro] = value;
};
};
-
-
+
+
var style = elem.style;
-
+
var allAniData = [];
if (value === 'show') {// show操作
if (!isHidden) {
@@ -724,18 +738,18 @@
};
optsC.show = true;// 标记show操作
-
+
} else if (value === 'hide') {// hide操纵
if (isHidden) {
optsC.completeW.call(elem);
return;
};
-
+
optsC.hide = true;// 标记show操作
};
-
-
-
+
+
+
// 获取当前值
function getCur(pro) {
if (pro in style) {
@@ -744,7 +758,7 @@
return elem[pro];
};
};
-
+
var start;// 开始
var end;// 结束
var unit;// 单位
@@ -760,10 +774,10 @@
if (!prosC.hasOwnProperty(pro)) continue;
value = prosC[pro];
-
+
// 备份当前值,show或者hide操作的时候最后还原样式。
optsC.orig[pro] = style[pro];
-
+
if (value === 'show') {
start = 0;
end = parseFloat(cS[pro]);
@@ -783,10 +797,10 @@
if (parts) {
unit = parts[3];
end = parseFloat(parts[2]);
-
+
start = getCur(pro).toString();
parts2 = start.match(reg);
-
+
if (parts2) {
start = parseFloat(parts2[2]);
unit2 = parts2[3];
@@ -795,14 +809,14 @@
style[pro] = (end || 1) + unit;
start = ((end || 1) / parseFloat(getCur(pro))) * start;
};
-
+
if (parts[1]) {// +=/-=,做相对运行
end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
};
};
};
};
-
+
if (typeof start == 'number' && typeof end == 'number' && typeof unit == 'string') {
allAniData.push([elem, pro, optsC, start, end, unit]);
// new FX(elem, pro, optsC).custom(start, end, unit);// 开始动画
@@ -810,39 +824,39 @@
optsC.curAnim[pro] = true;
};
};
-
+
// 等所有动画数据都获取完成后才开始动画,
// 否则对于show之类的操作,如果width先绘制第一帧设置width为0之后,容器会发生伸缩,导致height的可能获取不正确
allAniData.forEach(function (data) {
new FX(data[0], data[1], data[2]).custom(data[3], data[4], data[5]);
});
-
+
});
-
+
},
-
+
show: function (opts) {
return this.animate(genFx('show', {
o: true,
- v: true,
+ v: true,
h: true,
}), opts);
},
hide: function (opts) {
return this.animate(genFx('hide', {
- o: true,
- v: true,
+ o: true,
+ v: true,
h: true,
}), opts);
},
toggle: function (opts) {
return this.animate(genFx('toggle', {
- o: true,
- v: true,
+ o: true,
+ v: true,
h: true,
}), opts);
},
-
+
fadeIn: function (opts) {
return this.animate(genFx('show', {
o: true,
@@ -863,32 +877,32 @@
opacity: opacity,
}, opts);
},
-
+
slideDown: function (opts) {
return this.animate(genFx('show', {
- v: true,
+ v: true,
o: true,
}), opts);
},
slideUp: function (opts) {
return this.animate(genFx('hide', {
- v: true,
+ v: true,
o: true,
}), opts);
},
slideToggle: function (opts) {
return this.animate(genFx('toggle', {
- v: true,
+ v: true,
o: true,
}), opts);
},
-
+
// 立即停止当前动画
stop: function (clearQueue, jumpToEnd) {
if (clearQueue) {
this.clearQueue();
};
-
+
this.each(function () {
for (var i = timers.length - 1; i >= 0; i--) {
if (timers[i].elem == this) {//是当前元素的属性动画
@@ -902,13 +916,13 @@
if (!jumpToEnd) {
this.dequeue();
};
-
-
+
+
return this;
- },
+ },
clearQueue: function () {
this.queue([]);
-
+
return this;
},
delay: function (duration) {
@@ -919,67 +933,67 @@
}, duration);
});
},
-
-
+
+
each: function (fn) {
each(this, fn);
-
+
return this;
},
queue: function (fn, type) {
type = type || 'fx';
-
+
return this.each(function () {
-
+
// 取出队列
var q = data(this, type + 'queue');
if (!q) {// 初始化
q = [];
};
-
-
+
+
if (typeof fn == 'function') {
q.push(fn);
} else if (Array.isArray(fn)) { // array类型,直接覆盖掉
q = fn;
};
-
+
data(this, type + 'queue', q);
-
+
if (type == 'fx' && q.length == 1) { // 如果动画队列中只有自己,立即执行
q[0].call(this);
};
-
+
});
},
dequeue: function (type) {
type = type || 'fx';
-
+
return this.each(function () {
// 取出队列
var q = data(this, type + 'queue');
if (!q) {// 初始化
q = [];
};
-
+
q.shift();// 删除第一个
-
+
data(this, type + 'queue', q);
-
+
if (q[0]) {
q[0].call(this);
};
-
+
});
},
};
-
+
//对象克隆,接受{}和[]
function cloneObject(obj, deep) {
var value;
var ret = Array.isArray(obj) ? [] : {};
-
+
for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;
value = obj[key];
@@ -996,17 +1010,17 @@
function now() {
return Date.now();
};
-
+
// 空函数
function emptyFn() {
};
-
+
// 在指定对象上保存数据
var data = (function () {
'use strict';
-
+
var cache = {
objs: [],
data: {},
@@ -1027,17 +1041,17 @@
return cache.data[id][key] = value;
};
};
-
+
return data;
})();
-
+
var timers = [];
var aning = null;
- var requestAF = window.requestAnimationFrame ||
- window.webkitRequestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.msRequestAnimationFrame ||
+ var requestAF = window.requestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ window.mozRequestAnimationFrame ||
+ window.msRequestAnimationFrame ||
window.oRequestAnimationFrame;
// 算法
@@ -1055,9 +1069,9 @@
var pros = {
o: ['opacity',],
h: ['width', 'paddingLeft', 'paddingRight', 'borderLeftWidth', 'borderRightWidth', 'marginLeft', 'marginRight',],
- v: ['height', 'paddingTop', 'paddingBottom', 'borderTopWidth', 'borderBottomWidth', 'marginTop', 'marginBottom',],
+ v: ['height', 'paddingTop', 'paddingBottom', 'borderTopWidth', 'borderBottomWidth', 'marginTop', 'marginBottom',],
};
-
+
var ret = {};
for (var i in pros) {
if (!pros.hasOwnProperty(i)) continue;
@@ -1067,10 +1081,10 @@
});
};
};
-
+
return ret;
};
-
+
// 绘制动画
function draw() {
for ( var i = 0, l = timers.length; i < l; i++ ) {
@@ -1088,7 +1102,7 @@
};
};
-
+
// 每个属性创建一个FX实例
function FX(elem, pro, opts) {
// 配置
@@ -1098,28 +1112,28 @@
// 动画属性
this.pro = pro;
};
-
+
FX.off = false;// 关闭动画
-
+
FX.prototype = {
// 更新属性值
update: function () {
var pro = this.pro;
var elem = this.elem;
var opts = this.opts;
-
+
// 调用step函数,可以修改this对象
opts.step.call( elem, this.now, this );
-
+
var style = elem.style;
-
+
if (pro in style) {
if ((pro == 'height' || pro == 'width') && typeof opts.overflowX == 'undefined') {
opts.overflowX = style.overflowX;
opts.overflowY = style.overflowY;
style.overflow = 'hidden';
};
-
+
style[pro] = this.now + this.unit;
} else if (pro in elem) {
elem[pro] = this.now;
@@ -1128,14 +1142,14 @@
// 开启动画
custom: function (from, to, unit) {
this.startTime = now();//动画开始时间
-
+
this.start = from;//位置开始点
this.end = to;//位置结果点
-
+
this.unit = unit;// 单位
-
+
this.now = this.start;//位置当前点
-
+
//pos是按一定算法把时间上的比率折算到位置上的比率
//state是时间间隔在总的duration的比率
this.pos = this.state = 0;
@@ -1148,10 +1162,10 @@
return self.step(jumpToEnd);
};
t.elem = this.elem;//删除的时候做判断用
-
+
//timers栈是公共的,不同的元素的不同的属性step都是放在这里面。
timers.push(t);
-
+
if ( aning == null ) {
aning = true;
requestAF(draw);
@@ -1160,24 +1174,24 @@
},
step: function (jumpToEnd) {
var t = now();//运行到当前的时间
-
+
var opts = this.opts;
-
+
// 强行指定结束或当前时间大于startTime+duration
if (FX.off || jumpToEnd || t >= opts.duration + this.startTime ) {
this.now = this.end;//当前的位置为结束位置
this.pos = this.state = 1;//当前的state,pos的比率为1.最大。
this.update();//显示
-
+
//标识这个属性的动画已经完成
var curAnim = opts.curAnim;
curAnim[ this.pro ] = true;
-
+
//再一次判断是否这个元素的所有属性都已完成
var done = true;
for ( var i in curAnim ) {
if (!curAnim.hasOwnProperty(i)) continue;
-
+
if ( curAnim[i] !== true ) {
done = false;
break;
@@ -1186,7 +1200,7 @@
if ( done ) {
var style = this.elem.style;
-
+
if (opts.hide || opts.show) {
if (opts.hide) {
style.display = 'none';
@@ -1194,7 +1208,7 @@
style.setProperty('display', 'none', 'important');
};
};
-
+
// 还原css属性
var orig = opts.orig;
for (var i in orig) {
@@ -1202,21 +1216,21 @@
style[i] = orig[i];
};
};
-
+
if (typeof opts.overflowX != 'undefined') {
style.overflowX = opts.overflowX;
style.overflowY = opts.overflowY;
};
-
+
// 执行回调函数
opts.completeW.call( this.elem );
};
-
+
return false;
- };
-
-
+ };
+
+
var n = t - this.startTime;//时间间隔
this.state = n / opts.duration;//时间间隔比率
@@ -1228,29 +1242,29 @@
// 显示
this.update();
-
+
return true;
-
+
},
};
-
-
+
+
return $;
-
+
})();
-
-
+
+
var url = location.href;
-
-
+
+
// 重新初始化插件
function reinitPlugin(plugin) {
// 重载flash让参数生效
// chrome firefox 切换display none就能引发重载,ie不行。
// chrome firefox 删除后,添加进dom引发重载,ie不行
// chrome 切换常规流绝对定位流引发重载,ie不行
-
+
var pluNS = plugin.nextSibling;
var pluPN = plugin.parentNode;
pluPN.removeChild(plugin);
@@ -1263,7 +1277,7 @@
pluPN.appendChild(plugin);
};
}, 20);
-
+
/* var pStyle = plugin.style;
var oSDis = pStyle.display;
pStyle.display = 'none';
@@ -1278,7 +1292,7 @@
// 找到的插件统统由这个函数处理
function initializer(plugins) {
// console.log(plugins);
-
+
plugins.forEach(function (plugin) {
// plugin是否在已插入文档中
@@ -1289,7 +1303,7 @@
var src;
var type;
var isObject = plugin.nodeName == 'OBJECT';
-
+
if (isObject) {
if (plugin.hasAttribute('data')) {
src = plugin.data;
@@ -1297,11 +1311,11 @@
if (plugin.hasAttribute('type')) {
type = plugin.type;
};
-
+
if (src === undefined || type === undefined) {
nativeMethods.some.call(plugin.children, function (child){
if (child.nodeName != 'PARAM') return;
-
+
var key = child.name;
var value = child.value;
if (/^(?:src|movie)$/i.test(key)) {
@@ -1314,7 +1328,7 @@
};
});
};
-
+
type = type || '';
} else {// embed标签
src = plugin.src;
@@ -1325,7 +1339,7 @@
// 如果不存在src或者不是flash插件
if (!src || !/^(?:|application\/x-shockwave-flash)$/i.test(type)) return;
-
+
// 匹配到的规则
var matched;
rules.some(function (rule) {
@@ -1340,10 +1354,10 @@
var pFragment;
function addParamO(name, value) {
name = name.toLowerCase();
-
+
if (!nativeMethods.some.call(plugin.children, function (child) {
if (child.nodeName != 'PARAM') return;
-
+
if (child.name.toLowerCase() == name){
if (name == 'flashvars'){
child.value = gFlashVars(child.value, value);
@@ -1361,24 +1375,24 @@
pFragment = pFragment ? pFragment : document.createDocumentFragment();
pFragment.appendChild(param);
};
-
+
};
// 生成新的flashvars字符串
function gFlashVars(oValue, add) {
if (!oValue) return add;
if (!add) return oValue;
-
+
// 转成数组 ['a=1', 'b=2', 'c=']之类的形式
oValue = oValue.split('&');
add = add.split('&');
// 转成字典 {a:'1', b:'2', c:''}之类的形式
var oVDict = {};
-
+
function gDict(kv) {
if (!kv) return;
-
+
var index = kv.indexOf('=');
if (index == -1) {
if (kv !=' ') {
@@ -1390,11 +1404,11 @@
};
};
};
-
+
// 用新的值覆盖旧的值
oValue.forEach(gDict);
add.forEach(gDict);
-
+
// 转会字符串
var fVars = [];
for (var key in oVDict) {
@@ -1437,37 +1451,37 @@
addParamO('flashVars', fvs);
} else {
plugin.setAttribute('flashVars', gFlashVars(plugin.getAttribute('flashVars') || '', fvs));
-
+
};
};
if (pFragment) {
plugin.appendChild(pFragment);
};
-
+
// 标记已经修改
plugin.fvReInitialized = true;
-
+
reinitPlugin(plugin);
});
};
-
-
+
+
// 一些规则根据excludes强行设置enabled为false
rules.forEach(function (rule) {
if (rule.hasOwnProperty('excludes') && rule.excludes.test(url)) {
// console.log('根据excludes禁用规则', rule);
rule.enabled = false;
};
-
+
});
-
+
// 先处理脚本运行前已经加载的flash
initializer([].slice.call(document.querySelectorAll('object, embed'), 0));
-
-
+
+
// 建立一个监视事件,处理后来追加的插件
if(support.MutationObserver)
(new window[support.MutationObserver](function (mRecords) {
@@ -1485,26 +1499,26 @@
if (/^(?:OBJECT|EMBED)$/.test(node.nodeName)) {
wPlugins.push(node);
};
-
+
[].push.apply(wPlugins, node.querySelectorAll('object, embed'));
-
+
});
-
+
});
// console.log(wPlugins);
-
+
initializer(wPlugins);
})).observe(document, {
- childList: true,
- subtree: true,
+ childList: true,
+ subtree: true,
});
-
-
+
+
};
-
+
if (prefs.allowReinitFlash) {
// console.log(document.contentType);
// 修复firefox标签单独请求一个flash,加载本脚本后导致不能正常加载flash的问题
@@ -1514,8 +1528,8 @@
};
};
-
-
+
+
// --------------------------------------------
// 弹出视频
function PopVideo(video) {
@@ -1530,7 +1544,7 @@
PopVideo.timerId = null;
PopVideo.scrollFx = null;
PopVideo.topVideo = null;
-
+
PopVideo.prototype = {
lighting: true,
@@ -1539,26 +1553,103 @@
isFullscreen: false,
minWidth: 325,
minHeight: 150,
-
+
+ scale: function (e) {
+ if (this.pinned || this.maximized) return;
+ if (e.deltaY > 0) {
+ this.zoomLevel += -0.1;
+ if (this.zoomLevel > 3) this.zoomLevel = 1;
+ else if (this.zoomLevel < 0.1) this.zoomLevel = 0.1;
+ } else {
+ this.zoomLevel += 0.1;
+ if (this.zoomLevel < 0.5) this.zoomLevel = 1;
+ }
+ var oriSize = {
+ h: parseInt(this.vOriStyle.height),
+ w: parseInt(this.vOriStyle.width)
+ };
+ var afterSize = {
+ h: oriSize.h * this.zoomLevel || 10,
+ w: oriSize.w * this.zoomLevel || 10,
+ };
+ var controlLayerSize = {
+ h: parseInt(this.controlLayer.style.height),
+ w: parseInt(this.controlLayer.style.width)
+ };
+ var ratio = {
+ x: e.offsetX / controlLayerSize.w,
+ y: e.offsetY / controlLayerSize.h
+ };
+ this.controlLayer.style.width = afterSize.w + "px";
+ this.controlLayer.style.height = afterSize.h + "px";
+ this.controlLayer.style.top = parseInt(this.controlLayer.style.top) - (afterSize.h - controlLayerSize.h) * ratio.y + "px";
+ this.controlLayer.style.left = parseInt(this.controlLayer.style.left) - (afterSize.w - controlLayerSize.w) * ratio.x + "px";
+ e.preventDefault();
+ },
+
+ videoMouseDown: function (e) {
+ if (this.zoomLevel === 1) return;
+ e.stopPropagation();
+ let self = this, mousemoved = false;
+ let oriPos = {
+ x: parseInt(this.controlLayer.style.left),
+ y: parseInt(this.controlLayer.style.top)
+ };
+ let oriMouse = {
+ x: e.pageX,
+ y: e.pageY
+ };
+ let mouseupHandler = e => {
+ document.removeEventListener("mouseup", mouseupHandler);
+ document.removeEventListener("mousemove", mousemoveHandler);
+ if (mousemoved) {
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ };
+ let mouseclickHandler = e => {
+ document.removeEventListener("click", mouseclickHandler);
+ if (mousemoved) {
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ };
+ let mousemoveHandler = e => {
+ mousemoved = true;
+ self.controlLayer.style.top = oriPos.y + (e.pageY - oriMouse.y) + "px";
+ self.controlLayer.style.left = oriPos.x + (e.pageX - oriMouse.x) + "px";
+ e.preventDefault();
+ e.stopPropagation();
+ };
+ document.addEventListener("mouseup", mouseupHandler);
+ document.addEventListener("click", mouseclickHandler);
+ document.addEventListener("mousemove", mousemoveHandler);
+ },
+
init: function () {
this.addStyle();
-
+
var self = this;
-
+
var video = this.video;
this.vOriControls = video.controls;
var vNodeName = video.nodeName;
-
+
// 如果是这些元素,那么pin的时候直接用fixed方式(这些元素随便调整position不会引发重载)
- var fixedPin = /^(?:IFRAME|VIDEO|AUDIO)$/.test(vNodeName);
+ var fixedPin = /^(?:IFRAME|VIDEO|AUDIO|CANVAS)$/.test(vNodeName);
this.fixedPin = fixedPin;
-
+
video.fvPopVideo = true;// 标记弹出中。
-
+ this.zoomLevel = 1;
+ video.addEventListener("wheel", this.scale.bind(this));
+ if (vNodeName === "VIDEO") {
+ video.addEventListener("mousedown", this.videoMouseDown.bind(this), true);
+ }
+
// 很多网站加载flash为了兼容现代浏览器和ie,经常使用 object classid嵌套object或者embed的格式
var vPEIsObject;
var vCEIsPlugin;
-
+
if (/^(?:EMBED|OBJECT)$/.test(vNodeName)) {// object,embed标签
if ((vPEIsObject = video.parentElement) && vPEIsObject.nodeName == 'OBJECT') {// 弹出的是被嵌套的object或者embed
vPEIsObject.fvPopVideo = true;
@@ -1573,23 +1664,23 @@
} else if(/^(?:VIDEO|AUDIO)$/.test(vNodeName)) {// html5 video,audio标签
video.controls = true; // 显示播放控件
} else {// iframe 标签
-
+
};
-
+
// 创建创造关灯效果的黑色覆盖层
var fixedOverlayer = document.createElement('fvspan');
this.fixedOverlayer = fixedOverlayer;
fixedOverlayer.className = 'fv-p-v-light-off';
document.body.appendChild(fixedOverlayer);
-
+
// 创建控制video缩放的控制层,放在video的下面,但是在light层的上面
var controlLayer = document.createElement('fvspan');
this.controlLayer = controlLayer;
controlLayer.className = 'fv-p-v-control-layer';
- controlLayer.innerHTML = getMStr(function () {
+ controlLayer.innerHTML = createHTML(getMStr(function () {
var innerHTML;
/*
@@ -1633,7 +1724,6 @@
-
@@ -1654,16 +1744,16 @@
*/
- }).innerHTML;
-
+ }).innerHTML);
+
document.body.appendChild(controlLayer);
-
+
// 获取元素
var cTitleBar = controlLayer.querySelector('.fv-p-v-control-title-bar');
this.cTitleBar = cTitleBar;
-
+
this.cSizeInfo = controlLayer.querySelector('.fv-p-v-control-size-info');
-
+
var cCommandL = controlLayer.querySelector('.fv-p-v-control-light');
this.cCommandL = cCommandL;
var cCommandP = controlLayer.querySelector('.fv-p-v-control-pin');
@@ -1713,22 +1803,22 @@
// 监听标题栏的命令点击
cTitleBar.addEventListener('click', function (e) {
if (e.button != 0) return;
-
+
var target = e.target;
var classList = target.classList;
-
+
if (!classList.contains('fv-p-v-control-command')) return;
-
+
switch (target) {
case cCommandL:
self.toggleLight();
- break;
+ break;
case cCommandP:
self.togglePin();
- break;
+ break;
case cCommandM:
self.toggleMaximize();
- break;
+ break;
case cCommandR:
self.restore();
break;
@@ -1748,20 +1838,20 @@
self.restore(true);
break;
};
-
+
}, true);
-
+
// 双击标题栏切换最大化和还原
cTitleBar.addEventListener('dblclick', function (e) {
if (e.button != 0) return;
-
+
var target = e.target;
if (target != this) return;
-
+
self.toggleMaximize();
}, true);
-
-
+
+
// 给resize添加监听函数
controlLayer.addEventListener('mousedown', function (e) {
if (e.button != 0) return;// 非左键
@@ -1772,7 +1862,7 @@
var classList = target.classList;
// 如果不是缩放手柄和标题栏
if (!classList.contains('fv-p-v-control-resize-hand') && target != cTitleBar) return;
-
+
e.preventDefault(); // 禁止拖曳的时候选中文字
// 点击时鼠标的位置,controlLayer 的长宽,top left的坐标
@@ -1785,32 +1875,33 @@
left: parseFloat(cLS.left),
};
var size = {
- height: parseFloat(cLS.height),
+ height: parseFloat(cLS.height),
width: parseFloat(cLS.width),
};
-
+
// 缩放处理函数
function reize(allowSize, allowOffset) {
-
+
function move(e) {
video.style.transform = "";
+ cCommandRatio.value = "";
var mCoorA = {
pageX: e.pageX,
pageY: e.pageY,
};
-
+
var height;
if (allowSize.height) {
var yMove = mCoorA.pageY - mCoor.pageY;
height = (allowSize.hMinus ? -yMove : yMove) + size.height;
};
-
+
var minHeight = self.minHeight;
-
+
if (allowOffset.top) {
var top = offset.top + mCoorA.pageY - mCoor.pageY;
-
+
if (typeof height == 'number') {
if (height >= minHeight) {
if (top >= 0) {
@@ -1830,20 +1921,20 @@
} else {
cLS.height = Math.max(minHeight, height) + 'px';
};
-
-
-
+
+
+
var width;
if (allowSize.width) {
var xMove = mCoorA.pageX - mCoor.pageX;
width = (allowSize.wMinus ? -xMove : xMove) + size.width;
};
-
+
var minWidth = self.minWidth;
-
+
if (allowOffset.left) {
var left = offset.left + mCoorA.pageX - mCoor.pageX;
-
+
if (typeof width == 'number') {
if (width >= minWidth) {
if (left >= 0) {
@@ -1857,42 +1948,42 @@
cLS.left = left - (minWidth - width) + 'px';
cLS.width = minWidth + 'px';
};
-
+
} else { // 单纯的移动
cLS.left = Math.max(0, left) + 'px';
};
} else {
cLS.width = Math.max(minWidth, width) + 'px';
};
-
-
+
+
};
-
-
+
+
// 结束拖拽
function up() {
PopVideo.movingHelperStyle.disabled = true;
-
+
// 重新订一下
if (self.pinned) {
self.beforePin();
-
+
if (!fixedPin) {
self.unpin();
self.pin();
};
};
-
+
document.removeEventListener('mousemove', move, true);
document.removeEventListener('mouseup', up, true);
};
-
+
document.addEventListener('mousemove', move, true);
document.addEventListener('mouseup', up, true);
};
-
+
// 移动的时候取消iframe的pointer-events,否则移动到iframe上面的时候mousemove事件检测不到。
PopVideo.movingHelperStyle.disabled = false;
@@ -1906,7 +1997,7 @@
} else if (classList.contains('fv-p-v-control-resize-hand-n')) {// 北
reize({
height: true,
-
+
hMinus: true,// 标记反向
}, {
top: true,
@@ -1919,7 +2010,7 @@
} else if (classList.contains('fv-p-v-control-resize-hand-w')) {// 西
reize({
width: true,
-
+
wMinus: true,// 标记反向
}, {
left: true,
@@ -1928,12 +2019,12 @@
reize({
width: true,
}, {
- });
+ });
} else if (classList.contains('fv-p-v-control-resize-hand-nw')) {// 西北
reize({
width: true,
height: true,
-
+
wMinus: true,
hMinus: true,
}, {
@@ -1945,25 +2036,25 @@
width: true,
height: true,
}, {
- });
+ });
} else if (classList.contains('fv-p-v-control-resize-hand-ne')) {// 东北
reize({
width: true,
height: true,
-
+
hMinus: true,
}, {
top: true,
- });
+ });
} else if (classList.contains('fv-p-v-control-resize-hand-sw')) {// 西南
reize({
width: true,
height: true,
-
+
wMinus: true,
}, {
left: true,
- });
+ });
};
}, true);
@@ -1975,34 +2066,34 @@
mouseEventListener.add('mouseenter', video, this.videoEnterHandler);
mouseEventListener.add('mouseenter', controlLayer, this.videoEnterHandler);
-
+
// 调整前video的位置
var vCCliRect = getContentClientRect(video);
// console.log(vCCliRect);
-
+
// 控制层的大小和video保持一致
var cLS = controlLayer.style;
cLS.width = Math.max(vCCliRect.width, this.minWidth) + 'px';// 内容区域的宽度
cLS.height = Math.max(vCCliRect.height, this.minHeight) + 'px';// 内容区域的高度
-
-
+
+
// 为了以后还原,先保存一些需要更改的旧值
var vOriStyle = {};
this.vOriStyle = vOriStyle;
-
+
var vStylePros = [
- 'position', 'z-index',
- 'width', 'height',
- 'top', 'left',
+ 'position', 'z-index',
+ 'width', 'height',
+ 'top', 'left',
];
-
+
var vS = video.style;
-
+
vStylePros.forEach(function (pro) {
vOriStyle[pro] = [vS.getPropertyValue(pro), vS.getPropertyPriority(pro)];
});
// console.log(vOriStyle);
-
+
// 如果是特殊站点,通过特殊规则修复兼容
popVideoRules.some(function (rule) {
@@ -2014,24 +2105,24 @@
style.textContent = rule.css;
var parentNode = document.head || document.documentElement;
parentNode.appendChild(style);
-
+
self.removePopVideoFix = function () {
parentNode.removeChild(style);
};
break;
-
+
};
-
+
return true;
};
});
// 修改video样式
video.classList.add('fv-p-v-video');
-
+
vS.setProperty('top', 0, 'important');
vS.setProperty('left', 0, 'important');
-
+
// 用zindex提升flash层级,先设置position为relative或absolute
// 为避免更改position导致flash重载,不要让flash在常规流和绝对定位之间切换(chrome)
@@ -2041,7 +2132,7 @@
vS.setProperty('position', 'absolute', 'important');
};
-
+
// 允许flash到最高层,不要被祖父级别的层叠上下文给限制主。 设置祖先的z-index为auto
// 允许调整大小,设置祖先(包含块)的overflow等于 visible
var ancestor = video;
@@ -2051,10 +2142,10 @@
var ancestors = []; //保存所有的祖先的引用
this.ancestors = ancestors;
var docBody = document.body;
-
+
while ((ancestor = ancestor.parentElement) && ancestor != docBody) {
ancestors.push(ancestor);
-
+
ancestorData = data(ancestor, 'data');
if (ancestorData) {// 保存的修改之前的样式数据
ancestorData.count ++ ;// 多个video共用的祖先,标记+1。还原的时候,检测这个值,如果不等于1就不还原这个祖先元素的样式
@@ -2067,12 +2158,12 @@
'overflow-y': [ancestorStyle.getPropertyValue('overflow-y'), ancestorStyle.getPropertyPriority('overflow-y')],
'z-index': [ancestorStyle.getPropertyValue('z-index'), ancestorStyle.getPropertyPriority('z-index')],
'position': [ancestorStyle.getPropertyValue('position'), ancestorStyle.getPropertyPriority('position')],
- },
+ },
};
// 保存
data(ancestor, 'data', ancestorData);
-
+
ancestorStyle.setProperty('overflow', 'visible', 'important');
ancestorStyle.setProperty('z-index', 'auto', 'important');
// 有绝对定位的父元素,改成absolute。
@@ -2081,7 +2172,7 @@
};
}
};
-
+
// 注册controlLayer的监控函数,让video永远跟着走。
if(support.MutationObserver){
@@ -2091,16 +2182,16 @@
});
this.cLObserver = cLObserver;
-
+
cLObserver.observe(controlLayer, {
attributes: true,
attributeFilter: ['style'],
});
}
-
-
-
+
+
+
// 让控制层摆放在视频弹出前所在的位置
cLS.top = 0;
cLS.left = 0;
@@ -2108,20 +2199,20 @@
// 保证top不要小于0否则标题栏会到窗口外面去。
cLS.top = Math.max(vCCliRect.top - cLCCliRect.top, 0) + 'px';
cLS.left = vCCliRect.left - cLCCliRect.left + 'px';
-
-
+
+
// 一定的时间之内,同步一次位置
PopVideo.all.push(this);
-
+
if (!PopVideo.timerId) {
PopVideo.timerId = setInterval(function () {
-
+
var all = PopVideo.all;
-
+
all.forEach(function (obj) {
obj.followControlLayer();
});
-
+
if (!all.length) {
clearInterval(PopVideo.timerId);
PopVideo.timerId = null;
@@ -2133,7 +2224,7 @@
this.wResizeListener = function () {
self.followControlLayer();
};
-
+
window.addEventListener('resize', this.wResizeListener, true);
// 全屏事件监听
@@ -2141,36 +2232,36 @@
// 退出全屏
var fsE = document[support.fullscreenElement];
// console.log('全屏元素:', fsE);
-
+
if (!fsE) {
self.exitFullscreen();
} else if (fsE == video) {
self.fullscreen();
};
};
-
+
document.addEventListener(support.fullscreenchange, this.fullscreenchangeListener, true);
-
-
+
+
// 提升到顶层
this.setZIndex();
-
+
// 关灯
if (prefs.popVideo.lightOff.enabled) {
this.lightOff();
};
-
+
// pin
if (prefs.popVideo.pin) {
this.beforePin();
this.pin();
};
-
+
// 最大化
if (prefs.popVideo.maximize) {
this.maximize();
};
-
+
if (!this.pinned) {
this.smoothScrollIntoView(controlLayer);
};
@@ -2178,14 +2269,14 @@
exitFullscreen: function () {
if (!this.isFullscreen) return;
this.isFullscreen = false;
-
+
this.setZIndex(true);
},
fullscreen: function () {
var video = this.video;
var vS = video.style;
-
+
// firefox 会将全屏的元素自动fixed处理,然后拉伸
/* :-moz-full-screen:not(:root) {
-moz-box-sizing: border-box !important;
@@ -2202,15 +2293,15 @@
right: 0 !important;
top: 0 !important;
width: 100% !important;
- z-index: 2147483647 !important;
+ z-index: 2147483647 !important;
} */
-
+
// chrome 只有当全屏元素是iframe的时候才会做fixed处理,并且拉伸
// 其他元素的时候,当元素为非绝对定位流的时候会全屏居中,绝对定位流时以屏幕左上角为原点定位
/* video:-webkit-full-screen {
width: 100%;
height: 100%;
- }
+ }
audio:-webkit-full-screen {
background-color: transparent;
position: relative;
@@ -2244,18 +2335,18 @@
vS.setProperty('height', '100%', 'important');
vS.setProperty('width', document.body.clientWidth+'px', 'important');
vS.setProperty('z-index', 2147483647, 'important');
-
+
// 标记全屏状态中
- this.isFullscreen = true;
+ this.isFullscreen = true;
},
maximize: function () {
if (this.maximized) return;
this.maximized = true;
-
+
var controlLayer = this.controlLayer;
controlLayer.classList.add('fv-p-v-control-layer_maximized');
-
+
// 去掉滚动条
var style = document.createElement('style');
style.type = 'text/css';
@@ -2268,11 +2359,11 @@
*/
}).cssText;
(document.head || document.documentElement).appendChild(style);
-
+
var cLS = controlLayer.style;
var cBCRect = controlLayer.getBoundingClientRect();
-
+
// 备份数据,等下还原用
this.maximizeBackup = {
pinned: this.pinned,// 备份之前的状态
@@ -2291,11 +2382,11 @@
function fitScreen() {
var wSize = getWindowSize();
cLS.height = wSize.height - 30 + 'px';
- cLS.width = wSize.width - 10 + 'px';
+ cLS.width = wSize.width - 10 + 'px';
};
-
+
fitScreen();
-
+
// 固定
if (this.pinned) {
if (!this.fixedPin) {
@@ -2306,32 +2397,32 @@
this.pin();
this.cCommandP.classList.remove('fv-p-v-control-command-selected');
};
-
+
this.maximizeResizeHandler = fitScreen;
window.addEventListener('resize', this.maximizeResizeHandler, true);
-
+
this.cCommandM.classList.add('fv-p-v-control-command-selected');
-
-
+
+
},
exitMaximize: function () {
if (!this.maximized) return;
this.maximized = false;
-
+
var controlLayer = this.controlLayer;
var cLS = controlLayer.style;
-
+
controlLayer.classList.remove('fv-p-v-control-layer_maximized');
-
+
var mBackup = this.maximizeBackup;
cLS.top = parseFloat(cLS.top) + mBackup.offset.top + 'px';
cLS.left = parseFloat(cLS.left) + mBackup.offset.left + 'px';
cLS.width = mBackup.width;
cLS.height = mBackup.height;
-
+
mBackup.style.parentNode.removeChild(mBackup.style);
-
+
// 还原最大化前的固定状态
if (mBackup.pinned) {
if (!this.fixedPin) {
@@ -2340,9 +2431,9 @@
};
} else {
this.unpin();
- };
-
-
+ };
+
+
window.removeEventListener('resize', this.maximizeResizeHandler, true);
this.cCommandM.classList.remove('fv-p-v-control-command-selected');
},
@@ -2357,10 +2448,10 @@
beforePin: function () {// pin的时候确保不要pin到可视范围外面去。
var controlLayer = this.controlLayer;
var cLS = controlLayer.style;
-
+
var wSize = getWindowSize();
-
- // 如果pin的时候,标题栏不在浏览器窗口,调整top
+
+ // 如果pin的时候,标题栏不在浏览器窗口,调整top
var cLBCRect = controlLayer.getBoundingClientRect();
if (cLBCRect.top < 0) {
@@ -2368,7 +2459,7 @@
} else if (cLBCRect.top > wSize.height - 50) {
cLS.top = parseFloat(cLS.top) - (cLBCRect.top - (wSize.height - 50)) + 'px';
};
-
+
if (cLBCRect.left < 0) {
cLS.left = parseFloat(cLS.left) - cLBCRect.left + 'px';
} else if (cLBCRect.left > wSize.width - 50) {
@@ -2383,37 +2474,37 @@
var controlLayer = this.controlLayer;
var cLS = controlLayer.style;
-
+
// 针对iframe video audio 元素,直接设置fixed获取更好的效果
if (this.fixedPin) {
this.pinData = {}; // 备份数据
-
+
var cLBCRect = controlLayer.getBoundingClientRect();
cLS.position = 'fixed';
cLS.top = cLBCRect.top + 'px';
cLS.left = cLBCRect.left + 'px';
-
+
var vS = this.video.style;
-
+
this.pinData.position = vS.position;
vS.setProperty('position', 'fixed', 'important');
} else {
var scrolled = getScrolled();
var offset = {
top: parseFloat(cLS.top),
- left: parseFloat(cLS.left),
+ left: parseFloat(cLS.left),
};
-
+
this.pinScrollHandler = function () {
var scrolledA = getScrolled();
-
+
var top = scrolledA.y - scrolled.y + offset.top;
cLS.top = top + 'px';
-
+
var left = scrolledA.x - scrolled.x + offset.left;
cLS.left = left + 'px';
};
-
+
window.addEventListener('scroll', this.pinScrollHandler, true);
};
},
@@ -2421,12 +2512,12 @@
if (!this.pinned) return;
this.pinned = false;
this.cCommandP.classList.remove('fv-p-v-control-command-selected');
-
+
if (this.fixedPin) {
var controlLayer = this.controlLayer;
var cLS = controlLayer.style;
var scrolled = getScrolled();
-
+
cLS.position = 'absolute';
cLS.top = parseFloat(cLS.top) + scrolled.y + 'px';
cLS.left = parseFloat(cLS.left) + scrolled.x + 'px';
@@ -2441,7 +2532,7 @@
this.cCommandP.classList[(this.maximizeBackup.pinned = !this.maximizeBackup.pinned) ? 'add' : 'remove']('fv-p-v-control-command-selected');
return;
};
-
+
if (this.pinned) {
this.unpin();
} else {
@@ -2452,27 +2543,27 @@
lightOn: function () {
if (this.lighting) return;
this.lighting = true;
-
+
var lOS = this.fixedOverlayer.style;
lOS.opacity = 0;
this.lightOnTimerId = setTimeout(function () {
lOS.display = 'none';
}, 200);
-
+
this.cCommandL.classList.remove('fv-p-v-control-command-selected');
},
lightOff: function () {
if (!this.lighting) return;
this.lighting = false;
-
+
var lOS = this.fixedOverlayer.style;
lOS.display = 'block';
clearTimeout(this.lightOnTimerId);
setTimeout(function () {
lOS.opacity = prefs.popVideo.lightOff.opacity;
}, 100);
-
+
this.cCommandL.classList.add('fv-p-v-control-command-selected');
},
toggleLight: function () {
@@ -2486,46 +2577,48 @@
restore: function (close) {
// 从所有列表中删除自己
PopVideo.all.splice(PopVideo.all.indexOf(this), 1);
-
+
var video = this.video;
-
+ video.removeEventListener("wheel", this.scale.bind(this));
+ video.removeEventListener("mousedown", this.videoMouseDown.bind(this), true);
+
this.unpin();// 解除scroll监听
this.exitMaximize();// 解除resize监听
-
+
// 移除各种监听
this.cLObserver.disconnect();
-
+
window.removeEventListener('resize', this.wResizeListener, true);
mouseEventListener.remove('mouseenter', video, this.videoEnterHandler);
document.removeEventListener(support.fullscreenchange, this.fullscreenchangeListener, true);
-
+
// 移除dom
this.fixedOverlayer.parentNode.removeChild(this.fixedOverlayer);
this.controlLayer.parentNode.removeChild(this.controlLayer);
-
+
// 还原video相关的domstyle;
-
+
var vS = video.style;
video.controls = this.vOriControls;
var vOriStyle = this.vOriStyle;
-
+
for (var pro in vOriStyle) {
if (!vOriStyle.hasOwnProperty(pro)) continue;
// console.log(pro);
// chrome 用setProperty覆盖style上原有的值上存在important声明的时候
// 设置的值也必须有important声明,否则设置不上,并且就算有important声明,setProperty传递null或空字符串时,也无法删除原值。
//removeProperty移除有 important声明的时候,组合值必须一个一个移除。比如 removeProperty('padding') 无效,需要单独移除每个padding
-
+
vS.removeProperty(pro);
vS.setProperty(pro, vOriStyle[pro][0], vOriStyle[pro][1]);
};
video.classList.remove('fv-p-v-video');
-
-
+
+
// 移除popVideo标记
delete video.fvPopVideo;
-
+
if (this.vPEIsObject) {
delete this.vPEIsObject.fvPopVideo;
} else if (this.vCEIsPlugin) {
@@ -2535,7 +2628,7 @@
// 还原video的祖先元素们的样式
var ancestors = this.ancestors;
-
+
ancestors.forEach(function (ancestor) {
var ancestorData = data(ancestor, 'data');
if (ancestorData.count == 1) {
@@ -2551,13 +2644,13 @@
ancestorData.count -- ;
};
});
-
+
// 还原特殊修正
if (this.removePopVideoFix) {
this.removePopVideoFix();
};
-
+
// 是否是直接关闭视频
if (close) {
new CloseVideo(video);
@@ -2565,68 +2658,68 @@
// 平滑滚动到视频处
this.smoothScrollIntoView(video);
};
-
+
},
setZIndex: function (force) {
if (!force && PopVideo.topVideo == this) return;
-
+
PopVideo.topVideo = this;
-
+
this.fixedOverlayer.style.zIndex = PopVideo.maxIndex ++;
this.controlLayer.style.zIndex = PopVideo.maxIndex;
-
+
this.video.style.setProperty('z-index', PopVideo.maxIndex ++, 'important');
},
followControlLayer: function () {
// 全屏状态禁止调整video的大小
if (this.isFullscreen) return;
-
+
var video = this.video;
-
+
if (!document.contains(video) || getComputedStyle(video).display == 'none') {
this.restore();
return;
};
-
+
var controlLayer = this.controlLayer;
-
+
var cLS = controlLayer.style;
var vS = video.style;
-
+
vS.setProperty('height', cLS.height, 'important');
vS.setProperty('width', cLS.width, 'important');
-
+
this.cSizeInfo.textContent = 'W: ' + parseFloat(cLS.width) + ' H: ' + parseFloat(cLS.height);
-
+
var cLCRect = getContentClientRect(controlLayer);
var vCRect = getContentClientRect(video);
-
+
// 使用top left 修正到和之前的位置一样
if (!video.style.transform) {
vS.setProperty('top', parseFloat(vS.top) + cLCRect.top - vCRect.top + 'px', 'important');
vS.setProperty('left', parseFloat(vS.left) + cLCRect.left - vCRect.left + 'px', 'important');
}
-
+
},
smoothScrollIntoView: function (elem) {
if (!document.contains(elem) || getComputedStyle(elem).display == 'none') return;
-
+
var eBCRect = elem.getBoundingClientRect();
var wSize = getWindowSize();
var scrolled = getScrolled();
var pros = {};
-
+
// y轴
if (eBCRect.top < 0 || eBCRect.top > wSize.height) {
pros.scrollTop = Math.max(scrolled.y + eBCRect.top - 10, 0);
};
-
+
// x轴
if (eBCRect.left < 0 || eBCRect.left > wSize.width) {
pros.scrollLeft = Math.max(scrolled.x + eBCRect.left - 10, 0);
};
-
-
+
+
var scrollFx = PopVideo.scrollFx;
if (!scrollFx) {
scrollFx = PopVideo.scrollFx = fx('html,body');
@@ -2635,17 +2728,17 @@
scrollFx.animate(pros,{
duration: 400,
});
-
+
},
addStyle: function () {
if (PopVideo.styleAdded) return;
PopVideo.styleAdded = true;
-
+
var style = document.createElement('style');
style.type = 'text/css';
style.id = 'flash-viewer-pop-video';
-
+
style.textContent = getMStr(function () {
var cssText;
/*
@@ -2659,7 +2752,7 @@
visibility: hidden;
overflow: hidden;
}
-
+
.fv-p-v-video {
min-width: 0 !important;
min-height: 0 !important;
@@ -2684,7 +2777,7 @@
width: 100% !important;
height: 100% !important;
}
-
+
.fv-p-v-light-off {
position: fixed;
top: 0;
@@ -2719,7 +2812,7 @@
background-color: #535353;
pointer-events: all;
}
-
+
.fv-p-v-control-title-bar {
-moz-user-select: none;
-webkit-user-select: none;
@@ -2744,7 +2837,7 @@
cursor: -webkit-grabbing;
cursor: grabbing;
}
-
+
.fv-p-v-control-title-bar-left-side {
float: left;
color: #AFAFAF;
@@ -2769,7 +2862,7 @@
color: white;
background: #535353;
}
-
+
.fv-p-v-control-resize-hand-n {
height: 5px;
top: 0;
@@ -2830,7 +2923,7 @@
left: 0;
cursor: nesw-resize
}
-
+
.fv-p-v-control-command {
cursor: pointer;
display: inline-block;
@@ -2841,12 +2934,12 @@
background: transparent center no-repeat;
opacity: 0.6;
transition: opacity 0.2s ease-in-out;
-
+
}
.fv-p-v-control-command-selected {
background-color: #404040;
}
-
+
.fv-p-v-control-command:hover {
opacity: 1;
}
@@ -2866,16 +2959,16 @@
.fv-p-v-control-light {
background-image:url("$light$")
- }
+ }
.fv-p-v-control-pin {
background-image:url("$pin$");
- }
+ }
.fv-p-v-control-maximize {
background-image:url("$maximize$");
- }
+ }
.fv-p-v-control-fullscreen {
background-image:url("$fullscreen$");
- }
+ }
.fv-p-v-control-restore {
background-image:url("$restore$");
}
@@ -2890,14 +2983,14 @@
.replace('$fullscreen$', icons.popVideo.fullscreen)
.replace('$restore$', icons.popVideo.restore)
.replace('$close$', icons.popVideo.close);
-
-
+
+
var style2 = document.createElement('style');
PopVideo.movingHelperStyle = style2;
-
+
style2.type = 'text/css';
style2.id = 'flash-viewer-pop-video-moving-helper';
-
+
style2.textContent = getMStr(function () {
var cssText;
/*
@@ -2908,12 +3001,12 @@
*/
}).cssText;
var parentEle = document.head || document.documentElement;
-
+
parentEle.appendChild(style);
parentEle.appendChild(style2);
style2.disabled = true;// style添加到文档之后disabled属性才有效
-
+
},
};
@@ -2928,66 +3021,66 @@
CloseVideo.prototype = {
init: function () {
this.addStyle();
-
+
var plugin = this.plugin;
-
+
// 如果父元素是object,那么隐藏object元素
var pluginP;
if ((pluginP = plugin.parentElement) && pluginP.nodeName == 'OBJECT') {
plugin = pluginP;
};
-
+
this.plugin = plugin;
-
+
var pCStyle = getComputedStyle(plugin);
-
+
// 设置一个占位符
var placeholder = document.createElement('fvspan');
placeholder.className = 'fv-c-v-placeholder';
placeholder.title = "点击还原视频";
-
- placeholder.innerHTML = getMStr(function () {
+
+ placeholder.innerHTML = createHTML(getMStr(function () {
var innerHTML;
/*
*/
- }).innerHTML;
-
+ }).innerHTML);
+
// 复制样式
var phStyle = placeholder.style;
var pros = [// 尽量拆开写,浏览器对复合值的返回不一样
'display', 'cssFloat',
- 'position', 'zIndex',
- 'top', 'bottom', 'left', 'right',
- 'height', 'width',
- 'borderTopWidth', 'borderBottomWidth', 'borderLeftWidth', 'borderRightWidth',
- 'paddingTop', 'paddingBottom', 'paddingLeft', 'paddingRight',
- 'marginTop', 'marginBottom', 'marginLeft', 'marginRight',
+ 'position', 'zIndex',
+ 'top', 'bottom', 'left', 'right',
+ 'height', 'width',
+ 'borderTopWidth', 'borderBottomWidth', 'borderLeftWidth', 'borderRightWidth',
+ 'paddingTop', 'paddingBottom', 'paddingLeft', 'paddingRight',
+ 'marginTop', 'marginBottom', 'marginLeft', 'marginRight',
support.cssBoxSizing,
];
pros.forEach(function (pro) {
phStyle[pro] = pCStyle[pro];
});
-
+
// iframe,audio,video默认display inline。但是普通元素的的话inline设置height width是无效的
if (phStyle.display == 'inline') {
phStyle.display = 'inline-block';
};
-
+
// 如果是static定位那么改成relative定位,为占位符的内部关闭按钮做包含块
if (phStyle.position = 'static') {
phStyle.position = 'relative';
phStyle.zIndex = 'auto';
};
-
-
+
+
// 监听占位符的点击操作
placeholder.addEventListener('click', function (e) {
placeholder.parentNode.removeChild(placeholder);
-
+
var target = e.target;
if (target == this) {//显示视频
plugin.classList.remove('fv-c-v-hide-plugin');
@@ -2998,10 +3091,10 @@
plugin.parentNode.removeChild(plugin);
};
}, true);
-
+
// 插入占位符
var pluginNS = plugin.nextSibling;
- var pluginP = plugin.parentNode;
+ pluginP = plugin.parentNode;
if (pluginNS) {
pluginP.insertBefore(placeholder, pluginNS);
} else {
@@ -3012,7 +3105,7 @@
var pNName = plugin.nodeName;
var oSrc;
plugin.classList.add('fv-c-v-hide-plugin');
-
+
if (/^(?:VIDEO|AUDIO)$/.test(pNName)) {// video audio标签,暂停播放
plugin.pause();
} else if (pNName == 'IFRAME') {
@@ -3027,7 +3120,7 @@
var style = document.createElement('style');
style.type = 'text/css';
style.id = 'flash-viewer-close-video'
-
+
style.textContent = getMStr(function () {
var cssText;
/*
@@ -3043,7 +3136,7 @@
.fv-c-v-placeholder:hover {
opacity: 1;
}
-
+
.fv-c-v-close {
position: absolute;
top: 5px;
@@ -3067,7 +3160,7 @@
width: 24px;
height: 24px;
}
-
+
.fv-c-v-hide-plugin {
display: none !important;
}
@@ -3076,20 +3169,20 @@
.replace('$video$', icons.video);
(document.head || document.documentElement).appendChild(style);
-
+
},
};
-
+
// 浮动工具栏
function FloatBar() {
this.init();
};
FloatBar.styleAdded = false;
-
+
FloatBar.prototype = {
hideDelay: 566,
hidden: true,
-
+
init: function () {
this.addStyle();
@@ -3097,8 +3190,8 @@
var floatBar = document.createElement('fvspan');
this.floatBar = floatBar;
floatBar.id = 'fv-f-b-container';
-
- floatBar.innerHTML = getMStr(function () {
+
+ floatBar.innerHTML = createHTML(getMStr(function () {
var innerHTML;
/*
@@ -3148,7 +3241,7 @@
*/
- }).innerHTML;
+ }).innerHTML);
var butonOrder = prefs.floatBar.butonOrder.slice(0);
butonOrder.push('download');
@@ -3159,7 +3252,7 @@
nativeMethods.forEach.call(floatBar.children, function (child) {
var classlist = child.classList;
if (!classlist.contains('fv-f-b-button')) return;
-
+
var bName = butonOrder.shift();
if (!bName) {
child.style.display = 'none';
@@ -3167,7 +3260,7 @@
};
classlist.add('fv-f-b-button-' + bName);
-
+
var titleMap = {
pop: '弹出视频',
reload: '重载视频',
@@ -3177,16 +3270,16 @@
ratio: '长宽比',
bright: '亮度'
};
-
+
child.title = titleMap[bName];
-
+
// 相关命令保存在dom上
child.dataset.clickCommand = bName;
-
+
});
-
+
document.body.appendChild(floatBar);
-
+
this.downloadButton = floatBar.querySelector('.fv-f-b-button-download');
var self = this;
@@ -3215,34 +3308,34 @@
let ratio = e.target.value;
self.target.style.transform = ratio ? `scale(${ratio})` : "";
}, true);
-
+
// 监听按钮点击
floatBar.addEventListener('click', function (e) {
if (e.button !=0) return;// 非左键点击
-
+
var plugin = self.target;
-
+
// 如果点击按钮的时候,插件被删除了,或者被隐藏了
if (!document.contains(plugin) || getComputedStyle(plugin).display == 'none') {
self.hide();
return;
};
-
+
var bName = e.target.dataset.clickCommand;
if (!bName) return;
// console.log(bName);
-
+
switch (bName) {
// 点击了弹出命令按钮
case 'pop':
self.hide();
-
+
new PopVideo(plugin);
break;
// 点击了重载命令按钮
case 'reload':
self.hide();
-
+
var pNName = plugin.nodeName;
if (/^(?:VIDEO|AUDIO)$/.test(pNName)) {// video 和 audio标签
plugin.load();
@@ -3259,18 +3352,18 @@
// 点击了关闭命令按钮
case 'close':
self.hide();
-
+
new CloseVideo(plugin);
break;
case 'download':
self.hide();
-
+
window.open('http://www.flvcd.com/parse.php?kw=' + encodeURIComponent(self.downloadUrl));
break;
};
-
+
}, true);
-
+
// 监听mouse进出
mouseEventListener.add('mouseleave', floatBar, function (e) {
self.hideTimerId = setTimeout(function () {
@@ -3285,10 +3378,10 @@
show: function () {
if (!this.hidden) return;
this.hidden = false;
-
+
this.setPosition();
this.downloadable();
-
+
var fbs = this.floatBar.style;
fbs.display = 'block';
setTimeout(function () {
@@ -3298,7 +3391,7 @@
hide: function () {
if (this.hidden) return;
this.hidden = true;
-
+
var fbs = this.floatBar.style;
fbs.display = 'none';
fbs.opacity = 0;
@@ -3306,7 +3399,7 @@
downloadable: function () {// 如果可下载,那么显示下载按钮
var plugin = this.target;
var pNName = plugin.nodeName;
-
+
if (!/^(?:OBJECT|EMBED)$/.test(pNName)) {
this.downloadButton.style.display = 'none';
return;
@@ -3314,10 +3407,10 @@
function convertFVars2Obj(fVars) {
var ret = {};
-
+
fVars.split('&').forEach(function (item) {
if (!item) return;
-
+
var index = item.indexOf('=');
if (index == -1) {
if (item !=' ') {
@@ -3329,22 +3422,22 @@
};
};
});
-
+
return ret;
};
-
+
var src;
var fVars;
-
+
if (pNName == 'EMBED') {
src = plugin.src;
fVars = plugin.getAttribute('flashvars');
} else {// object
src = plugin.data;
-
+
nativeMethods.some.call(plugin.children, function (child) {
if (child.nodeName != 'PARAM') return;
-
+
var name = child.name.toLowerCase();
var value = child.value;
switch (name) {
@@ -3361,72 +3454,72 @@
if (src && fVars) return true;
});
-
+
};
-
+
if (!src) {
this.downloadButton.style.display = 'none';
return;
};
-
+
fVars = fVars || '';
-
+
fVars = convertFVars2Obj(fVars);
-
+
var qIndex;
var hIndex;
var qFVars;
var key;
-
+
qIndex = src.indexOf('?');
-
+
if (qIndex != -1) {
qIndex ++;
-
+
hIndex = src.indexOf('#');
hIndex = hIndex == -1 ? src.length : hIndex;
-
+
qFVars = src.slice(qIndex, hIndex);
-
+
qFVars = convertFVars2Obj(qFVars);
// 合并参数
for (key in fVars) {
if (!fVars.hasOwnProperty(key)) continue;
-
+
qFVars[key] = fVars[key];
};
-
+
fVars = qFVars;
};
var downloadUrl;
-
+
var youkuId;
var qqVid;
var yytId;
-
+
var srcOrigin = src.match(/[^:]+:\/\/[^/]+/)[0];
-
+
if (/\.youku\.com/i.test(srcOrigin)) {// youku
if (youkuId = src.match(/\/sid\/(\w{13,})\//)) {
youkuId = youkuId[1];
} else {
youkuId = fVars.VideoIDS;
};
-
+
if (youkuId) {
downloadUrl = 'http://v.youku.com/v_show/id_' + youkuId + '.html';
};
} else if (/\.qq\.com/.test(srcOrigin)) {// 腾讯视频
qqVid = fVars.vid;
-
+
if (qqVid) {
downloadUrl = 'http://static.video.qq.com/TPout.swf?vid=' + qqVid;
};
} else if (/player\.yinyuetai\.com/.test(srcOrigin)) {// 音悦台
-
+
if (yytId = src.match(/^https?:\/\/player\.yinyuetai\.com\/video\/swf\/(\d+)\//)) {
downloadUrl = 'http://v.yinyuetai.com/video/' + yytId[1];
};
@@ -3435,7 +3528,7 @@
downloadUrl = 'http://v.yinyuetai.com/video/' + yytId;
};
};
-
+
if (downloadUrl) {
this.downloadUrl = downloadUrl;
this.downloadButton.style.display = '';
@@ -3456,7 +3549,7 @@
var scrolled = getScrolled();
var fbs = this.floatBar.style;
-
+
var setPosition = {
top: function () {
var top = targetPosi.top + scrolled.y;
@@ -3498,11 +3591,11 @@
setPosition[floatBarPosi[1]]();
},
start: function (target) {
-
+
if (this.target) {
mouseEventListener.remove('mouseleave', this.target, this.targetLeaveHandler);
};
-
+
this.target = target;
// console.log(target);
@@ -3530,7 +3623,7 @@
mouseDown = true;
lastRate = target.playbackRate;
speedUpTimer = setTimeout(() => {
- target.playbackRate = 3;
+ target.playbackRate = 5;
target.play();
}, 500);
lastPos = e.clientX;
@@ -3547,7 +3640,6 @@
mouseDown = false;
}, true);
target.addEventListener('mousemove', function (e) {
- clearTimeout(speedUpTimer);
if (!mouseDown) return;
if (!mouseMoving) {
if (Math.abs(e.clientX - lastPos) > 10) {
@@ -3555,6 +3647,7 @@
}
return;
}
+ clearTimeout(speedUpTimer);
target.playbackRate = lastRate;
target.pause();
target.currentTime += (e.clientX - lastPos) / 5;
@@ -3590,12 +3683,12 @@
// chrome的鼠标事件发生顺序坑爹,鼠标从a进入b,a(leave) > b(enter) > a(out) > b(over)
// firefox a(out) > a(leave) > b(over) > b(enter)
-
+
// 注册鼠标离开插件后隐藏浮动栏
mouseEventListener.add('mouseleave', target, targetLeaveHandler);
clearTimeout(this.hideTimerId);
-
+
if (this.hidden) {
this.showTimerId = setTimeout(function () {
self.show();
@@ -3605,12 +3698,12 @@
this.downloadable();
this.setPosition();
};
-
+
},
addStyle: function () {
if (FloatBar.styleAdded) return;
FloatBar.styleAdded = true;
-
+
var style = document.createElement('style');
style.type = 'text/css';
style.id = 'flash-viewer-float-bar';
@@ -3729,8 +3822,8 @@
opacity: 1;
pointer-events: all;
}
-
-
+
+
*/
}).cssText.replace('$close$', icons.floatBar.close)
.replace('$pop$', icons.floatBar.pop)
@@ -3738,9 +3831,9 @@
.replace('$download$', icons.floatBar.download);
(document.head || document.documentElement).appendChild(style);
- },
+ },
};
-
+
var plugFloatBar;
// 监控鼠标是否摸到了插件
document.addEventListener('mouseover', function (e) {
@@ -3751,19 +3844,38 @@
target = video[0];
tNName = 'VIDEO';
}
-
+
// 可弹出元素
- if (!/^(?:OBJECT|EMBED|VIDEO|AUDIO|IFRAME)$/.test(tNName)) return;
-
+ const availableNode = /^(?:OBJECT|EMBED|VIDEO|AUDIO|IFRAME|CANVAS)$/i;
+ if (!availableNode.test(tNName)) {
+ target = null;
+ if (document.elementsFromPoint) {
+ let elements = document.elementsFromPoint(e.clientX, e.clientY);
+ let checkLen = Math.min(elements.length, 5);
+ for (let i = 0; i < checkLen; i++) {
+ let ele = elements[i];
+ if (!ele) continue;
+ if (availableNode.test(ele.nodeName)) {
+ target = ele;
+ tNName = ele.nodeName;
+ break;
+ }
+ }
+ }
+ if (!target) {
+ return;
+ }
+ }
+
// console.log(target);
-
+
// popVideo中。
if (target.fvPopVideo) return;
-
+
// 如果是插件判断是否为flash插件
if (/^(?:OBJECT|EMBED)$/.test(tNName)) {
// console.log(target);
-
+
if (tNName == 'EMBED') {
if (!/^(?:application\/x-shockwave-flash|)$/.test(target.type) || !target.src) {
return;
@@ -3775,75 +3887,107 @@
};
};
};
+ };
- // 如果flash太小,一般不是引用视频,不出现工具栏
- var cCRect = getContentClientRect(target);
- if (!(cCRect.width >= prefs.floatBar.minSizeLimit.width && cCRect.height >= prefs.floatBar.minSizeLimit.height)) {
- // console.log(cCRect);
- return;
- };
+ // 如果flash太小,一般不是引用视频,不出现工具栏
+ var cCRect = getContentClientRect(target);
+ if (!(cCRect.width >= prefs.floatBar.minSizeLimit.width && cCRect.height >= prefs.floatBar.minSizeLimit.height)) {
+ // console.log(cCRect);
+ return;
};
-
-
+
+
if (!plugFloatBar) {
plugFloatBar = new FloatBar();
};
-
+
plugFloatBar.start(target);
-
+
}, true);
-
+
};
-
+ var _isunsafe = null;
+ function isunsafe(){
+ if (_isunsafe === null) {
+ try {
+ let escapeHTMLPolicy;
+ let win = typeof unsafeWindow == 'undefined'? window : unsafeWindow;
+ if (win.trustedTypes && win.trustedTypes.createPolicy) {
+ escapeHTMLPolicy = win.trustedTypes.createPolicy('fv_default', {
+ createScript: string => string
+ });
+ }
+ function createScript(html) {
+ return escapeHTMLPolicy ? escapeHTMLPolicy.createScript(html) : html;
+ }
+ _isunsafe = unsafeWindow.eval(createScript("false"));
+ } catch (e) {
+ _isunsafe = true;
+ }
+ }
+ return _isunsafe;
+ }
+
// 如果发生通信的话,需要一个独一无二的ID
var messageID = Math.random().toString();
-
+
// 把指定函数丢到真实环境中执行,规避一切脚本管理器乱七八糟的执行环境产生的奇葩Bug,
// 特别是chrome上的那个坑爹tampermonkey。。。
function runInPageContext(fn) {
if (typeof fn !== 'function') {
return;
- };
-
+ }
+ if (isunsafe()) {
+ fn();
+ return;
+ }
+
// 创建一个脚本插入到pageContext执行
var script = document.createElement('script');
script.type = 'text/javascript';
-
+
// 去掉函数名,防止污染全局环境。
var sContent = ';(' + fn.toString().replace(/[^(]+/, 'function ') + ')(' + JSON.stringify(messageID) + ');';
-
+
// console.log('执行的脚本实际内容\n', sContent);
-
+
script.textContent = sContent;
// 检测html元素是否可访问
// scriptish @run-at document-start时,html元素在第一时间不可访问
var de = document.documentElement;
-
+
if (de) {
// console.log(de.outerHTML);
-
- de.appendChild(script);
- de.removeChild(script);
+
+ try {
+ de.appendChild(script);
+ de.removeChild(script);
+ } catch (e) {
+ fn();
+ }
} else {
if(support.MutationObserver)
new (window.MutationObserver || window.WebKitMutationObserver)(function (ms, observer) {
-
+
var de = document.documentElement;
if (de) {
// console.log(de.outerHTML);
-
+
observer.disconnect();
-
- de.appendChild(script);
- de.removeChild(script);
+ try {
+ de.appendChild(script);
+ de.removeChild(script);
+ } catch (e) {
+ fn();
+ }
};
}).observe(document, {
childList: true,
});
};
-
+
};
runInPageContext(contentScript);
diff --git a/Kill Baidu AD/Kill Baidu AD.user.js b/Kill Baidu AD/Kill Baidu AD.user.js
index 95031c3b776..565821eb870 100644
--- a/Kill Baidu AD/Kill Baidu AD.user.js
+++ b/Kill Baidu AD/Kill Baidu AD.user.js
@@ -1,38 +1,59 @@
// ==UserScript==
// @name 百度广告(首尾推广及右侧广告)清理
-// @name:en Kill Baidu AD
+// @name:zh-CN 百度广告(首尾推广及右侧广告)清理
// @name:zh-TW 百度廣告(首尾推廣及右側廣告)清理
+// @name:en Kill Baidu AD
// @namespace hoothin
-// @version 1.22
-// @description 彻底清理百度搜索(www.baidu.com)结果首尾的推广广告、二次顽固广告、右侧广告,并防止反复
+// @version 1.23.12
+// @description 彻底清理百度搜索(www.baidu.com)结果首尾的推广广告、二次顽固广告、右侧广告,去除重定向,删除百家号
+// @description:zh-CN 彻底清理百度搜索(www.baidu.com)结果首尾的推广广告、二次顽固广告、右侧广告,去除重定向,移除百家号
+// @description:zh-TW 徹底清理百度搜索(www.baidu.com)結果首尾的推廣廣告、二次頑固廣告、右側廣告,去除重定向,刪除百家號
// @description:en Just Kill Baidu AD
-// @description:zh-TW 徹底清理百度搜索(www.baidu.com)結果首尾的推廣廣告、二次頑固廣告、右側廣告,並防止反復
// @author hoothin
-// @include http*://www.baidu.com/*
-// @include http*://m.baidu.com/*
+// @match *://www.baidu.com/*
+// @match *://m.baidu.com/*
+// @match *://greasyfork.org/*/scripts/24192-*
// @grant GM_xmlhttpRequest
+// @grant GM_addStyle
+// @grant GM_getValue
+// @grant GM_setValue
+// @grant GM_openInTab
+// @grant GM_registerMenuCommand
+// @grant GM_unregisterMenuCommand
+// @connect *
// @run-at document-start
// @license MIT License
// @compatible chrome 测试通过
// @compatible firefox 测试通过
// @compatible opera 未测试
// @compatible safari 未测试
-// @contributionURL https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=rixixi@sina.com&item_name=Greasy+Fork+donation
-// @contributionAmount 1
// ==/UserScript==
(function() {
'use strict';
- var killBaijiaType=2;
- var MO = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
- if(MO){
- var observer = new MO(function(records){
+ var MO = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver, killBaijiaType = 1, killRight, killRightStyle, killRightRegister, hidePicture, keepBaijia, hidePictureStyle, hidePictureRegister, blackList;
+ killRight = !!GM_getValue("killRight");
+ hidePicture = !!GM_getValue("hidePicture");
+ keepBaijia = !!GM_getValue("keepBaijia");
+ blackList = GM_getValue("blackList") || [];
+ if (MO) {
+ var observer = new MO(function(records) {
records.map(function(record) {
- if(record.addedNodes.length){
- [].forEach.call(record.addedNodes,function(addedNode) {
+ if (record.addedNodes.length) {
+ [].forEach.call(record.addedNodes, function(addedNode) {
clearOneAD(addedNode);
});
}
+ if (record.removedNodes.length) {
+ [].forEach.call(record.removedNodes, function(removedNode) {
+ if (killRight && removedNode === killRightStyle) {
+ document.head.appendChild(killRightStyle);
+ document.body.classList.add("killRight");
+ } else if (hidePicture && removedNode === hidePictureStyle) {
+ document.head.appendChild(hidePictureStyle);
+ }
+ });
+ }
});
});
var option = {
@@ -42,22 +63,22 @@
observer.observe(document, option);
}
- function checkBaijia(item){
- var itemHref=item.querySelector("a").href;
- item.style.display="none";
- if(itemHref.indexOf("baidu.com")==-1)return;
- var gmxhr=GM_xmlhttpRequest({
+ function checkBaijia(item) {
+ var itemHref = item.querySelector("a").href;
+ item.style.display = "none";
+ if (itemHref.indexOf("baidu.com") == -1) return;
+ var gmxhr = GM_xmlhttpRequest({
url: itemHref,
headers: {
"Accept": "text/html"
},
method: "head",
- onreadystatechange:function(response) {
- if(response.readyState==4){
- if(response.finalUrl.indexOf("baijiahao.baidu.com")!=-1){
+ onreadystatechange: function(response) {
+ if (response.readyState == 4) {
+ if (response.finalUrl.indexOf("baijiahao.baidu.com") != -1) {
item.remove();
- }else{
- item.style.display="";
+ } else {
+ item.style.display = "";
}
gmxhr.abort();
}
@@ -65,117 +86,491 @@
});
}
- function clearAD(){
- if(!document.querySelectorAll)return;
- var mAds=document.querySelectorAll(".ec_wise_ad,.ec_youxuan_card,.page-banner"),i;
- for(i=0;i
div,#content_left>table");
- for(i=0;ispan");
+ if (span && span.innerHTML == "广告") {
item.remove();
- }else{
- var span=item.querySelector("div>span");
- if(span && span.innerHTML=="广告"){
+ }
+ [].forEach.call(item.querySelectorAll("span,a"), function(span) {
+ if (span && (span.innerHTML == "广告" || span.getAttribute("data-tuiguang"))) {
item.remove();
}
- [].forEach.call(item.querySelectorAll("span,a"),function(span){
- if(span && (span.innerHTML=="广告" || span.getAttribute("data-tuiguang"))){
- item.remove();
+ });
+ if (killBaijiaType == 2) {
+ [].forEach.call(item.querySelectorAll("a>div>span+img"), function(img) {
+ if (img && /^https?:\/\/pic\.rmb\.bdstatic\.com/.test(img.src)) {
+ //checkBaijia(item);
+ !keepBaijia && item.remove();
}
});
- if(killBaijiaType==2){
- [].forEach.call(item.querySelectorAll("a>div>span+img"),function(img){
- if(img && /^https?:\/\/pic\.rmb\.bdstatic\.com/.test(img.src)){
- //checkBaijia(item);
- item.remove();
- }
- });
- }
}
}
+ }
- var eb = document.querySelectorAll("#content_right>table>tbody>tr>td>div");
- for(i=0;idiv>div>div");
- if(nr){
- var nra=nr.querySelectorAll("a");
- for(i=0;i.result");
+ for (let i = 0; i < list.length; i++) {
+ let item = list[i];
+ checkMobileItem(item);
+ }
+ }
+
+ function clearAD() {
+ if (!document.querySelectorAll) return;
+ if (killRight) {
+ document.body.classList.add("killRight");
+ } else document.body.classList.remove("killRight");
+ removeEcAd(document);
+ var list = document.querySelectorAll("#content_left>div,#content_left>table");
+ for (let i = 0; i < list.length; i++) {
+ let item = list[i];
+ checkLeftItem(item);
+ }
+
+ var eb = document.querySelectorAll("#content_right>table>tbody>tr>td>div");
+ checkRightTable(eb);
+
+ var nr = document.querySelector("#content_right>div>div>div");
+ if (nr) {
+ checkRightAd(nr);
+ }
+ }
+
+ function clearOneAD(ele) {
+ if (ele.nodeType != 1) return;
+ if (ele.classList.contains("ec-tuiguang") || ele.classList.contains("ec_wise_ad") || ele.classList.contains("ec_youxuan_card") || ele.classList.contains("page-banner")) {
ele.remove();
return;
}
- if(ele.parentNode && ele.parentNode.id=="content_left" && (ele.nodeName=="DIV" || ele.nodeName=="TABLE")){
- let s = ele.getAttribute("style");
- if (s && /display:(table|block)\s!important/.test(s)) {
- ele.remove();
- }else{
- var span=ele.querySelector("div>span");
- if(span && span.innerHTML=="广告"){
- ele.remove();
- }
- [].forEach.call(ele.querySelectorAll("span,a"),function(span){
- if(span && (span.innerHTML=="广告" || span.getAttribute("data-tuiguang"))){
- ele.remove();
- }
- });
- if(killBaijiaType==2){
- [].forEach.call(ele.querySelectorAll("a>div>span+img"),function(img){
- if(img && /^https?:\/\/pic\.rmb\.bdstatic\.com/.test(img.src)){
- //checkBaijia(ele);
- ele.remove();
- }
- });
+ if (ele.parentNode && ele.parentNode.id == "content_left" && (ele.nodeName == "DIV" || ele.nodeName == "TABLE")) {
+ checkLeftItem(ele);
+ } else if (ele.parentNode && ele.parentNode.id == "content_right") {
+ if (ele.nodeName == "TABLE") {
+ var eb = ele.querySelectorAll("tbody>tr>td>div");
+ checkRightTable(eb);
+ }
+ if (ele.nodeName == "DIV") {
+ var nr = ele.querySelector("div>div");
+ if (nr) {
+ checkRightAd(nr);
}
}
- }else if(ele.parentNode && ele.parentNode.id=="content_right"){
- if(ele.nodeName=="TABLE"){
- var eb = ele.querySelectorAll("tbody>tr>td>div");
- for(var i=0;idiv,#content_left>table");
+ [].forEach.call(eles, e => {clearOneAD(e)});
+ }
+ }
+ function initCss() {
+ killRightStyle && killRightStyle.parentNode && killRightStyle.parentNode.removeChild(killRightStyle);
+ GM_addStyle(`
+ body:not(.showBlocked) .blocked {
+ display: none!important;
+ }
+ body.showBlocked .blocked {
+ background: linen;
+ }
+ `);
+ if (killRight) {
+ killRightStyle = GM_addStyle(`
+ #content_right,[tpl="recommend_list"],#rs_new {
+ display: none;
+ }
+ #container.sam_newgrid {
+ width: calc(100% - 150px);
+ }
+ #container.sam_newgrid #content_left {
+ column-width: 590px;
+ width: 100%;
+ }
+ #content_left .result-op, #content_left .result {
+ page-break-inside: avoid;
+ }
+ `);
+ }
+ hidePictureStyle && hidePictureStyle.parentNode && hidePictureStyle.parentNode.removeChild(hidePictureStyle);
+ if (hidePicture) {
+ hidePictureStyle = GM_addStyle(`
+ #wrapper_wrapper {
+ background: rgba(228, 228, 228, 0.29);
+ }
+ #content_left .cos-color-bg-page {
+ background-color: unset;
+ }
+ #head:not(.s-skin-hasbg),
+ [tpl="app/head-tab"] {
+ background: #f7f7f7;
+ }
+ #container a,
+ #container a em {
+ text-decoration: auto!important;
+ }
+ #result_logo {
+ opacity: 0.75;
+ }
+ .cos-col[style*="width:33"],.cos-col[style*="width:25"],#content_left .c-span2,#content_left .c-span3,#content_left .c-span4,#content_left .c-span6>.c-img,[tpl="short_video"],[data-module="gp-peopleintro-img-click"],div[class^="img-container"],[data-module="normal-img"],[role="img"],.c-gap-inner-y-img,div[class*="only-multi-image"],.sc-image-rounded-tl-base>.cos-row>.cos-col:first-child,[class^="image-content"] {
+ display: none;
+ }
+ #wrapper>.result-molecule.new-pmd {
+ box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .1);
+ }
+ .new-pmd .c-span9,.new-pmd .c-span6,.new-pmd .c-span10,.cos-col[style*="width:33"]+div,.cos-col[style*="width:25"]+div,.sc-image-rounded-tl-base>.cos-row>.cos-col:first-child+div {
+ width: 100%!important;
+ }
+ a,a:active,#content_right a {
+ color: rgb(80,80,80);
+ }
+ em {
+ color: #4E6EF2!important;
+ }
+ .c-container.result[tpl], .result-op.c-container[tpl], .result-op.xpath-log.new-pmd[tpl] {
+ transition: box-shadow 350ms;
+ box-shadow: 0 2px 5px 0px rgba(0, 0, 0, .1);
+ padding: 16px;
+ box-sizing: content-box;
+ }
+ .c-container.result[tpl] h3, .result-op.c-container[tpl] h3, .result-op.xpath-log.new-pmd[tpl] h3 {
+ padding-bottom: 10px;
+ border-bottom: 1px solid rgba(211, 211, 211, 0.63);
+ }
+ .c-group-wrapper {
+ box-shadow: unset;
+ margin-left: unset;
+ margin-right: unset;
+ }
+ .sc-image {
+ background-image: none !important;
+ }
+ .wrapper_new #head.no-box-shadow, .wrapper_new #head.no-box-shadow.s_down {
+ box-shadow: 0 2px 5px 0 rgba(0, 0, 0, .1);
+ }
+ [class*=card-shadow] {
+ box-shadow: unset!important;
+ }
+ #wrapper #content_left .op-soft-title h3>a:after, #wrapper #content_left .result h3>a:after, #wrapper #content_left .result-op h3>a.sc-link:after, #wrapper #content_left > .c-container h3>a:after, #wrapper #content_left .op-soft-title a:visited:after, #wrapper #content_left .result h3>a:visited:after, #wrapper #content_left .result-op h3>a.sc-link:visited:after, #wrapper #content_left > .c-container h3>a:visited:after {
+ content: "";
+ position: relative;
+ border-bottom: 2px solid #3075d0;
+ bottom: -2px;
+ display: block;
+ left: 100%;
+ width: 0;
+ transition: width 300ms, left 300ms;
+ }
+ #wrapper #content_left .op-soft-title a:hover:after, #wrapper #content_left .result a:hover:after, #wrapper #content_left .result-op a.sc-link:hover:after, #wrapper #content_left > .c-container a:hover:after, #wrapper #content_left .op-soft-title a:visited:hover:after, #wrapper #content_left .result a:visited:hover:after, #wrapper #content_left .result-op a.sc-link:visited:hover:after, #wrapper #content_left > .c-container a:visited:hover:after {
+ left: 0;
+ width: 100%;
+ transition: width 300ms;
+ }
+ #wrapper #content_left > .c-container:hover, #wrapper #content_left > .result:hover, #wrapper #content_left > .result-op:hover {
+ box-shadow: 0 2px 10px 1px rgba(0, 0, 0, .3);
+ }
+ `);
+ }
+ }
+
+ function checkBlackList(url, title) {
+ if (!blackList || !blackList.forEach) return false;
+ for (let i = 0; i < blackList.length; i++) {
+ try {
+ let isBlack = checkBlack(url, title, blackList[i]);
+ if (isBlack) return true;
+ } catch (e) {
+ console.log(e);
+ }
+ }
+ return false;
+ }
+
+ function checkBlack(url, title, pattern) {
+ pattern = pattern && pattern.replace(/\s*#.*/, "");
+ if (!pattern || !pattern.trim() || pattern.indexOf("#") === 0 || pattern.indexOf("!") === 0 || pattern.indexOf(" ") === 0 || pattern.indexOf("Update") === 0) return false;
+ if (pattern.indexOf("/") === 0) {
+ let match = pattern.match(/^\/(.*)\/(\w*)$/);
+ if (match) {
+ return new RegExp(match[1], match[2]).test(url);
+ }
+ }
+ if (pattern.indexOf("title") === 0) {
+ let match = pattern.replace("title", "").trim();
+ if (match.indexOf("/") === 0) {
+ match = match.match(/^\/(.*)\/(\w*)$/);
+ if (match) {
+ return new RegExp(match[1], match[2]).test(title);
+ }
+ } else if (match.indexOf("=~") === 0) {
+ match = match.match(/^=~\s*\/(.*)\/(\w*)$/);
+ if (match) {
+ return new RegExp(match[1], match[2]).test(title);
+ }
+ } else if (match.indexOf("=") === 0) {
+ match = match.match(/^=\s*"(.*)"$/);
+ if (match) {
+ return title === match[1];
+ }
+ } else if (match.indexOf("^=") === 0) {
+ match = match.match(/^\^=\s*"(.*)"$/);
+ if (match) {
+ return title.indexOf(match[1]) === 0;
+ }
+ } else if (match.indexOf("$=") === 0) {
+ match = match.match(/^\$=\s*"(.*)"$/);
+ if (match) {
+ return title.endsWith(match[1]);
+ }
+ } else if (match.indexOf("*=") === 0) {
+ match = match.match(/^\*=\s*"(.*)"$/);
+ if (match) {
+ return title.indexOf(match[1]) !== -1;
+ }
+ }
+ }
+ return matchPattern(url, pattern);
+ }
+
+ function matchPattern(url, pattern) {
+ if (pattern === '') {
+ return true;
+ }
+ try {
+ let match = pattern.match(/^(\*|[\w-]+):\/{2,3}(?:(\*|\*\.[^/*]+|[^/*]+)\/)?(.*)$/);
+ if (!match) return url.indexOf(pattern) !== -1;
+ const [, scheme, host, path] = match;
+ const urlScheme = url.split(':')[0];
+ const urlParam = new URL(url);
+ if (scheme === '*' || urlScheme === scheme) {
+ if (host !== '*') {
+ const urlHost = urlParam.hostname;
+ if (host.startsWith('*')) {
+ const hostPattern = host.slice(2);
+ if (!urlHost.endsWith(hostPattern)) return false;
+ } else {
+ if (urlHost !== host) return false;
}
}
+ const urlPath = urlParam.pathname + urlParam.search;
+ const pathRegex = new RegExp(`^${path.replace(/([\.\?])/g, '\\$1').replace(/\*/g, '.*')}$`);
+ return pathRegex.test(urlPath);
}
- if(ele.nodeName=="DIV"){
- var nr = ele.querySelector("div>div");
- if(nr){
- var nra=nr.querySelectorAll("a");
- for(i=0;i {
+ GM_unregisterMenuCommand(killRightRegister);
+ GM_unregisterMenuCommand(hidePictureRegister);
+ hidePicture = !hidePicture;
+ GM_setValue("hidePicture", hidePicture);
+ registerMenuCommand();
+ });
+ killRightRegister = GM_registerMenuCommand(killRight ? "✅ 恢复右边栏与布局" : "❌ 隐藏右边栏并多列显示", () => {
+ GM_unregisterMenuCommand(killRightRegister);
+ GM_unregisterMenuCommand(hidePictureRegister);
+ killRight = !killRight;
+ GM_setValue("killRight", killRight);
+ registerMenuCommand();
+ });
+ }
+
+ function run() {
+ try {
+ if (location.host === "greasyfork.org") {
+ function initConfig() {
+ let parent = document.querySelector('#additional-info');
+ let baseCon = document.createElement('div');
+ baseCon.style.margin = '20px';
+ parent.insertBefore(baseCon, parent.children[0]);
+ let checkIndex = 0;
+ let createCheckbox = (name, defaultValue) => {
+ let box = document.createElement('div');
+ let checkbox = document.createElement('input');
+ checkbox.type = 'checkbox';
+ checkbox.checked = defaultValue;
+ let id = 'stcnsc-checkbox' + checkIndex++;
+ checkbox.id = id;
+ let label = document.createElement('label');
+ label.setAttribute('for', id);
+ label.innerText = name;
+ box.appendChild(checkbox);
+ box.appendChild(label);
+ baseCon.appendChild(box);
+ return checkbox;
+ };
+ let hidePictureInput = createCheckbox('隐藏图片并简化样式', hidePicture);
+ let killRightInput = createCheckbox('隐藏右边栏并多列显示', killRight);
+ let keepBaijiaInput = createCheckbox('保留百家号', keepBaijia);
+ let importInput = document.createElement('textarea');
+ importInput.placeholder = '订阅 uBlacklist 规则:如 https://git.io/ublacklist';
+ importInput.style.width = '100%';
+ importInput.style.marginBottom = '10px';
+ baseCon.appendChild(importInput);
+ let blackListInput = document.createElement('textarea');
+ blackListInput.placeholder = '*://*.12345.cn/*\n*://*.54321.com/*\n一行一条';
+ blackListInput.style.width = '100%';
+ blackListInput.style.minHeight = "60px";
+ blackListInput.value = blackList.join("\n");
+ baseCon.appendChild(blackListInput);
+ function saveBlackList() {
+ GM_setValue("blackList", blackList);
}
+ let saveBtn = document.createElement('button');
+ saveBtn.innerText = '保存';
+ saveBtn.style.display = 'block';
+ saveBtn.style.fontSize = 'x-large';
+ saveBtn.style.fontWeight = 'bold';
+ saveBtn.style.pointerEvents = 'all';
+ saveBtn.style.cursor = 'pointer';
+ saveBtn.addEventListener("click", function(e) {
+ hidePicture = hidePictureInput.checked;
+ killRight = killRightInput.checked;
+ keepBaijia = keepBaijiaInput.checked;
+ GM_setValue("hidePicture", hidePicture);
+ GM_setValue("killRight", killRight);
+ GM_setValue("keepBaijia", keepBaijia);
+ if (importInput.value) {
+ alert("读取规则中……");
+ let importUrls = importInput.value.trim().split("\n");
+ importUrls.forEach(url => {
+ url = url && url.trim();
+ if (!url) return;
+ GM_xmlhttpRequest({
+ url: url,
+ onload: function(res) {
+ let result = res.response || res.responseText;
+ if (!result) return;
+ blackList = blackList.concat(result.split("\n"));
+ blackList = blackList.filter((value, index) => blackList.indexOf(value) === index);
+ saveBlackList();
+ blackListInput.value = blackList.join("\n");
+ },
+ onerror: function(e) {
+ console.log(e);
+ alert("网络错误,导入失败");
+ }
+ });
+ });
+ } else {
+ blackList = blackListInput.value.split("\n");
+ saveBlackList();
+ }
+ alert("设置完毕");
+ });
+ baseCon.appendChild(saveBtn);
+ baseCon.appendChild(document.createElement("hr"));
+ }
+ if (document.readyState == "complete") {
+ initConfig();
+ } else {
+ document.addEventListener("readystatechange", e => {
+ if (document.readyState == "complete") {
+ initConfig();
+ }
+ });
}
+ return;
}
- }else{
- let eles=ele.querySelectorAll("#content_left>div,#content_left>table");
- [].forEach.call(eles, e=>{clearOneAD(e)});
- }
+ registerMenuCommand();
+ GM_registerMenuCommand("👁️ 检查屏蔽元素", () => {
+ alert(`屏蔽元素数量:${document.body.querySelectorAll(".blocked").length}`)
+ document.body.classList.toggle("showBlocked");
+ });
+ GM_registerMenuCommand("🔧 打开设置页", () => {
+ GM_openInTab("https://greasyfork.org/scripts/24192", {active: true});
+ });
+ } catch(e) {}
+ clearAD();
+ }
+
+ if (document.readyState == "complete" || document.readyState == "interactive") {
+ run();
+ } else {
+ document.addEventListener("readystatechange", e => {
+ if (document.readyState == "interactive") {
+ run();
+ }
+ });
}
- setTimeout(()=>{clearAD();},2000);
})();
\ No newline at end of file
diff --git a/Pagetual/README.md b/Pagetual/README.md
index aff6c273ab3..40854710e73 100644
--- a/Pagetual/README.md
+++ b/Pagetual/README.md
@@ -1,8 +1,8 @@
-[☯️](https://greasyfork.org/scripts/438684 "Install from greasyfork")東方永頁機 [v.1.9.37.31](https://greasyfork.org/scripts/438684-pagetual/code/Pagetual.user.js "Latest version")
+[☯️](https://greasyfork.org/scripts/438684 "Install from greasyfork")東方永頁機 [v.1.9.37.131](https://hoothin.github.io/UserScripts/Pagetual/pagetual.user.js "Latest version")
==
-*Pagetual - Perpetual pages. Auto loading paginated web pages for 90% of all web sites !* [**📖Guide**](https://pagetual.hoothin.com/ "Wiki site for pagetual")
+*Pagetual - Perpetual pages. Auto loading paginated web pages for 90% of all web sites !*
-🔧CONFIGURATION PAGE🔧
+🔧CONFIGURATION PAGE
@@ -13,26 +13,101 @@ https://raw.githubusercontent.com/hoothin/UserScripts/master/Pagetual/pagetualRu
+
+Pagetual User-defined rules cases
+
++ [TerenceCK pagetualRules](https://github.com/TerenceCK/pagetualRules/blob/main/happymh.json)
++ [Liu's-Pagetual-Rule](https://github.com/JPLiu/TestFiles/blob/main/UserScripts/Pagetual/Liu's-Pagetual-Rule.json)
++ [skofkyo pagetualRules_EX](https://github.com/skofkyo/AutoPager/blob/main/pagetualRules_EX.json)
++ [MovByte eToolsPagetual](https://gist.github.com/MovByte/a585456490d2e1c8ca815871db0887f7)
+
+
+
+
+Call functionality from other extensions
+
+
+1. **Immediately load next page**
+
+> Please send the following message body:
+```
+command: "pagetual"
+action: "nextPage"
+detail: The number of pages to turn, 0 for unlimited, -1 to stop
+```
+
+> For example:
+```
+window.postMessage({ action: 'nextPage', command: 'patetual', detail: 5 }, '*');
+```
+
+2. **Set configuration**
+
+> Please send the following message body:
+```
+command: "pagetual"
+action: "config"
+detail: The configuration item to be changed
+```
+
+> For example:
+```
+window.postMessage({ action: 'config', command: 'patetual', detail: {enableWhiteList: true} }, '*');
+```
+
+3. **Click load more button**
+
+> Please send the following message body:
+```
+command: "pagetual"
+action: "loadMore"
+detail: null by default, 0 for unlimited checking load more button, -1 to stop
+```
+
+> For example:
+```
+window.postMessage({ action: 'loadMore', command: 'patetual', detail: 0 }, '*');
+```
++ **Receive messages**
+
+> When the next page is inserted, the following message body will be sent:
+```
+{
+ action: 'insert',
+ command: 'patetual'
+}
+```
+
+> When the last page has been reached, the following message body will be sent:
+```
+{
+ action: 'lastPage',
+ command: 'patetual'
+}
+```
+
+
[Rules example](https://pagetual.hoothin.com/en/rule.html)
==
diff --git a/Pagetual/items_all.json b/Pagetual/items_all.json
index 1448a333a5e..2b5769c0881 100644
--- a/Pagetual/items_all.json
+++ b/Pagetual/items_all.json
@@ -1,4 +1,341 @@
[
+{
+ "resource_url": "http://wedata.net/items/86244",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "//div[starts-with(@id, 'zone-twilight')]//div[@class='zone__content']",
+ "nextLink": "//a[@rel='next']",
+ "url": "^https://www\\.huffpost\\.com/",
+ "exampleUrl": "https://www.huffpost.com/news/"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "Griever3",
+ "name": "HuffPost",
+ "created_at": "2024-08-31T07:10:48+09:00",
+ "updated_at": "2024-08-31T07:10:48+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86242",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "//div[@class='sysItemList aa']/ul",
+ "nextLink": "//div[@class='sysPagination']/ul/li[last()]/a",
+ "url": "^https://mirai-dora-world-online\\.com/",
+ "exampleUrl": "https://mirai-dora-world-online.com/ic"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "タックン君",
+ "name": "ドラえもん未来デパート オンライン",
+ "created_at": "2024-08-27T18:01:20+09:00",
+ "updated_at": "2024-08-27T18:01:20+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86240",
+ "data": {
+ "pageElement": "//div[@class='act-video-list']",
+ "nextLink": "//div[@class='pagination']/b/a[text()='次へ']\r\n",
+ "url": "^https://www.minnano-av\\.com/",
+ "exampleUrl": "https://www.minnano-av.com/actress218689.html"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "blekai",
+ "name": "みんなのAV.com",
+ "created_at": "2024-08-04T09:53:36+09:00",
+ "updated_at": "2024-08-18T14:37:33+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86239",
+ "data": {
+ "pageElement": "//div[@class='grid grid-cols-2 md:grid-cols-3 xl:grid-cols-4 gap-5']",
+ "nextLink": "//span[@class='relative z-0 inline-flex shadow-sm']/a[last()][@rel='next']",
+ "url": "^https://missav\\.com/",
+ "exampleUrl": "https://missav.com/dm36/ja/actresses/%E4%B8%80%E4%B9%8B%E7%80%AC%E3%81%99%E3%81%9A"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "blekai",
+ "name": "MISSAV",
+ "created_at": "2024-08-02T17:07:28+09:00",
+ "updated_at": "2024-08-04T10:06:35+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86237",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "//div[@class='glry']",
+ "nextLink": "//a[img[@src='imgs/next-page.jpg']]",
+ "url": "^https://www\\.creativeuncut\\.com/",
+ "exampleUrl": "https://www.creativeuncut.com/art_kirbys-return-to-dream-land_a.html"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "Griever3",
+ "name": "Creative Uncut Video Game Art Library",
+ "created_at": "2024-07-21T21:42:18+09:00",
+ "updated_at": "2024-07-21T21:42:18+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86236",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "id('NWrelart:Body release_list')[last()]/*",
+ "nextLink": "//img[@alt='next']/parent::a",
+ "url": "^https://www\\.cdjournal\\.com/",
+ "exampleUrl": "https://www.cdjournal.com/main/news/?type=new\r\nhttps://www.cdjournal.com/release/do/?target=cd&g=all&term=current"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "Griever3",
+ "name": "CDJournal.com",
+ "created_at": "2024-07-21T21:37:56+09:00",
+ "updated_at": "2024-07-21T21:37:56+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86235",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "//div[@class='c-arrows']/preceding-sibling::ul[@class='l-list']",
+ "nextLink": "descendant::a[contains(@class,'next')][last()]",
+ "url": "^https://footwearnews\\.com/",
+ "exampleUrl": "https://footwearnews.com/page/2/"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "Griever3",
+ "name": "Footwear News",
+ "created_at": "2024-07-14T08:28:01+09:00",
+ "updated_at": "2024-07-14T08:28:01+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86234",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "//div[contains(concat(' ',@class,' '),' layout-book-section ')]",
+ "nextLink": "//li[contains(concat(' ',@class,' '),' to-next ')]/a",
+ "url": "^https://comic-boost\\.com/",
+ "exampleUrl": "https://comic-boost.com/genre/\r\nhttps://comic-boost.com/tag/%E7%95%B0%E4%B8%96%E7%95%8C"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "t_f_m'",
+ "name": "comic boost 検索・一覧系",
+ "created_at": "2024-06-24T22:04:17+09:00",
+ "updated_at": "2024-06-24T22:04:17+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86233",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "//div[contains(concat(' ', @class, ' '), ' browsetableinside ')]/ul",
+ "nextLink": "//a[contains(@class, 'active')][number()>0]/following-sibling::a[1]",
+ "url": "^https://xxxclub\\.(cc|to)/",
+ "exampleUrl": "https://xxxclub.cc/torrents/browse/0/\r\nhttps://xxxclub.to/torrents/browse/1/"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "Griever3",
+ "name": "XXXClub",
+ "created_at": "2024-06-14T19:18:16+09:00",
+ "updated_at": "2024-06-14T19:18:16+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86231",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "//div[contains(concat(' ', normalize-space(@class), ' '), ' article-body ')]|//div[contains(concat(' ', normalize-space(@class), ' '), ' gallery-image ')]",
+ "nextLink": "//a[contains(concat(' ', normalize-space(@class), ' '), ' --next ')]",
+ "url": "^https://shueisha\\.online/articles/",
+ "exampleUrl": "https://shueisha.online/articles/-/250383"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "altpragmatist",
+ "name": "集英社オンライン",
+ "created_at": "2024-06-03T11:08:46+09:00",
+ "updated_at": "2024-06-03T11:08:46+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86228",
+ "data": {
+ "pageElement": "//div[@class='p-content']/div[.//img]",
+ "nextLink": "//a[@rel='next']",
+ "url": "^https://filmarks\\.com/users/",
+ "exampleUrl": "https://filmarks.com/users/dpandaramu/clips\r\nhttps://filmarks.com/users/dpandaramu/followers"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "shaolon",
+ "name": "filmarks /users/",
+ "created_at": "2024-05-23T14:24:20+09:00",
+ "updated_at": "2024-08-06T22:08:35+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86227",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "id('load_more_target')",
+ "nextLink": "//span[@aria-current='page'][number()>0]/following-sibling::a[1]",
+ "url": "^https://jp\\.cryptonews\\.com/",
+ "exampleUrl": "https://jp.cryptonews.com/news/"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "Griever3",
+ "name": "jp.cryptonews.com",
+ "created_at": "2024-05-16T20:23:44+09:00",
+ "updated_at": "2024-05-16T20:23:44+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86226",
+ "data": {
+ "pageElement": "//div[@class=\"m-pager\"]/preceding-sibling::*[./preceding-sibling::*]",
+ "nextLink": "//ul[@class='m-pager-list']/li[./span]/following-sibling::li/a",
+ "url": "^https://www\\.fnn\\.jp/articles/-/\\d",
+ "exampleUrl": "https://www.fnn.jp/articles/-/652714"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "t_f_m'",
+ "name": "マンガ『会社をやめて馬主やります! アキコノユメヲ』 / fnnプライムオンライン",
+ "created_at": "2024-05-14T01:07:54+09:00",
+ "updated_at": "2024-05-14T01:25:52+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86223",
+ "data": {
+ "pageElement": "//div[@class='book-product-wrapper']",
+ "insertBefore": "//div[@class='width-container']/node()[last()]",
+ "nextLink": "//li[contains(concat(' ',@class,' '),' to-next ')]/a",
+ "url": "^https://comic-boost\\.com/content/",
+ "exampleUrl": "https://comic-boost.com/content/00050001"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "t_f_m'",
+ "name": "comic boost",
+ "created_at": "2024-04-23T03:06:24+09:00",
+ "updated_at": "2024-06-24T22:05:45+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86219",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "//ul[contains(concat(' ', @class, ' '), ' usercar-list ')]",
+ "nextLink": "//a[contains(@id,'lnkNext') or @class='page-num next']",
+ "url": "^https://minkara\\.carview\\.co\\.jp/usercar/",
+ "exampleUrl": "https://minkara.carview.co.jp/usercar/\r\nhttps://minkara.carview.co.jp/usercar/decotora/"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "Griever3",
+ "name": "みんカラ /usercar/",
+ "created_at": "2024-04-03T16:29:47+09:00",
+ "updated_at": "2024-04-03T16:29:47+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86218",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "//div[@class='single_page_text']",
+ "nextLink": "//span[contains(@class, 'current')][number()>0]/following-sibling::a[1]",
+ "url": "^https://juventus-journal\\.com/archives/\\d+",
+ "exampleUrl": "https://juventus-journal.com/archives/129133"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "Griever3",
+ "name": "J-JOURNAL 記事",
+ "created_at": "2024-04-02T18:03:47+09:00",
+ "updated_at": "2024-04-02T18:03:47+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86217",
+ "data": {
+ "pageElement": "//div[contains(@class,'page-num') or @class='pagechunk']/preceding-sibling::*[self::ul[starts-with(@class, 'summary')] or .//a[contains(@href, '/userid/')]]",
+ "nextLink": "//a[contains(@id,'lnkNext') or @class='page-num next']",
+ "url": "^https?://minkara\\.carview\\.co\\.jp/",
+ "exampleUrl": "https://minkara.carview.co.jp/car/mini/mini/partsreview/ https://minkara.carview.co.jp/car/mini/mini/note/ https://minkara.carview.co.jp/usercar/decotora/ https://minkara.carview.co.jp/note/?ci=1 https://minkara.carview.co.jp/partsreview/?bi=1&ci=1\r\n\r\nhttps://minkara.carview.co.jp/search/?q=f-zero&c=0\r\nhttps://minkara.carview.co.jp/blog/\r\nhttps://minkara.carview.co.jp/review/\r\n\r\nhttps://minkara.carview.co.jp/spot/unit.aspx\r\nhttps://minkara.carview.co.jp/like/1/\r\nhttps://minkara.carview.co.jp/select/\r\nhttps://minkara.carview.co.jp/summary/newly/\r\nhttps://minkara.carview.co.jp/summary/ranking/"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "kenzou_ogawa2",
+ "name": "みんカラ",
+ "created_at": "2024-03-30T10:35:10+09:00",
+ "updated_at": "2024-04-02T22:19:12+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86216",
+ "data": {
+ "pageElement": "//div[@class='product-list product-list--collection product-list--with-sidebar']",
+ "nextLink": "//a[@rel='next']",
+ "url": "^https://jp\\.daisonet\\.com/",
+ "exampleUrl": "https://jp.daisonet.com/collections/electricity"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "タックン君",
+ "name": "ダイソーネットストア",
+ "created_at": "2024-03-20T15:18:37+09:00",
+ "updated_at": "2024-03-20T15:21:04+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86215",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "//section[contains(concat(' ', @class, ' '), ' main-post-list ')]/ul",
+ "nextLink": "//div[contains(concat(' ', @class, ' '), ' pagination ')]/span[contains(@class, 'current')][number()>0]/following-sibling::a[1]",
+ "url": "^https://blog\\.domesoccer\\.jp/",
+ "exampleUrl": "https://blog.domesoccer.jp/"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "Griever3",
+ "name": "ドメサカブログ",
+ "created_at": "2024-03-11T18:17:35+09:00",
+ "updated_at": "2024-03-11T18:17:35+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86214",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "//div[contains(concat(' ', @class, ' '), ' hentry ')]",
+ "nextLink": "//a[@rel='next']",
+ "url": "^https://worldfn\\.net/",
+ "exampleUrl": "https://worldfn.net/\r\nhttps://worldfn.net/search/%E6%97%A5%E6%9C%AC?p=2"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "Griever3",
+ "name": "WorldFootballNewS",
+ "created_at": "2024-03-11T18:12:36+09:00",
+ "updated_at": "2024-03-11T18:12:36+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86213",
+ "data": {
+ "pageElement": "//div[@class='theme-grid row justify-content-center']",
+ "nextLink": "//a[@data-toggle='page-jump']/following-sibling::a[1]",
+ "url": "^https?://themeplaza\\.art/",
+ "exampleUrl": "https://themeplaza.art/themes"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "タックン君",
+ "name": "Theme Plaza",
+ "created_at": "2024-03-09T17:58:59+09:00",
+ "updated_at": "2024-03-09T23:42:39+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86212",
+ "data": {
+ "insertBefore": "",
+ "pageElement": "//table[contains(@class, 'a-bordered')]/tbody/tr",
+ "nextLink": "//a[text()='次へ']",
+ "url": "^https?://www\\.amazon\\.co\\.jp/gp/css/gc/balance",
+ "exampleUrl": "https://www.amazon.co.jp/gp/css/gc/balance?ref_=ya_d_c_gc"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "foo2",
+ "name": "Amazon.co.jp - ギフトカード残高",
+ "created_at": "2024-03-07T23:04:44+09:00",
+ "updated_at": "2024-03-07T23:04:44+09:00"
+},
+{
+ "resource_url": "http://wedata.net/items/86211",
+ "data": {
+ "pageElement": "//div[@class='pagesprit01']/preceding-sibling::*",
+ "nextLink": "//p[@class='next-page-link']/a",
+ "url": "^https://monomax\\.jp/archives/\\d+",
+ "exampleUrl": "https://monomax.jp/archives/213091/"
+ },
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "Griever3",
+ "name": "モノマックス(MonoMax)",
+ "created_at": "2024-03-03T20:05:40+09:00",
+ "updated_at": "2024-05-26T14:32:51+09:00"
+},
{
"resource_url": "http://wedata.net/items/86208",
"data": {
@@ -32,16 +369,16 @@
{
"resource_url": "http://wedata.net/items/86205",
"data": {
- "pageElement": "//ul[contains(@class,'-list')]",
+ "pageElement": "//section[@class='itemlist']/ul",
"nextLink": "//a[contains(@id,'lnkNext')]",
- "url": "^https:\\/\\/minkara.carview.co.jp\\/",
- "exampleUrl": "https://minkara.carview.co.jp/search/?q=f-zero&c=0\r\nhttps://minkara.carview.co.jp/blog/\r\nhttps://minkara.carview.co.jp/review/"
+ "url": "^https://minkara\\.carview\\.co\\.jp/search/",
+ "exampleUrl": "https://minkara.carview.co.jp/search/?q=f-zero&c=0"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "foo2",
- "name": "みんカラ",
+ "name": "みんカラ /search/",
"created_at": "2024-01-23T11:13:33+09:00",
- "updated_at": "2024-01-23T13:20:45+09:00"
+ "updated_at": "2024-04-03T18:34:02+09:00"
},
{
"data": {
@@ -180,8 +517,7 @@
{
"resource_url": "http://wedata.net/items/86189",
"data": {
- "insertBefore": "",
- "pageElement": "//div[contains(concat(' ',@class,' '),' itemcolmn ')]/div",
+ "pageElement": "//div[@class='searchinfo-mainwrap-center']/div[contains(concat(' ',@class,' '),' itemcolmn ')]/div",
"nextLink": "//a[contains(concat(' ',@class,' '),' next ')]",
"url": "^https://netmall\\.hardoff\\.co\\.jp/cate/",
"exampleUrl": "https://netmall.hardoff.co.jp/cate/00010012/?q=%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3"
@@ -190,7 +526,7 @@
"created_by": "t_f_m'",
"name": "HARD OFF 通販 netmall",
"created_at": "2023-11-24T18:38:36+09:00",
- "updated_at": "2023-11-24T18:38:36+09:00"
+ "updated_at": "2024-04-21T11:38:31+09:00"
},
{
"resource_url": "http://wedata.net/items/86188",
@@ -843,16 +1179,16 @@
{
"resource_url": "http://wedata.net/items/86110",
"data": {
- "pageElement": "//section[@class='content']/*[not((.|preceding-sibling::div)[contains(@class, 'pagination')])]|id('wym_custom_archive')",
- "nextLink": "//li[contains(@class, 'current')][number()>0]/following-sibling::li[1]/a",
+ "pageElement": "(//section[@class='content']|//div[@class='fc content selector'])[last()]/*[not(preceding-sibling::div[.//li[contains(@class, 'pagePager__item-current')]])]|id('wym_custom_archive')",
+ "nextLink": "//li[contains(@class, 'current')][number()>0]/following-sibling::li[1]/a|//div[@class='wym_front_more']/a",
"url": "^https://young-machine\\.com/",
- "exampleUrl": "https://young-machine.com/2022/08/06/354094/\r\nhttps://young-machine.com/latest-model/\r\nhttps://young-machine.com/2023/09/15/489213/"
+ "exampleUrl": "https://young-machine.com/latest-article/\r\nhttps://young-machine.com/page/2/\r\nhttps://young-machine.com/2022/08/06/354094/\r\nhttps://young-machine.com/2023/09/15/489213/\r\nhttps://young-machine.com/creator/2024/05/18/547866/"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "t_f_m'",
"name": "WEBヤングマシン",
"created_at": "2023-04-25T20:55:07+09:00",
- "updated_at": "2023-09-28T18:34:32+09:00"
+ "updated_at": "2024-05-23T17:57:09+09:00"
},
{
"data": {
@@ -3753,33 +4089,32 @@
"updated_at": "2022-01-24T19:38:36+09:00"
},
{
+ "resource_url": "http://wedata.net/items/85824",
"data": {
- "insertBefore": "",
"pageElement": "//div[@class=\"p-body-pageContent\"]//article[contains(concat(\" \", normalize-space(@class), \" \"), \" message \")]",
"nextLink": "//link[@rel=\"next\"]",
- "url": "^https?://www\\.racedepartment\\.com/threads/?",
+ "url": "^https?://www\\.(racedepartment\\.com|overtake\\.gg)/threads/?",
"exampleUrl": "https://www.racedepartment.com/threads/assetto-corsa-latest-news-discussion.44395/"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "awoifajwojfiawf",
- "resource_url": "http://wedata.net/items/85824",
- "name": "RaceDepartment Forums",
+ "name": "OverTake (Formerly RaceDepartment) Forums",
"created_at": "2022-01-23T20:29:59+09:00",
- "updated_at": "2022-01-23T20:29:59+09:00"
+ "updated_at": "2024-08-19T05:05:04+09:00"
},
{
"resource_url": "http://wedata.net/items/85823",
"data": {
"pageElement": "descendant::*[./*[@data-author]][1]/*[@data-author]",
"nextLink": "//link[@rel=\"next\"]",
- "url": "^https?://www\\.racedepartment\\.com/",
+ "url": "^https?://www\\.(racedepartment\\.com|overtake\\.gg)/",
"exampleUrl": "https://www.racedepartment.com/downloads/categories/ac-tracks.8/\r\nhttps://www.racedepartment.com/search/15502838/?q=test&o=relevance\r\nhttps://www.racedepartment.com/\r\nhttps://www.racedepartment.com/whats-new/media/1019969/\r\nhttps://www.racedepartment.com/store/categories/fanatec.2/\r\n"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "awoifajwojfiawf",
- "name": "RaceDepartment",
+ "name": "OverTake (Formerly RaceDepartment)",
"created_at": "2022-01-23T20:15:46+09:00",
- "updated_at": "2022-01-23T20:40:55+09:00"
+ "updated_at": "2024-08-19T05:04:54+09:00"
},
{
"resource_url": "http://wedata.net/items/85822",
@@ -4328,17 +4663,17 @@
{
"resource_url": "http://wedata.net/items/85782",
"data": {
- "insertBefore": "",
- "pageElement": "//ul[contains(@class,\"editorial\") and contains(@class,\"compact\")]",
+ "pageElement": "id('river')//*[contains(concat(' ', @class, ' '), ' editorial ')]",
+ "comment": "cf. http://wedata.net/items/32471?rev=156036",
"nextLink": "//a[@title=\"Next page\"]",
"url": "^https://comicvine\\.gamespot\\.com/",
- "exampleUrl": "https://comicvine.gamespot.com/characters/ https://comicvine.gamespot.com/series/ https://comicvine.gamespot.com/movies/ https://comicvine.gamespot.com/issues/"
+ "exampleUrl": "https://comicvine.gamespot.com/characters/ https://comicvine.gamespot.com/series/ https://comicvine.gamespot.com/movies/ https://comicvine.gamespot.com/issues/\r\nhttps://comicvine.gamespot.com/news/"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "kenzou_ogawa2",
"name": "Comic Vine",
"created_at": "2022-01-05T11:43:59+09:00",
- "updated_at": "2022-01-05T11:43:59+09:00"
+ "updated_at": "2024-07-21T21:35:03+09:00"
},
{
"resource_url": "http://wedata.net/items/85781",
@@ -4732,14 +5067,14 @@
"data": {
"pageElement": "//div[@class=\"interview-container\"]/div[position()>2]",
"nextLink": "descendant::div[contains(@class,\"bottom\")][1]//a[not(contains(@class,\"prev\"))]",
- "url": "^https://www\\.nintendo\\.co\\.jp/interview/",
- "exampleUrl": "https://www.nintendo.co.jp/interview/switch-oled/index.html"
+ "url": "^https://www\\.nintendo\\.com/jp/interview/",
+ "exampleUrl": "https://www.nintendo.com/jp/interview/switch-oled/index.html"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "t_f_m_",
"name": "開発者に訊きました 任天堂",
"created_at": "2021-10-08T23:17:05+09:00",
- "updated_at": "2021-10-09T08:07:07+09:00"
+ "updated_at": "2024-04-07T07:46:34+09:00"
},
{
"resource_url": "http://wedata.net/items/85725",
@@ -5379,7 +5714,7 @@
{
"resource_url": "http://wedata.net/items/85630",
"data": {
- "pageElement": "//main//div[contains(@class, 'kanren')]/*\r\n|//div[@class='entry-content']/h2[1]/preceding-sibling::*[1]/following-sibling::*",
+ "pageElement": "//main//aside/div[contains(@class, 'kanren')]/*\r\n|//div[@class='entry-content']/h2[1]/preceding-sibling::*[1]/following-sibling::*",
"nextLink": "//link[@rel=\"next\"]",
"url": "^https?://bushoojapan\\.com/",
"exampleUrl": "https://bushoojapan.com/\r\nhttps://bushoojapan.com/bushoo/others/2022/01/05/87277"
@@ -5388,7 +5723,7 @@
"created_by": "kenzou_ogawa",
"name": "BUSHOO!JAPAN(武将ジャパン)",
"created_at": "2021-03-29T13:14:01+09:00",
- "updated_at": "2022-01-10T08:48:36+09:00"
+ "updated_at": "2024-05-02T20:14:59+09:00"
},
{
"resource_url": "http://wedata.net/items/85627",
@@ -5494,17 +5829,17 @@
{
"resource_url": "http://wedata.net/items/85609",
"data": {
- "insertBefore": "id('entry')/div[div[@class='pager']]",
"pageElement": "id('entry')/div[(@class='block' and not(.//p[@class='hdg'])) or .//div[@class='thumb']]",
+ "insertBefore": "id('entry')/div[div[@class='pager']]",
"nextLink": "//div[@class='pager']//a[@class='btn' and span/i[contains(concat(' ', @class, ' '), ' fa-arrow-right ')]]",
- "url": "^https://www.chunichi.co.jp/article/.+?",
- "exampleUrl": ""
+ "url": "^https://www\\.chunichi\\.co\\.jp/article/\\d+",
+ "exampleUrl": "https://www.chunichi.co.jp/article/947611/1"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "htsign00",
"name": "中日新聞",
"created_at": "2021-02-13T15:46:27+09:00",
- "updated_at": "2021-02-13T15:46:27+09:00"
+ "updated_at": "2024-08-25T08:37:46+09:00"
},
{
"resource_url": "http://wedata.net/items/85606",
@@ -6060,16 +6395,16 @@
{
"resource_url": "http://wedata.net/items/85518",
"data": {
- "pageElement": "//*[./div[contains(@data-href,\"/article/\")]] | //div[@class=\"cmp-thmb002\"]/div[@class=\"wrp\"]",
- "nextLink": "//div[@class=\"pager\"]//a[contains(span/text(),\"次\")] | //a[@class=\"lnk next\"]",
+ "pageElement": "//div[@class='pager']/../preceding-sibling::div[1][contains(@class, '-lst00')]",
+ "nextLink": "//div[@class='cmp-misc002']//li[@class='is-active']/following-sibling::li[1]/a[number() > 0]",
"url": "^https?://www\\.tokyo-np\\.co\\.jp/",
- "exampleUrl": "https://www.tokyo-np.co.jp/tokyo/t_news\r\nhttps://www.tokyo-np.co.jp/tokyo/hotweb/1\r\nhttps://www.tokyo-np.co.jp/article_photo/list?article_id=159660&pid=589621"
+ "exampleUrl": "https://www.tokyo-np.co.jp/tokyo/t_news\r\nhttps://www.tokyo-np.co.jp/tokyo/gururi/1\r\nhttps://www.tokyo-np.co.jp/f/photo/square\r\nhttps://www.tokyo-np.co.jp/beans/recipe\r\nhttps://www.tokyo-np.co.jp/tags/tag_movie\r\nhttps://www.tokyo-np.co.jp/english_articles/covid19_in_english\r\nhttps://www.tokyo-np.co.jp/tags/tokyo140th\r\nhttps://www.tokyo-np.co.jp/n/genpatsu\r\nhttps://www.tokyo-np.co.jp/event/list/buyou"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "brib2",
"name": "東京新聞",
"created_at": "2020-09-29T21:12:21+09:00",
- "updated_at": "2022-02-14T14:20:36+09:00"
+ "updated_at": "2024-04-11T22:18:50+09:00"
},
{
"resource_url": "http://wedata.net/items/85517",
@@ -7676,15 +8011,15 @@
"resource_url": "http://wedata.net/items/85355",
"data": {
"pageElement": "//article[contains(@class, 'hentry')]",
- "nextLink": "//span[@class='current']/following-sibling::a[1]|//link[@rel='prev']",
+ "nextLink": "//span[@class='current']/following-sibling::a[1]|//a[@rel='prev']",
"url": "^https://mon-ja\\.net/.+",
- "exampleUrl": "https://mon-ja.net/articles/page/2/ https://mon-ja.net/200523-01_bicycle-insurance-mandatory/"
+ "exampleUrl": "https://mon-ja.net/articles/page/2/ https://mon-ja.net/tag/nisa/page/2/ https://mon-ja.net/200523-01_bicycle-insurance-mandatory/"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "kenzou_ogawa",
"name": "MonJa",
"created_at": "2020-05-28T12:12:09+09:00",
- "updated_at": "2020-07-16T20:42:07+09:00"
+ "updated_at": "2024-03-17T21:40:07+09:00"
},
{
"resource_url": "http://wedata.net/items/85354",
@@ -9940,17 +10275,17 @@
},
{
"resource_url": "http://wedata.net/items/82197",
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
"data": {
- "pageElement": "//div[@class=\"p-cardList\"]",
+ "pageElement": "//div[contains(concat(' ', @class, ' '), ' p-cardList ')]",
"nextLink": "//link[@rel=\"next\"]",
"url": "^https?://www\\.businessinsider\\.jp/.",
- "exampleUrl": "https://www.businessinsider.jp/articles/"
+ "exampleUrl": "https://www.businessinsider.jp/articles/\r\nhttps://www.businessinsider.jp/moneyplan/"
},
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "jigendaddy_be",
"name": "BUSINESS INSIDER JAPAN",
"created_at": "2019-06-29T07:18:24+09:00",
- "updated_at": "2022-01-19T17:21:08+09:00"
+ "updated_at": "2024-04-13T22:27:04+09:00"
},
{
"resource_url": "http://wedata.net/items/82196",
@@ -10026,18 +10361,17 @@
},
{
"resource_url": "http://wedata.net/items/82190",
- "name": "FRaU",
- "created_by": "t_f_m",
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
- "updated_at": "2019-06-24T20:28:25+09:00",
"data": {
- "exampleUrl": "https://gendai.ismedia.jp/articles/-/65430",
- "url": "^https://gendai\\.ismedia\\.jp/articles/-/",
"pageElement": "//div[@class=\"articleBody\"]",
- "insertBefore": "",
- "nextLink": "//div[@class=\"nextpageTitle\"]/a"
+ "nextLink": "//div[@class=\"nextpageTitle\"]/a",
+ "url": "^https://gendai\\.media/articles/-/",
+ "exampleUrl": "https://gendai.media/articles/-/65430"
},
- "created_at": "2019-06-24T20:28:25+09:00"
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "t_f_m",
+ "name": "FRaU",
+ "created_at": "2019-06-24T20:28:25+09:00",
+ "updated_at": "2024-06-15T08:37:58+09:00"
},
{
"data": {
@@ -11724,20 +12058,6 @@
},
"created_at": "2018-11-20T23:05:03+09:00"
},
-{
- "name": "東京2020特集 - スポーツナビ",
- "data": {
- "url": "^https://2020\\.yahoo\\.co\\.jp/column/",
- "pageElement": "//section[@class=\"article__body\"]",
- "exampleUrl": "https://2020.yahoo.co.jp/column/detail/201810250001-spnavi/",
- "nextLink": "//a[span/text()=\"次へ\"]"
- },
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
- "created_by": "jpmyke",
- "resource_url": "http://wedata.net/items/82021",
- "created_at": "2018-11-16T14:01:22+09:00",
- "updated_at": "2020-04-04T12:21:03+09:00"
-},
{
"resource_url": "http://wedata.net/items/82020",
"name": "Us Weekly",
@@ -11784,17 +12104,17 @@
},
{
"resource_url": "http://wedata.net/items/82017",
- "name": "アルファポリス Web小説 エピソード",
- "created_by": "usefulpocket",
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
- "updated_at": "2018-11-11T22:52:29+09:00",
"data": {
- "exampleUrl": "https://www.alphapolis.co.jp/novel/638137573/992069999/episode/423049",
- "url": "^https://(www\\.)?alphapolis\\.co\\.jp/novel/*",
- "pageElement": "//div[id(\"main\")]/div[contains(@class,\"novel-body\")]",
- "nextLink": "//div[id(\"main\")]/div[contains(@class,\"episode-navigation\")][2]/a[contains(@class,\"next\")]"
+ "pageElement": "id('main')/div[contains(@class, 'novel-body')]",
+ "nextLink": "//a[contains(concat(' ', @class, ' '), ' next ')]",
+ "url": "^https://(www\\.)?alphapolis\\.co\\.jp/novel/\\d+",
+ "exampleUrl": "https://www.alphapolis.co.jp/novel/638137573/992069999/episode/423049"
},
- "created_at": "2018-11-11T22:46:12+09:00"
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "usefulpocket",
+ "name": "アルファポリス Web小説 エピソード",
+ "created_at": "2018-11-11T22:46:12+09:00",
+ "updated_at": "2024-07-02T20:39:29+09:00"
},
{
"resource_url": "http://wedata.net/items/82011",
@@ -14092,7 +14412,7 @@
"resource_url": "http://wedata.net/items/81586",
"data": {
"pageElement": "//section[@data-test-id='mainline']/div[.//article]",
- "insertBefore": "//div[@class='pagination']",
+ "insertBefore": "//div[contains(concat(' ', @class, ' '), ' mainline__footer ')]",
"nextLink": "//a[@data-test-id='next-button']",
"url": "^https://www\\.ecosia\\.org/search\\?",
"exampleUrl": "https://www.ecosia.org/search?q=hallo"
@@ -14101,7 +14421,7 @@
"created_by": "WolframH",
"name": "Ecosia.org Search",
"created_at": "2017-10-06T02:06:47+09:00",
- "updated_at": "2023-10-18T21:08:00+09:00"
+ "updated_at": "2024-07-07T14:03:45+09:00"
},
{
"resource_url": "http://wedata.net/items/81585",
@@ -14164,16 +14484,16 @@
{
"resource_url": "http://wedata.net/items/81579",
"data": {
- "pageElement": "//article/section/div[2]",
+ "pageElement": "//article/section/div[contains(@class, 'kijiwrap')]",
"nextLink": "//link[@rel=\"next\"]",
"url": "^https?://kinmaweb\\.jp/archives/",
- "exampleUrl": "https://kinmaweb.jp/archives/70121"
+ "exampleUrl": "https://kinmaweb.jp/archives/70121 https://kinmaweb.jp/archives/70121/2"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "jigendaddy_be",
"name": "キンマweb",
"created_at": "2017-09-30T13:23:47+09:00",
- "updated_at": "2022-01-01T17:05:39+09:00"
+ "updated_at": "2024-08-18T08:03:14+09:00"
},
{
"resource_url": "http://wedata.net/items/81578",
@@ -15761,7 +16081,7 @@
"created_by": "hatenaZZZ",
"name": "nikkansports",
"created_at": "2017-02-21T19:35:57+09:00",
- "updated_at": "2022-02-14T21:50:28+09:00"
+ "updated_at": "2024-08-27T07:13:41+09:00"
},
{
"resource_url": "http://wedata.net/items/81207",
@@ -16937,17 +17257,17 @@
},
{
"resource_url": "http://wedata.net/items/80969",
- "name": "thehackernews",
- "created_by": "wOxxOm=-",
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
- "updated_at": "2017-09-03T05:14:19+09:00",
"data": {
- "exampleUrl": "http://thehackernews.com/",
+ "pageElement": "id('Blog1')//div[contains(concat(' ', @class, ' '), ' body-post ')]",
+ "nextLink": "id('blog-pager-older-link')/a",
"url": "^https://thehackernews\\.com/",
- "pageElement": "//article",
- "nextLink": "id('blog-pager-older-link')/a"
+ "exampleUrl": "http://thehackernews.com/"
},
- "created_at": "2016-09-01T23:54:09+09:00"
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "wOxxOm=-",
+ "name": "thehackernews",
+ "created_at": "2016-09-01T23:54:09+09:00",
+ "updated_at": "2024-07-21T21:39:48+09:00"
},
{
"resource_url": "http://wedata.net/items/80968",
@@ -18639,8 +18959,8 @@
{
"resource_url": "http://wedata.net/items/79433",
"data": {
- "pageElement": "//ul[@class=\"article-list\"]/li",
- "nextLink": "//span[@class=\"current\"]/following-sibling::a[1]",
+ "pageElement": "//div[@class='color-blog-content-masonry']",
+ "nextLink": "//span[@aria-current='page'][number()>0]/following-sibling::a[1]",
"url": "^https://buzz-plus\\.com/",
"exampleUrl": "https://buzz-plus.com/?s=a"
},
@@ -18648,7 +18968,7 @@
"created_by": "jigendaddy_be",
"name": "バズプラスニュース Buzz+",
"created_at": "2016-02-19T15:43:15+09:00",
- "updated_at": "2020-06-14T18:00:00+09:00"
+ "updated_at": "2024-05-11T09:20:28+09:00"
},
{
"resource_url": "http://wedata.net/items/79432",
@@ -19107,17 +19427,17 @@
},
{
"resource_url": "http://wedata.net/items/77750",
- "name": "小説家になろう ユーザーページ",
- "created_by": "phodra",
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
- "updated_at": "2017-08-25T18:58:43+09:00",
"data": {
- "exampleUrl": "https://syosetu.com/favnovelmain/list/?nowcategory=1&order=newlist\r\nhttps://syosetu.com/favnovelmain/isnoticelist/\r\nhttps://syosetu.com/usernovelimpression/list/\r\nhttps://syosetu.com/favuser/list/\r\nhttps://syosetu.com/messagebox/top/",
+ "pageElement": "//ul[contains(concat(' ',@class,' '),' c-up-panel__list ')]/li",
+ "nextLink": "//div[contains(concat(' ',@class,' '),' c-up-pager ')]//span[contains(concat(' ',@class,' '),' is-current ')]/following-sibling::a",
"url": "^https?://syosetu\\.com/",
- "pageElement": "id('favuser writtingnovellist favuser') | //table | //div[@class='novelcomment_list'] | //ul[@class='bloglist']",
- "nextLink": "//div[@class='pager_idou']/a[@title='next page'] | //div[@class='page_bar']//a[contains(., '>>')]"
+ "exampleUrl": "https://syosetu.com/favnovelmain/list/?nowcategory=1&order=newlist\r\nhttps://syosetu.com/favnovelmain/isnoticelist/\r\nhttps://syosetu.com/usernovelimpression/list/\r\nhttps://syosetu.com/favuser/list/\r\nhttps://syosetu.com/messagebox/top/"
},
- "created_at": "2016-01-04T01:43:02+09:00"
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "phodra",
+ "name": "小説家になろう ユーザーページ",
+ "created_at": "2016-01-04T01:43:02+09:00",
+ "updated_at": "2024-06-22T07:58:54+09:00"
},
{
"resource_url": "http://wedata.net/items/77749",
@@ -19813,7 +20133,8 @@
{
"resource_url": "http://wedata.net/items/77646",
"data": {
- "pageElement": "//div[@class=\"sd-main\"]//*[./a[@title]]",
+ "pageElement": "//div[@class=\"sd-main\"]//*[./div/a[@title]]",
+ "comment": "最後のアイテム内に継ぎ足されていたのを修正",
"nextLink": "//a[@rel='next']",
"url": "^https://speakerdeck\\.com/.+",
"exampleUrl": "https://speakerdeck.com/p/all"
@@ -19822,7 +20143,7 @@
"created_by": "Tanookirby",
"name": "Speaker Deck",
"created_at": "2015-11-08T03:43:39+09:00",
- "updated_at": "2022-01-27T09:39:14+09:00"
+ "updated_at": "2024-06-07T22:14:23+09:00"
},
{
"resource_url": "http://wedata.net/items/77643",
@@ -20027,16 +20348,16 @@
{
"resource_url": "http://wedata.net/items/77625",
"data": {
- "pageElement": "//div[@class='block--2_RlJqhg']",
+ "pageElement": "id('maincontent')/*[not(contains(@class, 'pagination'))]",
"nextLink": "//a[@rel='next']",
"url": "^https?://(www\\.)?macrumors\\.com/",
- "exampleUrl": "https://www.macrumors.com/mac/"
+ "exampleUrl": "https://www.macrumors.com/\r\nhttps://www.macrumors.com/mac/"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "Tanookirby",
"name": "Mac Rumors: Apple Mac iOS Rumors and News You Care About",
"created_at": "2015-11-01T09:39:03+09:00",
- "updated_at": "2020-06-15T08:36:34+09:00"
+ "updated_at": "2024-03-09T12:25:29+09:00"
},
{
"resource_url": "http://wedata.net/items/77624",
@@ -22725,18 +23046,18 @@
"updated_at": "2020-06-07T06:42:42+09:00"
},
{
- "resource_url": "http://wedata.net/items/77057",
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
"data": {
- "pageElement": "//div[@class='topPageNav']/following-sibling::*[./following-sibling::div[@class='btmPageNav']][not(id('kiji'))]|id('kiji')/p[last()]/preceding-sibling::*|id('kiji')/p[last()][./text()]|id('newsListResult')//li",
+ "pageElement": "//div[@class='topPageNav']/following-sibling::*[./following-sibling::div[@class='btmPageNav']][not(id('kiji'))]|id('kiji')/*|id('newsListResult')//li",
"nextLink": "//a[@class='nextPage']|//span[@class='next']/a",
"url": "^https://natgeo\\.nikkeibp\\.co\\.jp",
- "exampleUrl": "https://natgeo.nikkeibp.co.jp/nng/article/20150312/438925/?P=1 https://natgeo.nikkeibp.co.jp/nng/article/20121107/329698/ https://natgeo.nikkeibp.co.jp/atcl/web/15/050700006/050700001/ https://natgeo.nikkeibp.co.jp/atcl/news/22/013100045/ https://natgeo.nikkeibp.co.jp/nng/news/"
+ "exampleUrl": "https://natgeo.nikkeibp.co.jp/nng/article/20150312/438925/?P=1 https://natgeo.nikkeibp.co.jp/nng/article/20121107/329698/ https://natgeo.nikkeibp.co.jp/atcl/web/15/050700006/050700001/ https://natgeo.nikkeibp.co.jp/atcl/news/22/013100045/ https://natgeo.nikkeibp.co.jp/atcl/news/24/041000202/?P=1 https://natgeo.nikkeibp.co.jp/nng/news/"
},
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "t_f_m",
+ "resource_url": "http://wedata.net/items/77057",
"name": "ナショナルジオグラフィック 日経BP",
"created_at": "2015-03-31T18:06:35+09:00",
- "updated_at": "2022-02-08T17:14:18+09:00"
+ "updated_at": "2024-04-10T19:45:55+09:00"
},
{
"resource_url": "http://wedata.net/items/77056",
@@ -23912,6 +24233,7 @@
"data": {
"pageElement": "id('content')//*[@class='container index-container' or @id='image-container' or @id='favcontainer' or @id='tag-container']",
"insertBefore": "//section[@class='pagination']",
+ "comment": "Adjusted the pageElement to not include the image-container because it causes the image size to be small initially. Updated on behalf of: https://github.com/sixcious/infy-scroll/issues/85",
"nextLink": "//a[@class='next']",
"url": "^https?://nhentai\\.net/",
"exampleUrl": "http://nhentai.net/artist/kokutou-nikke/ http://nhentai.net/?page=3 http://nhentai.net/g/124271/1/"
@@ -23920,7 +24242,7 @@
"created_by": "theydonotwant",
"name": "nHentai",
"created_at": "2014-12-28T23:26:34+09:00",
- "updated_at": "2022-11-18T08:32:21+09:00"
+ "updated_at": "2024-05-11T01:15:46+09:00"
},
{
"resource_url": "http://wedata.net/items/76713",
@@ -24913,17 +25235,17 @@
},
{
"resource_url": "http://wedata.net/items/76358",
- "name": "小説家になろう 他ユーザーの各ページ",
- "created_by": "t_f_m",
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
- "updated_at": "2017-10-28T03:35:11+09:00",
"data": {
- "exampleUrl": "http://mypage.syosetu.com/mypageblog/list/userid/227614/\r\nhttp://mypage.syosetu.com/mypageblog/list/userid/76491/\r\nhttp://mypage.syosetu.com/mypageblog/view/userid/227614/blogkey/894986/\r\nhttp://mypage.syosetu.com/mypageblog/view/userid/76491/blogkey/145793/index.php?p=1\r\nhttp://mypage.syosetu.com/mypageblog/view/userid/76491/blogkey/145793/index.php?p=2\r\nhttp://mypage.syosetu.com/mypagefavnovelmain/list/userid/88780/\r\nhttp://mypage.syosetu.com/mypagefavuser/list/userid/88780/\r\nhttp://mypage.syosetu.com/mypagenovelhyoka/list/userid/88780/\r\nhttp://mypage.syosetu.com/mypage/reviewlist/userid/88780/\r\nhttp://xmypage.syosetu.com/mypageblog/list/xid/44910/\r\nhttp://xmypage.syosetu.com/mypageblog/view/xid/24986/blogkey/144187/",
+ "pageElement": "id('bloglistbg bloglist')/div|(id('blogbg')|id('main')/div[@id='blogview']|id('blog_comment')/h3)[not(id('blog_comment')//div[@class='blogcomment_l']/a)]|//div[@class='comment_view']|id('novellist novelpointlist novelreviewlist')/ul|id('favuser')//li|//div[@class='c-novel-list' or contains(concat(' ',@class,' '),' c-panel__list ')]/div",
+ "nextLink": "//a[@title='next page' or @title='次へ' or ../@class='blogcomment_r']|(id('my_blog_l')|//div[@class='my_blog_l'])/a[not(//a[../@class='blogcomment_r'])]",
"url": "^https?://x?mypage\\.syosetu\\.com/mypage",
- "pageElement": "id('bloglistbg bloglist')/div|(id('blogbg')|id('main')/div[@id='blogview']|id('blog_comment')/h3)[not(id('blog_comment')//div[@class='blogcomment_l']/a)]|//div[@class='comment_view']|id('novellist novelpointlist novelreviewlist')/ul|id('favuser')//li",
- "nextLink": "//a[@title='next page' or ../@class='blogcomment_r']|(id('my_blog_l')|//div[@class='my_blog_l'])/a[not(//a[../@class='blogcomment_r'])]"
+ "exampleUrl": "http://mypage.syosetu.com/mypageblog/list/userid/227614/\r\nhttp://mypage.syosetu.com/mypageblog/list/userid/76491/\r\nhttp://mypage.syosetu.com/mypageblog/view/userid/227614/blogkey/894986/\r\nhttp://mypage.syosetu.com/mypageblog/view/userid/76491/blogkey/145793/index.php?p=1\r\nhttp://mypage.syosetu.com/mypageblog/view/userid/76491/blogkey/145793/index.php?p=2\r\nhttp://mypage.syosetu.com/mypagefavnovelmain/list/userid/88780/\r\nhttp://mypage.syosetu.com/mypagefavuser/list/userid/88780/\r\nhttp://mypage.syosetu.com/mypagenovelhyoka/list/userid/88780/\r\nhttp://mypage.syosetu.com/mypage/reviewlist/userid/88780/\r\nhttp://xmypage.syosetu.com/mypageblog/list/xid/44910/\r\nhttp://xmypage.syosetu.com/mypageblog/view/xid/24986/blogkey/144187/\r\nhttps://xmypage.syosetu.com/mypage/novellist/xid/x7149bl/?xid=377112&all=1&all2=1&all3=1&all4=1&p=1"
},
- "created_at": "2014-09-21T11:42:50+09:00"
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "t_f_m",
+ "name": "小説家になろう 他ユーザーの各ページ",
+ "created_at": "2014-09-21T11:42:50+09:00",
+ "updated_at": "2024-03-23T03:29:17+09:00"
},
{
"resource_url": "http://wedata.net/items/76357",
@@ -25466,19 +25788,19 @@
},
{
"resource_url": "http://wedata.net/items/76290",
- "name": "Variety",
"data": {
- "url": "^https://variety\\.com",
"pageElement": "//ul[contains(@class,'o-tease-news-list')]/li[not(.//div[contains(@id,'sponsored')])]",
- "Stylish": "@-moz-document url(\"https://variety.com/\") {\r\n img.lazy { display: inline-block !important; } \r\nli.l-list__item figure a{padding:0;}\r\nli.l-list__item:nth-of-type(-n+14) figure a{opacity:0;height:100%}\r\n}",
"bookmarklet": "Array.prototype.forEach.call(document.querySelectorAll('img'), function(img) { var lazySrc = img.hasAttribute('data-src') ? img.getAttribute('data-src') : img.getAttribute('data-original'); if (lazySrc) { img.src = lazySrc;} });",
- "exampleUrl": "https://variety.com https://variety.com/v/tv/",
- "nextLink": "//div[@class='o-more-link // lrv-u-margin-l-auto']/a"
+ "Stylish": "@-moz-document url(\"https://variety.com/\") {\r\n img.lazy { display: inline-block !important; } \r\nli.l-list__item figure a{padding:0;}\r\nli.l-list__item:nth-of-type(-n+14) figure a{opacity:0;height:100%}\r\n}",
+ "nextLink": "//div[starts-with(normalize-space(@class),'o-more-link // lrv-u-text-align-right ')]/a",
+ "url": "^https://variety\\.com",
+ "exampleUrl": "https://variety.com https://variety.com/v/tv/"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "Tanookirby",
+ "name": "Variety",
"created_at": "2014-09-03T07:41:14+09:00",
- "updated_at": "2020-04-03T06:27:04+09:00"
+ "updated_at": "2024-04-24T23:16:02+09:00"
},
{
"resource_url": "http://wedata.net/items/76288",
@@ -25912,14 +26234,14 @@
"pageElement": "//div[starts-with(@id, 'zone-twilight')]//div[@class='zone__content']",
"comment": "記事の取りこぼし修正。記事に css: order があるため zone__content を取得。",
"nextLink": "//a[@rel='next']",
- "url": "^https?://www\\.huffingtonpost\\.jp/",
- "exampleUrl": "https://www.huffingtonpost.jp/news/"
+ "url": "^https?://www\\.huffingtonpost(\\.co)?\\.\\w{2}/",
+ "exampleUrl": "https://www.huffingtonpost.jp/news/\r\nhttps://www.huffingtonpost.co.uk/news/"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "jigendaddy_be",
"name": "ハフィントンポスト",
"created_at": "2014-08-02T12:33:40+09:00",
- "updated_at": "2023-08-08T20:47:56+09:00"
+ "updated_at": "2024-08-25T08:34:17+09:00"
},
{
"resource_url": "http://wedata.net/items/74999",
@@ -26403,16 +26725,16 @@
{
"resource_url": "http://wedata.net/items/74923",
"data": {
- "pageElement": "//div[contains(@class,'a-archive-grid__story')]|//section[@class='pmc-u-margin-tb-1']//*[div[contains(@class,'o-card')]][1]|//div[@class='story_list_blk']/*|//li[@class='l-list__item'][article]|id('main')/article[@id]",
+ "pageElement": "//div[contains(@class,'a-archive-grid__story')]|//section[@class='pmc-u-margin-tb-1']//*[div[contains(@class,'o-card')]][1]|//div[@class='story_list_blk']/*|id('main')/article[@id]",
"nextLink": "descendant::a[contains(@class,'next')][last()]|//div[@class='nav-previous']/a|//div[contains(@class,'more-stories')]/a[contains(@class,'a-icon-right-arrow')]",
- "url": "^https?://.*(?:bollywoodlife|deadline|footwearnews)\\.com",
- "exampleUrl": "https://www.deadline.com/ https://deadline.com/vcategory/the-contenders-emmys/page/2/ https://deadline.com/tag/caa/page/2/ https://www.bollywoodlife.com/ https://footwearnews.com/page/2/"
+ "url": "^https?://.*(?:bollywoodlife|deadline)\\.com",
+ "exampleUrl": "https://www.deadline.com/ https://deadline.com/vcategory/the-contenders-emmys/page/2/ https://deadline.com/tag/caa/page/2/ https://www.bollywoodlife.com/"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "Tanookirby",
"name": "PMC Brands",
"created_at": "2014-06-26T02:58:29+09:00",
- "updated_at": "2023-10-27T05:46:11+09:00"
+ "updated_at": "2024-07-14T08:26:58+09:00"
},
{
"resource_url": "http://wedata.net/items/74912",
@@ -26488,7 +26810,7 @@
"resource_url": "http://wedata.net/items/74897",
"data": {
"pageElement": "//div[@class='l-article']/div[@class='article-body']",
- "nextLink": "//div[contains(concat(' ',@class,' '),' m-pagination ')]/a[@class='is-active']/following-sibling::a",
+ "nextLink": "//div[contains(concat(' ',@class,' '),' m-pagination ')]/*[@class='is-active']/following-sibling::a",
"url": "^https?://dot\\.asahi\\.com/",
"exampleUrl": "https://dot.asahi.com/wa/2022080300076.html?page=1\r\nhttps://dot.asahi.com/dot/photoarticle/2019060500079.html?page=1\r\nhttps://dot.asahi.com/articles/-/196996?page=1"
},
@@ -26496,7 +26818,7 @@
"created_by": "t_f_m",
"name": "dot asahi",
"created_at": "2014-06-13T17:32:13+09:00",
- "updated_at": "2023-07-26T15:14:34+09:00"
+ "updated_at": "2024-02-27T19:25:45+09:00"
},
{
"resource_url": "http://wedata.net/items/74895",
@@ -31645,17 +31967,18 @@
},
{
"resource_url": "http://wedata.net/items/64117",
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
- "created_at": "2012-10-21T17:22:55+09:00",
"data": {
- "pageElement": "//table[@class='list']//tr[last()]/preceding-sibling::tr[not(@bgcolor)]",
- "exampleUrl": "https://www.bookshop-ps.com/bsp/bsp_mag_search?sha=1&sc=066000",
+ "pageElement": "//table[@class='list']",
+ "comment": "CSSで偶数番目のtr要素が非表示になるためtable要素を取得する必要があります。",
+ "nextLink": "//a[contains(.,'次へ>>>')]",
"url": "^https://(www\\.)?bookshop-ps\\.com/bsp/bsp_(?!detail|magcode)",
- "nextLink": "//a[contains(.,'次へ>>>')]"
+ "exampleUrl": "https://www.bookshop-ps.com/bsp/bsp_mag_search?sha=1&sc=066000"
},
- "updated_at": "2020-05-23T06:23:11+09:00",
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "plais",
"name": "BOOK SHOP 小学館",
- "created_by": "plais"
+ "created_at": "2012-10-21T17:22:55+09:00",
+ "updated_at": "2024-05-10T23:00:31+09:00"
},
{
"resource_url": "http://wedata.net/items/64116",
@@ -32975,7 +33298,7 @@
{
"resource_url": "http://wedata.net/items/62666",
"data": {
- "pageElement": "//div[contains(concat(' ',@class,' '),' tweet_box ')]/div[not(@id)]",
+ "pageElement": "//section[contains(concat(' ',@class,' '),' tweet_box ')]/div[not(@id)]",
"insertBefore": "id('hidden_tweet_box')/following-sibling::node()[1]",
"nextLink": "//link[@rel='next']",
"url": "^https?://togetter\\.com/li/",
@@ -32985,7 +33308,7 @@
"created_by": "t_f_m",
"name": "Togetter 個別記事",
"created_at": "2012-08-08T11:21:17+09:00",
- "updated_at": "2022-11-21T16:25:59+09:00"
+ "updated_at": "2024-07-10T16:59:14+09:00"
},
{
"name": "Staffさん。",
@@ -33044,18 +33367,18 @@
"created_at": "2012-08-02T02:15:15+09:00"
},
{
+ "resource_url": "http://wedata.net/items/62561",
"data": {
- "pageElement": "//main//div[@class=\"l-artlst001\"]|//main//*[./div[@class=\"wrp lv2\"]][.//div[@class=\"thumb\"] and not(.//ul)]",
+ "pageElement": "//main//div[@class=\"cmp-thmb001 pt-20 pb-20\" or @class=\"l-artlst001\"]",
"nextLink": "descendant::li[contains(@class,\"is-active\")][1]/following-sibling::li[1]/a",
- "url": "^https://(www\\.)?chunichi\\.co\\.jp/(chuspo|tags)/",
- "exampleUrl": "https://www.chunichi.co.jp/tags/tag_shimenlink/ https://www.chunichi.co.jp/chuspo/dragons/draban/"
+ "url": "^https://www\\.chunichi\\.co\\.jp/",
+ "exampleUrl": "https://www.chunichi.co.jp/tags/tag_shimenlink/ https://www.chunichi.co.jp/chuspo/dragons/draban/\r\nhttps://www.chunichi.co.jp/tags/yourdigital/yourdigital_repo"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "jigendaddy_be",
- "resource_url": "http://wedata.net/items/62561",
"name": "中日スポーツ-日付別記事一覧系",
"created_at": "2012-07-29T13:47:10+09:00",
- "updated_at": "2021-02-18T10:42:29+09:00"
+ "updated_at": "2024-08-25T08:37:04+09:00"
},
{
"resource_url": "http://wedata.net/items/62559",
@@ -34310,18 +34633,17 @@
},
{
"resource_url": "http://wedata.net/items/58377",
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
- "created_at": "2012-03-03T15:04:23+09:00",
"data": {
- "pageElement": "//div[@class='article_wrap']/p[1][following-sibling::div[@class='para_title_blue' or @class='device_box']]/following-sibling::*|//ul[@class='list']/li|//dl[@class='newslist_sky']/*|//div[@class='article_wrap'][div[@class='para_title_blue'][not(preceding-sibling::p)]]/*|id('topics')/table//tbody/tr",
- "Stylish": "@-moz-document domain(\"hb-nippon.com\") {\r\n [src*=\"banner\"]{display:none !important;}\r\n}",
- "exampleUrl": "http://www.hb-nippon.com/interview/785-intvw2012/6461-20120227no92\r\nhttp://www.hb-nippon.com/column/437-baseballclub/6966-20120117no55bc\r\nhttp://www.hb-nippon.com/interview/785-intvw2012\r\nhttp://www.hb-nippon.com/column/626-tokusyu/6741-20110330no01tks\r\nhttp://www.hb-nippon.com/column/626-tokusyu/7069-20120424no06tks\r\nhttp://www.hb-nippon.com/column/1036-syakaizin/7639-20130515no01ab?page=3\r\nhttp://www.hb-nippon.com/news/52-column\r\nhttp://www.hb-nippon.com/interview/1173-intvw2014/6643-20140225no176\r\nhttp://www.hb-nippon.com/column/437-baseballclub/8348-20140313no124\r\nhttp://www.hb-nippon.com/column/437-baseballclub/9571-20150705no250?page=2\r\nhttp://www.hb-nippon.com/interview/1507-intvw2016/6932-20160409no390?page=2\r\nhttp://www.hb-nippon.com/bbs/player",
+ "pageElement": "//p[@class='post-nav-links']/preceding-sibling::*[preceding-sibling::div[contains(@class, 'share_save_container')]]|\r\n//ul[contains(concat(' ', @class, ' '), ' mvp-main-blog-wrap ')]",
+ "nextLink": "//span[contains(@class, 'current')][number()>0]/following-sibling::a[1][parent::p[@class='post-nav-links'] or not(ancestor::article)]",
"url": "^https?://(?:www\\.)?hb-nippon\\.com/",
- "nextLink": "//li[@class='current']/following-sibling::li[1]/a"
+ "exampleUrl": "https://www.hb-nippon.com/2024/05/05/2523048/\r\nhttps://www.hb-nippon.com/players-directory/\r\nhttps://www.hb-nippon.com/category/column/"
},
- "updated_at": "2020-05-19T07:26:08+09:00",
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "jigendaddy_be",
"name": "高校野球ドットコム",
- "created_by": "jigendaddy_be"
+ "created_at": "2012-03-03T15:04:23+09:00",
+ "updated_at": "2024-05-19T08:08:28+09:00"
},
{
"resource_url": "http://wedata.net/items/58112",
@@ -41658,18 +41980,18 @@
"created_by": "zumlin"
},
{
- "name": "Filehippo - Latest Software Updates",
+ "resource_url": "http://wedata.net/items/32964",
"data": {
- "url": "^https://.*filehippo\\.com/.",
- "pageElement": "//ul[@class='list-programs mb-m']/li|//div[contains(concat(' ', @class, ' '), ' post-item ')]",
- "exampleUrl": "https://filehippo.com/latest\r\nhttps://filehippo.com/jp/latest/\r\nhttps://news.filehippo.com/blog/",
- "nextLink": "//link[@rel='next']|//a[@class='next']"
+ "pageElement": "//ul[@class='list-programs mb-m']/li|//div[contains(concat(' ', @class, ' '), ' post-item ') and contains(@class, 'type-post')]",
+ "nextLink": "//link[@rel='next']|//a[@class='next']",
+ "url": "^https://(\\w+\\.)?filehippo\\.com/.",
+ "exampleUrl": "https://filehippo.com/latest\r\nhttps://filehippo.com/jp/latest/\r\nhttps://news.filehippo.com/blog/"
},
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "zumlin",
- "resource_url": "http://wedata.net/items/32964",
+ "name": "Filehippo - Latest Software Updates",
"created_at": "2010-05-22T20:42:22+09:00",
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
- "updated_at": "2020-03-09T03:59:45+09:00"
+ "updated_at": "2024-07-14T07:50:11+09:00"
},
{
"resource_url": "http://wedata.net/items/32962",
@@ -48425,17 +48747,17 @@
},
{
"resource_url": "http://wedata.net/items/26590",
- "name": "写真素材 [フォトライブラリー]",
- "created_by": "クリト",
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
- "updated_at": "2016-02-09T08:26:08+09:00",
"data": {
- "exampleUrl": "http://www.photolibrary.jp/search/?p=%B3%D8%B9%BB",
- "url": "^https?://(?:www\\.)?photolibrary\\.jp/search/",
- "pageElement": "//ul[@class='pList pListLarge']/li[.//@class='photo']",
- "nextLink": "//span[@class='next']//a"
+ "pageElement": "//ul[@class='pList pListLarge']/li[.//*[contains(@class, 'photo')]]",
+ "nextLink": "//span[@class='next']//a",
+ "url": "^https?://(?:www\\.)?photolibrary\\.jp/",
+ "exampleUrl": "https://www.photolibrary.jp/search/?p=%B3%D8%B9%BB\r\nhttps://www.photolibrary.jp/newarrival/\r\nhttps://www.photolibrary.jp/cat/cooking_1.html"
},
- "created_at": "2009-01-06T22:50:33+09:00"
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "クリト",
+ "name": "写真素材 [フォトライブラリー]",
+ "created_at": "2009-01-06T22:50:33+09:00",
+ "updated_at": "2024-08-25T08:35:31+09:00"
},
{
"resource_url": "http://wedata.net/items/26587",
@@ -48724,8 +49046,9 @@
"resource_url": "http://wedata.net/items/25843",
"data": {
"pageElement": "//div[contains(@class, 'article-body')][./*][not(//div[contains(@class,'skin-premium')])]",
- "considerationUrl": "http://jbpress.ismedia.jp/articles/-/5619 http://jbpress.ismedia.jp/articles/-/3524 http://jbpress.ismedia.jp/articles/-/42311 ",
- "nextLink": "//*[contains(@class,'next')]/descendant-or-self::a",
+ "considerationUrl": "http://jbpress.ismedia.jp/articles/-/5619 http://jbpress.ismedia.jp/articles/-/3524 http://jbpress.ismedia.jp/articles/-/42311 https://jbpress.ismedia.jp/articles/-/82158?page=4",
+ "comment": "https://jbpress.ismedia.jp/articles/-/82158?page=4 から別の記事を取得しないように修正",
+ "nextLink": "//*[contains(@class,'next')]/descendant-or-self::a[contains(@href,'page=')]",
"url": "^https?://(?:jbpress|wedge)\\.ismedia\\.jp/articles/",
"exampleUrl": "http://wedge.ismedia.jp/articles/-/142"
},
@@ -48733,7 +49056,7 @@
"created_by": "think",
"name": "isMedia Network [JBpress(old design), WEDGE Infinity, etc]",
"created_at": "2008-11-27T00:55:35+09:00",
- "updated_at": "2022-02-27T19:12:59+09:00"
+ "updated_at": "2024-07-21T21:56:35+09:00"
},
{
"resource_url": "http://wedata.net/items/25823",
@@ -49075,17 +49398,17 @@
},
{
"resource_url": "http://wedata.net/items/25601",
- "name": "みんカラ",
"data": {
- "url": "^https?://minkara\\.carview\\.co\\.jp/",
- "pageElement": "//div[@class='mainright']/table[@class='car-table']//tr|//ul[ ../@class='maincontents_body displaymode-detail' or @class='pr_search_result_box' or @class='gallery-list-photo clearfix']/li",
- "exampleUrl": "http://minkara.carview.co.jp/en/car/mini/mini/partsreview/? http://minkara.carview.co.jp/en/car/mini/mini/note/ http://minkara.carview.co.jp/en/usercar/decotora/ http://minkara.carview.co.jp/en/note/?ci=1 http://minkara.carview.co.jp/en/partsreview/?bi=1&ci=1",
- "nextLink": "//a[contains(@id,'lnkNext') or @class='page-num next']"
+ "pageElement": "//div[@class='contents'][count(./*)>1]",
+ "nextLink": "//div[@class='paging']//a[contains(., '>')]",
+ "url": "^https?://minkara\\.carview\\.co\\.jp/userid/\\d+/blog/",
+ "exampleUrl": "https://minkara.carview.co.jp/userid/2209010/blog/b/"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "x2xx",
+ "name": "みんカラ ブログ",
"created_at": "2008-10-26T01:16:07+09:00",
- "updated_at": "2020-04-05T07:13:38+09:00"
+ "updated_at": "2024-03-30T11:03:00+09:00"
},
{
"name": "\u3044\u3061\u3054\u3046\u3057\u3064",
@@ -49594,17 +49917,17 @@
},
{
"resource_url": "http://wedata.net/items/2665",
- "name": "PC Magazine",
"data": {
+ "pageElement": "//ul[contains(concat(' ', @class, ' '), ' pagination ')]/preceding-sibling::div[@class='w-full']",
+ "nextLink": "//a[@rel='next']",
"url": "^https://(www\\.)?pcmag\\.com/.",
- "pageElement": "//div[@class='w-full']",
- "exampleUrl": "https://www.pcmag.com/picks",
- "nextLink": "//a[@rel='next']"
+ "exampleUrl": "https://www.pcmag.com/picks\r\nhttps://www.pcmag.com/categories/system-utilities"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "triptoy",
+ "name": "PC Magazine",
"created_at": "2008-09-28T15:17:02+09:00",
- "updated_at": "2020-04-01T11:20:18+09:00"
+ "updated_at": "2024-07-14T07:48:12+09:00"
},
{
"name": "FREESPOT",
@@ -50098,18 +50421,18 @@
"created_at": "2008-08-27T17:07:44+09:00"
},
{
- "name": "Amazon.co.jp - \u6ce8\u6587\u5c65\u6b74",
- "resource_url": "http:\/\/wedata.net\/items\/2351",
- "updated_at": "2012-01-17T01:42:18+09:00",
- "created_by": "haoyayoi@hatena",
- "database_resource_url": "http:\/\/wedata.net\/databases\/AutoPagerize",
+ "resource_url": "http://wedata.net/items/2351",
"data": {
- "pageElement": "id(\"cs-orders\")\/div[@class=\"action-box rounded\"]",
- "url": "^https:\/\/www\\.amazon\\.co\\.jp\/gp\/css\/history(?:\/orders)?\/view\\.html",
- "nextLink": "id(\"cs-orders\")\/div\/div\/div\/a[.=\"\u6b21\u3078 \u00bb\"]",
- "exampleUrl": "https:\/\/www.amazon.co.jp\/gp\/css\/history\/view.html?ie=UTF8&startAtIndex=0&orderFilter=year-2007&groupID=0"
+ "pageElement": "//div[@class='order-card js-order-card']",
+ "nextLink": "//a[text()='次へ']",
+ "url": "^https?://www\\.amazon\\.co\\.jp/(gp/css/order-history||your-orders/)",
+ "exampleUrl": "https://www.amazon.co.jp/gp/css/order-history?ref_=nav_orders_first\r\nhttps://www.amazon.co.jp/your-orders/orders?timeFilter=year-2024&ref_=ppx_yo2ov_dt_b_filter_all_y2024"
},
- "created_at": "2008-08-27T12:11:07+09:00"
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "haoyayoi@hatena",
+ "name": "Amazon.co.jp - 注文履歴",
+ "created_at": "2008-08-27T12:11:07+09:00",
+ "updated_at": "2024-03-07T11:17:10+09:00"
},
{
"resource_url": "http://wedata.net/items/2258",
@@ -51224,17 +51547,17 @@
},
{
"resource_url": "http://wedata.net/items/1868",
- "name": "dafont.com",
"data": {
+ "pageElement": "//a[@name]|//a[@name]/following-sibling::*[preceding-sibling::div/@class=\"dfxsmall\"][following-sibling::div/@class=\"titlebar\"]",
+ "nextLink": "//a[@title=\"Keyboard shortcut: Right arrow\"]",
"url": "^https://(www\\.)?dafont\\.com/",
- "pageElement": "//div[@class='titlebar'][1]/following-sibling::div[form/@name='nb'][1]/following-sibling::*[following-sibling::div/@class='titlebar']",
- "exampleUrl": "https://www.dafont.com/theme.php?cat=113\r\nhttps://www.dafont.com/new.php",
- "nextLink": "//span[@class='select']/following-sibling::a[1]"
+ "exampleUrl": "https://www.dafont.com/theme.php?cat=113\r\nhttps://www.dafont.com/new.php"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "cool_ni_ikou",
+ "name": "dafont.com",
"created_at": "2008-06-28T06:32:03+09:00",
- "updated_at": "2020-03-28T11:57:55+09:00"
+ "updated_at": "2024-04-13T16:02:33+09:00"
},
{
"resource_url": "http://wedata.net/items/1867",
@@ -51309,16 +51632,16 @@
{
"resource_url": "http://wedata.net/items/1857",
"data": {
- "pageElement": "id(\"article-body-inner\")/*",
+ "pageElement": "//div[contains(concat(' ', normalize-space(@class), ' '), ' article-body-inner ')]|id('article-body-inner')",
"nextLink": "//*[@class=\"next\"]/a",
"url": "^https?://(www\\.)?toyokeizai\\.net/articles/",
- "exampleUrl": "http://toyokeizai.net/articles/-/11744"
+ "exampleUrl": "https://toyokeizai.net/articles/-/11744"
},
"database_resource_url": "http://wedata.net/databases/AutoPagerize",
"created_by": "takotako",
"name": "東洋経済オンライン article",
"created_at": "2008-06-27T13:44:17+09:00",
- "updated_at": "2022-01-24T15:33:30+09:00"
+ "updated_at": "2024-07-23T00:49:11+09:00"
},
{
"resource_url": "http://wedata.net/items/1855",
@@ -52477,19 +52800,19 @@
"updated_at": "2020-03-27T13:28:06+09:00"
},
{
- "name": "Hatena Bookmark News",
- "updated_at": "2008-05-23T21:42:58+09:00",
- "created_by": "os0x",
- "resource_url": "http:\/\/wedata.net\/items\/834",
- "database_resource_url": "http:\/\/wedata.net\/databases\/AutoPagerize",
+ "resource_url": "http://wedata.net/items/834",
"data": {
- "pageElement": "\/\/div[@class=\"entry\"][position()!=1]",
- "insertBefore": "\/\/h3[@class=\"main-navi\"]",
- "url": "^http:\/\/labs\\.ceek\\.jp\/hbnews\/.",
- "nextLink": "\/\/h3[@class=\"main-navi\"]\/a[last()]",
- "exampleUrl": "http:\/\/labs.ceek.jp\/hbnews\/list.cgi"
+ "pageElement": "//div[@class=\"entry\"]",
+ "insertBefore": "//h3[@class=\"main-navi\"]",
+ "nextLink": "//h3[@class=\"main-navi\"]/a[last()]",
+ "url": "^http://labs\\.ceek\\.jp/hbnews/.",
+ "exampleUrl": "http://labs.ceek.jp/hbnews/list.cgi"
},
- "created_at": "2008-04-20T20:46:01+09:00"
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "os0x",
+ "name": "Hatena Bookmark News",
+ "created_at": "2008-04-20T20:46:01+09:00",
+ "updated_at": "2024-07-14T07:45:37+09:00"
},
{
"resource_url": "http://wedata.net/items/832",
@@ -52706,17 +53029,17 @@
},
{
"resource_url": "http://wedata.net/items/731",
- "name": "ニコニコ動画",
- "created_by": "swdyh",
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
- "updated_at": "2017-12-15T17:30:26+09:00",
"data": {
- "exampleUrl": "http://www.nicovideo.jp/newarrival\r\nhttp://www.nicovideo.jp/mylist_search/test\r\nhttp://www.nicovideo.jp/openlist/sm9\r\nhttp://www.nicovideo.jp/recent\r\nhttp://www.nicovideo.jp/related_tag/test\r\nhttp://www.nicovideo.jp/search/test\r\nhttp://www.nicovideo.jp/tag/test",
- "url": "^https?://(?:www|nine)\\.nicovideo\\.jp/(?:newarrival|mylist_search|migiue|openlist|recent|related_tag|search|tag)",
- "pageElement": "id('PAGEBODY')/div[starts-with(@class,'content_672')]/*[preceding::table/@class='pager' or preceding-sibling::div[h1][not(count(following::table[@class='pager'])=2)]][following::table/@class='pager'][not(self::script)]|//div[contains(concat(' ',normalize-space(@class),' '), ' main ') or @data-main-contents]/div[contains(@class,'contentBody')]/ul[@class='list']/node()",
- "nextLink": "(/descendant::span|//div[@class='pager']/a)[contains(@class,'active') or contains(@class,'here')]/following-sibling::a[1]"
+ "pageElement": "//div[contains(concat(' ', @class, ' '), ' NewVideosPage-videoList ')]|\r\n//div[contains(concat(' ', @class, ' '), ' OpenlistPage-openList ')]|\r\n//ul[contains(concat(' ', @class, ' '), ' RelatedTagPage-tagList ')]|\r\n//div[contains(concat(' ',normalize-space(@class),' '), ' main ') or @data-main-contents]/div[contains(@class,'contentBody')]/ul[@class='videoListInner']/node()",
+ "nextLink": "//li[contains(@class, 'current')][number()>0]/following-sibling::li[1]/a[number()>0]|\r\n//div[@class='pager']/a[contains(@class,'active')]/following-sibling::a[1]",
+ "url": "^https?://www\\.nicovideo\\.jp/(?:newarrival|openlist|recent|related_tag|search|tag)",
+ "exampleUrl": "http://www.nicovideo.jp/newarrival\r\nhttp://www.nicovideo.jp/openlist/sm9\r\nhttp://www.nicovideo.jp/recent\r\nhttp://www.nicovideo.jp/related_tag/test\r\nhttp://www.nicovideo.jp/search/test\r\nhttp://www.nicovideo.jp/tag/test"
},
- "created_at": "2008-04-16T12:36:46+09:00"
+ "created_by": "swdyh",
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "name": "ニコニコ動画",
+ "created_at": "2008-04-16T12:36:46+09:00",
+ "updated_at": "2024-04-05T22:43:44+09:00"
},
{
"resource_url": "http://wedata.net/items/728",
@@ -53961,17 +54284,17 @@
},
{
"resource_url": "http://wedata.net/items/414",
- "name": "All About 新着記事一覧",
- "created_by": "swdyh",
- "database_resource_url": "http://wedata.net/databases/AutoPagerize",
- "updated_at": "2017-01-17T10:18:19+09:00",
"data": {
- "exampleUrl": "https://allabout.co.jp/gm/latest/1732/",
+ "pageElement": "//main/section[contains(@data-tracking-zone, 'mainContents')]|\r\n//ul[contains(concat(' ', @class, ' '), ' aa_media-list ')]",
+ "nextLink": "//a[.='次のページへ']",
"url": "^https?://allabout\\.co\\.jp/",
- "pageElement": "id('popin_read')/div/ul/*",
- "nextLink": "//a[.='次のページへ']"
+ "exampleUrl": "https://allabout.co.jp/gm/latest/1732/\r\nhttps://allabout.co.jp/r_hobby/latest/"
},
- "created_at": "2008-04-16T12:35:21+09:00"
+ "database_resource_url": "http://wedata.net/databases/AutoPagerize",
+ "created_by": "swdyh",
+ "name": "All About 新着記事一覧",
+ "created_at": "2008-04-16T12:35:21+09:00",
+ "updated_at": "2024-02-24T18:13:35+09:00"
},
{
"resource_url": "http://wedata.net/items/412",
diff --git a/Pagetual/pagetual.schema.json b/Pagetual/pagetual.schema.json
new file mode 100644
index 00000000000..565b8b77851
--- /dev/null
+++ b/Pagetual/pagetual.schema.json
@@ -0,0 +1,27 @@
+{
+ "title": "Sites data",
+ "description": "Object containing site config",
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "title": "Site Name",
+ "description": "The site's name.",
+ "examples": [
+ "Google"
+ ],
+ "type": "string"
+ },
+ "url": {
+ "title": "Site Url",
+ "description": "The Regexp of site's url.",
+ "examples": [
+ "^https:\/\/google\\.com\/"
+ ],
+ "type": "string"
+ }
+ },
+ "required": ["name", "url"]
+ }
+}
\ No newline at end of file
diff --git a/Pagetual/pagetual.user.js b/Pagetual/pagetual.user.js
index 8a7981a99a0..ae4b3ad94f3 100644
--- a/Pagetual/pagetual.user.js
+++ b/Pagetual/pagetual.user.js
@@ -4,16 +4,38 @@
// @name:zh-TW 東方永頁機
// @name:ja 東方永頁機
// @name:ko 東方永頁機
+// @name:pt-BR Pagetual
// @name:ru Pagetual
// @name:de Pagetual
// @name:es Pagetual
// @name:fr Pagetual
// @name:it Pagetual
+// @name:id Pagetual
+// @name:th Pagetual
+// @name:nb Pagetual
+// @name:sv Pagetual
+// @name:sr Pagetual
+// @name:sk Pagetual
+// @name:hu Pagetual
+// @name:ro Pagetual
+// @name:fi Pagetual
+// @name:el Pagetual
+// @name:eo Pagetual
+// @name:bg Pagetual
+// @name:cs Pagetual
+// @name:vi Pagetual
+// @name:pl Pagetual
+// @name:uk Pagetual
+// @name:tr Pagetual
+// @name:nl Pagetual
+// @name:da Pagetual
+// @name:fr-CA Pagetual
// @namespace hoothin
-// @version 1.9.37.31
+// @version 1.9.37.132
// @description Perpetual pages - powerful auto-pager script. Auto fetching next paginated web pages and inserting into current page for infinite scroll. Support thousands of web sites without any rule.
// @description:zh-CN 终极自动翻页 - 加载并拼接下一分页内容至当前页尾,智能适配任意网页
// @description:zh-TW 終極自動翻頁 - 加載並拼接下一分頁內容至當前頁尾,智能適配任意網頁
+// @description:pt-BR Páginas infinitas - um poderoso script de paginação automática. Carrega automaticamente as próximas páginas da web paginadas e as insere na página atual para rolagem infinita. Suporta milhares de sites sem nenhuma regra.
// @description:ja Webページを自動で読み込み継ぎ足し表示を行うブラウザ拡張です、次のページ付けされた Web ページの自動読み込みと現在のページへの挿入 ルールなしで何千もの Web サイトをサポートします。
// @description:ko 페이지가 매겨진 다음 웹 페이지를 자동으로 로드하고 현재 페이지에 삽입합니다. 규칙 없이 수천 개의 웹 사이트를 지원합니다.
// @description:ru Автоматическая подгрузка следующих страниц и вставка их содержимого в текущую страницу. Поддерживает тысячи сайтов даже с настройками по умолчанию.
@@ -21,6 +43,26 @@
// @description:es Carga automática de las siguientes páginas web paginadas e inserción en la página actual. Admite miles de sitios web sin ninguna regla.
// @description:fr Chargement automatique des pages Web paginées suivantes et insertion dans la page en cours. Prend en charge des milliers de sites Web sans aucune règle.
// @description:it Caricamento automatico delle pagine Web impaginate successive e inserimento nella pagina corrente. Supporta migliaia di siti web senza alcuna regola.
+// @description:id Pengambilan otomatis halaman web yang dipaginasi berikutnya dan penyisipan ke halaman saat ini untuk pengguliran tak terbatas. Mendukung ribuan situs web tanpa aturan apa pun.
+// @description:th ดึงหน้าเว็บแบบแบ่งหน้าถัดไปโดยอัตโนมัติและแทรกลงในหน้าปัจจุบันเพื่อเลื่อนแบบไม่มีที่สิ้นสุด รองรับเว็บไซต์หลายพันแห่งโดยไม่มีกฎเกณฑ์ใดๆ
+// @description:nb Henter automatisk neste paginerte nettsider og setter inn på gjeldende side for uendelig rulling. Støtt tusenvis av nettsider uten noen regel.
+// @description:sv Hämtar automatiskt nästa paginerade webbsidor och infogar på aktuell sida för oändlig rullning. Stöd tusentals webbplatser utan några regler.
+// @description:sr Аутоматско преузимање следећих пагинираних веб страница и уметање у тренутну страницу за бесконачно померање. Подржите хиљаде веб локација без икаквог правила.
+// @description:sk Samodejno pridobivanje naslednjih paginiranih spletnih strani in vstavljanje v trenutno stran za neskončno drsenje. Podprite na tisoče spletnih mest brez pravil.
+// @description:hu A következő oldalszámozott weboldalak automatikus lekérése és beszúrása az aktuális oldalra a végtelen görgetés érdekében. Több ezer webhely támogatása szabály nélkül.
+// @description:ro Preluare automată a următoarelor pagini web paginate și inserare în pagina curentă pentru defilare infinită. Suportă mii de site-uri web fără nicio regulă.
+// @description:fi Hakee automaattisesti seuraavat sivutetut verkkosivut ja lisäämällä nykyiselle sivulle loputonta vieritystä. Tukee tuhansia web-sivustoja ilman sääntöjä.
+// @description:el Αυτόματη ανάκτηση επόμενων σελιδοποιημένων ιστοσελίδων και εισαγωγή στην τρέχουσα σελίδα για άπειρη κύλιση. Υποστηρίξτε χιλιάδες ιστοσελίδες χωρίς κανένα κανόνα.
+// @description:eo Aŭtomate alportado de sekvaj paĝigitaj retpaĝoj kaj enmetado en nunan paĝon por senfina movo. Subtenu milojn da retejoj sen ajna regulo.
+// @description:bg Автоматично извличане на следващите уеб страници с пагиниране и вмъкване в текущата страница за безкрайно превъртане. Поддържайте хиляди уеб сайтове без никакви правила.
+// @description:cs Automatické načítání dalších stránkovaných webových stránek a vkládání do aktuální stránky pro nekonečné posouvání. Podporujte tisíce webových stránek bez jakýchkoli pravidel.
+// @description:vi Tự động tìm các trang web được phân trang tiếp theo và chèn vào trang hiện tại để cuộn vô hạn. Hỗ trợ hàng ngàn trang web mà không cần bất kỳ quy tắc nào.
+// @description:pl Automatyczne pobieranie kolejnych stron internetowych z podziałem na strony i wstawianie ich do bieżącej strony w celu nieskończonego przewijania. Obsługa tysięcy stron internetowych bez żadnej reguły.
+// @description:uk Автоматичне отримання наступних веб-сторінок із розбивкою на сторінки та вставка на поточну сторінку для нескінченного прокручування. Підтримка тисяч веб-сайтів без будь-яких правил.
+// @description:tr Sonraki sayfalı web sayfalarını otomatik olarak getirme ve sonsuz kaydırma için geçerli sayfaya ekleme. Hiçbir kural olmadan binlerce web sitesini destekleyin.
+// @description:nl Automatisch ophalen van volgende gepagineerde webpagina's en invoegen in huidige pagina voor oneindig scrollen. Ondersteun duizenden websites zonder enige regel.
+// @description:da Automatisk hentning af næste paginerede websider og indsættelse på nuværende side for uendelig rulning. Støt tusindvis af websteder uden nogen regler.
+// @description:fr-CA Récupération automatique des pages Web paginées suivantes et insertion dans la page actuelle pour un défilement infini. Prise en charge de milliers de sites Web sans aucune règle.
// @author hoothin
// @license MPL-2.0
// @match *://*/*
@@ -45,27 +87,27 @@
// @grant GM.deleteValue
// @grant GM.info
// @grant GM.setClipboard
+// @homepage https://github.com/hoothin/UserScripts/tree/master/Pagetual
// @supportURL https://github.com/hoothin/UserScripts/issues
// @connect wedata.net
// @connect githubusercontent.com
// @connect ghproxy.com
+// @connect ghp.ci
// @connect hoothin.github.io
-// @run-at document-idle
+// @run-at document-end
// @connect *
// @contributionURL https://ko-fi.com/hoothin
// @contributionAmount 1
-// @downloadURL https://update.greasyfork.org/scripts/438684/Pagetual.user.js
-// @updateURL https://update.greasyfork.org/scripts/438684/Pagetual.meta.js
// ==/UserScript==
(function() {
'use strict';
-
const pauseVideo = () => {
setTimeout(() => {
[].forEach.call(document.querySelectorAll("video"), video => {
video.removeAttribute && video.removeAttribute("autoplay");
video.pause && video.pause();
+ video.muted = true;
});
}, 1000);
};
@@ -90,18 +132,23 @@
}
}
if (getComputedStyle(document.documentElement).display === 'none') {
- document.documentElement.style.display = 'block';
+ document.documentElement.style.display = 'block';
}
if (document.body && getComputedStyle(document.body).display === 'none') {
- document.body.style.display = 'block';
+ document.body.style.display = 'block';
}
+ Element.prototype.scrollIntoView = function() {
+ console.log('ScrollIntoView blocked.');
+ };
return;
}
if (window.top !== window.self) {
try {
if (window.self.innerWidth < 300 || window.self.innerHeight < 300) {
- return;
+ if (window.top.location.origin !== window.self.location.origin) {
+ return;
+ }
}
} catch(e) {
return;
@@ -109,46 +156,48 @@
}
const noRuleTest = false;
- const lang = navigator.appName === "Netscape" ? navigator.language : navigator.userLanguage;
+ var langName = navigator.appName === "Netscape" ? navigator.language : navigator.userLanguage;
const langData = [
{
+ // English translation update by github.com/https433, admin@abby0666.xyz.
name: "English",
match: ["en"],
lang: {
- enableDebug: "Enable debug output",
+ enableDebug: "Enable debug output to console",
updateNotification: "Notification after rules updated",
- disable: "Disable",
+ disable: "Temporarily disable",
disableSite: "Toggle disabled state",
- disableSiteTips: "Disabled on this site",
- enableSiteTips: "Enabled on this site",
- enable: "Enable",
- toTop: "To Top",
- toBottom: "To Bottom",
- current: "Current Page",
+ disableSiteTips: "Disabled on this site.",
+ enableSiteTips: "Enabled on this site.",
+ enable: "✅Enable automatic page turning",
+ tempActive: "Temporarily active",
+ toTop: "Back to Top.",
+ toBottom: "Go to Bottom.",
+ current: "Current Page.",
forceIframe: "Force to join next page",
cancelForceIframe: "Cancel Force join",
- configure: "Configure",
- firstUpdate: "Click here to initialize the rules",
+ configure: "Configure Pagetual",
+ firstUpdate: "Click here to initialize the default rule list",
update: "Update online rules",
click2update: "Click to update rules from url now",
loadNow: "Load next automatically",
- loadConfirm: "How much pages do you want to load? (0 means infinite)",
+ loadConfirm: "How many pages do you want to load? (0 means infinite)",
noNext: "No next link found, please create a new rule",
passSec: "Updated #t# seconds ago",
passMin: "Updated #t# minutes ago",
passHour: "Updated #t# hours ago",
passDay: "Updated #t# days ago",
- cantDel: "Can't delete buildin rules",
+ cantDel: "Can't delete builtin rules",
confirmDel: "Are you sure you want to delete this rule?",
updateSucc: "Update succeeded",
- beginUpdate: "Begin update, wait a minute please",
- customUrls: "Import Pagetual or AutoPagerize rule url, One url per line",
+ beginUpdate: "Begin update, wait a moment please",
+ customUrls: "Import Pagetual or AutoPagerize rule url, one url per line.",
customRules: "Input custom rules. ✍️Contribute rules",
save: "Save",
loadingText: "Shojo Now Loading...",
opacity: "Opacity",
opacityPlaceholder: "0: hide spacer",
- hideBar: "Hide the paging spacer",
+ hideBar: "Hide the pagnation spacer",
hideBarButNoStop: "Hide but not stop",
dbClick2Stop: "Double-click on the blank space to pause",
sortTitle: "Sorting takes effect after the next rule update",
@@ -158,20 +207,20 @@
inputPageNum: "Enter page number to jump",
enableHistory: "Write browsing history after page turning",
enableHistoryAfterInsert: "Write browsing history immediately after splicing, otherwise write after browsing",
- contentVisibility: "Automatically switch contentVisibility to improve rendering performance",
+ contentVisibility: "Automatically switch content-visibility to improve rendering performance",
initRun: "Turn pages immediately after opening",
preload: "Preload next page for speeding up",
- click2ImportRule: "Click to import base rules link, then wait until the update is complete: ",
+ click2ImportRule: "Click to import base rules link, and then wait until the update is complete: ",
forceAllBody: "Join full body of page?",
openInNewTab: "Open urls of additions in new tab",
- importSucc: "Import completed",
+ importSucc: "Import complete",
import: "Import",
- editCurrent: "Edit rule for current",
- editBlacklist: "Edit the blacklist urls, line by line, Support ? * for wildcard",
+ editCurrent: "Edit rule for current website",
+ editBlacklist: "Edit the url blacklist, one entry per line, Supports [?,*] wildcarding.",
upBtnImg: "Icon of back to top",
downBtnImg: "Icon of go to footer",
sideControllerIcon: "Icon of sidebar",
- loadingTextTitle: "Loading text",
+ loadingTextTitle: "Loading",
dbClick2StopCtrl: "Ctrl key",
dbClick2StopAlt: "Alt key",
dbClick2StopShift: "Shift key",
@@ -180,17 +229,17 @@
pageElementCss: "Custom style for main page elements",
customCss: "Custom complete css",
firstAlert: "You have not imported the base rule, please select the appropriate rule to import",
- picker: "Pagetual page element picker",
+ picker: "Pagetual element picker",
closePicker: "Close Pagetual picker",
- pickerPlaceholder: "Element selector, Leave empty if you have no idea",
+ pickerPlaceholder: "Element selector, (Advanced users only, leave blank otherwise)",
pickerCheck: "Check selector and copy",
switchSelector: "Click to switch element",
gotoEdit: "Go to edit rule with current selector",
- manualMode: "Disable splicing, manually turn pages with the right arrow keys (or dispatch event 'pagetual.next')",
+ manualMode: "Disable splicing, manually advance next page using the right arrow key (or dispatch event 'pagetual.next')",
clickMode: "Disable splicing, automatically click the next page when scrolling to the end of the page",
pageBarMenu: "Click the center of the page bar to open the picker menu",
nextSwitch: "Switch next link",
- arrowToScroll: "Press left arrow key to scroll prev and right arrow key to scroll next",
+ arrowToScroll: "Press left arrow to scroll back and right arrow to advance page",
sideController: "Display the paging control bar in the sidebar",
sideControllerScroll: "Scroll toggle",
sideControllerAlways: "Always show",
@@ -204,25 +253,26 @@
disableAutoScroll: "Stop Auto Scroll",
enableAutoScroll: "Enable Auto Scroll",
toggleAutoScroll: "Toggle Auto Scroll",
+ ruleRequest: "Rule Request",
page: "Page ",
prevPage: "Prev page",
nextPage: "Next page",
- errorRulesMustBeArray: "Rules must be a Array!",
- errorJson: "JSON error, check again!",
+ errorRulesMustBeArray: "Rules must be an Array!",
+ errorJson: "JSON error, Check again!",
editSuccess: "Edit successfully",
- errorWrongUrl: "Wrong url, check again!",
- errorAlreadyExists: "Already exists!",
+ errorWrongUrl: "Wrong url, Check again!",
+ errorAlreadyExists: "A rule already exists!",
settingsSaved: "The settings are saved, refresh to view",
- iframe: "Iframe",
- dynamic: "Dynamic",
- reloadPage: "Edit completed, reload page now?",
+ iframe: "Forced split by iframe",
+ dynamic: "Dynamic loading",
+ reloadPage: "Edit completed, reload now?",
copied: "Copied",
- noValidContent: "No valid content detected, Captcha action may be required, click to view",
- outOfDate: "The script is outdated, update to the latest version in time!",
+ noValidContent: "No valid content detected, a Captcha may be present",
+ outOfDate: "The script is outdated, update to the latest version please.",
hideBarTips: "Hide the pagination bar, toggle immersive experience",
setConfigPage: "Set current page as the default configuration page",
wedata2github: "Change the wedata address to the mirror address in the github repository",
- addOtherProp: "Add rule property",
+ addOtherProp: "Add rule properties",
addNextSelector: "Add selector content as nextLink",
addPageSelector: "Add selector content as pageElement",
propName: "Enter rule property name",
@@ -233,6 +283,3358 @@
lastPageTips: "Show tips when reaching the last page"
}
},
+ {
+ name: "한국어",
+ match: ["ko"],
+ lang: {
+ enableDebug: "콘솔에 디버그 출력 활성화",
+ updateNotification: "규칙 업데이트 후 알림",
+ disable: "일시적으로 비활성화",
+ disableSite: "비활성화 상태 전환",
+ disableSiteTips: "이 사이트에서 비활성화됨.",
+ enableSiteTips: "이 사이트에서 활성화됨.",
+ enable: "✅자동 페이지 넘김 활성화",
+ tempActive: "일시적으로 활성",
+ toTop: "맨 위로 이동.",
+ toBottom: "맨 아래로 이동.",
+ current: "현재 페이지.",
+ forceIframe: "다음 페이지 강제 결합",
+ cancelForceIframe: "강제 결합 취소",
+ configure: "Pagetual 설정",
+ firstUpdate: "기본 규칙 목록을 초기화하려면 여기를 클릭하세요",
+ update: "온라인 규칙 업데이트",
+ click2update: "URL에서 규칙을 지금 업데이트하려면 클릭하세요",
+ loadNow: "다음 페이지 자동 로드",
+ loadConfirm: "몇 페이지를 로드하시겠습니까? (0은 무한을 의미)",
+ noNext: "다음 링크를 찾을 수 없습니다. 새 규칙을 만들어 주세요",
+ passSec: "#t#초 전에 업데이트됨",
+ passMin: "#t#분 전에 업데이트됨",
+ passHour: "#t#시간 전에 업데이트됨",
+ passDay: "#t#일 전에 업데이트됨",
+ cantDel: "내장된 규칙은 삭제할 수 없습니다",
+ confirmDel: "이 규칙을 정말로 삭제하시겠습니까?",
+ updateSucc: "업데이트 성공",
+ beginUpdate: "업데이트를 시작합니다. 잠시만 기다려 주세요",
+ customUrls: "Pagetual 또는 AutoPagerize 규칙 URL 가져오기, 한 줄에 하나의 URL.",
+ customRules: "사용자 정의 규칙을 입력하세요. ✍️규칙 기여하기",
+ save: "저장",
+ loadingText: "로딩 중...",
+ opacity: "불투명도",
+ opacityPlaceholder: "0: 구분선 숨기기",
+ hideBar: "페이지 구분선 숨기기",
+ hideBarButNoStop: "숨기지만 중지하지 않음",
+ dbClick2Stop: "일시 중지하려면 빈 공간을 두 번 클릭하세요",
+ sortTitle: "정렬은 다음 규칙 업데이트 후에 적용됩니다",
+ autoRun: "자동 활성화 (블랙리스트 모드)",
+ autoLoadNum: "미리 로드할 페이지 수",
+ turnRate: "바닥글로부터 페이지 높이의 【X】배 미만일 때 다음 페이지로 넘기기",
+ inputPageNum: "이동할 페이지 번호를 입력하세요",
+ enableHistory: "페이지 넘김 후 방문 기록 저장",
+ enableHistoryAfterInsert: "페이지 결합 직후 방문 기록 저장, 그렇지 않으면 탐색 후 저장",
+ contentVisibility: "렌더링 성능 향상을 위해 content-visibility 자동 전환",
+ initRun: "페이지 열람 직후 자동 넘김 시작",
+ preload: "속도 향상을 위해 다음 페이지 미리 로드",
+ click2ImportRule: "기본 규칙 링크를 가져오려면 클릭하고 업데이트가 완료될 때까지 기다리세요: ",
+ forceAllBody: "페이지의 전체 본문을 결합하시겠습니까?",
+ openInNewTab: "추가된 URL을 새 탭에서 열기",
+ importSucc: "가져오기 완료",
+ import: "가져오기",
+ editCurrent: "현재 웹사이트 규칙 편집",
+ editBlacklist: "URL 블랙리스트 편집, 한 줄에 하나씩 입력, [?,*] 와일드카드 지원.",
+ upBtnImg: "맨 위로 가기 아이콘",
+ downBtnImg: "맨 아래로 가기 아이콘",
+ sideControllerIcon: "사이드바 아이콘",
+ loadingTextTitle: "로딩",
+ dbClick2StopCtrl: "Ctrl 키",
+ dbClick2StopAlt: "Alt 키",
+ dbClick2StopShift: "Shift 키",
+ dbClick2StopMeta: "Meta 키",
+ dbClick2StopKey: "단축키",
+ pageElementCss: "주요 페이지 요소에 대한 사용자 정의 스타일",
+ customCss: "사용자 정의 전체 CSS",
+ firstAlert: "기본 규칙을 가져오지 않았습니다. 가져올 적절한 규칙을 선택해주세요",
+ picker: "Pagetual 요소 선택기",
+ closePicker: "Pagetual 선택기 닫기",
+ pickerPlaceholder: "요소 선택기 (고급 사용자 전용, 그렇지 않으면 비워두세요)",
+ pickerCheck: "선택기 확인 및 복사",
+ switchSelector: "클릭하여 요소 전환",
+ gotoEdit: "현재 선택기로 규칙 편집하러 가기",
+ manualMode: "결합 비활성화, 오른쪽 화살표 키를 사용하여 수동으로 다음 페이지로 이동 (또는 'pagetual.next' 이벤트 전달)",
+ clickMode: "결합 비활성화, 페이지 끝까지 스크롤하면 다음 페이지 자동 클릭",
+ pageBarMenu: "페이지 바 중앙을 클릭하여 선택기 메뉴 열기",
+ nextSwitch: "다음 링크 전환",
+ arrowToScroll: "왼쪽 화살표를 눌러 뒤로 스크롤하고 오른쪽 화살표를 눌러 페이지 이동",
+ sideController: "사이드바에 페이징 제어 바 표시",
+ sideControllerScroll: "스크롤 시 표시/숨김",
+ sideControllerAlways: "항상 표시",
+ hideLoadingIcon: "로딩 애니메이션 숨기기",
+ hideBarArrow: "페이지 바 화살표 숨기기",
+ duplicate: "중복된 Pagetual이 설치되었습니다. 스크립트 관리자를 확인하세요!",
+ forceStateIframe: "전체 페이지를 iframe으로 삽입",
+ forceStateDynamic: "iframe을 통해 동적 콘텐츠 로드",
+ forceStateDisable: "이 사이트에서 페이지 넘김 비활성화",
+ autoScrollRate: "스크롤 속도 (1~1000)",
+ disableAutoScroll: "자동 스크롤 중지",
+ enableAutoScroll: "자동 스크롤 활성화",
+ toggleAutoScroll: "자동 스크롤 전환",
+ ruleRequest: "규칙 요청",
+ page: "페이지 ",
+ prevPage: "이전 페이지",
+ nextPage: "다음 페이지",
+ errorRulesMustBeArray: "규칙은 배열이어야 합니다!",
+ errorJson: "JSON 오류, 다시 확인해주세요!",
+ editSuccess: "성공적으로 편집되었습니다",
+ errorWrongUrl: "잘못된 URL, 다시 확인해주세요!",
+ errorAlreadyExists: "규칙이 이미 존재합니다!",
+ settingsSaved: "설정이 저장되었습니다. 확인하려면 새로고침하세요",
+ iframe: "iframe으로 강제 분할",
+ dynamic: "동적 로딩",
+ reloadPage: "편집 완료, 지금 새로고침하시겠습니까?",
+ copied: "복사됨",
+ noValidContent: "유효한 콘텐츠를 찾을 수 없습니다. 보안 문자(Captcha)가 있을 수 있습니다",
+ outOfDate: "스크립트가 오래되었습니다. 최신 버전으로 업데이트해주세요.",
+ hideBarTips: "페이지네이션 바 숨기기, 몰입형 경험 전환",
+ setConfigPage: "현재 페이지를 기본 설정 페이지로 지정",
+ wedata2github: "wedata 주소를 github 저장소의 미러 주소로 변경",
+ addOtherProp: "규칙 속성 추가",
+ addNextSelector: "선택기 콘텐츠를 nextLink로 추가",
+ addPageSelector: "선택기 콘텐츠를 pageElement로 추가",
+ propName: "규칙 속성 이름 입력",
+ propValue: "규칙 속성 값 입력",
+ customFirst: "로컬 사용자 정의 규칙 캐시 무시",
+ rulesExample: "규칙 예시",
+ lastPage: "마지막 페이지에 도달했습니다",
+ lastPageTips: "마지막 페이지 도달 시 팁 표시"
+ }
+ },
+ {
+ name: "Deutsch",
+ match: ["de", "de-AT", "de-CH", "de-DE", "de-LI", "de-LU"],
+ lang: {
+ enableDebug: "Debug-Ausgabe in der Konsole aktivieren",
+ updateNotification: "Benachrichtigung nach Aktualisierung der Regeln",
+ disable: "Vorübergehend deaktivieren",
+ disableSite: "Deaktivierungszustand umschalten",
+ disableSiteTips: "Auf dieser Seite deaktiviert.",
+ enableSiteTips: "Auf dieser Seite aktiviert.",
+ enable: "✅Automatisches Blättern aktivieren",
+ tempActive: "Vorübergehend aktiv",
+ toTop: "Zurück nach oben.",
+ toBottom: "Nach unten gehen.",
+ current: "Aktuelle Seite.",
+ forceIframe: "Zwingen, die nächste Seite zu laden",
+ cancelForceIframe: "Zwangsöffnung abbrechen",
+ configure: "Pagetual konfigurieren",
+ firstUpdate: "Hier klicken, um die Standardregel-Liste zu initialisieren",
+ update: "Online-Regeln aktualisieren",
+ click2update: "Jetzt klicken, um Regeln von der URL zu aktualisieren",
+ loadNow: "Nächste Seite automatisch laden",
+ loadConfirm: "Wie viele Seiten möchten Sie laden? (0 bedeutet unendlich)",
+ noNext: "Keinen nächsten Link gefunden, bitte erstellen Sie eine neue Regel",
+ passSec: "Vor #t# Sekunden aktualisiert",
+ passMin: "Vor #t# Minuten aktualisiert",
+ passHour: "Vor #t# Stunden aktualisiert",
+ passDay: "Vor #t# Tagen aktualisiert",
+ cantDel: "Kann integrierte Regeln nicht löschen",
+ confirmDel: "Sind Sie sicher, dass Sie diese Regel löschen möchten?",
+ updateSucc: "Aktualisierung erfolgreich",
+ beginUpdate: "Aktualisierung beginnen, bitte einen Moment warten",
+ customUrls: "Pagetual oder AutoPagerize Regel-URL importieren, eine URL pro Zeile.",
+ customRules: "Benutzerdefinierte Regeln eingeben. ✍️Regeln beitragen",
+ save: "Speichern",
+ loadingText: "Shojo lädt jetzt...",
+ opacity: "Opazität",
+ opacityPlaceholder: "0: Platzhalter ausblenden",
+ hideBar: "Den Platzhalter für die Seitenanzahl ausblenden",
+ hideBarButNoStop: "Ausblenden, aber nicht stoppen",
+ dbClick2Stop: "Doppelklicken Sie auf den leeren Bereich, um zu pausieren",
+ sortTitle: "Die Sortierung wird nach der nächsten Regelaktualisierung wirksam",
+ autoRun: "Automatisch aktivieren (Blacklist-Modus)",
+ autoLoadNum: "Anzahl der vorzuladenden Seiten",
+ turnRate: "Blättern zur nächsten Seite, wenn sie weniger als 【X】 Mal die Seitenshöhe vom Fußbereich entfernt ist",
+ inputPageNum: "Seitenzahl eingeben, um zu springen",
+ enableHistory: "Browserverlauf nach dem Blättern aufzeichnen",
+ enableHistoryAfterInsert: "Browserverlauf sofort nach dem Einfügen aufzeichnen, andernfalls nach dem Browsen aufzeichnen",
+ contentVisibility: "Inhaltssichtbarkeit automatisch umschalten, um die Render-Leistung zu verbessern",
+ initRun: "Seiten sofort nach dem Öffnen blättern",
+ preload: "Nächste Seite vorladen, um zu beschleunigen",
+ click2ImportRule: "Klicken Sie, um den Basisregel-Link zu importieren, und warten Sie, bis die Aktualisierung abgeschlossen ist: ",
+ forceAllBody: "Gesamten Seiteninhalt als iframe einfügen?",
+ openInNewTab: "URLs der Ergänzungen in neuem Tab öffnen",
+ importSucc: "Import abgeschlossen",
+ import: "Importieren",
+ editCurrent: "Regel für die aktuelle Website bearbeiten",
+ editBlacklist: "Bearbeiten Sie die URL-Blacklist, ein Eintrag pro Zeile, unterstützt Wildcards [?,*].",
+ upBtnImg: "Symbol zum Zurück nach oben",
+ downBtnImg: "Symbol zum Gehen zum Fußbereich",
+ sideControllerIcon: "Symbol der Seitenleiste",
+ loadingTextTitle: "Laden",
+ dbClick2StopCtrl: "Strg-Taste",
+ dbClick2StopAlt: "Alt-Taste",
+ dbClick2StopShift: "Shift-Taste",
+ dbClick2StopMeta: "Meta-Taste",
+ dbClick2StopKey: "Kurzbefehl-Taste",
+ pageElementCss: "Benutzerdefinierter Stil für Hauptelemente der Seite",
+ customCss: "Benutzerdefiniertes vollständiges CSS",
+ firstAlert: "Sie haben die Basisregel nicht importiert, bitte wählen Sie die passende Regel zum Importieren aus",
+ picker: "Pagetual Elementauswahl",
+ closePicker: "Pagetual Picker schließen",
+ pickerPlaceholder: "Elementauswahl, (nur für Fortgeschrittene, andernfalls leer lassen)",
+ pickerCheck: "Wählen Sie den Selektor aus und kopieren",
+ switchSelector: "Klicken Sie, um das Element zu wechseln",
+ gotoEdit: "Gehe zur Regelbearbeitung mit dem aktuellen Selektor",
+ manualMode: "Splicing deaktivieren, manuell zur nächsten Seite mit der rechten Pfeiltaste weiterblättern (oder das Ereignis 'pagetual.next' auslösen)",
+ clickMode: "Splicing deaktivieren, automatisch zur nächsten Seite klicken, wenn das Ende der Seite erreicht ist",
+ pageBarMenu: "Klicken Sie auf die Mitte der Seitenleiste, um das Picker-Menü zu öffnen",
+ nextSwitch: "Nächsten Link wechseln",
+ arrowToScroll: "Drücken Sie die linke Pfeiltaste, um nach hinten zu scrollen, und die rechte Pfeiltaste, um zur nächsten Seite zu blättern",
+ sideController: "Die Steuerleiste für das Blättern in der Seitenleiste anzeigen",
+ sideControllerScroll: "Scroll-Umschaltung",
+ sideControllerAlways: "Immer anzeigen",
+ hideLoadingIcon: "Ladeanimation ausblenden",
+ hideBarArrow: "Pfeil für die Seitenleiste ausblenden",
+ duplicate: "Duplikat Pagetual wurde installiert, überprüfen Sie Ihren Skriptmanager!",
+ forceStateIframe: "Gesamte Seite als iframe einfügen",
+ forceStateDynamic: "Dynamische Inhalte über iframe laden",
+ forceStateDisable: "Blättern auf dieser Seite deaktivieren",
+ autoScrollRate: "Scrollgeschwindigkeit (1~1000)",
+ disableAutoScroll: "Auto-Scroll stoppen",
+ enableAutoScroll: "Auto-Scroll aktivieren",
+ toggleAutoScroll: "Auto-Scroll umschalten",
+ ruleRequest: "Regelanfrage",
+ page: "Seite ",
+ prevPage: "Vorherige Seite",
+ nextPage: "Nächste Seite",
+ errorRulesMustBeArray: "Regeln müssen ein Array sein!",
+ errorJson: "JSON-Fehler, bitte erneut überprüfen!",
+ editSuccess: "Erfolgreich bearbeitet",
+ errorWrongUrl: "Falsche URL, bitte erneut überprüfen!",
+ errorAlreadyExists: "Eine Regel existiert bereits!",
+ settingsSaved: "Die Einstellungen wurden gespeichert, bitte aktualisieren, um sie zu sehen",
+ iframe: "Zwangsaufteilung durch iframe",
+ dynamic: "Dynamisches Laden",
+ reloadPage: "Bearbeitung abgeschlossen, jetzt neu laden?",
+ copied: "Kopiert",
+ noValidContent: "Kein gültiger Inhalt erkannt, möglicherweise ist ein Captcha vorhanden",
+ outOfDate: "Das Skript ist veraltet, bitte auf die neueste Version aktualisieren.",
+ hideBarTips: "Die Seitenzahlenleiste ausblenden, um ein immersives Erlebnis zu ermöglichen",
+ setConfigPage: "Aktuelle Seite als Standardkonfigurationsseite festlegen",
+ wedata2github: "Die wedata-Adresse auf die Spiegeladresse im GitHub-Repository ändern",
+ addOtherProp: "Regelattribute hinzufügen",
+ addNextSelector: "Selector-Inhalt als nextLink hinzufügen",
+ addPageSelector: "Selector-Inhalt als pageElement hinzufügen",
+ propName: "Regelattributnamen eingeben",
+ propValue: "Regelattributwert eingeben",
+ customFirst: "Cache für lokale benutzerdefinierte Regeln ignorieren",
+ rulesExample: "Regeln Beispiel",
+ lastPage: "Letzte Seite erreicht",
+ lastPageTips: "Tipps anzeigen, wenn die letzte Seite erreicht ist"
+ }
+ },
+ {
+ name: "ไทย",
+ match: ["th"],
+ lang: {
+ enableDebug: "เปิดใช้งานเอาต์พุตการดีบักไปยังคอนโซล",
+ updateNotification: "การแจ้งเตือนหลังจากอัปเดตกฎ",
+ disable: "ปิดใช้งานชั่วคราว",
+ disableSite: "สลับสถานะการปิดใช้งาน",
+ disableSiteTips: "ปิดใช้งานบนไซต์นี้",
+ enableSiteTips: "เปิดใช้งานบนไซต์นี้",
+ enable: "✅เปิดใช้งานการเปลี่ยนหน้าอัตโนมัติ",
+ tempActive: "ใช้งานชั่วคราว",
+ toTop: "กลับไปด้านบน",
+ toBottom: "ไปที่ด้านล่าง",
+ current: "หน้าปัจจุบัน",
+ forceIframe: "บังคับให้เข้าร่วมหน้าถัดไป",
+ cancelForceIframe: "ยกเลิกการเข้าร่วมบังคับ",
+ configure: "กำหนดค่า Pagetual",
+ firstUpdate: "คลิกที่นี่เพื่อเริ่มต้นรายการกฎเริ่มต้น",
+ update: "อัปเดตกฎออนไลน์",
+ click2update: "คลิกเพื่ออัปเดตกฎจาก url ทันที",
+ loadNow: "โหลดหน้าถัดไปโดยอัตโนมัติ",
+ loadConfirm: "คุณต้องการโหลดกี่หน้า (0 หมายถึงไม่สิ้นสุด)",
+ noNext: "ไม่พบลิงก์ถัดไป โปรดสร้างกฎใหม่",
+ passSec: "อัปเดตเมื่อ #t# วินาทีที่แล้ว",
+ passMin: "อัปเดตเมื่อ #t# นาทีที่แล้ว",
+ passHour: "อัปเดตเมื่อ #t# ชั่วโมงที่แล้ว",
+ passDay: "อัปเดตเมื่อ #t# วันที่แล้ว",
+ cantDel: "ไม่สามารถลบกฎในตัวได้",
+ confirmDel: "คุณแน่ใจหรือไม่ว่าต้องการลบกฎนี้",
+ updateSucc: "อัปเดตสำเร็จ",
+ beginUpdate: "เริ่มอัปเดต โปรดรอสักครู่",
+ customUrls: "นำเข้า URL กฎ Pagetual หรือ AutoPagerize หนึ่ง URL ต่อบรรทัด",
+ customRules: "ป้อนกฎที่กำหนดเอง ✍️มีส่วนร่วมในกฎ",
+ save: "บันทึก",
+ loadingText: "กำลังโหลด...",
+ opacity: "ความทึบ",
+ opacityPlaceholder: "0: ซ่อนตัวเว้นวรรค",
+ hideBar: "ซ่อนตัวเว้นวรรคของหน้า",
+ hideBarButNoStop: "ซ่อนแต่ไม่หยุด",
+ dbClick2Stop: "ดับเบิลคลิกที่พื้นที่ว่างเพื่อหยุดชั่วคราว",
+ sortTitle: "การเรียงลำดับจะมีผลหลังจากการอัปเดตกฎครั้งถัดไป",
+ autoRun: "เปิดใช้งานอัตโนมัติ (โหมดบัญชีดำ)",
+ autoLoadNum: "จำนวนหน้าที่โหลดล่วงหน้า",
+ turnRate: "เปลี่ยนหน้าถัดไปเมื่ออยู่ห่างจากส่วนท้ายน้อยกว่า【X】เท่าของความสูงของหน้า",
+ inputPageNum: "ป้อนหมายเลขหน้าเพื่อข้ามไป",
+ enableHistory: "เขียนประวัติการเข้าชมหลังจากการเปลี่ยนหน้า",
+ enableHistoryAfterInsert: "เขียนประวัติการเข้าชมทันทีหลังจากต่อเข้าด้วยกัน มิฉะนั้นจะเขียนหลังจากการเข้าชม",
+ contentVisibility: "สลับ content-visibility โดยอัตโนมัติเพื่อปรับปรุงประสิทธิภาพการเรนเดอร์",
+ initRun: "เปลี่ยนหน้าทันทีหลังจากเปิด",
+ preload: "โหลดหน้าถัดไปล่วงหน้าเพื่อเพิ่มความเร็ว",
+ click2ImportRule: "คลิกเพื่อนำเข้าลิงก์กฎพื้นฐาน แล้วรอจนกว่าการอัปเดตจะเสร็จสมบูรณ์: ",
+ forceAllBody: "เข้าร่วมเนื้อหาทั้งหมดของหน้าหรือไม่",
+ openInNewTab: "เปิด URL ของส่วนเพิ่มเติมในแท็บใหม่",
+ importSucc: "นำเข้าสำเร็จ",
+ import: "นำเข้า",
+ editCurrent: "แก้ไขกฎสำหรับเว็บไซต์ปัจจุบัน",
+ editBlacklist: "แก้ไขบัญชีดำของ URL หนึ่งรายการต่อบรรทัด รองรับ [?,*] wildcards",
+ upBtnImg: "ไอคอนกลับไปด้านบน",
+ downBtnImg: "ไอคอนไปที่ส่วนท้าย",
+ sideControllerIcon: "ไอคอนของแถบด้านข้าง",
+ loadingTextTitle: "กำลังโหลด",
+ dbClick2StopCtrl: "ปุ่ม Ctrl",
+ dbClick2StopAlt: "ปุ่ม Alt",
+ dbClick2StopShift: "ปุ่ม Shift",
+ dbClick2StopMeta: "ปุ่ม Meta",
+ dbClick2StopKey: "ปุ่มลัด",
+ pageElementCss: "สไตล์ที่กำหนดเองสำหรับองค์ประกอบหน้าหลัก",
+ customCss: "CSS ที่กำหนดเองทั้งหมด",
+ firstAlert: "คุณยังไม่ได้นำเข้ากฎพื้นฐาน โปรดเลือกกฎที่เหมาะสมเพื่อนำเข้า",
+ picker: "ตัวเลือกองค์ประกอบ Pagetual",
+ closePicker: "ปิดตัวเลือก Pagetual",
+ pickerPlaceholder: "ตัวเลือกองค์ประกอบ (สำหรับผู้ใช้ขั้นสูงเท่านั้น เว้นว่างไว้)",
+ pickerCheck: "ตรวจสอบตัวเลือกและคัดลอก",
+ switchSelector: "คลิกเพื่อสลับองค์ประกอบ",
+ gotoEdit: "ไปที่การแก้ไขกฎด้วยตัวเลือกปัจจุบัน",
+ manualMode: "ปิดใช้งานการต่อเข้าด้วยกัน เลื่อนหน้าถัดไปด้วยตนเองโดยใช้ปุ่มลูกศรขวา (หรือส่งเหตุการณ์ 'pagetual.next')",
+ clickMode: "ปิดใช้งานการต่อเข้าด้วยกัน คลิกหน้าถัดไปโดยอัตโนมัติเมื่อเลื่อนไปที่ท้ายหน้า",
+ pageBarMenu: "คลิกที่กึ่งกลางของแถบหน้าเพื่อเปิดเมนูตัวเลือก",
+ nextSwitch: "สลับลิงก์ถัดไป",
+ arrowToScroll: "กดลูกศรซ้ายเพื่อเลื่อนกลับและลูกศรขวาเพื่อเลื่อนหน้า",
+ sideController: "แสดงแถบควบคุมการแบ่งหน้าในแถบด้านข้าง",
+ sideControllerScroll: "สลับการเลื่อน",
+ sideControllerAlways: "แสดงเสมอ",
+ hideLoadingIcon: "ซ่อนภาพเคลื่อนไหวการโหลด",
+ hideBarArrow: "ซ่อนลูกศรสำหรับแถบหน้า",
+ duplicate: "มีการติดตั้ง Pagetual ที่ซ้ำกัน ตรวจสอบผู้จัดการสคริปต์ของคุณ!",
+ forceStateIframe: "ฝังหน้าเต็มเป็น iframe",
+ forceStateDynamic: "โหลดเนื้อหาแบบไดนามิกผ่าน iframe",
+ forceStateDisable: "ปิดใช้งานการเปลี่ยนหน้าบนไซต์นี้",
+ autoScrollRate: "ความเร็วในการเลื่อน (1~1000)",
+ disableAutoScroll: "หยุดการเลื่อนอัตโนมัติ",
+ enableAutoScroll: "เปิดใช้งานการเลื่อนอัตโนมัติ",
+ toggleAutoScroll: "สลับการเลื่อนอัตโนมัติ",
+ ruleRequest: "ขอกฎ",
+ page: "หน้า ",
+ prevPage: "หน้าก่อนหน้า",
+ nextPage: "หน้าถัดไป",
+ errorRulesMustBeArray: "กฎต้องเป็นอาร์เรย์!",
+ errorJson: "ข้อผิดพลาด JSON ตรวจสอบอีกครั้ง!",
+ editSuccess: "แก้ไขสำเร็จ",
+ errorWrongUrl: "URL ไม่ถูกต้อง ตรวจสอบอีกครั้ง!",
+ errorAlreadyExists: "มีกฎอยู่แล้ว!",
+ settingsSaved: "บันทึกการตั้งค่าแล้ว รีเฟรชเพื่อดู",
+ iframe: "บังคับแยกโดย iframe",
+ dynamic: "การโหลดแบบไดนามิก",
+ reloadPage: "แก้ไขเสร็จแล้ว โหลดใหม่ตอนนี้หรือไม่",
+ copied: "คัดลอกแล้ว",
+ noValidContent: "ไม่พบเนื้อหาที่ถูกต้อง อาจมี Captcha",
+ outOfDate: "สคริปต์ล้าสมัย โปรดอัปเดตเป็นเวอร์ชันล่าสุด",
+ hideBarTips: "ซ่อนแถบเลขหน้า สลับประสบการณ์ที่สมจริง",
+ setConfigPage: "ตั้งค่าหน้าปัจจุบันเป็นหน้าการกำหนดค่าเริ่มต้น",
+ wedata2github: "เปลี่ยนที่อยู่ wedata เป็นที่อยู่มิเรอร์ในที่เก็บ github",
+ addOtherProp: "เพิ่มคุณสมบัติของกฎ",
+ addNextSelector: "เพิ่มเนื้อหาตัวเลือกเป็น nextLink",
+ addPageSelector: "เพิ่มเนื้อหาตัวเลือกเป็น pageElement",
+ propName: "ป้อนชื่อคุณสมบัติของกฎ",
+ propValue: "ป้อนค่าคุณสมบัติของกฎ",
+ customFirst: "ไม่สนใจแคชสำหรับกฎที่กำหนดเองในเครื่อง",
+ rulesExample: "ตัวอย่างกฎ",
+ lastPage: "ถึงหน้าสุดท้ายแล้ว",
+ lastPageTips: "แสดงเคล็ดลับเมื่อถึงหน้าสุดท้าย"
+ }
+ },
+ {
+ name: "Norsk (Bokmål)",
+ match: ["nb", "nb-NO"],
+ lang: {
+ enableDebug: "Aktiver feilsøkingsutdata til konsollen",
+ updateNotification: "Varsling etter at regler er oppdatert",
+ disable: "Deaktiver midlertidig",
+ disableSite: "Veksle deaktivert tilstand",
+ disableSiteTips: "Deaktivert på dette nettstedet.",
+ enableSiteTips: "Aktivert på dette nettstedet.",
+ enable: "✅Aktiver automatisk sidevending",
+ tempActive: "Midlertidig aktiv",
+ toTop: "Tilbake til toppen.",
+ toBottom: "Gå til bunnen.",
+ current: "Gjeldende side.",
+ forceIframe: "Tving til å koble til neste side",
+ cancelForceIframe: "Avbryt tvungen tilkobling",
+ configure: "Konfigurer Pagetual",
+ firstUpdate: "Klikk her for å initialisere standard regelliste",
+ update: "Oppdater nettbaserte regler",
+ click2update: "Klikk for å oppdatere regler fra url nå",
+ loadNow: "Last neste automatisk",
+ loadConfirm: "Hvor mange sider vil du laste? (0 betyr uendelig)",
+ noNext: "Ingen neste lenke funnet, vennligst opprett en ny regel",
+ passSec: "Oppdatert for #t# sekunder siden",
+ passMin: "Oppdatert for #t# minutter siden",
+ passHour: "Oppdatert for #t# timer siden",
+ passDay: "Oppdatert for #t# dager siden",
+ cantDel: "Kan ikke slette innebygde regler",
+ confirmDel: "Er du sikker på at du vil slette denne regelen?",
+ updateSucc: "Oppdatering vellykket",
+ beginUpdate: "Starter oppdatering, vent et øyeblikk",
+ customUrls: "Importer Pagetual eller AutoPagerize regel-url, én url per linje.",
+ customRules: "Skriv inn egendefinerte regler. ✍️Bidra med regler",
+ save: "Lagre",
+ loadingText: "Laster nå...",
+ opacity: "Opasitet",
+ opacityPlaceholder: "0: skjul avstandsstykke",
+ hideBar: "Skjul pagineringsavstandsstykket",
+ hideBarButNoStop: "Skjul, men ikke stopp",
+ dbClick2Stop: "Dobbeltklikk på det tomme området for å pause",
+ sortTitle: "Sortering trer i kraft etter neste regeloppdatering",
+ autoRun: "Auto-aktiver (svartelistemodus)",
+ autoLoadNum: "Antall for forhåndslastede sider",
+ turnRate: "Snu til neste side når det er mindre enn 【X】 ganger sidehøyden fra bunnteksten",
+ inputPageNum: "Skriv inn sidetall for å hoppe",
+ enableHistory: "Skriv nettleserlogg etter sidevending",
+ enableHistoryAfterInsert: "Skriv nettleserlogg umiddelbart etter spleising, ellers skriv etter surfing",
+ contentVisibility: "Bytt automatisk innholdssynlighet for å forbedre gjengivelsesytelsen",
+ initRun: "Snu sider umiddelbart etter åpning",
+ preload: "Forhåndslast neste side for å øke hastigheten",
+ click2ImportRule: "Klikk for å importere grunnregellenke, og vent deretter til oppdateringen er fullført: ",
+ forceAllBody: "Koble til hele sidens kropp?",
+ openInNewTab: "Åpne url-er for tillegg i ny fane",
+ importSucc: "Import fullført",
+ import: "Importer",
+ editCurrent: "Rediger regel for gjeldende nettsted",
+ editBlacklist: "Rediger url-svartelisten, én oppføring per linje, støtter [?,*] jokertegn.",
+ upBtnImg: "Ikon for tilbake til toppen",
+ downBtnImg: "Ikon for å gå til bunntekst",
+ sideControllerIcon: "Ikon for sidefelt",
+ loadingTextTitle: "Laster",
+ dbClick2StopCtrl: "Ctrl-tast",
+ dbClick2StopAlt: "Alt-tast",
+ dbClick2StopShift: "Shift-tast",
+ dbClick2StopMeta: "Meta-tast",
+ dbClick2StopKey: "Hurtigtast",
+ pageElementCss: "Egendefinert stil for hovedsideelementer",
+ customCss: "Egendefinert komplett css",
+ firstAlert: "Du har ikke importert grunnregelen, vennligst velg riktig regel å importere",
+ picker: "Pagetual elementvelger",
+ closePicker: "Lukk Pagetual-velger",
+ pickerPlaceholder: "Elementvelger, (Kun avanserte brukere, la stå tomt ellers)",
+ pickerCheck: "Sjekk velger og kopier",
+ switchSelector: "Klikk for å bytte element",
+ gotoEdit: "Gå til redigeringsregel med gjeldende velger",
+ manualMode: "Deaktiver spleising, gå manuelt frem til neste side med høyre piltast (eller send hendelsen 'pagetual.next')",
+ clickMode: "Deaktiver spleising, klikk automatisk på neste side når du ruller til slutten av siden",
+ pageBarMenu: "Klikk på midten av sidelinjen for å åpne velgermenyen",
+ nextSwitch: "Bytt neste lenke",
+ arrowToScroll: "Trykk venstre piltast for å rulle tilbake og høyre piltast for å gå frem en side",
+ sideController: "Vis pagineringskontrollinjen i sidefeltet",
+ sideControllerScroll: "Rulleveksling",
+ sideControllerAlways: "Vis alltid",
+ hideLoadingIcon: "Skjul lasteanimasjon",
+ hideBarArrow: "Skjul pil for sidelinje",
+ duplicate: "Duplikat Pagetual har blitt installert, sjekk skriptbehandleren din!",
+ forceStateIframe: "Bygg inn hele siden som iframe",
+ forceStateDynamic: "Last dynamisk innhold via iframe",
+ forceStateDisable: "Deaktiver sidevending på dette nettstedet",
+ autoScrollRate: "Rullehastighet (1~1000)",
+ disableAutoScroll: "Stopp automatisk rulling",
+ enableAutoScroll: "Aktiver automatisk rulling",
+ toggleAutoScroll: "Veksle automatisk rulling",
+ ruleRequest: "Regelforespørsel",
+ page: "Side ",
+ prevPage: "Forrige side",
+ nextPage: "Neste side",
+ errorRulesMustBeArray: "Regler må være en matrise!",
+ errorJson: "JSON-feil, sjekk igjen!",
+ editSuccess: "Redigering vellykket",
+ errorWrongUrl: "Feil url, sjekk igjen!",
+ errorAlreadyExists: "En regel eksisterer allerede!",
+ settingsSaved: "Innstillingene er lagret, oppdater for å se",
+ iframe: "Tvunget delt av iframe",
+ dynamic: "Dynamisk lasting",
+ reloadPage: "Redigering fullført, last på nytt nå?",
+ copied: "Kopiert",
+ noValidContent: "Ingen gyldig innhold funnet, en Captcha kan være til stede",
+ outOfDate: "Skriptet er utdatert, vennligst oppdater til den nyeste versjonen.",
+ hideBarTips: "Skjul pagineringslinjen, veksle mellom oppslukende opplevelse",
+ setConfigPage: "Angi gjeldende side som standard konfigurasjonsside",
+ wedata2github: "Endre wedata-adressen til speiladressen i github-depotet",
+ addOtherProp: "Legg til regelegenskaper",
+ addNextSelector: "Legg til velgerinnhold som nextLink",
+ addPageSelector: "Legg til velgerinnhold som pageElement",
+ propName: "Skriv inn regelegenskapsnavn",
+ propValue: "Skriv inn regelegenskapsverdi",
+ customFirst: "Ignorer hurtigbuffer for lokale egendefinerte regler",
+ rulesExample: "Regeleksempel",
+ lastPage: "Nådde den siste siden",
+ lastPageTips: "Vis tips når du når den siste siden"
+ }
+ },
+ {
+ name: "Svenska",
+ match: ["sv"],
+ lang: {
+ enableDebug: "Aktivera felsökningsutdata till konsolen",
+ updateNotification: "Meddelande efter att regler har uppdaterats",
+ disable: "Inaktivera tillfälligt",
+ disableSite: "Växla inaktiverat läge",
+ disableSiteTips: "Inaktiverad på denna webbplats.",
+ enableSiteTips: "Aktiverad på denna webbplats.",
+ enable: "✅Aktivera automatisk sidvändning",
+ tempActive: "Tillfälligt aktiv",
+ toTop: "Tillbaka till toppen.",
+ toBottom: "Gå till botten.",
+ current: "Nuvarande sida.",
+ forceIframe: "Tvinga att ansluta till nästa sida",
+ cancelForceIframe: "Avbryt tvångsanslutning",
+ configure: "Konfigurera Pagetual",
+ firstUpdate: "Klicka här för att initiera standardregellistan",
+ update: "Uppdatera onlineregler",
+ click2update: "Klicka för att uppdatera regler från url nu",
+ loadNow: "Ladda nästa automatiskt",
+ loadConfirm: "Hur många sidor vill du ladda? (0 betyder oändligt)",
+ noNext: "Ingen nästa länk hittades, skapa en ny regel",
+ passSec: "Uppdaterad för #t# sekunder sedan",
+ passMin: "Uppdaterad för #t# minuter sedan",
+ passHour: "Uppdaterad för #t# timmar sedan",
+ passDay: "Uppdaterad för #t# dagar sedan",
+ cantDel: "Kan inte ta bort inbyggda regler",
+ confirmDel: "Är du säker på att du vill ta bort denna regel?",
+ updateSucc: "Uppdatering lyckades",
+ beginUpdate: "Påbörjar uppdatering, vänta ett ögonblick",
+ customUrls: "Importera Pagetual eller AutoPagerize regel-url, en url per rad.",
+ customRules: "Ange anpassade regler. ✍️Bidra med regler",
+ save: "Spara",
+ loadingText: "Laddar nu...",
+ opacity: "Opacitet",
+ opacityPlaceholder: "0: dölj mellanrum",
+ hideBar: "Dölj pagineringsmellanrummet",
+ hideBarButNoStop: "Dölj men stoppa inte",
+ dbClick2Stop: "Dubbelklicka på det tomma utrymmet för att pausa",
+ sortTitle: "Sortering träder i kraft efter nästa regeluppdatering",
+ autoRun: "Auto-aktivera (svartlistningsläge)",
+ autoLoadNum: "Antal för förinläsning av sidor",
+ turnRate: "Vänd till nästa sida när det är mindre än 【X】 gånger sidhöjden från sidfoten",
+ inputPageNum: "Ange sidnummer för att hoppa",
+ enableHistory: "Skriv webbhistorik efter sidvändning",
+ enableHistoryAfterInsert: "Skriv webbhistorik omedelbart efter sammanfogning, annars skriv efter surfning",
+ contentVisibility: "Växla automatiskt innehållssynlighet för att förbättra renderingsprestanda",
+ initRun: "Vänd sidor omedelbart efter öppning",
+ preload: "Förinläs nästa sida för att påskynda",
+ click2ImportRule: "Klicka för att importera grundregellänk, och vänta sedan tills uppdateringen är klar: ",
+ forceAllBody: "Anslut hela sidans kropp?",
+ openInNewTab: "Öppna webbadresser för tillägg i ny flik",
+ importSucc: "Importen är klar",
+ import: "Importera",
+ editCurrent: "Redigera regel för aktuell webbplats",
+ editBlacklist: "Redigera webbadress-svartlistan, en post per rad, stöder [?,*] jokertecken.",
+ upBtnImg: "Ikon för tillbaka till toppen",
+ downBtnImg: "Ikon för att gå till sidfot",
+ sideControllerIcon: "Ikon för sidofältet",
+ loadingTextTitle: "Laddar",
+ dbClick2StopCtrl: "Ctrl-tangent",
+ dbClick2StopAlt: "Alt-tangent",
+ dbClick2StopShift: "Shift-tangent",
+ dbClick2StopMeta: "Meta-tangent",
+ dbClick2StopKey: "Snabbtangent",
+ pageElementCss: "Anpassad stil för huvudsidaelement",
+ customCss: "Anpassad komplett css",
+ firstAlert: "Du har inte importerat grundregeln, välj lämplig regel att importera",
+ picker: "Pagetual elementväljare",
+ closePicker: "Stäng Pagetual-väljare",
+ pickerPlaceholder: "Elementväljare, (Endast avancerade användare, lämna tomt annars)",
+ pickerCheck: "Kontrollera väljare och kopiera",
+ switchSelector: "Klicka för att byta element",
+ gotoEdit: "Gå till redigera regel med aktuell väljare",
+ manualMode: "Inaktivera sammanfogning, gå manuellt framåt till nästa sida med höger piltangent (eller skicka händelsen 'pagetual.next')",
+ clickMode: "Inaktivera sammanfogning, klicka automatiskt på nästa sida när du rullar till slutet av sidan",
+ pageBarMenu: "Klicka på mitten av sidfältet för att öppna väljarmenyn",
+ nextSwitch: "Byt nästa länk",
+ arrowToScroll: "Tryck på vänster piltangent för att rulla tillbaka och höger piltangent för att gå fram en sida",
+ sideController: "Visa pagineringskontrollfältet i sidofältet",
+ sideControllerScroll: "Rullningsväxling",
+ sideControllerAlways: "Visa alltid",
+ hideLoadingIcon: "Dölj laddningsanimation",
+ hideBarArrow: "Dölj pil för sidfält",
+ duplicate: "Duplicerad Pagetual har installerats, kontrollera din skripthanterare!",
+ forceStateIframe: "Bädda in hela sidan som iframe",
+ forceStateDynamic: "Ladda dynamiskt innehåll via iframe",
+ forceStateDisable: "Inaktivera sidvändning på denna webbplats",
+ autoScrollRate: "Rullningshastighet (1~1000)",
+ disableAutoScroll: "Stoppa automatisk rullning",
+ enableAutoScroll: "Aktivera automatisk rullning",
+ toggleAutoScroll: "Växla automatisk rullning",
+ ruleRequest: "Regelförfrågan",
+ page: "Sida ",
+ prevPage: "Föregående sida",
+ nextPage: "Nästa sida",
+ errorRulesMustBeArray: "Regler måste vara en array!",
+ errorJson: "JSON-fel, kontrollera igen!",
+ editSuccess: "Redigering lyckades",
+ errorWrongUrl: "Fel webbadress, kontrollera igen!",
+ errorAlreadyExists: "En regel finns redan!",
+ settingsSaved: "Inställningarna har sparats, uppdatera för att se",
+ iframe: "Tvingad delning av iframe",
+ dynamic: "Dynamisk laddning",
+ reloadPage: "Redigering slutförd, ladda om nu?",
+ copied: "Kopierad",
+ noValidContent: "Inget giltigt innehåll hittades, en Captcha kan finnas",
+ outOfDate: "Skriptet är föråldrat, uppdatera till den senaste versionen.",
+ hideBarTips: "Dölj pagineringsfältet, växla till en uppslukande upplevelse",
+ setConfigPage: "Ange aktuell sida som standardkonfigurationssida",
+ wedata2github: "Ändra wedata-adressen till spegeladressen i github-förvaret",
+ addOtherProp: "Lägg till regelegenskaper",
+ addNextSelector: "Lägg till väljarinnehåll som nextLink",
+ addPageSelector: "Lägg till väljarinnehåll som pageElement",
+ propName: "Ange regelegenskapsnamn",
+ propValue: "Ange regelegenskapsvärde",
+ customFirst: "Ignorera cache för lokala anpassade regler",
+ rulesExample: "Regelexempel",
+ lastPage: "Nådde sista sidan",
+ lastPageTips: "Visa tips när du når sista sidan"
+ }
+ },
+ {
+ name: "Српски",
+ match: ["sr"],
+ lang: {
+ enableDebug: "Омогући отклањање грешака на конзоли",
+ updateNotification: "Обавештење након ажурирања правила",
+ disable: "Привремено онемогући",
+ disableSite: "Промени стање онемогућености",
+ disableSiteTips: "Онемогућено на овом сајту.",
+ enableSiteTips: "Омогућено на овом сајту.",
+ enable: "✅Омогући аутоматско окретање страница",
+ tempActive: "Привремено активно",
+ toTop: "Назад на врх.",
+ toBottom: "Иди на дно.",
+ current: "Тренутна страница.",
+ forceIframe: "Присили спајање следеће странице",
+ cancelForceIframe: "Откажи присилно спајање",
+ configure: "Конфигуриши Pagetual",
+ firstUpdate: "Кликните овде да бисте покренули подразумевану листу правила",
+ update: "Ажурирај правила на мрежи",
+ click2update: "Кликните да бисте одмах ажурирали правила са УРЛ-а",
+ loadNow: "Учитај следеће аутоматски",
+ loadConfirm: "Колико страница желите да учитате? (0 значи бесконачно)",
+ noNext: "Није пронађена следећа веза, креирајте ново правило",
+ passSec: "Ажурирано пре #t# секунди",
+ passMin: "Ажурирано пре #t# минута",
+ passHour: "Ажурирано пре #t# сати",
+ passDay: "Ажурирано пре #t# дана",
+ cantDel: "Не могу се избрисати уграђена правила",
+ confirmDel: "Да ли сте сигурни да желите да избришете ово правило?",
+ updateSucc: "Ажурирање је успело",
+ beginUpdate: "Започни ажурирање, сачекајте тренутак",
+ customUrls: "Увезите Pagetual или AutoPagerize УРЛ правила, један УРЛ по линији.",
+ customRules: "Унесите прилагођена правила. ✍️Допринесите правилима",
+ save: "Сачувај",
+ loadingText: "Учитавање у току...",
+ opacity: "Провидност",
+ opacityPlaceholder: "0: сакриј размак",
+ hideBar: "Сакриј размак за пагинацију",
+ hideBarButNoStop: "Сакриј, али не заустављај",
+ dbClick2Stop: "Двапут кликните на празан простор да бисте паузирали",
+ sortTitle: "Сортирање ступа на снагу након следећег ажурирања правила",
+ autoRun: "Аутоматско омогућавање (режим црне листе)",
+ autoLoadNum: "Количина за унапред учитане странице",
+ turnRate: "Окрените следећу страницу када је мање од 【X】 пута висине странице од подножја",
+ inputPageNum: "Унесите број странице за скок",
+ enableHistory: "Упиши историју прегледања након окретања странице",
+ enableHistoryAfterInsert: "Упиши историју прегледања одмах након спајања, у супротном упиши након прегледања",
+ contentVisibility: "Аутоматски промени видљивост садржаја да би се побољшале перформансе приказивања",
+ initRun: "Окрени странице одмах након отварања",
+ preload: "Унапред учитај следећу страницу ради убрзања",
+ click2ImportRule: "Кликните да бисте увезли везу основних правила, а затим сачекајте док се ажурирање не заврши: ",
+ forceAllBody: "Спојити цело тело странице?",
+ openInNewTab: "Отвори УРЛ-ове додатака у новој картици",
+ importSucc: "Увоз је завршен",
+ import: "Увези",
+ editCurrent: "Уреди правило за тренутни веб-сајт",
+ editBlacklist: "Уредите УРЛ црну листу, један унос по линији, подржава џокере [?,*].",
+ upBtnImg: "Икона за повратак на врх",
+ downBtnImg: "Икона за одлазак на подножје",
+ sideControllerIcon: "Икона бочне траке",
+ loadingTextTitle: "Учитавање",
+ dbClick2StopCtrl: "Тастер Ctrl",
+ dbClick2StopAlt: "Тастер Alt",
+ dbClick2StopShift: "Тастер Shift",
+ dbClick2StopMeta: "Тастер Meta",
+ dbClick2StopKey: "Тастер пречице",
+ pageElementCss: "Прилагођени стил за главне елементе странице",
+ customCss: "Прилагођени комплетан ЦСС",
+ firstAlert: "Нисте увезли основно правило, изаберите одговарајуће правило за увоз",
+ picker: "Pagetual бирач елемената",
+ closePicker: "Затвори Pagetual бирач",
+ pickerPlaceholder: "Бирач елемената, (Само напредни корисници, иначе оставите празно)",
+ pickerCheck: "Провери бирач и копирај",
+ switchSelector: "Кликните да бисте променили елемент",
+ gotoEdit: "Иди на уређивање правила са тренутним бирачем",
+ manualMode: "Онемогући спајање, ручно пређи на следећу страницу помоћу десног тастера са стрелицом (или пошаљи догађај 'pagetual.next')",
+ clickMode: "Онемогући спајање, аутоматски кликни на следећу страницу приликом померања до краја странице",
+ pageBarMenu: "Кликните на центар траке странице да бисте отворили мени бирача",
+ nextSwitch: "Промени следећу везу",
+ arrowToScroll: "Притисните леви тастер са стрелицом за померање уназад и десни тастер са стрелицом за прелазак на страницу",
+ sideController: "Прикажи контролну траку за пагинацију у бочној траци",
+ sideControllerScroll: "Промена померања",
+ sideControllerAlways: "Увек прикажи",
+ hideLoadingIcon: "Сакриј анимацију учитавања",
+ hideBarArrow: "Сакриј стрелицу за траку странице",
+ duplicate: "Дупликат Pagetual је инсталиран, проверите свој менаџер скрипти!",
+ forceStateIframe: "Угради целу страницу као iframe",
+ forceStateDynamic: "Учитај динамички садржај путем iframe-a",
+ forceStateDisable: "Онемогући окретање страница на овом сајту",
+ autoScrollRate: "Брзина померања (1~1000)",
+ disableAutoScroll: "Заустави аутоматско померање",
+ enableAutoScroll: "Омогући аутоматско померање",
+ toggleAutoScroll: "Промени аутоматско померање",
+ ruleRequest: "Захтев за правило",
+ page: "Страница ",
+ prevPage: "Претходна страница",
+ nextPage: "Следећа страница",
+ errorRulesMustBeArray: "Правила морају бити низ!",
+ errorJson: "ЈСОН грешка, проверите поново!",
+ editSuccess: "Успешно уређено",
+ errorWrongUrl: "Погрешан УРЛ, проверите поново!",
+ errorAlreadyExists: "Правило већ постоји!",
+ settingsSaved: "Подешавања су сачувана, освежите да бисте видели",
+ iframe: "Присилно подељено iframe-ом",
+ dynamic: "Динамичко учитавање",
+ reloadPage: "Уређивање је завршено, поново учитати сада?",
+ copied: "Копирано",
+ noValidContent: "Није детектован важећи садржај, можда је присутан Цаптцха",
+ outOfDate: "Скрипта је застарела, ажурирајте на најновију верзију.",
+ hideBarTips: "Сакријте траку за пагинацију, промените имерзивно искуство",
+ setConfigPage: "Постави тренутну страницу као подразумевану страницу за конфигурацију",
+ wedata2github: "Промените wedata адресу на адресу огледала у гитхуб спремишту",
+ addOtherProp: "Додај својства правила",
+ addNextSelector: "Додај садржај бирача као nextLink",
+ addPageSelector: "Додај садржај бирача као pageElement",
+ propName: "Унесите назив својства правила",
+ propValue: "Унесите вредност својства правила",
+ customFirst: "Игнориши кеш за локална прилагођена правила",
+ rulesExample: "Пример правила",
+ lastPage: "Достигнута је последња страница",
+ lastPageTips: "Прикажи савете приликом достизања последње странице"
+ }
+ },
+ {
+ name: "Slovenčina",
+ match: ["sk"],
+ lang: {
+ enableDebug: "Povoliť výstup ladenia do konzoly",
+ updateNotification: "Oznámenie po aktualizácii pravidiel",
+ disable: "Dočasne zakázať",
+ disableSite: "Prepnúť stav zakázania",
+ disableSiteTips: "Na tejto stránke zakázané.",
+ enableSiteTips: "Na tejto stránke povolené.",
+ enable: "✅Povoliť automatické otáčanie stránok",
+ tempActive: "Dočasne aktívne",
+ toTop: "Späť na začiatok.",
+ toBottom: "Ísť na koniec.",
+ current: "Aktuálna stránka.",
+ forceIframe: "Vynútiť pripojenie k ďalšej stránke",
+ cancelForceIframe: "Zrušiť vynútené pripojenie",
+ configure: "Konfigurovať Pagetual",
+ firstUpdate: "Kliknite sem pre inicializáciu predvoleného zoznamu pravidiel",
+ update: "Aktualizovať online pravidlá",
+ click2update: "Kliknite pre aktualizáciu pravidiel z URL teraz",
+ loadNow: "Načítať ďalšie automaticky",
+ loadConfirm: "Koľko stránok chcete načítať? (0 znamená nekonečno)",
+ noNext: "Nenašiel sa žiadny ďalší odkaz, vytvorte nové pravidlo",
+ passSec: "Aktualizované pred #t# sekundami",
+ passMin: "Aktualizované pred #t# minútami",
+ passHour: "Aktualizované pred #t# hodinami",
+ passDay: "Aktualizované pred #t# dňami",
+ cantDel: "Nie je možné odstrániť vstavané pravidlá",
+ confirmDel: "Ste si istí, že chcete odstrániť toto pravidlo?",
+ updateSucc: "Aktualizácia úspešná",
+ beginUpdate: "Začína sa aktualizácia, chvíľu počkajte",
+ customUrls: "Importovať URL pravidla Pagetual alebo AutoPagerize, jedno URL na riadok.",
+ customRules: "Zadajte vlastné pravidlá. ✍️Prispieť pravidlami",
+ save: "Uložiť",
+ loadingText: "Načítava sa...",
+ opacity: "Nepriehľadnosť",
+ opacityPlaceholder: "0: skryť medzerník",
+ hideBar: "Skryť medzerník stránkovania",
+ hideBarButNoStop: "Skryť, ale nezastaviť",
+ dbClick2Stop: "Dvojitým kliknutím na prázdne miesto pozastavíte",
+ sortTitle: "Triedenie sa prejaví po ďalšej aktualizácii pravidiel",
+ autoRun: "Automatické povolenie (režim čiernej listiny)",
+ autoLoadNum: "Množstvo pre prednačítané stránky",
+ turnRate: "Otočte na ďalšiu stránku, keď je menej ako 【X】 násobok výšky stránky od pätičky",
+ inputPageNum: "Zadajte číslo stránky na preskočenie",
+ enableHistory: "Zapísať históriu prehliadania po otočení stránky",
+ enableHistoryAfterInsert: "Zapísať históriu prehliadania ihneď po spojení, inak zapísať po prehliadaní",
+ contentVisibility: "Automaticky prepínať viditeľnosť obsahu na zlepšenie výkonu vykresľovania",
+ initRun: "Otočiť stránky ihneď po otvorení",
+ preload: "Prednačítať ďalšiu stránku na zrýchlenie",
+ click2ImportRule: "Kliknite pre import odkazu na základné pravidlá a potom počkajte, kým sa aktualizácia nedokončí: ",
+ forceAllBody: "Pripojiť celé telo stránky?",
+ openInNewTab: "Otvoriť URL adries prídavkov v novej karte",
+ importSucc: "Import dokončený",
+ import: "Importovať",
+ editCurrent: "Upraviť pravidlo pre aktuálnu webovú stránku",
+ editBlacklist: "Upraviť čiernu listinu URL, jeden záznam na riadok, podporuje zástupné znaky [?,*].",
+ upBtnImg: "Ikona späť na začiatok",
+ downBtnImg: "Ikona ísť na pätičku",
+ sideControllerIcon: "Ikona bočného panela",
+ loadingTextTitle: "Načítavanie",
+ dbClick2StopCtrl: "Kláves Ctrl",
+ dbClick2StopAlt: "Kláves Alt",
+ dbClick2StopShift: "Kláves Shift",
+ dbClick2StopMeta: "Kláves Meta",
+ dbClick2StopKey: "Klávesová skratka",
+ pageElementCss: "Vlastný štýl pre hlavné prvky stránky",
+ customCss: "Vlastné kompletné CSS",
+ firstAlert: "Neimportovali ste základné pravidlo, vyberte prosím vhodné pravidlo na import",
+ picker: "Výber prvkov Pagetual",
+ closePicker: "Zavrieť výber Pagetual",
+ pickerPlaceholder: "Výber prvkov, (Iba pre pokročilých používateľov, inak nechajte prázdne)",
+ pickerCheck: "Skontrolovať výber a kopírovať",
+ switchSelector: "Kliknutím prepnete prvok",
+ gotoEdit: "Prejsť na úpravu pravidla s aktuálnym výberom",
+ manualMode: "Zakázať spájanie, manuálne prejsť na ďalšiu stránku pomocou klávesu so šípkou doprava (alebo odoslať udalosť 'pagetual.next')",
+ clickMode: "Zakázať spájanie, automaticky kliknúť na ďalšiu stránku pri posunutí na koniec stránky",
+ pageBarMenu: "Kliknutím na stred lišty stránky otvoríte menu výberu",
+ nextSwitch: "Prepnúť ďalší odkaz",
+ arrowToScroll: "Stlačením ľavej šípky sa posuniete späť a pravou šípkou prejdete na stránku",
+ sideController: "Zobraziť ovládací panel stránkovania v bočnom paneli",
+ sideControllerScroll: "Prepnúť posúvanie",
+ sideControllerAlways: "Vždy zobraziť",
+ hideLoadingIcon: "Skryť animáciu načítavania",
+ hideBarArrow: "Skryť šípku pre lištu stránky",
+ duplicate: "Duplicitný Pagetual bol nainštalovaný, skontrolujte svoj správcu skriptov!",
+ forceStateIframe: "Vložiť celú stránku ako iframe",
+ forceStateDynamic: "Načítať dynamický obsah cez iframe",
+ forceStateDisable: "Zakázať otáčanie stránok na tejto stránke",
+ autoScrollRate: "Rýchlosť posúvania (1~1000)",
+ disableAutoScroll: "Zastaviť automatické posúvanie",
+ enableAutoScroll: "Povoliť automatické posúvanie",
+ toggleAutoScroll: "Prepnúť automatické posúvanie",
+ ruleRequest: "Žiadosť o pravidlo",
+ page: "Stránka ",
+ prevPage: "Predchádzajúca stránka",
+ nextPage: "Ďalšia stránka",
+ errorRulesMustBeArray: "Pravidlá musia byť pole!",
+ errorJson: "Chyba JSON, skontrolujte znova!",
+ editSuccess: "Úspešne upravené",
+ errorWrongUrl: "Nesprávne URL, skontrolujte znova!",
+ errorAlreadyExists: "Pravidlo už existuje!",
+ settingsSaved: "Nastavenia sú uložené, obnovte pre zobrazenie",
+ iframe: "Vynútené rozdelenie pomocou iframe",
+ dynamic: "Dynamické načítavanie",
+ reloadPage: "Úprava dokončená, načítať znova?",
+ copied: "Skopírované",
+ noValidContent: "Nebol zistený žiadny platný obsah, môže byť prítomná Captcha",
+ outOfDate: "Skript je zastaraný, aktualizujte prosím na najnovšiu verziu.",
+ hideBarTips: "Skryť lištu stránkovania, prepnúť pohlcujúci zážitok",
+ setConfigPage: "Nastaviť aktuálnu stránku ako predvolenú konfiguračnú stránku",
+ wedata2github: "Zmeniť adresu wedata na zrkadlovú adresu v repozitári github",
+ addOtherProp: "Pridať vlastnosti pravidla",
+ addNextSelector: "Pridať obsah výberu ako nextLink",
+ addPageSelector: "Pridať obsah výberu ako pageElement",
+ propName: "Zadajte názov vlastnosti pravidla",
+ propValue: "Zadajte hodnotu vlastnosti pravidla",
+ customFirst: "Ignorovať vyrovnávaciu pamäť pre lokálne vlastné pravidlá",
+ rulesExample: "Príklad pravidiel",
+ lastPage: "Dosiahli ste poslednú stránku",
+ lastPageTips: "Zobraziť tipy pri dosiahnutí poslednej stránky"
+ }
+ },
+ {
+ name: "Magyar",
+ match: ["hu"],
+ lang: {
+ enableDebug: "Hibakeresési kimenet engedélyezése a konzolon",
+ updateNotification: "Értesítés a szabályok frissítése után",
+ disable: "Ideiglenes letiltás",
+ disableSite: "Letiltott állapot váltása",
+ disableSiteTips: "Letiltva ezen az oldalon.",
+ enableSiteTips: "Engedélyezve ezen az oldalon.",
+ enable: "✅Automatikus lapozás engedélyezése",
+ tempActive: "Ideiglenesen aktív",
+ toTop: "Vissza a tetejére.",
+ toBottom: "Ugrás az aljára.",
+ current: "Jelenlegi oldal.",
+ forceIframe: "Következő oldal csatlakozásának kényszerítése",
+ cancelForceIframe: "Kényszerített csatlakozás megszakítása",
+ configure: "Pagetual konfigurálása",
+ firstUpdate: "Kattintson ide az alapértelmezett szabálylista inicializálásához",
+ update: "Online szabályok frissítése",
+ click2update: "Kattintson a szabályok URL-ről történő frissítéséhez",
+ loadNow: "Következő automatikus betöltése",
+ loadConfirm: "Hány oldalt szeretne betölteni? (0 a végtelent jelenti)",
+ noNext: "Nincs következő link, hozzon létre új szabályt",
+ passSec: "#t# másodperce frissítve",
+ passMin: "#t# perce frissítve",
+ passHour: "#t# órája frissítve",
+ passDay: "#t# napja frissítve",
+ cantDel: "Beépített szabályok nem törölhetők",
+ confirmDel: "Biztosan törli ezt a szabályt?",
+ updateSucc: "Sikeres frissítés",
+ beginUpdate: "Frissítés megkezdése, kérem várjon egy pillanatot",
+ customUrls: "Pagetual vagy AutoPagerize szabály URL importálása, soronként egy URL.",
+ customRules: "Adjon meg egyéni szabályokat. ✍️Szabályok beküldése",
+ save: "Mentés",
+ loadingText: "Betöltés...",
+ opacity: "Átlátszóság",
+ opacityPlaceholder: "0: elválasztó elrejtése",
+ hideBar: "Lapozó elválasztó elrejtése",
+ hideBarButNoStop: "Elrejtés, de nem leállítás",
+ dbClick2Stop: "Dupla kattintás az üres területre a szüneteltetéshez",
+ sortTitle: "A rendezés a következő szabályfrissítés után lép érvénybe",
+ autoRun: "Automatikus engedélyezés (feketelista mód)",
+ autoLoadNum: "Előtöltendő oldalak száma",
+ turnRate: "Lapozzon a következő oldalra, ha a lábléctől mért távolság kevesebb, mint az oldal magasságának 【X】-szerese",
+ inputPageNum: "Adja meg az ugrani kívánt oldalszámot",
+ enableHistory: "Böngészési előzmények írása lapozás után",
+ enableHistoryAfterInsert: "Böngészési előzmények írása azonnal az illesztés után, egyébként a böngészés után",
+ contentVisibility: "A content-visibility automatikus váltása a renderelési teljesítmény javítása érdekében",
+ initRun: "Oldalak lapozása azonnal a megnyitás után",
+ preload: "Következő oldal előtöltése a gyorsítás érdekében",
+ click2ImportRule: "Kattintson az alapszabályok linkjének importálásához, majd várja meg a frissítés befejezését: ",
+ forceAllBody: "Csatlakoztatja az oldal teljes törzsét?",
+ openInNewTab: "A kiegészítések URL-jeinek megnyitása új lapon",
+ importSucc: "Importálás befejezve",
+ import: "Importálás",
+ editCurrent: "Szabály szerkesztése az aktuális webhelyhez",
+ editBlacklist: "URL feketelista szerkesztése, soronként egy bejegyzés, támogatja a [?,*] helyettesítő karaktereket.",
+ upBtnImg: "Vissza a tetejére ikon",
+ downBtnImg: "Ugrás a lábléchez ikon",
+ sideControllerIcon: "Oldalsáv ikonja",
+ loadingTextTitle: "Betöltés",
+ dbClick2StopCtrl: "Ctrl billentyű",
+ dbClick2StopAlt: "Alt billentyű",
+ dbClick2StopShift: "Shift billentyű",
+ dbClick2StopMeta: "Meta billentyű",
+ dbClick2StopKey: "Gyorsbillentyű",
+ pageElementCss: "Egyéni stílus a fő oldalelemekhez",
+ customCss: "Egyéni teljes CSS",
+ firstAlert: "Nem importálta az alapszabályt, kérjük, válassza ki a megfelelő szabályt az importáláshoz",
+ picker: "Pagetual elemkiválasztó",
+ closePicker: "Pagetual kiválasztó bezárása",
+ pickerPlaceholder: "Elemválasztó (Csak haladó felhasználóknak, egyébként hagyja üresen)",
+ pickerCheck: "Választó ellenőrzése és másolása",
+ switchSelector: "Kattintson az elem váltásához",
+ gotoEdit: "Ugrás a szabály szerkesztéséhez az aktuális választóval",
+ manualMode: "Illesztés letiltása, manuális lapozás a jobb nyílbillentyűvel (vagy a 'pagetual.next' esemény küldésével)",
+ clickMode: "Illesztés letiltása, automatikus kattintás a következő oldalra az oldal végére görgetve",
+ pageBarMenu: "Kattintson az oldalsáv közepére a kiválasztó menü megnyitásához",
+ nextSwitch: "Következő link váltása",
+ arrowToScroll: "Nyomja meg a bal nyilat a visszagörgetéshez és a jobb nyilat az oldallapozáshoz",
+ sideController: "A lapozásvezérlő sáv megjelenítése az oldalsávon",
+ sideControllerScroll: "Görgetés váltása",
+ sideControllerAlways: "Mindig mutassa",
+ hideLoadingIcon: "Betöltési animáció elrejtése",
+ hideBarArrow: "Oldalsáv nyilának elrejtése",
+ duplicate: "Duplikált Pagetual telepítve van, ellenőrizze a szkriptkezelőjét!",
+ forceStateIframe: "Teljes oldal beágyazása iframe-ként",
+ forceStateDynamic: "Dinamikus tartalom betöltése iframe-en keresztül",
+ forceStateDisable: "Lapozás letiltása ezen az oldalon",
+ autoScrollRate: "Görgetési sebesség (1-1000)",
+ disableAutoScroll: "Automatikus görgetés leállítása",
+ enableAutoScroll: "Automatikus görgetés engedélyezése",
+ toggleAutoScroll: "Automatikus görgetés váltása",
+ ruleRequest: "Szabálykérés",
+ page: "Oldal ",
+ prevPage: "Előző oldal",
+ nextPage: "Következő oldal",
+ errorRulesMustBeArray: "A szabályoknak tömbnek kell lenniük!",
+ errorJson: "JSON hiba, ellenőrizze újra!",
+ editSuccess: "Sikeres szerkesztés",
+ errorWrongUrl: "Hibás URL, ellenőrizze újra!",
+ errorAlreadyExists: "Már létezik egy szabály!",
+ settingsSaved: "A beállítások mentve, frissítsen a megtekintéshez",
+ iframe: "Iframe által kényszerített felosztás",
+ dynamic: "Dinamikus betöltés",
+ reloadPage: "Szerkesztés befejezve, újratölti most?",
+ copied: "Másolva",
+ noValidContent: "Nincs érvényes tartalom, lehet, hogy Captcha van jelen",
+ outOfDate: "A szkript elavult, kérjük, frissítsen a legújabb verzióra.",
+ hideBarTips: "A lapozósáv elrejtése, magával ragadó élmény váltása",
+ setConfigPage: "Az aktuális oldal beállítása alapértelmezett konfigurációs oldalként",
+ wedata2github: "A wedata cím megváltoztatása a tükör címre a github tárolóban",
+ addOtherProp: "Szabálytulajdonságok hozzáadása",
+ addNextSelector: "Választó tartalmának hozzáadása nextLink-ként",
+ addPageSelector: "Választó tartalmának hozzáadása pageElement-ként",
+ propName: "Adja meg a szabálytulajdonság nevét",
+ propValue: "Adja meg a szabálytulajdonság értékét",
+ customFirst: "Gyorsítótár figyelmen kívül hagyása a helyi egyéni szabályoknál",
+ rulesExample: "Szabályok példa",
+ lastPage: "Elérte az utolsó oldalt",
+ lastPageTips: "Tippek megjelenítése az utolsó oldal elérésekor"
+ }
+ },
+ {
+ name: "Română",
+ match: ["ro"],
+ lang: {
+ enableDebug: "Activați ieșirea de depanare în consolă",
+ updateNotification: "Notificare după actualizarea regulilor",
+ disable: "Dezactivați temporar",
+ disableSite: "Comutați starea de dezactivare",
+ disableSiteTips: "Dezactivat pe acest site.",
+ enableSiteTips: "Activat pe acest site.",
+ enable: "✅Activați întoarcerea automată a paginii",
+ tempActive: "Activ temporar",
+ toTop: "Înapoi sus.",
+ toBottom: "Mergi jos.",
+ current: "Pagina curentă.",
+ forceIframe: "Forțați alăturarea la pagina următoare",
+ cancelForceIframe: "Anulați alăturarea forțată",
+ configure: "Configurați Pagetual",
+ firstUpdate: "Faceți clic aici pentru a inițializa lista de reguli implicită",
+ update: "Actualizați regulile online",
+ click2update: "Faceți clic pentru a actualiza regulile de la URL acum",
+ loadNow: "Încărcați următoarea automat",
+ loadConfirm: "Câte pagini doriți să încărcați? (0 înseamnă infinit)",
+ noNext: "Nu s-a găsit niciun link următor, vă rugăm să creați o nouă regulă",
+ passSec: "Actualizat acum #t# secunde",
+ passMin: "Actualizat acum #t# minute",
+ passHour: "Actualizat acum #t# ore",
+ passDay: "Actualizat acum #t# zile",
+ cantDel: "Nu se pot șterge regulile încorporate",
+ confirmDel: "Sunteți sigur că doriți să ștergeți această regulă?",
+ updateSucc: "Actualizare reușită",
+ beginUpdate: "Începe actualizarea, vă rugăm așteptați un moment",
+ customUrls: "Importați URL-ul regulii Pagetual sau AutoPagerize, un URL pe linie.",
+ customRules: "Introduceți reguli personalizate. ✍️Contribuiți cu reguli",
+ save: "Salvați",
+ loadingText: "Se încarcă...",
+ opacity: "Opacitate",
+ opacityPlaceholder: "0: ascundeți distanțierul",
+ hideBar: "Ascundeți distanțierul de paginare",
+ hideBarButNoStop: "Ascundeți, dar nu opriți",
+ dbClick2Stop: "Faceți dublu clic pe spațiul gol pentru a întrerupe",
+ sortTitle: "Sortarea intră în vigoare după următoarea actualizare a regulilor",
+ autoRun: "Activare automată (mod listă neagră)",
+ autoLoadNum: "Cantitatea de pagini de preîncărcat",
+ turnRate: "Întoarceți la pagina următoare când este mai puțin de 【X】 ori înălțimea paginii de la subsol",
+ inputPageNum: "Introduceți numărul paginii pentru a sări",
+ enableHistory: "Scrieți istoricul de navigare după întoarcerea paginii",
+ enableHistoryAfterInsert: "Scrieți istoricul de navigare imediat după îmbinare, altfel scrieți după navigare",
+ contentVisibility: "Comutați automat vizibilitatea conținutului pentru a îmbunătăți performanța de randare",
+ initRun: "Întoarceți paginile imediat după deschidere",
+ preload: "Preîncărcați pagina următoare pentru a accelera",
+ click2ImportRule: "Faceți clic pentru a importa linkul regulilor de bază, apoi așteptați până la finalizarea actualizării: ",
+ forceAllBody: "Alăturați corpul complet al paginii?",
+ openInNewTab: "Deschideți URL-urile adăugirilor într-o filă nouă",
+ importSucc: "Import finalizat",
+ import: "Importați",
+ editCurrent: "Editați regula pentru site-ul web curent",
+ editBlacklist: "Editați lista neagră de URL-uri, o intrare pe linie, suportă caracterele [?,*].",
+ upBtnImg: "Pictogramă înapoi sus",
+ downBtnImg: "Pictogramă mergi la subsol",
+ sideControllerIcon: "Pictogramă bară laterală",
+ loadingTextTitle: "Se încarcă",
+ dbClick2StopCtrl: "Tasta Ctrl",
+ dbClick2StopAlt: "Tasta Alt",
+ dbClick2StopShift: "Tasta Shift",
+ dbClick2StopMeta: "Tasta Meta",
+ dbClick2StopKey: "Tastă de comandă rapidă",
+ pageElementCss: "Stil personalizat pentru elementele principale ale paginii",
+ customCss: "CSS complet personalizat",
+ firstAlert: "Nu ați importat regula de bază, vă rugăm să selectați regula corespunzătoare pentru a o importa",
+ picker: "Selector de elemente Pagetual",
+ closePicker: "Închideți selectorul Pagetual",
+ pickerPlaceholder: "Selector de elemente (Doar utilizatori avansați, altfel lăsați necompletat)",
+ pickerCheck: "Verificați selectorul și copiați",
+ switchSelector: "Faceți clic pentru a comuta elementul",
+ gotoEdit: "Mergeți la editarea regulii cu selectorul curent",
+ manualMode: "Dezactivați îmbinarea, avansați manual la pagina următoare folosind tasta săgeată dreapta (sau trimiteți evenimentul 'pagetual.next')",
+ clickMode: "Dezactivați îmbinarea, faceți clic automat pe pagina următoare la derularea până la sfârșitul paginii",
+ pageBarMenu: "Faceți clic în centrul barei de pagină pentru a deschide meniul selectorului",
+ nextSwitch: "Comutați linkul următor",
+ arrowToScroll: "Apăsați săgeata stânga pentru a derula înapoi și săgeata dreapta pentru a avansa pagina",
+ sideController: "Afișați bara de control a paginării în bara laterală",
+ sideControllerScroll: "Comutare derulare",
+ sideControllerAlways: "Afișați întotdeauna",
+ hideLoadingIcon: "Ascundeți animația de încărcare",
+ hideBarArrow: "Ascundeți săgeata pentru bara de pagină",
+ duplicate: "Pagetual duplicat a fost instalat, verificați managerul de scripturi!",
+ forceStateIframe: "Încorporați pagina completă ca iframe",
+ forceStateDynamic: "Încărcați conținut dinamic prin iframe",
+ forceStateDisable: "Dezactivați întoarcerea paginii pe acest site",
+ autoScrollRate: "Viteza de derulare (1~1000)",
+ disableAutoScroll: "Opriți derularea automată",
+ enableAutoScroll: "Activați derularea automată",
+ toggleAutoScroll: "Comutați derularea automată",
+ ruleRequest: "Cerere de regulă",
+ page: "Pagina ",
+ prevPage: "Pagina anterioară",
+ nextPage: "Pagina următoare",
+ errorRulesMustBeArray: "Regulile trebuie să fie un tablou!",
+ errorJson: "Eroare JSON, verificați din nou!",
+ editSuccess: "Editat cu succes",
+ errorWrongUrl: "URL greșit, verificați din nou!",
+ errorAlreadyExists: "O regulă există deja!",
+ settingsSaved: "Setările sunt salvate, reîmprospătați pentru a vizualiza",
+ iframe: "Divizare forțată de iframe",
+ dynamic: "Încărcare dinamică",
+ reloadPage: "Editare finalizată, reîncărcați acum?",
+ copied: "Copiat",
+ noValidContent: "Nu s-a detectat niciun conținut valid, este posibil să existe un Captcha",
+ outOfDate: "Scriptul este învechit, vă rugăm să actualizați la cea mai recentă versiune.",
+ hideBarTips: "Ascundeți bara de paginare, comutați experiența imersivă",
+ setConfigPage: "Setați pagina curentă ca pagină de configurare implicită",
+ wedata2github: "Schimbați adresa wedata cu adresa oglindă din depozitul github",
+ addOtherProp: "Adăugați proprietăți de regulă",
+ addNextSelector: "Adăugați conținutul selectorului ca nextLink",
+ addPageSelector: "Adăugați conținutul selectorului ca pageElement",
+ propName: "Introduceți numele proprietății regulii",
+ propValue: "Introduceți valoarea proprietății regulii",
+ customFirst: "Ignorați memoria cache pentru regulile personalizate locale",
+ rulesExample: "Exemplu de reguli",
+ lastPage: "Ați ajuns la ultima pagină",
+ lastPageTips: "Afișați sfaturi la atingerea ultimei pagini"
+ }
+ },
+ {
+ name: "Suomi",
+ match: ["fi"],
+ lang: {
+ enableDebug: "Ota virheenkorjaustuloste käyttöön konsolissa",
+ updateNotification: "Ilmoitus sääntöjen päivityksen jälkeen",
+ disable: "Poista väliaikaisesti käytöstä",
+ disableSite: "Vaihda käytöstä poistettu tila",
+ disableSiteTips: "Poistettu käytöstä tällä sivustolla.",
+ enableSiteTips: "Otettu käyttöön tällä sivustolla.",
+ enable: "✅Ota automaattinen sivunvaihto käyttöön",
+ tempActive: "Väliaikaisesti aktiivinen",
+ toTop: "Takaisin ylös.",
+ toBottom: "Mene alas.",
+ current: "Nykyinen sivu.",
+ forceIframe: "Pakota liittymään seuraavalle sivulle",
+ cancelForceIframe: "Peruuta pakotettu liittyminen",
+ configure: "Määritä Pagetual",
+ firstUpdate: "Napsauta tästä alustaaksesi oletussääntöluettelon",
+ update: "Päivitä verkkosäännöt",
+ click2update: "Napsauta päivittääksesi säännöt URL-osoitteesta nyt",
+ loadNow: "Lataa seuraava automaattisesti",
+ loadConfirm: "Kuinka monta sivua haluat ladata? (0 tarkoittaa ääretöntä)",
+ noNext: "Seuraavaa linkkiä ei löytynyt, luo uusi sääntö",
+ passSec: "Päivitetty #t# sekuntia sitten",
+ passMin: "Päivitetty #t# minuuttia sitten",
+ passHour: "Päivitetty #t# tuntia sitten",
+ passDay: "Päivitetty #t# päivää sitten",
+ cantDel: "Sisäänrakennettuja sääntöjä ei voi poistaa",
+ confirmDel: "Haluatko varmasti poistaa tämän säännön?",
+ updateSucc: "Päivitys onnistui",
+ beginUpdate: "Aloitetaan päivitys, odota hetki",
+ customUrls: "Tuo Pagetual- tai AutoPagerize-säännön URL-osoite, yksi URL-osoite riviä kohti.",
+ customRules: "Syötä mukautettuja sääntöjä. ✍️Osallistu sääntöihin",
+ save: "Tallenna",
+ loadingText: "Ladataan...",
+ opacity: "Läpinäkyvyys",
+ opacityPlaceholder: "0: piilota välilevy",
+ hideBar: "Piilota sivutuksen välilevy",
+ hideBarButNoStop: "Piilota, mutta älä pysäytä",
+ dbClick2Stop: "Kaksoisnapsauta tyhjää tilaa keskeyttääksesi",
+ sortTitle: "Lajittelu tulee voimaan seuraavan sääntöpäivityksen jälkeen",
+ autoRun: "Ota automaattisesti käyttöön (mustan listan tila)",
+ autoLoadNum: "Esiladattavien sivujen määrä",
+ turnRate: "Vaihda seuraavalle sivulle, kun se on alle 【X】 kertaa sivun korkeuden päässä alatunnisteesta",
+ inputPageNum: "Syötä sivunumero siirtyäksesi",
+ enableHistory: "Kirjoita selaushistoria sivunvaihdon jälkeen",
+ enableHistoryAfterInsert: "Kirjoita selaushistoria heti liittämisen jälkeen, muuten kirjoita selauksen jälkeen",
+ contentVisibility: "Vaihda automaattisesti sisällön näkyvyyttä parantaaksesi renderöintisuorituskykyä",
+ initRun: "Vaihda sivuja heti avaamisen jälkeen",
+ preload: "Esilataa seuraava sivu nopeuttaaksesi",
+ click2ImportRule: "Napsauta tuodaksesi perussääntöjen linkin ja odota sitten, kunnes päivitys on valmis: ",
+ forceAllBody: "Liitetäänkö sivun koko runko?",
+ openInNewTab: "Avaa lisäysten URL-osoitteet uudessa välilehdessä",
+ importSucc: "Tuonti onnistui",
+ import: "Tuo",
+ editCurrent: "Muokkaa nykyisen verkkosivuston sääntöä",
+ editBlacklist: "Muokkaa URL-mustaa listaa, yksi merkintä riviä kohti, tukee [?,*] -jokerimerkkejä.",
+ upBtnImg: "Takaisin ylös -kuvake",
+ downBtnImg: "Mene alatunnisteeseen -kuvake",
+ sideControllerIcon: "Sivupalkin kuvake",
+ loadingTextTitle: "Ladataan",
+ dbClick2StopCtrl: "Ctrl-näppäin",
+ dbClick2StopAlt: "Alt-näppäin",
+ dbClick2StopShift: "Shift-näppäin",
+ dbClick2StopMeta: "Meta-näppäin",
+ dbClick2StopKey: "Pikakuvake",
+ pageElementCss: "Mukautettu tyyli pääsivun elementeille",
+ customCss: "Mukautettu täydellinen CSS",
+ firstAlert: "Et ole tuonut perussääntöä, valitse sopiva sääntö tuotavaksi",
+ picker: "Pagetual-elementin valitsin",
+ closePicker: "Sulje Pagetual-valitsin",
+ pickerPlaceholder: "Elementin valitsin (Vain edistyneille käyttäjille, muuten jätä tyhjäksi)",
+ pickerCheck: "Tarkista valitsin ja kopioi",
+ switchSelector: "Napsauta vaihtaaksesi elementtiä",
+ gotoEdit: "Siirry muokkaamaan sääntöä nykyisellä valitsimella",
+ manualMode: "Poista liittäminen käytöstä, siirry manuaalisesti seuraavalle sivulle oikealla nuolinäppäimellä (tai lähetä tapahtuma 'pagetual.next')",
+ clickMode: "Poista liittäminen käytöstä, napsauta automaattisesti seuraavaa sivua, kun vierität sivun loppuun",
+ pageBarMenu: "Napsauta sivupalkin keskustaa avataksesi valitsinvalikon",
+ nextSwitch: "Vaihda seuraava linkki",
+ arrowToScroll: "Paina vasenta nuolta selataksesi taaksepäin ja oikeaa nuolta siirtyäksesi sivulle",
+ sideController: "Näytä sivutuksen ohjauspalkki sivupalkissa",
+ sideControllerScroll: "Vierityksen vaihto",
+ sideControllerAlways: "Näytä aina",
+ hideLoadingIcon: "Piilota latausanimaatio",
+ hideBarArrow: "Piilota nuoli sivupalkille",
+ duplicate: "Pagetualin kaksoiskappale on asennettu, tarkista komentosarjojen hallinta!",
+ forceStateIframe: "Upota koko sivu iframeksi",
+ forceStateDynamic: "Lataa dynaamista sisältöä iframen kautta",
+ forceStateDisable: "Poista sivunvaihto käytöstä tällä sivustolla",
+ autoScrollRate: "Vieritysnopeus (1-1000)",
+ disableAutoScroll: "Pysäytä automaattinen vieritys",
+ enableAutoScroll: "Ota automaattinen vieritys käyttöön",
+ toggleAutoScroll: "Vaihda automaattista vieritystä",
+ ruleRequest: "Sääntöpyyntö",
+ page: "Sivu ",
+ prevPage: "Edellinen sivu",
+ nextPage: "Seuraava sivu",
+ errorRulesMustBeArray: "Sääntöjen on oltava taulukko!",
+ errorJson: "JSON-virhe, tarkista uudelleen!",
+ editSuccess: "Muokkaus onnistui",
+ errorWrongUrl: "Väärä URL-osoite, tarkista uudelleen!",
+ errorAlreadyExists: "Sääntö on jo olemassa!",
+ settingsSaved: "Asetukset on tallennettu, päivitä nähdäksesi",
+ iframe: "Pakotettu jako iframella",
+ dynamic: "Dynaaminen lataus",
+ reloadPage: "Muokkaus valmis, ladataanko uudelleen nyt?",
+ copied: "Kopioitu",
+ noValidContent: "Kelvollista sisältöä ei havaittu, Captcha saattaa olla läsnä",
+ outOfDate: "Komentosarja on vanhentunut, päivitä uusimpaan versioon.",
+ hideBarTips: "Piilota sivutuspalkki, vaihda immersiiviseen kokemukseen",
+ setConfigPage: "Aseta nykyinen sivu oletusmäärityssivuksi",
+ wedata2github: "Vaihda wedata-osoite github-arkiston peiliosoitteeseen",
+ addOtherProp: "Lisää säännön ominaisuuksia",
+ addNextSelector: "Lisää valitsimen sisältö nimellä nextLink",
+ addPageSelector: "Lisää valitsimen sisältö nimellä pageElement",
+ propName: "Syötä säännön ominaisuuden nimi",
+ propValue: "Syötä säännön ominaisuuden arvo",
+ customFirst: "Ohita välimuisti paikallisille mukautetuille säännöille",
+ rulesExample: "Sääntöesimerkki",
+ lastPage: "Viimeinen sivu saavutettu",
+ lastPageTips: "Näytä vinkkejä, kun saavutaan viimeiselle sivulle"
+ }
+ },
+ {
+ name: "Ελληνικά",
+ match: ["el"],
+ lang: {
+ enableDebug: "Ενεργοποίηση εξόδου εντοπισμού σφαλμάτων στην κονσόλα",
+ updateNotification: "Ειδοποίηση μετά την ενημέρωση των κανόνων",
+ disable: "Προσωρινή απενεργοποίηση",
+ disableSite: "Εναλλαγή κατάστασης απενεργοποίησης",
+ disableSiteTips: "Απενεργοποιημένο σε αυτόν τον ιστότοπο.",
+ enableSiteTips: "Ενεργοποιημένο σε αυτόν τον ιστότοπο.",
+ enable: "✅Ενεργοποίηση αυτόματης αλλαγής σελίδας",
+ tempActive: "Προσωρινά ενεργό",
+ toTop: "Επιστροφή στην κορυφή.",
+ toBottom: "Μετάβαση στο κάτω μέρος.",
+ current: "Τρέχουσα σελίδα.",
+ forceIframe: "Εξαναγκασμός συμμετοχής στην επόμενη σελίδα",
+ cancelForceIframe: "Ακύρωση εξαναγκασμένης συμμετοχής",
+ configure: "Διαμόρφωση Pagetual",
+ firstUpdate: "Κάντε κλικ εδώ για να αρχικοποιήσετε την προεπιλεγμένη λίστα κανόνων",
+ update: "Ενημέρωση διαδικτυακών κανόνων",
+ click2update: "Κάντε κλικ για να ενημερώσετε τους κανόνες από το URL τώρα",
+ loadNow: "Φόρτωση του επόμενου αυτόματα",
+ loadConfirm: "Πόσες σελίδες θέλετε να φορτώσετε; (0 σημαίνει άπειρο)",
+ noNext: "Δεν βρέθηκε επόμενος σύνδεσμος, δημιουργήστε έναν νέο κανόνα",
+ passSec: "Ενημερώθηκε πριν από #t# δευτερόλεπτα",
+ passMin: "Ενημερώθηκε πριν από #t# λεπτά",
+ passHour: "Ενημερώθηκε πριν από #t# ώρες",
+ passDay: "Ενημερώθηκε πριν από #t# ημέρες",
+ cantDel: "Δεν είναι δυνατή η διαγραφή ενσωματωμένων κανόνων",
+ confirmDel: "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτόν τον κανόνα;",
+ updateSucc: "Η ενημέρωση ολοκληρώθηκε με επιτυχία",
+ beginUpdate: "Έναρξη ενημέρωσης, περιμένετε μια στιγμή",
+ customUrls: "Εισαγωγή URL κανόνα Pagetual ή AutoPagerize, ένα URL ανά γραμμή.",
+ customRules: "Εισαγωγή προσαρμοσμένων κανόνων. ✍️Συνεισφέρετε κανόνες",
+ save: "Αποθήκευση",
+ loadingText: "Φόρτωση...",
+ opacity: "Αδιαφάνεια",
+ opacityPlaceholder: "0: απόκρυψη διαχωριστικού",
+ hideBar: "Απόκρυψη του διαχωριστικού σελιδοποίησης",
+ hideBarButNoStop: "Απόκρυψη αλλά όχι διακοπή",
+ dbClick2Stop: "Κάντε διπλό κλικ στον κενό χώρο για παύση",
+ sortTitle: "Η ταξινόμηση τίθεται σε ισχύ μετά την επόμενη ενημέρωση κανόνων",
+ autoRun: "Αυτόματη ενεργοποίηση (λειτουργία μαύρης λίστας)",
+ autoLoadNum: "Ποσότητα για προφόρτωση σελίδων",
+ turnRate: "Μετάβαση στην επόμενη σελίδα όταν απέχει λιγότερο από 【X】 φορές το ύψος της σελίδας από το υποσέλιδο",
+ inputPageNum: "Εισαγάγετε τον αριθμό σελίδας για μετάβαση",
+ enableHistory: "Εγγραφή ιστορικού περιήγησης μετά την αλλαγή σελίδας",
+ enableHistoryAfterInsert: "Εγγραφή ιστορικού περιήγησης αμέσως μετά τη συγκόλληση, διαφορετικά εγγραφή μετά την περιήγηση",
+ contentVisibility: "Αυτόματη εναλλαγή της ορατότητας περιεχομένου για βελτίωση της απόδοσης απόδοσης",
+ initRun: "Αλλαγή σελίδων αμέσως μετά το άνοιγμα",
+ preload: "Προφόρτωση της επόμενης σελίδας για επιτάχυνση",
+ click2ImportRule: "Κάντε κλικ για να εισαγάγετε τον σύνδεσμο των βασικών κανόνων και, στη συνέχεια, περιμένετε μέχρι να ολοκληρωθεί η ενημέρωση: ",
+ forceAllBody: "Συμμετοχή ολόκληρου του σώματος της σελίδας;",
+ openInNewTab: "Άνοιγμα των URL των προσθηκών σε νέα καρτέλα",
+ importSucc: "Η εισαγωγή ολοκληρώθηκε",
+ import: "Εισαγωγή",
+ editCurrent: "Επεξεργασία κανόνα για τον τρέχοντα ιστότοπο",
+ editBlacklist: "Επεξεργαστείτε τη μαύρη λίστα URL, μία καταχώριση ανά γραμμή, υποστηρίζει μπαλαντέρ [?,*].",
+ upBtnImg: "Εικονίδιο επιστροφής στην κορυφή",
+ downBtnImg: "Εικονίδιο μετάβασης στο υποσέλιδο",
+ sideControllerIcon: "Εικονίδιο πλευρικής γραμμής",
+ loadingTextTitle: "Φόρτωση",
+ dbClick2StopCtrl: "Πλήκτρο Ctrl",
+ dbClick2StopAlt: "Πλήκτρο Alt",
+ dbClick2StopShift: "Πλήκτρο Shift",
+ dbClick2StopMeta: "Πλήκτρο Meta",
+ dbClick2StopKey: "Πλήκτρο συντόμευσης",
+ pageElementCss: "Προσαρμοσμένο στυλ για τα κύρια στοιχεία της σελίδας",
+ customCss: "Προσαρμοσμένο πλήρες CSS",
+ firstAlert: "Δεν έχετε εισαγάγει τον βασικό κανόνα, επιλέξτε τον κατάλληλο κανόνα για εισαγωγή",
+ picker: "Επιλογέας στοιχείων Pagetual",
+ closePicker: "Κλείσιμο του επιλογέα Pagetual",
+ pickerPlaceholder: "Επιλογέας στοιχείων (Μόνο για προχωρημένους χρήστες, αλλιώς αφήστε κενό)",
+ pickerCheck: "Έλεγχος επιλογέα και αντιγραφή",
+ switchSelector: "Κάντε κλικ για εναλλαγή στοιχείου",
+ gotoEdit: "Μετάβαση στην επεξεργασία κανόνα με τον τρέχοντα επιλογέα",
+ manualMode: "Απενεργοποίηση συγκόλλησης, μη αυτόματη μετάβαση στην επόμενη σελίδα χρησιμοποιώντας το δεξί βέλος (ή αποστολή συμβάντος 'pagetual.next')",
+ clickMode: "Απενεργοποίηση συγκόλλησης, αυτόματο κλικ στην επόμενη σελίδα κατά την κύλιση στο τέλος της σελίδας",
+ pageBarMenu: "Κάντε κλικ στο κέντρο της γραμμής σελίδας για να ανοίξετε το μενού επιλογέα",
+ nextSwitch: "Εναλλαγή επόμενου συνδέσμου",
+ arrowToScroll: "Πατήστε το αριστερό βέλος για κύλιση προς τα πίσω και το δεξί βέλος για μετάβαση στη σελίδα",
+ sideController: "Εμφάνιση της γραμμής ελέγχου σελιδοποίησης στην πλευρική γραμμή",
+ sideControllerScroll: "Εναλλαγή κύλισης",
+ sideControllerAlways: "Πάντα εμφάνιση",
+ hideLoadingIcon: "Απόκρυψη κινούμενης εικόνας φόρτωσης",
+ hideBarArrow: "Απόκρυψη βέλους για τη γραμμή σελίδας",
+ duplicate: "Έχει εγκατασταθεί διπλότυπο Pagetual, ελέγξτε τον διαχειριστή σεναρίων σας!",
+ forceStateIframe: "Ενσωμάτωση ολόκληρης της σελίδας ως iframe",
+ forceStateDynamic: "Φόρτωση δυναμικού περιεχομένου μέσω iframe",
+ forceStateDisable: "Απενεργοποίηση αλλαγής σελίδας σε αυτόν τον ιστότοπο",
+ autoScrollRate: "Ταχύτητα κύλισης (1~1000)",
+ disableAutoScroll: "Διακοπή αυτόματης κύλισης",
+ enableAutoScroll: "Ενεργοποίηση αυτόματης κύλισης",
+ toggleAutoScroll: "Εναλλαγή αυτόματης κύλισης",
+ ruleRequest: "Αίτημα κανόνα",
+ page: "Σελίδα ",
+ prevPage: "Προηγούμενη σελίδα",
+ nextPage: "Επόμενη σελίδα",
+ errorRulesMustBeArray: "Οι κανόνες πρέπει να είναι πίνακας!",
+ errorJson: "Σφάλμα JSON, ελέγξτε ξανά!",
+ editSuccess: "Η επεξεργασία ολοκληρώθηκε με επιτυχία",
+ errorWrongUrl: "Λάθος URL, ελέγξτε ξανά!",
+ errorAlreadyExists: "Ένας κανόνας υπάρχει ήδη!",
+ settingsSaved: "Οι ρυθμίσεις αποθηκεύτηκαν, ανανεώστε για προβολή",
+ iframe: "Εξαναγκασμένος διαχωρισμός από iframe",
+ dynamic: "Δυναμική φόρτωση",
+ reloadPage: "Η επεξεργασία ολοκληρώθηκε, επαναφόρτωση τώρα;",
+ copied: "Αντιγράφηκε",
+ noValidContent: "Δεν εντοπίστηκε έγκυρο περιεχόμενο, ενδέχεται να υπάρχει Captcha",
+ outOfDate: "Το σενάριο είναι ξεπερασμένο, ενημερώστε στην πιο πρόσφατη έκδοση.",
+ hideBarTips: "Απόκρυψη της γραμμής σελιδοποίησης, εναλλαγή καθηλωτικής εμπειρίας",
+ setConfigPage: "Ορισμός της τρέχουσας σελίδας ως προεπιλεγμένης σελίδας διαμόρφωσης",
+ wedata2github: "Αλλάξτε τη διεύθυνση wedata στη διεύθυνση καθρέφτη στο αποθετήριο github",
+ addOtherProp: "Προσθήκη ιδιοτήτων κανόνα",
+ addNextSelector: "Προσθήκη περιεχομένου επιλογέα ως nextLink",
+ addPageSelector: "Προσθήκη περιεχομένου επιλογέα ως pageElement",
+ propName: "Εισαγάγετε το όνομα ιδιότητας κανόνα",
+ propValue: "Εισαγάγετε την τιμή ιδιότητας κανόνα",
+ customFirst: "Παράβλεψη κρυφής μνήμης για τοπικούς προσαρμοσμένους κανόνες",
+ rulesExample: "Παράδειγμα κανόνων",
+ lastPage: "Φτάσατε στην τελευταία σελίδα",
+ lastPageTips: "Εμφάνιση συμβουλών κατά την άφιξη στην τελευταία σελίδα"
+ }
+ },
+ {
+ name: "Esperanto",
+ match: ["eo"],
+ lang: {
+ enableDebug: "Aktivigi sencimigan eligon al la konzolo",
+ updateNotification: "Sciigo post ĝisdatigo de reguloj",
+ disable: "Provizore malŝalti",
+ disableSite: "Baskuligi malŝaltitan staton",
+ disableSiteTips: "Malŝaltita en ĉi tiu retejo.",
+ enableSiteTips: "Ŝaltita en ĉi tiu retejo.",
+ enable: "✅Aktivigi aŭtomatan paĝo-turnadon",
+ tempActive: "Provizore aktiva",
+ toTop: "Reen al supro.",
+ toBottom: "Iri al malsupro.",
+ current: "Nuna paĝo.",
+ forceIframe: "Devigi kunigon de la sekva paĝo",
+ cancelForceIframe: "Nuligi devigitan kunigon",
+ configure: "Agordi Pagetual",
+ firstUpdate: "Klaku ĉi tie por pravalorizi la defaŭltan regul-liston",
+ update: "Ĝisdatigi retajn regulojn",
+ click2update: "Klaku por ĝisdatigi regulojn el URL nun",
+ loadNow: "Ŝargi la sekvan aŭtomate",
+ loadConfirm: "Kiom da paĝoj vi volas ŝargi? (0 signifas senfine)",
+ noNext: "Neniu sekva ligilo trovita, bonvolu krei novan regulon",
+ passSec: "Ĝisdatigita antaŭ #t# sekundoj",
+ passMin: "Ĝisdatigita antaŭ #t# minutoj",
+ passHour: "Ĝisdatigita antaŭ #t# horoj",
+ passDay: "Ĝisdatigita antaŭ #t# tagoj",
+ cantDel: "Ne eblas forigi enkonstruitajn regulojn",
+ confirmDel: "Ĉu vi certas, ke vi volas forigi ĉi tiun regulon?",
+ updateSucc: "Ĝisdatigo sukcesis",
+ beginUpdate: "Komencante ĝisdatigon, bonvolu atendi momenton",
+ customUrls: "Importi regulan URL de Pagetual aŭ AutoPagerize, unu URL po linio.",
+ customRules: "Enigu proprajn regulojn. ✍️Kontribui regulojn",
+ save: "Konservi",
+ loadingText: "Ŝargante...",
+ opacity: "Opakeco",
+ opacityPlaceholder: "0: kaŝi apartigilon",
+ hideBar: "Kaŝi la paĝrangan apartigilon",
+ hideBarButNoStop: "Kaŝi sed ne haltigi",
+ dbClick2Stop: "Duoble-klaku sur la malplena spaco por paŭzi",
+ sortTitle: "Ordigo efektiviĝas post la sekva ĝisdatigo de reguloj",
+ autoRun: "Aŭtomata aktivigo (nigra listo reĝimo)",
+ autoLoadNum: "Kvanto por antaŭŝargitaj paĝoj",
+ turnRate: "Turnu la sekvan paĝon kiam ĝi estas malpli ol 【X】 fojojn la paĝa alteco de la piedlinio",
+ inputPageNum: "Enigu paĝan numeron por salti",
+ enableHistory: "Skribi foliumhistorion post paĝo-turnado",
+ enableHistoryAfterInsert: "Skribi foliumhistorion tuj post kunigo, alie skribi post foliumado",
+ contentVisibility: "Aŭtomate baskuligi enhavan videblecon por plibonigi bildigan rendimenton",
+ initRun: "Turni paĝojn tuj post malfermo",
+ preload: "Antaŭŝargi la sekvan paĝon por rapidigi",
+ click2ImportRule: "Klaku por importi bazan regulan ligilon, kaj poste atendu ĝis la ĝisdatigo finiĝos: ",
+ forceAllBody: "Kunigi la plenan korpon de la paĝo?",
+ openInNewTab: "Malfermi URL-ojn de aldonoj en nova langeto",
+ importSucc: "Importado finiĝis",
+ import: "Importi",
+ editCurrent: "Redakti regulon por la nuna retejo",
+ editBlacklist: "Redakti la nigran liston de URL-oj, unu enigo po linio, subtenas [?,*] ĵokerojn.",
+ upBtnImg: "Ikono por reen al supro",
+ downBtnImg: "Ikono por iri al piedlinio",
+ sideControllerIcon: "Ikono de flanka stango",
+ loadingTextTitle: "Ŝargante",
+ dbClick2StopCtrl: "Klavo Ctrl",
+ dbClick2StopAlt: "Klavo Alt",
+ dbClick2StopShift: "Klavo Shift",
+ dbClick2StopMeta: "Klavo Meta",
+ dbClick2StopKey: "Fulmoklavo",
+ pageElementCss: "Propra stilo por ĉefaj paĝaj elementoj",
+ customCss: "Propra kompleta CSS",
+ firstAlert: "Vi ne importis la bazan regulon, bonvolu elekti la taŭgan regulon por importi",
+ picker: "Pagetual elementa elektilo",
+ closePicker: "Fermi la elektilon de Pagetual",
+ pickerPlaceholder: "Elementa elektilo (Nur por spertaj uzantoj, alie lasu malplena)",
+ pickerCheck: "Kontroli elektilon kaj kopii",
+ switchSelector: "Klaku por ŝanĝi elementon",
+ gotoEdit: "Iri al redakto de regulo kun la nuna elektilo",
+ manualMode: "Malŝalti kunigon, permane antaŭeniri al la sekva paĝo per la dekstra sagoklavo (aŭ sendi eventon 'pagetual.next')",
+ clickMode: "Malŝalti kunigon, aŭtomate alklaki la sekvan paĝon rulumante ĝis la fino de la paĝo",
+ pageBarMenu: "Klaku la centron de la paĝa stango por malfermi la elektilan menuon",
+ nextSwitch: "Ŝanĝi la sekvan ligilon",
+ arrowToScroll: "Premu la maldekstran sagon por rulumigi reen kaj la dekstran sagon por antaŭeniri paĝon",
+ sideController: "Montri la paĝrangan kontrolstangon en la flanka stango",
+ sideControllerScroll: "Rulumiga baskulo",
+ sideControllerAlways: "Ĉiam montri",
+ hideLoadingIcon: "Kaŝi ŝargan animacion",
+ hideBarArrow: "Kaŝi sagon por la paĝa stango",
+ duplicate: "Duplikata Pagetual estis instalita, kontrolu vian skript-administrilon!",
+ forceStateIframe: "Enigi plenan paĝon kiel iframe",
+ forceStateDynamic: "Ŝargi dinamikan enhavon per iframe",
+ forceStateDisable: "Malŝalti paĝo-turnadon en ĉi tiu retejo",
+ autoScrollRate: "Rulumrapido (1~1000)",
+ disableAutoScroll: "Haltigi Aŭtomatan Rulumadon",
+ enableAutoScroll: "Aktivigi Aŭtomatan Rulumadon",
+ toggleAutoScroll: "Baskuligi Aŭtomatan Rulumadon",
+ ruleRequest: "Regula Peto",
+ page: "Paĝo ",
+ prevPage: "Antaŭa paĝo",
+ nextPage: "Sekva paĝo",
+ errorRulesMustBeArray: "Reguloj devas esti tabelo!",
+ errorJson: "JSON-eraro, Rekontrolu!",
+ editSuccess: "Sukcese redaktita",
+ errorWrongUrl: "Malĝusta URL, Rekontrolu!",
+ errorAlreadyExists: "Regulo jam ekzistas!",
+ settingsSaved: "La agordoj estas konservitaj, refreŝigu por vidi",
+ iframe: "Devigita disigo per iframe",
+ dynamic: "Dinamika ŝargado",
+ reloadPage: "Redakto finiĝis, ĉu reŝargi nun?",
+ copied: "Kopiita",
+ noValidContent: "Neniu valida enhavo detektita, Captcha eble ĉeestas",
+ outOfDate: "La skripto estas malmoderna, bonvolu ĝisdatigi al la plej nova versio.",
+ hideBarTips: "Kaŝi la paĝrangan stangon, baskuligi imersivan sperton",
+ setConfigPage: "Agordi la nunan paĝon kiel la defaŭltan agordan paĝon",
+ wedata2github: "Ŝanĝi la wedata-adreson al la spegula adreso en la github-deponejo",
+ addOtherProp: "Aldoni regulajn ecojn",
+ addNextSelector: "Aldoni elektilan enhavon kiel nextLink",
+ addPageSelector: "Aldoni elektilan enhavon kiel pageElement",
+ propName: "Enigu regulan econan nomon",
+ propValue: "Enigu regulan econan valoron",
+ customFirst: "Ignori kaŝmemoron por lokaj propraj reguloj",
+ rulesExample: "Regula Ekzemplo",
+ lastPage: "Atingis la lastan paĝon",
+ lastPageTips: "Montri konsilojn atinginte la lastan paĝon"
+ }
+ },
+ {
+ name: "Български",
+ match: ["bg"],
+ lang: {
+ enableDebug: "Активиране на изход за отстраняване на грешки в конзолата",
+ updateNotification: "Известие след актуализиране на правилата",
+ disable: "Временно деактивиране",
+ disableSite: "Превключване на деактивирано състояние",
+ disableSiteTips: "Деактивирано на този сайт.",
+ enableSiteTips: "Активирано на този сайт.",
+ enable: "✅Активиране на автоматично прелистване на страници",
+ tempActive: "Временно активно",
+ toTop: "Обратно горе.",
+ toBottom: "Към дъното.",
+ current: "Текуща страница.",
+ forceIframe: "Принудително присъединяване към следващата страница",
+ cancelForceIframe: "Отказ от принудително присъединяване",
+ configure: "Конфигуриране на Pagetual",
+ firstUpdate: "Щракнете тук, за да инициализирате списъка с правила по подразбиране",
+ update: "Актуализиране на онлайн правилата",
+ click2update: "Щракнете, за да актуализирате правилата от URL сега",
+ loadNow: "Зареждане на следващото автоматично",
+ loadConfirm: "Колко страници искате да заредите? (0 означава безкрайност)",
+ noNext: "Няма намерена следваща връзка, моля, създайте ново правило",
+ passSec: "Актуализирано преди #t# секунди",
+ passMin: "Актуализирано преди #t# минути",
+ passHour: "Актуализирано преди #t# часа",
+ passDay: "Актуализирано преди #t# дни",
+ cantDel: "Не могат да се изтриват вградени правила",
+ confirmDel: "Сигурни ли сте, че искате да изтриете това правило?",
+ updateSucc: "Актуализацията е успешна",
+ beginUpdate: "Започва актуализация, моля, изчакайте малко",
+ customUrls: "Импортиране на URL на правило Pagetual или AutoPagerize, един URL на ред.",
+ customRules: "Въведете персонализирани правила. ✍️Допринесете с правила",
+ save: "Запазване",
+ loadingText: "Зареждане...",
+ opacity: "Непрозрачност",
+ opacityPlaceholder: "0: скриване на разделителя",
+ hideBar: "Скриване на разделителя за пагинация",
+ hideBarButNoStop: "Скриване, но не спиране",
+ dbClick2Stop: "Двоен клик върху празното пространство за пауза",
+ sortTitle: "Сортирането влиза в сила след следващата актуализация на правилата",
+ autoRun: "Автоматично активиране (режим на черен списък)",
+ autoLoadNum: "Количество за предварително заредени страници",
+ turnRate: "Превъртете на следващата страница, когато е на по-малко от 【X】 пъти височината на страницата от долния колонтитул",
+ inputPageNum: "Въведете номер на страница за прескачане",
+ enableHistory: "Записване на историята на сърфиране след прелистване на страница",
+ enableHistoryAfterInsert: "Записване на историята на сърфиране веднага след снаждане, в противен случай записване след сърфиране",
+ contentVisibility: "Автоматично превключване на видимостта на съдържанието за подобряване на производителността на изобразяване",
+ initRun: "Превъртане на страници веднага след отваряне",
+ preload: "Предварително зареждане на следващата страница за ускоряване",
+ click2ImportRule: "Щракнете, за да импортирате връзката към основните правила, и след това изчакайте, докато актуализацията приключи: ",
+ forceAllBody: "Присъединяване на цялото тяло на страницата?",
+ openInNewTab: "Отваряне на URL адресите на допълненията в нов раздел",
+ importSucc: "Импортирането е завършено",
+ import: "Импортиране",
+ editCurrent: "Редактиране на правило за текущия уебсайт",
+ editBlacklist: "Редактирайте черния списък с URL адреси, един запис на ред, поддържа заместващи символи [?,*].",
+ upBtnImg: "Икона за връщане горе",
+ downBtnImg: "Икона за преминаване към долния колонтитул",
+ sideControllerIcon: "Икона на страничната лента",
+ loadingTextTitle: "Зареждане",
+ dbClick2StopCtrl: "Клавиш Ctrl",
+ dbClick2StopAlt: "Клавиш Alt",
+ dbClick2StopShift: "Клавиш Shift",
+ dbClick2StopMeta: "Клавиш Meta",
+ dbClick2StopKey: "Клавишна комбинация",
+ pageElementCss: "Персонализиран стил за основните елементи на страницата",
+ customCss: "Персонализиран пълен CSS",
+ firstAlert: "Не сте импортирали основното правило, моля, изберете подходящото правило за импортиране",
+ picker: "Избор на елементи на Pagetual",
+ closePicker: "Затваряне на избора на Pagetual",
+ pickerPlaceholder: "Избор на елементи (Само за напреднали потребители, в противен случай оставете празно)",
+ pickerCheck: "Проверка на селектора и копиране",
+ switchSelector: "Щракнете, за да превключите елемент",
+ gotoEdit: "Отидете на редактиране на правило с текущия селектор",
+ manualMode: "Деактивиране на снаждането, ръчно преминаване към следващата страница с помощта на десния клавиш със стрелка (или изпращане на събитие 'pagetual.next')",
+ clickMode: "Деактивиране на снаждането, автоматично щракване върху следващата страница при превъртане до края на страницата",
+ pageBarMenu: "Щракнете в центъра на лентата на страницата, за да отворите менюто за избор",
+ nextSwitch: "Превключване на следваща връзка",
+ arrowToScroll: "Натиснете лявата стрелка, за да превъртите назад, и дясната стрелка, за да преминете напред",
+ sideController: "Показване на контролната лента за пагинация в страничната лента",
+ sideControllerScroll: "Превключване на превъртането",
+ sideControllerAlways: "Винаги показване",
+ hideLoadingIcon: "Скриване на анимацията за зареждане",
+ hideBarArrow: "Скриване на стрелката за лентата на страницата",
+ duplicate: "Инсталиран е дубликат на Pagetual, проверете вашия мениджър на скриптове!",
+ forceStateIframe: "Вграждане на цялата страница като iframe",
+ forceStateDynamic: "Зареждане на динамично съдържание чрез iframe",
+ forceStateDisable: "Деактивиране на прелистването на страници на този сайт",
+ autoScrollRate: "Скорост на превъртане (1-1000)",
+ disableAutoScroll: "Спиране на автоматичното превъртане",
+ enableAutoScroll: "Активиране на автоматичното превъртане",
+ toggleAutoScroll: "Превключване на автоматичното превъртане",
+ ruleRequest: "Искане за правило",
+ page: "Страница ",
+ prevPage: "Предишна страница",
+ nextPage: "Следваща страница",
+ errorRulesMustBeArray: "Правилата трябва да са масив!",
+ errorJson: "Грешка в JSON, проверете отново!",
+ editSuccess: "Редактирането е успешно",
+ errorWrongUrl: "Грешен URL, проверете отново!",
+ errorAlreadyExists: "Правило вече съществува!",
+ settingsSaved: "Настройките са запазени, опреснете, за да видите",
+ iframe: "Принудително разделяне от iframe",
+ dynamic: "Динамично зареждане",
+ reloadPage: "Редактирането е завършено, презареждане сега?",
+ copied: "Копирано",
+ noValidContent: "Не е открито валидно съдържание, може да има Captcha",
+ outOfDate: "Скриптът е остарял, моля, актуализирайте до най-новата версия.",
+ hideBarTips: "Скрийте лентата за пагинация, превключете поглъщащото изживяване",
+ setConfigPage: "Задайте текущата страница като страница за конфигурация по подразбиране",
+ wedata2github: "Променете адреса на wedata на огледалния адрес в хранилището на github",
+ addOtherProp: "Добавяне на свойства на правилото",
+ addNextSelector: "Добавяне на съдържание на селектора като nextLink",
+ addPageSelector: "Добавяне на съдържание на селектора като pageElement",
+ propName: "Въведете име на свойството на правилото",
+ propValue: "Въведете стойност на свойството на правилото",
+ customFirst: "Игнориране на кеша за локални персонализирани правила",
+ rulesExample: "Пример за правила",
+ lastPage: "Достигната е последната страница",
+ lastPageTips: "Показване на съвети при достигане на последната страница"
+ }
+ },
+ {
+ name: "Čeština",
+ match: ["cs"],
+ lang: {
+ enableDebug: "Povolit výstup ladění do konzole",
+ updateNotification: "Oznámení po aktualizaci pravidel",
+ disable: "Dočasně zakázat",
+ disableSite: "Přepnout stav zakázání",
+ disableSiteTips: "Na této stránce zakázáno.",
+ enableSiteTips: "Na této stránce povoleno.",
+ enable: "✅Povolit automatické otáčení stránek",
+ tempActive: "Dočasně aktivní",
+ toTop: "Zpět nahoru.",
+ toBottom: "Jít dolů.",
+ current: "Aktuální stránka.",
+ forceIframe: "Vynutit připojení k další stránce",
+ cancelForceIframe: "Zrušit vynucené připojení",
+ configure: "Konfigurovat Pagetual",
+ firstUpdate: "Klikněte sem pro inicializaci výchozího seznamu pravidel",
+ update: "Aktualizovat online pravidla",
+ click2update: "Klikněte pro aktualizaci pravidel z URL nyní",
+ loadNow: "Načíst další automaticky",
+ loadConfirm: "Kolik stránek chcete načíst? (0 znamená nekonečno)",
+ noNext: "Nenalezen žádný další odkaz, vytvořte nové pravidlo",
+ passSec: "Aktualizováno před #t# sekundami",
+ passMin: "Aktualizováno před #t# minutami",
+ passHour: "Aktualizováno před #t# hodinami",
+ passDay: "Aktualizováno před #t# dny",
+ cantDel: "Nelze odstranit vestavěná pravidla",
+ confirmDel: "Jste si jisti, že chcete toto pravidlo odstranit?",
+ updateSucc: "Aktualizace úspěšná",
+ beginUpdate: "Zahajuje se aktualizace, chvíli prosím počkejte",
+ customUrls: "Importovat URL pravidla Pagetual nebo AutoPagerize, jedno URL na řádek.",
+ customRules: "Zadejte vlastní pravidla. ✍️Přispějte pravidly",
+ save: "Uložit",
+ loadingText: "Načítání...",
+ opacity: "Neprůhlednost",
+ opacityPlaceholder: "0: skrýt oddělovač",
+ hideBar: "Skrýt oddělovač stránkování",
+ hideBarButNoStop: "Skrýt, ale nezastavit",
+ dbClick2Stop: "Dvojitým kliknutím na prázdné místo pozastavíte",
+ sortTitle: "Třídění se projeví po další aktualizaci pravidel",
+ autoRun: "Automatické povolení (režim černé listiny)",
+ autoLoadNum: "Množství pro přednačtené stránky",
+ turnRate: "Otočte na další stránku, když je méně než 【X】 násobek výšky stránky od zápatí",
+ inputPageNum: "Zadejte číslo stránky pro skok",
+ enableHistory: "Zapsat historii procházení po otočení stránky",
+ enableHistoryAfterInsert: "Zapsat historii procházení ihned po spojení, jinak zapsat po procházení",
+ contentVisibility: "Automaticky přepínat viditelnost obsahu pro zlepšení výkonu vykreslování",
+ initRun: "Otočit stránky ihned po otevření",
+ preload: "Přednačíst další stránku pro zrychlení",
+ click2ImportRule: "Klikněte pro import odkazu na základní pravidla a poté počkejte, dokud se aktualizace nedokončí: ",
+ forceAllBody: "Připojit celé tělo stránky?",
+ openInNewTab: "Otevřít URL adres přídavků v nové kartě",
+ importSucc: "Import dokončen",
+ import: "Importovat",
+ editCurrent: "Upravit pravidlo pro aktuální webovou stránku",
+ editBlacklist: "Upravit černou listinu URL, jeden záznam na řádek, podporuje zástupné znaky [?,*].",
+ upBtnImg: "Ikona zpět nahoru",
+ downBtnImg: "Ikona jít do zápatí",
+ sideControllerIcon: "Ikona bočního panelu",
+ loadingTextTitle: "Načítání",
+ dbClick2StopCtrl: "Klávesa Ctrl",
+ dbClick2StopAlt: "Klávesa Alt",
+ dbClick2StopShift: "Klávesa Shift",
+ dbClick2StopMeta: "Klávesa Meta",
+ dbClick2StopKey: "Klávesová zkratka",
+ pageElementCss: "Vlastní styl pro hlavní prvky stránky",
+ customCss: "Vlastní kompletní CSS",
+ firstAlert: "Neimportovali jste základní pravidlo, vyberte prosím vhodné pravidlo k importu",
+ picker: "Výběr prvků Pagetual",
+ closePicker: "Zavřít výběr Pagetual",
+ pickerPlaceholder: "Výběr prvků (Pouze pro pokročilé uživatele, jinak nechte prázdné)",
+ pickerCheck: "Zkontrolovat výběr a kopírovat",
+ switchSelector: "Kliknutím přepnete prvek",
+ gotoEdit: "Přejít na úpravu pravidla s aktuálním výběrem",
+ manualMode: "Zakázat spojování, ručně přejít na další stránku pomocí klávesy se šipkou doprava (nebo odeslat událost 'pagetual.next')",
+ clickMode: "Zakázat spojování, automaticky kliknout na další stránku při posunutí na konec stránky",
+ pageBarMenu: "Kliknutím na střed lišty stránky otevřete menu výběru",
+ nextSwitch: "Přepnout další odkaz",
+ arrowToScroll: "Stisknutím levé šipky se posunete zpět a pravou šipkou přejdete na stránku",
+ sideController: "Zobrazit ovládací panel stránkování v bočním panelu",
+ sideControllerScroll: "Přepnout posouvání",
+ sideControllerAlways: "Vždy zobrazit",
+ hideLoadingIcon: "Skrýt animaci načítání",
+ hideBarArrow: "Skrýt šipku pro lištu stránky",
+ duplicate: "Duplicitní Pagetual byl nainstalován, zkontrolujte svůj správce skriptů!",
+ forceStateIframe: "Vložit celou stránku jako iframe",
+ forceStateDynamic: "Načíst dynamický obsah přes iframe",
+ forceStateDisable: "Zakázat otáčení stránek на této stránce",
+ autoScrollRate: "Rychlost posouvání (1-1000)",
+ disableAutoScroll: "Zastavit automatické posouvání",
+ enableAutoScroll: "Povolit automatické posouvání",
+ toggleAutoScroll: "Přepnout automatické posouvání",
+ ruleRequest: "Žádost o pravidlo",
+ page: "Stránka ",
+ prevPage: "Předchozí stránka",
+ nextPage: "Další stránka",
+ errorRulesMustBeArray: "Pravidla musí být pole!",
+ errorJson: "Chyba JSON, zkontrolujte znovu!",
+ editSuccess: "Úspěšně upraveno",
+ errorWrongUrl: "Nesprávné URL, zkontrolujte znovu!",
+ errorAlreadyExists: "Pravidlo již existuje!",
+ settingsSaved: "Nastavení jsou uložena, obnovte pro zobrazení",
+ iframe: "Vynucené rozdělení pomocí iframe",
+ dynamic: "Dynamické načítání",
+ reloadPage: "Úprava dokončena, načíst znovu?",
+ copied: "Zkopírováno",
+ noValidContent: "Nebyl zjištěn žádný platný obsah, může být přítomna Captcha",
+ outOfDate: "Skript je zastaralý, aktualizujte prosím na nejnovější verzi.",
+ hideBarTips: "Skrýt lištu stránkování, přepnout pohlcující zážitek",
+ setConfigPage: "Nastavit aktuální stránku jako výchozí konfigurační stránku",
+ wedata2github: "Změnit adresu wedata na zrcadlovou adresu v repozitáři github",
+ addOtherProp: "Přidat vlastnosti pravidla",
+ addNextSelector: "Přidat obsah výběru jako nextLink",
+ addPageSelector: "Přidat obsah výběru jako pageElement",
+ propName: "Zadejte název vlastnosti pravidla",
+ propValue: "Zadejte hodnotu vlastnosti pravidla",
+ customFirst: "Ignorovat mezipaměť pro místní vlastní pravidla",
+ rulesExample: "Příklad pravidel",
+ lastPage: "Dosáhli jste poslední stránky",
+ lastPageTips: "Zobrazit tipy při dosažení poslední stránky"
+ }
+ },
+ {
+ name: "Tiếng Việt",
+ match: ["vi"],
+ lang: {
+ enableDebug: "Bật đầu ra gỡ lỗi vào bảng điều khiển",
+ updateNotification: "Thông báo sau khi cập nhật quy tắc",
+ disable: "Tạm thời vô hiệu hóa",
+ disableSite: "Chuyển đổi trạng thái vô hiệu hóa",
+ disableSiteTips: "Đã vô hiệu hóa trên trang này.",
+ enableSiteTips: "Đã bật trên trang này.",
+ enable: "✅Bật tự động chuyển trang",
+ tempActive: "Tạm thời hoạt động",
+ toTop: "Quay lại đầu trang.",
+ toBottom: "Đi đến cuối trang.",
+ current: "Trang hiện tại.",
+ forceIframe: "Buộc tham gia trang tiếp theo",
+ cancelForceIframe: "Hủy bỏ buộc tham gia",
+ configure: "Cấu hình Pagetual",
+ firstUpdate: "Nhấp vào đây để khởi tạo danh sách quy tắc mặc định",
+ update: "Cập nhật quy tắc trực tuyến",
+ click2update: "Nhấp để cập nhật quy tắc từ url ngay bây giờ",
+ loadNow: "Tải trang tiếp theo tự động",
+ loadConfirm: "Bạn muốn tải bao nhiêu trang? (0 có nghĩa là vô hạn)",
+ noNext: "Không tìm thấy liên kết tiếp theo, vui lòng tạo quy tắc mới",
+ passSec: "Đã cập nhật #t# giây trước",
+ passMin: "Đã cập nhật #t# phút trước",
+ passHour: "Đã cập nhật #t# giờ trước",
+ passDay: "Đã cập nhật #t# ngày trước",
+ cantDel: "Không thể xóa các quy tắc cài sẵn",
+ confirmDel: "Bạn có chắc chắn muốn xóa quy tắc này không?",
+ updateSucc: "Cập nhật thành công",
+ beginUpdate: "Bắt đầu cập nhật, vui lòng đợi một lát",
+ customUrls: "Nhập URL quy tắc Pagetual hoặc AutoPagerize, mỗi URL một dòng.",
+ customRules: "Nhập các quy tắc tùy chỉnh. ✍️Đóng góp quy tắc",
+ save: "Lưu",
+ loadingText: "Đang tải...",
+ opacity: "Độ mờ",
+ opacityPlaceholder: "0: ẩn dấu phân cách",
+ hideBar: "Ẩn dấu phân cách phân trang",
+ hideBarButNoStop: "Ẩn nhưng không dừng",
+ dbClick2Stop: "Nhấp đúp vào khoảng trống để tạm dừng",
+ sortTitle: "Việc sắp xếp có hiệu lực sau khi cập nhật quy tắc tiếp theo",
+ autoRun: "Tự động bật (chế độ danh sách đen)",
+ autoLoadNum: "Số lượng trang tải trước",
+ turnRate: "Chuyển sang trang tiếp theo khi còn cách chân trang chưa đến 【X】 lần chiều cao trang",
+ inputPageNum: "Nhập số trang để chuyển đến",
+ enableHistory: "Ghi lại lịch sử duyệt web sau khi chuyển trang",
+ enableHistoryAfterInsert: "Ghi lại lịch sử duyệt web ngay sau khi ghép nối, nếu không thì ghi lại sau khi duyệt",
+ contentVisibility: "Tự động chuyển đổi khả năng hiển thị nội dung để cải thiện hiệu suất hiển thị",
+ initRun: "Chuyển trang ngay sau khi mở",
+ preload: "Tải trước trang tiếp theo để tăng tốc",
+ click2ImportRule: "Nhấp để nhập liên kết quy tắc cơ sở, sau đó đợi cho đến khi cập nhật hoàn tất: ",
+ forceAllBody: "Tham gia toàn bộ nội dung của trang?",
+ openInNewTab: "Mở các url bổ sung trong tab mới",
+ importSucc: "Nhập hoàn tất",
+ import: "Nhập",
+ editCurrent: "Chỉnh sửa quy tắc cho trang web hiện tại",
+ editBlacklist: "Chỉnh sửa danh sách đen url, mỗi mục một dòng, hỗ trợ ký tự đại diện [?,*].",
+ upBtnImg: "Biểu tượng quay lại đầu trang",
+ downBtnImg: "Biểu tượng đi đến chân trang",
+ sideControllerIcon: "Biểu tượng của thanh bên",
+ loadingTextTitle: "Đang tải",
+ dbClick2StopCtrl: "Phím Ctrl",
+ dbClick2StopAlt: "Phím Alt",
+ dbClick2StopShift: "Phím Shift",
+ dbClick2StopMeta: "Phím Meta",
+ dbClick2StopKey: "Phím tắt",
+ pageElementCss: "Kiểu tùy chỉnh cho các phần tử trang chính",
+ customCss: "CSS hoàn chỉnh tùy chỉnh",
+ firstAlert: "Bạn chưa nhập quy tắc cơ sở, vui lòng chọn quy tắc thích hợp để nhập",
+ picker: "Bộ chọn phần tử Pagetual",
+ closePicker: "Đóng bộ chọn Pagetual",
+ pickerPlaceholder: "Bộ chọn phần tử (Chỉ dành cho người dùng nâng cao, nếu không thì để trống)",
+ pickerCheck: "Kiểm tra bộ chọn và sao chép",
+ switchSelector: "Nhấp để chuyển đổi phần tử",
+ gotoEdit: "Chuyển đến chỉnh sửa quy tắc với bộ chọn hiện tại",
+ manualMode: "Vô hiệu hóa việc ghép nối, chuyển đến trang tiếp theo theo cách thủ công bằng phím mũi tên phải (hoặc gửi sự kiện 'pagetual.next')",
+ clickMode: "Vô hiệu hóa việc ghép nối, tự động nhấp vào trang tiếp theo khi cuộn đến cuối trang",
+ pageBarMenu: "Nhấp vào giữa thanh trang để mở menu bộ chọn",
+ nextSwitch: "Chuyển đổi liên kết tiếp theo",
+ arrowToScroll: "Nhấn mũi tên trái để cuộn lại và mũi tên phải để chuyển trang",
+ sideController: "Hiển thị thanh điều khiển phân trang trong thanh bên",
+ sideControllerScroll: "Chuyển đổi cuộn",
+ sideControllerAlways: "Luôn hiển thị",
+ hideLoadingIcon: "Ẩn hoạt ảnh tải",
+ hideBarArrow: "Ẩn mũi tên cho thanh trang",
+ duplicate: "Pagetual trùng lặp đã được cài đặt, hãy kiểm tra trình quản lý tập lệnh của bạn!",
+ forceStateIframe: "Nhúng toàn bộ trang dưới dạng iframe",
+ forceStateDynamic: "Tải nội dung động qua iframe",
+ forceStateDisable: "Vô hiệu hóa việc chuyển trang trên trang này",
+ autoScrollRate: "Tốc độ cuộn (1~1000)",
+ disableAutoScroll: "Dừng cuộn tự động",
+ enableAutoScroll: "Bật cuộn tự động",
+ toggleAutoScroll: "Chuyển đổi cuộn tự động",
+ ruleRequest: "Yêu cầu quy tắc",
+ page: "Trang ",
+ prevPage: "Trang trước",
+ nextPage: "Trang tiếp theo",
+ errorRulesMustBeArray: "Quy tắc phải là một mảng!",
+ errorJson: "Lỗi JSON, hãy kiểm tra lại!",
+ editSuccess: "Chỉnh sửa thành công",
+ errorWrongUrl: "URL sai, hãy kiểm tra lại!",
+ errorAlreadyExists: "Một quy tắc đã tồn tại!",
+ settingsSaved: "Cài đặt đã được lưu, hãy làm mới để xem",
+ iframe: "Tách bắt buộc bằng iframe",
+ dynamic: "Tải động",
+ reloadPage: "Chỉnh sửa hoàn tất, tải lại ngay bây giờ?",
+ copied: "Đã sao chép",
+ noValidContent: "Không phát hiện thấy nội dung hợp lệ, có thể có Captcha",
+ outOfDate: "Tập lệnh đã lỗi thời, vui lòng cập nhật lên phiên bản mới nhất.",
+ hideBarTips: "Ẩn thanh phân trang, chuyển đổi trải nghiệm đắm chìm",
+ setConfigPage: "Đặt trang hiện tại làm trang cấu hình mặc định",
+ wedata2github: "Thay đổi địa chỉ wedata thành địa chỉ nhân bản trong kho lưu trữ github",
+ addOtherProp: "Thêm thuộc tính quy tắc",
+ addNextSelector: "Thêm nội dung bộ chọn làm nextLink",
+ addPageSelector: "Thêm nội dung bộ chọn làm pageElement",
+ propName: "Nhập tên thuộc tính quy tắc",
+ propValue: "Nhập giá trị thuộc tính quy tắc",
+ customFirst: "Bỏ qua bộ nhớ cache cho các quy tắc tùy chỉnh cục bộ",
+ rulesExample: "Ví dụ về quy tắc",
+ lastPage: "Đã đến trang cuối cùng",
+ lastPageTips: "Hiển thị mẹo khi đến trang cuối cùng"
+ }
+ },
+ {
+ name: "Polski",
+ match: ["pl"],
+ lang: {
+ enableDebug: "Włącz wyjście debugowania do konsoli",
+ updateNotification: "Powiadomienie po aktualizacji reguł",
+ disable: "Tymczasowo wyłącz",
+ disableSite: "Przełącz stan wyłączenia",
+ disableSiteTips: "Wyłączone na tej stronie.",
+ enableSiteTips: "Włączone na tej stronie.",
+ enable: "✅Włącz automatyczne przewracanie stron",
+ tempActive: "Tymczasowo aktywne",
+ toTop: "Powrót na górę.",
+ toBottom: "Przejdź na dół.",
+ current: "Bieżąca strona.",
+ forceIframe: "Wymuś dołączenie do następnej strony",
+ cancelForceIframe: "Anuluj wymuszone dołączenie",
+ configure: "Skonfiguruj Pagetual",
+ firstUpdate: "Kliknij tutaj, aby zainicjować domyślną listę reguł",
+ update: "Aktualizuj reguły online",
+ click2update: "Kliknij, aby zaktualizować reguły z adresu URL teraz",
+ loadNow: "Załaduj następną automatycznie",
+ loadConfirm: "Ile stron chcesz załadować? (0 oznacza nieskończoność)",
+ noNext: "Nie znaleziono następnego linku, utwórz nową regułę",
+ passSec: "Zaktualizowano #t# sekund temu",
+ passMin: "Zaktualizowano #t# minut temu",
+ passHour: "Zaktualizowano #t# godzin temu",
+ passDay: "Zaktualizowano #t# dni temu",
+ cantDel: "Nie można usunąć wbudowanych reguł",
+ confirmDel: "Czy na pewno chcesz usunąć tę regułę?",
+ updateSucc: "Aktualizacja zakończona powodzeniem",
+ beginUpdate: "Rozpoczynam aktualizację, proszę czekać",
+ customUrls: "Importuj adres URL reguły Pagetual lub AutoPagerize, jeden adres URL na linię.",
+ customRules: "Wprowadź niestandardowe reguły. ✍️Współtwórz reguły",
+ save: "Zapisz",
+ loadingText: "Ładowanie...",
+ opacity: "Przezroczystość",
+ opacityPlaceholder: "0: ukryj separator",
+ hideBar: "Ukryj separator paginacji",
+ hideBarButNoStop: "Ukryj, ale nie zatrzymuj",
+ dbClick2Stop: "Kliknij dwukrotnie w puste miejsce, aby wstrzymać",
+ sortTitle: "Sortowanie zacznie obowiązywać po następnej aktualizacji reguł",
+ autoRun: "Automatyczne włączanie (tryb czarnej listy)",
+ autoLoadNum: "Ilość stron do wstępnego załadowania",
+ turnRate: "Przewróć na następną stronę, gdy odległość od stopki jest mniejsza niż 【X】-krotność wysokości strony",
+ inputPageNum: "Wprowadź numer strony, aby przejść",
+ enableHistory: "Zapisuj historię przeglądania po przewróceniu strony",
+ enableHistoryAfterInsert: "Zapisuj historię przeglądania natychmiast po połączeniu, w przeciwnym razie zapisuj po przeglądaniu",
+ contentVisibility: "Automatycznie przełączaj widoczność zawartości, aby poprawić wydajność renderowania",
+ initRun: "Przewracaj strony natychmiast po otwarciu",
+ preload: "Wstępnie załaduj następną stronę, aby przyspieszyć",
+ click2ImportRule: "Kliknij, aby zaimportować link do podstawowych reguł, a następnie poczekaj na zakończenie aktualizacji: ",
+ forceAllBody: "Dołączyć całą treść strony?",
+ openInNewTab: "Otwórz adresy URL dodatków w nowej karcie",
+ importSucc: "Import zakończony",
+ import: "Importuj",
+ editCurrent: "Edytuj regułę dla bieżącej witryny",
+ editBlacklist: "Edytuj czarną listę adresów URL, jeden wpis na linię, obsługuje symbole wieloznaczne [?,*].",
+ upBtnImg: "Ikona powrotu na górę",
+ downBtnImg: "Ikona przejścia do stopki",
+ sideControllerIcon: "Ikona paska bocznego",
+ loadingTextTitle: "Ładowanie",
+ dbClick2StopCtrl: "Klawisz Ctrl",
+ dbClick2StopAlt: "Klawisz Alt",
+ dbClick2StopShift: "Klawisz Shift",
+ dbClick2StopMeta: "Klawisz Meta",
+ dbClick2StopKey: "Klawisz skrótu",
+ pageElementCss: "Niestandardowy styl dla głównych elementów strony",
+ customCss: "Niestandardowy kompletny CSS",
+ firstAlert: "Nie zaimportowałeś podstawowej reguły, wybierz odpowiednią regułę do zaimportowania",
+ picker: "Selektor elementów Pagetual",
+ closePicker: "Zamknij selektor Pagetual",
+ pickerPlaceholder: "Selektor elementów (Tylko dla zaawansowanych użytkowników, w przeciwnym razie pozostaw puste)",
+ pickerCheck: "Sprawdź selektor i skopiuj",
+ switchSelector: "Kliknij, aby przełączyć element",
+ gotoEdit: "Przejdź do edycji reguły z bieżącym selektorem",
+ manualMode: "Wyłącz łączenie, ręcznie przejdź do następnej strony za pomocą klawisza strzałki w prawo (lub wyślij zdarzenie 'pagetual.next')",
+ clickMode: "Wyłącz łączenie, automatycznie kliknij następną stronę po przewinięciu do końca strony",
+ pageBarMenu: "Kliknij środek paska strony, aby otworzyć menu selektora",
+ nextSwitch: "Przełącz następny link",
+ arrowToScroll: "Naciśnij lewą strzałkę, aby przewinąć do tyłu, a prawą strzałkę, aby przejść do przodu",
+ sideController: "Wyświetl pasek sterowania paginacją na pasku bocznym",
+ sideControllerScroll: "Przełączanie przewijania",
+ sideControllerAlways: "Zawsze pokazuj",
+ hideLoadingIcon: "Ukryj animację ładowania",
+ hideBarArrow: "Ukryj strzałkę paska strony",
+ duplicate: "Zainstalowano zduplikowany Pagetual, sprawdź menedżera skryptów!",
+ forceStateIframe: "Osadź całą stronę jako iframe",
+ forceStateDynamic: "Załaduj dynamiczną zawartość przez iframe",
+ forceStateDisable: "Wyłącz przewracanie stron na tej stronie",
+ autoScrollRate: "Prędkość przewijania (1-1000)",
+ disableAutoScroll: "Zatrzymaj automatyczne przewijanie",
+ enableAutoScroll: "Włącz automatyczne przewijanie",
+ toggleAutoScroll: "Przełącz automatyczne przewijanie",
+ ruleRequest: "Żądanie reguły",
+ page: "Strona ",
+ prevPage: "Poprzednia strona",
+ nextPage: "Następna strona",
+ errorRulesMustBeArray: "Reguły muszą być tablicą!",
+ errorJson: "Błąd JSON, sprawdź ponownie!",
+ editSuccess: "Edycja zakończona pomyślnie",
+ errorWrongUrl: "Błędny adres URL, sprawdź ponownie!",
+ errorAlreadyExists: "Reguła już istnieje!",
+ settingsSaved: "Ustawienia zostały zapisane, odśwież, aby zobaczyć",
+ iframe: "Wymuszony podział przez iframe",
+ dynamic: "Dynamiczne ładowanie",
+ reloadPage: "Edycja zakończona, przeładować teraz?",
+ copied: "Skopiowano",
+ noValidContent: "Nie wykryto prawidłowej zawartości, może być obecna Captcha",
+ outOfDate: "Skrypt jest przestarzały, zaktualizuj do najnowszej wersji.",
+ hideBarTips: "Ukryj pasek paginacji, przełącz na tryb immersyjny",
+ setConfigPage: "Ustaw bieżącą stronę jako domyślną stronę konfiguracji",
+ wedata2github: "Zmień adres wedata na adres lustrzany w repozytorium github",
+ addOtherProp: "Dodaj właściwości reguły",
+ addNextSelector: "Dodaj zawartość selektora jako nextLink",
+ addPageSelector: "Dodaj zawartość selektora jako pageElement",
+ propName: "Wprowadź nazwę właściwości reguły",
+ propValue: "Wprowadź wartość właściwości reguły",
+ customFirst: "Ignoruj pamięć podręczną dla lokalnych niestandardowych reguł",
+ rulesExample: "Przykład reguł",
+ lastPage: "Osiągnięto ostatnią stronę",
+ lastPageTips: "Pokaż wskazówki po osiągnięciu ostatniej strony"
+ }
+ },
+ {
+ name: "Українська",
+ match: ["uk"],
+ lang: {
+ enableDebug: "Увімкнути вивід налагодження в консоль",
+ updateNotification: "Сповіщення після оновлення правил",
+ disable: "Тимчасово вимкнути",
+ disableSite: "Перемкнути стан вимкнення",
+ disableSiteTips: "Вимкнено на цьому сайті.",
+ enableSiteTips: "Увімкнено на цьому сайті.",
+ enable: "✅Увімкнути автоматичне перегортання сторінок",
+ tempActive: "Тимчасово активний",
+ toTop: "Повернутися нагору.",
+ toBottom: "Перейти вниз.",
+ current: "Поточна сторінка.",
+ forceIframe: "Примусово приєднати наступну сторінку",
+ cancelForceIframe: "Скасувати примусове приєднання",
+ configure: "Налаштувати Pagetual",
+ firstUpdate: "Натисніть тут, щоб ініціалізувати стандартний список правил",
+ update: "Оновити онлайн-правила",
+ click2update: "Натисніть, щоб оновити правила з URL зараз",
+ loadNow: "Завантажити наступну автоматично",
+ loadConfirm: "Скільки сторінок ви хочете завантажити? (0 означає нескінченно)",
+ noNext: "Не знайдено наступного посилання, створіть нове правило",
+ passSec: "Оновлено #t# секунд тому",
+ passMin: "Оновлено #t# хвилин тому",
+ passHour: "Оновлено #t# годин тому",
+ passDay: "Оновлено #t# днів тому",
+ cantDel: "Неможливо видалити вбудовані правила",
+ confirmDel: "Ви впевнені, що хочете видалити це правило?",
+ updateSucc: "Оновлення успішне",
+ beginUpdate: "Починається оновлення, зачекайте хвилинку",
+ customUrls: "Імпортувати URL правила Pagetual або AutoPagerize, один URL на рядок.",
+ customRules: "Введіть власні правила. ✍️Додайте правила",
+ save: "Зберегти",
+ loadingText: "Завантаження...",
+ opacity: "Непрозорість",
+ opacityPlaceholder: "0: приховати роздільник",
+ hideBar: "Приховати роздільник пагінації",
+ hideBarButNoStop: "Приховати, але не зупиняти",
+ dbClick2Stop: "Двічі клацніть на порожньому місці, щоб призупинити",
+ sortTitle: "Сортування набуде чинності після наступного оновлення правил",
+ autoRun: "Автоматичне ввімкнення (режим чорного списку)",
+ autoLoadNum: "Кількість для попередньо завантажених сторінок",
+ turnRate: "Перегорніть на наступну сторінку, коли до нижнього колонтитула залишиться менше 【X】 висот сторінки",
+ inputPageNum: "Введіть номер сторінки для переходу",
+ enableHistory: "Записувати історію переглядів після перегортання сторінки",
+ enableHistoryAfterInsert: "Записувати історію переглядів одразу після з'єднання, інакше записувати після перегляду",
+ contentVisibility: "Автоматично перемикати видимість вмісту для покращення продуктивності рендерингу",
+ initRun: "Перегортати сторінки одразу після відкриття",
+ preload: "Попередньо завантажити наступну сторінку для прискорення",
+ click2ImportRule: "Натисніть, щоб імпортувати посилання на базові правила, а потім зачекайте, доки оновлення не завершиться: ",
+ forceAllBody: "Приєднати все тіло сторінки?",
+ openInNewTab: "Відкрити URL-адреси доповнень у новій вкладці",
+ importSucc: "Імпорт завершено",
+ import: "Імпортувати",
+ editCurrent: "Редагувати правило для поточного веб-сайту",
+ editBlacklist: "Редагувати чорний список URL-адрес, один запис на рядок, підтримує символи підстановки [?,*].",
+ upBtnImg: "Іконка повернення нагору",
+ downBtnImg: "Іконка переходу до нижнього колонтитула",
+ sideControllerIcon: "Іконка бічної панелі",
+ loadingTextTitle: "Завантаження",
+ dbClick2StopCtrl: "Клавіша Ctrl",
+ dbClick2StopAlt: "Клавіша Alt",
+ dbClick2StopShift: "Клавіша Shift",
+ dbClick2StopMeta: "Клавіша Meta",
+ dbClick2StopKey: "Клавіша швидкого доступу",
+ pageElementCss: "Власний стиль для основних елементів сторінки",
+ customCss: "Власний повний CSS",
+ firstAlert: "Ви не імпортували базове правило, будь ласка, виберіть відповідне правило для імпорту",
+ picker: "Вибір елементів Pagetual",
+ closePicker: "Закрити вибір Pagetual",
+ pickerPlaceholder: "Вибір елементів (Лише для досвідчених користувачів, інакше залиште порожнім)",
+ pickerCheck: "Перевірити селектор і скопіювати",
+ switchSelector: "Натисніть, щоб перемкнути елемент",
+ gotoEdit: "Перейти до редагування правила з поточним селектором",
+ manualMode: "Вимкнути з'єднання, вручну переходити на наступну сторінку за допомогою клавіші зі стрілкою вправо (або надіслати подію 'pagetual.next')",
+ clickMode: "Вимкнути з'єднання, автоматично клацати на наступну сторінку при прокручуванні до кінця сторінки",
+ pageBarMenu: "Натисніть на центр панелі сторінки, щоб відкрити меню вибору",
+ nextSwitch: "Перемкнути наступне посилання",
+ arrowToScroll: "Натисніть ліву стрілку, щоб прокрутити назад, і праву стрілку, щоб перейти на сторінку вперед",
+ sideController: "Відображати панель керування пагінацією в бічній панелі",
+ sideControllerScroll: "Перемикання прокрутки",
+ sideControllerAlways: "Завжди показувати",
+ hideLoadingIcon: "Приховати анімацію завантаження",
+ hideBarArrow: "Приховати стрілку для панелі сторінки",
+ duplicate: "Встановлено дублікат Pagetual, перевірте свій менеджер скриптів!",
+ forceStateIframe: "Вбудувати повну сторінку як iframe",
+ forceStateDynamic: "Завантажувати динамічний вміст через iframe",
+ forceStateDisable: "Вимкнути перегортання сторінок на цьому сайті",
+ autoScrollRate: "Швидкість прокрутки (1-1000)",
+ disableAutoScroll: "Зупинити автоматичну прокрутку",
+ enableAutoScroll: "Увімкнути автоматичну прокрутку",
+ toggleAutoScroll: "Перемкнути автоматичну прокрутку",
+ ruleRequest: "Запит на правило",
+ page: "Сторінка ",
+ prevPage: "Попередня сторінка",
+ nextPage: "Наступна сторінка",
+ errorRulesMustBeArray: "Правила повинні бути масивом!",
+ errorJson: "Помилка JSON, перевірте ще раз!",
+ editSuccess: "Відредаговано успішно",
+ errorWrongUrl: "Неправильна URL-адреса, перевірте ще раз!",
+ errorAlreadyExists: "Правило вже існує!",
+ settingsSaved: "Налаштування збережено, оновіть, щоб переглянути",
+ iframe: "Примусове розділення за допомогою iframe",
+ dynamic: "Динамічне завантаження",
+ reloadPage: "Редагування завершено, перезавантажити зараз?",
+ copied: "Скопійовано",
+ noValidContent: "Не виявлено дійсного вмісту, можливо, є Captcha",
+ outOfDate: "Скрипт застарів, оновіть до останньої версії.",
+ hideBarTips: "Приховати панель пагінації, перемкнути на захоплюючий досвід",
+ setConfigPage: "Встановити поточну сторінку як сторінку конфігурації за замовчуванням",
+ wedata2github: "Змінити адресу wedata на дзеркальну адресу в репозиторії github",
+ addOtherProp: "Додати властивості правила",
+ addNextSelector: "Додати вміст селектора як nextLink",
+ addPageSelector: "Додати вміст селектора як pageElement",
+ propName: "Введіть назву властивості правила",
+ propValue: "Введіть значення властивості правила",
+ customFirst: "Ігнорувати кеш для локальних власних правил",
+ rulesExample: "Приклад правил",
+ lastPage: "Досягнуто останньої сторінки",
+ lastPageTips: "Показувати поради при досягненні останньої сторінки"
+ }
+ },
+ {
+ name: "Türkçe",
+ match: ["tr"],
+ lang: {
+ enableDebug: "Konsola hata ayıklama çıktısını etkinleştir",
+ updateNotification: "Kurallar güncellendikten sonra bildirim",
+ disable: "Geçici olarak devre dışı bırak",
+ disableSite: "Devre dışı bırakma durumunu değiştir",
+ disableSiteTips: "Bu sitede devre dışı bırakıldı.",
+ enableSiteTips: "Bu sitede etkinleştirildi.",
+ enable: "✅Otomatik sayfa çevirmeyi etkinleştir",
+ tempActive: "Geçici olarak aktif",
+ toTop: "Başa dön.",
+ toBottom: "Sona git.",
+ current: "Mevcut sayfa.",
+ forceIframe: "Sonraki sayfaya katılmaya zorla",
+ cancelForceIframe: "Zorla katılmayı iptal et",
+ configure: "Pagetual'ı yapılandır",
+ firstUpdate: "Varsayılan kural listesini başlatmak için buraya tıklayın",
+ update: "Çevrimiçi kuralları güncelle",
+ click2update: "Kuralları şimdi URL'den güncellemek için tıkla",
+ loadNow: "Sonrakini otomatik olarak yükle",
+ loadConfirm: "Kaç sayfa yüklemek istiyorsunuz? (0 sonsuz demektir)",
+ noNext: "Sonraki bağlantı bulunamadı, lütfen yeni bir kural oluşturun",
+ passSec: "#t# saniye önce güncellendi",
+ passMin: "#t# dakika önce güncellendi",
+ passHour: "#t# saat önce güncellendi",
+ passDay: "#t# gün önce güncellendi",
+ cantDel: "Yerleşik kurallar silinemez",
+ confirmDel: "Bu kuralı silmek istediğinizden emin misiniz?",
+ updateSucc: "Güncelleme başarılı",
+ beginUpdate: "Güncelleme başlıyor, lütfen bir dakika bekleyin",
+ customUrls: "Pagetual veya AutoPagerize kural URL'sini içe aktarın, her satıra bir URL.",
+ customRules: "Özel kuralları girin. ✍️Kurallara katkıda bulunun",
+ save: "Kaydet",
+ loadingText: "Yükleniyor...",
+ opacity: "Opaklık",
+ opacityPlaceholder: "0: ayırıcıyı gizle",
+ hideBar: "Sayfalandırma ayırıcısını gizle",
+ hideBarButNoStop: "Gizle ama durdurma",
+ dbClick2Stop: "Duraklatmak için boş alana çift tıklayın",
+ sortTitle: "Sıralama bir sonraki kural güncellemesinden sonra etkili olur",
+ autoRun: "Otomatik etkinleştir (kara liste modu)",
+ autoLoadNum: "Önceden yüklenecek sayfa miktarı",
+ turnRate: "Altbilgiden sayfa yüksekliğinin 【X】 katından daha az olduğunda sonraki sayfaya geçin",
+ inputPageNum: "Atlamak için sayfa numarasını girin",
+ enableHistory: "Sayfa çevirdikten sonra tarama geçmişini yaz",
+ enableHistoryAfterInsert: "Birleştirmeden hemen sonra tarama geçmişini yaz, aksi takdirde taramadan sonra yaz",
+ contentVisibility: "Oluşturma performansını iyileştirmek için içerik görünürlüğünü otomatik olarak değiştir",
+ initRun: "Açtıktan hemen sonra sayfaları çevir",
+ preload: "Hızlandırmak için sonraki sayfayı önceden yükle",
+ click2ImportRule: "Temel kurallar bağlantısını içe aktarmak için tıklayın ve ardından güncelleme tamamlanana kadar bekleyin: ",
+ forceAllBody: "Sayfanın tam gövdesine katılsın mı?",
+ openInNewTab: "Eklerin URL'lerini yeni sekmede aç",
+ importSucc: "İçe aktarma tamamlandı",
+ import: "İçe aktar",
+ editCurrent: "Mevcut web sitesi için kuralı düzenle",
+ editBlacklist: "URL kara listesini düzenleyin, her satıra bir giriş, [?,*] joker karakterlerini destekler.",
+ upBtnImg: "Başa dön simgesi",
+ downBtnImg: "Altbilgiye git simgesi",
+ sideControllerIcon: "Kenar çubuğu simgesi",
+ loadingTextTitle: "Yükleniyor",
+ dbClick2StopCtrl: "Ctrl tuşu",
+ dbClick2StopAlt: "Alt tuşu",
+ dbClick2StopShift: "Shift tuşu",
+ dbClick2StopMeta: "Meta tuşu",
+ dbClick2StopKey: "Kısayol tuşu",
+ pageElementCss: "Ana sayfa öğeleri için özel stil",
+ customCss: "Özel tam CSS",
+ firstAlert: "Temel kuralı içe aktarmadınız, lütfen içe aktarmak için uygun kuralı seçin",
+ picker: "Pagetual öğe seçici",
+ closePicker: "Pagetual seçiciyi kapat",
+ pickerPlaceholder: "Öğe seçici (Yalnızca ileri düzey kullanıcılar, aksi takdirde boş bırakın)",
+ pickerCheck: "Seçiciyi kontrol et ve kopyala",
+ switchSelector: "Öğeyi değiştirmek için tıkla",
+ gotoEdit: "Mevcut seçiciyle kuralı düzenlemeye git",
+ manualMode: "Birleştirmeyi devre dışı bırak, sağ ok tuşunu kullanarak sonraki sayfaya manuel olarak ilerle (veya 'pagetual.next' olayını gönder)",
+ clickMode: "Birleştirmeyi devre dışı bırak, sayfanın sonuna kaydırıldığında sonraki sayfayı otomatik olarak tıkla",
+ pageBarMenu: "Seçici menüsünü açmak için sayfa çubuğunun ortasına tıklayın",
+ nextSwitch: "Sonraki bağlantıyı değiştir",
+ arrowToScroll: "Geri kaydırmak için sol oka, sayfayı ilerletmek için sağ oka basın",
+ sideController: "Sayfalandırma kontrol çubuğunu kenar çubuğunda göster",
+ sideControllerScroll: "Kaydırmayı değiştir",
+ sideControllerAlways: "Her zaman göster",
+ hideLoadingIcon: "Yükleme animasyonunu gizle",
+ hideBarArrow: "Sayfa çubuğu için oku gizle",
+ duplicate: "Yinelenen Pagetual yüklendi, komut dosyası yöneticinizi kontrol edin!",
+ forceStateIframe: "Tam sayfayı iframe olarak göm",
+ forceStateDynamic: "Dinamik içeriği iframe aracılığıyla yükle",
+ forceStateDisable: "Bu sitede sayfa çevirmeyi devre dışı bırak",
+ autoScrollRate: "Kaydırma hızı (1-1000)",
+ disableAutoScroll: "Otomatik Kaydırmayı Durdur",
+ enableAutoScroll: "Otomatik Kaydırmayı Etkinleştir",
+ toggleAutoScroll: "Otomatik Kaydırmayı Değiştir",
+ ruleRequest: "Kural İsteği",
+ page: "Sayfa ",
+ prevPage: "Önceki sayfa",
+ nextPage: "Sonraki sayfa",
+ errorRulesMustBeArray: "Kurallar bir Dizi olmalıdır!",
+ errorJson: "JSON hatası, Tekrar kontrol edin!",
+ editSuccess: "Başarıyla düzenlendi",
+ errorWrongUrl: "Yanlış URL, Tekrar kontrol edin!",
+ errorAlreadyExists: "Bir kural zaten var!",
+ settingsSaved: "Ayarlar kaydedildi, görüntülemek için yenileyin",
+ iframe: "Iframe tarafından zorla bölündü",
+ dynamic: "Dinamik yükleme",
+ reloadPage: "Düzenleme tamamlandı, şimdi yeniden yüklensin mi?",
+ copied: "Kopyalandı",
+ noValidContent: "Geçerli içerik algılanmadı, bir Captcha olabilir",
+ outOfDate: "Komut dosyası güncel değil, lütfen en son sürüme güncelleyin.",
+ hideBarTips: "Sayfalandırma çubuğunu gizle, sürükleyici deneyime geç",
+ setConfigPage: "Mevcut sayfayı varsayılan yapılandırma sayfası olarak ayarla",
+ wedata2github: "Wedata adresini github deposundaki ayna adresine değiştirin",
+ addOtherProp: "Kural özellikleri ekle",
+ addNextSelector: "Seçici içeriğini nextLink olarak ekle",
+ addPageSelector: "Seçici içeriğini pageElement olarak ekle",
+ propName: "Kural özelliği adını girin",
+ propValue: "Kural özelliği değerini girin",
+ customFirst: "Yerel özel kurallar için önbelleği yoksay",
+ rulesExample: "Kurallar Örneği",
+ lastPage: "Son sayfaya ulaşıldı",
+ lastPageTips: "Son sayfaya ulaşıldığında ipuçları göster"
+ }
+ },
+ {
+ name: "Nederlands",
+ match: ["nl"],
+ lang: {
+ enableDebug: "Foutopsporingsuitvoer naar console inschakelen",
+ updateNotification: "Melding nadat regels zijn bijgewerkt",
+ disable: "Tijdelijk uitschakelen",
+ disableSite: "Uitgeschakelde status omschakelen",
+ disableSiteTips: "Uitgeschakeld op deze site.",
+ enableSiteTips: "Ingeschakeld op deze site.",
+ enable: "✅Automatisch pagina's omslaan inschakelen",
+ tempActive: "Tijdelijk actief",
+ toTop: "Terug naar boven.",
+ toBottom: "Ga naar beneden.",
+ current: "Huidige pagina.",
+ forceIframe: "Dwingen om volgende pagina te koppelen",
+ cancelForceIframe: "Gedwongen koppeling annuleren",
+ configure: "Pagetual configureren",
+ firstUpdate: "Klik hier om de standaardregellijst te initialiseren",
+ update: "Online regels bijwerken",
+ click2update: "Klik om regels nu vanaf URL bij te werken",
+ loadNow: "Laad volgende automatisch",
+ loadConfirm: "Hoeveel pagina's wilt u laden? (0 betekent oneindig)",
+ noNext: "Geen volgende link gevonden, maak een nieuwe regel",
+ passSec: "#t# seconden geleden bijgewerkt",
+ passMin: "#t# minuten geleden bijgewerkt",
+ passHour: "#t# uur geleden bijgewerkt",
+ passDay: "#t# dagen geleden bijgewerkt",
+ cantDel: "Ingebouwde regels kunnen niet worden verwijderd",
+ confirmDel: "Weet u zeker dat u deze regel wilt verwijderen?",
+ updateSucc: "Update geslaagd",
+ beginUpdate: "Start update, een ogenblik geduld",
+ customUrls: "Importeer Pagetual of AutoPagerize regel-URL, één URL per regel.",
+ customRules: "Voer aangepaste regels in. ✍️Draag regels bij",
+ save: "Opslaan",
+ loadingText: "Laden...",
+ opacity: "Dekking",
+ opacityPlaceholder: "0: verberg scheidingsteken",
+ hideBar: "Verberg het pagineringsscheidingsteken",
+ hideBarButNoStop: "Verbergen maar niet stoppen",
+ dbClick2Stop: "Dubbelklik op de lege ruimte om te pauzeren",
+ sortTitle: "Sorteren wordt van kracht na de volgende regelupdate",
+ autoRun: "Automatisch inschakelen (zwarte lijst-modus)",
+ autoLoadNum: "Aantal voor vooraf geladen pagina's",
+ turnRate: "Sla de volgende pagina om wanneer deze minder dan 【X】 keer de paginahoogte van de voettekst is",
+ inputPageNum: "Voer paginanummer in om te springen",
+ enableHistory: "Schrijf browsegeschiedenis na het omslaan van de pagina",
+ enableHistoryAfterInsert: "Schrijf browsegeschiedenis onmiddellijk na het splitsen, anders schrijven na het browsen",
+ contentVisibility: "Schakel automatisch de zichtbaarheid van inhoud om de renderprestaties te verbeteren",
+ initRun: "Sla pagina's onmiddellijk na het openen om",
+ preload: "Laad de volgende pagina vooraf om te versnellen",
+ click2ImportRule: "Klik om de link met basisregels te importeren en wacht vervolgens tot de update is voltooid: ",
+ forceAllBody: "Volledige body van de pagina koppelen?",
+ openInNewTab: "Open URL's van toevoegingen in een nieuw tabblad",
+ importSucc: "Importeren voltooid",
+ import: "Importeren",
+ editCurrent: "Regel voor huidige website bewerken",
+ editBlacklist: "Bewerk de URL-zwarte lijst, één item per regel, ondersteunt [?,*] jokertekens.",
+ upBtnImg: "Pictogram terug naar boven",
+ downBtnImg: "Pictogram ga naar voettekst",
+ sideControllerIcon: "Pictogram zijbalk",
+ loadingTextTitle: "Laden",
+ dbClick2StopCtrl: "Ctrl-toets",
+ dbClick2StopAlt: "Alt-toets",
+ dbClick2StopShift: "Shift-toets",
+ dbClick2StopMeta: "Meta-toets",
+ dbClick2StopKey: "Sneltoets",
+ pageElementCss: "Aangepaste stijl voor hoofdpagina-elementen",
+ customCss: "Aangepaste volledige CSS",
+ firstAlert: "U heeft de basisregel niet geïmporteerd, selecteer de juiste regel om te importeren",
+ picker: "Pagetual-elementenkiezer",
+ closePicker: "Pagetual-kiezer sluiten",
+ pickerPlaceholder: "Elementenkiezer (Alleen voor gevorderde gebruikers, laat anders leeg)",
+ pickerCheck: "Controleer kiezer en kopieer",
+ switchSelector: "Klik om van element te wisselen",
+ gotoEdit: "Ga naar regel bewerken met huidige kiezer",
+ manualMode: "Schakel splitsen uit, ga handmatig naar de volgende pagina met de rechterpijltoets (of verstuur gebeurtenis 'pagetual.next')",
+ clickMode: "Schakel splitsen uit, klik automatisch op de volgende pagina bij het scrollen naar het einde van de pagina",
+ pageBarMenu: "Klik op het midden van de paginabalk om het kiezermenu te openen",
+ nextSwitch: "Wissel volgende link",
+ arrowToScroll: "Druk op de linkerpijl om terug te scrollen en op de rechterpijl om naar de volgende pagina te gaan",
+ sideController: "Toon de pagineringsbalk in de zijbalk",
+ sideControllerScroll: "Scroll-schakelaar",
+ sideControllerAlways: "Altijd tonen",
+ hideLoadingIcon: "Verberg laadanimatie",
+ hideBarArrow: "Verberg pijl voor paginabalk",
+ duplicate: "Dubbele Pagetual is geïnstalleerd, controleer uw scriptmanager!",
+ forceStateIframe: "Volledige pagina insluiten als iframe",
+ forceStateDynamic: "Laad dynamische inhoud via iframe",
+ forceStateDisable: "Schakel het omslaan van pagina's op deze site uit",
+ autoScrollRate: "Scrollsnelheid (1-1000)",
+ disableAutoScroll: "Stop automatisch scrollen",
+ enableAutoScroll: "Schakel automatisch scrollen in",
+ toggleAutoScroll: "Schakel automatisch scrollen om",
+ ruleRequest: "Regelverzoek",
+ page: "Pagina ",
+ prevPage: "Vorige pagina",
+ nextPage: "Volgende pagina",
+ errorRulesMustBeArray: "Regels moeten een array zijn!",
+ errorJson: "JSON-fout, controleer opnieuw!",
+ editSuccess: "Succesvol bewerkt",
+ errorWrongUrl: "Verkeerde URL, controleer opnieuw!",
+ errorAlreadyExists: "Er bestaat al een regel!",
+ settingsSaved: "De instellingen zijn opgeslagen, ververs om te bekijken",
+ iframe: "Gedwongen gesplitst door iframe",
+ dynamic: "Dynamisch laden",
+ reloadPage: "Bewerking voltooid, nu opnieuw laden?",
+ copied: "Gekopieerd",
+ noValidContent: "Geen geldige inhoud gedetecteerd, er is mogelijk een Captcha aanwezig",
+ outOfDate: "Het script is verouderd, update naar de nieuwste versie.",
+ hideBarTips: "Verberg de pagineringsbalk, schakel de meeslepende ervaring om",
+ setConfigPage: "Stel de huidige pagina in als de standaardconfiguratiepagina",
+ wedata2github: "Wijzig het wedata-adres in het spiegeladres in de github-repository",
+ addOtherProp: "Voeg regeleigenschappen toe",
+ addNextSelector: "Voeg kiezerinhoud toe als nextLink",
+ addPageSelector: "Voeg kiezerinhoud toe als pageElement",
+ propName: "Voer de naam van de regeleigenschap in",
+ propValue: "Voer de waarde van de regeleigenschap in",
+ customFirst: "Cache negeren voor lokale aangepaste regels",
+ rulesExample: "Voorbeeld van regels",
+ lastPage: "Laatste pagina bereikt",
+ lastPageTips: "Toon tips bij het bereiken van de laatste pagina"
+ }
+ },
+ {
+ name: "Dansk",
+ match: ["da"],
+ lang: {
+ enableDebug: "Aktivér fejlfindingsoutput til konsollen",
+ updateNotification: "Meddelelse efter opdatering af regler",
+ disable: "Deaktiver midlertidigt",
+ disableSite: "Skift deaktiveret tilstand",
+ disableSiteTips: "Deaktiveret på dette websted.",
+ enableSiteTips: "Aktiveret på dette websted.",
+ enable: "✅Aktivér automatisk sidevending",
+ tempActive: "Midlertidigt aktiv",
+ toTop: "Tilbage til toppen.",
+ toBottom: "Gå til bunden.",
+ current: "Nuværende side.",
+ forceIframe: "Tving tilslutning til næste side",
+ cancelForceIframe: "Annuller tvungen tilslutning",
+ configure: "Konfigurer Pagetual",
+ firstUpdate: "Klik her for at initialisere standardregellisten",
+ update: "Opdater onlineregler",
+ click2update: "Klik for at opdatere regler fra URL nu",
+ loadNow: "Indlæs næste automatisk",
+ loadConfirm: "Hvor mange sider vil du indlæse? (0 betyder uendelig)",
+ noNext: "Intet næste link fundet, opret en ny regel",
+ passSec: "Opdateret for #t# sekunder siden",
+ passMin: "Opdateret for #t# minutter siden",
+ passHour: "Opdateret for #t# timer siden",
+ passDay: "Opdateret for #t# dage siden",
+ cantDel: "Kan ikke slette indbyggede regler",
+ confirmDel: "Er du sikker på, at du vil slette denne regel?",
+ updateSucc: "Opdatering lykkedes",
+ beginUpdate: "Starter opdatering, vent venligst et øjeblik",
+ customUrls: "Importer Pagetual- eller AutoPagerize-regel-URL, én URL pr. linje.",
+ customRules: "Indtast brugerdefinerede regler. ✍️Bidrag med regler",
+ save: "Gem",
+ loadingText: "Indlæser...",
+ opacity: "Opacitet",
+ opacityPlaceholder: "0: skjul afstandsstykke",
+ hideBar: "Skjul pagineringsafstandsstykket",
+ hideBarButNoStop: "Skjul, men stop ikke",
+ dbClick2Stop: "Dobbeltklik på det tomme rum for at sætte på pause",
+ sortTitle: "Sortering træder i kraft efter næste regelopdatering",
+ autoRun: "Automatisk aktivering (sortlistetilstand)",
+ autoLoadNum: "Antal for forudindlæste sider",
+ turnRate: "Vend til næste side, når den er mindre end 【X】 gange sidehøjden fra sidefoden",
+ inputPageNum: "Indtast sidetal for at hoppe",
+ enableHistory: "Skriv browserhistorik efter sidevending",
+ enableHistoryAfterInsert: "Skriv browserhistorik umiddelbart efter splejsning, ellers skriv efter browsing",
+ contentVisibility: "Skift automatisk indholdssynlighed for at forbedre gengivelsesydelsen",
+ initRun: "Vend sider umiddelbart efter åbning",
+ preload: "Forudindlæs næste side for at fremskynde",
+ click2ImportRule: "Klik for at importere link til grundregler, og vent derefter, indtil opdateringen er fuldført: ",
+ forceAllBody: "Tilslut hele sidens krop?",
+ openInNewTab: "Åbn URL'er for tilføjelser i ny fane",
+ importSucc: "Import fuldført",
+ import: "Importer",
+ editCurrent: "Rediger regel for nuværende websted",
+ editBlacklist: "Rediger URL-sortlisten, én post pr. linje, understøtter [?,*] jokertegn.",
+ upBtnImg: "Ikon for tilbage til toppen",
+ downBtnImg: "Ikon for at gå til sidefod",
+ sideControllerIcon: "Sidebjælkeikon",
+ loadingTextTitle: "Indlæser",
+ dbClick2StopCtrl: "Ctrl-tast",
+ dbClick2StopAlt: "Alt-tast",
+ dbClick2StopShift: "Shift-tast",
+ dbClick2StopMeta: "Meta-tast",
+ dbClick2StopKey: "Genvejstast",
+ pageElementCss: "Brugerdefineret stil for hovedsideelementer",
+ customCss: "Brugerdefineret komplet CSS",
+ firstAlert: "Du har ikke importeret grundreglen, vælg den relevante regel at importere",
+ picker: "Pagetual-elementvælger",
+ closePicker: "Luk Pagetual-vælger",
+ pickerPlaceholder: "Elementvælger (Kun avancerede brugere, ellers lad være tomt)",
+ pickerCheck: "Kontroller vælger og kopier",
+ switchSelector: "Klik for at skifte element",
+ gotoEdit: "Gå til redigeringsregel med nuværende vælger",
+ manualMode: "Deaktiver splejsning, gå manuelt frem til næste side ved hjælp af højre piletast (eller send hændelsen 'pagetual.next')",
+ clickMode: "Deaktiver splejsning, klik automatisk på næste side, når du ruller til slutningen af siden",
+ pageBarMenu: "Klik på midten af sidebjælken for at åbne vælgermenuen",
+ nextSwitch: "Skift næste link",
+ arrowToScroll: "Tryk på venstre pil for at rulle tilbage og højre pil for at gå frem en side",
+ sideController: "Vis pagineringskontrolbjælken i sidebjælken",
+ sideControllerScroll: "Rul-skift",
+ sideControllerAlways: "Vis altid",
+ hideLoadingIcon: "Skjul indlæsningsanimation",
+ hideBarArrow: "Skjul pil for sidebjælke",
+ duplicate: "Duplikat Pagetual er blevet installeret, tjek din scriptmanager!",
+ forceStateIframe: "Integrer hele siden som en iframe",
+ forceStateDynamic: "Indlæs dynamisk indhold via iframe",
+ forceStateDisable: "Deaktiver sidevending på dette websted",
+ autoScrollRate: "Rullehastighed (1-1000)",
+ disableAutoScroll: "Stop automatisk rulning",
+ enableAutoScroll: "Aktivér automatisk rulning",
+ toggleAutoScroll: "Skift automatisk rulning",
+ ruleRequest: "Regelanmodning",
+ page: "Side ",
+ prevPage: "Forrige side",
+ nextPage: "Næste side",
+ errorRulesMustBeArray: "Regler skal være en matrix!",
+ errorJson: "JSON-fejl, tjek igen!",
+ editSuccess: "Redigering lykkedes",
+ errorWrongUrl: "Forkert URL, tjek igen!",
+ errorAlreadyExists: "En regel eksisterer allerede!",
+ settingsSaved: "Indstillingerne er gemt, opdater for at se",
+ iframe: "Tvunget opdelt af iframe",
+ dynamic: "Dynamisk indlæsning",
+ reloadPage: "Redigering fuldført, genindlæs nu?",
+ copied: "Kopieret",
+ noValidContent: "Intet gyldigt indhold fundet, en Captcha kan være til stede",
+ outOfDate: "Scriptet er forældet, opdater venligst til den nyeste version.",
+ hideBarTips: "Skjul pagineringsbjælken, skift til en fordybende oplevelse",
+ setConfigPage: "Indstil den aktuelle side som standardkonfigurationsside",
+ wedata2github: "Skift wedata-adressen til spejladressen i github-depotet",
+ addOtherProp: "Tilføj regelegenskaber",
+ addNextSelector: "Tilføj vælgerindhold som nextLink",
+ addPageSelector: "Tilføj vælgerindhold som pageElement",
+ propName: "Indtast regelegenskabsnavn",
+ propValue: "Indtast regelegenskabsværdi",
+ customFirst: "Ignorer cache for lokale brugerdefinerede regler",
+ rulesExample: "Regeleksempel",
+ lastPage: "Nåede den sidste side",
+ lastPageTips: "Vis tips, når du når den sidste side"
+ }
+ },
+ {
+ name: "Français (Canada)",
+ match: ["fr-CA"],
+ lang: {
+ enableDebug: "Activer la sortie de débogage dans la console",
+ updateNotification: "Notification après la mise à jour des règles",
+ disable: "Désactiver temporairement",
+ disableSite: "Basculer l'état de désactivation",
+ disableSiteTips: "Désactivé sur ce site.",
+ enableSiteTips: "Activé sur ce site.",
+ enable: "✅Activer le changement de page automatique",
+ tempActive: "Temporairement actif",
+ toTop: "Retour en haut.",
+ toBottom: "Aller en bas.",
+ current: "Page actuelle.",
+ forceIframe: "Forcer la jonction de la page suivante",
+ cancelForceIframe: "Annuler la jonction forcée",
+ configure: "Configurer Pagetual",
+ firstUpdate: "Cliquez ici pour initialiser la liste de règles par défaut",
+ update: "Mettre à jour les règles en ligne",
+ click2update: "Cliquez pour mettre à jour les règles depuis l'URL maintenant",
+ loadNow: "Charger la suite automatiquement",
+ loadConfirm: "Combien de pages voulez-vous charger ? (0 pour infini)",
+ noNext: "Aucun lien suivant trouvé, veuillez créer une nouvelle règle",
+ passSec: "Mis à jour il y a #t# secondes",
+ passMin: "Mis à jour il y a #t# minutes",
+ passHour: "Mis à jour il y a #t# heures",
+ passDay: "Mis à jour il y a #t# jours",
+ cantDel: "Impossible de supprimer les règles intégrées",
+ confirmDel: "Êtes-vous sûr de vouloir supprimer cette règle ?",
+ updateSucc: "Mise à jour réussie",
+ beginUpdate: "Début de la mise à jour, veuillez patienter",
+ customUrls: "Importer l'URL des règles Pagetual ou AutoPagerize, une URL par ligne.",
+ customRules: "Saisir des règles personnalisées. ✍️Contribuer aux règles",
+ save: "Enregistrer",
+ loadingText: "Chargement en cours...",
+ opacity: "Opacité",
+ opacityPlaceholder: "0 : masquer le séparateur",
+ hideBar: "Masquer le séparateur de pagination",
+ hideBarButNoStop: "Masquer mais ne pas arrêter",
+ dbClick2Stop: "Double-cliquez sur l'espace vide pour mettre en pause",
+ sortTitle: "Le tri prendra effet après la prochaine mise à jour des règles",
+ autoRun: "Activation automatique (mode liste noire)",
+ autoLoadNum: "Nombre de pages à précharger",
+ turnRate: "Passer à la page suivante lorsqu'elle est à moins de 【X】 fois la hauteur de la page du pied de page",
+ inputPageNum: "Entrez le numéro de page pour y accéder",
+ enableHistory: "Inscrire l'historique de navigation après le changement de page",
+ enableHistoryAfterInsert: "Inscrire l'historique de navigation immédiatement après la jonction, sinon après la navigation",
+ contentVisibility: "Basculer automatiquement content-visibility pour améliorer les performances de rendu",
+ initRun: "Changer de page immédiatement après l'ouverture",
+ preload: "Précharger la page suivante pour accélérer",
+ click2ImportRule: "Cliquez pour importer le lien des règles de base, puis attendez la fin de la mise à jour : ",
+ forceAllBody: "Joindre le corps complet de la page ?",
+ openInNewTab: "Ouvrir les URL ajoutées dans un nouvel onglet",
+ importSucc: "Importation terminée",
+ import: "Importer",
+ editCurrent: "Modifier la règle pour le site actuel",
+ editBlacklist: "Modifier la liste noire d'URL, une entrée par ligne, supporte les jokers [?,*].",
+ upBtnImg: "Icône de retour en haut",
+ downBtnImg: "Icône d'aller en bas de page",
+ sideControllerIcon: "Icône de la barre latérale",
+ loadingTextTitle: "Chargement",
+ dbClick2StopCtrl: "Touche Ctrl",
+ dbClick2StopAlt: "Touche Alt",
+ dbClick2StopShift: "Touche Maj",
+ dbClick2StopMeta: "Touche Méta",
+ dbClick2StopKey: "Touche de raccourci",
+ pageElementCss: "Style personnalisé pour les éléments principaux de la page",
+ customCss: "CSS complet personnalisé",
+ firstAlert: "Vous n'avez pas importé la règle de base, veuillez sélectionner la règle appropriée à importer",
+ picker: "Sélecteur d'éléments Pagetual",
+ closePicker: "Fermer le sélecteur Pagetual",
+ pickerPlaceholder: "Sélecteur d'élément (Utilisateurs avancés seulement, laissez vide sinon)",
+ pickerCheck: "Vérifier le sélecteur et copier",
+ switchSelector: "Cliquez pour changer d'élément",
+ gotoEdit: "Aller à l'édition de la règle avec le sélecteur actuel",
+ manualMode: "Désactiver la jonction, avancer manuellement à la page suivante avec la flèche droite (ou envoyer l'événement 'pagetual.next')",
+ clickMode: "Désactiver la jonction, cliquer automatiquement sur la page suivante en faisant défiler jusqu'à la fin de la page",
+ pageBarMenu: "Cliquez au centre de la barre de page pour ouvrir le menu du sélecteur",
+ nextSwitch: "Changer de lien suivant",
+ arrowToScroll: "Appuyez sur la flèche gauche pour revenir en arrière et la flèche droite pour avancer",
+ sideController: "Afficher la barre de contrôle de pagination dans la barre latérale",
+ sideControllerScroll: "Afficher au défilement",
+ sideControllerAlways: "Toujours afficher",
+ hideLoadingIcon: "Masquer l'animation de chargement",
+ hideBarArrow: "Masquer les flèches de la barre de page",
+ duplicate: "Un doublon de Pagetual a été installé, vérifiez votre gestionnaire de scripts !",
+ forceStateIframe: "Intégrer la page complète en tant qu'iframe",
+ forceStateDynamic: "Charger le contenu dynamique via iframe",
+ forceStateDisable: "Désactiver le changement de page sur ce site",
+ autoScrollRate: "Vitesse de défilement (1~1000)",
+ disableAutoScroll: "Arrêter le défilement auto",
+ enableAutoScroll: "Activer le défilement auto",
+ toggleAutoScroll: "Basculer le défilement auto",
+ ruleRequest: "Demande de règle",
+ page: "Page ",
+ prevPage: "Page préc.",
+ nextPage: "Page suiv.",
+ errorRulesMustBeArray: "Les règles doivent être un tableau (Array) !",
+ errorJson: "Erreur JSON, veuillez vérifier !",
+ editSuccess: "Modification réussie",
+ errorWrongUrl: "URL incorrecte, veuillez vérifier !",
+ errorAlreadyExists: "Une règle existe déjà !",
+ settingsSaved: "Les paramètres sont enregistrés, actualisez pour voir les changements",
+ iframe: "Division forcée par iframe",
+ dynamic: "Chargement dynamique",
+ reloadPage: "Modification terminée, recharger maintenant ?",
+ copied: "Copié",
+ noValidContent: "Aucun contenu valide détecté, un Captcha peut être présent",
+ outOfDate: "Le script est obsolète, veuillez mettre à jour vers la dernière version.",
+ hideBarTips: "Masquer la barre de pagination, basculer l'expérience immersive",
+ setConfigPage: "Définir la page actuelle comme page de configuration par défaut",
+ wedata2github: "Changer l'adresse wedata pour l'adresse miroir dans le dépôt github",
+ addOtherProp: "Ajouter des propriétés à la règle",
+ addNextSelector: "Ajouter le contenu du sélecteur comme nextLink",
+ addPageSelector: "Ajouter le contenu du sélecteur comme pageElement",
+ propName: "Entrez le nom de la propriété de la règle",
+ propValue: "Entrez la valeur de la propriété de la règle",
+ customFirst: "Ignorer le cache pour les règles personnalisées locales",
+ rulesExample: "Exemple de règles",
+ lastPage: "Dernière page atteinte",
+ lastPageTips: "Afficher une notification en atteignant la dernière page"
+ }
+ },
+ {
+ name: "Bahasa Indonesia",
+ match: ["id"],
+ lang: {
+ enableDebug: "Aktifkan output debug ke konsol",
+ updateNotification: "Notifikasi setelah aturan diperbarui",
+ disable: "Nonaktifkan sementara",
+ disableSite: "Ubah status nonaktif",
+ disableSiteTips: "Dinonaktifkan di situs ini.",
+ enableSiteTips: "Diaktifkan di situs ini.",
+ enable: "✅Aktifkan pembalik halaman otomatis",
+ tempActive: "Aktif sementara",
+ toTop: "Kembali ke Atas.",
+ toBottom: "Pergi ke Bawah.",
+ current: "Halaman Saat Ini.",
+ forceIframe: "Paksa untuk menggabungkan halaman berikutnya",
+ cancelForceIframe: "Batalkan penggabungan paksa",
+ configure: "Konfigurasi Pagetual",
+ firstUpdate: "Klik di sini untuk menginisialisasi daftar aturan default",
+ update: "Perbarui aturan online",
+ click2update: "Klik untuk memperbarui aturan dari URL sekarang",
+ loadNow: "Muat berikutnya secara otomatis",
+ loadConfirm: "Berapa halaman yang ingin Anda muat? (0 berarti tak terbatas)",
+ noNext: "Tautan berikutnya tidak ditemukan, harap buat aturan baru",
+ passSec: "Diperbarui #t# detik yang lalu",
+ passMin: "Diperbarui #t# menit yang lalu",
+ passHour: "Diperbarui #t# jam yang lalu",
+ passDay: "Diperbarui #t# hari yang lalu",
+ cantDel: "Tidak dapat menghapus aturan bawaan",
+ confirmDel: "Apakah Anda yakin ingin menghapus aturan ini?",
+ updateSucc: "Pembaruan berhasil",
+ beginUpdate: "Memulai pembaruan, harap tunggu sebentar",
+ customUrls: "Impor URL aturan Pagetual atau AutoPagerize, satu URL per baris.",
+ customRules: "Masukkan aturan khusus. ✍️Kontribusi aturan",
+ save: "Simpan",
+ loadingText: "Sedang Memuat...",
+ opacity: "Opasitas",
+ opacityPlaceholder: "0: sembunyikan pemisah",
+ hideBar: "Sembunyikan pemisah paginasi",
+ hideBarButNoStop: "Sembunyikan tapi jangan hentikan",
+ dbClick2Stop: "Klik dua kali pada ruang kosong untuk menjeda",
+ sortTitle: "Pengurutan berlaku setelah pembaruan aturan berikutnya",
+ autoRun: "Aktifkan otomatis (mode daftar hitam)",
+ autoLoadNum: "Jumlah halaman pramuat",
+ turnRate: "Buka halaman berikutnya saat jarak dari footer kurang dari 【X】 kali tinggi halaman",
+ inputPageNum: "Masukkan nomor halaman untuk melompat",
+ enableHistory: "Tulis riwayat penjelajahan setelah membalik halaman",
+ enableHistoryAfterInsert: "Tulis riwayat penjelajahan segera setelah penyambungan, jika tidak, tulis setelah menjelajah",
+ contentVisibility: "Secara otomatis mengganti content-visibility untuk meningkatkan kinerja rendering",
+ initRun: "Balik halaman segera setelah dibuka",
+ preload: "Pramuat halaman berikutnya untuk mempercepat",
+ click2ImportRule: "Klik untuk mengimpor tautan aturan dasar, lalu tunggu hingga pembaruan selesai: ",
+ forceAllBody: "Gabungkan seluruh badan halaman?",
+ openInNewTab: "Buka URL tambahan di tab baru",
+ importSucc: "Impor selesai",
+ import: "Impor",
+ editCurrent: "Edit aturan untuk situs web saat ini",
+ editBlacklist: "Edit daftar hitam URL, satu entri per baris, Mendukung wildcard [?,*].",
+ upBtnImg: "Ikon kembali ke atas",
+ downBtnImg: "Ikon pergi ke footer",
+ sideControllerIcon: "Ikon bilah sisi",
+ loadingTextTitle: "Memuat",
+ dbClick2StopCtrl: "Tombol Ctrl",
+ dbClick2StopAlt: "Tombol Alt",
+ dbClick2StopShift: "Tombol Shift",
+ dbClick2StopMeta: "Tombol Meta",
+ dbClick2StopKey: "Tombol pintas",
+ pageElementCss: "Gaya kustom untuk elemen halaman utama",
+ customCss: "CSS kustom lengkap",
+ firstAlert: "Anda belum mengimpor aturan dasar, silakan pilih aturan yang sesuai untuk diimpor",
+ picker: "Pemilih elemen Pagetual",
+ closePicker: "Tutup pemilih Pagetual",
+ pickerPlaceholder: "Selektor elemen, (Hanya pengguna tingkat lanjut, biarkan kosong jika tidak)",
+ pickerCheck: "Periksa selektor dan salin",
+ switchSelector: "Klik untuk mengganti elemen",
+ gotoEdit: "Pergi ke edit aturan dengan selektor saat ini",
+ manualMode: "Nonaktifkan penyambungan, maju ke halaman berikutnya secara manual menggunakan tombol panah kanan (atau kirim acara 'pagetual.next')",
+ clickMode: "Nonaktifkan penyambungan, klik halaman berikutnya secara otomatis saat menggulir ke akhir halaman",
+ pageBarMenu: "Klik tengah bilah halaman untuk membuka menu pemilih",
+ nextSwitch: "Ganti tautan berikutnya",
+ arrowToScroll: "Tekan panah kiri untuk menggulir ke belakang dan panah kanan untuk maju halaman",
+ sideController: "Tampilkan bilah kontrol paging di bilah sisi",
+ sideControllerScroll: "Tampilkan saat bergulir",
+ sideControllerAlways: "Selalu tampilkan",
+ hideLoadingIcon: "Sembunyikan animasi memuat",
+ hideBarArrow: "Sembunyikan panah untuk bilah halaman",
+ duplicate: "Pagetual duplikat telah diinstal, periksa manajer skrip Anda!",
+ forceStateIframe: "Sematkan halaman penuh sebagai iframe",
+ forceStateDynamic: "Muat konten dinamis melalui iframe",
+ forceStateDisable: "Nonaktifkan pembalik halaman di situs ini",
+ autoScrollRate: "Kecepatan gulir (1~1000)",
+ disableAutoScroll: "Hentikan Gulir Otomatis",
+ enableAutoScroll: "Aktifkan Gulir Otomatis",
+ toggleAutoScroll: "Ubah Gulir Otomatis",
+ ruleRequest: "Permintaan Aturan",
+ page: "Halaman ",
+ prevPage: "Halaman seb.",
+ nextPage: "Halaman ber.",
+ errorRulesMustBeArray: "Aturan harus berupa Array!",
+ errorJson: "Kesalahan JSON, Periksa lagi!",
+ editSuccess: "Berhasil diedit",
+ errorWrongUrl: "URL salah, Periksa lagi!",
+ errorAlreadyExists: "Aturan sudah ada!",
+ settingsSaved: "Pengaturan disimpan, segarkan untuk melihat",
+ iframe: "Pemisahan paksa oleh iframe",
+ dynamic: "Pemuatan dinamis",
+ reloadPage: "Pengeditan selesai, muat ulang sekarang?",
+ copied: "Disalin",
+ noValidContent: "Tidak ada konten valid yang terdeteksi, mungkin ada Captcha",
+ outOfDate: "Skrip sudah usang, harap perbarui ke versi terbaru.",
+ hideBarTips: "Sembunyikan bilah paginasi, alihkan pengalaman imersif",
+ setConfigPage: "Atur halaman saat ini sebagai halaman konfigurasi default",
+ wedata2github: "Ubah alamat wedata ke alamat cermin di repositori github",
+ addOtherProp: "Tambahkan properti aturan",
+ addNextSelector: "Tambahkan konten selektor sebagai nextLink",
+ addPageSelector: "Tambahkan konten selektor sebagai pageElement",
+ propName: "Masukkan nama properti aturan",
+ propValue: "Masukkan nilai properti aturan",
+ customFirst: "Abaikan cache untuk aturan kustom lokal",
+ rulesExample: "Contoh Aturan",
+ lastPage: "Telah mencapai halaman terakhir",
+ lastPageTips: "Tampilkan tip saat mencapai halaman terakhir"
+ }
+ },
+ {
+ // Traduzido por Thiago Ramos (thiagojramos@outlook.com).
+ name: "Português (Brasil)",
+ match: ["pt", "pt-BR", "pt-PT"],
+ lang: {
+ enableDebug: "Ativar log de depuração no console.",
+ updateNotification: "Notificar após a atualização das regras",
+ disable: "Desativar temporariamente.",
+ disableSite: "Rolagem infinita: Ativar / Desativar.",
+ disableSiteTips: "Desabilitado neste site.",
+ enableSiteTips: "Ativado neste site.",
+ enable: "✅Ativar rolagem automática de página.",
+ tempActive: "Temporariamente ativo",
+ toTop: "Voltar ao Topo.",
+ toBottom: "Ir para o Rodapé.",
+ current: "Página Atual.",
+ forceIframe: "Forçar inclusão da próxima página",
+ cancelForceIframe: "Cancelar Inclusão Forçada",
+ configure: "Configurar o Pagetual",
+ firstUpdate: "Clique aqui para inicializar a lista de regras padrão",
+ update: "Atualizar regras online",
+ click2update: "Clique para atualizar as regras da URL agora",
+ loadNow: "Carregar mais páginas automaticamente",
+ loadConfirm: "Quantas páginas você deseja carregar? (0 = infinitas)",
+ noNext: "Nenhum link para a próxima página encontrado. Crie uma nova regra.",
+ passSec: "Atualizado há #t# segundos",
+ passMin: "Atualizado há #t# minutos",
+ passHour: "Atualizado há #t# horas",
+ passDay: "Atualizado há #t# dias",
+ cantDel: "Não é possível excluir as regras internas",
+ confirmDel: "Tem certeza que deseja excluir esta regra?",
+ updateSucc: "Atualização concluída com sucesso",
+ beginUpdate: "Iniciando atualização. Aguarde um momento, por favor.",
+ customUrls: "Importar URLs de regras do Pagetual ou AutoPagerize, uma URL por linha.",
+ customRules: "Inserir regras personalizadas. ✍️Contribuir com regras",
+ save: "Salvar",
+ loadingText: "Carregando...",
+ opacity: "Opacidade",
+ opacityPlaceholder: "0: ocultar espaçador",
+ hideBar: "Ocultar o espaçador de paginação",
+ hideBarButNoStop: "Ocultar, mas não parar",
+ dbClick2Stop: "Clique duplo no espaço em branco para pausar",
+ sortTitle: "A classificação terá efeito após a próxima atualização da regra",
+ autoRun: "Ativar automaticamente (modo de lista negra)",
+ autoLoadNum: "Número de páginas para pré-carregar",
+ turnRate: "Mudar para a próxima página quando estiver a menos de 【X】 vezes a altura da página do rodapé",
+ inputPageNum: "Digite o número da página para pular",
+ enableHistory: "Gravar histórico de navegação após virar a página",
+ enableHistoryAfterInsert: "Gravar histórico de navegação imediatamente após a inclusão, caso contrário, gravar após a navegação",
+ contentVisibility: "Alternar automaticamente a visibilidade do conteúdo para melhorar o desempenho de renderização",
+ initRun: "Virar páginas imediatamente após a abertura",
+ preload: "Pré-carregar a próxima página para acelerar",
+ click2ImportRule: "Clique para importar o link com as regras básicas e aguarde até que a atualização seja concluída: ",
+ forceAllBody: "Incluir o corpo inteiro da página?",
+ openInNewTab: "Abrir URLs de adições em uma nova guia",
+ importSucc: "Importação concluída",
+ import: "Importar",
+ editCurrent: "Editar regra para o site atual.",
+ editBlacklist: "Editar a lista negra de URLs, uma entrada por linha, suporta curingas [?,*].",
+ upBtnImg: "Ícone de voltar ao topo",
+ downBtnImg: "Ícone de ir para o rodapé",
+ sideControllerIcon: "Ícone da barra lateral",
+ loadingTextTitle: "Carregando.",
+ dbClick2StopCtrl: "Tecla Ctrl",
+ dbClick2StopAlt: "Tecla Alt",
+ dbClick2StopShift: "Tecla Shift",
+ dbClick2StopMeta: "Tecla Meta",
+ dbClick2StopKey: "Tecla de Atalho",
+ pageElementCss: "Estilo CSS personalizado para os elementos da página principal",
+ customCss: "CSS completo personalizado",
+ firstAlert: "Você não importou a regra básica. Selecione a regra apropriada para importar.",
+ picker: "Seletor de elementos de página do Pagetual",
+ closePicker: "Fechar seletor do Pagetual",
+ pickerPlaceholder: "Seletor de elemento (apenas para usuários avançados, deixe em branco caso contrário)",
+ pickerCheck: "Verificar seletor e copiar",
+ switchSelector: "Clique para alternar o elemento",
+ gotoEdit: "Ir para editar regra com o seletor atual",
+ manualMode: "Desativar inclusão automática. Avançar manualmente para a próxima página usando a tecla de seta para a direita (ou enviar o evento 'pagetual.next')",
+ clickMode: "Desativar inclusão automática. Clicar automaticamente na próxima página ao rolar até o final da página",
+ pageBarMenu: "Clique no centro da barra de páginas para abrir o menu do seletor",
+ nextSwitch: "Alternar link 'próximo'",
+ arrowToScroll: "Pressione as setas para navegar: esquerda para voltar, direita para avançar página",
+ sideController: "Exibir a barra de controle de paginação na barra lateral",
+ sideControllerScroll: "Alternar rolagem",
+ sideControllerAlways: "Sempre mostrar",
+ hideLoadingIcon: "Ocultar animação de carregamento",
+ hideBarArrow: "Ocultar seta da barra de páginas",
+ duplicate: "Pagetual duplicado instalado! Verifique seu gerenciador de scripts.",
+ forceStateIframe: "Incorporar página inteira como iframe",
+ forceStateDynamic: "Carregar conteúdo dinâmico via iframe",
+ forceStateDisable: "Desativar rolagem de páginas neste site",
+ autoScrollRate: "Velocidade de rolagem (1 a 1000)",
+ disableAutoScroll: "Parar Rolagem Automática",
+ enableAutoScroll: "Ativar Rolagem Automática",
+ toggleAutoScroll: "Alternar Rolagem Automática",
+ ruleRequest: "Solicitar Regra",
+ page: "Página ",
+ prevPage: "Página anterior",
+ nextPage: "Próxima página",
+ errorRulesMustBeArray: "As regras devem ser um Array!",
+ errorJson: "Erro de JSON! Verifique novamente.",
+ editSuccess: "Edição feita com sucesso!",
+ errorWrongUrl: "URL incorreta! Verifique novamente.",
+ errorAlreadyExists: "Já existe uma regra!",
+ settingsSaved: "As configurações foram salvas. Atualize para visualizar.",
+ iframe: "Divisão forçada por iframe.",
+ dynamic: "Carregamento dinâmico.",
+ reloadPage: "Edição concluída. Deseja recarregar agora?",
+ copied: "Copiado",
+ noValidContent: "Nenhum conteúdo válido detectado. Um Captcha pode estar presente.",
+ outOfDate: "O script está desatualizado, atualize para a versão mais recente.",
+ hideBarTips: "Ocultar a barra de paginação, mudar para experiência imersiva",
+ setConfigPage: "Definir a página atual como a página de configuração padrão",
+ wedata2github: "Alterar o endereço do Wedata para o endereço espelho no repositório do GitHub",
+ addOtherProp: "Adicionar propriedades de regra",
+ addNextSelector: "Adicionar conteúdo do seletor como nextLink",
+ addPageSelector: "Adicionar conteúdo do seletor como pageElement",
+ propName: "Digite o nome da propriedade da regra",
+ propValue: "Digite o valor da propriedade da regra",
+ customFirst: "Ignorar cache para regras personalizadas locais",
+ rulesExample: "Exemplo de Regras",
+ lastPage: "Última página atingida",
+ lastPageTips: "Mostrar dicas ao atingir a última página"
+ }
+ },
+ {
+ name: "Français",
+ match: ["fr"],
+ lang: {
+ enableDebug: "Activer la sortie de débogage dans la console",
+ updateNotification: "Notification après la mise à jour des règles",
+ disable: "Désactiver temporairement",
+ disableSite: "Basculer l'état de désactivation",
+ disableSiteTips: "Désactivé sur ce site.",
+ enableSiteTips: "Activé sur ce site.",
+ enable: "✅Activer le changement de page automatique",
+ tempActive: "Temporairement actif",
+ toTop: "Retour en haut.",
+ toBottom: "Aller en bas.",
+ current: "Page actuelle.",
+ forceIframe: "Forcer la jonction de la page suivante",
+ cancelForceIframe: "Annuler la jonction forcée",
+ configure: "Configurer Pagetual",
+ firstUpdate: "Cliquez ici pour initialiser la liste de règles par défaut",
+ update: "Mettre à jour les règles en ligne",
+ click2update: "Cliquez pour mettre à jour les règles depuis l'URL maintenant",
+ loadNow: "Charger la suite automatiquement",
+ loadConfirm: "Combien de pages voulez-vous charger ? (0 pour infini)",
+ noNext: "Aucun lien suivant trouvé, veuillez créer une nouvelle règle",
+ passSec: "Mis à jour il y a #t# secondes",
+ passMin: "Mis à jour il y a #t# minutes",
+ passHour: "Mis à jour il y a #t# heures",
+ passDay: "Mis à jour il y a #t# jours",
+ cantDel: "Impossible de supprimer les règles intégrées",
+ confirmDel: "Êtes-vous sûr de vouloir supprimer cette règle ?",
+ updateSucc: "Mise à jour réussie",
+ beginUpdate: "Début de la mise à jour, veuillez patienter",
+ customUrls: "Importer l'URL des règles Pagetual ou AutoPagerize, une URL par ligne.",
+ customRules: "Saisir des règles personnalisées. ✍️Contribuer aux règles",
+ save: "Enregistrer",
+ loadingText: "Chargement en cours...",
+ opacity: "Opacité",
+ opacityPlaceholder: "0 : masquer le séparateur",
+ hideBar: "Masquer le séparateur de pagination",
+ hideBarButNoStop: "Masquer mais ne pas arrêter",
+ dbClick2Stop: "Double-cliquez sur l'espace vide pour mettre en pause",
+ sortTitle: "Le tri prendra effet après la prochaine mise à jour des règles",
+ autoRun: "Activation automatique (mode liste noire)",
+ autoLoadNum: "Nombre de pages à précharger",
+ turnRate: "Passer à la page suivante lorsqu'elle est à moins de 【X】 fois la hauteur de la page du pied de page",
+ inputPageNum: "Entrez le numéro de page pour y accéder",
+ enableHistory: "Inscrire l'historique de navigation après le changement de page",
+ enableHistoryAfterInsert: "Inscrire l'historique de navigation immédiatement après la jonction, sinon après la navigation",
+ contentVisibility: "Basculer automatiquement content-visibility pour améliorer les performances de rendu",
+ initRun: "Changer de page immédiatement après l'ouverture",
+ preload: "Précharger la page suivante pour accélérer",
+ click2ImportRule: "Cliquez pour importer le lien des règles de base, puis attendez la fin de la mise à jour : ",
+ forceAllBody: "Joindre le corps complet de la page ?",
+ openInNewTab: "Ouvrir les URL ajoutées dans un nouvel onglet",
+ importSucc: "Importation terminée",
+ import: "Importer",
+ editCurrent: "Modifier la règle pour le site actuel",
+ editBlacklist: "Modifier la liste noire d'URL, une entrée par ligne, supporte les jokers [?,*].",
+ upBtnImg: "Icône de retour en haut",
+ downBtnImg: "Icône d'aller en bas de page",
+ sideControllerIcon: "Icône de la barre latérale",
+ loadingTextTitle: "Chargement",
+ dbClick2StopCtrl: "Touche Ctrl",
+ dbClick2StopAlt: "Touche Alt",
+ dbClick2StopShift: "Touche Maj",
+ dbClick2StopMeta: "Touche Méta",
+ dbClick2StopKey: "Touche de raccourci",
+ pageElementCss: "Style personnalisé pour les éléments principaux de la page",
+ customCss: "CSS complet personnalisé",
+ firstAlert: "Vous n'avez pas importé la règle de base, veuillez sélectionner la règle appropriée à importer",
+ picker: "Sélecteur d'éléments Pagetual",
+ closePicker: "Fermer le sélecteur Pagetual",
+ pickerPlaceholder: "Sélecteur d'élément (Utilisateurs avancés seulement, laissez vide sinon)",
+ pickerCheck: "Vérifier le sélecteur et copier",
+ switchSelector: "Cliquez pour changer d'élément",
+ gotoEdit: "Aller à l'édition de la règle avec le sélecteur actuel",
+ manualMode: "Désactiver la jonction, avancer manuellement à la page suivante avec la flèche droite (ou envoyer l'événement 'pagetual.next')",
+ clickMode: "Désactiver la jonction, cliquer automatiquement sur la page suivante en faisant défiler jusqu'à la fin de la page",
+ pageBarMenu: "Cliquez au centre de la barre de page pour ouvrir le menu du sélecteur",
+ nextSwitch: "Changer de lien suivant",
+ arrowToScroll: "Appuyez sur la flèche gauche pour revenir en arrière et la flèche droite pour avancer",
+ sideController: "Afficher la barre de contrôle de pagination dans la barre latérale",
+ sideControllerScroll: "Afficher au défilement",
+ sideControllerAlways: "Toujours afficher",
+ hideLoadingIcon: "Masquer l'animation de chargement",
+ hideBarArrow: "Masquer les flèches de la barre de page",
+ duplicate: "Un doublon de Pagetual a été installé, vérifiez votre gestionnaire de scripts !",
+ forceStateIframe: "Intégrer la page complète en tant qu'iframe",
+ forceStateDynamic: "Charger le contenu dynamique via iframe",
+ forceStateDisable: "Désactiver le changement de page sur ce site",
+ autoScrollRate: "Vitesse de défilement (1~1000)",
+ disableAutoScroll: "Arrêter le défilement auto",
+ enableAutoScroll: "Activer le défilement auto",
+ toggleAutoScroll: "Basculer le défilement auto",
+ ruleRequest: "Demande de règle",
+ page: "Page ",
+ prevPage: "Page préc.",
+ nextPage: "Page suiv.",
+ errorRulesMustBeArray: "Les règles doivent être un tableau (Array) !",
+ errorJson: "Erreur JSON, veuillez vérifier !",
+ editSuccess: "Modification réussie",
+ errorWrongUrl: "URL incorrecte, veuillez vérifier !",
+ errorAlreadyExists: "Une règle existe déjà !",
+ settingsSaved: "Les paramètres sont enregistrés, actualisez pour voir les changements",
+ iframe: "Division forcée par iframe",
+ dynamic: "Chargement dynamique",
+ reloadPage: "Modification terminée, recharger maintenant ?",
+ copied: "Copié",
+ noValidContent: "Aucun contenu valide détecté, un Captcha peut être présent",
+ outOfDate: "Le script est obsolète, veuillez mettre à jour vers la dernière version.",
+ hideBarTips: "Masquer la barre de pagination, basculer l'expérience immersive",
+ setConfigPage: "Définir la page actuelle comme page de configuration par défaut",
+ wedata2github: "Changer l'adresse wedata pour l'adresse miroir dans le dépôt github",
+ addOtherProp: "Ajouter des propriétés à la règle",
+ addNextSelector: "Ajouter le contenu du sélecteur comme nextLink",
+ addPageSelector: "Ajouter le contenu du sélecteur comme pageElement",
+ propName: "Entrez le nom de la propriété de la règle",
+ propValue: "Entrez la valeur de la propriété de la règle",
+ customFirst: "Ignorer le cache pour les règles personnalisées locales",
+ rulesExample: "Exemple de règles",
+ lastPage: "Dernière page atteinte",
+ lastPageTips: "Afficher une notification en atteignant la dernière page"
+ }
+ },
+ {
+ name: "Italiano",
+ match: ["it"],
+ lang: {
+ enableDebug: "Abilita output di debug nella console",
+ updateNotification: "Notifica dopo l'aggiornamento delle regole",
+ disable: "Disabilita temporaneamente",
+ disableSite: "Attiva/disattiva lo stato di disabilitazione",
+ disableSiteTips: "Disabilitato su questo sito.",
+ enableSiteTips: "Abilitato su questo sito.",
+ enable: "✅Abilita il cambio pagina automatico",
+ tempActive: "Temporaneamente attivo",
+ toTop: "Torna in cima.",
+ toBottom: "Vai in fondo.",
+ current: "Pagina corrente.",
+ forceIframe: "Forza l'unione della pagina successiva",
+ cancelForceIframe: "Annulla unione forzata",
+ configure: "Configura Pagetual",
+ firstUpdate: "Clicca qui per inizializzare l'elenco delle regole predefinite",
+ update: "Aggiorna regole online",
+ click2update: "Clicca per aggiornare le regole dall'URL ora",
+ loadNow: "Carica la prossima automaticamente",
+ loadConfirm: "Quante pagine vuoi caricare? (0 significa infinite)",
+ noNext: "Nessun link 'successivo' trovato, crea una nuova regola",
+ passSec: "Aggiornato #t# secondi fa",
+ passMin: "Aggiornato #t# minuti fa",
+ passHour: "Aggiornato #t# ore fa",
+ passDay: "Aggiornato #t# giorni fa",
+ cantDel: "Impossibile eliminare le regole predefinite",
+ confirmDel: "Sei sicuro di voler eliminare questa regola?",
+ updateSucc: "Aggiornamento riuscito",
+ beginUpdate: "Inizio aggiornamento, attendere un momento prego",
+ customUrls: "Importa URL di regole Pagetual o AutoPagerize, un URL per riga.",
+ customRules: "Inserisci regole personalizzate. ✍️Contribuisci alle regole",
+ save: "Salva",
+ loadingText: "Caricamento in corso...",
+ opacity: "Opacità",
+ opacityPlaceholder: "0: nascondi separatore",
+ hideBar: "Nascondi il separatore di pagina",
+ hideBarButNoStop: "Nascondi ma non fermare",
+ dbClick2Stop: "Fai doppio clic sullo spazio vuoto per mettere in pausa",
+ sortTitle: "L'ordinamento avrà effetto dopo il prossimo aggiornamento delle regole",
+ autoRun: "Abilitazione automatica (modalità lista nera)",
+ autoLoadNum: "Numero di pagine da precaricare",
+ turnRate: "Gira alla pagina successiva quando la distanza dal fondo è inferiore a 【X】 volte l'altezza della pagina",
+ inputPageNum: "Inserisci il numero di pagina a cui saltare",
+ enableHistory: "Scrivi la cronologia di navigazione dopo aver girato pagina",
+ enableHistoryAfterInsert: "Scrivi la cronologia subito dopo l'unione, altrimenti dopo la navigazione",
+ contentVisibility: "Cambia automaticamente content-visibility per migliorare le prestazioni di rendering",
+ initRun: "Inizia a girare le pagine subito dopo l'apertura",
+ preload: "Precarica la pagina successiva per velocizzare",
+ click2ImportRule: "Clicca per importare il link delle regole di base, poi attendi il completamento dell'aggiornamento: ",
+ forceAllBody: "Unire l'intero corpo della pagina?",
+ openInNewTab: "Apri gli URL aggiunti in una nuova scheda",
+ importSucc: "Importazione completata",
+ import: "Importa",
+ editCurrent: "Modifica regola per il sito corrente",
+ editBlacklist: "Modifica la lista nera di URL, una voce per riga, supporta i caratteri jolly [?,*].",
+ upBtnImg: "Icona per tornare in cima",
+ downBtnImg: "Icona per andare in fondo",
+ sideControllerIcon: "Icona della barra laterale",
+ loadingTextTitle: "Caricamento",
+ dbClick2StopCtrl: "Tasto Ctrl",
+ dbClick2StopAlt: "Tasto Alt",
+ dbClick2StopShift: "Tasto Maiusc",
+ dbClick2StopMeta: "Tasto Meta",
+ dbClick2StopKey: "Tasto di scelta rapida",
+ pageElementCss: "Stile personalizzato per gli elementi principali della pagina",
+ customCss: "CSS completo personalizzato",
+ firstAlert: "Non hai importato la regola di base, seleziona la regola appropriata da importare",
+ picker: "Selettore di elementi Pagetual",
+ closePicker: "Chiudi selettore Pagetual",
+ pickerPlaceholder: "Selettore di elementi (Solo utenti esperti, altrimenti lasciare vuoto)",
+ pickerCheck: "Controlla selettore e copia",
+ switchSelector: "Clicca per cambiare elemento",
+ gotoEdit: "Vai alla modifica della regola con il selettore corrente",
+ manualMode: "Disabilita unione, avanza manualmente alla pagina successiva con la freccia destra (o invia l'evento 'pagetual.next')",
+ clickMode: "Disabilita unione, clicca automaticamente la pagina successiva scorrendo fino alla fine",
+ pageBarMenu: "Clicca al centro della barra di pagina per aprire il menu del selettore",
+ nextSwitch: "Cambia link successivo",
+ arrowToScroll: "Premi freccia sinistra per scorrere indietro e freccia destra per avanzare di pagina",
+ sideController: "Mostra la barra di controllo della paginazione nella barra laterale",
+ sideControllerScroll: "Mostra durante lo scorrimento",
+ sideControllerAlways: "Mostra sempre",
+ hideLoadingIcon: "Nascondi animazione di caricamento",
+ hideBarArrow: "Nascondi frecce della barra di pagina",
+ duplicate: "È stato installato un duplicato di Pagetual, controlla il tuo gestore di script!",
+ forceStateIframe: "Incorpora la pagina intera come iframe",
+ forceStateDynamic: "Carica contenuto dinamico tramite iframe",
+ forceStateDisable: "Disabilita il cambio pagina su questo sito",
+ autoScrollRate: "Velocità di scorrimento (1~1000)",
+ disableAutoScroll: "Ferma scorrimento automatico",
+ enableAutoScroll: "Abilita scorrimento automatico",
+ toggleAutoScroll: "Attiva/disattiva scorrimento automatico",
+ ruleRequest: "Richiesta regola",
+ page: "Pagina ",
+ prevPage: "Pagina prec.",
+ nextPage: "Pagina succ.",
+ errorRulesMustBeArray: "Le regole devono essere un Array!",
+ errorJson: "Errore JSON, controlla di nuovo!",
+ editSuccess: "Modificato con successo",
+ errorWrongUrl: "URL errato, controlla di nuovo!",
+ errorAlreadyExists: "Una regola esiste già!",
+ settingsSaved: "Le impostazioni sono state salvate, aggiorna per visualizzare",
+ iframe: "Divisione forzata tramite iframe",
+ dynamic: "Caricamento dinamico",
+ reloadPage: "Modifica completata, ricaricare ora?",
+ copied: "Copiato",
+ noValidContent: "Nessun contenuto valido rilevato, potrebbe esserci un Captcha",
+ outOfDate: "Lo script non è aggiornato, si prega di aggiornare all'ultima versione.",
+ hideBarTips: "Nascondi la barra di paginazione, attiva/disattiva l'esperienza immersiva",
+ setConfigPage: "Imposta la pagina corrente come pagina di configurazione predefinita",
+ wedata2github: "Cambia l'indirizzo wedata con l'indirizzo mirror nel repository github",
+ addOtherProp: "Aggiungi proprietà alla regola",
+ addNextSelector: "Aggiungi contenuto del selettore come nextLink",
+ addPageSelector: "Aggiungi contenuto del selettore come pageElement",
+ propName: "Inserisci il nome della proprietà della regola",
+ propValue: "Inserisci il valore della proprietà della regola",
+ customFirst: "Ignora la cache per le regole personalizzate locali",
+ rulesExample: "Esempio di regole",
+ lastPage: "Raggiunta l'ultima pagina",
+ lastPageTips: "Mostra un avviso quando si raggiunge l'ultima pagina"
+ }
+ },
+ {
+ // Translated by SrKalopsia (srkalopsia@gmail.com).
+ name: "Español",
+ match: ["es", "es-AR", "es-BO", "es-CL", "es-CO", "es-CR", "es-DO", "es-EC", "es-ES", "es-GT", "es-HN", "es-MX", "es-NI", "es-PA", "es-PE", "es-PR", "es-PY", "es-SV", "es-UY", "es-VE"],
+ lang: {
+ enableDebug: "Habilitar salida de depuración",
+ updateNotification: "Notificación después de actualizar las reglas",
+ disable: "Desactivar",
+ disableSite: "Alternar estado desactivado",
+ disableSiteTips: "Desactivado en este sitio",
+ enableSiteTips: "Activado en este sitio",
+ enable: "✅Habilitar",
+ tempActive: "Temporalmente activo",
+ toTop: "Ir al inicio",
+ toBottom: "Ir al final",
+ current: "Página actual",
+ forceIframe: "Forzar para unirse a la siguiente página",
+ cancelForceIframe: "Cancelar unión forzada",
+ configure: "Configurar",
+ firstUpdate: "Haga clic aquí para inicializar las reglas",
+ update: "Actualizar reglas en línea",
+ click2update: "Haga clic para actualizar las reglas desde la URL ahora",
+ loadNow: "Cargar el siguiente automáticamente",
+ loadConfirm: "¿Cuántas páginas desea cargar? (0 significa infinito)",
+ noNext: "No se encontró el enlace siguiente, por favor cree una nueva regla",
+ passSec: "Actualizado hace #t# segundos",
+ passMin: "Actualizado hace #t# minutos",
+ passHour: "Actualizado hace #t# horas",
+ passDay: "Actualizado hace #t# días",
+ cantDel: "No se pueden eliminar las reglas incorporadas",
+ confirmDel: "¿Está seguro de que desea eliminar esta regla?",
+ updateSucc: "Actualización exitosa",
+ beginUpdate: "Comenzar actualización, espere un momento por favor",
+ customUrls: "Importar URL de reglas de Pagetual o AutoPagerize, una URL por línea",
+ customRules: "Introduzca reglas personalizadas. ✍️Contribuir reglas",
+ save: "Guardar",
+ loadingText: "Shojo Cargando...",
+ opacity: "Opacidad",
+ opacityPlaceholder: "0: ocultar espaciador",
+ hideBar: "Ocultar el espaciador de paginación",
+ hideBarButNoStop: "Ocultar pero no detener",
+ dbClick2Stop: "Haga doble clic en el espacio en blanco para pausar",
+ sortTitle: "La ordenación surtirá efecto después de la próxima actualización de reglas",
+ autoRun: "Habilitar automáticamente (modo lista negra)",
+ autoLoadNum: "Cantidad de páginas para precargar",
+ turnRate: "Pasar a la siguiente página cuando esté a menos de 【X】 veces la altura de la página desde el pie de página",
+ inputPageNum: "Ingrese el número de página para saltar",
+ enableHistory: "Escribir historial de navegación después de pasar la página",
+ enableHistoryAfterInsert: "Escribir historial de navegación inmediatamente después de unir, de lo contrario escribir después de navegar",
+ contentVisibility: "Cambiar automáticamente la visibilidad del contenido para mejorar el rendimiento de renderización",
+ initRun: "Pasar páginas inmediatamente después de abrir",
+ preload: "Precargar la siguiente página para acelerar",
+ click2ImportRule: "Haga clic para importar el enlace de reglas base, luego espere hasta que la actualización esté completa: ",
+ forceAllBody: "¿Unir el cuerpo completo de la página?",
+ openInNewTab: "Abrir URLs de adiciones en una nueva pestaña",
+ importSucc: "Importación completada",
+ import: "Importar",
+ editCurrent: "Editar regla para la actual",
+ editBlacklist: "Editar URLs de la lista negra, una por línea, admite ? * para comodín",
+ upBtnImg: "Icono de volver al inicio",
+ downBtnImg: "Icono de ir al pie de página",
+ sideControllerIcon: "Icono de la barra lateral",
+ loadingTextTitle: "Texto de carga",
+ dbClick2StopCtrl: "Tecla Ctrl",
+ dbClick2StopAlt: "Tecla Alt",
+ dbClick2StopShift: "Tecla Shift",
+ dbClick2StopMeta: "Tecla Meta",
+ dbClick2StopKey: "Tecla de acceso rápido",
+ pageElementCss: "Estilo personalizado para los elementos principales de la página",
+ customCss: "CSS completo personalizado",
+ firstAlert: "No ha importado la regla base, por favor seleccione la regla adecuada para importar",
+ picker: "Selector de elementos de página de Pagetual",
+ closePicker: "Cerrar selector de Pagetual",
+ pickerPlaceholder: "Selector de elementos, déjelo vacío si no tiene idea",
+ pickerCheck: "Comprobar selector y copiar",
+ switchSelector: "Haga clic para cambiar el elemento",
+ gotoEdit: "Ir a editar la regla con el selector actual",
+ manualMode: "Deshabilitar unión, pasar páginas manualmente con las teclas de flecha derecha (o despachar evento 'pagetual.next')",
+ clickMode: "Deshabilitar unión, hacer clic automáticamente en la siguiente página al desplazarse al final de la página",
+ pageBarMenu: "Haga clic en el centro de la barra de página para abrir el menú del selector",
+ nextSwitch: "Cambiar al siguiente enlace",
+ arrowToScroll: "Presione la tecla de flecha izquierda para desplazarse anterior y la tecla de flecha derecha para desplazarse siguiente",
+ sideController: "Mostrar la barra de control de paginación en la barra lateral",
+ sideControllerScroll: "Alternar desplazamiento",
+ sideControllerAlways: "Mostrar siempre",
+ hideLoadingIcon: "Ocultar animación de carga",
+ hideBarArrow: "Ocultar flecha para la barra de página",
+ duplicate: "Pagetual duplicado ha sido instalado, ¡revise su gestor de scripts!",
+ forceStateIframe: "Incrustar página completa como iframe",
+ forceStateDynamic: "Cargar contenido dinámico a través de iframe",
+ forceStateDisable: "Deshabilitar pasar páginas en este sitio",
+ autoScrollRate: "Velocidad de desplazamiento (1~1000)",
+ disableAutoScroll: "Detener desplazamiento automático",
+ enableAutoScroll: "Habilitar desplazamiento automático",
+ toggleAutoScroll: "Alternar desplazamiento automático",
+ ruleRequest: "Solicitud de regla",
+ page: "Página ",
+ prevPage: "Página anterior",
+ nextPage: "Página siguiente",
+ errorRulesMustBeArray: "¡Las reglas deben ser un array!",
+ errorJson: "Error JSON, ¡verifique de nuevo!",
+ editSuccess: "Editado exitosamente",
+ errorWrongUrl: "URL incorrecta, ¡verifique de nuevo!",
+ errorAlreadyExists: "¡Ya existe!",
+ settingsSaved: "La configuración se ha guardado, actualice para ver",
+ iframe: "Iframe",
+ dynamic: "Dinámico",
+ reloadPage: "Edición completada, ¿recargar página ahora?",
+ copied: "Copiado",
+ noValidContent: "No se detectó contenido válido, puede ser necesario realizar una acción de Captcha, haga clic para ver",
+ outOfDate: "El script está desactualizado, ¡actualice a la última versión a tiempo!",
+ hideBarTips: "Ocultar la barra de paginación, alternar experiencia inmersiva",
+ setConfigPage: "Establecer la página actual como la página de configuración predeterminada",
+ wedata2github: "Cambiar la dirección de wedata a la dirección espejo en el repositorio de GitHub",
+ addOtherProp: "Agregar propiedad de regla",
+ addNextSelector: "Agregar contenido del selector como nextLink",
+ addPageSelector: "Agregar contenido del selector como pageElement",
+ propName: "Ingrese el nombre de la propiedad de la regla",
+ propValue: "Ingrese el valor de la propiedad de la regla",
+ customFirst: "Ignorar caché para reglas personalizadas locales",
+ rulesExample: "Ejemplo de reglas",
+ lastPage: "Llegó a la última página",
+ lastPageTips: "Mostrar consejos al llegar a la última página"
+ }
+ },
+ {
+ // Translated by Prankster 199 (vfggf95565).
+ name: "Arabic",
+ match: ["ar", "ar-AE", "ar-BH", "ar-DZ", "ar-EG", "ar-IQ", "ar-JO", "ar-KW", "ar-LB", "ar-LY", "ar-MA", "ar-OM", "ar-QA", "ar-SA", "ar-SY", "ar-TN", "ar-YE"],
+ encode: true, // In Firefox, Arabic characters may cause issues.
+ lang: {
+ enableDebug: "%D8%AA%D9%85%D9%83%D9%8A%D9%86%20%D8%AA%D8%B5%D8%AD%D9%8A%D8%AD%20%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1",
+ updateNotification: "%D8%A5%D8%B4%D8%B9%D8%A7%D8%B1%20%D8%A8%D8%B9%D8%AF%20%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%20%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%B9%D8%AF",
+ disable: "%D9%85%D8%B9%D8%B7%D9%84",
+ disableSite: "%D8%AA%D8%A8%D8%AF%D9%8A%D9%84%20%D8%AD%D8%A7%D9%84%D8%A9%20%D8%A7%D9%84%D8%AA%D8%B9%D8%B7%D9%8A%D9%84/%D8%A7%D9%84%D8%AA%D9%81%D8%B9%D9%8A%D9%84%20%D9%84%D9%84%D9%85%D9%88%D9%82%D8%B9",
+ disableSiteTips: "%D9%85%D8%B9%D8%B7%D9%84%20%D8%B9%D9%84%D9%89%20%D9%87%D8%B0%D8%A7%20%D8%A7%D9%84%D9%85%D9%88%D9%82%D8%B9",
+ enableSiteTips: "%D9%85%D9%81%D8%B9%D9%84%20%D8%B9%D9%84%D9%89%20%D9%87%D8%B0%D8%A7%20%D8%A7%D9%84%D9%85%D9%88%D9%82%D8%B9",
+ enable: "%D9%85%D9%81%D8%B9%D9%84",
+ tempActive: "%D9%86%D8%B4%D8%B7%20%D9%85%D8%A4%D9%82%D8%AA%D8%A7",
+ toTop: "%D8%A5%D9%84%D9%89%20%D8%A7%D9%84%D8%A3%D8%B9%D9%84%D9%89",
+ toBottom: "%D8%A5%D9%84%D9%89%20%D8%A7%D9%84%D8%A3%D8%B3%D9%81%D9%84",
+ current: "%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%AD%D8%A7%D9%84%D9%8A%D8%A9",
+ forceIframe: "%D8%A5%D8%AC%D8%A8%D8%A7%D8%B1%20%D8%B9%D9%84%D9%89%20%D8%A7%D9%84%D8%A7%D9%86%D8%B6%D9%85%D8%A7%D9%85%20%D9%84%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%AA%D8%A7%D9%84%D9%8A%D8%A9",
+ cancelForceIframe: "%D8%A5%D9%84%D8%BA%D8%A7%D8%A1%20%D8%A7%D9%84%D8%A7%D9%86%D8%B6%D9%85%D8%A7%D9%85%20%D8%A7%D9%84%D9%82%D8%B3%D8%B1%D9%8A",
+ configure: "%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF",
+ firstUpdate: "%D8%A7%D9%86%D9%82%D8%B1%20%D9%87%D9%86%D8%A7%20%D9%84%D8%AA%D9%81%D8%B9%D9%8A%D9%84%20%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%B9%D8%AF%20%D9%84%D8%A3%D9%88%D9%84%20%D9%85%D8%B1%D8%A9",
+ update: "%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%20%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%B9%D8%AF%20%D8%B9%D8%A8%D8%B1%20%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA",
+ click2update: "%D8%A7%D9%86%D9%82%D8%B1%20%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%20%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%B9%D8%AF%20%D9%85%D9%86%20%D8%A7%D9%84%D8%B1%D8%A7%D8%A8%D8%B7%20%D8%A7%D9%84%D8%A2%D9%86",
+ loadNow: "%D8%AA%D8%AD%D9%85%D9%8A%D9%84%20%D8%A7%D9%84%D8%AA%D8%A7%D9%84%D9%8A%20%D8%AA%D9%84%D9%82%D8%A7%D8%A6%D9%8A%D9%8B%D8%A7",
+ loadConfirm: "%D9%83%D9%85%20%D8%B9%D8%AF%D8%AF%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA%20%D8%A7%D9%84%D8%AA%D9%8A%20%D8%AA%D8%B1%D8%BA%D8%A8%20%D8%AA%D8%AD%D9%85%D9%8A%D9%84%D9%87%D8%A7%D8%9F%20(0%20%D9%8A%D8%B9%D9%86%D9%8A%20%D9%84%D8%A7%D9%86%D9%87%D8%A7%D8%A6%D9%8A)",
+ noNext: "%D9%84%D9%85%20%D9%8A%D8%AA%D9%85%20%D8%A7%D9%84%D8%B9%D8%AB%D9%88%D8%B1%20%D8%B9%D9%84%D9%89%20%D8%B1%D8%A7%D8%A8%D8%B7%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%AA%D8%A7%D9%84%D9%8A%D8%A9%D8%8C%20%D9%8A%D8%B1%D8%AC%D9%89%20%D8%A5%D9%86%D8%B4%D8%A7%D8%A1%20%D9%82%D8%A7%D8%B9%D8%AF%D8%A9%20%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9",
+ passSec: "%D8%AA%D9%85%20%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%20%D9%85%D9%86%D8%B0%20#t#%20%D8%AB%D8%A7%D9%86%D9%8A%D8%A9",
+ passMin: "%D8%AA%D9%85%20%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%20%D9%85%D9%86%D8%B0%20#t#%20%D8%AF%D9%82%D9%8A%D9%82%D8%A9",
+ passHour: "%D8%AA%D9%85%20%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%20%D9%85%D9%86%D8%B0%20#t#%20%D8%B3%D8%A7%D8%B9%D8%A9",
+ passDay: "%D8%AA%D9%85%20%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%20%D9%85%D9%86%D8%B0%20#t#%20%D9%8A%D9%88%D9%85",
+ cantDel: "%D9%84%D8%A7%20%D9%8A%D9%85%D9%83%D9%86%20%D8%AD%D8%B0%D9%81%20%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%B9%D8%AF%20%D8%A7%D9%84%D9%85%D8%AF%D9%85%D8%AC%D8%A9",
+ confirmDel: "%D9%87%D9%84%20%D8%A3%D9%86%D8%AA%20%D9%85%D8%AA%D8%A3%D9%83%D8%AF%20%D9%85%D9%86%20%D8%AD%D8%B0%D9%81%20%D9%87%D8%B0%D9%87%20%D8%A7%D9%84%D9%82%D8%A7%D8%B9%D8%AF%D8%A9%D8%9F",
+ updateSucc: "%D8%AA%D9%85%20%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%20%D8%A8%D9%86%D8%AC%D8%A7%D8%AD",
+ beginUpdate: "%D8%A8%D8%AF%D8%A3%20%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%D8%8C%20%D9%8A%D8%B1%D8%AC%D9%89%20%D8%A7%D9%84%D8%A7%D9%86%D8%AA%D8%B8%D8%A7%D8%B1%20%D9%84%D8%AD%D8%B8%D8%A9",
+ customUrls: "%D8%A7%D8%B3%D8%AA%D9%8A%D8%B1%D8%A7%D8%AF%20%D8%B1%D8%A7%D8%A8%D8%B7%20%D9%82%D8%A7%D8%B9%D8%AF%D8%A9%20Pagetual%20%D8%A3%D9%88%20AutoPagerize%D8%8C%20%D8%B1%D8%A7%D8%A8%D8%B7%20%D9%88%D8%A7%D8%AD%D8%AF%20%D9%84%D9%83%D9%84%20%D8%B3%D8%B7%D8%B1",
+ customRules: "%D8%A5%D8%AF%D8%AE%D8%A7%D9%84%20%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%B9%D8%AF%20%D8%A7%D9%84%D9%85%D8%AE%D8%B5%D8%B5%D8%A9.%20%3Ca%20href='#t#'%3E%E2%9C%8D%EF%B8%8F%D8%B3%D8%A7%D9%87%D9%85%20%D8%A8%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%B9%D8%AF%3C/a%3E",
+ save: "%D8%AD%D9%81%D8%B8",
+ loadingText: "%D8%AC%D8%A7%D8%B1%D9%8D%20%D8%A7%D9%84%D8%AA%D8%AD%D9%85%D9%8A%D9%84...",
+ opacity: "%D8%A7%D9%84%D8%B4%D9%81%D8%A7%D9%81%D9%8A%D8%A9",
+ opacityPlaceholder: "0:%20%D8%A5%D8%AE%D9%81%D8%A7%D8%A1%20%D8%A7%D9%84%D9%81%D8%A7%D8%B5%D9%84",
+ hideBar: "%D8%A5%D8%AE%D9%81%D8%A7%D8%A1%20%D8%A7%D9%84%D9%81%D8%A7%D8%B5%D9%84%20%D8%A7%D9%84%D8%AA%D8%B5%D9%81%D8%AD%D9%8A",
+ hideBarButNoStop: "%D8%A5%D8%AE%D9%81%D8%A7%D8%A1%D8%8C%20%D9%84%D9%83%D9%86%20%D9%84%D8%A7%20%D8%AA%D8%AA%D9%88%D9%82%D9%81",
+ dbClick2Stop: "%D8%A7%D9%86%D9%82%D8%B1%20%D9%85%D8%B2%D8%AF%D9%88%D8%AC%20%D8%B9%D9%84%D9%89%20%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%AD%D8%A9%20%D8%A7%D9%84%D9%81%D8%A7%D8%B1%D8%BA%D8%A9%20%D9%84%D9%84%D8%A5%D9%8A%D9%82%D8%A7%D9%81",
+ sortTitle: "%D9%8A%D8%AA%D9%85%20%D8%AA%D9%81%D8%B9%D9%8A%D9%84%20%D8%A7%D9%84%D9%81%D8%B1%D8%B2%20%D8%A8%D8%B9%D8%AF%20%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%20%D8%A7%D9%84%D8%AA%D8%A7%D9%84%D9%8A%20%D9%84%D9%84%D9%82%D9%88%D8%A7%D8%B9%D8%AF",
+ autoRun: "%D8%AA%D9%85%D9%83%D9%8A%D9%86%20%D8%AA%D9%84%D9%82%D8%A7%D8%A6%D9%8A%20(%D9%88%D8%B6%D8%B9%20%D8%A7%D9%84%D9%82%D8%A7%D8%A6%D9%85%D8%A9%20%D8%A7%D9%84%D8%B3%D9%88%D8%AF%D8%A7%D8%A1)",
+ autoLoadNum: "%D8%B9%D8%AF%D8%AF%20%D8%B5%D9%81%D8%AD%D8%A7%D8%AA%20%D8%A7%D9%84%D8%AA%D8%AD%D9%85%D9%8A%D9%84%20%D8%A7%D9%84%D9%85%D8%B3%D8%A8%D9%82",
+ turnRate: "%D8%A7%D9%84%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D9%84%20%D9%84%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%AA%D8%A7%D9%84%D9%8A%D8%A9%20%D8%B9%D9%86%D8%AF%D9%85%D8%A7%20%D8%AA%D9%83%D9%88%D9%86%20%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D9%81%D8%A9%20%D8%A3%D9%82%D9%84%20%D9%85%D9%86%20%E3%80%90X%E3%80%91%20%D9%85%D8%B1%D8%A7%D8%AA%20%D8%A7%D8%B1%D8%AA%D9%81%D8%A7%D8%B9%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D9%85%D9%86%20%D8%A7%D9%84%D8%AA%D8%B0%D9%8A%D9%8A%D9%84",
+ inputPageNum: "%D8%A3%D8%AF%D8%AE%D9%84%20%D8%B1%D9%82%D9%85%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D9%84%D9%84%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D9%84",
+ enableHistory: "%D9%83%D8%AA%D8%A7%D8%A8%D8%A9%20%D8%B3%D8%AC%D9%84%20%D8%A7%D9%84%D8%AA%D8%B5%D9%81%D8%AD%20%D8%A8%D8%B9%D8%AF%20%D8%AA%D8%AD%D9%88%D9%8A%D9%84%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9",
+ enableHistoryAfterInsert: "%D9%83%D8%AA%D8%A7%D8%A8%D8%A9%20%D8%B3%D8%AC%D9%84%20%D8%A7%D9%84%D8%AA%D8%B5%D9%81%D8%AD%20%D9%81%D9%88%D8%B1%D9%8B%D8%A7%20%D8%A8%D8%B9%D8%AF%20%D8%A7%D9%84%D8%AF%D9%85%D8%AC%D8%8C%20%D8%A3%D9%88%20%D8%A8%D8%B9%D8%AF%20%D8%A7%D9%84%D8%AA%D8%B5%D9%81%D8%AD",
+ contentVisibility: "%D8%A7%D9%84%D8%AA%D9%86%D9%82%D9%84%20%D8%A7%D9%84%D8%AA%D9%84%D9%82%D8%A7%D8%A6%D9%8A%20%D9%84%D8%B1%D8%A4%D9%8A%D8%A9%20%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89,%20%D9%84%D8%AA%D8%AD%D8%B3%D9%8A%D9%86%20%D8%A3%D8%AF%D8%A7%D8%A1%20%D8%A7%D9%84%D8%B9%D8%B1%D8%B6",
+ initRun: "%D8%A7%D9%84%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D9%84%20%D8%A8%D9%8A%D9%86%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA%20%D9%81%D9%88%D8%B1%20%D8%A7%D9%84%D9%81%D8%AA%D8%AD",
+ preload: "%D8%AA%D8%AD%D9%85%D9%8A%D9%84%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%AA%D8%A7%D9%84%D9%8A%D8%A9%20%D9%85%D8%B3%D8%A8%D9%82%D9%8B%D8%A7%20%D9%84%D8%AA%D8%B3%D8%B1%D9%8A%D8%B9%20%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A1",
+ click2ImportRule: "%D8%A7%D9%86%D9%82%D8%B1%20%D9%84%D8%A7%D8%B3%D8%AA%D9%8A%D8%B1%D8%A7%D8%AF%20%D8%B1%D8%A7%D8%A8%D8%B7%20%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%B9%D8%AF%20%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9%D8%8C%20%D8%AB%D9%85%20%D8%A7%D9%86%D8%AA%D8%B8%D8%B1%20%D8%AD%D8%AA%D9%89%20%D9%8A%D9%83%D8%AA%D9%85%D9%84%20%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB",
+ forceAllBody: "%D8%AF%D9%85%D8%AC%20%D9%83%D8%A7%D9%85%D9%84%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D9%83%D8%A5%D8%B7%D8%A7%D8%B1%D8%9F",
+ openInNewTab: "%D9%81%D8%AA%D8%AD%20%D8%A7%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7%20%D8%A7%D9%84%D8%A5%D8%B6%D8%A7%D9%81%D9%8A%D8%A9%20%D9%81%D9%8A%20%D8%B9%D9%84%D8%A7%D9%85%D8%A9%20%D8%AA%D8%A8%D9%88%D9%8A%D8%A8%20%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9",
+ importSucc: "%D8%AA%D9%85%20%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D9%8A%D8%B1%D8%A7%D8%AF%20%D8%A8%D9%86%D8%AC%D8%A7%D8%AD",
+ import: "%D8%A7%D8%B3%D8%AA%D9%8A%D8%B1%D8%A7%D8%AF",
+ editCurrent: "%D8%AA%D8%AD%D8%B1%D9%8A%D8%B1%20%D8%A7%D9%84%D9%82%D8%A7%D8%B9%D8%AF%D8%A9%20%D9%84%D9%84%D8%AD%D8%A7%D9%84%D9%8A%D8%A9",
+ editBlacklist: "%D8%AA%D8%AD%D8%B1%D9%8A%D8%B1%20%D8%B9%D9%86%D8%A7%D9%88%D9%8A%D9%86%20%D8%A7%D9%84%D9%82%D8%A7%D8%A6%D9%85%D8%A9%20%D8%A7%D9%84%D8%B3%D9%88%D8%AF%D8%A7%D8%A1%D8%8C%20%D8%B3%D8%B7%D8%B1%20%D8%A8%D8%B3%D8%B7%D8%B1%D8%8C%20%D8%AF%D8%B9%D9%85%D8%9F%20*%20%D9%84%D9%84%D8%B1%D9%85%D9%88%D8%B2%20%D8%A7%D9%84%D9%85%D8%AA%D8%AD%D8%B1%D9%83%D8%A9",
+ upBtnImg: "%D8%A3%D9%8A%D9%82%D9%88%D9%86%D8%A9%20%D8%A7%D9%84%D8%B9%D9%88%D8%AF%D8%A9%20%D8%A5%D9%84%D9%89%20%D8%A7%D9%84%D8%A3%D8%B9%D9%84%D9%89",
+ downBtnImg: "%D8%A3%D9%8A%D9%82%D9%88%D9%86%D8%A9%20%D8%A7%D9%84%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D9%84%20%D8%A5%D9%84%D9%89%20%D8%A7%D9%84%D8%A3%D8%B3%D9%81%D9%84",
+ sideControllerIcon: "%D8%A3%D9%8A%D9%82%D9%88%D9%86%D8%A9%20%D8%A7%D9%84%D8%B4%D8%B1%D9%8A%D8%B7%20%D8%A7%D9%84%D8%AC%D8%A7%D9%86%D8%A8%D9%8A",
+ loadingTextTitle: "%D8%AA%D8%AD%D9%85%D9%8A%D9%84%20%D8%A7%D9%84%D9%86%D8%B5",
+ dbClick2StopCtrl: "%D9%85%D9%81%D8%AA%D8%A7%D8%AD%20Ctrl",
+ dbClick2StopAlt: "%D9%85%D9%81%D8%AA%D8%A7%D8%AD%20Alt",
+ dbClick2StopShift: "%D9%85%D9%81%D8%AA%D8%A7%D8%AD%20Shift",
+ dbClick2StopMeta: "%D9%85%D9%81%D8%AA%D8%A7%D8%AD%20Meta",
+ dbClick2StopKey: "%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD%20%D8%A7%D9%84%D8%A7%D8%AE%D8%AA%D8%B5%D8%A7%D8%B1",
+ pageElementCss: "%D9%86%D9%85%D8%B7%20%D9%85%D8%AE%D8%B5%D8%B5%20%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9",
+ customCss: "%D9%85%D8%AE%D8%B5%D8%B5%20%D8%A8%D8%A7%D9%84%D9%83%D8%A7%D9%85%D9%84%20CSS%20%D9%86%D9%85%D8%B7",
+ firstAlert: "%D9%84%D9%85%20%D8%AA%D8%B3%D8%AA%D9%88%D8%B1%D8%AF%20%D8%A7%D9%84%D9%82%D8%A7%D8%B9%D8%AF%D8%A9%20%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9%20%D8%A8%D8%B9%D8%AF%D8%8C%20%D9%8A%D8%B1%D8%AC%D9%89%20%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1%20%D8%A7%D9%84%D9%82%D8%A7%D8%B9%D8%AF%D8%A9%20%D8%A7%D9%84%D9%85%D9%86%D8%A7%D8%B3%D8%A8%D8%A9%20%D9%84%D9%84%D8%A7%D8%B3%D8%AA%D9%8A%D8%B1%D8%A7%D8%AF",
+ picker: "%D9%85%D8%AD%D8%AF%D8%AF%20%D8%B9%D9%86%D8%A7%D8%B5%D8%B1%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20Pagetual",
+ closePicker: "%D8%A5%D8%BA%D9%84%D8%A7%D9%82%20%D9%85%D8%AD%D8%AF%D8%AF%20Pagetual",
+ pickerPlaceholder: "%D9%85%D8%AD%D8%AF%D8%AF%20%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1%D8%8C%20%D8%A7%D8%AA%D8%B1%D9%83%D9%87%20%D9%81%D8%A7%D8%B1%D8%BA%D9%8B%D8%A7%20%D8%A5%D8%B0%D8%A7%20%D9%83%D9%86%D8%AA%20%D9%84%D8%A7%20%D8%AA%D8%B9%D8%B1%D9%81",
+ pickerCheck: "%D8%AA%D8%AD%D9%82%D9%82%20%D9%85%D9%86%20%D8%A7%D9%84%D9%85%D8%AD%D8%AF%D8%AF%20%D9%88%D9%86%D8%B3%D8%AE",
+ switchSelector: "%D8%A7%D9%86%D9%82%D8%B1%20%D9%84%D9%84%D8%AA%D8%A8%D8%AF%D9%8A%D9%84%20%D8%A8%D9%8A%D9%86%20%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1",
+ gotoEdit: "%D8%A7%D8%B0%D9%87%D8%A8%20%D9%84%D8%AA%D8%AD%D8%B1%D9%8A%D8%B1%20%D8%A7%D9%84%D9%82%D8%A7%D8%B9%D8%AF%D8%A9%20%D8%A8%D8%A7%D9%84%D9%85%D8%AD%D8%AF%D8%AF%20%D8%A7%D9%84%D8%AD%D8%A7%D9%84%D9%8A",
+ manualMode: "%D8%AA%D8%B9%D8%B7%D9%8A%D9%84%20%D8%A7%D9%84%D8%AF%D9%85%D8%AC/%D8%A7%D9%84%D8%B1%D8%A8%D8%B7%D8%8C%20%D9%88%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%20%D9%85%D9%81%D8%AA%D8%A7%D8%AD%20%D8%A7%D9%84%D8%A7%D8%AA%D8%AC%D8%A7%D9%87%20%D8%A7%D9%84%D8%A3%D9%8A%D9%85%D9%86%20%D9%8A%D8%AF%D9%88%D9%8A%D9%8B%D8%A7%20%D9%84%D9%84%D8%AA%D9%85%D8%B1%D9%8A%D8%B1%D8%8C%20%D9%88%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%20%D9%85%D9%81%D8%AA%D8%A7%D8%AD%20%D8%A7%D9%84%D8%B3%D9%87%D9%85%20%D8%A7%D9%84%D8%A3%D9%8A%D8%B3%D8%B1%20%D9%84%D9%84%D8%B1%D8%AC%D9%88%D8%B9",
+ clickMode: "%D8%AA%D8%B9%D8%B7%D9%8A%D9%84%20%D8%A7%D9%84%D8%AF%D9%85%D8%AC/%D8%A7%D9%84%D8%B1%D8%A8%D8%B7%D8%8C%20%D8%B9%D9%86%D8%AF%20%D8%A7%D9%84%D8%AA%D9%85%D8%B1%D9%8A%D8%B1%20%D8%A5%D9%84%D9%89%20%D9%86%D9%87%D8%A7%D9%8A%D8%A9%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%D8%8C%20%D8%B3%D9%8A%D8%AA%D9%85%20%D8%A7%D9%84%D9%86%D9%82%D8%B1%20%D8%AA%D9%84%D9%82%D8%A7%D8%A6%D9%8A%D9%8B%D8%A7%20%D8%B9%D9%84%D9%89%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%AA%D8%A7%D9%84%D9%8A%D8%A9",
+ pageBarMenu: "%D8%A7%D9%86%D9%82%D8%B1%20%D8%B9%D9%84%D9%89%20%D9%85%D8%B1%D9%83%D8%B2%20%D8%B4%D8%B1%D9%8A%D8%B7%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D9%84%D9%81%D8%AA%D8%AD%20%D9%82%D8%A7%D8%A6%D9%85%D8%A9%20%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%AF",
+ nextSwitch: "%D8%AA%D8%A8%D8%AF%D9%8A%D9%84%20%D8%A7%D9%84%D8%B1%D8%A7%D8%A8%D8%B7%20%D8%A7%D9%84%D8%AA%D8%A7%D9%84%D9%8A",
+ arrowToScroll: "%D8%A7%D9%86%D9%82%D8%B1%20%D8%B9%D9%84%D9%89%20%D9%85%D9%81%D8%AA%D8%A7%D8%AD%20%D8%A7%D9%84%D8%B3%D9%87%D9%85%20%D8%A7%D9%84%D8%A3%D9%8A%D9%85%D9%86%20%D9%84%D9%84%D8%AA%D9%85%D8%B1%D9%8A%D8%B1%20%D8%A7%D9%84%D8%AA%D8%A7%D9%84%D9%8A%20%D9%88%D9%85%D9%81%D8%AA%D8%A7%D8%AD%20%D8%A7%D9%84%D8%B3%D9%87%D9%85%20%D8%A7%D9%84%D8%A3%D9%8A%D8%B3%D8%B1%20%D9%84%D9%84%D8%AA%D9%85%D8%B1%D9%8A%D8%B1%20%D8%A7%D9%84%D8%B3%D8%A7%D8%A8%D9%82",
+ sideController: "%D8%B9%D8%B1%D8%B6%20%D8%B4%D8%B1%D9%8A%D8%B7%20%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85%20%D9%81%D9%8A%20%D8%A7%D9%84%D8%AA%D8%B5%D9%81%D8%AD%20%D8%A7%D9%84%D8%AA%D8%B1%D9%82%D9%8A%D9%85%20%D9%81%D9%8A%20%D8%A7%D9%84%D8%B4%D8%B1%D9%8A%D8%B7%20%D8%A7%D9%84%D8%AC%D8%A7%D9%86%D8%A8%D9%8A",
+ sideControllerScroll: "%D8%AA%D8%A8%D8%AF%D9%8A%D9%84%20%D8%A7%D9%84%D8%AA%D9%85%D8%B1%D9%8A%D8%B1",
+ sideControllerAlways: "%D8%B9%D8%B1%D8%B6%20%D8%AF%D8%A7%D8%A6%D9%85%D9%8B%D8%A7",
+ hideLoadingIcon: "%D8%A5%D8%AE%D9%81%D8%A7%D8%A1%20%D8%B1%D9%85%D8%B2%20%D8%A7%D9%84%D8%AA%D8%AD%D9%85%D9%8A%D9%84",
+ hideBarArrow: "%D8%A5%D8%AE%D9%81%D8%A7%D8%A1%20%D8%B3%D9%87%D9%85%20%D8%B4%D8%B1%D9%8A%D8%B7%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9",
+ duplicate: "%D8%AA%D9%85%20%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA%20Pagetual%20%D9%85%D9%83%D8%B1%D8%B1%D8%8C%20%D8%AA%D8%AD%D9%82%D9%82%20%D9%85%D9%86%20%D9%85%D8%AF%D9%8A%D8%B1%20%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5%20%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9%20%D8%A7%D9%84%D8%AE%D8%A7%D8%B5%20%D8%A8%D9%83!",
+ forceStateIframe: "%D8%AA%D8%B6%D9%85%D9%8A%D9%86%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A8%D8%A7%D9%84%D9%83%D8%A7%D9%85%D9%84%20%D9%83%D8%A5%D8%B7%D8%A7%D8%B1",
+ forceStateDynamic: "%D8%AA%D8%AD%D9%85%D9%8A%D9%84%20%D8%A7%D9%84%D9%85%D8%AD%D8%AA%D9%88%D9%89%20%D8%A7%D9%84%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A%20%D8%B9%D8%A8%D8%B1%20%D8%A7%D9%84%D8%A5%D8%B7%D8%A7%D8%B1",
+ forceStateDisable: "%D8%AA%D8%B9%D8%B7%D9%8A%D9%84%20%D8%AA%D8%AD%D9%88%D9%8A%D9%84%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A7%D8%AA%20%D8%B9%D9%84%D9%89%20%D9%87%D8%B0%D8%A7%20%D8%A7%D9%84%D9%85%D9%88%D9%82%D8%B9",
+ autoScrollRate: "%D8%B3%D8%B1%D8%B9%D8%A9%20%D8%A7%D9%84%D8%AA%D9%85%D8%B1%D9%8A%D8%B1%20(1~1000)",
+ disableAutoScroll: "%D8%A5%D9%8A%D9%82%D8%A7%D9%81%20%D8%A7%D9%84%D8%AA%D9%85%D8%B1%D9%8A%D8%B1%20%D8%A7%D9%84%D8%AA%D9%84%D9%82%D8%A7%D8%A6%D9%8A",
+ enableAutoScroll: "%D8%AA%D9%85%D9%83%D9%8A%D9%86%20%D8%A7%D9%84%D8%AA%D9%85%D8%B1%D9%8A%D8%B1%20%D8%A7%D9%84%D8%AA%D9%84%D9%82%D8%A7%D8%A6%D9%8A",
+ toggleAutoScroll: "%D8%AA%D8%A8%D8%AF%D9%8A%D9%84%20%D8%A7%D9%84%D8%AA%D9%85%D8%B1%D9%8A%D8%B1%20%D8%A7%D9%84%D8%AA%D9%84%D9%82%D8%A7%D8%A6%D9%8A",
+ ruleRequest: "%D8%B7%D9%84%D8%A8%20%D9%82%D8%A7%D8%B9%D8%AF%D8%A9",
+ page: "%D8%B5%D9%81%D8%AD%D8%A9%20",
+ prevPage: "%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%B3%D8%A7%D8%A8%D9%82%D8%A9",
+ nextPage: "%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%AA%D8%A7%D9%84%D9%8A%D8%A9",
+ errorRulesMustBeArray: "%D9%8A%D8%AC%D8%A8%20%D8%A3%D9%86%20%D8%AA%D9%83%D9%88%D9%86%20%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%B9%D8%AF%20%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A9!",
+ errorJson: "%D8%AE%D8%B7%D8%A3%20%D9%81%D9%8A%20JSON%D8%8C%20%D8%AA%D8%AD%D9%82%D9%82%20%D9%85%D8%B1%D8%A9%20%D8%A3%D8%AE%D8%B1%D9%89!",
+ editSuccess: "%D8%AA%D9%85%20%D8%A7%D9%84%D8%AA%D8%AD%D8%B1%D9%8A%D8%B1%20%D8%A8%D9%86%D8%AC%D8%A7%D8%AD",
+ errorWrongUrl: "%D8%B9%D9%86%D9%88%D8%A7%D9%86%20URL%20%D8%AE%D8%A7%D8%B7%D8%A6%D8%8C%20%D8%AA%D8%AD%D9%82%D9%82%20%D9%85%D8%B1%D8%A9%20%D8%A3%D8%AE%D8%B1%D9%89!",
+ errorAlreadyExists: "%D9%85%D9%88%D8%AC%D9%88%D8%AF%20%D8%A8%D8%A7%D9%84%D9%81%D8%B9%D9%84!",
+ settingsSaved: "%D8%AA%D9%85%20%D8%AD%D9%81%D8%B8%20%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA%D8%8C%20%D9%82%D9%85%20%D8%A8%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%20%D9%84%D8%B9%D8%B1%D8%B6",
+ iframe: "%D8%A5%D8%B7%D8%A7%D8%B1",
+ dynamic: "%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A",
+ reloadPage: "%D8%A7%D9%83%D8%AA%D9%85%D9%84%20%D8%A7%D9%84%D8%AA%D8%AD%D8%B1%D9%8A%D8%B1%D8%8C%20%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9%20%D8%AA%D8%AD%D9%85%D9%8A%D9%84%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%A2%D9%86%D8%9F",
+ copied: "%D8%AA%D9%85%20%D8%A7%D9%84%D9%86%D8%B3%D8%AE",
+ noValidContent: "%D9%84%D9%85%20%D9%8A%D8%AA%D9%85%20%D8%A7%D9%84%D9%83%D8%B4%D9%81%20%D8%B9%D9%86%20%D9%85%D8%AD%D8%AA%D9%88%D9%89%20%D8%B5%D8%A7%D9%84%D8%AD%D8%8C%20%D9%82%D8%AF%20%D9%8A%D9%83%D9%88%D9%86%20%D8%A7%D9%84%D8%A5%D8%AC%D8%B1%D8%A7%D8%A1%20Captcha%20%D9%85%D8%B7%D9%84%D9%88%D8%A8%D9%8B%D8%A7%D8%8C%20%D8%A7%D9%86%D9%82%D8%B1%20%D9%84%D8%B9%D8%B1%D8%B6",
+ outOfDate: "%D8%A7%D9%84%D9%86%D8%B5%20%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%20%D9%82%D8%AF%D9%8A%D9%85%D8%8C%20%D9%82%D9%85%20%D8%A8%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%20%D8%A5%D9%84%D9%89%20%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%20%D8%A7%D9%84%D8%A3%D8%AD%D8%AF%D8%AB%20%D9%81%D9%8A%20%D8%A7%D9%84%D9%88%D9%82%D8%AA%20%D8%A7%D9%84%D9%85%D9%86%D8%A7%D8%B3%D8%A8!",
+ hideBarTips: "%D8%A5%D8%AE%D9%81%D8%A7%D8%A1%20%D8%B4%D8%B1%D9%8A%D8%B7%20%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85%20%D9%81%D9%8A%20%D8%A7%D9%84%D8%AA%D8%B5%D9%81%D8%AD%20%D8%A7%D9%84%D8%AA%D8%B1%D9%82%D9%8A%D9%85%20%D8%8C%20%D9%88%D8%A7%D9%84%D8%AA%D8%A8%D8%AF%D9%8A%D9%84%20%D9%84%D9%88%D8%B6%D8%B9%20%D9%83%D8%A7%D9%85%D9%84%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9",
+ setConfigPage: "%D8%AA%D8%B9%D9%8A%D9%8A%D9%86%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%AD%D8%A7%D9%84%D9%8A%D8%A9%20%D9%83%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%20%D8%A7%D9%84%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9",
+ wedata2github: "%D8%AA%D8%BA%D9%8A%D9%8A%D8%B1%20%D8%B9%D9%86%D9%88%D8%A7%D9%86%20%D8%A7%D9%84%D9%88%D9%8A%D8%A8%20%D8%AF%D8%A7%D8%AA%D8%A7%20%D8%A5%D9%84%D9%89%20%D8%A7%D9%84%D8%B9%D9%86%D9%88%D8%A7%D9%86%20%D8%A7%D9%84%D8%A8%D8%AF%D9%8A%D9%84%20%D8%A7%D9%84%D9%85%D8%B1%D8%A2%D8%A9,%20%D9%81%D9%8A%20%D9%85%D8%B3%D8%AA%D9%88%D8%AF%D8%B9%20%D8%AC%D9%8A%D8%AA%20%D9%87%D8%A7%D8%A8",
+ addOtherProp: "%D8%A5%D8%B6%D8%A7%D9%81%D8%A9%20%D8%AE%D8%A7%D8%B5%D9%8A%D8%A9%20%D9%82%D8%A7%D8%B9%D8%AF%D8%A9",
+ addNextSelector: "%D8%A5%D8%B6%D8%A7%D9%81%D8%A9%20%D9%85%D8%AD%D8%AA%D9%88%D9%89%20%D8%A7%D9%84%D9%85%D8%AD%D8%AF%D8%AF%20%D9%83%D9%80%20nextLink",
+ addPageSelector: "%D8%A5%D8%B6%D8%A7%D9%81%D8%A9%20%D9%85%D8%AD%D8%AA%D9%88%D9%89%20%D8%A7%D9%84%D9%85%D8%AD%D8%AF%D8%AF%20%D9%83%D9%80%20pageElement",
+ propName: "%D8%A3%D8%AF%D8%AE%D9%84%20%D8%A7%D8%B3%D9%85%20%D8%AE%D8%A7%D8%B5%D9%8A%D8%A9%20%D8%A7%D9%84%D9%82%D8%A7%D8%B9%D8%AF%D8%A9",
+ propValue: "%D8%A3%D8%AF%D8%AE%D9%84%20%D9%82%D9%8A%D9%85%D8%A9%20%D8%AE%D8%A7%D8%B5%D9%8A%D8%A9%20%D8%A7%D9%84%D9%82%D8%A7%D8%B9%D8%AF%D8%A9",
+ customFirst: "%D8%AA%D8%AC%D8%A7%D9%87%D9%84%20%D8%B0%D8%A7%D9%83%D8%B1%D8%A9%20%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86%20%D8%A7%D9%84%D9%85%D8%A4%D9%82%D8%AA%20%D9%84%D9%84%D9%82%D9%88%D8%A7%D8%B9%D8%AF%20%D8%A7%D9%84%D9%85%D8%AE%D8%B5%D8%B5%D8%A9%20%D8%A7%D9%84%D9%85%D8%AD%D9%84%D9%8A%D8%A9",
+ rulesExample: "%D9%85%D8%AB%D8%A7%D9%84%20%D8%B9%D9%84%D9%89%20%D8%A7%D9%84%D9%82%D9%88%D8%A7%D8%B9%D8%AF",
+ lastPage: "%D8%AA%D9%85%20%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84%20%D8%A5%D9%84%D9%89%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%A3%D8%AE%D9%8A%D8%B1%D8%A9",
+ lastPageTips: "%D8%B9%D8%B1%D8%B6%20%D8%AA%D9%84%D9%85%D9%8A%D8%AD%D8%A7%D8%AA%20%D8%B9%D9%86%D8%AF%20%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84%20%D8%A5%D9%84%D9%89%20%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9%20%D8%A7%D9%84%D8%A3%D8%AE%D9%8A%D8%B1%D8%A9"
+ }
+ },
{
name: "简体中文",
match: ["zh-CN", "zh-SG"],
@@ -243,7 +3645,8 @@
disableSite: "站点禁用开关",
disableSiteTips: "已在此站禁用",
enableSiteTips: "已在此站启用",
- enable: "启用自动翻页",
+ enable: "✅启用自动翻页",
+ tempActive: "临时启用翻页",
toTop: "回到顶部",
toBottom: "前往页尾",
current: "当前页",
@@ -326,6 +3729,7 @@
disableAutoScroll: "停止自动滚动",
enableAutoScroll: "开启自动滚动",
toggleAutoScroll: "自动滚动开关",
+ ruleRequest: "适配请求",
page: "Page ",
prevPage: "上一页",
nextPage: "下一页",
@@ -357,7 +3761,7 @@
},
{
name: "正體中文",
- match: ["zh-TW", "zh-HK"],
+ match: ["zh", "zh-TW", "zh-HK"],
lang: {
enableDebug: "調試模式,輸出信息至控制台",
updateNotification: "規則更新后提示",
@@ -365,7 +3769,8 @@
disableSite: "站點禁用開關",
disableSiteTips: "已在此站禁用",
enableSiteTips: "已在此站啟用",
- enable: "啟用自動翻頁",
+ enable: "✅啟用自動翻頁",
+ tempActive: "臨時啟用翻頁",
toTop: "回到頂部",
toBottom: "前往頁尾",
current: "當前頁",
@@ -448,6 +3853,7 @@
disableAutoScroll: "停止自動滾動",
enableAutoScroll: "開啟自動滾動",
toggleAutoScroll: "自動滾動開關",
+ ruleRequest: "適配請求",
page: "Page ",
prevPage: "上一頁",
nextPage: "下一頁",
@@ -479,7 +3885,7 @@
},
{
name: "日本語",
- match: ["ja"],
+ match: ["ja", "ja-JP"],
lang: {
enableDebug: "デバッグモード",
updateNotification: "ルール更新後の通知",
@@ -487,7 +3893,8 @@
disableSite: "無効状態の切り替え",
disableSiteTips: "このサイトで既に無効になっています",
enableSiteTips: "このサイトで既に有効になっています",
- enable: "ページめくりを有効にする",
+ enable: "✅ページめくりを有効にする",
+ tempActive: "一時的にアクティブ",
toTop: "トップに戻る",
toBottom: "ページの下部に移動",
current: "現在のページ",
@@ -496,7 +3903,7 @@
configure: "設定ページを開く",
firstUpdate: "ここをクリックしてルールを初期化します",
update: "更新ルール",
- click2update: "今すぐルールを更新してください",
+ click2update: "今すぐルールを更新",
loadNow: "今すぐページをめくる",
loadConfirm: "数ページめくりたいですか?(0は途切れない)",
noNext: "次のページが見つかりません、新しいルールを作成してください",
@@ -509,7 +3916,7 @@
updateSucc: "更新に成功しました",
beginUpdate: "更新中、お待ちください",
customUrls: "インポートルールのURL、1行に1つ",
- customRules: "【東方永頁機】の形式でカスタムルールを入力してください ✍️寄稿ルール",
+ customRules: "【東方永頁機】の形式でルールを入力してください ✍️寄稿",
save: "設定を保存",
loadingText: "少女祈祷中...",
opacity: "不透明値",
@@ -518,7 +3925,7 @@
hideBarButNoStop: "非表示にするが停止しない",
dbClick2Stop: "空白部分をダブルクリックしてページめくりを一時停止します",
sortTitle: "並べ替えは、次のルールの更新後に有効になります",
- autoRun: "自動的に有効",
+ autoRun: "自動的に有効 (blacklist mode)",
autoLoadNum: "指定したページ数を自動的に読み込みます",
turnRate: "ページの端からページの高さの【X】倍になったらページをめくる",
inputPageNum: "ジャンプするページ番号を入力",
@@ -534,9 +3941,9 @@
import: "インポート",
editCurrent: "現在のルールの編集",
editBlacklist: "ブラックリストのURLを編集し、1行ずつ、サポート? *ワイルドカード",
- upBtnImg: "トップアイコンに戻る",
- downBtnImg: "フッターアイコンに移動",
- sideControllerIcon: "サイドバー アイコン",
+ upBtnImg: "Icon of back to top",
+ downBtnImg: "Icon of go to footer",
+ sideControllerIcon: "Icon of sidebar",
loadingTextTitle: "テキストをロード",
dbClick2StopCtrl: "Ctrlキー",
dbClick2StopAlt: "Altキー",
@@ -568,8 +3975,9 @@
forceStateDisable: "このステーションでのページめくりを無効にする",
autoScrollRate: "スクロール速度 (1~1000)",
disableAutoScroll: "自動スクロールを停止します",
- EnableAutoScroll: "自動スクロールを有効にする",
+ enableAutoScroll: "自動スクロールを有効にする",
toggleAutoScroll: "自動スクロールの切り替え",
+ ruleRequest: "ルール要求",
page: "Page ",
prevPage: "Prev page",
nextPage: "Next page",
@@ -609,7 +4017,8 @@
disableSite: "Включить/выключить на сайте",
disableSiteTips: "Выключено для этого сайта",
enableSiteTips: "Включено для этого сайта",
- enable: "Включить",
+ enable: "✅Включить",
+ tempActive: "Временно активен",
toTop: "Наверх",
toBottom: "Вниз",
current: "Текущая страница",
@@ -692,6 +4101,7 @@
disableAutoScroll: "Остановить автоматическую прокрутку",
enableAutoScroll: "Включить автопрокрутку",
toggleAutoScroll: "Переключить автопрокрутку",
+ ruleRequest: "Запрос правил",
page: "Страница ",
prevPage: "Предыдущая страница",
nextPage: "Следующая страница",
@@ -728,15 +4138,21 @@
});
var i18nData = langData[0].lang;
function setLang(la) {
+ langName = la;
for (let i = 0; i < langData.length; i++) {
let lang = langData[i];
if (lang && lang.match.indexOf(la) !== -1) {
i18nData = lang.lang;
+ if (lang.encode) {
+ for (let k in i18nData) {
+ i18nData[k] = decodeURI(i18nData[k]);
+ }
+ }
break;
}
}
}
- setLang(lang);
+ setLang(langName);
var enableDebug = true;
var _GM_xmlhttpRequest, _GM_registerMenuCommand, _GM_notification, _GM_addStyle, _GM_openInTab, _GM_info, _GM_setClipboard;
function i18n(name, param) {
@@ -747,18 +4163,205 @@
if (enableDebug) {
console.log(
`%c【Pagetual v.${_GM_info.script.version}】 ${title ? title : 'debug'}:`,
- 'color: yellow;font-size: large;font-weight: bold;background-color: darkblue;',
+ 'color: yellow;font-size: large;font-weight: bold;background-color: darkblue;border-radius: 10px;text-shadow: 1px 1px 3px black;padding: 5px;',
str
);
}
}
+ function requestWithFetch(f, onFetchError) {
+ function getHeaderValue(headers, name) {
+ if (!headers || !name) return "";
+ let lowerName = String(name).toLowerCase();
+ if (typeof Headers !== "undefined" && headers instanceof Headers) {
+ return headers.get(lowerName) || "";
+ }
+ if (typeof headers === "object") {
+ for (let key in headers) {
+ if (Object.prototype.hasOwnProperty.call(headers, key) && String(key).toLowerCase() === lowerName) {
+ return headers[key] || "";
+ }
+ }
+ }
+ return "";
+ }
+ function extractCharsetFromContentType(contentType) {
+ if (!contentType || typeof contentType !== "string") return "";
+ let match = contentType.match(/charset\s*=\s*["']?([^;"'\s]+)/i);
+ return match && match[1] ? match[1].trim() : "";
+ }
+ function decodeArrayBufferByCharset(buffer, preferredCharset) {
+ let bytes = new Uint8Array(buffer);
+ let decoderList = [];
+ let normalize = label => String(label || "").trim().toLowerCase();
+ let addAlias = (name, aliases) => {
+ if (aliases.indexOf(normalizedPreferred) !== -1) {
+ pushDecoder(name);
+ for (let i = 0; i < aliases.length; i++) {
+ pushDecoder(aliases[i]);
+ }
+ }
+ };
+ let pushDecoder = label => {
+ let raw = String(label || "").trim();
+ if (raw && decoderList.indexOf(raw) === -1) {
+ decoderList.push(raw);
+ }
+ };
+ let normalizedPreferred = normalize(preferredCharset).replace(/["']/g, "");
+ pushDecoder(preferredCharset);
+ pushDecoder(normalizedPreferred);
+ pushDecoder(normalizedPreferred.replace(/_/g, "-"));
+ pushDecoder(normalizedPreferred.replace(/-/g, "_"));
+ addAlias("shift_jis", ["shiftjis", "shift-jis", "sjis", "ms_kanji", "windows-31j", "cp932", "ms932"]);
+ addAlias("euc-jp", ["eucjp"]);
+ addAlias("iso-2022-jp", ["iso2022jp", "jis"]);
+ addAlias("gb18030", ["gbk", "gb2312", "x-gbk", "cp936", "ms936", "windows-936"]);
+ addAlias("big5", ["big-5", "cn-big5", "x-x-big5"]);
+ addAlias("euc-kr", ["euckr", "ks_c_5601-1987", "ksc5601", "windows-949", "cp949"]);
+ addAlias("windows-1251", ["cp1251"]);
+ addAlias("windows-1252", ["cp1252", "iso-8859-1", "latin1", "latin-1"]);
+ pushDecoder("utf-8");
+ for (let i = 0; i < decoderList.length; i++) {
+ try {
+ return new TextDecoder(decoderList[i]).decode(bytes);
+ } catch (e) {}
+ }
+ try {
+ return new TextDecoder().decode(bytes);
+ } catch (e) {
+ return "";
+ }
+ }
+ function detectCharsetFromHtmlHead(buffer) {
+ if (!buffer || !buffer.byteLength) return "";
+ let scanLen = Math.min(buffer.byteLength, 16384);
+ let bytes = new Uint8Array(buffer, 0, scanLen);
+ let ascii = "";
+ for (let i = 0; i < bytes.length; i++) {
+ let code = bytes[i];
+ ascii += code < 128 ? String.fromCharCode(code) : " ";
+ }
+ let charsetMatch = ascii.match(/]*charset\s*=\s*["']?\s*([a-zA-Z0-9._-]+)/i);
+ if (!charsetMatch) {
+ charsetMatch = ascii.match(/]*content\s*=\s*["'][^"']*charset\s*=\s*([a-zA-Z0-9._-]+)/i);
+ }
+ return charsetMatch && charsetMatch[1] ? charsetMatch[1].trim() : "";
+ }
+ function isUtf8Charset(label) {
+ let normalized = String(label || "").trim().toLowerCase().replace(/_/g, "-");
+ return !normalized || normalized === "utf-8" || normalized === "utf8";
+ }
+ if (!f || !f.url || typeof fetch === "undefined") {
+ if (onFetchError) {
+ onFetchError({error: "Fetch not available"});
+ } else if (f && f.onerror) {
+ f.onerror({error: "Fetch not available"});
+ }
+ return;
+ }
+ let method = (f.method || "GET").toUpperCase();
+ let timeoutId = null;
+ let controller = typeof AbortController !== "undefined" ? new AbortController() : null;
+ if (f.timeout > 0 && controller) {
+ timeoutId = setTimeout(() => {
+ controller.abort();
+ }, f.timeout);
+ }
+ let options = {
+ method: method,
+ headers: f.headers || {}
+ };
+ if (controller) options.signal = controller.signal;
+ if (method !== "GET" && method !== "HEAD" && typeof f.data !== "undefined") {
+ options.body = f.data;
+ }
+ fetch(f.url, options).then(async response => {
+ if (timeoutId) clearTimeout(timeoutId);
+ let responseCharset = extractCharsetFromContentType(response.headers.get("content-type") || "");
+ let overrideCharset = extractCharsetFromContentType(f.overrideMimeType || "");
+ let requestCharset = extractCharsetFromContentType(getHeaderValue(options.headers, "content-type"));
+ let text;
+ let charsetFromHeaders = responseCharset || overrideCharset || requestCharset;
+ if (charsetFromHeaders) {
+ if (isUtf8Charset(charsetFromHeaders)) {
+ text = await response.text();
+ } else {
+ text = decodeArrayBufferByCharset(await response.arrayBuffer(), charsetFromHeaders);
+ }
+ } else {
+ let rawBuffer = await response.arrayBuffer();
+ let metaCharset = detectCharsetFromHtmlHead(rawBuffer);
+ let targetCharset = metaCharset || charset || "utf-8";
+ if (isUtf8Charset(targetCharset)) {
+ text = new TextDecoder("utf-8").decode(new Uint8Array(rawBuffer));
+ } else {
+ text = decodeArrayBufferByCharset(rawBuffer, targetCharset);
+ }
+ }
+ let headers = "";
+ response.headers.forEach((value, key) => {
+ headers += key + ": " + value + "\r\n";
+ });
+ if (f.onload) {
+ f.onload({
+ response: text,
+ responseText: text,
+ status: response.status,
+ statusText: response.statusText,
+ finalUrl: response.url,
+ responseHeaders: headers
+ });
+ }
+ }).catch(error => {
+ if (timeoutId) clearTimeout(timeoutId);
+ if (error && error.name === "AbortError" && f.ontimeout) {
+ f.ontimeout(error);
+ return;
+ }
+ if (onFetchError) {
+ onFetchError(error);
+ } else if (f.onerror) {
+ f.onerror(error);
+ }
+ });
+ }
+ function isSameOriginRequest(f) {
+ if (!f || !f.url || typeof location === "undefined") return false;
+ try {
+ return new URL(f.url, location.href).origin === location.origin;
+ } catch (e) {
+ return false;
+ }
+ }
+ let nativeGMRequest = null;
if (typeof GM_xmlhttpRequest !== 'undefined') {
- _GM_xmlhttpRequest = GM_xmlhttpRequest;
+ nativeGMRequest = GM_xmlhttpRequest;
} else if (typeof GM !== 'undefined' && typeof GM.xmlHttpRequest !== 'undefined') {
- _GM_xmlhttpRequest = GM.xmlHttpRequest;
+ nativeGMRequest = GM.xmlHttpRequest;
+ }
+ if (nativeGMRequest) {
+ _GM_xmlhttpRequest = function(f) {
+ if (!f) return nativeGMRequest(f);
+ if (isSameOriginRequest(f)) {
+ requestWithFetch(f);
+ return;
+ }
+ let originalOnerror = f.onerror;
+ let request = Object.assign({}, f);
+ request.onerror = function(gmError) {
+ requestWithFetch(f, function(fetchError) {
+ if (originalOnerror) {
+ originalOnerror(fetchError || gmError || {error: "Request failed"});
+ }
+ });
+ };
+ return nativeGMRequest(request);
+ };
} else {
- _GM_xmlhttpRequest = (f) => {fetch(f.url, {method: f.method || 'GET', body: f.data, headers: f.headers}).then(response => response.text()).then(data => {f.onload && f.onload({response: data})}).catch(f.onerror && f.onerror())};
+ _GM_xmlhttpRequest = function(f) {
+ requestWithFetch(f);
+ };
}
if (typeof GM_registerMenuCommand !== 'undefined') {
_GM_registerMenuCommand = GM_registerMenuCommand;
@@ -795,7 +4398,7 @@
} else {
_GM_addStyle = cssStr => {
let styleEle = document.createElement("style");
- styleEle.innerHTML = cssStr;
+ setHTML(styleEle, cssStr);
document.head.appendChild(styleEle);
return styleEle;
};
@@ -901,20 +4504,25 @@
storage.setItem(list, listData);
});
}
- const isMobile = ('ontouchstart' in document.documentElement);
- const configPage = [`https://pagetual.hoothin.com/${lang === 'zh-CN' ? 'cn/' : ''}rule.html`,
+ const isMobile = ('ontouchstart' in document.documentElement && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));
+ const cnConfigPage = "https://pagetual.hoothin.com/cn/rule.html";
+ const configPage = ["https://pagetual.hoothin.com/rule.html",
"https://github.com/hoothin/UserScripts/tree/master/Pagetual",
"https://hoothin.github.io/UserScripts/Pagetual/"];
const firstRunPage = "https://pagetual.hoothin.com/firstRun";
+ const wedataRulesUrl = "http://wedata.net/databases/AutoPagerize/items_all.json";
+ const wedataMirrorRulesUrl = "https://hoothin.github.io/UserScripts/Pagetual/items_all.json";
const guidePage = /^https?:\/\/.*pagetual.*rule\.html/i;
- const ruleImportUrlReg = /greasyfork\.org\/.*scripts\/438684(\-[^\/]*)?(\/discussions|\/?$|\/feedback)|github\.com\/hoothin\/UserScripts\/(tree\/master\/Pagetual|issues)/i;
+ const ruleImportUrlReg = /greasyfork\.org\/.*scripts\/438684(\-[^\/]*)?(\/discussions|\/?$|\/feedback)|github\.com\/hoothin\/UserScripts\/(tree\/master\/Pagetual|issues)|^https:\/\/pagetual\.hoothin\.com\/.*first(Run|-run)\.html/i;
const allOfBody = "body>*";
- const mainSel = "article,.article,[role=main],main,.main,#main";
- const nextTextReg1 = new RegExp("\u005e\u7ffb\u003f\u005b\u4e0b\u540e\u5f8c\u6b21\u005d\u005b\u4e00\u30fc\u0031\u005d\u003f\u005b\u9875\u9801\u5f20\u5f35\u005d\u007c\u005e\u006e\u0065\u0078\u0074\u005b\u005c\u0073\u005f\u002d\u005d\u003f\u0070\u0061\u0067\u0065\u005c\u0073\u002a\u005b\u203a\u003e\u2192\u00bb\u005d\u003f\u0024\u007c\u6b21\u306e\u30da\u30fc\u30b8\u007c\u005e\u6b21\u3078\u003f\u0024\u007c\u0412\u043f\u0435\u0440\u0435\u0434", "i");
- const nextTextReg2 = new RegExp("\u005e\u0028\u005b\u4e0b\u540e\u5f8c\u6b21\u005d\u005b\u4e00\u30fc\u0031\u005d\u003f\u005b\u7ae0\u8bdd\u8a71\u8282\u7bc0\u5e45\u005d\u007c\u006e\u0065\u0078\u0074\u002e\u003f\u0063\u0068\u0061\u0070\u0074\u0065\u0072\u007c\u00bb\u007c\u003e\u003e\u0029\u0028\u005b\u003a\uff1a\u005c\u002d\u005f\u2014\u005c\u0073\u005c\u002e\u3002\u003e\u0023\u00b7\u005c\u005b\u3010\u3001\uff08\u005c\u0028\u002f\u002c\uff0c\uff1b\u003b\u2192\u005d\u007c\u0024\u0029", "i");
- const lazyImgAttr = ["data-lazy-src", "data-lazy", "data-isrc", "data-url", "data-orig-file", "zoomfile", "file", "original", "load-src", "imgsrc", "real_src", "src2", "origin-src", "data-lazyload", "data-lazyload-src", "data-lazy-load-src", "data-ks-lazyload", "data-ks-lazyload-custom", "data-src", "data-defer-src", "data-actualsrc", "data-cover", "data-original", "data-thumb", "data-imageurl", "data-placeholder", "lazysrc"];
- var rulesData = {uninited: true, firstRun: true, sideController: !isMobile}, ruleUrls, updateDate, clickedSth = false, loadNowNum = 5, autoScrollRate = 50;
- var isPause = false, manualPause = false, isHideBar = false, isLoading = false, curPage = 1, forceState = 0, autoScroll = 0, autoScrollInterval, bottomGap = 1000, autoLoadNum = -1, nextIndex = 0, stopScroll = false, clickMode = false, openInNewTab = 0, charset = "UTF-8", charsetValid = true, urlWillChange = false;
+ const mainSel = ["article,.article","[role=main],main,.main,#main","#results"];
+ const nextTextReg1 = new RegExp("\u005e\u7ffb\u003f\u005b\u4e0b\u540e\u5f8c\u6b21\u005d\u005b\u4e00\u30fc\u2500\u0031\u005d\u003f\u005b\u9875\u9801\u5f20\u5f35\u005d\u007c\u005e\u006e\u0065\u0078\u0074\u005b\u005c\u0073\u005f\u002d\u005d\u003f\u0070\u0061\u0067\u0065\u005c\u0073\u002a\u005b\u203a\u003e\u2192\u00bb\u005d\u003f\u0024\u007c\u6b21\u306e\u30da\u30fc\u30b8\u007c\u005e\u6b21\u3078\u0024\u007c\u0412\u043f\u0435\u0440\u0435\u0434\u007c\u005e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435", "i");
+ const nextTextReg2 = new RegExp("\u005e\u0028\u005b\u4e0b\u540e\u5f8c\u6b21\u005d\u005b\u4e00\u30fc\u2500\u0031\u005d\u003f\u005b\u7ae0\u8bdd\u8a71\u8282\u7bc0\u5e45\u005d\u007c\u006e\u0065\u0078\u0074\u002e\u003f\u0063\u0068\u0061\u0070\u0074\u0065\u0072\u0029\u0028\u005b\u003a\uff1a\u005c\u002d\u005f\u2014\u005c\u0073\u005c\u002e\u3002\u003e\u0023\u00b7\u005c\u005b\u3010\u3001\uff08\u005c\u0028\u002f\u002c\uff0c\uff1b\u003b\u2192\u005d\u007c\u0024\u0029", "i");
+ const nextTextReg3 = /^(next\s*(»|>>|>|›|→|❯|\d+)?|>|▶|>|›|→|❯)\s*$/i;
+ const prevReg = new RegExp("\u005e\u005c\u0073\u002a\u0028\u005b\u4e0a\u524d\u9996\u5c3e\u005d\u007c\u0070\u0072\u0065\u0076\u007c\u0065\u006e\u0064\u0029", "i");
+ const lazyImgAttr = ["data-lazy-src", "data-s", "data-lazy", "data-isrc", "data-url", "data-orig-file", "zoomfile", "file", "original", "load-src", "imgsrc", "real_src", "src2", "origin-src", "data-lazyload", "data-lazyload-src", "data-lazy-load-src", "data-ks-lazyload", "data-ks-lazyload-custom", "data-src", "data-defer-src", "data-actualsrc", "data-cover", "data-original", "data-thumb", "data-imageurl", "data-placeholder", "lazysrc"];
+ var rulesData = {uninited: true, firstRun: true, sideController: !isMobile}, ruleUrls, updateDate, loadNowNum = 5, autoScrollRate = 50;
+ var isPause = false, manualPause = false, isHideBar = false, isLoading = false, curPage = 1, forceState = 0, autoScroll = 0, autoScrollInterval, bottomGap = 1000, autoLoadNum = -1, initAutoLoadNum = 0, nextIndex = 0, stopScroll = false, clickMode = false, openInNewTab = 0, charset = "UTF-8", charsetValid = true, urlWillChange = false, hidePageBar = false;
var tryTimes = 0, showedLastPageTips = false, rate = 1, author = '';
function getBody(doc) {
@@ -922,11 +4530,23 @@
}
function getElementByXpath(xpath, doc, contextNode) {
- doc = doc || document;
+ if (doc && doc.ownerDocument) doc = doc.ownerDocument;
+ doc = (doc && doc.evaluate) ? doc : document;
contextNode = contextNode || doc;
try {
- let result = doc.evaluate(xpath, contextNode, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
- return result.singleNodeValue && result.singleNodeValue.nodeType === 1 && result.singleNodeValue;
+ let xpathNode = (s, d, n) => {
+ let result = d.evaluate(s, n, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null);
+ return result.singleNodeValue && result.singleNodeValue.nodeType === 1 && result.singleNodeValue;
+ };
+ let selSplit = xpath.split(" =>> ");
+ if (selSplit.length === 2) {
+ let ele = xpathNode(selSplit[0], doc, contextNode);
+ if (ele && ele.shadowRoot) {
+ return xpathNode(selSplit[1], ele.shadowRoot, ele.shadowRoot);
+ }
+ } else {
+ return xpathNode(xpath, doc, contextNode);
+ }
} catch (err) {
debug(`Invalid xpath: ${xpath}`);
}
@@ -934,7 +4554,8 @@
}
function getAllElementsByXpath(xpath, contextNode, doc) {
- doc = doc || document;
+ if (doc && doc.ownerDocument) doc = doc.ownerDocument;
+ doc = (doc && doc.evaluate) ? doc : document;
contextNode = contextNode || doc;
var result = [];
try {
@@ -960,6 +4581,10 @@
function getAllElements(sel, doc, contextNode) {
try {
+ if (sel.indexOf(" =>> ") !== -1) {
+ let result = getElement(sel, doc, contextNode);
+ return result && [result];
+ }
if (!isXPath(sel)) {
return doc.querySelectorAll(sel);
}
@@ -972,19 +4597,26 @@
function getElement(sel, doc, contextNode, bySort) {
try {
if (!isXPath(sel)) {
+ let checkShadow = s => {
+ let selSplit = s.split(" =>> ");
+ if (selSplit.length === 2) {
+ let ele = doc.querySelector(selSplit[0]);
+ return ele && ele.shadowRoot && ele.shadowRoot.querySelector(selSplit[1]);
+ } else return doc.querySelector(s);
+ };
if (!bySort) {
- return doc.querySelector(sel);
+ return checkShadow(sel);
} else {
let selArr = sel.split(",");
try {
for (let i = 0; i < selArr.length; i++) {
- let ele = doc.querySelector(selArr[i].trim());
+ let ele = checkShadow(selArr[i].trim());
if (ele) {
return ele;
}
}
} catch(e) {
- return doc.querySelector(sel);
+ return checkShadow(sel);
}
return null;
}
@@ -1025,7 +4657,7 @@
let classList = ele.classList;
for (let i = 0; i < classList.length; i++) {
let c = classList[i];
- if (/^[\w\-_]+$/.test(c) && !/\d{4,}/.test(c)) {
+ if (c !== 'scrolling' && /^[a-z_][\w\-_]*$/.test(c) && !/\d{4,}/.test(c)) {
className += '.' + c;
}
}
@@ -1053,7 +4685,7 @@
let classList = prevE.classList;
for (let i = 0; i < classList.length; i++) {
let c = classList[i];
- if (/^[\w\-_]+$/.test(c) && !/\d{4,}/.test(c)) {
+ if (c !== 'scrolling' && /^[a-z_][\w\-_]*$/.test(c) && !/\d{4,}/.test(c)) {
className += '.' + c;
}
}
@@ -1122,12 +4754,211 @@
return segs.length ? '/' + segs.join('/') : null;
}
- const escapeHTMLPolicy = (_unsafeWindow.trustedTypes && _unsafeWindow.trustedTypes.createPolicy) ? _unsafeWindow.trustedTypes.createPolicy('pagetual_default', {
- createHTML: (string, sink) => string
- }) : null;
+ function createHTML(html, doc) {
+ const targetDoc = doc || document;
+ const fragment = targetDoc.createDocumentFragment();
+ if (html === null || html === undefined || html === '') return fragment;
+ parseHTMLToFragment(String(html), fragment, targetDoc);
+ return fragment;
+ }
+ let canDirectSetHTML = true;
+ let canPolicySetHTML = true;
+ let escapeHTMLPolicy;
+ let escapeHTMLCreator;
+ const MY_POLICY_NAME = 'pagetual_default';
+ const SVG_NS = 'http://www.w3.org/2000/svg';
+ const VOID_TAGS = {
+ area: true,
+ base: true,
+ br: true,
+ col: true,
+ embed: true,
+ hr: true,
+ img: true,
+ input: true,
+ link: true,
+ meta: true,
+ param: true,
+ source: true,
+ track: true,
+ wbr: true
+ };
+ const RAW_TEXT_TAGS = {
+ script: true,
+ style: true,
+ textarea: true,
+ title: true,
+ xmp: true,
+ plaintext: true,
+ noscript: true
+ };
+ const HTML_ENTITIES = {
+ amp: '&',
+ lt: '<',
+ gt: '>',
+ quot: '"',
+ apos: "'",
+ nbsp: '\u00A0'
+ };
+ function decodeEntities(text) {
+ return text.replace(/&(#x?[0-9a-fA-F]+|[a-zA-Z]+);/g, function(_, code) {
+ if (code[0] === '#') {
+ const isHex = code[1] === 'x' || code[1] === 'X';
+ const num = parseInt(code.slice(isHex ? 2 : 1), isHex ? 16 : 10);
+ if (!isNaN(num)) {
+ try { return String.fromCodePoint(num); } catch(e) {}
+ }
+ return '&' + code + ';';
+ }
+ const key = code.toLowerCase();
+ return (key in HTML_ENTITIES) ? HTML_ENTITIES[key] : '&' + code + ';';
+ });
+ }
+ function parseHTMLToFragment(html, fragment, doc) {
+ const stack = [fragment];
+ const tokenRe = /|]*>|<\/?[a-zA-Z][^>]*>|[^<]+/gi;
+ let match;
+ while ((match = tokenRe.exec(html))) {
+ const token = match[0];
+ if (token[0] !== '<') {
+ const text = decodeEntities(token);
+ if (text) stack[stack.length - 1].appendChild(doc.createTextNode(text));
+ continue;
+ }
+ if (token.indexOf('|]*>|<\/?[a-zA-Z][^>]*>|[^<]+/gi;
+ let match;
+ while ((match = tokenRe.exec(html))) {
+ const token = match[0];
+ if (token[0] !== '<') {
+ const text = decodeEntities(token);
+ if (text) stack[stack.length - 1].appendChild(doc.createTextNode(text));
+ continue;
+ }
+ if (token.indexOf('|]*>|<\/?[a-zA-Z][^>]*>|[^<]+/gi;
+ let match;
+ while ((match = tokenRe.exec(html))) {
+ const token = match[0];
+ if (token[0] !== '<') {
+ const text = decodeEntities(token);
+ if (text) stack[stack.length - 1].appendChild(doc.createTextNode(text));
+ continue;
+ }
+ if (token.indexOf('0){
- if(char_f[x])processChar=char_f[x]+processChar;
+ if (!char_f[x]) break;
+ processChar=char_f[x]+processChar;
+ x++;
}
x=0;
while(badd-->0){
- if(char_b[x])processChar+=char_b[x];
+ if (!char_b[x]) break;
+ processChar+=char_b[x];
+ x++;
}
if(processChar.indexOf(curOther) != -1){
newChar=otherChar;
@@ -948,11 +944,15 @@
var curOther=others[k],fadd=curOther.indexOf(char),badd=curOther.length-1-fadd,x=0;
var processChar=char;
while(fadd-->0){
- if(char_f[x])processChar=char_f[x]+processChar;
+ if (!char_f[x]) break;
+ processChar=char_f[x]+processChar;
+ x++;
}
x=0;
while(badd-->0){
- if(char_b[x])processChar+=char_b[x];
+ if (!char_b[x]) break;
+ processChar+=char_b[x];
+ x++;
}
if(processChar.indexOf(curOther) != -1){
newChar=otherChar;
@@ -1126,6 +1126,17 @@
_unsafeWindow.tc2sc = simplized;
_unsafeWindow.sc2tc = traditionalized;
+ window.addEventListener("message", function(event) {
+ if (event.data && event.data.type === "switchChineseRequest") {
+ const receivedData = event.data.payload;
+ const result = receivedData.target === 'sc' ? simplized(receivedData.str) : traditionalized(receivedData.str);
+ window.postMessage({
+ type: "switchChineseResult",
+ payload: result
+ }, "*");
+ }
+ });
+
var storage = {
supportGM: typeof GM_getValue == 'function' && typeof GM_getValue('a', 'b') != 'undefined',
supportGMPromise: typeof GM != 'undefined' && typeof GM.getValue == 'function' && typeof GM.getValue('a','b') != 'undefined',
@@ -1221,14 +1232,14 @@
curLang = isSimple;
}
curLang=!curLang;
- activeEle.innerHTML=curLang?traditionalized(activeEle.innerHTML):simplized(activeEle.innerHTML);
- activeEle.value=curLang?traditionalized(activeEle.value):simplized(activeEle.value);
+ activeEle.innerHTML=curLang?simplized(activeEle.innerHTML):traditionalized(activeEle.innerHTML);
+ activeEle.value=curLang?simplized(activeEle.value):traditionalized(activeEle.value);
}else if("INPUT"==activeEle.nodeName.toUpperCase()){
if (curInput != activeEle) {
curLang = isSimple;
}
curLang=!curLang;
- activeEle.value=curLang?traditionalized(activeEle.value):simplized(activeEle.value);
+ activeEle.value=curLang?simplized(activeEle.value):traditionalized(activeEle.value);
}else{
var selecter;
if(window.getSelection()){
@@ -1279,19 +1290,23 @@
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
var observer = new MutationObserver(function(records) {
records.map(function(record) {
+ let target = record.target;
+ let parentNode = target && target.parentNode;
+ while (target) {
+ if (/TEXTAREA/i.test(target.nodeName)) return;
+ if (/INPUT/i.test(target.nodeName) && (target.value === "" || target.type === "text" || target.type === "search" || target.type === "hidden")) {
+ return;
+ }
+ if (target.contentEditable == 'true') return;
+ if (target.nodeName.toUpperCase() == 'BODY') {
+ break;
+ }
+ target = target.parentNode;
+ }
if (record.type === "characterData") {
- let target = record.target;
- let parentNode = target && target.parentNode;
if (!parentNode) {
return;
}
- while (target) {
- if (target.contentEditable == 'true') return;
- if (target.nodeName.toUpperCase() == 'BODY') {
- break;
- }
- target = target.parentNode;
- }
transTask(parentNode);
}
if(record.addedNodes){
@@ -1355,7 +1370,7 @@
let autoInput = createCheckbox('總是自動切換', auto);
let notificationInput = createCheckbox('切換成功通知', notification);
let enablePinyinInput = createCheckbox('啟用拼音顯示', !disablePinyin);
- let keyCallNotSaveInput = createCheckbox('用快捷鍵切換時不記錄選擇', keyCallNotSave);
+ let keyCallNotSaveInput = createCheckbox('用快速鍵切換時不記憶選擇', keyCallNotSave);
let defaultSimple = document.createElement('select');
let cnOption = document.createElement('option');
@@ -1383,7 +1398,7 @@
shortcutCon.style.alignItems = 'center';
let shortcutTitle = document.createElement('h3');
shortcutTitle.style.margin = '5px 0';
- shortcutTitle.innerText = '繁簡切換快捷鍵:';
+ shortcutTitle.innerText = '繁簡切換快速鍵:';
shortcutCon.appendChild(shortcutTitle);
let shortcutInput = document.createElement('input');
shortcutInput.style.height = '20px';
@@ -1412,7 +1427,7 @@
pinyinShortcutCon.style.alignItems = 'center';
let pinyinShortcutTitle = document.createElement('h3');
pinyinShortcutTitle.style.margin = '5px 0';
- pinyinShortcutTitle.innerText = '顯示拼音快捷鍵:';
+ pinyinShortcutTitle.innerText = '顯示拼音快速鍵:';
pinyinShortcutCon.appendChild(pinyinShortcutTitle);
let pinyinShortcutInput = document.createElement('input');
pinyinShortcutInput.style.height = '20px';
@@ -1486,7 +1501,7 @@
let customTermTitle = document.createElement('h3');
customTermTitle.style.margin = '5px 0';
- customTermTitle.innerText = '自定義簡繁用語轉換(可透過通配符設置生效網址範圍):';
+ customTermTitle.innerText = '自訂簡繁用語轉換(可透過通配符設定生效網址範圍):';
let addNewGlob1 = document.createElement('button');
addNewGlob1.innerText = '添加生效網站';
@@ -1558,7 +1573,7 @@
let customIlliteracyTitle = document.createElement('h3');
customIlliteracyTitle.style.margin = '5px 0';
- customIlliteracyTitle.innerText = '通用字詞轉換(可透過通配符設置生效網址範圍):';
+ customIlliteracyTitle.innerText = '通用字詞轉換(可透過通配符設定生效網址範圍):';
let addNewGlob2 = document.createElement('button');
addNewGlob2.innerText = '添加生效網站';
addNewGlob2.addEventListener("click", function(e) {
@@ -1650,7 +1665,7 @@
});
let buttonCon = document.createElement('div');
let saveBtn = document.createElement('button');
- saveBtn.innerText = '保存設置';
+ saveBtn.innerText = '保存設定';
saveBtn.style.display = 'block';
saveBtn.style.fontSize = 'x-large';
saveBtn.style.fontWeight = 'bold';
@@ -1713,17 +1728,21 @@
storage.setItem('sc2tcCombConfig', sc2tcCombConfig);
} catch (e) {
console.log(e);
+ alert("自訂簡繁用語轉換格式錯誤:" + e);
+ return;
}
try {
illiteracyConfig = customIlliteracyInput.value ? JSON.parse(customIlliteracyInput.value) : "";
storage.setItem('illiteracyConfig', illiteracyConfig);
} catch (e) {
console.log(e);
+ alert("通用字詞轉換格式錯誤:" + e);
+ return;
}
storage.setItem('sc2tcCombTree', "");
storage.setItem('tc2scCombTree', "");
storage.setItem('fuckIlliteracyTree', "");
- alert('保存設置成功!');
+ alert('保存設定成功!');
location.reload();
});
buttonCon.appendChild(saveBtn);
@@ -1756,7 +1775,7 @@
baseCon.appendChild(testTitle);
let testInput = document.createElement('textarea');
testInput.style.width = '100%';
- testInput.setAttribute('placeholder', "輸入文字后,按下快捷鍵");
+ testInput.setAttribute('placeholder', "輸入文字后,按下快速鍵");
testInput.onclick = e => {
if (!testInput.style.height) {
testInput.style.height = "80vh";
@@ -1885,39 +1904,54 @@
sc2tcCombTree = values.sc2tcCombTree;
tc2scCombTree = values.tc2scCombTree;
} else {
- for(let key in sc2tcComb){
- let value=sc2tcComb[key];
+ function makeCombTree(key, value) {
let curTree=sc2tcCombTree;
for(let i=0;i {
+ makeCombTree(key, v);
+ });
+ } else {
+ makeCombTree(key, value);
+ }
+ }
storage.setItem("sc2tcCombTree", sc2tcCombTree);
storage.setItem("tc2scCombTree", tc2scCombTree);
}
diff --git a/Switch Traditional Chinese and Simplified Chinese/lib/package.json b/Switch Traditional Chinese and Simplified Chinese/lib/package.json
new file mode 100644
index 00000000000..489310114ed
--- /dev/null
+++ b/Switch Traditional Chinese and Simplified Chinese/lib/package.json
@@ -0,0 +1,70 @@
+{
+ "name": "switch-chinese",
+ "version": "1.0.16",
+ "description": "繁簡轉換,支援簡繁雙向轉換、智慧分詞、自訂詞庫、文字偵測及多種輸出格式,零依賴。 Lightweight Chinese converter library for conversion between Simplified and Traditional Chinese. 轻量级简繁体中文智能转换库,支持简繁双向转换、智能分词、自定义词库、文本检测及多种输出格式,零依赖。",
+ "main": "stcasc.lib.js",
+ "types": "stcasc.d.ts",
+ "type": "module",
+ "exports": {
+ ".": {
+ "import": "./stcasc.lib.js",
+ "types": "./stcasc.d.ts"
+ }
+ },
+ "files": [
+ "stcasc.lib.js",
+ "stcasc.d.ts",
+ "readme.md"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/hoothin/UserScripts.git#master"
+ },
+ "keywords": [
+ "chinese",
+ "converter",
+ "traditional",
+ "simplified",
+ "chinese-converter",
+ "simplified-chinese",
+ "traditional-chinese",
+ "chinese-translation",
+ "chinese-detection",
+ "character-detection",
+ "text-converter",
+ "language-converter",
+ "i18n",
+ "localization",
+ "ruby-annotation",
+ "简繁转换",
+ "簡繁轉換",
+ "简繁切换",
+ "簡繁切換",
+ "繁简转换",
+ "繁簡轉換",
+ "繁简切换",
+ "繁簡切換",
+ "简体中文",
+ "繁体中文",
+ "簡體中文",
+ "繁體中文",
+ "正體中文",
+ "中文转换",
+ "中文检测",
+ "一简多繁",
+ "智能分词",
+ "自定义词库",
+ "零依赖",
+ "轻量级"
+ ],
+ "author": "Hoothin",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/hoothin/UserScripts/issues"
+ },
+ "homepage": "https://github.com/hoothin/UserScripts/tree/master/Switch%20Traditional%20Chinese%20and%20Simplified%20Chinese/lib",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+}
+
diff --git a/Switch Traditional Chinese and Simplified Chinese/lib/readme.md b/Switch Traditional Chinese and Simplified Chinese/lib/readme.md
new file mode 100644
index 00000000000..670521a96db
--- /dev/null
+++ b/Switch Traditional Chinese and Simplified Chinese/lib/readme.md
@@ -0,0 +1,1082 @@
+# switch-chinese
+
+[Online Demo](https://tool.hoothin.com/chinese-converter)
+
+[简体中文](#简体中文) | [繁體中文](#繁體中文) | [English](#english)
+
+---
+
+## 简体中文
+
+简繁体中文转换库 - 支持简体中文与繁体中文双向转换,基于词组的智能分词处理「一简多繁」问题
+
+[](https://www.npmjs.com/package/switch-chinese) [](https://www.npmjs.com/package/switch-chinese)
+
+### 特性
+
+- **轻量级**:零依赖,体积小,性能优异
+- **智能转换**:支持基于词组的智能分词和「一简多繁」精准转换
+- **多种数据类型**:支持字符串、数组、对象的转换,自动递归处理嵌套结构
+- **自定义词库**:允许用户自定义简繁转换词汇
+- **缓存机制**:支持字典缓存,避免重复初始化
+- **简繁检测**:自动检测文本是简体中文、繁体中文还是未知类型
+- **术语转换**:内置大陆简体与台湾正体的常用术语转换
+- **无依赖**:纯 JavaScript 实现,无需任何第三方依赖
+
+### 安装
+
+使用 npm 安装:
+
+```bash
+npm install switch-chinese
+```
+
+使用 yarn 安装:
+
+```bash
+yarn add switch-chinese
+```
+
+### 快速开始
+
+#### 基础用法
+
+```javascript
+import stcasc from 'switch-chinese';
+
+const { traditionalized, simplized, detect } = stcasc();
+
+// 简体转繁体
+const tc = traditionalized('简繁转换 繁简切换 香烟 香烟袅袅');
+console.log(tc);
+// 输出: 簡繁轉換 繁簡切換 香菸 香煙裊裊
+
+// 繁体转简体
+const sc = simplized('繁體中文');
+console.log(sc);
+// 输出: 繁体中文
+```
+
+#### 检测中文类型
+
+```javascript
+import stcasc, { ChineseType } from 'switch-chinese';
+
+const { detect } = stcasc();
+
+const type1 = detect('简体中文');
+if (type1 === ChineseType.SIMPLIFIED) {
+ console.log('检测到简体中文');
+}
+
+const type2 = detect('繁體中文');
+if (type2 === ChineseType.TRADITIONAL) {
+ console.log('检测到繁体中文');
+}
+
+const type3 = detect('English');
+if (type3 === ChineseType.UNKNOWN) {
+ console.log('未检测到中文');
+}
+```
+
+ChineseType 枚举值:
+- `ChineseType.SIMPLIFIED` (0): 简体中文
+- `ChineseType.TRADITIONAL` (1): 繁体中文
+- `ChineseType.UNKNOWN` (2): 未知类型
+
+#### 转换数组和对象
+
+库支持转换数组和对象中的所有字符串,非字符串值保持原样:
+
+```javascript
+import stcasc from 'switch-chinese';
+
+const { traditionalized, simplized } = stcasc();
+
+// 转换数组
+const arr = ['简体中文', '软件', '网络', 123, true, null];
+const arrTc = traditionalized(arr);
+console.log(arrTc);
+// 输出: ['簡體中文', '軟體', '網路', 123, true, null]
+
+// 转换对象
+const obj = {
+ title: '简体中文标题',
+ description: '这是一个简体中文描述',
+ count: 100,
+ active: true,
+ tags: ['软件', '网络', '服务器']
+};
+const objTc = traditionalized(obj);
+console.log(objTc);
+// 输出: {
+// title: '簡體中文標題',
+// description: '這是一個簡體中文描述',
+// count: 100,
+// active: true,
+// tags: ['軟體', '網路', '伺服器']
+// }
+
+// 转换嵌套结构
+const nested = {
+ user: {
+ name: '简体名称',
+ profile: {
+ bio: '这是简体中文简介',
+ skills: ['软件开发', '网络管理']
+ }
+ },
+ count: 42
+};
+const nestedTc = traditionalized(nested);
+// 所有字符串属性值都会被转换,数字等其他类型保持不变
+```
+
+### 高级用法
+
+#### 使用缓存优化性能
+
+在多次调用时,建议使用缓存机制避免重复生成字典,提升性能:
+
+```javascript
+import stcasc from 'switch-chinese';
+
+// 第一次调用,生成字典
+let converter = stcasc();
+const cache = converter.cache;
+
+// 保存缓存到持久化存储(如 localStorage、文件等)
+localStorage.setItem('stcasc-cache', JSON.stringify(cache));
+
+// 后续调用,直接使用缓存
+const cachedData = JSON.parse(localStorage.getItem('stcasc-cache'));
+converter = stcasc(cachedData);
+
+// 现在可以直接使用,无需重新生成字典
+const result = converter.traditionalized('简体中文');
+```
+
+#### 自定义简繁转换词库
+
+可以根据业务需求自定义简繁转换规则:
+
+```javascript
+import stcasc from 'switch-chinese';
+
+const customDict = {
+ '身份': '身分',
+ '转义': '跳脫',
+ '转换': '轉檔',
+ '软件': '軟體',
+ '硬件': '硬體',
+ '网络': '網路',
+ '服务器': '伺服器'
+};
+
+const { traditionalized, simplized } = stcasc({}, customDict);
+
+console.log(traditionalized('软件转换'));
+// 输出: 軟體轉檔(使用自定义词库)
+```
+
+#### 禁用术语转换
+
+默认情况下,库会转换一些特定术语(如「知识产权」→「智慧財產權」)。如需禁用此功能:
+
+```javascript
+import stcasc from 'switch-chinese';
+
+// 第三个参数设置为 true 以禁用术语转换
+const { traditionalized } = stcasc({}, {}, true);
+
+console.log(traditionalized('知识产权'));
+// 输出: 知識産權(仅做字符转换,不转换术语)
+```
+
+#### 输出格式选项
+
+库支持多种输出格式:
+
+```javascript
+import stcasc, { OutputFormat } from 'switch-chinese';
+
+const { traditionalized } = stcasc();
+
+// 普通格式(默认)
+const normal = traditionalized('简体中文');
+// 输出: 簡體中文
+
+// 括号格式:同时显示原文和转换后的文本
+const bracket = traditionalized('简体中文', { format: OutputFormat.BRACKET });
+// 输出: 簡(简)體(体)中文
+
+// Ruby 注音格式:适用于 HTML 显示
+const ruby = traditionalized('简体中文', { format: OutputFormat.RUBY });
+// 输出: 簡體中文
+```
+
+OutputFormat 枚举值:
+- `OutputFormat.NORMAL` (0): 只输出转换后的结果(默认)
+- `OutputFormat.BRACKET` (1): 输出「转换(原文)」格式
+- `OutputFormat.RUBY` (2): 输出 `` HTML 标签格式
+
+### API 文档
+
+#### stcasc(cache?, custom?, disableTerms?)
+
+主函数,用于创建转换器实例。
+
+**参数:**
+
+- `cache` (Object, 可选): 缓存对象,用于避免重复生成字典
+- `custom` (Object, 可选): 自定义简繁转换词库
+- `disableTerms` (Boolean, 可选): 是否禁用术语转换,默认 `false`
+
+**返回值:**
+
+返回包含以下方法的对象:
+
+- `traditionalized(input, options?)`: 将简体中文转换为繁体中文
+ - `input`: 可以是字符串、数组或对象
+ - 字符串:直接转换返回新字符串
+ - 数组:转换所有字符串元素,其他类型保持不变
+ - 对象:递归转换所有字符串属性值,其他类型保持不变
+- `simplized(input, options?)`: 将繁体中文转换为简体中文
+ - `input`: 可以是字符串、数组或对象
+ - 支持的数据类型同 `traditionalized`
+- `detect(text)`: 检测文本的中文类型,返回 ChineseType 枚举值
+- `cache`: 字典缓存对象
+
+**Options 参数:**
+
+- `format` (Number, 可选): 输出格式,使用 `OutputFormat` 常量
+
+#### ChineseType
+
+导出的常量对象,用于表示中文类型检测结果:
+
+```javascript
+export const ChineseType = {
+ SIMPLIFIED: 0, // 简体中文
+ TRADITIONAL: 1, // 繁体中文
+ UNKNOWN: 2 // 未知类型
+};
+```
+
+#### OutputFormat
+
+导出的常量对象,用于表示输出格式选项:
+
+```javascript
+export const OutputFormat = {
+ NORMAL: 0, // 只输出转换后的结果
+ BRACKET: 1, // 输出「转换(原文)」格式
+ RUBY: 2 // 输出 HTML 标签格式
+};
+```
+
+### 转换示例
+
+#### 智能词组转换
+
+该库支持基于上下文的智能词组转换,能够正确处理「一简多繁」的情况:
+
+```javascript
+const { traditionalized } = stcasc();
+
+// 智能识别词组边界
+console.log(traditionalized('香烟袅袅'));
+// 输出: 香煙裊裊
+
+console.log(traditionalized('里长面子'));
+// 输出: 里長面子(「里长」是职务名称)
+
+console.log(traditionalized('吃干面'));
+// 输出: 吃乾麵(「干面」是食物)
+
+console.log(traditionalized('把考卷发回来'));
+// 输出: 把考卷發回來(「发」是动词)
+
+console.log(traditionalized('卷发'));
+// 输出: 捲髮(「卷发」是发型)
+```
+
+#### 术语转换
+
+内置常用的大陆简体与台湾正体术语转换:
+
+```javascript
+const { traditionalized } = stcasc();
+
+console.log(traditionalized('知识产权'));
+// 输出: 智慧財產權
+
+console.log(traditionalized('计算机软件'));
+// 输出: 計算機軟體
+
+console.log(traditionalized('网络服务器'));
+// 输出: 網路伺服器
+```
+
+### 技术特点
+
+#### 高性能
+
+- 使用字典树(Trie)优化词组匹配
+- 支持缓存机制,避免重复初始化
+- 纯 JavaScript 实现,执行效率高
+
+#### 准确转换
+
+- 内置大量简繁对照字符
+- 支持「一简多繁」智能识别
+- 基于词组的上下文分析
+
+#### 易于集成
+
+- ES Module 标准导出
+- TypeScript 类型支持(通过常量枚举)
+- 零依赖,兼容性好
+
+### 浏览器支持
+
+支持所有现代浏览器及 Node.js 环境:
+
+- Chrome
+- Firefox
+- Safari
+- Edge
+- Node.js 12+
+
+### 开源协议
+
+MIT License
+
+### 相关链接
+
+- [GitHub 仓库](https://github.com/hoothin/UserScripts/tree/master/Switch%20Traditional%20Chinese%20and%20Simplified%20Chinese/lib)
+- [NPM 包地址](https://www.npmjs.com/package/switch-chinese)
+- [问题反馈](https://github.com/hoothin/UserScripts/issues)
+
+### 关键词
+
+简繁转换, 繁简转换, 简体中文, 繁体中文, 正体中文, 中文转换, 一简多繁, 简繁切换, 繁简切换, 中文检测, 智能分词, 自定义词库, 零依赖, 轻量级
+
+---
+
+## English
+
+Lightweight Chinese converter library for bidirectional conversion between Simplified and Traditional Chinese with intelligent word segmentation and one-to-many character mapping support.
+
+[](https://www.npmjs.com/package/switch-chinese) [](https://www.npmjs.com/package/switch-chinese)
+
+### Features
+
+- **Lightweight**: Zero dependencies, small footprint, excellent performance
+- **Intelligent Conversion**: Context-aware word segmentation and accurate one-to-many character mapping
+- **Multiple Data Types**: Supports string, array, and object conversion with automatic recursive processing
+- **Custom Dictionary**: User-defined conversion rules support
+- **Caching Mechanism**: Dictionary caching to avoid repeated initialization
+- **Text Detection**: Automatic detection of Simplified Chinese, Traditional Chinese, or unknown text
+- **Term Conversion**: Built-in mainland China and Taiwan terminology mapping
+- **Zero Dependencies**: Pure JavaScript implementation, no third-party dependencies required
+
+### Installation
+
+Install via npm:
+
+```bash
+npm install switch-chinese
+```
+
+Install via yarn:
+
+```bash
+yarn add switch-chinese
+```
+
+### Quick Start
+
+#### Basic Usage
+
+```javascript
+import stcasc from 'switch-chinese';
+
+const { traditionalized, simplized, detect } = stcasc();
+
+// Simplified to Traditional
+const tc = traditionalized('简繁转换 繁简切换 香烟 香烟袅袅');
+console.log(tc);
+// Output: 簡繁轉換 繁簡切換 香菸 香煙裊裊
+
+// Traditional to Simplified
+const sc = simplized('繁體中文');
+console.log(sc);
+// Output: 繁体中文
+```
+
+#### Text Detection
+
+```javascript
+import stcasc, { ChineseType } from 'switch-chinese';
+
+const { detect } = stcasc();
+
+const type1 = detect('简体中文');
+if (type1 === ChineseType.SIMPLIFIED) {
+ console.log('Detected Simplified Chinese');
+}
+
+const type2 = detect('繁體中文');
+if (type2 === ChineseType.TRADITIONAL) {
+ console.log('Detected Traditional Chinese');
+}
+
+const type3 = detect('English');
+if (type3 === ChineseType.UNKNOWN) {
+ console.log('No Chinese text detected');
+}
+```
+
+ChineseType enumeration values:
+- `ChineseType.SIMPLIFIED` (0): Simplified Chinese
+- `ChineseType.TRADITIONAL` (1): Traditional Chinese
+- `ChineseType.UNKNOWN` (2): Unknown type
+
+#### Converting Arrays and Objects
+
+The library supports converting all strings in arrays and objects, while preserving non-string values:
+
+```javascript
+import stcasc from 'switch-chinese';
+
+const { traditionalized, simplized } = stcasc();
+
+// Convert array
+const arr = ['简体中文', '软件', '网络', 123, true, null];
+const arrTc = traditionalized(arr);
+console.log(arrTc);
+// Output: ['簡體中文', '軟體', '網路', 123, true, null]
+
+// Convert object
+const obj = {
+ title: '简体中文标题',
+ description: '这是一个简体中文描述',
+ count: 100,
+ active: true,
+ tags: ['软件', '网络', '服务器']
+};
+const objTc = traditionalized(obj);
+console.log(objTc);
+// Output: {
+// title: '簡體中文標題',
+// description: '這是一個簡體中文描述',
+// count: 100,
+// active: true,
+// tags: ['軟體', '網路', '伺服器']
+// }
+
+// Convert nested structures
+const nested = {
+ user: {
+ name: '简体名称',
+ profile: {
+ bio: '这是简体中文简介',
+ skills: ['软件开发', '网络管理']
+ }
+ },
+ count: 42
+};
+const nestedTc = traditionalized(nested);
+// All string property values will be converted, other types remain unchanged
+```
+
+### Advanced Usage
+
+#### Performance Optimization with Caching
+
+For multiple conversions, use caching mechanism to improve performance:
+
+```javascript
+import stcasc from 'switch-chinese';
+
+// First call, generate dictionary
+let converter = stcasc();
+const cache = converter.cache;
+
+// Save cache to persistent storage (e.g., localStorage, file system)
+localStorage.setItem('stcasc-cache', JSON.stringify(cache));
+
+// Subsequent calls, use cached data
+const cachedData = JSON.parse(localStorage.getItem('stcasc-cache'));
+converter = stcasc(cachedData);
+
+// Now you can use it directly without regenerating dictionary
+const result = converter.traditionalized('简体中文');
+```
+
+#### Custom Conversion Dictionary
+
+Customize conversion rules according to your needs:
+
+```javascript
+import stcasc from 'switch-chinese';
+
+const customDict = {
+ '身份': '身分',
+ '转义': '跳脫',
+ '转换': '轉檔',
+ '软件': '軟體',
+ '硬件': '硬體',
+ '网络': '網路',
+ '服务器': '伺服器'
+};
+
+const { traditionalized, simplized } = stcasc({}, customDict);
+
+console.log(traditionalized('软件转换'));
+// Output: 軟體轉檔 (using custom dictionary)
+```
+
+#### Disable Term Conversion
+
+By default, the library converts specific terms (e.g., "知识产权" → "智慧財產權"). To disable this feature:
+
+```javascript
+import stcasc from 'switch-chinese';
+
+// Set the third parameter to true to disable term conversion
+const { traditionalized } = stcasc({}, {}, true);
+
+console.log(traditionalized('知识产权'));
+// Output: 知識産權 (character conversion only, no term conversion)
+```
+
+#### Output Formats
+
+The library supports multiple output formats:
+
+```javascript
+import stcasc, { OutputFormat } from 'switch-chinese';
+
+const { traditionalized } = stcasc();
+
+// Normal format (default)
+const normal = traditionalized('简体中文');
+// Output: 簡體中文
+
+// Bracket format: shows both original and converted text
+const bracket = traditionalized('简体中文', { format: OutputFormat.BRACKET });
+// Output: 簡(简)體(体)中文
+
+// Ruby annotation format: for HTML display
+const ruby = traditionalized('简体中文', { format: OutputFormat.RUBY });
+// Output: 簡體中文
+```
+
+OutputFormat enumeration values:
+- `OutputFormat.NORMAL` (0): Output converted result only (default)
+- `OutputFormat.BRACKET` (1): Output in "converted(original)" format
+- `OutputFormat.RUBY` (2): Output in `` HTML tag format
+
+### API Reference
+
+#### stcasc(cache?, custom?, disableTerms?)
+
+Main function to create a converter instance.
+
+**Parameters:**
+
+- `cache` (Object, optional): Cache object to avoid regenerating dictionary
+- `custom` (Object, optional): Custom Simplified-Traditional conversion dictionary
+- `disableTerms` (Boolean, optional): Whether to disable term conversion, default `false`
+
+**Returns:**
+
+An object containing the following methods:
+
+- `traditionalized(input, options?)`: Convert Simplified Chinese to Traditional Chinese
+ - `input`: Can be a string, array, or object
+ - String: Directly converts and returns a new string
+ - Array: Converts all string elements, other types remain unchanged
+ - Object: Recursively converts all string property values, other types remain unchanged
+- `simplized(input, options?)`: Convert Traditional Chinese to Simplified Chinese
+ - `input`: Can be a string, array, or object
+ - Supports the same data types as `traditionalized`
+- `detect(text)`: Detect Chinese text type, returns ChineseType enumeration value
+- `cache`: Dictionary cache object
+
+**Options parameter:**
+
+- `format` (Number, optional): Output format, use `OutputFormat` constants
+
+#### ChineseType
+
+Exported constant object representing text detection results:
+
+```javascript
+export const ChineseType = {
+ SIMPLIFIED: 0, // Simplified Chinese
+ TRADITIONAL: 1, // Traditional Chinese
+ UNKNOWN: 2 // Unknown type
+};
+```
+
+#### OutputFormat
+
+Exported constant object representing output format options:
+
+```javascript
+export const OutputFormat = {
+ NORMAL: 0, // Output converted result only
+ BRACKET: 1, // Output "converted(original)" format
+ RUBY: 2 // Output HTML tag format
+};
+```
+
+### Conversion Examples
+
+#### Intelligent Word Segmentation
+
+The library supports context-aware intelligent word segmentation, accurately handling one-to-many character mappings:
+
+```javascript
+const { traditionalized } = stcasc();
+
+// Intelligent phrase boundary recognition
+console.log(traditionalized('香烟袅袅'));
+// Output: 香煙裊裊
+
+console.log(traditionalized('里长面子'));
+// Output: 里長面子 ("里长" is a position title)
+
+console.log(traditionalized('吃干面'));
+// Output: 吃乾麵 ("干面" is a food)
+
+console.log(traditionalized('把考卷发回来'));
+// Output: 把考卷發回來 ("发" is a verb in this context)
+
+console.log(traditionalized('卷发'));
+// Output: 捲髮 ("卷发" is a hairstyle)
+```
+
+#### Term Conversion
+
+Built-in conversion for common mainland China and Taiwan terminology:
+
+```javascript
+const { traditionalized } = stcasc();
+
+console.log(traditionalized('知识产权'));
+// Output: 智慧財產權
+
+console.log(traditionalized('计算机软件'));
+// Output: 計算機軟體
+
+console.log(traditionalized('网络服务器'));
+// Output: 網路伺服器
+```
+
+### Technical Highlights
+
+#### High Performance
+
+- Dictionary tree (Trie) optimization for phrase matching
+- Caching mechanism support to avoid repeated initialization
+- Pure JavaScript implementation for high execution efficiency
+
+#### Accurate Conversion
+
+- Extensive built-in Simplified-Traditional character mappings
+- Intelligent recognition for one-to-many character conversions
+- Context-based phrase analysis
+
+#### Easy Integration
+
+- ES Module standard export
+- TypeScript support through constant enumerations
+- Zero dependencies, excellent compatibility
+
+### Browser Support
+
+Supports all modern browsers and Node.js environments:
+
+- Chrome
+- Firefox
+- Safari
+- Edge
+- Node.js 12+
+
+### License
+
+MIT License
+
+### Links
+
+- [GitHub Repository](https://github.com/hoothin/UserScripts/tree/master/Switch%20Traditional%20Chinese%20and%20Simplified%20Chinese/lib)
+- [NPM Package](https://www.npmjs.com/package/switch-chinese)
+- [Issue Tracker](https://github.com/hoothin/UserScripts/issues)
+
+### Keywords
+
+Chinese Converter, Simplified Chinese, Traditional Chinese, Chinese Translation, Character Detection, Text Converter, Language Converter, i18n, Localization, Ruby Annotation, One-to-Many Mapping, Intelligent Word Segmentation, Custom Dictionary, Zero Dependencies, Lightweight
+
+---
+
+## 繁體中文
+
+簡繁體中文智能轉換庫 - 支援簡體中文與正體中文雙向轉換,基於詞組的智能分詞處理「一簡多繁」問題
+
+[](https://www.npmjs.com/package/switch-chinese) [](https://www.npmjs.com/package/switch-chinese)
+
+### 特色
+
+- **輕量級**:零依賴,體積小,效能優異
+- **智能轉換**:支援基於詞組的智能分詞和「一簡多繁」精準轉換
+- **多種資料類型**:支援字串、陣列、物件的轉換,自動遞迴處理巢狀結構
+- **自訂詞庫**:允許使用者自訂簡繁轉換詞彙
+- **快取機制**:支援字典快取,避免重複初始化
+- **簡繁檢測**:自動檢測文字是簡體中文、繁體中文還是未知類型
+- **術語轉換**:內建大陸簡體與台灣正體的常用術語轉換
+- **無依賴**:純 JavaScript 實現,無需任何第三方依賴
+
+### 安裝
+
+使用 npm 安裝:
+
+```bash
+npm install switch-chinese
+```
+
+使用 yarn 安裝:
+
+```bash
+yarn add switch-chinese
+```
+
+### 快速開始
+
+#### 基礎用法
+
+```javascript
+import stcasc from 'switch-chinese';
+
+const { traditionalized, simplized, detect } = stcasc();
+
+// 簡體轉繁體
+const tc = traditionalized('简繁转换 繁简切换 香烟 香烟袅袅');
+console.log(tc);
+// 輸出: 簡繁轉換 繁簡切換 香菸 香煙裊裊
+
+// 繁體轉簡體
+const sc = simplized('繁體中文');
+console.log(sc);
+// 輸出: 繁体中文
+```
+
+#### 檢測中文類型
+
+```javascript
+import stcasc, { ChineseType } from 'switch-chinese';
+
+const { detect } = stcasc();
+
+const type1 = detect('简体中文');
+if (type1 === ChineseType.SIMPLIFIED) {
+ console.log('檢測到簡體中文');
+}
+
+const type2 = detect('繁體中文');
+if (type2 === ChineseType.TRADITIONAL) {
+ console.log('檢測到繁體中文');
+}
+
+const type3 = detect('English');
+if (type3 === ChineseType.UNKNOWN) {
+ console.log('未檢測到中文');
+}
+```
+
+ChineseType 列舉值:
+- `ChineseType.SIMPLIFIED` (0): 簡體中文
+- `ChineseType.TRADITIONAL` (1): 繁體中文
+- `ChineseType.UNKNOWN` (2): 未知類型
+
+#### 轉換陣列和物件
+
+函式庫支援轉換陣列和物件中的所有字串,非字串值保持原樣:
+
+```javascript
+import stcasc from 'switch-chinese';
+
+const { traditionalized, simplized } = stcasc();
+
+// 轉換陣列
+const arr = ['简体中文', '软件', '网络', 123, true, null];
+const arrTc = traditionalized(arr);
+console.log(arrTc);
+// 輸出: ['簡體中文', '軟體', '網路', 123, true, null]
+
+// 轉換物件
+const obj = {
+ title: '简体中文标题',
+ description: '这是一个简体中文描述',
+ count: 100,
+ active: true,
+ tags: ['软件', '网络', '服务器']
+};
+const objTc = traditionalized(obj);
+console.log(objTc);
+// 輸出: {
+// title: '簡體中文標題',
+// description: '這是一個簡體中文描述',
+// count: 100,
+// active: true,
+// tags: ['軟體', '網路', '伺服器']
+// }
+
+// 轉換巢狀結構
+const nested = {
+ user: {
+ name: '简体名称',
+ profile: {
+ bio: '这是简体中文简介',
+ skills: ['软件开发', '网络管理']
+ }
+ },
+ count: 42
+};
+const nestedTc = traditionalized(nested);
+// 所有字串屬性值都會被轉換,數字等其他類型保持不變
+```
+
+### 進階用法
+
+#### 使用快取最佳化效能
+
+在多次呼叫時,建議使用快取機制避免重複生成字典,提升效能:
+
+```javascript
+import stcasc from 'switch-chinese';
+
+// 第一次呼叫,生成字典
+let converter = stcasc();
+const cache = converter.cache;
+
+// 將快取儲存至持久化儲存(如 localStorage、檔案等)
+localStorage.setItem('stcasc-cache', JSON.stringify(cache));
+
+// 後續呼叫,直接使用快取
+const cachedData = JSON.parse(localStorage.getItem('stcasc-cache'));
+converter = stcasc(cachedData);
+
+// 現在可以直接使用,無需重新生成字典
+const result = converter.traditionalized('简体中文');
+```
+
+#### 自訂簡繁轉換詞庫
+
+可以根據業務需求自訂簡繁轉換規則:
+
+```javascript
+import stcasc from 'switch-chinese';
+
+const customDict = {
+ '身份': '身分',
+ '转义': '跳脫',
+ '转换': '轉檔',
+ '软件': '軟體',
+ '硬件': '硬體',
+ '网络': '網路',
+ '服务器': '伺服器'
+};
+
+const { traditionalized, simplized } = stcasc({}, customDict);
+
+console.log(traditionalized('软件转换'));
+// 輸出: 軟體轉檔(使用自訂詞庫)
+```
+
+#### 停用術語轉換
+
+預設情況下,函式庫會轉換一些特定術語(如「知识产权」→「智慧財產權」)。如需停用此功能:
+
+```javascript
+import stcasc from 'switch-chinese';
+
+// 第三個參數設定為 true 以停用術語轉換
+const { traditionalized } = stcasc({}, {}, true);
+
+console.log(traditionalized('知识产权'));
+// 輸出: 知識産權(僅做字元轉換,不轉換術語)
+```
+
+#### 輸出格式選項
+
+函式庫支援多種輸出格式:
+
+```javascript
+import stcasc, { OutputFormat } from 'switch-chinese';
+
+const { traditionalized } = stcasc();
+
+// 普通格式(預設)
+const normal = traditionalized('简体中文');
+// 輸出: 簡體中文
+
+// 括號格式:同時顯示原文和轉換後的文字
+const bracket = traditionalized('简体中文', { format: OutputFormat.BRACKET });
+// 輸出: 簡(简)體(体)中文
+
+// Ruby 注音格式:適用於 HTML 顯示
+const ruby = traditionalized('简体中文', { format: OutputFormat.RUBY });
+// 輸出: 簡體中文
+```
+
+OutputFormat 列舉值:
+- `OutputFormat.NORMAL` (0): 只輸出轉換後的結果(預設)
+- `OutputFormat.BRACKET` (1): 輸出「轉換(原文)」格式
+- `OutputFormat.RUBY` (2): 輸出 `` HTML 標籤格式
+
+### API 文件
+
+#### stcasc(cache?, custom?, disableTerms?)
+
+主函式,用於建立轉換器實例。
+
+**參數:**
+
+- `cache` (Object, 可選): 快取物件,用於避免重複生成字典
+- `custom` (Object, 可選): 自訂簡繁轉換詞庫
+- `disableTerms` (Boolean, 可選): 是否停用術語轉換,預設 `false`
+
+**回傳值:**
+
+回傳包含以下方法的物件:
+
+- `traditionalized(input, options?)`: 將簡體中文轉換為繁體中文
+ - `input`: 可以是字串、陣列或物件
+ - 字串:直接轉換並回傳新字串
+ - 陣列:轉換所有字串元素,其他類型保持不變
+ - 物件:遞迴轉換所有字串屬性值,其他類型保持不變
+- `simplized(input, options?)`: 將繁體中文轉換為簡體中文
+ - `input`: 可以是字串、陣列或物件
+ - 支援的資料類型同 `traditionalized`
+- `detect(text)`: 檢測文字的中文類型,回傳 ChineseType 列舉值
+- `cache`: 字典快取物件
+
+**Options 參數:**
+
+- `format` (Number, 可選): 輸出格式,使用 `OutputFormat` 常數
+
+#### ChineseType
+
+匯出的常數物件,用於表示中文類型檢測結果:
+
+```javascript
+export const ChineseType = {
+ SIMPLIFIED: 0, // 簡體中文
+ TRADITIONAL: 1, // 繁體中文
+ UNKNOWN: 2 // 未知類型
+};
+```
+
+#### OutputFormat
+
+匯出的常數物件,用於表示輸出格式選項:
+
+```javascript
+export const OutputFormat = {
+ NORMAL: 0, // 只輸出轉換後的結果
+ BRACKET: 1, // 輸出「轉換(原文)」格式
+ RUBY: 2 // 輸出 HTML 標籤格式
+};
+```
+
+### 轉換範例
+
+#### 智能詞組轉換
+
+本函式庫支援基於上下文的智能詞組轉換,能夠正確處理「一簡多繁」的情況:
+
+```javascript
+const { traditionalized } = stcasc();
+
+// 智能識別詞組邊界
+console.log(traditionalized('香烟袅袅'));
+// 輸出: 香煙裊裊
+
+console.log(traditionalized('里长面子'));
+// 輸出: 里長面子(「里長」是職務名稱)
+
+console.log(traditionalized('吃干面'));
+// 輸出: 吃乾麵(「乾麵」是食物)
+
+console.log(traditionalized('把考卷发回来'));
+// 輸出: 把考卷發回來(「發」是動詞)
+
+console.log(traditionalized('卷发'));
+// 輸出: 捲髮(「捲髮」是髮型)
+```
+
+#### 術語轉換
+
+內建常用的大陸簡體與台灣正體術語轉換:
+
+```javascript
+const { traditionalized } = stcasc();
+
+console.log(traditionalized('知识产权'));
+// 輸出: 智慧財產權
+
+console.log(traditionalized('计算机软件'));
+// 輸出: 計算機軟體
+
+console.log(traditionalized('网络服务器'));
+// 輸出: 網路伺服器
+```
+
+### 技術特點
+
+#### 高效能
+
+- 使用字典樹(Trie)最佳化詞組比對
+- 支援快取機制,避免重複初始化
+- 純 JavaScript 實現,執行效率高
+
+#### 精準轉換
+
+- 內建大量簡繁對照字元
+- 支援「一簡多繁」智能識別
+- 基於詞組的上下文分析
+
+#### 易於整合
+
+- ES Module 標準匯出
+- TypeScript 類型支援(透過常數列舉)
+- 零依賴,相容性佳
+
+### 瀏覽器支援
+
+支援所有現代瀏覽器及 Node.js 環境:
+
+- Chrome
+- Firefox
+- Safari
+- Edge
+- Node.js 12+
+
+### 開源授權
+
+MIT License
+
+### 相關連結
+
+- [GitHub 儲存庫](https://github.com/hoothin/UserScripts/tree/master/Switch%20Traditional%20Chinese%20and%20Simplified%20Chinese/lib)
+- [NPM 套件位址](https://www.npmjs.com/package/switch-chinese)
+- [問題回報](https://github.com/hoothin/UserScripts/issues)
+
+### 關鍵字
+
+簡繁轉換, 繁簡轉換, 簡體中文, 繁體中文, 正體中文, 中文轉換, 一簡多繁, 簡繁切換, 繁簡切換, 中文檢測, 智能分詞, 自訂詞庫, 零依賴, 輕量級
diff --git a/Switch Traditional Chinese and Simplified Chinese/lib/stcasc.d.ts b/Switch Traditional Chinese and Simplified Chinese/lib/stcasc.d.ts
new file mode 100644
index 00000000000..350324519b8
--- /dev/null
+++ b/Switch Traditional Chinese and Simplified Chinese/lib/stcasc.d.ts
@@ -0,0 +1,167 @@
+/**
+ * Chinese character type enumeration
+ */
+export declare const ChineseType: {
+ /** Simplified Chinese */
+ readonly SIMPLIFIED: 0;
+ /** Traditional Chinese */
+ readonly TRADITIONAL: 1;
+ /** Unknown type */
+ readonly UNKNOWN: 2;
+};
+
+/**
+ * Output format enumeration
+ */
+export declare const OutputFormat: {
+ /** Normal output - only the converted result */
+ readonly NORMAL: 0;
+ /** Bracket format - outputs「Simplified(Traditional)」or「Traditional(Simplified)」*/
+ readonly BRACKET: 1;
+ /** Ruby annotation format - outputs Simplified */
+ readonly RUBY: 2;
+};
+
+/**
+ * Conversion options
+ */
+export interface ConversionOptions {
+ /**
+ * Output format
+ * @default OutputFormat.NORMAL
+ */
+ format?: 0 | 1 | 2;
+}
+
+/**
+ * Tree node for combination dictionary
+ */
+interface CombTreeNode {
+ end?: string;
+ [key: string]: CombTreeNode | string | undefined;
+}
+
+/**
+ * Cache object for storing conversion dictionaries
+ */
+export interface ConversionCache {
+ sc2tcCombTree?: Record;
+ tc2scCombTree?: Record;
+ stDict?: Record;
+ tsDict?: Record;
+}
+
+/**
+ * Custom dictionary mapping
+ * Key: source text (simplified or traditional)
+ * Value: target text (can be string or array of strings for multiple mappings)
+ */
+export type CustomDictionary = Record;
+
+/**
+ * Result object returned by stcasc function
+ */
+export interface StcascConverter {
+ /**
+ * Convert traditional Chinese to simplified Chinese
+ * @param text - String to convert
+ * @param options - Conversion options
+ * @returns Converted simplified Chinese string
+ */
+ simplized(text: string, options?: ConversionOptions): string;
+
+ /**
+ * Convert traditional Chinese to simplified Chinese (array version)
+ * @param data - Array to convert (converts all strings in the array)
+ * @param options - Conversion options
+ * @returns Array with converted strings
+ */
+ simplized(data: T, options?: ConversionOptions): T;
+
+ /**
+ * Convert traditional Chinese to simplified Chinese (object version)
+ * @param data - Object to convert (converts all string property values)
+ * @param options - Conversion options
+ * @returns Object with converted string values
+ */
+ simplized>(data: T, options?: ConversionOptions): T;
+
+ /**
+ * Convert simplified Chinese to traditional Chinese
+ * @param text - String to convert
+ * @param options - Conversion options
+ * @returns Converted traditional Chinese string
+ */
+ traditionalized(text: string, options?: ConversionOptions): string;
+
+ /**
+ * Convert simplified Chinese to traditional Chinese (array version)
+ * @param data - Array to convert (converts all strings in the array)
+ * @param options - Conversion options
+ * @returns Array with converted strings
+ */
+ traditionalized(data: T, options?: ConversionOptions): T;
+
+ /**
+ * Convert simplified Chinese to traditional Chinese (object version)
+ * @param data - Object to convert (converts all string property values)
+ * @param options - Conversion options
+ * @returns Object with converted string values
+ */
+ traditionalized>(data: T, options?: ConversionOptions): T;
+
+ /**
+ * Detect Chinese text type
+ * @param text - Text to detect
+ * @returns ChineseType value (0=SIMPLIFIED, 1=TRADITIONAL, 2=UNKNOWN)
+ */
+ detect(text: string): 0 | 1 | 2;
+
+ /**
+ * Cached conversion dictionaries
+ */
+ cache: ConversionCache;
+}
+
+/**
+ * Initialize Chinese converter with optional cache and custom dictionary
+ *
+ * @param cache - Optional cache object to reuse conversion dictionaries
+ * @param custom - Optional custom dictionary for special term conversions
+ * @param disableTerms - If true, disables built-in term conversions
+ * @returns Converter object with conversion methods
+ *
+ * @example
+ * ```typescript
+ * import stcasc from 'switch-chinese';
+ *
+ * const converter = stcasc();
+ * const traditional = converter.traditionalized('简体中文');
+ * const simplified = converter.simplized('繁體中文');
+ * const type = converter.detect('繁體中文');
+ * ```
+ *
+ * @example
+ * ```typescript
+ * // With custom dictionary
+ * const converter = stcasc({}, {
+ * '自定义词': '自訂詞',
+ * '程序': ['程式', '程序']
+ * });
+ * ```
+ *
+ * @example
+ * ```typescript
+ * // With output format
+ * const converter = stcasc();
+ * const result = converter.traditionalized('简体', { format: 1 });
+ * // Output: 簡體(简体)
+ * ```
+ */
+declare function stcasc(
+ cache?: ConversionCache,
+ custom?: CustomDictionary,
+ disableTerms?: boolean
+): StcascConverter;
+
+export default stcasc;
diff --git a/Switch Traditional Chinese and Simplified Chinese/lib/stcasc.lib.js b/Switch Traditional Chinese and Simplified Chinese/lib/stcasc.lib.js
new file mode 100644
index 00000000000..2256dc7222a
--- /dev/null
+++ b/Switch Traditional Chinese and Simplified Chinese/lib/stcasc.lib.js
@@ -0,0 +1,988 @@
+'use strict';
+export const ChineseType = {
+ SIMPLIFIED: 0,
+ TRADITIONAL: 1,
+ UNKNOWN: 2
+};
+
+export const OutputFormat = {
+ NORMAL: 0, // 只输出转换后的结果
+ BRACKET: 1, // 输出「简(繁)」或「繁(简)」格式
+ RUBY: 2 // 输出 简 格式
+};
+
+const scStr = '万与丑专业丛东丝丢两严丧个丰临为为丽举么么义乌乐乔习乡书买乱争于亏云亘亚产产亩亲亵亸亿仅仆从仑仓仪们价众众优伙会伛伞伟传伡伣伤伥伦伧伪伫体余佣佥侠侣侥侦侧侨侩侪侬侭俣俦俨俩俪俫俭借债倾偬偻偾偿傤傥傧储傩儿克兑兖党兰关兴兹养兽冁内冈册冗写军农冢冯冲冲决况冻净凄准凉凌减凑凛几凤处凫凭凯凶击凿刍划刘则刚创删别刬刭制刹刽刾刿剀剂剐剑剥剧劝办务劢动励劲劳势勋勖勚匀匦匮区医华协单卖卜卢卤卧卫却卷厂厅历历厉压厌厍厐厕厘厠厢厣厦厨厩厮县叁参叆叇双发发变叙叠只台叶号叹叽吁后吓吕吗吨听启吴呆呐呒呓呕呖呗员呙呛呜周咏咙咛咝咤咨咸响哑哒哓哔哕哗哙哜哝哟唇唉唛唝唠唡唢唤啧啬啭啮啯啰啴啸喂喷喽喾嗫嗳嘘嘤嘱噜嚣团园囱围囵国图圆圣圹场坏块坚坛坛坛坛坜坝坞坟坠垄垅垆垒垦垩垫垭垯垱垲垴埘埙埚堑堕塆墙墻壊壮声壳壶壸処备复复够头夸夹夺奁奂奋奖奥奬妆妇妈妩妪妫姗姜姹娄娅娆娇娈娱娲娴婳婴婵婶媪媭嫒嫔嫱嬀嬷孙学孪宁宁宝实宠审宪宫宽宽宾寝对寻导寿将尔尘尝尧尴尸尽尽层屃屉届属屡屦屿岁岂岖岗岘岚岛岩岭岳岽岿峃峄峡峣峤峥峦峰崂崃崄崭嵘嵚嵝巅巨巩巯币布帅师帏帐帘帜带帧帮帱帻帼幂干干并并广庄庆庐庑库应庙庞废庼廏廪开异弃弑张弥弪弯弹强归当录彝彟彦彨彻征径徕御忆忏志忧念忾怀态怂怃怄怅怆怜总怼怿恋恒恳恶恶恸恹恺恻恼恽悦悫悬悭悮悯惊惧惨惩惫惬惭惮惯愠愤愦愿慑慭懑懒懔戆戋戏戗战戬户扎扑托扦执扩扪扫扬扰抚抛抟抠抡抢护报抬抻担拟拢拣拥拦拧拨择挂挚挛挜挝挞挟挠挡挢挣挤挥挦捂捝捞损捡换捣据捻掳掴掷掸掺掼揽揾揿搀搁搂搄搅携摄摅摆摇摈摊撄撑撵撷撸撺擜擞攒敌敍敚敛敩数斋斓斗斩断无旧时旷旸昙昼昽显晋晒晓晔晕晖暂暧札术朴机杀杂权杠条来杨杩杰松板极构枞枢枣枥枧枨枪枫枭柜柠柽栀栅标栈栉栊栋栌栎栏树栖样栾桠桡桢档桤桥桦桧桨桩桪梁梦梼梾梿检棁棂棱椁椝椟椠椢椤椫椭椮楼榄榅榇榈榉榝槚槛槟槠横樯樱橥橱橹橼檐檩欢欤欧歼殁殇残殒殓殚殡殴殻毁毂毕毙毡毵氇气氢氩氲汇汇汉污汤汹沟没沣沤沥沦沧沨沩沪泄泞注泪泶泷泸泺泻泼泽泾洁洒洼浃浅浆浇浈浉浊测浍济浏浐浑浒浓浔浕涂涌涚涛涝涞涟涠涡涢涣涤润涧涨涩淀渊渌渍渎渐渑渔渖渗温游湾湿溁溃溅溆溇滗滚滞滟滠满滢滤滥滦滨滩滪潆潇潋潍潙潜潨潴澛澜濑濒灏灭灯灵灶灾灿炀炉炖炜炝点炼炽烁烂烃烛烟烟烦烧烨烩烫烬热焕焖焘煴爱爷牍牦牵牺犊状犷犸犹狈狝狞独狭狮狯狰狱狲猃猎猕猡猪猫猬献獭玑玙玚玛玮环现玱玺珐珑珰珲琎琏琐琼瑶瑷瑸璎瓒瓮瓯産电画畅畴疖疗疟疠疡疬疭疮疯疱疴痈痉痒痖痨痪痫痴痹瘅瘆瘉瘗瘘瘪瘫瘾瘿癞癣癫皋皑皱皲盏盐监盖盗盘眍眦眬着睁睐睑睾瞆瞒瞩矫矶矾矿砀码砖砗砚砜砺砻砾础硁硅硕硖硗硙硚确硵硷碍碛碜碱礼祃祎祢祯祷祸禀禄禅离秃秆种秘积称秸秽秾稆税稣稳穑穞穷窃窍窎窑窜窝窥窦窭竖竞竪笃笋笔笕笺笼笾筑筚筛筜筝筹筼签签筿简箓箦箧箨箩箪箫篑篓篮篯篱簖籁籴类籼粜粝粤粪粮糁糇糍系系紧绝絷纟纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络絶绞统绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵罂网罗罚罢罴羁羟羡群翘翙翚翱耢耧耸耻聂聋职聍联聩聪肃肠肤肮肴肾肿胀胁胆胜胧胨胪胫胶脉脍脏脐脑脓脔脚脱脶脸腊腌腘腭腻腼腽腾膑膻臜致舆舍舣舰舱舻艰艳艺节芈芗芜芦苁苇苈苋苌苍苎苏苧苹范茎茏茑茔茕茧荆荐荙荚荛荜荝荞荟荠荡荣荤荥荦荧荨荩荪荫荬荭荮药莅莱莲莳莴莶获莸莹莺莼萚萝萤营萦萧萨葱蒀蒇蒉蒋蒌蒏蓝蓟蓠蓣蓥蓦蔂蔷蔹蔺蔼蕰蕲蕴薮藓蘖虏虑虚虫虬虮虱虽虾虿蚀蚁蚂蚃蚕蚝蚬蛊蛎蛏蛮蛰蛱蛲蛳蛴蜕蜗蜡蝇蝈蝉蝎蝼蝾螀螨蟏衅衆衔补表衬衮袄袅袆袜袭袯装裆裈裢裣裤裥褛褴襕见观觃规觅视觇览觉觊觋觌觍觎觏觐觑觞触觯訚詟誉誊说说谣讠计订讣认讥讦讧讨让讪讫讬训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谉谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷豮贜贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赞赟赠赡赢赣赪赵赶趋趱趸跃跄跖跞跡践跶跷跸跹跻踊踌踪踬踯蹑蹒蹰蹿躏躜躯軆輼车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辞辟辩辫边辽达迁过迈运还这进远违连迟迩迳迹适选逊递逦逻遗遥邓邝邬邮邹邺邻郁郏郐郑郓郦郧郸酂酝酦酱酽酾酿采释里里鈎鉴鉴銮鋭録錾钅钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钜钝钞钟钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铇铈铉铊铋铌铍铎铏铐铑铒铓铔铕铖铗铘铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铩铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链链铿销锁锂锃锄锅锆锇锈锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗锘错锚锛锜锝锞锟锠锡锢锣锤锥锦锧锨锩锪锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镄镅镆镇镈镉镊镋镌镍镎镏镐镑镒镓镔镕镖镗镘镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镵镶长门闩闪闫闬闭问闯闰闱闲闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛队阳阴阵阶际陆陇陈陉陕陦陧陨险随隐隶隽难雇雏雠雳雾霁霉霡霭靓靔静面靥鞑鞒鞯鞲韦韧韨韩韪韫韬韵頽页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜颜额颞颟颠颡颢颣颤颥颦颧风飏飐飑飒飓飔飕飖飗飘飙飚飞飨餍饣饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕駡马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骦骧髅髋髌鬓鬶魇魉鱼鱽鱾鱿鲀鲁鲂鲃鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳛鳜鳝鳞鳟鳠鳡鳢鳣鳤鷀鷄鸟鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹙鹚鹛鹜鹝鹞鹟鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹮鹯鹰鹱鹲鹳鹴鹾麦麸麹麽黄黉黡黩黪黾鼋鼌鼍鼹齐齑齿龀龁龂龃龄龅龆龇龈龉龊龋龌龙龚龛龟酸';
+const tcStr = '萬與醜專業叢東絲丟兩嚴喪個豐臨為爲麗舉麽麼義烏樂喬習鄉書買亂爭於虧雲亙亞産產畝親褻嚲億僅僕從侖倉儀們價衆眾優夥會傴傘偉傳俥俔傷倀倫傖僞佇體餘傭僉俠侶僥偵側僑儈儕儂儘俁儔儼倆儷倈儉藉債傾傯僂僨償儎儻儐儲儺兒剋兌兗黨蘭關興茲養獸囅內岡冊宂寫軍農塚馮沖衝決況凍淨淒準涼淩減湊凜幾鳳處鳧憑凱兇擊鑿芻劃劉則剛創刪別剗剄製剎劊㓨劌剴劑剮劍剝劇勸辦務勱動勵勁勞勢勳勗勩勻匭匱區醫華協單賣蔔盧鹵臥衛卻捲廠廳曆歷厲壓厭厙龎廁釐廁廂厴廈廚廄廝縣叄參靉靆雙發髮變敘疊隻臺葉號嘆嘰籲後嚇呂嗎噸聽啟吳獃吶嘸囈嘔嚦唄員咼嗆嗚週詠嚨嚀噝吒諮鹹響啞噠嘵嗶噦嘩噲嚌噥喲脣欸嘜嗊嘮啢嗩喚嘖嗇囀齧嘓囉嘽嘯餵噴嘍嚳囁噯噓嚶囑嚕囂團園囪圍圇國圖圓聖壙場壞塊堅壇罎罈壜壢壩塢墳墜壟壠壚壘墾堊墊埡墶壋塏堖塒壎堝塹墮壪牆牆壞壯聲殼壺壼處備複復夠頭誇夾奪奩奐奮獎奧獎妝婦媽嫵嫗媯姍薑奼婁婭嬈嬌孌娛媧嫻嫿嬰嬋嬸媼嬃嬡嬪嬙媯嬤孫學孿寧甯寶實寵審憲宮寬寛賓寢對尋導壽將爾塵嘗堯尷屍盡儘層屭屜屆屬屢屨嶼歲豈嶇崗峴嵐島巖嶺嶽崬巋嶨嶧峽嶢嶠崢巒峯嶗崍嶮嶄嶸嶔嶁巔鉅鞏巰幣佈帥師幃帳簾幟帶幀幫幬幘幗冪幹乾並併廣莊慶廬廡庫應廟龐廢廎廄廩開異棄弒張彌弳彎彈強歸當錄彜彠彥彲徹徵徑徠禦憶懺誌憂唸愾懷態慫憮慪悵愴憐總懟懌戀恆懇惡噁慟懨愷惻惱惲悅愨懸慳悞憫驚懼慘懲憊愜慚憚慣慍憤憒願懾憖懣懶懍戇戔戲戧戰戩戶紮撲託扡執擴捫掃揚擾撫拋摶摳掄搶護報擡捵擔擬攏揀擁攔擰撥擇掛摯攣掗撾撻挾撓擋撟掙擠揮撏摀挩撈損撿換搗據撚擄摑擲撣摻摜攬搵撳攙擱摟揯攪攜攝攄擺搖擯攤攖撐攆擷擼攛㩵擻攢敵敘敓斂斆數齋斕鬥斬斷無舊時曠暘曇晝曨顯晉曬曉曄暈暉暫曖劄術樸機殺雜權槓條來楊榪傑鬆闆極構樅樞棗櫪梘棖槍楓梟櫃檸檉梔柵標棧櫛櫳棟櫨櫟欄樹棲樣欒椏橈楨檔榿橋樺檜槳樁樳樑夢檮棶槤檢梲櫺稜槨槼櫝槧槶欏樿橢槮樓欖榲櫬櫚櫸樧檟檻檳櫧橫檣櫻櫫櫥櫓櫞簷檁歡歟歐殲歿殤殘殞殮殫殯毆殼毀轂畢斃氈毿氌氣氫氬氳彙匯漢汙湯洶溝沒灃漚瀝淪滄渢溈滬洩濘註淚澩瀧瀘濼瀉潑澤涇潔灑窪浹淺漿澆湞溮濁測澮濟瀏滻渾滸濃潯濜塗湧涗濤澇淶漣潿渦溳渙滌潤澗漲澀澱淵淥漬瀆漸澠漁瀋滲溫遊灣濕濚潰濺漵漊潷滾滯灩灄滿瀅濾濫灤濱灘澦瀠瀟瀲濰溈潛潀瀦瀂瀾瀨瀕灝滅燈靈竈災燦煬爐燉煒熗點煉熾爍爛烴燭煙菸煩燒燁燴燙燼熱煥燜燾熅愛爺牘犛牽犧犢狀獷獁猶狽獮獰獨狹獅獪猙獄猻獫獵獼玀豬貓蝟獻獺璣璵瑒瑪瑋環現瑲璽琺瓏璫琿璡璉瑣瓊瑤璦璸瓔瓚甕甌產電畫暢疇癤療瘧癘瘍癧瘲瘡瘋皰痾癰痙癢瘂癆瘓癇癡痺癉瘮癒瘞瘻癟癱癮癭癩癬癲臯皚皺皸盞鹽監蓋盜盤瞘眥矓著睜睞瞼睪瞶瞞矚矯磯礬礦碭碼磚硨硯碸礪礱礫礎硜矽碩硤磽磑礄確磠鹼礙磧磣堿禮禡禕禰禎禱禍稟祿禪離禿稈種祕積稱稭穢穠穭稅穌穩穡穭窮竊竅窵窯竄窩窺竇窶豎競豎篤筍筆筧箋籠籩築篳篩簹箏籌篔簽籤篠簡籙簀篋籜籮簞簫簣簍籃籛籬籪籟糴類秈糶糲粵糞糧糝餱餈係繫緊絕縶糹糾紆紅紂纖紇約級紈纊紀紉緯紜紘純紕紗綱納紝縱綸紛紙紋紡紵紖紐紓線紺紲紱練組紳細織終縐絆紼絀紹繹經紿綁絨結絝繞絰絎繪給絢絳絡絕絞統綆綃絹繡綌綏縧繼綈績緒綾緓續綺緋綽鞝緄繩維綿綬繃綢綯綹綣綜綻綰綠綴緇緙緗緘緬纜緹緲緝縕繢緦綞緞緶緱縋緩締縷編緡緣縉縛縟縝縫縗縞纏縭縊縑繽縹縵縲纓縮繆繅纈繚繕繒韁繾繰繯繳纘罌網羅罰罷羆羈羥羨羣翹翽翬翺耮耬聳恥聶聾職聹聯聵聰肅腸膚骯餚腎腫脹脅膽勝朧腖臚脛膠脈膾髒臍腦膿臠腳脫腡臉臘醃膕齶膩靦膃騰臏羶臢緻輿捨艤艦艙艫艱豔藝節羋薌蕪蘆蓯葦藶莧萇蒼苧蘇薴蘋範莖蘢蔦塋煢繭荊薦薘莢蕘蓽萴蕎薈薺蕩榮葷滎犖熒蕁藎蓀蔭蕒葒葤藥蒞萊蓮蒔萵薟獲蕕瑩鶯蓴蘀蘿螢營縈蕭薩蔥蒕蕆蕢蔣蔞醟藍薊蘺蕷鎣驀虆薔蘞藺藹薀蘄蘊藪蘚櫱虜慮虛蟲虯蟣蝨雖蝦蠆蝕蟻螞蠁蠶蠔蜆蠱蠣蟶蠻蟄蛺蟯螄蠐蛻蝸蠟蠅蟈蟬蠍螻蠑螿蟎蠨釁眾銜補錶襯袞襖裊褘襪襲襏裝襠褌褳襝褲襉褸襤襴見觀覎規覓視覘覽覺覬覡覿覥覦覯覲覷觴觸觶誾讋譽謄說説謡訁計訂訃認譏訐訌討讓訕訖託訓議訊記訒講諱謳詎訝訥許訛論訩訟諷設訪訣證詁訶評詛識詗詐訴診詆謅詞詘詔詖譯詒誆誄試詿詩詰詼誠誅詵話誕詬詮詭詢詣諍該詳詫諢詡譸誡誣語誚誤誥誘誨誑誦誒請諸諏諾讀諑誹課諉諛誰諗調諂諒諄誶談讅誼謀諶諜謊諫諧謔謁謂諤諭諼讒諮諳諺諦謎諞諝謨讜謖謝謠謗謚謙謐謹謾謫譾謬譚譖譙讕譜譎讞譴譫讖穀豶贓貝貞負貟貢財責賢敗賬貨質販貪貧貶購貯貫貳賤賁貰貼貴貺貸貿費賀貽賊贄賈賄貲賃賂贓資賅贐賕賑賚賒賦賭齎贖賞賜贔賙賡賠賧賴賵贅賻賺賽賾贗贊讚贇贈贍贏贛赬趙趕趨趲躉躍蹌蹠躒蹟踐躂蹺蹕躚躋踴躊蹤躓躑躡蹣躕躥躪躦軀體轀車軋軌軒軑軔轉軛輪軟轟軲軻轤軸軹軼軤軫轢軺輕軾載輊轎輈輇輅較輒輔輛輦輩輝輥輞輬輟輜輳輻輯轀輸轡轅轄輾轆轍轔辭闢辯辮邊遼達遷過邁運還這進遠違連遲邇逕跡適選遜遞邐邏遺遙鄧鄺鄔郵鄒鄴鄰鬱郟鄶鄭鄆酈鄖鄲酇醞醱醬釅釃釀採釋裏裡鉤鑒鑑鑾銳錄鏨釒釓釔針釘釗釙釕釷釺釧釤鈒釩釣鍆釹鍚釵鈃鈣鈈鈦鉅鈍鈔鍾鐘鈉鋇鋼鈑鈐鑰欽鈞鎢鈎鈧鈁鈥鈄鈕鈀鈺錢鉦鉗鈷缽鈳鉕鈽鈸鉞鑽鉬鉭鉀鈿鈾鐵鉑鈴鑠鉛鉚鉋鈰鉉鉈鉍鈮鈹鐸鉶銬銠鉺鋩錏銪鋮鋏鋣鐃銍鐺銅鋁銱銦鎧鍘銖銑鋌銩銛鏵銓鎩鉿銚鉻銘錚銫鉸銥鏟銃鐋銨銀銣鑄鐒鋪鋙錸鋱鏈鍊鏗銷鎖鋰鋥鋤鍋鋯鋨鏽銹銼鋝鋒鋅鋶鐦鐧銳銻鋃鋟鋦錒錆鍺鍩錯錨錛錡鍀錁錕錩錫錮鑼錘錐錦鑕鍁錈鍃錇錟錠鍵鋸錳錙鍥鍈鍇鏘鍶鍔鍤鍬鍾鍛鎪鍠鍰鎄鍍鎂鏤鎡鐨鎇鏌鎮鎛鎘鑷钂鐫鎳鎿鎦鎬鎊鎰鎵鑌鎔鏢鏜鏝鏍鏰鏞鏡鏑鏃鏇鏐鐔钁鐐鏷鑥鐓鑭鐠鑹鏹鐙鑊鐳鐶鐲鐮鐿鑔钀鑞鑱鑲長門閂閃閆閈閉問闖閏闈閑閒閎間閔閌悶閘鬧閨聞闥閩閭闓閥閣閡閫鬮閱閬闍閾閹閶鬩閿閽閻閼闡闌闃闠闊闋闔闐闒闕闞闤隊陽陰陣階際陸隴陳陘陝隯隉隕險隨隱隸雋難僱雛讎靂霧霽黴霢靄靚靝靜麵靨韃鞽韉韝韋韌韍韓韙韞韜韻頹頁頂頃頇項順須頊頑顧頓頎頒頌頏預顱領頗頸頡頰頲頜潁熲頦頤頻頮頹頷頴穎顆題顒顎顓顔顏額顳顢顛顙顥纇顫顬顰顴風颺颭颮颯颶颸颼颻飀飄飆飈飛饗饜飠飣饑飥餳飩餼飪飫飭飯飲餞飾飽飼飿飴餌饒餉餄餎餃餏餅餑餖餓餘餒餕餜餛餡館餷饋餶餿饞饁饃餺餾饈饉饅饊饌饢罵馬馭馱馴馳驅馹駁驢駔駛駟駙駒騶駐駝駑駕驛駘驍罵駰驕驊駱駭駢驫驪騁驗騂駸駿騏騎騍騅騌驌驂騙騭騤騷騖驁騮騫騸驃騾驄驏驟驥驦驤髏髖髕鬢鬹魘魎魚魛魢魷魨魯魴䰾魺鮁鮃鯰鱸鮋鮓鮒鮊鮑鱟鮍鮐鮭鮚鮳鮪鮞鮦鰂鮜鱠鱭鮫鮮鮺鯗鱘鯁鱺鰱鰹鯉鰣鰷鯀鯊鯇鮶鯽鯒鯖鯪鯕鯫鯡鯤鯧鯝鯢鯰鯛鯨鰺鯴鯔鱝鰈鰏鱨鯷鰮鰃鰓鱷鰍鰒鰉鰁鱂鯿鰠鼇鰭鰨鰥鰩鰟鰜鰳鰾鱈鼈鰻鰵鱅鰼鱖鱔鱗鱒鱯鱤鱧鱣䲘鶿雞鳥鳩雞鳶鳴鳲鷗鴉鶬鴇鴆鴣鶇鸕鴨鴞鴦鴒鴟鴝鴛鷽鴕鷥鷙鴯鴰鵂鴴鵃鴿鸞鴻鵐鵓鸝鵑鵠鵝鵒鷳鵜鵡鵲鶓鵪鵾鵯鵬鵮鶉鶊鵷鷫鶘鶡鶚鶻鶖鶿鶥鶩鷊鷂鶲鶹鶺鷁鶼鶴鷖鸚鷓鷚鷯鷦鷲鷸鷺䴉鸇鷹鸌鸏鸛鸘鹺麥麩麴麼黃黌黶黷黲黽黿鼂鼉鼴齊齏齒齔齕齗齟齡齙齠齜齦齬齪齲齷龍龔龕龜痠';
+const oc2tc = {
+ "床": "牀",
+ "為": "爲",
+ "產": "産",
+ '眾': '衆',
+ '寧': '甯',
+ '啟': '啓',
+ '鏽': '銹',
+ '閱': '閲',
+ '顏': '顔',
+ '嘆': '歎',
+ '線': '缐綫',
+ '綠': '緑',
+ '幸': '倖',
+ '聽': '聼聴'
+};
+const sc2tc = {
+ '巨':[
+ '巨',
+ ['鉅','巨款','巨富','巨细','巨子']
+ ],
+ '折':[
+ '折',
+ ['摺','折叠','折纸','存折','对折','折痕','奏折','折页','折扇']
+ ],
+ '霉':[
+ '霉',
+ ['黴','青霉素','红霉素','霉菌','氯霉素','绿霉素']
+ ],
+ '捆':[
+ '捆',
+ ['綑','捆绑','捆扎']
+ ],
+ '升':[
+ '升',
+ ['昇','升华','提升','高升','歌舞升平']
+ ],
+ '划':[
+ '劃',
+ ['划','划龙舟','划船','划算','划不来']
+ ],
+ '姜':[
+ '姜',
+ ['薑','姜片','姜葱','生姜','姜汁','姜母鸭']
+ ],
+ '御':[
+ '禦',
+ ['御','御制','御用']
+ ],
+ '毁':[
+ '毀',
+ ['燬','烧毁','焚毁','炸毁','销毁'],
+ ['譭','诋毁','毁谤']
+ ],
+ '胡':[
+ '胡',
+ ['鬍','胡须','胡子','刮胡刀'],
+ ['衚','胡同']
+ ],
+ '须':[
+ '須',
+ ['鬚','剃须刀','胡须','须发','根须']
+ ],
+ '同':[
+ '同',
+ ['衕','衚衕']
+ ],
+ '叹':[
+ '歎',
+ ['嘆','悲叹','叹息','仰天长叹','叹惋']
+ ],
+ '荡':[
+ '蕩',
+ ['盪','空荡荡','回荡','动荡','荡漾','震荡']
+ ],
+ '凄':[
+ '淒',
+ ['悽','凄厉','凄惨','悲凄','凄苦']
+ ],
+ '栗':[
+ '栗',
+ ['慄','战栗','颤栗','不寒而栗']
+ ],
+ '沈':[
+ '沈',
+ ['瀋','沈阳']
+ ],
+ '苏':[
+ '蘇',
+ ['甦','复苏','苏醒']
+ ],
+ '卤':[
+ '滷',
+ ['鹵','卤钝','卤莽','粗卤','卤地']
+ ],
+ '准':[
+ '準',
+ ['准','批准','准许','不准','准予']
+ ],
+ '杯':[
+ '杯',
+ ['盃','奖杯','世界杯']
+ ],
+ '馈':[
+ '饋',
+ ['餽','馈赠']
+ ],
+ '向':[
+ '向',
+ ['嚮','向往','向导']
+ ],
+ '搜':[
+ '搜',
+ ['蒐','蒐集','蒐羅']
+ ],
+ '哗':[
+ '嘩',
+ ['譁','哗变','喧哗','哗众取宠']
+ ],
+ '够':[
+ '夠',
+ ['搆','够不到']
+ ],
+ '范':[
+ '范',
+ ['範','模范','范本','示范','规范','范围']
+ ],
+ '喂':[
+ '喂',
+ ['餵','喂养','喂饱','饲喂']
+ ],
+ '迹':[
+ '跡',
+ ['蹟','古迹','遗迹','事迹','奇迹','史迹']
+ ],
+ '佩':[
+ '佩',
+ ['珮','玉佩']
+ ],
+ '尸':[
+ '屍',
+ ['尸','尸位素餐']
+ ],
+ '泛':[
+ '泛',
+ ['氾','泛滥']
+ ],
+ '雕':[
+ '雕',
+ ['彫','雕刻','雕像','雕塑','精雕细琢','雕琢','冰雕']
+ ],
+ '核':[
+ '核',
+ ['覈','审核','核实','核准','核对','复核','核查']
+ ],
+ '困':[
+ '困',
+ ['睏','困倦','困意','犯困']
+ ],
+ '欲':[
+ '欲',
+ ['慾','欲望','情欲','私欲','贪欲','色欲']
+ ],
+ '致':[
+ '致',
+ ['緻','精致','细致']
+ ],
+ '梁':[
+ '梁',
+ ['樑','栋梁','桥梁']
+ ],
+ '占':[
+ '占',
+ ['佔','占用','占领','侵占','占为己有','强占','占有','抢占']
+ ],
+ '卜':[
+ '卜',
+ ['蔔','萝卜','胡萝卜']
+ ],
+ '托':[
+ '托',
+ ['託','拜托','托付','嘱托','托词','托辞','推托','委托','托病','信托','托梦','托孤','托故','托管','受托','寄托']
+ ],
+ '刮':[
+ '刮',
+ ['颳','刮风']
+ ],
+ '尽':[
+ '盡',
+ ['儘','尽快','尽早','尽可能','尽显','尽量','尽管']
+ ],
+ '汇':[
+ '匯',
+ ['彙','词汇','字汇','汇集','汇编','辞汇']
+ ],
+ '才':[
+ '才',
+ ['纔','刚才','方才','却才','恰才']
+ ],
+ '丑':[
+ '醜',
+ ['丑','小丑','丑角','乙丑','丁丑','己丑','辛丑','癸丑','副丑']
+ ],
+ '周':[
+ '周',
+ ['週','周报','周期','周会','周日','周刊','周波','周岁','周末','周考','一周','二周','三周','四周','五周','两周','双周刊','名剧周','黄金周','周休','周一','周二','周三','周四','周五','周六'],
+ ['賙','周济']
+ ],
+ '冲':[
+ '沖',
+ ['衝','冲奖','冲高','冲决','冲浪','冲子','冲力','冲要','冲破','冲口','冲顶','冲床','冲突','冲刺','冲金','冲模','冲撞','冲腾','冲锋','冲量','冲动','冲程','冲压','冲杀','冲激','冲击','俯冲','反冲','折冲','缓冲','脉冲','要冲','冲锋枪','冲孔机','冲劲','冲金点','冲压机','冲击波','反冲力','冲锋','横冲','冲冠','首当其冲']
+ ],
+ '恶':[
+ '惡',
+ ['噁','恶心']
+ ],
+ '发':[
+ '發',
+ ['發','发回'],
+ ['髮','发网','发际','发箍','发丝','发式','发带','发型','发卡','发妻','发指','发廊','发饰','发乳','发夹','发菜','发屋','发姐','发油','发套','发蜡','发鬓','发髻','发雕','发辫','发胶','发浆','一发','假发','健发','削发','卷发','握发','束发','染发','植发','栉发','毛发','毫发','烫发','理发','白发','短发','秀发','秃发','结发','美发','胎发','脱发','华发','落发','蓄发','护发','金发','银发','头发','驳发','鬓发','须发','发小','剃发令','洗发','发短心长','怒发冲冠','断发文身','被发','鹤发','黄发垂髫','擢发难数','庞眉皓发','披头散发','间不容发']
+ ],
+ '复':[
+ '復',
+ ['複','复诊','复印','复写','复查','复习','复式','复种','复姓','复核','复音','复决','复利','复眼','复句','复合','复果','复述','复胃','复本','复方','复验','复选','复赛','复议','复制','复检','复杂','复叶','复线','复诵','复视','复试','复数','复评','复审','繁复','重复','复元音','复读机','复辅音','复共轭的','合义复词','衍声复词','山重水复'],
+ ['覆','复電','批复','核复','禀复','答复','被复','赐复','颠复','倾复','函复','反复','回复','复亡','复函','复命','复审','复复','复败','复书','复核','复没','复灭','复舟']
+ ],
+ '鉴':[
+ '鑒',
+ ['鑑','鉴于','鉴识','鉴赏','鉴证','鉴真','鉴谅','鉴别','鉴定','鉴戒','人鉴','借鉴','印鉴','可鉴','品鉴','唐鉴','图鉴','年鉴','殷鉴','洞鉴','王鉴','评鉴','赏鉴','通鉴','风鉴','龟鉴','明通鉴','鉴往知来','鉴古推今','有鉴于此','渊鉴类函','引为鉴戒','之鉴','宝鉴','玉鉴','引以为鉴','手鉴']
+ ],
+ '历':[
+ '歷',
+ ['曆','历书','历象','历元','历法','公历','回历','国历','夏历','年历','弘历','挂历','日历','月历','校历','桌历','殷历','皇历','旧历','藏历','西历','农历','阴历','阳历','黄历','台历','万历帝','藏历年','陀历道','阳历年','七曜历','三统历','乾象历','天体历','太初历','格里历','统天历','行事历','农民历','农家历','戊寅元历']
+ ],
+ '链':[
+ '鏈',
+ ['鍊','链子','拉链','精链','锻链','项链','锁链','铁链']
+ ],
+ '签':[
+ '簽',
+ ['籤','签子','签诗','抽签','掣签','书签','标签','求签','牙签','竹签','贴标签','唐音统签','金瓶掣签','云笈七签']
+ ],
+ '闲':[
+ '閒',
+ ['閑','闲闲','熟闲','高闲','闲居','幽闲','逾闲']
+ ],
+ '赞':[
+ '贊',
+ ['讚','赞赏','赞佩','赞美','赞誉','赞歌','赞叹','赞许','赞扬','赞颂','赞语','按赞','盛赞','礼赞','称赞','夸赞','颂赞','点赞','赞不绝口']
+ ],
+ '钟':[
+ '鍾',
+ ['鐘','钟摆','钟点','钟乳','钟楼','钟头','钟鼎','分钟','丧钟','座钟','挂钟','摆钟','时钟','洪钟','空钟','编钟','诗钟','警钟','电钟','闹钟','点钟','钟点房','钟鼓','钟点工','钟鼎文','大钟寺','石钟乳','光学钟','原子钟','大本钟','大笨钟','宗周钟','平安钟','打卡钟','抖空钟','撞丧钟','救命钟','敲警钟','敲丧钟','潜水钟','生物钟','石英钟','自鸣钟','电子钟','钟鸣','晨钟','黄钟','撞钟']
+ ],
+ '只':[
+ '只',
+ ['隻','几只','一只','二只','两只','三只','四只','五只','六只','七只','八只','九只','十只','百只','千只','万只','形单影只','只言片语','只字不提'],
+ ['只','只有','只会','只管','只消','只当','只好','只要','只能','只会','只是','只怕','只得','只见','只顾','只许','只因','不只','仅只','只不过','只此一家','只欠东风','只争朝夕']
+ ],
+ '捂':[
+ '捂',
+ ['摀','紧捂']
+ ],
+ '咸':[
+ '鹹',
+ ['咸','咸阳','咸宜','咸丰','咸和','咸池','咸五','彭咸','季咸','阮咸','阿咸','巫咸','碧咸']
+ ],
+ '脏':[
+ '髒',
+ ['臟','脏器','脏腑','五脏','内脏','心脏','肝脏','肺脏','胃脏','胰脏','脺脏','脾脏','肾脏','腑脏','肠脏']
+ ],
+ '岳':[
+ '岳',
+ ['嶽','五岳','中岳','北岳','南岳','西岳','东岳','岳立']
+ ],
+ '云':[
+ '雲',
+ ['云','人云亦云','云云']
+ ],
+ '游':[
+ '遊',
+ ['游','游泳','游水','花游']
+ ],
+ '弥':[
+ '彌',
+ ['瀰','弥漫']
+ ],
+ '松':[
+ '鬆',
+ ['松','惺松','阿松','松树','松针','松果','松鼠','松林','松竹']
+ ],
+ '愈':[
+ '愈',
+ ['癒','不愈','初愈','已愈','康愈','愈合','未愈','治愈','病愈','痊愈','自愈','伤愈','愈疮','渐愈']
+ ],
+ '尝':[
+ '嘗',
+ ['嚐','品尝','浅尝辄止','卧薪尝胆']
+ ],
+ '斗':[
+ '斗',
+ ['鬥','不斗','久斗','互斗','仍斗','共斗','再斗','初斗','力斗','勇斗','博斗','又斗','合斗','吵斗','善斗','大斗','好斗','想斗','打斗','批斗','抓斗','抗斗','拆斗','拼斗','挑斗','接斗','搏斗','敢斗','文斗','斗一','斗上','斗不','斗久','斗了','斗他','斗你','斗倒','斗出','斗到','斗力','斗勇','斗去','斗口','斗命','斗嘴','斗在','斗垮','斗士','斗奇','斗她','斗妍','斗完','斗弄','斗得','斗心','斗忍','斗志','斗快','斗意','斗成','斗我','斗批','斗技','斗招','斗拳','斗掌','斗斗','斗智','斗棋','斗法','斗牛','斗狗','斗狠','斗眼','斗神','斗私','斗草','斗角','斗起','斗趣','斗酒','斗魂','智斗','暗斗','未斗','格斗','械斗','武斗','死斗','比斗','游斗','激斗','狠斗','猛斗','相斗','私斗','群斗','苦斗','虎斗','血斗','要斗','角斗','越斗','跟斗','迎斗','邀斗','酣斗','乱斗','内斗','别斗','剧斗','劲斗','夺斗','奋斗','厮斗','恶斗','战斗','斗来','斗个','斗传','斗剑','斗劲','斗胜','斗场','斗将','斗恶','斗战','斗擞','斗败','斗敌','斗杀','斗殴','斗气','斗争','斗兽','斗毕','斗舰','斗艺','斗艳','斗赢','斗输','斗过','斗鸡','斗饮','斗闹','斗鱼','斗丽','会斗','权斗','殴斗','决斗','争斗','独斗','竞斗','约斗','缠斗','罢斗','观斗','赌斗','较斗','连斗','门斗','双斗','颤斗','凤斗','斗!']
+ ],
+ '系':[
+ '系',
+ ['係','关系','系数'],
+ ['系','系统','系列','体系','派系','直系'],
+ ['繫','不系','劾系','心系','所系','拘系','擐系','系上','系乎','系了','系住','系囚','系妥','系心','系念','系手','系牢','系留','系腰','系膜','系起','颈系','连系','联系','维系','系马','系个','系块','系带','系怀','系挂','系于','系条','系绊','系紧','系缚','系绳','系缆','系脚','系辞','系铃','系颈','牵系','梦系','身系','腰系','背系','縻系']
+ ],
+ '舍':[
+ '捨',
+ ['舍','宿舍','寒舍','屋舍','舍下']
+ ],
+ '干':[
+ '幹',
+ ['乾','口干','吃干','吐干','吮干','吸干','吹干','呷干','喉干','喝干','嘴干','太干','干井','干似','干冰','干冷','干化','干咳','干咽','干品','干哥','干嚎','干土','干坤','干妹','干姊','干姐','干姜','干娘','干爹','干爸','干妈','干季','干巴','干布','干干','干式','干弟','干性','干料','干旱','干杯','干果','干枝','干枯','干柴','干梅','干沙','干泥','干洗','干涸','干渴','干焦','干熬','干燥','干爽','干球','干疤','干瘦','干眼','干瞪','干硬','干窘','干笑','干等','干粉','干耗','干肉','干股','干脆','干花','干草','干菜','干薪','干衣','干裂','干透','干酪','干醋','干隆','干面','弄干','很干','抹干','抽干','揩干','擦干','晾干','朝干','未干','杯干','果干','桑干','榨干','水干','流干','海干','滴干','炒干','烘干','烤干','焙干','焦干','煨干','熨干','略干','碗干','粉干','耗干','肉干','舔干','菜干','蒸干','速干','干儿','干哑','干呕','干坛','干孙','干尸','干搁','干晒','干净','干涩','干涧','干湿','干热','干烧','干瘪','干瘾','干发','干粮','干结','干丝','干声','干叶','干号','干货','干阳','干饭','拧干','晒干','极干','泪干','沥干','烧干','烩干','发干','笋干','绞干','阴干','难干','风干','饮干','饼干','鱼干','唇干'],
+ ['干','干系','天干','干涉','干扰','干戈','相干','干我什','干我事','干我的事','干你什','干你事','干你的事','干他什','干他事','干他的事','干她什','干她事','干她的事']
+ ],
+ '了':[
+ '了',
+ ['瞭','了望','了然','了解','了若指掌','了如指掌']
+ ],
+ '谷':[
+ '穀',
+ ['谷','低谷','山谷','谷峰','谷底']
+ ],
+ '仿':[
+ '仿',
+ ['倣','仿效'],
+ ['彷','仿佛','仿徉'],
+ ['徬','仿徨']
+ ],
+ '效':[
+ '效',
+ ['傚','模效','摹效','仿效','儆效','效尤','效法']
+ ],
+ '克':[
+ '克',
+ ['剋','克夫','克扣','克日','克星','克期','克死','克薄','生克','相克','冲克'],
+ ['刻','克苦']
+ ],
+ '吊':[
+ '吊',
+ ['弔','吊信','吊古','吊唁','吊奠','吊孝','吊客','吊影','吊念','吊慰','吊文','吊民','吊祭','哀吊','唁吊','盆吊','祭吊','陪吊','吊问','吊丧','吊场','吊书','吊词','吊诡','吊贺','吊钱','凭吊']
+ ],
+ '台':[
+ '臺',
+ ['颱','冬台','秋台','防台','台风','强台','轻台'],
+ ['檯','台凳','台子','台布','台面','吧台','抹台','揩台','球台','窗台','翻台','餐台','台历','台灯','台钟','书台','柜台','赌台','长台']
+ ],
+ '回':[
+ '回',
+ ['迴','北回','南回','回圈','回廊','回旋','回游','回翔','回避','峰回','巡回','迂回','回环','回纹','回绕','回肠','回荡','回銮','回响','回风','梦回','盘回','纡回','萦回','轮回','递回']
+ ],
+ '后':[
+ '後',
+ ['后','仙后','吕后','天后','太后','封后','帝后','废后','影后','后冠','后土','后妃','后稷','后羿','母后','王后','皇后','舞后','西后','艳后','韦后']
+ ],
+ '征':[
+ '征',
+ ['徵','代征','停征','像征','免征','咎征','征了','征人','征信','征候','征兆','征入','征兵','征募','征去','征友','征取','征召','征地','征婚','征引','征得','征收','征文','征求','征片','征用','征稿','征管','征聘','征象','征逐','征集','急征','性征','新征','特征','狂征','病征','稽征','考征','苛征','表征','象征','超征','魏征','带征','广征','强征','征个','征启','征敛','征状','征税','征粮','征纳','征缴','征诏','征询','征调','征财','征费','征赋','征购','征选','应征','横征','减征','滥征','纳征','缓征','联征','详征','诚征','课征','变征','开征','体征']
+ ],
+ '注':[
+ '注',
+ ['註','注解','备注','注脚','批注','注册','注定','校注','尾注','注销','标注','注释']
+ ],
+ '丰':[
+ '豐',
+ ['丰','三丰','丰姿','丰度','丰情','丰神','丰韵']
+ ],
+ '并':[
+ '並',
+ ['併','一并','不并','并入','并力','并合','并吞','并图','并拢','并案','并叠','并砌','并科','并负','并购','并赃','并除','并陇','侵并','兼并','合并','吞并','整并','归并','相并','砌并','被并','裁并','购并','双并']
+ ],
+ '念':[
+ '念',
+ ['唸','光念','念佛','念作','念到','念咒','念好','念完','念得','念念','念成','念法','敢念','念书','念给','念经','念诵','念过','念错','念点','没念']
+ ],
+ '借':[
+ '借',
+ ['藉','借以','借口','借故','慰借','狼借','借机','借词','凭借','蕴借']
+ ],
+ '志':[
+ '志',
+ ['誌','日志','网志','墓志铭','聊斋志异','三国志','杂志']
+ ],
+ '么':[
+ '麼',
+ ['么','老么','么女','么儿','么妹','么子','么弟']
+ ],
+ '布':[
+ '布',
+ ['佈','公布','分布','宣布','密布','布伏','布署','布兵','布告','布局','布施','布景','布置','布防','布雷','故布','散布','遍布','传布','布个','布坛','布导','布岗','布于','布满','布阵','广布','摆布','满布','发布','预布']
+ ],
+ '分':[
+ '分',
+ ['份','分量','身分']
+ ],
+ '里':[
+ '裡',
+ ['里','○里','一里','七里','三里','下里','九里','二里','五里','亚里','佳里','克里','全里','两里','八里','公里','六里','凯里','劈里','加里','北里','十里','千里','南里','卡里','吉里','哈里','哥里','啰里','四里','埔里','多里','少里','尤里','居里','峇里','布里','几里','底里','德里','拉里','故里','数里','斯里','普里','东里','格里','归里','波里','乌里','百里','稀里','罗里','英里','莫里','万里','苏里','里亚','里仁','里夫','里奥','里尼','里布','里拉','里昂','里根','里民','里尔','里科','里程','里约','里纳','里美','里肌','里兰','里路','里里','里长','西里','贝里','路里','道里','乡里','邻里','阿里','马里','0里','0里','1里','2里','3里','4里','5里','6里','7里','8里','9里']
+ ],
+ '面':[
+ '面',
+ ['麵','制面','吃面','拉面','拌面','揉面','杯面','油面','泡面','炒面','煮面','碗面','羹面','肉面','辣面','面店','面杖','面灰','面碗','面筋','面粉','面糊','面茶','面食','食面','寿面','杆面','凉面','汤面','烫面','发面','酱面','面价','面团','面厂','面摊','面汤','面线','面饺','面饼','面馆','面馍','面龟','饨面','卤面','麦面','干面','擀面']
+ ],
+ '烟':[
+ '煙',
+ ['菸','烟斗','吸烟','好烟','戒烟','抽烟','支烟','旱烟','根烟','烟商','烟客','烟枪','烟民','烟灰','烟瘾','烟草','烟酒','烟头','烟鬼','烟龄','禁烟','买烟','香烟']
+ ],
+ '蒙':[
+ '蒙',
+ ['濛','灰蒙','空蒙','蒙蒙','迷蒙','弥蒙','蒙雾'],
+ ['矇','欺蒙','蒙住','蒙叟','蒙敝','蒙昧','蒙混','蒙瞀','蒙瞢','蒙瞽','蒙蔽','蒙胧','蒙眬','蒙骗'],
+ ['懞','蒙懂']
+ ],
+ '表':[
+ '表',
+ ['錶','戴表','手表','秒表','腕表','表店','跳表','陀表','怀表','表带','表厂','表壳','表炼','表链','钟表','马表']
+ ],
+ '板':[
+ '板',
+ ['闆','老板']
+ ],
+ '卷':[
+ '卷',
+ ['捲','卷入','卷起','龙卷风','席卷','蛋卷','花卷','袭卷','卷款','卷发','卷走','卷进','卷曲','卷舌','烟卷']
+ ],
+ '酸':[
+ '酸',
+ ['痠','酸软','酸痛','腰酸背痛']
+ ],
+ '仇':[
+ '仇',
+ ['讎','复仇','仇恨','报仇','仇敌']
+ ],
+ '几':[
+ '幾',
+ ['几','窗明几净','窗明几洁','茶几']
+ ],
+ '背':[
+ '背',
+ ['揹','背负','背黑锅','背包']
+ ],
+ '衔':[
+ '銜',
+ ['啣','结草衔环','衔着']
+ ],
+ '构':[
+ '構',
+ ['搆','构陷','构思']
+ ]
+};
+//繁轉簡
+const tc2sc = {
+ '著':[
+ '着',
+ ['著','著名','著作','巨著','著稱','顯著','昭著','卓著','所著','著述','編著','著書','名著','原著','遺著','譯著','著譯','著:','著:','土著','論著','專著','日新月著','著有','合著','知著','著錄','著者','較著','頗著','文著','著文','自著','著成','著《','撰著','著撰','拙著','著明','著論','新著','著於','而著','雜著','著足','著花','醫著','聲著']
+ ],
+ '乾':[
+ '干',
+ ['乾','乾隆','乾卦','乾道','乾宅','乾造','乾之卦','乾為','「乾」','乾坤','乾元','乾剛','乾方','乾施','乾首','乾象','乾啟','幹鈞','乾化','乾心','幹居','乾符','乾暉','幹曜','乾風','乾雷','乾州','中乾','連乾','乾沒','桑乾','乾乾','花乾']
+ ],
+ '瞭':[
+ '瞭',
+ ['了','瞭望','瞭然','瞭解','瞭若指掌','瞭如指掌']
+ ]
+};
+let sc2tcComb = {
+ '香烟袅袅':'香煙裊裊',
+ '袅袅香烟':'裊裊香煙',
+ '补丁':'補靪',
+ '老挝':'寮國',
+ '沈阳':'瀋陽',
+ '战栗':'顫慄',
+ '豆蔻':'荳蔻',
+ '累累':'纍纍',
+ '阿里':'阿里',
+ '跟斗':'觔斗',
+ '筋斗':'筋斗',
+ '折冲':'折衝',
+ '梁折':'樑折',
+ '松干':'松幹',
+ '家伙':'傢伙',
+ '伙夫':'伙伕',
+ '游斗':'游鬥',
+ '回游':'迴游',
+ '云游':'雲遊',
+ '云宵':'雲霄',
+ '考卷发':'考卷發',
+ '发卷':'髮卷',
+ "烟卷":"菸卷",
+ "连卷":"連卷",
+ '鼠标':'滑鼠',
+ 'U盘':'隨身碟',
+ '硬盘':'硬碟',
+ '磁盘':'磁碟',
+ '软件':'軟體',
+ '操作系统':'作業系統',
+ '文件系统':'檔案系統',
+ '笔记本':'筆記型電腦',
+ '台式机':'桌上型電腦',
+ '网络':'網路',
+ '打印':'列印',
+ '复印':'影印',
+ '充电宝':'行動電源',
+ '排插':'延長綫',
+ '程序':'程式',
+ '光盘':'光碟',
+ '音频':'音訊',
+ '屏幕':'熒幕',
+ '卸载':'解除安裝',
+ '文件夹':'檔案夾',
+ '局域网':'區域網路',
+ '服务器':'伺服器',
+ '打伞':'撐傘',
+ '洗面奶':'洗面乳',
+ '洗发水':'洗髮乳',
+ '打底裤':'内搭褲',
+ '电饭煲':'電鍋',
+ '发卡':'髮夾',
+ '聊天群':'聊天視窗',
+ '普通话':'國語',
+ '简历':'履歷',
+ '公交车':'公車',
+ '打车':'叫車',
+ '出租车':'計程車',
+ '地铁':'捷運',
+ '自行车':'脚踏車',
+ '摩托车':'機車',
+ '巴士':'客運',
+ '奔驰':'賓士',
+ '挺好的':'滿好的',
+ '牛逼':'厲害',
+ '左拐':'左轉',
+ '竖的':'直的',
+ '让一下':'借過',
+ '凉水':'冰水',
+ '打包':'外帶',
+ '外卖':'外送',
+ '很火':'很紅',
+ '宾馆':'飯店',
+ '旅馆':'賓館',
+ '包间':'包廂',
+ '卫生间':'化妝室',
+ '幼儿园':'幼稚園',
+ '公安局':'警察局',
+ '饭店':'餐廳',
+ '酒店':'飯店',
+ '高校':'大學',
+ '写字楼':'辦公大樓',
+ '换乘站':'轉運站',
+ '豆腐脑':'豆花',
+ '菠萝':'鳳梨',
+ '薯片':'洋芋片',
+ '土豆':'馬鈴薯',
+ '花生':'土豆',
+ '芝士':'起司',
+ '猕猴桃':'奇異果',
+ '盒饭':'便當',
+ '夜宵':'宵夜',
+ '金枪鱼':'鮪魚',
+ '三文鱼':'鮭魚',
+ '番石榴':'芭樂',
+ '冰激淋':'冰淇淋',
+ '冰棍':'冰棒',
+ '快餐':'速食',
+ '格斗':'挌鬥',
+ '西红柿':'番茄',
+ '西兰花':'花椰菜',
+ '创可贴':'OK綳',
+ '输液':'打點滴',
+ '献血':'捐血',
+ 'B超':'超音波檢查',
+ '疯牛病':'狂牛病',
+ '台球':'撞球',
+ '乒乓球':'桌球',
+ '自由泳':'自由式',
+ '蛙泳':'蛙式',
+ '初中生':'國中生',
+ '本科生':'大學生',
+ '程序员':'程式設計師',
+ '传销':'直銷',
+ '宇航员':'太空人',
+ '超声波':'超音波',
+ '北京时间':'中原標準時間',
+ '保质期':'保存期限',
+ '甲肝':'A肝',
+ '乙肝':'B肝',
+ '丙肝':'C肝',
+ '塑料':'塑膠',
+ '够不到':'搆不到',
+ '够不着':'搆不着',
+ '舞娘':'舞孃',
+ '秋千':'鞦韆',
+ '拐杖':'枴杖',
+ '剩余':'賸餘',
+ '胡同':'衚衕',
+ '个旧':'箇舊',
+ '朱砂':'硃砂',
+ '知识产权':'智慧財產權'
+};
+var stDict = {}, tsDict = {};
+var sc2tcCombTree = {}, tc2scCombTree = {};
+
+function traditionalizedString(orgStr, format) {
+ if (!orgStr) return "";
+ var str = '', char;
+ for (var i = 0; i < orgStr.length; i++) {
+ char = orgStr.charAt(i);
+ let search = sc2tcCombTree[char], searchIndex = i, hasMatch = false, startIndex = i;
+ while (search && searchIndex < orgStr.length) {
+ let downTree = null;
+ if (searchIndex < orgStr.length - 1) {
+ downTree = search[orgStr.charAt(searchIndex + 1)];
+ }
+ if (!downTree) {
+ if (search.end) {
+ hasMatch = true;
+ i = searchIndex;
+ if (format === OutputFormat.NORMAL) {
+ str += search.end;
+ } else {
+ const originalText = orgStr.substring(startIndex, searchIndex + 1);
+ const convertedText = search.end;
+ if (format === OutputFormat.BRACKET && originalText !== convertedText) {
+ str += convertedText + '(' + originalText + ')';
+ } else if (format === OutputFormat.RUBY && originalText !== convertedText) {
+ str += '' + convertedText + '';
+ } else {
+ str += convertedText;
+ }
+ }
+ }
+ break;
+ }
+ searchIndex++;
+ search = downTree;
+ }
+ if (hasMatch) {
+ continue;
+ }
+ if (char.charCodeAt(0) > 10000) {
+ var tChar = stDict[char], sc2tcItem = sc2tc[char];
+ if (tChar || sc2tcItem) {
+ var newChar = "";
+ if (sc2tcItem) {
+ if (sc2tcItem.length == 1) {
+ newChar = sc2tcItem;
+ } else {
+ var defaultChar = sc2tcItem[0], char_f = [], char_b = [], r = i;
+ while (--r >= 0 && char_f.length < 3) {
+ char_f.push(orgStr.charAt(r));
+ }
+ r = i;
+ while (++r < orgStr.length && char_b.length < 3) {
+ char_b.push(orgStr.charAt(r));
+ }
+ for (var j = 1; j < sc2tcItem.length; j++) {
+ var others = sc2tcItem[j], otherChar = others[0];
+ for (var k = 1; k < others.length; k++) {
+ var curOther = others[k], fadd = curOther.indexOf(char), badd = curOther.length - 1 - fadd, x = 0;
+ var processChar = char;
+ while (fadd-- > 0) {
+ if (!char_f[x]) break;
+ processChar = char_f[x] + processChar;
+ x++;
+ }
+ x = 0;
+ while (badd-- > 0) {
+ if (!char_b[x]) break;
+ processChar += char_b[x];
+ x++;
+ }
+ if (processChar.indexOf(curOther) != -1) {
+ newChar = otherChar;
+ break;
+ }
+ }
+ if (newChar) break;
+ }
+ if (!newChar) newChar = defaultChar;
+ }
+ } else {
+ newChar = tChar;
+ }
+ if (format === OutputFormat.BRACKET && char !== newChar) {
+ str += newChar + '(' + char + ')';
+ } else if (format === OutputFormat.RUBY && char !== newChar) {
+ str += '' + newChar + '';
+ } else {
+ str += newChar;
+ }
+ } else str += char;
+ }
+ else str += char;
+ }
+ return str;
+}
+
+function traditionalized(input, options) {
+ options = options || {};
+ const format = options.format !== undefined ? options.format : OutputFormat.NORMAL;
+
+ // Handle null/undefined
+ if (input == null) return input;
+
+ // Handle string
+ if (typeof input === 'string') {
+ return traditionalizedString(input, format);
+ }
+
+ // Handle array
+ if (Array.isArray(input)) {
+ return input.map(item => traditionalized(item, options));
+ }
+
+ // Handle object
+ if (typeof input === 'object') {
+ const result = {};
+ for (const key in input) {
+ if (input.hasOwnProperty(key)) {
+ result[key] = traditionalized(input[key], options);
+ }
+ }
+ return result;
+ }
+
+ // Return other types as-is (number, boolean, etc.)
+ return input;
+}
+
+function simplizedString(orgStr, format) {
+ if (!orgStr) return "";
+ var str = '', char;
+ for (var i = 0; i < orgStr.length; i++) {
+ char = orgStr.charAt(i);
+ let search = tc2scCombTree[char], searchIndex = i, hasMatch = false, startIndex = i;
+ while (search && searchIndex < orgStr.length) {
+ let downTree = null;
+ if (searchIndex < orgStr.length - 1) {
+ downTree = search[orgStr.charAt(searchIndex + 1)];
+ }
+ if (!downTree) {
+ if (search.end) {
+ hasMatch = true;
+ i = searchIndex;
+ if (format === OutputFormat.NORMAL) {
+ str += search.end;
+ } else {
+ const originalText = orgStr.substring(startIndex, searchIndex + 1);
+ const convertedText = search.end;
+ if (format === OutputFormat.BRACKET && originalText !== convertedText) {
+ str += convertedText + '(' + originalText + ')';
+ } else if (format === OutputFormat.RUBY && originalText !== convertedText) {
+ str += '' + convertedText + '';
+ } else {
+ str += convertedText;
+ }
+ }
+ }
+ break;
+ }
+ searchIndex ++;
+ search = downTree;
+ }
+ if (hasMatch) {
+ continue;
+ }
+ if (char.charCodeAt(0) > 10000) {
+ var sChar = tsDict[char], tc2scItem = tc2sc[char];
+ if (sChar || tc2scItem) {
+ var newChar = "";
+ if (tc2scItem) {
+ if (tc2scItem.length == 1) {
+ newChar = tc2scItem;
+ } else {
+ var defaultChar = tc2scItem[0], char_f = [], char_b = [], r = i;
+ while (--r >= 0 && char_f.length < 3) {
+ char_f.push(orgStr.charAt(r));
+ }
+ r = i;
+ while (++r < orgStr.length && char_b.length < 3) {
+ char_b.push(orgStr.charAt(r));
+ }
+ for (var j = 1; j < tc2scItem.length; j++) {
+ var others = tc2scItem[j], otherChar = others[0];
+ for (var k = 1; k < others.length; k++) {
+ var curOther = others[k], fadd = curOther.indexOf(char), badd = curOther.length - 1 - fadd, x = 0;
+ var processChar = char;
+ while (fadd-- > 0) {
+ if (!char_f[x]) break;
+ processChar = char_f[x] + processChar;
+ x++;
+ }
+ x = 0;
+ while (badd-- > 0) {
+ if (!char_b[x]) break;
+ processChar += char_b[x];
+ x++;
+ }
+ if (processChar.indexOf(curOther) != -1) {
+ newChar = otherChar;
+ break;
+ }
+ }
+ if (newChar) break;
+ }
+ if (!newChar) newChar = defaultChar;
+ }
+ } else {
+ newChar = sChar;
+ }
+ if (format === OutputFormat.BRACKET && char !== newChar) {
+ str += newChar + '(' + char + ')';
+ } else if (format === OutputFormat.RUBY && char !== newChar) {
+ str += '' + newChar + '';
+ } else {
+ str += newChar;
+ }
+ } else str += char;
+ }
+ else str += char;
+ }
+ return str;
+}
+
+function simplized(input, options) {
+ options = options || {};
+ const format = options.format !== undefined ? options.format : OutputFormat.NORMAL;
+
+ // Handle null/undefined
+ if (input == null) return input;
+
+ // Handle string
+ if (typeof input === 'string') {
+ return simplizedString(input, format);
+ }
+
+ // Handle array
+ if (Array.isArray(input)) {
+ return input.map(item => simplized(item, options));
+ }
+
+ // Handle object
+ if (typeof input === 'object') {
+ const result = {};
+ for (const key in input) {
+ if (input.hasOwnProperty(key)) {
+ result[key] = simplized(input[key], options);
+ }
+ }
+ return result;
+ }
+
+ // Return other types as-is (number, boolean, etc.)
+ return input;
+}
+
+function detect(text) {
+ if (!text) return ChineseType.UNKNOWN;
+
+ for (let i = 0; i < text.length; i++) {
+ const char = text.charAt(i);
+ if (char.charCodeAt(0) > 10000) {
+ const scChar = tsDict[char];
+ if (scChar && scChar !== char) {
+ return ChineseType.TRADITIONAL;
+ }
+ }
+ }
+
+ for (let i = 0; i < text.length; i++) {
+ const char = text.charAt(i);
+ if (char.charCodeAt(0) > 10000) {
+ const tcChar = stDict[char];
+ if (tcChar && tcChar !== char) {
+ return ChineseType.SIMPLIFIED;
+ }
+ }
+ }
+
+ return ChineseType.UNKNOWN;
+}
+
+function stcasc(cache, custom, disableTerms) {
+ if (!cache) cache = {};
+ if (cache.sc2tcCombTree && cache.tc2scCombTree) {
+ sc2tcCombTree = cache.sc2tcCombTree;
+ tc2scCombTree = cache.tc2scCombTree;
+ } else {
+ if (disableTerms) sc2tcComb = {};
+ if (custom && custom.length) {
+ for (let sc in custom) {
+ sc2tcComb[sc] = custom[sc];
+ }
+ }
+ function makeCombTree(key, value) {
+ let curTree = sc2tcCombTree;
+ for (let i = 0; i < key.length; i++) {
+ let curKey = key.charAt(i);
+ let branch = curTree[curKey];
+ let newTree = {};
+ if (i == key.length - 1) {
+ newTree = {"end": value};
+ if (branch) {
+ branch.end = value;
+ }
+ }
+ if (branch) {
+ curTree = branch;
+ } else {
+ curTree[curKey] = newTree;
+ curTree = newTree;
+ }
+ }
+ curTree = tc2scCombTree;
+ for (let i = 0; i < value.length; i++) {
+ let curKey = value.charAt(i);
+ let branch = curTree[curKey];
+ let newTree = {};
+ if (i == value.length - 1) {
+ newTree = {"end": key};
+ if (branch) {
+ branch.end = key;
+ }
+ }
+ if (branch) {
+ curTree = branch;
+ } else {
+ curTree[curKey] = newTree;
+ curTree = newTree;
+ }
+ }
+ }
+ for (let key in sc2tcComb) {
+ let value = sc2tcComb[key];
+ if (Array.isArray(value)) {
+ value.forEach(v => {
+ makeCombTree(key, v);
+ });
+ } else {
+ makeCombTree(key, value);
+ }
+ }
+ cache.sc2tcCombTree = sc2tcCombTree;
+ cache.tc2scCombTree = tc2scCombTree;
+ }
+ if (cache.stDict && cache.tsDict) {
+ stDict = cache.stDict;
+ tsDict = cache.tsDict;
+ } else {
+ for (let i = 0; i < scStr.length; i++) {
+ let _sc = scStr[i];
+ let _tc = tcStr[i];
+ if (!stDict[_sc]) stDict[_sc] = _tc;
+ if (!tsDict[_tc]) tsDict[_tc] = _sc;
+ }
+ Object.keys(oc2tc).forEach(key => {
+ let ocList = oc2tc[key];
+ for (let i = 0; i < ocList.length; i++) {
+ let oc = ocList[i];
+ stDict[oc] = key;
+ tsDict[oc] = tsDict[key] || key;
+ }
+ })
+ cache.stDict = stDict;
+ cache.tsDict = tsDict;
+ }
+ return {simplized, traditionalized, detect, cache};
+}
+
+export default stcasc;
diff --git a/Switch Traditional Chinese and Simplified Chinese/lib/test.js b/Switch Traditional Chinese and Simplified Chinese/lib/test.js
new file mode 100644
index 00000000000..55337889052
--- /dev/null
+++ b/Switch Traditional Chinese and Simplified Chinese/lib/test.js
@@ -0,0 +1,215 @@
+import stcasc, { ChineseType, OutputFormat } from './stcasc.lib.js';
+
+console.log('========== 简繁转换库测试 ==========\n');
+
+// 初始化
+const { traditionalized, simplized, detect } = stcasc();
+
+// 测试 1: 基础简体转繁体
+console.log('测试 1: 基础简体转繁体');
+const sc1 = '简繁转换 繁简切换 香烟 香烟袅袅 烟雾里 里长面子';
+const tc1 = traditionalized(sc1);
+console.log('输入:', sc1);
+console.log('输出:', tc1);
+console.log('');
+
+// 测试 2: 基础繁体转简体
+console.log('测试 2: 基础繁体转简体');
+const tc2 = '繁體中文 簡體中文';
+const sc2 = simplized(tc2);
+console.log('输入:', tc2);
+console.log('输出:', sc2);
+console.log('');
+
+// 测试 3: 检测简体中文
+console.log('测试 3: 检测简体中文');
+const text1 = '这是简体中文';
+const type1 = detect(text1);
+console.log('文本:', text1);
+console.log('类型:', type1 === ChineseType.SIMPLIFIED ? '简体中文' : '未知');
+console.log('枚举值:', type1);
+console.log('');
+
+// 测试 4: 检测繁体中文
+console.log('测试 4: 检测繁体中文');
+const text2 = '這是繁體中文';
+const type2 = detect(text2);
+console.log('文本:', text2);
+console.log('类型:', type2 === ChineseType.TRADITIONAL ? '繁体中文' : '未知');
+console.log('枚举值:', type2);
+console.log('');
+
+// 测试 5: 检测非中文
+console.log('测试 5: 检测非中文');
+const text3 = 'English Text';
+const type3 = detect(text3);
+console.log('文本:', text3);
+console.log('类型:', type3 === ChineseType.UNKNOWN ? '未知' : '中文');
+console.log('枚举值:', type3);
+console.log('');
+
+// 测试 6: 输出格式 - BRACKET(括号格式)
+console.log('测试 6: 输出格式 - BRACKET(括号格式)');
+const sc3 = '简体中文转换';
+const tc3 = traditionalized(sc3, { format: OutputFormat.BRACKET });
+console.log('输入:', sc3);
+console.log('输出:', tc3);
+console.log('');
+
+// 测试 7: 输出格式 - RUBY(HTML ruby标签格式)
+console.log('测试 7: 输出格式 - RUBY(HTML ruby标签格式)');
+const sc4 = '简体中文';
+const tc4 = traditionalized(sc4, { format: OutputFormat.RUBY });
+console.log('输入:', sc4);
+console.log('输出:', tc4);
+console.log('');
+
+// 测试 8: 繁体转简体 - BRACKET格式
+console.log('测试 8: 繁体转简体 - BRACKET格式');
+const tc5 = '繁體中文';
+const sc5 = simplized(tc5, { format: OutputFormat.BRACKET });
+console.log('输入:', tc5);
+console.log('输出:', sc5);
+console.log('');
+
+// 测试 9: 繁体转简体 - RUBY格式
+console.log('测试 9: 繁体转简体 - RUBY格式');
+const tc6 = '繁體中文';
+const sc6 = simplized(tc6, { format: OutputFormat.RUBY });
+console.log('输入:', tc6);
+console.log('输出:', sc6);
+console.log('');
+
+// 测试 10: 复杂文本转换 - 正常格式
+console.log('测试 10: 复杂文本转换 - 正常格式');
+const complex = '吃干面 把考卷发回来 卷发 知识产权';
+const complexTc = traditionalized(complex);
+console.log('输入:', complex);
+console.log('输出:', complexTc);
+console.log('');
+
+// 测试 11: 复杂文本转换 - BRACKET格式
+console.log('测试 11: 复杂文本转换 - BRACKET格式');
+const complexBracket = traditionalized(complex, { format: OutputFormat.BRACKET });
+console.log('输入:', complex);
+console.log('输出:', complexBracket);
+console.log('');
+
+// 测试 12: 术语转换
+console.log('测试 12: 术语转换');
+const terms = '软件 硬盘 网络 服务器 鼠标';
+const termsTc = traditionalized(terms);
+console.log('输入:', terms);
+console.log('输出:', termsTc);
+console.log('');
+
+// 测试 13: 混合文本
+console.log('测试 13: 混合文本');
+const mixed = 'This is 简体中文 and English';
+const mixedTc = traditionalized(mixed);
+console.log('输入:', mixed);
+console.log('输出:', mixedTc);
+console.log('');
+
+// ========== 新增测试:Array/Object 支持 ==========
+console.log('========== Array/Object 测试 ==========\n');
+
+// 测试 14: 转换数组(简体->繁体)
+console.log('测试 14: 转换数组(简体->繁体)');
+const arr1 = ['简体中文', '软件', '硬盘', 123, true, null];
+const arr1Tc = traditionalized(arr1);
+console.log('输入:', arr1);
+console.log('输出:', arr1Tc);
+console.log('');
+
+// 测试 15: 转换数组(繁体->简体)
+console.log('测试 15: 转换数组(繁体->简体)');
+const arr2 = ['繁體中文', '軟體', '硬碟', 456, false];
+const arr2Sc = simplized(arr2);
+console.log('输入:', arr2);
+console.log('输出:', arr2Sc);
+console.log('');
+
+// 测试 16: 转换对象(简体->繁体)
+console.log('测试 16: 转换对象(简体->繁体)');
+const obj1 = {
+ title: '简体中文标题',
+ description: '这是一个简体中文描述',
+ count: 100,
+ active: true,
+ tags: ['软件', '网络', '服务器']
+};
+const obj1Tc = traditionalized(obj1);
+console.log('输入:', JSON.stringify(obj1, null, 2));
+console.log('输出:', JSON.stringify(obj1Tc, null, 2));
+console.log('');
+
+// 测试 17: 转换对象(繁体->简体)
+console.log('测试 17: 转换对象(繁体->简体)');
+const obj2 = {
+ title: '繁體中文標題',
+ description: '這是一個繁體中文描述',
+ price: 99.99,
+ items: ['軟體', '硬碟']
+};
+const obj2Sc = simplized(obj2);
+console.log('输入:', JSON.stringify(obj2, null, 2));
+console.log('输出:', JSON.stringify(obj2Sc, null, 2));
+console.log('');
+
+// 测试 18: 转换嵌套数组
+console.log('测试 18: 转换嵌套数组');
+const nestedArr = [
+ '简体中文',
+ ['软件', '硬盘'],
+ [['网络', '服务器']]
+];
+const nestedArrTc = traditionalized(nestedArr);
+console.log('输入:', JSON.stringify(nestedArr));
+console.log('输出:', JSON.stringify(nestedArrTc));
+console.log('');
+
+// 测试 19: 转换嵌套对象
+console.log('测试 19: 转换嵌套对象');
+const nestedObj = {
+ user: {
+ name: '简体名称',
+ profile: {
+ bio: '这是简体中文简介',
+ skills: ['软件开发', '网络管理']
+ }
+ },
+ count: 42
+};
+const nestedObjTc = traditionalized(nestedObj);
+console.log('输入:', JSON.stringify(nestedObj, null, 2));
+console.log('输出:', JSON.stringify(nestedObjTc, null, 2));
+console.log('');
+
+// 测试 20: 数组转换 - BRACKET 格式
+console.log('测试 20: 数组转换 - BRACKET 格式');
+const arr3 = ['简体', '中文'];
+const arr3Bracket = traditionalized(arr3, { format: OutputFormat.BRACKET });
+console.log('输入:', arr3);
+console.log('输出:', arr3Bracket);
+console.log('');
+
+// 测试 21: 对象转换 - RUBY 格式
+console.log('测试 21: 对象转换 - RUBY 格式');
+const obj3 = {
+ text1: '简体',
+ text2: '中文'
+};
+const obj3Ruby = traditionalized(obj3, { format: OutputFormat.RUBY });
+console.log('输入:', JSON.stringify(obj3, null, 2));
+console.log('输出:', JSON.stringify(obj3Ruby, null, 2));
+console.log('');
+
+// 测试 22: 处理 null 和 undefined
+console.log('测试 22: 处理 null 和 undefined');
+console.log('null 输入:', traditionalized(null));
+console.log('undefined 输入:', traditionalized(undefined));
+console.log('包含 null 的数组:', traditionalized(['简体', null, '中文']));
+console.log('');
+
+console.log('========== 测试完成 ==========');
diff --git "a/Switch Traditional Chinese and Simplified Chinese/\347\260\241\347\271\201\350\275\211\346\217\233 by Ch'\303\274 Ts\303\252-t'ien.json" "b/Switch Traditional Chinese and Simplified Chinese/\347\260\241\347\271\201\350\275\211\346\217\233 by Ch'\303\274 Ts\303\252-t'ien.json"
new file mode 100644
index 00000000000..2c544d2a232
--- /dev/null
+++ "b/Switch Traditional Chinese and Simplified Chinese/\347\260\241\347\271\201\350\275\211\346\217\233 by Ch'\303\274 Ts\303\252-t'ien.json"
@@ -0,0 +1,1665 @@
+{
+ "*": {
+ "群": "群",
+ "香烟袅袅": "香煙裊裊",
+ "袅袅香烟": "裊裊香煙",
+ "老挝": "寮國",
+ "沈阳": "瀋陽",
+ "战栗": "顫慄",
+ "豆蔻": "荳蔻",
+ "累累": "纍纍",
+ "阿里": "阿里",
+ "跟斗": "觔斗",
+ "筋斗": "筋斗",
+ "折冲": "折衝",
+ "梁折": "樑折",
+ "松干": "松幹",
+ "家伙": "傢伙",
+ "伙夫": "伙伕",
+ "游斗": "游鬥",
+ "回游": "迴游",
+ "云游": "雲遊",
+ "云宵": "雲霄",
+ "考卷发": "考卷發",
+ "发卷": "髮卷",
+ "烟卷": "菸卷",
+ "连卷": "連卷",
+ "充电宝": "行動電源",
+ "排插": "延長綫",
+ "文件夹": "檔案夾",
+ "打伞": "撐傘",
+ "洗面奶": "洗面乳",
+ "洗发水": "洗髮乳",
+ "打底裤": "内搭褲",
+ "电饭煲": "電鍋",
+ "发卡": "髮夾",
+ "聊天群": "聊天視窗",
+ "普通话": "國語",
+ "简历": "履歷",
+ "公交车": "公車",
+ "打车": "叫車",
+ "出租车": "計程車",
+ "地铁": "捷運",
+ "自行车": "脚踏車",
+ "摩托车": "機車",
+ "巴士": "客運",
+ "奔驰": "賓士",
+ "挺好的": "滿好的",
+ "牛逼": "厲害",
+ "左拐": "左轉",
+ "估计": "大概",
+ "竖的": "直的",
+ "让一下": "借過",
+ "凉水": "冰水",
+ "打包": "外帶",
+ "外卖": "外送",
+ "很火": "很紅",
+ "宾馆": "飯店",
+ "旅馆": "賓館",
+ "包间": "包廂",
+ "卫生间": "化妝室",
+ "幼儿园": "幼稚園",
+ "公安局": "警察局",
+ "饭店": "餐廳",
+ "酒店": "飯店",
+ "高校": "大學",
+ "写字楼": "辦公大樓",
+ "换乘站": "轉運站",
+ "豆腐脑": "豆花",
+ "菠萝": "鳳梨",
+ "薯片": "洋芋片",
+ "土豆": "馬鈴薯",
+ "花生": "土豆",
+ "芝士": "起司",
+ "猕猴桃": "奇異果",
+ "盒饭": "便當",
+ "夜宵": "宵夜",
+ "金枪鱼": "鮪魚",
+ "三文鱼": "鮭魚",
+ "番石榴": "芭樂",
+ "冰激淋": "冰淇淋",
+ "冰棍": "冰棒",
+ "快餐": "速食",
+ "格斗": "挌鬥",
+ "西红柿": "番茄",
+ "西兰花": "花椰菜",
+ "创可贴": "OK綳",
+ "输液": "打點滴",
+ "献血": "捐血",
+ "B超": "超音波檢查",
+ "疯牛病": "狂牛病",
+ "台球": "撞球",
+ "乒乓球": "桌球",
+ "自由泳": "自由式",
+ "蛙泳": "蛙式",
+ "初中生": "國中生",
+ "本科生": "大學生",
+ "传销": "直銷",
+ "宇航员": "太空人",
+ "超声波": "超音波",
+ "北京时间": "中原標準時間",
+ "保质期": "保存期限",
+ "甲肝": "A肝",
+ "乙肝": "B肝",
+ "丙肝": "C肝",
+ "塑料": "塑膠",
+ "够不到": "搆不到",
+ "够不着": "搆不着",
+ "舞娘": "舞孃",
+ "秋千": "鞦韆",
+ "拐杖": "枴杖",
+ "剩余": "賸餘",
+ "胡同": "衚衕",
+ "个旧": "箇舊縣",
+ "朱砂": "硃砂",
+ "知识产权": "智慧財產權",
+ "·布尔": "·布爾",
+ "128 位": "128 位元",
+ "128位": "128位元",
+ "32 位": "32 位元",
+ "32位": "32位元",
+ "360 搜索": "360 搜索",
+ "360 综合搜索": "360 綜合搜索",
+ "360搜索": "360搜索",
+ "360综合搜索": "360綜合搜索",
+ "64 位": "64 位元",
+ "64位": "64位元",
+ "80 位": "80 位元",
+ "80位": "80位元",
+ "A 盘": "本機磁碟 (A)",
+ "A盘": "本機磁碟(A)",
+ "B 盘": "本機磁碟 (B)",
+ "BC 范式": "BC 正規形式",
+ "BC范式": "BC正規形式",
+ "B盘": "本機磁碟(B)",
+ "C 盘": "本機磁碟 (C)",
+ "C++ 的类": "C++ 的類別",
+ "C++ 的类型": "C++ 的類型",
+ "C++ 类": "C++ 類別",
+ "C++ 类似": "C++ 類似",
+ "C++ 类型": "C++ 類型",
+ "C++的类": "C++的類別",
+ "C++的类型": "C++的類型",
+ "C++类": "C++類別",
+ "C++类似": "C++類似",
+ "C++类型": "C++類型",
+ "C盘": "本機磁碟(C)",
+ "D 盘": "本機磁碟 (D)",
+ "Device Stage": "裝置舞台",
+ "DK 范式": "DK 規格化",
+ "DK范式": "DK規格化",
+ "DVD Maker": "DVD 製作程式",
+ "D盘": "本機磁碟(D)",
+ "E 盘": "本機磁碟 (E)",
+ "Enter 键": "RETURN 鍵",
+ "Enter键": "RETURN鍵",
+ "E盘": "本機磁碟(E)",
+ "F 盘": "本機磁碟 (F)",
+ "F盘": "本機磁碟(F)",
+ "G 盘": "本機磁碟 (G)",
+ "Google 云消息传递": "Google 雲端通訊",
+ "Google 工具条": "Google 工具列",
+ "Google 文档": "Google 文件",
+ "Google 视频": "Google 影片",
+ "Google云消息传递": "Google雲端通訊",
+ "Google工具条": "Google工具列",
+ "Google文档": "Google文件",
+ "Google视频": "Google影片",
+ "GSM 移动": "GSM 行動",
+ "GSM移动": "GSM行動",
+ "GUID 分区表": "GUID 磁碟分割表",
+ "GUID分区表": "GUID磁碟分割表",
+ "G盘": "本機磁碟(G)",
+ "H 盘": "本機磁碟 (H)",
+ "H盘": "本機磁碟(H)",
+ "I 盘": "本機磁碟 (I)",
+ "Internet 双陆棋": "網際網路西洋骰子棋",
+ "Internet 跳棋": "網際網路西洋棋",
+ "Internet 黑桃王": "網際網路西式拱豬",
+ "IP核": "矽智財",
+ "I盘": "本機磁碟(I)",
+ "J 盘": "本機磁碟 (J)",
+ "Java 的类": "Java 的類別",
+ "Java 的类型": "Java 的類型",
+ "Java 类": "Java 類別",
+ "Java 类似": "Java 類似",
+ "Java 类型": "Java 類型",
+ "Java的类": "Java的類別",
+ "Java的类型": "Java的類型",
+ "Java类": "Java類別",
+ "Java类似": "Java類似",
+ "Java类型": "Java類型",
+ "J盘": "本機磁碟(J)",
+ "K 盘": "本機磁碟 (K)",
+ "K盘": "本機磁碟(K)",
+ "L 盘": "本機磁碟 (L)",
+ "L盘": "本機磁碟(L)",
+ "M 盘": "本機磁碟 (M)",
+ "M盘": "本機磁碟(M)",
+ "N 盘": "本機磁碟 (N)",
+ "N盘": "本機磁碟(N)",
+ "O 盘": "本機磁碟 (O)",
+ "O盘": "本機磁碟(O)",
+ "P 盘": "本機磁碟 (P)",
+ "PN 结": "PN 接面",
+ "P-N 结": "P-N 接面",
+ "PN结": "PN接面",
+ "P-N结": "P-N接面",
+ "P盘": "本機磁碟(P)",
+ "Q 盘": "本機磁碟 (Q)",
+ "Q盘": "本機磁碟(Q)",
+ "R 盘": "本機磁碟 (R)",
+ "R盘": "本機磁碟(R)",
+ "S 盘": "本機磁碟 (S)",
+ "Sun 微系统": "昇陽電腦",
+ "Sun微系统": "昇陽電腦",
+ "S盘": "本機磁碟(S)",
+ "T 盘": "本機磁碟 (T)",
+ "T盘": "本機磁碟(T)",
+ "USB 数字电视棒": "USB 數位電視棒",
+ "USB 电视棒": "USB 電視棒",
+ "USB数字电视棒": "USB數位電視棒",
+ "USB电视棒": "USB電視棒",
+ "V 盘": "本機磁碟 (V)",
+ "V盘": "本機磁碟(V)",
+ "W 盘": "本機磁碟 (W)",
+ "Windows 接口": "Windows 介面",
+ "Windows 控制面板": "Windows 控制台",
+ "Windows 日记本": "Windows 筆記本",
+ "Windows 照片查看器": "Windows 相片檢視器",
+ "Windows接口": "Windows介面",
+ "Windows控制面板": "Windows控制台",
+ "Windows日记本": "Windows筆記本",
+ "Windows照片查看器": "Windows相片檢視器",
+ "W盘": "本機磁碟(W)",
+ "X 盘": "本機磁碟 (X)",
+ "X盘": "本機磁碟(X)",
+ "Y 盘": "本機磁碟 (Y)",
+ "Y盘": "本機磁碟(Y)",
+ "Z 盘": "本機磁碟 (Z)",
+ "Z盘": "本機磁碟(Z)",
+ "七号信令系统": "第七號發信系統",
+ "七段数码管": "七段顯示器",
+ "万维网": "全球資訊網",
+ "万维网联盟": "全球資訊網協會",
+ "三叉搜索树": "三元搜尋樹",
+ "三叉树": "三元樹",
+ "三叉链表": "三元連結串列",
+ "上下文切换": "上下文交換",
+ "上网本": "小筆電",
+ "下划线": "底線",
+ "下拉列表": "下拉式清單",
+ "下拉菜单": "下拉式選單",
+ "下溢": "欠位",
+ "与门": "及閘",
+ "与非逻辑": "反及邏輯",
+ "与非门": "反及閘",
+ "专用集成电路": "特殊應用積體電路",
+ "世界互联网大会": "世界互聯網大會",
+ "世界移动通信大会": "世界行動通訊大會",
+ "丢失": "遺失",
+ "个人数码助理": "個人數位助理",
+ "个人网": "個人區域網路",
+ "个性化": "個人化",
+ "中端": "中階",
+ "中级": "中階",
+ "中间件": "中介軟體",
+ "丰富互联网应用程序": "多樣化網際網路應用程式",
+ "串口": "序列埠",
+ "串行": "序列",
+ "串行端口": "序列埠",
+ "串行计算": "序列計算",
+ "主存": "主記憶體",
+ "主引导记录": "主開機紀錄",
+ "主板": "主機板",
+ "主页": "首頁",
+ "主题": "佈景主題",
+ "乐视云计算": "樂視雲計算",
+ "乔布斯": "賈伯斯",
+ "九段数码管": "九段顯示器",
+ "书写器": "小作家",
+ "二叉": "二元",
+ "二叉堆": "二元堆積",
+ "二叉搜索树": "二元搜尋樹",
+ "二叉树": "二元樹",
+ "二叉链表": "二元連結串列",
+ "二极管": "二極體",
+ "二进制补码": "二補數",
+ "云存储": "雲端儲存",
+ "云盘": "雲端硬碟",
+ "云计算": "雲端運算",
+ "互信息": "相互資訊",
+ "互动娱乐": "互動娛樂",
+ "互动百科": "互動百科",
+ "互联网": "網際網路",
+ "互联网信息办公室": "互聯網信息辦公室",
+ "互联网内容提供商": "線上內容提供者",
+ "互联网应急中心": "互聯網應急中心",
+ "互联网服务提供商": "網際網路服務提供者",
+ "互联网络信息中心": "互聯網絡信息中心",
+ "五笔字型": "五筆字型",
+ "亚阈值": "次臨界",
+ "交互": "互動",
+ "产品密钥": "產品金鑰",
+ "人工智能": "人工智慧",
+ "人工神經": "類神經",
+ "人机界面": "人機介面",
+ "人渣文本": "人渣文本",
+ "人脸识别": "臉部辨識",
+ "介质": "媒介",
+ "介质相关接口": "媒體相依介面",
+ "他支持": "他支持",
+ "代码": "程式碼",
+ "代码生成器": "碼產生器",
+ "代码表": "代碼表",
+ "代码页": "頁碼",
+ "令牌": "權杖",
+ "以太网": "乙太網路",
+ "任务切换": "工作切換",
+ "任务栏": "工作列",
+ "任务管理器": "工作管理員",
+ "任务视图": "工作檢視",
+ "企业移动管理": "企業行動管理",
+ "企图学": "企圖學",
+ "优化": "最佳化",
+ "优盘": "隨身碟",
+ "优酷视频": "優酷視頻",
+ "会话": "對談",
+ "会话劫持": "連線劫持",
+ "会话标识": "交談識別碼",
+ "传感器": "感測器",
+ "传输门": "傳輸閘",
+ "伪代码": "虛擬碼",
+ "伯克利软件套件": "柏克萊軟體套件",
+ "位串": "位元串",
+ "位图": "點陣圖",
+ "位操作": "位元運算",
+ "位模式": "位元型樣",
+ "位段": "位元欄",
+ "低保真": "低傳真",
+ "低清": "低畫質",
+ "低端": "低階",
+ "低级": "低階",
+ "低级编程语言": "低階程式語言",
+ "低级语言": "低階語言",
+ "例程": "常式",
+ "依存类型": "依存型別",
+ "依赖类型": "依值型別",
+ "便携式": "可攜式",
+ "便携版": "可攜式版本",
+ "便笺": "自黏便箋",
+ "保存": "儲存",
+ "保护继电器": "保護電驛",
+ "信号": "訊號",
+ "信号量": "號誌",
+ "信息": "資訊",
+ "信息产业": "資訊工業",
+ "信息及通信技术": "資訊及通訊科技",
+ "信息学": "資訊學",
+ "信息安全": "資訊安全",
+ "信息技术": "資訊科技",
+ "信息接触": "資訊參與",
+ "信息时代": "資訊時代",
+ "信息管理": "資訊管理",
+ "信息过载": "資訊超載",
+ "信道": "頻道",
+ "修饰符": "修飾詞",
+ "偏置": "偏壓",
+ "像素": "畫素",
+ "元数据": "元資料",
+ "元编程": "元程式設計",
+ "兆字节": "百萬位元組",
+ "光伏": "太陽能光電",
+ "光刻": "微影",
+ "光刻胶": "光阻劑",
+ "光掩模": "光罩",
+ "光标": "游標",
+ "光电二极管": "光電二極體",
+ "光盘": "光碟",
+ "光盘驱动器": "光碟機",
+ "光纤分布式数据接口": "光纖分散式資料介面",
+ "光网络终端": "光纖網路終端",
+ "入门版": "簡易版",
+ "全局": "全域",
+ "全局唯一标识分区表": "GUID 磁碟分割表",
+ "全屏": "全螢幕",
+ "全息": "全像",
+ "全球移动通信系统协会": "全球行動通訊系統協會",
+ "全角": "全形",
+ "全面屏手机": "全螢幕手機",
+ "全高清": "超高畫質",
+ "八叉树": "八元樹",
+ "公共陆基移动网": "公用陸上行動網路",
+ "公文包": "公事包",
+ "共享": "共享",
+ "共享文件夹": "共用資料夾",
+ "共享软件": "共享軟體",
+ "共模抑制比": "共模拒斥比",
+ "关系数据库": "關聯式資料庫",
+ "兼容": "相容",
+ "内容分发网络": "內容傳遞網路",
+ "内容可寻址存储器": "可定址內容記憶體",
+ "内核": "核心",
+ "内核事务管理器": "核心交易管理員",
+ "内置": "內建",
+ "内联": "行內",
+ "内联网": "內部網路",
+ "内部网": "內部網路",
+ "内部网络": "內部網路",
+ "内链": "內部連結",
+ "冒泡排序": "泡沫排序",
+ "写保护": "防寫",
+ "写字板": "WordPad",
+ "冯·诺伊曼": "馮·紐曼",
+ "击穿电压": "崩潰電壓",
+ "函数": "函式",
+ "函数式": "函數式",
+ "函数式编程": "函式語言程式設計",
+ "函数编程语言": "函式程式語言",
+ "刀片服务器": "刀鋒伺服器",
+ "分区": "分割區",
+ "分卷压缩": "分割壓縮",
+ "分层树形视图": "多層次樹狀介面",
+ "分层视图": "多層次樹狀介面",
+ "分布式": "分散式",
+ "分析器": "剖析器",
+ "分立器件": "離散元件",
+ "分组交换": "封包交換",
+ "分组密码": "區塊加密法",
+ "分组码": "區塊碼",
+ "分辨率": "解析度",
+ "分配单元": "單位配置",
+ "创建": "建立",
+ "刷新": "重新整理",
+ "刷新缓存": "清除快取",
+ "刻录": "燒錄",
+ "刻蚀": "蝕刻",
+ "前向链接": "正向鏈結",
+ "前缀": "字首",
+ "剪切": "剪下",
+ "剪贴板": "剪貼簿",
+ "办公室套件": "辦公室套件",
+ "功率因数": "功率因素",
+ "功能手机": "功能型手機",
+ "加载": "載入",
+ "动态类型": "動態型別",
+ "动态绑定": "動態繫結",
+ "助记符": "輔助記憶碼",
+ "匹配": "符合",
+ "区块链接": "區塊鏈結",
+ "区域和语言选项": "地區及語言選項",
+ "十六段数码管": "十六段顯示器",
+ "十四段数码管": "十四段顯示器",
+ "半角": "半形",
+ "协作": "協同運作",
+ "协议": "協定",
+ "单元格": "儲存格",
+ "单参函数": "一元函式",
+ "单点登录": "單一登入",
+ "单片系统": "單晶片系統",
+ "单相串励电动机": "交流整流子電動機",
+ "单选按钮": "無線電鈕",
+ "单选框": "無線電鈕",
+ "单通道": "單連結",
+ "博客": "部落格",
+ "博客来": "博客來",
+ "占位符": "預留位置",
+ "即插即用": "隨插即用",
+ "卷影复制": "磁碟區陰影複製",
+ "厄利效应": "爾利效應",
+ "压缩包": "壓縮檔",
+ "原生": "固有",
+ "参数列表": "參數列",
+ "参数表": "參數列",
+ "参考资料": "參考資料",
+ "双参函数": "二元函數",
+ "双通道": "雙連結",
+ "反向": "逆向",
+ "反码": "一補數",
+ "反规范化": "解除規格化",
+ "反链接": "反鏈結",
+ "反馈": "回饋",
+ "发射极": "射極",
+ "发生器": "產生器",
+ "发短信": "傳簡訊",
+ "发行": "釋出",
+ "发送": "傳送",
+ "受主": "受體",
+ "变量": "變數",
+ "叠加定理": "重疊定理",
+ "句柄": "控制代碼",
+ "只写": "唯寫",
+ "只写存储器": "唯寫記憶體",
+ "只读": "唯讀",
+ "只读存储器": "唯讀記憶體",
+ "可变码率": "變動位元速率",
+ "可执行": "可執行",
+ "可执行文件": "可執行檔",
+ "可扩展": "可延伸",
+ "可扩展商业报告语言": "可延伸商用報告語言",
+ "可扩展固件接口": "可延伸韌體介面",
+ "可扩展置标语言": "可延伸標示語言",
+ "可控硅": "矽控整流器",
+ "可移动": "抽取式",
+ "可移植文档格式": "可攜式文件格式",
+ "可编程逻辑门阵列": "可程式化邏輯閘陣列",
+ "可编程逻辑阵列": "可程式化邏輯陣列",
+ "可编程阵列逻辑": "可程式化陣列邏輯",
+ "可视化": "視覺化",
+ "可重构计算": "可重組計算",
+ "台式机": "桌上型電腦",
+ "吉字节": "吉位元組",
+ "吉比特以太网": "十億位元乙太網路",
+ "同或逻辑": "反互斥或邏輯",
+ "同或门": "反互斥或閘",
+ "名字空间": "命名空間",
+ "后台流量": "背景流量",
+ "后台运行": "背景執行",
+ "后缀": "字尾",
+ "向下兼容": "向下相容",
+ "向导": "精靈",
+ "启动引导程序": "啟動載入程式",
+ "启动栏": "啟動列",
+ "启动盘": "啟動磁碟",
+ "启动转换": "啟動切換",
+ "启辉器": "啟動器",
+ "呼叫转移": "來電轉駁",
+ "命令列表": "命令列表",
+ "命令式编程": "指令式程式設計",
+ "命令提示符": "命令提示字元",
+ "命令栏": "命令列",
+ "命令行": "命令列",
+ "命令链接": "命令鏈結",
+ "哈希": "雜湊",
+ "响应": "回應",
+ "商业模型": "商業模式",
+ "器件": "元件",
+ "四叉树": "四元樹",
+ "回复": "回覆",
+ "回复原": "回復原",
+ "回收站": "資源回收筒",
+ "回调": "回呼",
+ "回车符": "回車字元",
+ "回车键": "確認鍵",
+ "因特网密钥交换": "網際網路金鑰交換",
+ "固件": "韌體",
+ "固定电话": "固網電信",
+ "固定码率": "固定位元速率",
+ "固实压缩": "結實壓縮",
+ "国家互联网应急中心": "國家互聯網應急中心",
+ "国家测绘地理信息局": "國家測繪地理信息局",
+ "图像文件": "圖檔",
+ "图像浏览器": "圖片檢視器",
+ "图形处理器": "圖形處理器",
+ "图形学": "圖學",
+ "图形用户界面": "圖形化使用者介面",
+ "图形计算器": "繪圖計算機",
+ "图标": "圖示",
+ "图灵完全": "圖靈完備",
+ "图灵完备": "圖靈完備",
+ "土豆视频": "土豆視頻",
+ "在线": "線上",
+ "在线视频": "網路影片",
+ "地图学": "地圖學",
+ "地址": "位址",
+ "地址栏": "網址列",
+ "地面": "無線",
+ "地面广播": "無線廣播",
+ "地面数字电视": "數位無線電視",
+ "地面电视": "無線電視",
+ "坏道": "壞軌",
+ "坐标": "座標",
+ "城域网": "都會網路",
+ "基于原型的编程": "原型程式設計",
+ "基于类": "類別為基",
+ "基于类似": "基於類似",
+ "基于类型": "基於類型",
+ "基于类的编程": "類別為基的程式設計",
+ "基带": "基頻",
+ "基类": "基礎類別",
+ "基类型": "基本類型",
+ "堆排序": "堆積排序",
+ "堆栈": "堆疊",
+ "堆栈帧": "堆疊框",
+ "增强现实": "擴增實境",
+ "墨球": "筆跡球",
+ "壁纸": "桌布",
+ "声卡": "音效卡",
+ "声明语句": "宣告",
+ "处理函数": "處理常式",
+ "复印": "影印",
+ "复杂度类": "複雜度類別",
+ "复杂度类似": "複雜度類似",
+ "复杂性类": "複雜性類別",
+ "复选按钮": "核取按鈕",
+ "复选框": "核取方塊",
+ "外延": "磊晶",
+ "外置": "外接",
+ "外置硬盘": "外接硬碟",
+ "外链": "外部連結",
+ "外键": "外來鍵",
+ "多主体系统": "多代理系統",
+ "多任务": "多工",
+ "多宿主": "內送流量備援容錯機制",
+ "多态": "多型",
+ "多线程": "多緒",
+ "多谐振荡器": "複振器",
+ "多选框": "核取方塊",
+ "多频道网络": "多頻道聯播網",
+ "大型机": "大型電腦",
+ "大数据": "巨量資料",
+ "大规模集成电路": "大型積體電路",
+ "太字节": "兆位元組",
+ "太阳能光伏": "太陽能光電",
+ "头文件": "標頭檔",
+ "夹断": "夹止",
+ "套接层": "通訊層",
+ "她支持": "她支持",
+ "子例程": "次常式",
+ "子类型": "子類型",
+ "子网": "子網路",
+ "字体": "字型",
+ "字段": "欄位",
+ "字符": "字元",
+ "字符串": "字串",
+ "字符号": "字符號",
+ "字符打印机": "字元列印機",
+ "字符映射表": "字元對應表",
+ "字符生成器": "字元產生器",
+ "字节": "位元組",
+ "字节跳动": "字節跳動",
+ "存储": "儲存",
+ "存储卡": "記憶卡",
+ "存储器": "記憶體",
+ "存储程序": "儲存程序",
+ "守护进程": "守護行程",
+ "安全中心": "資訊安全中心",
+ "安全套接层": "安全通訊協定",
+ "安全帐户管理器": "安全性帳戶管理員",
+ "安全软件": "安全軟體",
+ "安装包": "安裝套件",
+ "完全屏蔽": "完全屏蔽",
+ "完备码": "完整码",
+ "宏": "巨集",
+ "宏内核": "單核心",
+ "宏块": "大區塊",
+ "宏病毒": "巨集病毒",
+ "定位框": "定位域",
+ "定制": "客製化",
+ "实例方法": "實體方法",
+ "实时": "即時",
+ "审核": "稽核",
+ "客户端": "用戶端",
+ "家庭": "住家",
+ "家庭地址": "住家地址",
+ "家庭普通版": "家用入門版",
+ "家庭版": "家用版",
+ "家庭组": "家用群組",
+ "家庭高级版": "家用進階版",
+ "家长控制": "家長監護",
+ "宽屏": "寬螢幕",
+ "宽带": "寬頻",
+ "寄存器": "暫存器",
+ "密码认证协议": "通行碼鑑別協定",
+ "密钥": "金鑰",
+ "对话框": "對話方塊",
+ "对象": "物件",
+ "对象连接与嵌入": "物件連結與嵌入",
+ "寻址": "定址",
+ "寻址模式": "定址模式",
+ "导入": "匯入",
+ "导出": "匯出",
+ "导航条": "導覽列",
+ "封装内系统": "封裝體系",
+ "射极跟随器": "射極隨耦器",
+ "小组": "群組",
+ "尧字节": "佑位元組",
+ "尾注": "章節附註",
+ "尾部递归": "尾端遞迴",
+ "局域网": "區域網路",
+ "层次结构": "階層",
+ "屏幕": "螢幕",
+ "屏幕保护程序": "螢幕保護裝置",
+ "屏幕键盘": "螢幕小鍵盤",
+ "属性": "內容",
+ "嵌套": "巢狀",
+ "工业和信息化": "工業和信息化",
+ "工作组": "工作群組",
+ "工具栏": "工具列",
+ "工程": "專案",
+ "工艺": "製程",
+ "工频": "電源頻率",
+ "差错检测码": "誤差檢測碼",
+ "已保存的搜索": "儲存的搜尋",
+ "布尔": "布林",
+ "布尔逻辑": "布林運算",
+ "帖子": "貼文",
+ "带圈": "圍繞",
+ "带圈字符": "圍繞字元",
+ "带宽": "頻寬",
+ "帧": "影格",
+ "帧同步": "影格同步化",
+ "帧指针": "影格指標",
+ "帧率": "影格率",
+ "帮助": "說明",
+ "帮助与支持": "說明與支援",
+ "帮助文档": "說明文件",
+ "常量": "常數",
+ "平均码率": "平均位元速率",
+ "平板电脑": "平板電腦",
+ "并发": "並行",
+ "并发计算": "並行計算",
+ "并行": "並列",
+ "并行端口": "並列埠",
+ "并行计算": "平行計算",
+ "幻灯片": "投影片",
+ "广告位": "廣告區",
+ "广域网": "廣域網路",
+ "应用程序": "應用程式",
+ "应用程序接口": "應用程式介面",
+ "开启": "開啟",
+ "开始菜单": "開始功能表",
+ "开放手持设备联盟": "開放手機聯盟",
+ "开放移动联盟": "開放行動聯盟",
+ "异常处理": "例外處理",
+ "异或": "互斥或",
+ "异或逻辑": "互斥或邏輯",
+ "异或门": "互斥或閘",
+ "异步": "非同步",
+ "异质结": "異質接面",
+ "引导": "啟動",
+ "引用": "參照",
+ "弱类型": "弱型別",
+ "弹出窗口": "彈出式視窗",
+ "强类型": "強型別",
+ "归并": "合併",
+ "当且仅当": "若且唯若",
+ "当前版本": "目前版本",
+ "当机器": "當機器",
+ "录像带": "錄影帶",
+ "彩信": "多媒體簡訊",
+ "彩屏": "彩色螢幕",
+ "影片流": "影片串流",
+ "影音流": "影音串流",
+ "循环": "迴圈",
+ "微博": "微網誌",
+ "微博客": "微部落格",
+ "微型博客": "微型部落格",
+ "微比特": "微比特",
+ "快捷工具栏": "快捷列",
+ "快捷方式": "捷徑",
+ "快捷键": "快速鍵",
+ "性价比": "CP 值",
+ "性能": "效能",
+ "总线": "匯流排",
+ "恢复": "回復",
+ "恢复光盘": "還原光碟",
+ "恢复原": "恢復原",
+ "恢复记录": "恢復記錄",
+ "情景模式": "音訊設定檔",
+ "我支持": "我支持",
+ "我的文档": "我的文件",
+ "或门": "或閘",
+ "或非逻辑": "反或邏輯",
+ "或非门": "反或閘",
+ "截": "擷",
+ "截取": "擷取",
+ "截图": "擷取",
+ "截图工具": "剪取工具",
+ "截屏": "螢幕擷取",
+ "扇区": "磁區",
+ "手持地面无线": "手持式數位視訊廣播",
+ "扎克伯格": "祖克柏",
+ "扒站": "砍站",
+ "打印": "列印",
+ "打印机": "印表機",
+ "打印预览": "預覽列印",
+ "托管": "代管",
+ "托管代码": "受控代碼",
+ "执行者": "執行者",
+ "扩展 A 区": "擴充 A 區",
+ "扩展 B 区": "擴充 B 區",
+ "扩展 C 区": "擴充 C 區",
+ "扩展 D 区": "擴充 D 區",
+ "扩展 E 区": "擴充 E 區",
+ "扩展 F 区": "擴充 F 區",
+ "扩展 G 区": "擴充 G 區",
+ "扩展A区": "擴充A區",
+ "扩展B区": "擴充B區",
+ "扩展C区": "擴充C區",
+ "扩展D区": "擴充D區",
+ "扩展E区": "擴充E區",
+ "扩展F区": "擴充F區",
+ "扩展G区": "擴充G區",
+ "扩展区": "擴充區",
+ "扩展名": "副檔名",
+ "扩展支持": "延伸支援",
+ "扩展汉字": "擴充漢字",
+ "扩展现实": "延展實境",
+ "扩谱": "展譜",
+ "扩频": "展頻",
+ "扫描仪": "掃描器",
+ "扫雷": "踩地雷",
+ "扬声器": "喇叭",
+ "批处理": "批次處理",
+ "批处理文件": "批次檔",
+ "批处理程序": "批次程式",
+ "批量": "批次",
+ "投影仪": "投影機",
+ "抖音短视频": "抖音短視頻",
+ "抛出": "丟擲",
+ "抽样": "取樣",
+ "拍字节": "拍位元組",
+ "拒绝服务": "阻斷服務",
+ "持久性": "永續性",
+ "指针": "指標",
+ "按位": "按位元",
+ "捷威": "桀威",
+ "接入复用器": "接取多工器",
+ "接入点": "存取點",
+ "接近传感器": "鄰近感測器",
+ "控件": "控制項",
+ "控制面板": "控制台",
+ "推导": "推導",
+ "推送": "推播",
+ "掩模": "光罩",
+ "掩码": "遮罩",
+ "提交": "送出",
+ "搜狐博客": "搜狐博客",
+ "搜狐视频": "搜狐視頻",
+ "搜狗搜索": "搜狗搜索",
+ "搜索": "搜尋",
+ "搜索关键字": "搜尋鍵碼",
+ "搜索框": "搜尋方塊",
+ "摄像头": "網路攝影機",
+ "摄像机": "攝錄影機",
+ "撤销": "復原",
+ "播客": "Podcast",
+ "操作中心": "重要訊息中心",
+ "操作对象": "運算物件",
+ "操作数": "運算元",
+ "操作系统": "作業系統",
+ "支持": "支援",
+ "支持他": "支持他",
+ "支持向量": "支持向量",
+ "支持她": "支持她",
+ "支持我": "支持我",
+ "支持者": "支持者",
+ "收藏夹": "我的最愛",
+ "放大区": "主動區",
+ "散列": "雜湊",
+ "数字": "數位",
+ "数字信号处理器": "數位訊號處理器",
+ "数字化": "數位化",
+ "数字发行": "數位發行",
+ "数字图像": "數位影像",
+ "数字地面电视": "數位無線電視",
+ "数字媒体": "數位媒體",
+ "数字广播": "數位廣播",
+ "数字模式": "數位模式",
+ "数字模拟转换器": "數位類比轉換器",
+ "数字水印": "數位浮水印",
+ "数字测图": "數位製圖",
+ "数字照片": "數位相片",
+ "数字电视": "數位電視",
+ "数字相机": "數位相機",
+ "数字移动": "數位行動",
+ "数字签名": "數位簽章",
+ "数字视频": "數位影片",
+ "数字证书": "數位憑證",
+ "数字资产": "數位資產",
+ "数字身份": "數位身分",
+ "数据": "資料",
+ "数据中心": "資料中心",
+ "数据仓库": "資料倉儲",
+ "数据包": "封包",
+ "数据包含": "資料包含",
+ "数据包括": "資料包括",
+ "数据帧": "資料框",
+ "数据库": "資料庫",
+ "数据报文": "資料報",
+ "数据挖掘": "資料探勘",
+ "数据捕捞": "資料挖掘",
+ "数据清洗": "資料淨化",
+ "数据源": "資料來源",
+ "数据选择器": "數據多工器",
+ "数据链接": "資料鏈結",
+ "数据集市": "資料市集",
+ "数码视讯": "數碼視訊",
+ "数码通": "數碼通",
+ "数组": "陣列",
+ "文件": "檔案",
+ "文件主名": "主檔名",
+ "文件名": "檔名",
+ "文件名字": "檔案名字",
+ "文件名字空间": "檔案命名空間",
+ "文件名称": "檔案名稱",
+ "文件复制服务": "檔案複寫服務",
+ "文件扩展名": "副檔名",
+ "文件描述符": "檔案描述子",
+ "文件管理器": "檔案管理員",
+ "文件系统": "檔案系統",
+ "文件资源管理器": "檔案總管",
+ "文字体系": "文字體系",
+ "文字处理": "文書處理",
+ "文字处理器": "文書處理器",
+ "文本": "文字",
+ "文本文件": "文字檔案",
+ "文本框": "文字方塊",
+ "文本编辑器": "文字編輯器",
+ "文档": "文件",
+ "文档对象模型": "文件物件模型",
+ "文档文件": "文件檔案",
+ "斯诺登": "史諾登",
+ "新浪博客": "新浪博客",
+ "新浪视频": "新浪視頻",
+ "方程式": "方程式",
+ "施主": "施體",
+ "施乐": "全錄",
+ "施密特触发器": "施密特觸發器",
+ "旗舰版": "旗艦版",
+ "无损": "無失真",
+ "无损压缩": "無失真壓縮",
+ "无源滤波器": "被動式濾波器",
+ "无用信息": "多餘的資料",
+ "日历": "行事曆",
+ "日历程序": "行事曆程式",
+ "日志": "紀錄檔",
+ "时分": "分時",
+ "时分复用": "分時多工",
+ "时分多址": "分時多重進接",
+ "时钟门控": "時脈閘控",
+ "时间脉冲信号": "定時器訊號",
+ "时隙": "時槽",
+ "易失性": "揮發性",
+ "映射": "對映",
+ "显像管": "映像管",
+ "显卡": "顯示卡",
+ "显存": "視訊記憶體",
+ "显示卡": "視訊卡",
+ "显示器": "監視器",
+ "显示屏": "顯示器",
+ "晶体管": "電晶體",
+ "晶闸管": "閘流體",
+ "智能": "智慧型",
+ "智能 ABC": "智能 ABC",
+ "智能ABC": "智能ABC",
+ "智能化": "智慧化",
+ "智能卡": "智慧卡",
+ "智能型": "智慧型",
+ "智能手机": "智慧型手機",
+ "智能手表": "智慧型手錶",
+ "智能电视": "智慧型電視",
+ "智能音箱": "智慧型喇叭",
+ "最优": "最佳",
+ "最优先": "最優先",
+ "最优秀": "最優秀",
+ "最优美": "最優美",
+ "最优质": "最優質",
+ "最底层派生类": "最末層衍生類別",
+ "最终用户": "終端使用者",
+ "月光博客": "月光博客",
+ "有损": "失真",
+ "有损压缩": "失真壓縮",
+ "有源": "主動",
+ "服务器": "伺服器",
+ "服务器消息块": "伺服器訊息區塊",
+ "服务器阵列": "伺服器陣列",
+ "服务套餐": "服務專案",
+ "服务框架": "服務架構",
+ "服务端": "伺服器端",
+ "本地": "本機",
+ "本地化": "在地化",
+ "机器代码": "機器碼",
+ "机顶盒": "機上盒",
+ "杀毒": "防毒",
+ "权标": "符記",
+ "权限": "許可權",
+ "构造函数": "建構函式",
+ "析构": "解構",
+ "析构函数": "解構函式",
+ "枚举": "列舉",
+ "枚举器": "列舉元",
+ "枚举成员": "列舉元",
+ "果冻豆": "雷根糖",
+ "查找": "尋找",
+ "查看": "檢視",
+ "栅极": "閘極",
+ "标头": "檔頭",
+ "标清": "標準畫質",
+ "标签页": "分頁",
+ "标识符": "識別碼",
+ "标量": "純量",
+ "标题栏": "標題列",
+ "校园网": "校園網路",
+ "格芯": "格羅方德",
+ "框图": "方塊圖",
+ "桌面型": "桌上型",
+ "桌面版": "電腦版",
+ "档案室": "檔案室",
+ "档案馆": "檔案館",
+ "梦幻桌面": "DreamScene",
+ "检错码": "偵錯碼",
+ "检验位": "核對位元",
+ "检验和": "核對和",
+ "模块": "模組",
+ "模式": "範式",
+ "模式识别": "圖型識別",
+ "模拟": "類比",
+ "模拟器": "模擬器",
+ "模拟广播": "類比廣播",
+ "模拟数字转换器": "類比數位轉換器",
+ "模拟现实": "模擬實境",
+ "模拟电视": "類比電視",
+ "横屏幕": "橫螢幕",
+ "正则表达式": "正規表示式",
+ "正则语言": "正規語言",
+ "正向": "順向",
+ "正弦信号": "正弦訊號",
+ "死机": "當機",
+ "死锁": "死結",
+ "残余边带": "殘邊帶",
+ "比特": "位元",
+ "比特分": "比特分",
+ "比特差错": "位元錯誤",
+ "比特币": "比特幣",
+ "比特彗星": "比特彗星",
+ "比特率": "位元速率",
+ "比特精灵": "比特精靈",
+ "比特误码率": "位元錯誤率",
+ "毫比特": "毫比特",
+ "水印": "浮水印",
+ "汇编": "組譯",
+ "汇编语言": "組合語言",
+ "汉字体系": "漢字體系",
+ "沃森": "華生",
+ "沟道": "通道",
+ "波分复用": "波長分波多工",
+ "波特": "鮑",
+ "波特率": "鮑率",
+ "注入": "資料隱碼",
+ "注册机": "序號產生器",
+ "注册表": "登錄檔",
+ "注册表编辑器": "登錄編輯程式",
+ "注销": "登出",
+ "泽字节": "皆位元組",
+ "活动目录": "Active Directory",
+ "活锁": "活結",
+ "派生": "衍生",
+ "派生类": "衍生類別",
+ "派生类型": "衍生類型",
+ "流媒体": "串流媒體",
+ "流密码": "串流加密法",
+ "测序": "定序",
+ "浏览框": "瀏覽域",
+ "消息": "訊息",
+ "消息框": "訊息方塊",
+ "消息认证码": "訊息鑑別碼",
+ "混合信号": "混訊",
+ "混合信号集成电路": "混合訊號積體電路",
+ "混合现实": "混合實境",
+ "清晰度": "解析度",
+ "清理缓存": "清除快取",
+ "渲染": "彩現",
+ "溃客": "劊客",
+ "源代码": "原始碼",
+ "源文件": "原始檔",
+ "滑块": "滾軸",
+ "滚动": "捲動",
+ "滚动更新": "滾動更新",
+ "滚动栏": "捲軸",
+ "滚动框": "捲動方塊",
+ "漏极": "汲極",
+ "演示稿": "簡報",
+ "澳门增补字符集": "澳門增補字符集",
+ "澳门资讯系统字集": "澳門資訊系統字集",
+ "激光": "雷射",
+ "激光视盘": "雷射影碟",
+ "激励表": "激發表",
+ "激活": "啟用",
+ "激活函数": "啟用功能",
+ "火山小视频": "火山小視頻",
+ "点击": "點選",
+ "点对点": "對等",
+ "照片": "相片",
+ "照片库": "相片圖庫",
+ "照片查看器": "相片檢視器",
+ "照相手机": "照相手機",
+ "父类": "父類別",
+ "物理内存": "實體記憶體",
+ "物理地址": "實體位址",
+ "物理层": "實體層",
+ "特丽珑": "特麗霓虹",
+ "状态栏": "狀態列",
+ "玩家国度": "玩家共和國",
+ "用户": "使用者",
+ "用户名": "使用者名稱",
+ "用户帐户控制": "使用者帳戶控制",
+ "用户框": "使用者方塊",
+ "用户界面": "使用者介面",
+ "用户组": "使用者群組",
+ "用户页": "使用者頁面",
+ "电信": "電信",
+ "电信业": "電信業",
+ "电信公司": "電信公司",
+ "电信商": "電信商",
+ "电信服务": "電信服務",
+ "电信行业": "電信行業",
+ "电信运营商": "電信業者",
+ "电图学": "電圖學",
+ "电子表格": "電子試算表",
+ "电子计算机": "電腦",
+ "电子迁移率": "電子移動率",
+ "电子邮件": "電子郵件",
+ "电影片": "電影片",
+ "电气工程": "電機工程",
+ "电源保护": "不斷電系統",
+ "电视频": "電視頻",
+ "画图": "小畫家",
+ "疑难解答": "疑難排解",
+ "登录": "登入",
+ "白炽灯": "白熾燈",
+ "百度云计算": "百度雲計算",
+ "百度搜索": "百度搜索",
+ "百度相册": "百度相冊",
+ "百度视频": "百度視頻",
+ "皮肤": "外觀",
+ "监控": "監視",
+ "盖茨": "蓋茲",
+ "盘符": "磁碟機代號",
+ "目标代码": "目的碼",
+ "目标文件": "目的檔案",
+ "目标用户": "目標使用者",
+ "目标软件": "目標軟體",
+ "相册": "相簿",
+ "矢量": "向量",
+ "矢量图形": "向量圖形",
+ "短信": "簡訊",
+ "短视频": "短影音",
+ "码分": "分碼",
+ "码分多址": "分碼多重進接",
+ "码率": "位元速率",
+ "硅": "矽",
+ "硬件": "硬體",
+ "硬烘干": "硬烤",
+ "硬盘": "硬碟",
+ "硬盘阵列": "硬碟陣列",
+ "硬盘驱动器": "硬碟機",
+ "硬编码": "寫死",
+ "磁头划碰": "磁頭損壞",
+ "磁盘": "磁碟",
+ "磁盘清理": "磁碟清理",
+ "磁盘碎片整理": "磁碟重組",
+ "磁盘碎片整理程序": "磁碟重組工具",
+ "磁盘阵列": "磁碟陣列",
+ "磁盘驱动器": "磁碟機",
+ "磁道": "磁軌",
+ "示例": "範例",
+ "社交媒体": "社群媒體",
+ "社交网站": "社群網站",
+ "社交网络": "社群網路",
+ "社会媒体": "社群媒體",
+ "社区": "社群",
+ "移动中心": "行動中心",
+ "移动互联网": "行動網際網路",
+ "移动产品": "行動產品",
+ "移动代理": "行動代理",
+ "移动代码": "行動程式碼",
+ "移动信息设备配置文件": "行動資訊裝置設定檔",
+ "移动公司": "行動公司",
+ "移动内容管理": "行動內容管理",
+ "移动客户端": "行動用戶端",
+ "移动平台": "行動平台",
+ "移动广播": "行動廣播",
+ "移动应用": "行動應用",
+ "移动应用管理": "行動應用管理",
+ "移动性": "行動性",
+ "移动操作系统": "行動作業系統",
+ "移动支付": "行動支付",
+ "移动数据": "行動資料",
+ "移动浏览器": "行動瀏覽器",
+ "移动版": "行動版",
+ "移动版块": "移動版塊",
+ "移动版面": "移動版面",
+ "移动电信": "行動電信",
+ "移动电信运营商": "行動電信業者",
+ "移动电源": "行動電源",
+ "移动电视": "行動電視",
+ "移动电话": "行動電話",
+ "移动硬盘": "行動硬碟",
+ "移动端": "行動端",
+ "移动终端": "行動終端",
+ "移动网络": "行動網路",
+ "移动网络运营商": "行動網路業者",
+ "移动联网设备": "行動網路裝置",
+ "移动计算机": "行動電腦",
+ "移动设备": "行動裝置",
+ "移动设备管理": "行動裝置管理",
+ "移动软件": "行動軟體",
+ "移动运营商": "行動業者",
+ "移动通信": "行動通訊",
+ "移相键控": "相位移鍵",
+ "程序": "程式",
+ "程序员": "程式設計師",
+ "程序编写员": "程式設計師",
+ "程序设计": "程式設計",
+ "空串": "空字串",
+ "空分复用": "空間多工",
+ "空分多址": "分空間多重進接",
+ "空列表": "空串列",
+ "空当接龙": "新接龍",
+ "空穴": "電洞",
+ "窄带": "窄頻",
+ "窗体": "表單",
+ "窗口": "視窗",
+ "窗口管理器": "視窗管理員",
+ "站点标识按钮": "網站識別鈕",
+ "竞争冒险": "競爭危害",
+ "端口转发": "通訊埠轉發",
+ "笔记本电脑": "筆記型電腦",
+ "第一范式": "第一規格化",
+ "第三范式": "第三正規化",
+ "第二范式": "第二正規化",
+ "第五范式": "第五規格化",
+ "第六范式": "第六規格化",
+ "第四范式": "第四規格化",
+ "答复": "答覆",
+ "签名": "簽章",
+ "算法": "演算法",
+ "类加载器": "類別載入器",
+ "类变量": "類別變數",
+ "类型": "型別",
+ "类型代码": "類型代碼",
+ "类型检查": "型別檢查",
+ "类型系统": "型別系統",
+ "类声明": "類別宣告",
+ "类定义": "類別定義",
+ "类实例": "類別實例",
+ "类库": "類別館",
+ "类成员": "類別成員",
+ "类方法": "類別方法",
+ "类模板": "類別模板",
+ "类的实例": "類別的實例",
+ "类的构造函数": "類別的建構函數",
+ "类的析构函数": "類別的破壞函數",
+ "粘贴": "貼上",
+ "系统盘": "系統磁碟",
+ "系统资源管理器": "系統資源管理員",
+ "系统配置": "系統設定",
+ "系统配置实用程序": "系統設定公用程式",
+ "索尼移动": "索尼行動",
+ "索尼移动通信": "索尼行動通訊",
+ "繁体": "正體",
+ "纠错码": "錯誤更正碼",
+ "红心大战": "傷心小棧",
+ "纸牌": "接龍",
+ "纹波": "漣波",
+ "线程": "執行緒",
+ "组件": "元件",
+ "组合框": "組合方塊",
+ "组提示": "群組提示",
+ "组策略": "群組原則",
+ "组群": "群組",
+ "组链接": "塊鏈結",
+ "终端": "終端機",
+ "终结器": "終端子",
+ "绑定": "繫結",
+ "结合存储": "可定址內容記憶體",
+ "结型": "接面型",
+ "结型场效应管": "接面場效電晶體",
+ "绘文字": "繪文字",
+ "绝缘栅双极晶体管": "絕緣閘雙極電晶體",
+ "统一渲染架构": "統一著色器架構",
+ "继承列表": "衍化列",
+ "维基共享资源": "維基共享資源",
+ "维基数据": "維基數據",
+ "绿色版": "可攜式版本",
+ "绿色软件": "可攜式軟體",
+ "缓冲器": "緩衝區",
+ "缓冲存储器": "快取記憶體",
+ "缓存": "快取",
+ "缓存溢出": "緩衝區溢位",
+ "编程范型": "程式設計範式",
+ "编程语言": "程式語言",
+ "编辑栏": "編輯列",
+ "缩略网址": "縮網址",
+ "缩进": "縮排",
+ "网上论坛": "網路論壇",
+ "网上邻居": "網路上的芳鄰",
+ "网关": "閘道器",
+ "网卡": "網路卡",
+ "网吧": "網咖",
+ "网易博客": "網易博客",
+ "网易相册": "網易相冊",
+ "网易视频": "網易視頻",
+ "网景导航者": "網景領航員",
+ "网格线": "格線",
+ "网民": "網友",
+ "网民报告": "網民報告",
+ "网状数据库": "網狀式資料庫",
+ "网盘": "網路硬碟",
+ "网络": "網路",
+ "网络动画": "網路動畫",
+ "网络安全和信息化": "網絡安全和信息化",
+ "网络广播电视台": "網絡廣播電視台",
+ "网络文化": "網路文化",
+ "网络欺凌": "網路霸凌",
+ "网络漫画": "網路漫畫",
+ "网络电视台": "網絡電視台",
+ "网络硬盘": "網路硬碟",
+ "网络购物": "網路購物",
+ "网络运营商": "網路業者",
+ "网路电视台": "網路電視台",
+ "置标语言": "標示語言",
+ "美国在线": "美國線上",
+ "耗尽": "空乏",
+ "耗尽层": "空乏層",
+ "联机": "連線",
+ "联机交易处理": "線上異動處理",
+ "联机分析处理": "連線分析處理",
+ "联系": "連絡",
+ "联系人": "聯絡人",
+ "肖特基": "蕭特基",
+ "脉冲": "脈波",
+ "脉冲逆变器": "變流器",
+ "脑机接口": "人機介面",
+ "脚本": "指令碼",
+ "脚本小子": "腳本小子",
+ "脚本语言": "手稿語言",
+ "脚注": "註腳",
+ "脱机": "離線",
+ "脸书": "臉書",
+ "腾讯云计算": "騰訊雲計算",
+ "腾讯博客": "騰訊博客",
+ "腾讯视频": "騰訊視頻",
+ "自定义": "自訂",
+ "自底向上": "由下而上",
+ "自述文件": "讀我檔案",
+ "艾字节": "艾位元組",
+ "节能灯": "省電燈泡",
+ "芯片": "晶片",
+ "英伟达": "輝達",
+ "范型": "範式",
+ "草榴社区": "草榴社區",
+ "荷码率": "位元速率",
+ "获取": "取得",
+ "菊花链接": "菊式鏈結",
+ "营销": "行銷",
+ "著作权": "著作權",
+ "著作权信息": "著作權資訊",
+ "蓝屏死机": "藍白當機",
+ "虚函数": "虛擬函式",
+ "虚拟专用网": "虛擬私人網路",
+ "虚拟内存": "虛擬記憶體",
+ "虚拟机": "虛擬機器",
+ "蜂窝数据": "蜂巢式資料",
+ "蜂窝网络": "蜂巢式網路",
+ "蜘蛛纸牌": "連環新接龍",
+ "补码": "二補數",
+ "表情包": "哏圖",
+ "表格": "試算表",
+ "表达式": "運算式",
+ "衬底": "基板",
+ "西瓜视频": "西瓜視頻",
+ "西部数据": "威騰電子",
+ "覆盖": "覆寫",
+ "覆铜板": "銅箔基板",
+ "规范化": "規格化",
+ "视频处理器": "影像處理器",
+ "视频接口": "視訊連接頭",
+ "视频文件": "視訊檔",
+ "视频文档": "視訊檔案",
+ "视频档": "視訊檔",
+ "视频游戏": "電動遊戲",
+ "视频轨": "視訊軌",
+ "视频输入": "視訊輸入",
+ "视频输出": "視訊輸出",
+ "解引用": "解除參照",
+ "解释器": "直譯器",
+ "解释型语言": "直譯語言",
+ "触发器": "正反器",
+ "触屏": "觸控螢幕",
+ "触摸": "輕觸",
+ "触摸屏": "觸控式螢幕",
+ "触摸板": "觸控板",
+ "计划任务": "工作排程器",
+ "计算机": "電腦",
+ "计算机体系结构": "電腦架構",
+ "计算机科学": "電腦科學",
+ "讲述人": "朗讀程式",
+ "论坛": "論壇",
+ "设备": "裝置",
+ "设备上下文": "裝置內容",
+ "设备环境": "裝置環境",
+ "设备管理器": "裝置管理員",
+ "设置": "設定",
+ "访问学者": "訪問學者",
+ "访问控制表": "存取控制列表",
+ "访问量": "瀏覽量",
+ "证书": "憑證",
+ "评测系统": "解題系統",
+ "识别": "辨識",
+ "译码": "解碼",
+ "试图学": "試圖學",
+ "语义": "語意",
+ "语义网": "語意網",
+ "语句": "語句",
+ "语法高亮": "語法突顯",
+ "语言包": "語言套件",
+ "语音识别": "語音辨識",
+ "误码率": "誤碼率",
+ "请勿追踪": "停止追蹤",
+ "诺顿克隆精灵": "諾頓魅影系統",
+ "读卡器": "讀卡機",
+ "调制": "調變",
+ "调制解调器": "數據機",
+ "调度": "排程",
+ "调度器": "排程器",
+ "调用层接口": "呼叫層級介面",
+ "调色板": "調色盤",
+ "调试": "除錯",
+ "谷歌": "Google",
+ "谷歌云消息传递": "Google 雲端通訊",
+ "谷歌工具条": "Google 工具列",
+ "谷歌文档": "Google 文件",
+ "谷歌浏览器内嵌框架": "Google Chrome 內嵌瀏覽框",
+ "谷歌视频": "Google 影片",
+ "谷翔信息技术": "谷翔信息技術",
+ "账号": "帳號",
+ "账户": "帳戶",
+ "贪心法": "貪婪法",
+ "贪心算法": "貪婪演算法",
+ "贴靠": "貼齊",
+ "资源管理器": "檔案總管",
+ "资讯台": "資訊台",
+ "资讯频道": "資訊頻道",
+ "赋值运算符": "設定運算子",
+ "超大规模集成电路": "超大型積體電路",
+ "超文本标记语言": "超文件標示語言",
+ "超文本置标语言": "超文件標示語言",
+ "超时": "逾時",
+ "超极本": "超極致筆電",
+ "超编程": "超程式設計",
+ "超高清": "超高畫質",
+ "身份": "身分",
+ "转义": "跳脫",
+ "转换": "轉檔",
+ "软件": "軟體",
+ "软件包": "軟體套件",
+ "软件包管理系统": "軟體套件管理系統",
+ "软件开发工具包": "軟體開發套件",
+ "软件过程": "軟體流程",
+ "软烘干": "軟烤",
+ "软盘": "軟碟",
+ "软盘驱动器": "軟碟機",
+ "轻松访问": "輕鬆存取",
+ "载流子": "載子",
+ "边栏": "資訊看板",
+ "过程化": "程序化",
+ "过程式": "程序式",
+ "过程生成": "程序化生成",
+ "运算符": "運算子",
+ "运算符号": "運算符號",
+ "运行": "執行",
+ "进程控制块": "過程控制段",
+ "进程组": "行程群組",
+ "进程间": "行程間",
+ "进程间通信": "行程間通訊",
+ "远程": "遠端",
+ "远程桌面协议": "遠端桌面協定",
+ "远程过程调用": "遠端程序呼叫",
+ "连接": "連線",
+ "连续互通": "接續互通",
+ "退出应用程序": "結束應用程式",
+ "退出程序": "結束程式",
+ "适配器": "配接器",
+ "逆变器": "變流器",
+ "选项卡": "索引標籤",
+ "递归": "遞迴",
+ "通信": "通訊",
+ "通信学": "通訊學",
+ "通信顺序进程": "交談循序程式",
+ "通用串行总线": "通用序列匯流排",
+ "通用分组无线服务": "通用封包無線服務",
+ "通用序列总线": "通用序列匯流排",
+ "通讯录": "通訊錄",
+ "通配符": "萬用字元",
+ "逻辑卷管理": "邏輯捲軸管理",
+ "逻辑器件": "邏輯裝置",
+ "逻辑门": "邏輯閘",
+ "邮件列表": "郵寄清單",
+ "邮箱": "電子信箱",
+ "部分": "部份",
+ "配置": "組態",
+ "采样定理": "取樣定理",
+ "重启": "重新啟動",
+ "重命名": "重新命名",
+ "重复组": "重複群",
+ "重定向": "重新導向",
+ "重定向页": "重新導向頁面",
+ "重码率": "重碼率",
+ "重置": "重設",
+ "重装": "重灌",
+ "金卤灯": "高強度氣體放電燈",
+ "金属氧化物半导体": "金氧半導體",
+ "金属氧化物半导体场效应管": "金屬氧化物半導體場效電晶體",
+ "钩子": "勾點",
+ "链接反向": "鏈結反向",
+ "链接搜索": "鏈結搜尋",
+ "链接正向": "鏈結正向",
+ "链表": "連結串列",
+ "锁存器": "閂鎖",
+ "锁定": "釘選",
+ "键盘布局": "鍵盤配置",
+ "镇流器": "安定器",
+ "镜像": "映象",
+ "门户系统": "入口網站",
+ "门户网站": "入口網站",
+ "门电路": "閘電路",
+ "闪存": "快閃記憶體",
+ "闪存盘": "隨身碟",
+ "闪迪": "新帝",
+ "队列": "佇列",
+ "阵列服务器": "陣列伺服器",
+ "阵列硬盘": "陣列硬碟",
+ "阿里云计算": "阿里雲計算",
+ "阿里巴巴网络": "阿里巴巴網絡",
+ "附件": "附屬應用程式",
+ "附加组件": "附加元件",
+ "随机存储器": "隨機存取記憶體",
+ "随机存取": "隨機存取",
+ "随机数": "亂數",
+ "隐身模式": "無痕模式",
+ "集成": "整合",
+ "集成开发环境": "整合式開發環境",
+ "集成数字增强网络": "整合數位強化網路",
+ "集成电路": "積體電路",
+ "集成设备电路": "整合裝置電路",
+ "集群": "叢集",
+ "雪崩击穿": "突崩潰",
+ "静态类型": "靜態型別",
+ "非门": "反閘",
+ "面向代理编程": "代理人導向程式設計",
+ "面向堆栈": "堆疊導向",
+ "面向对象": "物件導向",
+ "面向对象编程": "物件導向程式設計",
+ "面向并发": "平行導向",
+ "面向文档": "文件導向",
+ "面向消息": "訊息導向",
+ "面向消息的中间件": "訊息導向中介層",
+ "面向类": "類別導向",
+ "面向语言的程序设计": "語言導向程式設計",
+ "面向过程": "程序導向",
+ "音频": "音訊",
+ "音频文件": "音訊檔",
+ "音频文档": "音訊檔",
+ "音频档": "音訊檔",
+ "音频轨": "音訊軌",
+ "音频输入": "音訊輸入",
+ "音频输出": "音訊輸出",
+ "页眉": "頁首",
+ "页脚": "頁尾",
+ "项目页": "計畫頁",
+ "频分": "分頻",
+ "频分复用": "分頻多工",
+ "频分多址": "分頻多重進接",
+ "风河": "溫瑞爾",
+ "飞兆半导体": "快捷半導體",
+ "飞兆半导体公司": "快捷半導體公司",
+ "飞行模式": "飛航模式",
+ "首席信息官": "資訊長",
+ "首席执行官": "執行長",
+ "首席技术官": "技術長",
+ "首席运营官": "營運長",
+ "首选项": "偏好設定",
+ "香农": "夏農",
+ "香港增补字符集": "香港增補字符集",
+ "驱动程序": "驅動程式",
+ "高亮": "突顯",
+ "高亮度": "高亮度",
+ "高亮显示": "突出顯示",
+ "高保真": "高傳真",
+ "高清": "高畫質",
+ "高清多媒体界面": "高畫質多媒體介面",
+ "高清晰": "高解析",
+ "高清音质": "高音質",
+ "高清音频": "高音質音訊",
+ "高端": "高階",
+ "高级": "進階",
+ "高级编程语言": "高階程式語言",
+ "高级语言": "高階語言",
+ "高速缓冲存储器": "高速緩衝記憶體",
+ "鲍尔默": "巴爾默",
+ "鸭子类型": "鴨子型別",
+ "黑客": "駭客",
+ "黑屏": "黑畫面",
+ "黑盒测试": "黑箱測試",
+ "默认": "預設",
+ "鼠标": "滑鼠",
+ "齐纳二极管": "稽納二極體",
+ "不可改变": "不可變造",
+ "不可变性": "不可變造性",
+ "防串通": "防勾結",
+ "操作码": "opcode",
+ "网桥": "橋接器",
+ "无许可": "非許可制",
+ "瘦客户端": "精簡型用戶端",
+ "最新消息": "最新資訊",
+ "发送邮件": "傳送電郵",
+ "通过": "透過",
+ "图灵不完全": "圖靈不完備",
+ "了解": "瞭解",
+ "顺序计算": "循序計算",
+ "U 盘": ["USB 磁碟機", "USB 隨身碟"],
+ "U盘": ["USB磁碟機", "USB隨身碟"],
+ "X 窗口系统": ["X Window 系統", "X 視窗系統"],
+ "X窗口系统": ["X Window系統", "X視窗系統"],
+ "三维电影": ["3D 電影", "3D電影"],
+ "三维计算机": ["3D 電腦", "3D電腦"],
+ "三维计算机图形": ["3D 電腦圖形", "3D電腦圖形"],
+ "二维码": ["二維條碼", "行動條碼"],
+ "信噪比": ["訊號雜訊比", "訊雜比"],
+ "信息论": ["消息理論", "資訊理論"],
+ "内存泄漏": ["記憶體流失", "記憶體漏失"],
+ "前向纠错": ["前向錯誤更正", "正向錯誤校正"],
+ "单片机": ["單晶片", "微控制器"],
+ "卸载": ["移除", "解除安裝"],
+ "可编程": ["可程式化", "可規化"],
+ "噪声": ["杂讯", "雜訊"],
+ "套接字": ["通訊端", "通訊端點"],
+ "子网掩码": ["子網路遮罩", "網路遮罩"],
+ "屏蔽": ["封鎖", "遮蔽"],
+ "扩展": ["擴充功能", "擴充套件", "擴充"],
+ "接口": ["介面", "通訊埠", "埠"],
+ "插件": ["外掛程式", "外掛"],
+ "数字版权": ["數位版權", "數位著作權"],
+ "数据执行保护": ["系統記憶體保護", "資料執行防止"],
+ "文件夹": ["檔案夾", "資料夾"],
+ "时钟频率": ["時脈速率", "時脈頻率"],
+ "最终用户许可协议": ["終端使用者授權協定", "終端使用者授權合約"],
+ "标记语言": ["標示語言", "標記式語言"],
+ "模板": ["模板", "範本"],
+ "流水线": ["管線化", "管線"],
+ "溢出": ["上限溢位", "溢位"],
+ "滚动条": ["卷軸", "捲軸"],
+ "端口": ["通訊埠", "埠"],
+ "缩略图": ["預覽縮圖", "縮圖"],
+ "网页快照": ["頁庫存檔", "頁面快取檔"],
+ "菜单": ["清單", "選單"],
+ "补丁": ["補靪", "修補程式"],
+ "视频": ["影片", "視訊"],
+ "计算器": ["小算盤", "計算機"],
+ "访问": ["存取", "造訪"],
+ "调用": ["叫用", "呼叫"],
+ "质量": ["品質", "质素"],
+ "跳转列表": ["跳躍功能清單", "跳躍清單"],
+ "进程": ["處理程序", "行程"],
+ "退出": ["登出", "結束"],
+ "配置文件": ["組態檔", "設定檔"],
+ "采样率": ["取樣率", "取樣頻率"],
+ "重载": ["多載", "過載"],
+ "链接": ["連結", "鏈結"],
+ "项目": ["專案", "計畫"],
+ "高速缓存": ["快取記憶體", "快取"]
+ }
+}
\ No newline at end of file
diff --git a/T66y tool/T66y tool.user.js b/T66y tool/T66y tool.user.js
index d0cd23d1e1f..ccffc060607 100644
--- a/T66y tool/T66y tool.user.js
+++ b/T66y tool/T66y tool.user.js
@@ -1,7 +1,7 @@
// ==UserScript==
// @name 草榴小助手
// @namespace hoothin
-// @version 0.7.1
+// @version 0.7.3
// @description 草榴小助手修复,提供“加亮今日帖子”、“移除viidii跳转”、“图片自动缩放”、“种子链接转磁力链”、“预览整页图片”、“游客站内搜索”、“返回顶部”等功能!
// @author NewType & hoothin
// @match *://*.t66y.com/*
@@ -13,6 +13,7 @@
(function() {
'use strict';
+ const enable1024sDelay = true;
const defaultReply = "1024 感謝分享";
var helper = {
addCss: function(css) {
@@ -140,7 +141,7 @@
});
$('body').append('' + tmpNode + '
');
}
- helper.addCss('div#main>form[name="FORM"] { position: fixed; bottom: 0; left: 0; background: #f9f9ec; white-space: nowrap; } form[name="FORM"] tbody>tr:last-child { height: 0px; display: block; overflow: hidden; transition: height 0.5s ease; } form[name="FORM"]:hover tbody>tr:last-child { height: 200px; }');
+ helper.addCss('div#main>form[name="FORM"] { position: fixed; bottom: 0; left: 0; background: #f9f9ec; white-space: nowrap; } form[name="FORM"] tbody>tr:last-child { height: 0px; display: block; overflow: hidden; transition: height 0.5s ease; } form[name="FORM"]:hover tbody>tr:last-child,form[name="FORM"]:focus-within tbody>tr:last-child { height: 200px; }');
var submitBtn = $('form[name="FORM"] .btn[name="Submit"]');
var textarea = $('form[name="FORM"] [name="atc_content"]');
if (submitBtn.length && textarea.length) {
@@ -153,9 +154,7 @@
var $tLike = $(".t_like");
if ($tLike.length) {
var $tLikeClone = $tLike.clone();
- if (!$tLike.isInViewport()) {
- $("#conttpc").prepend($tLikeClone);
- }
+ $("#conttpc").prepend($tLikeClone);
$(window).on("resize scroll", function() {
if ($tLike.isInViewport()) {
@@ -191,6 +190,7 @@
quickReply.attr('title', replyStr + "(右击修改)");
var formTitle = $("form td.h>b").text();
function setCountdown() {
+ if (!enable1024sDelay) return;
quickReply.attr("disabled", true);
quickReply.css("background", "initial");
var leftTime = parseInt((lastReplyTime - Date.now()) / 1000 + 1025);
@@ -266,6 +266,8 @@
success: function (res) {
if (res.indexOf("發貼完畢點擊進入主題列表") == -1) {
replyFail();
+ alert($(res).find("ol").text() || $(res).find("center").text());
+ quickReply.removeAttr("disabled");
} else {
replySuccess();
}
@@ -297,7 +299,7 @@
let rushTimes = 5;
let rushTimer = setInterval(() => {
if (--rushTimes > 0) {
- requestRush(300);
+ requestRush(100);
} else {
clearInterval(rushTimer);
rushReply.val("搶簽結束");
@@ -305,7 +307,9 @@
}, 5);
} else {
if (reachRushMinute) {
- if (date.getSeconds() > 57) {
+ if (date.getSeconds() == 59) {
+ checkRush(1);
+ } else if (date.getSeconds() > 57) {
checkRush(5);
} else if (date.getSeconds() > 50) {
checkRush(500);
@@ -321,7 +325,7 @@
}
}, timeGap);
}
- rushReply.insertAfter( "form .btn" );
+ rushReply.insertAfter( "form .btn:last-child" );
rushReply.click(function() {
checkRush(5000);
rushReply.attr("disabled", true);
diff --git a/X-Downloader/X-Downloader.user.js b/X-Downloader/X-Downloader.user.js
new file mode 100644
index 00000000000..72531dfbd90
--- /dev/null
+++ b/X-Downloader/X-Downloader.user.js
@@ -0,0 +1,167 @@
+// ==UserScript==
+// @name X-Downloader-Script
+// @name:zh-CN X-Downloader-Script
+// @name:zh-TW X-Downloader-Script
+// @name:ja X-Downloader-Script
+// @namespace hoothin
+// @version 2025-08-18
+// @license MIT
+// @description Enhances your Twitter (X) experience by adding a convenient download button to images and videos (GIFs), enabling easy, one-click saving of media.
+// @description:zh-CN 优化你的推特 (X) 浏览体验,直接在图片和视频(GIF)上添加一个便捷的下载按钮,一键轻松保存喜欢的媒体内容。
+// @description:zh-TW 優化您的 Twitter (X) 瀏覽體驗,直接在圖片及影片(GIF)上新增一個便捷的下載按鈕,一鍵輕鬆儲存喜愛的媒體內容。
+// @description:ja Twitter (X) の画像や動画(GIF)に便利なダウンロードボタンを追加し、ワンクリックでお気に入りのメディアを簡単に保存できるようにします。
+// @author hoothin
+// @match https://x.com/*
+// @match https://twitter.com/*
+// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
+// @grant none
+// @downloadURL https://update.greasyfork.org/scripts/545186/X-Downloader-Script.user.js
+// @updateURL https://update.greasyfork.org/scripts/545186/X-Downloader-Script.meta.js
+// ==/UserScript==
+
+(function() {
+ 'use strict';
+ let downloadBtn = document.createElement("a"), touch = false, simpleClick = false;
+ downloadBtn.target = "_blank";
+ downloadBtn.style.cssText = "background: #000000aa; border-radius: 50%; transition: opacity ease 0.3s; position: absolute; top: 0; right: 0px; cursor: pointer; opacity: 0; padding: 5px;";
+ downloadBtn.innerHTML = ``;
+ downloadBtn.addEventListener("mousedown", e => {
+ let parent = downloadBtn.parentNode;
+ if (!parent) return;
+ simpleClick = false;
+ let img = parent.querySelector('[data-testid="tweetPhoto"]>img,[data-testid="card.layoutLarge.media"] img');
+ if (img) {
+ let newsrc = img.src.replace("_normal.",".").replace("_200x200.",".").replace("_mini.",".").replace("_bigger.",".").replace(/_x\d+\./,"."), imgname;
+ if (/\.svg$/.test(newsrc)) return;
+ if (newsrc == img.src) {
+ newsrc=newsrc.replace(/\?format=/i, ".").replace(/\&name=/i, ":").replace(/\.(?=[^\.\/]*$)/, "?format=").replace( /(:large|:medium|:small|:orig|:thumb|:[\dx]+)/i, "");
+ if (newsrc != img.src) {
+ newsrc = newsrc + "&name=orig";
+ }
+ }
+ while(parent) {
+ if (parent.nodeName == "ARTICLE" && parent.dataset && parent.dataset.testid == "tweet") {
+ break;
+ }
+ parent = parent.parentNode;
+ }
+ if (parent) {
+ const time = parent.querySelector('time[datetime]');
+ const user = parent.querySelector('[role="link"]>div>div>span>span');
+ let formatMatch = img.src.match(/format=(\w+)/), ext = "jpg";
+ if (formatMatch) {
+ ext = formatMatch[1];
+ } else {
+ formatMatch = newsrc.match(/\.(\w+)/);
+ if (formatMatch) {
+ ext = formatMatch[1];
+ }
+ }
+ imgname = `${user.innerText} ${time.innerText.replace(/(.*) · (.*)/, "$2 $1")}.${ext}`;
+ }
+ downloadBtn.href = newsrc;
+ if ((e.button === 0 && !e.ctrlKey) || touch) {
+ simpleClick = true;
+ downloadByFetch(newsrc, imgname);
+ }
+ } else {
+ while(parent) {
+ if (parent.nodeName == "ARTICLE" && parent.dataset && parent.dataset.testid == "tweet") {
+ break;
+ }
+ parent = parent.parentNode;
+ }
+ if (parent) {
+ downloadBtn.removeAttribute('download');
+ let link = parent.querySelector('a[role="link"][aria-label][href^="/"]');
+ downloadBtn.href = `https://twitter.luopo.org/?url=${encodeURIComponent(link ? link.href : document.location.href)}`;
+ if (e.altKey || touch) {
+ window.open(downloadBtn.href, "_blank");
+ }
+ }
+ }
+ });
+ downloadBtn.addEventListener("click", e => {
+ if (simpleClick || e.altKey || touch) {
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ });
+ downloadBtn.addEventListener("mouseenter", () => {
+ downloadBtn.style.opacity = 1;
+ });
+ downloadBtn.addEventListener("mouseleave", () => {
+ setTimeout(() => {
+ downloadBtn.style.opacity = 0.1;
+ }, 100);
+ });
+ async function downloadByFetch(imageUrl, filename) {
+ try {
+ const response = await fetch(imageUrl);
+ if (!response.ok) throw new Error('CORS request failed');
+ const blob = await response.blob();
+ const blobUrl = URL.createObjectURL(blob);
+ const tempLink = document.createElement('a');
+ tempLink.href = blobUrl;
+ tempLink.setAttribute('download', filename);
+ document.body.appendChild(tempLink);
+ tempLink.click();
+ document.body.removeChild(tempLink);
+ URL.revokeObjectURL(blobUrl);
+ } catch (error) {
+ console.error('error:', error);
+ window.open(imageUrl, '_blank');
+ }
+ }
+ const show = (ele) => {
+ ele.appendChild(downloadBtn);
+ setTimeout(() => {
+ downloadBtn.style.opacity = touch ? 0.8 : 0.6;
+ }, 0);
+ };
+ const addBtn = e => {
+ if (e.target.dataset && e.target.dataset.testid == "card.layoutLarge.media") {
+ show(e.target.parentNode);
+ } else if (e.target.dataset && e.target.dataset.testid == "tweetPhoto") {
+ show(e.target.parentNode);
+ } else if (e.target.dataset && /^video\-player/.test(e.target.dataset.testid)) {
+ show(e.target.parentNode);
+ } else if (e.target.parentNode && e.target.parentNode.dataset && e.target.parentNode.dataset.testid == "tweetPhoto") {
+ show(e.target.parentNode.parentNode);
+ }
+ };
+ function isElementVisible(el) {
+ const rect = el.getBoundingClientRect();
+ return rect.top < window.innerHeight && rect.top > 0 && rect.bottom >= 0;
+ }
+ function findFirstVisibleElement(selector) {
+ const elements = document.querySelectorAll(selector);
+ const firstVisibleElement = Array.from(elements).find(el => {
+ return isElementVisible(el);
+ });
+ return firstVisibleElement;
+ }
+ let checkTimer;
+ const touchCheck = e => {
+ clearTimeout(checkTimer);
+ if (e.target == downloadBtn) return;
+ checkTimer = setTimeout(() => {
+ if (isElementVisible(downloadBtn)) return;
+ let target = findFirstVisibleElement("[data-testid='card.layoutLarge.media']");
+ if (target) {
+ return show(target.parentNode);
+ }
+ target = findFirstVisibleElement("[data-testid='tweetPhoto']");
+ if (target) {
+ return show(target.parentNode);
+ }
+ target = findFirstVisibleElement("[data-testid^='video-player']");
+ if (target) {
+ return show(target.parentNode);
+ }
+ }, 100);
+ };
+ document.addEventListener("mouseenter", addBtn, true);
+ document.addEventListener("touchstart", e => {touch = true; addBtn(e);}, true);
+ document.addEventListener("touchend", touchCheck, true);
+})();
\ No newline at end of file