summaryrefslogtreecommitdiffhomepage
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/firewall.js16
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/tools/prng.js18
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/ui.js8
-rw-r--r--modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua3
-rw-r--r--modules/luci-base/po/en/base.po13
-rw-r--r--modules/luci-base/po/it/base.po16
-rw-r--r--modules/luci-base/po/ru/base.po8
-rw-r--r--modules/luci-base/po/zh_Hans/base.po246
-rw-r--r--modules/luci-base/po/zh_Hant/base.po50
-rw-r--r--modules/luci-mod-status/htdocs/luci-static/resources/svg/channel_analysis.svg19
-rw-r--r--modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js396
-rw-r--r--modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json13
-rw-r--r--modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json9
-rw-r--r--modules/luci-mod-status/src/luci-bwc.c16
-rw-r--r--modules/luci-mod-system/Makefile6
15 files changed, 650 insertions, 187 deletions
diff --git a/modules/luci-base/htdocs/luci-static/resources/firewall.js b/modules/luci-base/htdocs/luci-static/resources/firewall.js
index b1c7de4358..2e032ca2d5 100644
--- a/modules/luci-base/htdocs/luci-static/resources/firewall.js
+++ b/modules/luci-base/htdocs/luci-static/resources/firewall.js
@@ -57,21 +57,7 @@ function getColorForName(forName) {
else if (forName == 'wan')
return '#f09090';
- random.seed(parseInt(sfh(forName), 16));
-
- var r = random.get(128),
- g = random.get(128),
- min = 0,
- max = 128;
-
- if ((r + g) < 128)
- min = 128 - r - g;
- else
- max = 255 - r - g;
-
- var b = min + Math.floor(random.get() * (max - min));
-
- return '#%02x%02x%02x'.format(0xff - r, 0xff - g, 0xff - b);
+ return random.derive_color(forName);
}
diff --git a/modules/luci-base/htdocs/luci-static/resources/tools/prng.js b/modules/luci-base/htdocs/luci-static/resources/tools/prng.js
index 752dc75ce8..b916cc7792 100644
--- a/modules/luci-base/htdocs/luci-static/resources/tools/prng.js
+++ b/modules/luci-base/htdocs/luci-static/resources/tools/prng.js
@@ -89,5 +89,23 @@ return L.Class.extend({
}
return Math.floor(r * (u - l + 1)) + l;
+ },
+
+ derive_color: function(string) {
+ this.seed(parseInt(sfh(string), 16));
+
+ var r = this.get(128),
+ g = this.get(128),
+ min = 0,
+ max = 128;
+
+ if ((r + g) < 128)
+ min = 128 - r - g;
+ else
+ max = 255 - r - g;
+
+ var b = min + Math.floor(this.get() * (max - min));
+
+ return '#%02x%02x%02x'.format(0xff - r, 0xff - g, 0xff - b);
}
});
diff --git a/modules/luci-base/htdocs/luci-static/resources/ui.js b/modules/luci-base/htdocs/luci-static/resources/ui.js
index 77074d5075..e35a26a8ba 100644
--- a/modules/luci-base/htdocs/luci-static/resources/ui.js
+++ b/modules/luci-base/htdocs/luci-static/resources/ui.js
@@ -3597,9 +3597,11 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
this.setActiveTabId(panes[selected], selected);
}
- panes[selected].dispatchEvent(new CustomEvent('cbi-tab-active', {
- detail: { tab: panes[selected].getAttribute('data-tab') }
- }));
+ requestAnimationFrame(L.bind(function(pane) {
+ pane.dispatchEvent(new CustomEvent('cbi-tab-active', {
+ detail: { tab: pane.getAttribute('data-tab') }
+ }));
+ }, this, panes[selected]));
this.updateTabs(group);
},
diff --git a/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua b/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua
index 705a15db22..d7ba2f0af0 100644
--- a/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua
+++ b/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua
@@ -310,7 +310,6 @@ TZ = {
{ 'Australia/Adelaide', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' },
{ 'Australia/Brisbane', 'AEST-10' },
{ 'Australia/Broken Hill', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' },
- { 'Australia/Currie', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
{ 'Australia/Darwin', 'ACST-9:30' },
{ 'Australia/Eucla', '<+0845>-8:45' },
{ 'Australia/Hobart', 'AEST-10AEDT,M10.1.0,M4.1.0/3' },
@@ -401,7 +400,7 @@ TZ = {
{ 'Europe/Vatican', 'CET-1CEST,M3.5.0,M10.5.0/3' },
{ 'Europe/Vienna', 'CET-1CEST,M3.5.0,M10.5.0/3' },
{ 'Europe/Vilnius', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
- { 'Europe/Volgograd', '<+04>-4' },
+ { 'Europe/Volgograd', '<+03>-3' },
{ 'Europe/Warsaw', 'CET-1CEST,M3.5.0,M10.5.0/3' },
{ 'Europe/Zagreb', 'CET-1CEST,M3.5.0,M10.5.0/3' },
{ 'Europe/Zaporozhye', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
diff --git a/modules/luci-base/po/en/base.po b/modules/luci-base/po/en/base.po
index daaaedc681..a267a37764 100644
--- a/modules/luci-base/po/en/base.po
+++ b/modules/luci-base/po/en/base.po
@@ -3,19 +3,20 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-06-10 03:40+0200\n"
-"PO-Revision-Date: 2012-04-03 08:44+0200\n"
-"Last-Translator: juhosg <juhosg@openwrt.org>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"PO-Revision-Date: 2021-01-07 17:03+0000\n"
+"Last-Translator: Liao junchao <liaojunchao@outlook.com>\n"
+"Language-Team: English <https://hosted.weblate.org/projects/openwrt/luci/en/>"
+"\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Pootle 2.0.4\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.4.1-dev\n"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931
msgid "%.1f dB"
-msgstr ""
+msgstr "%.1f dB"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:117
msgid "%d Bit"
diff --git a/modules/luci-base/po/it/base.po b/modules/luci-base/po/it/base.po
index df556b3a0b..9c13af0f6f 100644
--- a/modules/luci-base/po/it/base.po
+++ b/modules/luci-base/po/it/base.po
@@ -3,8 +3,8 @@ msgstr ""
"Project-Id-Version: LuCI\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-06-10 03:40+0200\n"
-"PO-Revision-Date: 2020-12-11 03:50+0000\n"
-"Last-Translator: AndreaEM <andreyodj@gmail.com>\n"
+"PO-Revision-Date: 2021-01-10 16:32+0000\n"
+"Last-Translator: bovirus <roberto.boriotti@canon-europe.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/openwrt/luci/it/>"
"\n"
"Language: it\n"
@@ -12,7 +12,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.4-dev\n"
+"X-Generator: Weblate 4.4.1-dev\n"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:931
msgid "%.1f dB"
@@ -652,7 +652,7 @@ msgstr ""
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:148
msgid "Allowed IPs"
-msgstr ""
+msgstr "IP permessi"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:654
msgid "Always announce default router"
@@ -2314,7 +2314,7 @@ msgstr "Firewall"
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:102
msgid "Firewall Mark"
-msgstr ""
+msgstr "Marcatore firewall"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:326
msgid "Firewall Settings"
@@ -3532,7 +3532,7 @@ msgstr ""
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:78
msgid "Listen Port"
-msgstr ""
+msgstr "Porta in ascolto"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/dropbear.js:17
msgid "Listen only on the given interface or, if unspecified, on all"
@@ -4297,7 +4297,7 @@ msgstr ""
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:167
msgid "Notice"
-msgstr "Notifica"
+msgstr "Notizia"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js:127
msgid "Nslookup"
@@ -4993,7 +4993,7 @@ msgstr "Pseudo Ad-Hoc (ahdemo)"
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:139
msgid "Public Key"
-msgstr "Chiave Pubblica"
+msgstr "Chiave pubblica"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:284
msgid ""
diff --git a/modules/luci-base/po/ru/base.po b/modules/luci-base/po/ru/base.po
index 57899d54de..60225abbe6 100644
--- a/modules/luci-base/po/ru/base.po
+++ b/modules/luci-base/po/ru/base.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: LuCI: base\n"
"POT-Creation-Date: 2010-05-09 01:01+0300\n"
-"PO-Revision-Date: 2021-01-03 17:29+0000\n"
-"Last-Translator: Anton Kikin <a.a.kikin@gmail.com>\n"
+"PO-Revision-Date: 2021-01-09 15:32+0000\n"
+"Last-Translator: Nt0G <nt0gggg@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/luci/ru/>"
"\n"
"Language: ru\n"
@@ -7506,7 +7506,7 @@ msgstr "Состояние WPS"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:47
msgid "Waiting for device..."
-msgstr "Ожидание подключения устройства..."
+msgstr "Ожидание устройства..."
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:168
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:178
@@ -7516,7 +7516,7 @@ msgstr "Внимание"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:26
msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
-"Внимание: Есть не сохраненные изменения, которые будут потеряны при "
+"Внимание: Есть несохранённые изменения, которые будут потеряны при "
"перезагрузке!"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/password.js:37
diff --git a/modules/luci-base/po/zh_Hans/base.po b/modules/luci-base/po/zh_Hans/base.po
index c4b0f61121..44ad6693e7 100644
--- a/modules/luci-base/po/zh_Hans/base.po
+++ b/modules/luci-base/po/zh_Hans/base.po
@@ -4,8 +4,8 @@
#
msgid ""
msgstr ""
-"PO-Revision-Date: 2020-12-26 06:29+0000\n"
-"Last-Translator: gao_cai_sheng <qwq233@qwq2333.top>\n"
+"PO-Revision-Date: 2021-01-10 16:32+0000\n"
+"Last-Translator: Eric <spice2wolf@gmail.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"openwrt/luci/zh_Hans/>\n"
"Language: zh_Hans\n"
@@ -1294,6 +1294,9 @@ msgid ""
"the basic rate. Supported rates lower than the minimum basic rate are not "
"offered."
msgstr ""
+"根据无线信号覆盖密度来配置数据速率。Normal(正常):如果不使用传统的802.11b速率,则将基本速率配置为6、12、24 Mbps,否则配置为5."
+"5、11 Mbps。High(高):如果不使用传统802.11b速率,则将基本速率配置为12、24 Mbps,否则配置为11 Mbps速率。Very "
+"High(非常高):配置24 Mbps为基本速率。不提供低于最低基本速率的支持速率。"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:175
msgid "Confirm disconnect"
@@ -1364,7 +1367,7 @@ msgstr "国家代码"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:899
msgid "Coverage cell density"
-msgstr ""
+msgstr "无线信号覆盖密度"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:491
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1960
@@ -1951,7 +1954,7 @@ msgstr "启用 DNS 查找"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:292
msgid "Enable Dynamic Shuffling Of Flows"
-msgstr ""
+msgstr "启用流的动态洗牌"
#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6in4.js:60
msgid "Enable HE.net dynamic endpoint update"
@@ -3231,7 +3234,7 @@ msgstr "无效参数"
msgid ""
"Invalid bearer list. Possibly too many bearers created. This protocol "
"supports one and only one bearer."
-msgstr ""
+msgstr "无效的承载列表。可能创建了太多承载。该协议仅支持一个承载。"
#: modules/luci-base/htdocs/luci-static/resources/rpc.js:402
msgid "Invalid command"
@@ -3327,7 +3330,7 @@ msgstr "L2TP 服务器"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:267
msgid "LACPDU Packets"
-msgstr ""
+msgstr "LACPDU 包"
#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:131
#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:115
@@ -3411,6 +3414,8 @@ msgid ""
"interoperate. Airtime efficiency may be significantly reduced where these "
"are used. It is recommended to not allow 802.11b rates where possible."
msgstr ""
+"旧版的或性能不好的设备可能需要旧版的802.11b速率才能进行互操作。在使用这些速率的情况下,通话时间效率可能会显著降低。建议尽可能不允许使用802."
+"11b速率。"
#: modules/luci-base/htdocs/luci-static/resources/ui.js:4030
msgid "Legend:"
@@ -3446,7 +3451,7 @@ msgstr "线路运行时间"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:123
msgid "Link Aggregation (Channel Bonding)"
-msgstr ""
+msgstr "链路聚合(通道绑定)"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:348
msgid "Link Monitoring"
@@ -3633,12 +3638,12 @@ msgstr "日志"
msgid ""
"Logical network from which to select the local endpoint if local IPv6 "
"address is empty and no WAN IPv6 is available (optional)."
-msgstr ""
+msgstr "如果本地IPv6地址为空,且没有广域网IPv6可用,则从中选择本地端点的逻辑网络(可选)。"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:57
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:62
msgid "Logical network to which the tunnel will be added (bridged) (optional)."
-msgstr ""
+msgstr "隧道要添加(桥接)到的逻辑网络 (可选)。"
#: modules/luci-base/luasrc/view/sysauth.htm:38
msgid "Login"
@@ -3663,7 +3668,7 @@ msgstr "MAC"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:251
msgid "MAC Address For The Actor"
-msgstr ""
+msgstr "这个 Actor 的 MAC 地址"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:38
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:2087
@@ -3714,15 +3719,15 @@ msgstr "MHz"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:353
msgid "MII"
-msgstr ""
+msgstr "MII"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:421
msgid "MII / ETHTOOL ioctls"
-msgstr ""
+msgstr "MII / ETHTOOL ioctls"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:394
msgid "MII Interval"
-msgstr ""
+msgstr "MII 间隔"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:54
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:53
@@ -3826,11 +3831,11 @@ msgstr "方法未找到"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:349
msgid "Method of link monitoring"
-msgstr ""
+msgstr "连接监测方式"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:418
msgid "Method to determine link status"
-msgstr ""
+msgstr "确定连接状态的方式"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js:46
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:166
@@ -3875,13 +3880,13 @@ msgstr "型号"
#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:43
msgid "Modem bearer teardown in progress."
-msgstr ""
+msgstr "调制解调器 bearer 拆解正在进行。"
#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:42
msgid ""
"Modem connection in progress. Please wait. This process will timeout after 2 "
"minutes."
-msgstr ""
+msgstr "调制解调器连接正在进行中。请等待。这个过程将在2分钟后超时。"
#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:72
msgid "Modem default"
@@ -3897,7 +3902,7 @@ msgstr "调制解调器设备"
#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:41
msgid "Modem disconnection in progress. Please wait."
-msgstr ""
+msgstr "调制解调器断线中。请稍等。"
#: modules/luci-compat/luasrc/model/network/proto_ncm.lua:66
#: protocols/luci-proto-ncm/htdocs/luci-static/resources/protocol/ncm.js:24
@@ -4141,7 +4146,7 @@ msgstr "未找到文件"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:88
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:93
msgid "No host route"
-msgstr ""
+msgstr "无主机路由"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:678
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:142
@@ -4158,11 +4163,11 @@ msgstr "无匹配的前缀委托"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:140
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:143
msgid "No more slaves available"
-msgstr ""
+msgstr "没有更多的 slaves 可用"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:187
msgid "No more slaves available, can not save interface"
-msgstr ""
+msgstr "缺少 slaves 可用,无法储存接口"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:251
msgid "No negative cache"
@@ -4190,7 +4195,7 @@ msgstr "本链没有规则。"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:384
msgid "No validation or filtering"
-msgstr ""
+msgstr "没有验证或过滤"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:152
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:827
@@ -4264,7 +4269,7 @@ msgstr "不支持"
msgid ""
"Note: Some wireless drivers do not fully support 802.11w. E.g. mwlwifi may "
"have problems"
-msgstr ""
+msgstr "注意:有些无线驱动程序不完全支持802.11w。例如,mwlwifi可能会有问题"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:167
msgid "Notice"
@@ -4276,7 +4281,7 @@ msgstr "Nslookup"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:332
msgid "Number of IGMP membership reports"
-msgstr ""
+msgstr "IGMP成员数量报告"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:362
msgid "Number of cached DNS entries (max is 10000, 0 is no caching)"
@@ -4288,7 +4293,7 @@ msgstr "用于压缩的并行线程数"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:309
msgid "Number of peer notifications after failover event"
-msgstr ""
+msgstr "故障切换事件后的对等体通知数"
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:69
msgid "Obfuscated Group Password"
@@ -4355,7 +4360,7 @@ msgstr "一个或多个必选项值为空!"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:229
msgid ""
"Only if current active slave fails and the primary slave is up (failure, 2)"
-msgstr ""
+msgstr "仅当前的活跃 slave 发生故障,且主 slave 在运行中时 (故障,2)"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:444
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/backupfiles.lua:19
@@ -4465,7 +4470,7 @@ msgstr "选项"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/sshkeys.js:119
msgid "Options:"
-msgstr ""
+msgstr "选项:"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:346
msgid "Other:"
@@ -4491,14 +4496,14 @@ msgstr "传出校验和"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:98
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:103
msgid "Outgoing key"
-msgstr ""
+msgstr "传出密钥"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:103
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:108
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:105
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:110
msgid "Outgoing serialization"
-msgstr ""
+msgstr "传出序列化"
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:50
msgid "Output Interface"
@@ -4511,7 +4516,7 @@ msgstr "出口区域"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:16
msgid "Overlap"
-msgstr ""
+msgstr "重叠"
#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:57
#: modules/luci-base/htdocs/luci-static/resources/protocol/static.js:222
@@ -4698,7 +4703,7 @@ msgstr "数据包"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:275
msgid "Packets To Transmit Before Moving To Next Slave"
-msgstr ""
+msgstr "移动到下个 Slave 前要传输的数据包"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:152
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:827
@@ -4805,7 +4810,7 @@ msgstr "完全正向保密"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:105
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:110
msgid "Perform outgoing packets serialization (optional)."
-msgstr ""
+msgstr "执行传出数据包序列化(可选)。"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:34
msgid "Perform reboot"
@@ -4915,17 +4920,17 @@ msgstr "禁止客户端间通信"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:211
msgid "Primary Slave"
-msgstr ""
+msgstr "主 Slave"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:228
msgid ""
"Primary becomes active slave when it comes back up if speed and duplex "
"better than current slave (better, 1)"
-msgstr ""
+msgstr "如速度和双工均好于当前 slave,主 slave 在再次运行时就会成为活跃 slave (较好,1)"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:227
msgid "Primary becomes active slave whenever it comes back up (always, 0)"
-msgstr ""
+msgstr "只要主 slave 重新上线,它就会成为活跃 slave (始终,0)"
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:61
msgid "Private Key"
@@ -5154,12 +5159,12 @@ msgstr "远程 IPv4 地址或 FQDN"
#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40
msgid "Remote IPv6 address"
-msgstr ""
+msgstr "远程 IPv6 地址"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42
msgid "Remote IPv6 address or FQDN"
-msgstr ""
+msgstr "远程 IPv6 地址或 FQDN"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:853
msgid "Remove"
@@ -5186,14 +5191,14 @@ msgstr "请求超时"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:102
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:107
msgid "Require incoming checksum (optional)."
-msgstr ""
+msgstr "需要传入校验和(可选)。"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:102
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:107
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:104
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:109
msgid "Require incoming packets serialization (optional)."
-msgstr ""
+msgstr "需要传入数据包序列化(可选)。"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1619
msgid "Required"
@@ -5248,7 +5253,7 @@ msgstr "需要带 SAE 支持的 hostapd"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1247
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1248
msgid "Requires hostapd with WEP support"
-msgstr ""
+msgstr "需要 hostapd 支持 WEP"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:233
msgid ""
@@ -5288,11 +5293,11 @@ msgstr "需要带 SAE 支持的 wpa-supplicant"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1261
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1262
msgid "Requires wpa-supplicant with WEP support"
-msgstr ""
+msgstr "需要 wpa-supplicant 支持 WEP"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:224
msgid "Reselection policy for primary slave"
-msgstr ""
+msgstr "主 slave 的重选策略"
#: modules/luci-base/htdocs/luci-static/resources/luci.js:2203
#: modules/luci-base/luasrc/view/sysauth.htm:39
@@ -5375,7 +5380,7 @@ msgstr "根目录准备"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:202
msgid "Round-Robin policy (balance-rr, 0)"
-msgstr ""
+msgstr "循环策略 (balance-rr, 0)"
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:159
msgid "Route Allowed IPs"
@@ -5470,7 +5475,7 @@ msgstr "SSTP"
#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:41
msgid "SSTP Server"
-msgstr ""
+msgstr "SSTP 服务器"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:339
msgid "SWAP"
@@ -5542,7 +5547,7 @@ msgstr "选择文件…"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:318
msgid "Selects the transmit hash policy to use for slave selection"
-msgstr ""
+msgstr "挑选 slave 选择所用的传输散列策略"
#: protocols/luci-proto-3g/htdocs/luci-static/resources/protocol/3g.js:144
#: protocols/luci-proto-ppp/htdocs/luci-static/resources/protocol/ppp.js:128
@@ -5557,7 +5562,7 @@ msgstr "定时发送 LCP 响应(秒),仅在结合了故障阈值时有效"
#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:24
msgid "Send the hostname of this device"
-msgstr ""
+msgstr "传输这台设备的主机名称"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:157
msgid "Server Settings"
@@ -5599,7 +5604,7 @@ msgstr ""
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:300
msgid "Set same MAC Address to all slaves"
-msgstr ""
+msgstr "为所有 slave 设置相同的 MAC 地址"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:642
msgid "Set this interface as master for the dhcpv6 relay."
@@ -5607,11 +5612,11 @@ msgstr "将此接口设置为 dhcpv6 中继的主接口。"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:304
msgid "Set to currently active slave (active, 1)"
-msgstr ""
+msgstr "设置到当前活跃的 slave (活跃,1)"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:305
msgid "Set to first slave added to the bond (follow, 2)"
-msgstr ""
+msgstr "设置到第一个添加到 bond 的 slave (遵循,2)"
#: modules/luci-compat/luasrc/model/network/proto_modemmanager.lua:55
#: modules/luci-compat/luasrc/model/network/proto_qmi.lua:55
@@ -5708,7 +5713,7 @@ msgstr "跳转到导航"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:178
msgid "Slave Interfaces"
-msgstr ""
+msgstr "Slave 接口"
#: modules/luci-base/htdocs/luci-static/resources/network.js:2883
#: modules/luci-compat/luasrc/model/network.lua:1428
@@ -5749,29 +5754,29 @@ msgstr "源地址"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:57
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:57
msgid "Source interface"
-msgstr ""
+msgstr "源接口"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:342
msgid ""
"Specifies that duplicate frames (received on inactive ports) should be "
"dropped or delivered"
-msgstr ""
+msgstr "明确重复的帧(在非活动端口接收的)应该被丢弃还是交付"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:358
msgid "Specifies the ARP link monitoring frequency in milliseconds"
-msgstr ""
+msgstr "明确 ARP 链接监控频率,单位为毫秒"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:366
msgid "Specifies the IP addresses to use for ARP monitoring"
-msgstr ""
+msgstr "明确用于 ARP 监控的 IP 地址"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:395
msgid "Specifies the MII link monitoring frequency in milliseconds"
-msgstr ""
+msgstr "明确 MII 链接监控频率,单位为毫秒"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:259
msgid "Specifies the aggregation selection logic to use"
-msgstr ""
+msgstr "明确要使用的聚合选择逻辑"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:292
msgid "Specifies the directory the device is attached to"
@@ -5781,7 +5786,7 @@ msgstr "指定设备的挂载目录"
msgid ""
"Specifies the mac-address for the actor in protocol packet exchanges "
"(LACPDUs). If empty, masters' mac address defaults to system default"
-msgstr ""
+msgstr "明确协议包交换 actor 的 MAC 地址(LACPDUs)。如果为空,master 的 mac 地址默认为系统默认值"
#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:175
msgid ""
@@ -5808,101 +5813,101 @@ msgstr ""
msgid ""
"Specifies the minimum number of links that must be active before asserting "
"carrier"
-msgstr ""
+msgstr "明确 asserting 运营商前必须处于活跃状态的链接的最小数量"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:200
msgid "Specifies the mode to be used for this bonding interface"
-msgstr ""
+msgstr "明确用于此 bonding 接口的模式"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:333
msgid ""
"Specifies the number of IGMP membership reports to be issued after a "
"failover event in 200ms intervals"
-msgstr ""
+msgstr "明确发生故障转移事件后在200毫秒间隔内发出的 IGMP 成员资格报告的数量"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:276
msgid ""
"Specifies the number of packets to transmit through a slave before moving to "
"the next one"
-msgstr ""
+msgstr "明确移动到下一个 slave 之前要通过当前 slave 传输的数据包的数量"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:310
msgid ""
"Specifies the number of peer notifications (gratuitous ARPs and unsolicited "
"IPv6 Neighbor Advertisements) to be issued after a failover event"
-msgstr ""
+msgstr "明确一次故障转移事件后要发布的对等通知(无理由的 ARPs 和未经请求的 IPv6 邻居通告)的数目"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:284
msgid ""
"Specifies the number of seconds between instances where the bonding driver "
"sends learning packets to each slaves peer switch"
-msgstr ""
+msgstr "明确 bonding 驱动向每个 slave 对端交换机发送学习包的实例间间隔的秒数"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:374
msgid "Specifies the quantity of ARP IP targets that must be reachable"
-msgstr ""
+msgstr "明确必须可达的 ARP IP 目标数"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:268
msgid ""
"Specifies the rate in which the link partner will be asked to transmit "
"LACPDU packets"
-msgstr ""
+msgstr "明确链路伙伴被要求传输 LACPDU 包的速率"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:225
msgid ""
"Specifies the reselection policy for the primary slave when failure of the "
"active slave or recovery of the primary slave occurs"
-msgstr ""
+msgstr "明确活跃 slave 发生故障或主 slave 恢复事件发生时重新选择主 slave 的策略"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:244
msgid "Specifies the system priority"
-msgstr ""
+msgstr "明确系统优先级"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:403
msgid ""
"Specifies the time in milliseconds to wait before disabling a slave after a "
"link failure detection"
-msgstr ""
+msgstr "明确在检测到一个链接故障后禁用一个 slave 前等待的时间,单位为毫秒"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:411
msgid ""
"Specifies the time in milliseconds to wait before enabling a slave after a "
"link recovery detection"
-msgstr ""
+msgstr "明确检测到一个链接故障后启用一个 slave 前等待的时间,单位为毫秒"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:382
msgid ""
"Specifies whether ARP probes and replies should be validated or non-ARP "
"traffic should be filtered for link monitoring"
-msgstr ""
+msgstr "明确是否应验证 ARP 探测和应答,或者应为了链路监控目的过滤非 ARP 流量"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:301
msgid ""
"Specifies whether active-backup mode should set all slaves to the same MAC "
"address at enslavement"
-msgstr ""
+msgstr "明确活跃备份模式是否应将所有 slave 设置为同一 MAC 地址"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:419
msgid ""
"Specifies whether or not miimon should use MII or ETHTOOL ioctls vs. "
"netif_carrier_ok()"
-msgstr ""
+msgstr "明确相较 netif carrier ok(),miimon 是否应使用 MII 或 ETHTOOL ioctls"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:293
msgid ""
"Specifies whether to shuffle active flows across slaves based on the load"
-msgstr ""
+msgstr "明确是否根据负载在 slave 范围中对活跃流进行洗牌"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:179
msgid ""
"Specifies which slave interfaces should be attached to this bonding interface"
-msgstr ""
+msgstr "明确应将哪些 slave 接口附着于这个 bonding 接口"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:212
msgid ""
"Specifies which slave is the primary device. It will always be the active "
"slave while it is available"
-msgstr ""
+msgstr "明确哪个 slave 是主设备。当它可用时,它将始终是活跃 slave"
#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:63
#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:72
@@ -5916,6 +5921,8 @@ msgid ""
"header inherits the value of the inner header) or an hexadecimal value "
"<code>00..FF</code> (optional)."
msgstr ""
+"明确一个 TOS (服务类型)。可以是<code>继承</code>(外层消息头继承内部消息头的值)或一个十六进制值<code>00.."
+"FF</code>(可选)。"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:74
msgid ""
@@ -5923,6 +5930,8 @@ msgid ""
"header inherits the value of the inner header), or an hexadecimal value "
"<code>00..FF</code> (optional)."
msgstr ""
+"明确一个 TOS (服务类型)。可以是<code>继承</code>(外层消息头继承内部消息头的值)或一个十六进制值<code>00.."
+"FF</code>(可选)。"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:69
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:74
@@ -5931,7 +5940,7 @@ msgstr ""
msgid ""
"Specify a TTL (Time to Live) for the encapsulating packet other than the "
"default (64) (optional)."
-msgstr ""
+msgstr "为封装数据包指定TTL(生存时间),而不是默认值(64)(可选)。"
#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:58
#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:67
@@ -5948,6 +5957,7 @@ msgid ""
"inherits the value of the inner header) or an hexadecimal value <code>00.."
"FF</code> (optional)."
msgstr ""
+"明确一个流量类。可以是<code>继承</code>(外层消息头继承内部消息头的值)或一个十六进制值<code>00..FF</code>(可选)。"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:64
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:69
@@ -5956,7 +5966,7 @@ msgstr ""
msgid ""
"Specify an MTU (Maximum Transmission Unit) other than the default (1280 "
"bytes) (optional)."
-msgstr ""
+msgstr "指定不同于默认值(1280 字节)的 MTU (最大传输单位)(可选)。"
#: protocols/luci-proto-ipip/htdocs/luci-static/resources/protocol/ipip.js:53
#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:62
@@ -5977,7 +5987,7 @@ msgstr "启动"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:134
msgid "Start WPS"
-msgstr ""
+msgstr "启动 WPS"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/startup.js:76
msgid "Start priority"
@@ -6054,7 +6064,7 @@ msgstr "停止"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:129
msgid "Stop WPS"
-msgstr ""
+msgstr "停止 WPS"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1684
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1778
@@ -6141,7 +6151,7 @@ msgstr "系统日志"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:243
msgid "System Priority"
-msgstr ""
+msgstr "系统优先级"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:104
msgid "System Properties"
@@ -6205,7 +6215,7 @@ msgstr "HE.net 客户端更新设置已经被改变,您现在必须使用用
#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:40
msgid "The IPv4 address or the fully-qualified domain name of the remote end."
-msgstr ""
+msgstr "远程终端的 IPv4 地址或全称域名。"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gre.js:42
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/gretap.js:42
@@ -6216,13 +6226,13 @@ msgstr "远程隧道端的 IPv4 地址或完整域名。"
#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:40
msgid "The IPv6 address or the fully-qualified domain name of the remote end."
-msgstr ""
+msgstr "远程终端的 IPv6 地址或全称域名。"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:42
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:42
msgid ""
"The IPv6 address or the fully-qualified domain name of the remote tunnel end."
-msgstr ""
+msgstr "远程隧道端的 IPv6 地址或全称域名。"
#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/6rd.js:53
#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:59
@@ -6246,7 +6256,7 @@ msgstr "由于以下错误,配置文件无法被加载:"
msgid ""
"The correct SSID must be manually specified when joining a hidden wireless "
"network"
-msgstr ""
+msgstr "加入一个隐藏的无线网络时,必须手动指定正确的 SSID"
#: modules/luci-base/htdocs/luci-static/resources/ui.js:4129
msgid ""
@@ -6337,13 +6347,13 @@ msgstr "所创建隧道的本地 IPv4 地址(可选)。"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:169
msgid "The local IPv4 netmask"
-msgstr ""
+msgstr "本地 IPv4 网络掩码"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:46
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:53
#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:44
msgid "The local IPv6 address over which the tunnel is created (optional)."
-msgstr ""
+msgstr "建立隧道的本地 IPv6 地址(可选)。"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1940
msgid "The network name is already used"
@@ -6561,7 +6571,7 @@ msgstr "重新加密 GTK 的时间间隔"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:15
msgid "Timed-out"
-msgstr ""
+msgstr "超时"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:124
msgid "Timezone"
@@ -6603,7 +6613,7 @@ msgstr "流量"
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6.js:79
#: protocols/luci-proto-gre/htdocs/luci-static/resources/protocol/grev6tap.js:84
msgid "Traffic Class"
-msgstr ""
+msgstr "流量类"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/connections.js:385
msgid "Transfer"
@@ -6615,7 +6625,7 @@ msgstr "传送"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:317
msgid "Transmit Hash Policy"
-msgstr ""
+msgstr "传输散列策略"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js:74
msgid "Trigger"
@@ -6748,7 +6758,7 @@ msgstr "未知"
#: protocols/luci-proto-modemmanager/htdocs/luci-static/resources/protocol/modemmanager.js:47
msgid "Unknown and unsupported connection method."
-msgstr ""
+msgstr "未知且不受支持的连接方式。"
#: modules/luci-base/htdocs/luci-static/resources/network.js:2292
#: modules/luci-compat/luasrc/model/network.lua:1138
@@ -6802,7 +6812,7 @@ msgstr "上移"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:410
msgid "Up Delay"
-msgstr ""
+msgstr "Up 延迟"
#: modules/luci-base/htdocs/luci-static/resources/ui.js:3860
msgid "Upload"
@@ -6901,17 +6911,17 @@ msgstr "隧道接口的 TTL"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:320
msgid "Use XOR of hardware MAC addresses (layer2)"
-msgstr ""
+msgstr "使用硬件 MAC 地址的 XOR (层2)"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:321
msgid "Use XOR of hardware MAC addresses and IP addresses (layer2+3)"
-msgstr ""
+msgstr "使用硬件 MAC 地址和 IP 地址的 XOR (层2+3)"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:323
msgid ""
"Use XOR of hardware MAC addresses and IP addresses, rely on skb_flow_dissect "
"(encap2+3)"
-msgstr ""
+msgstr "使用硬件 MAC 地址和 IP 地址的 XOR,依靠 skb 流剖析 (encap2+3)"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:294
msgid "Use as external overlay (/overlay)"
@@ -6984,13 +6994,13 @@ msgstr "使用网关跃点"
#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:96
msgid "Use legacy MAP"
-msgstr ""
+msgstr "使用旧式 MAP"
#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/map.js:96
msgid ""
"Use legacy MAP interface identifier format (draft-ietf-softwire-map-00) "
"instead of RFC7597"
-msgstr ""
+msgstr "使用旧式 MAP 接口标识符格式(draft-ietf-softwire-map-00),而非 RFC7597"
#: protocols/luci-proto-relay/htdocs/luci-static/resources/protocol/relay.js:179
msgid "Use routing table"
@@ -7019,12 +7029,12 @@ msgstr ""
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:322
msgid "Use upper layer protocol information (layer3+4)"
-msgstr ""
+msgstr "使用上层协议信息(层3+4)"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:324
msgid ""
"Use upper layer protocol information, rely on skb_flow_dissect (encap3+4)"
-msgstr ""
+msgstr "使用上层协议信息,依靠 skb 流剖析 (encap3+4)"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/20_memory.js:36
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/mounts.js:194
@@ -7045,7 +7055,7 @@ msgstr ""
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:111
msgid "User Group"
-msgstr ""
+msgstr "用户组"
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:120
msgid "User certificate (PEM encoded)"
@@ -7088,7 +7098,7 @@ msgstr "VPN 本地端口"
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:96
msgid "VPN Protocol"
-msgstr ""
+msgstr "VPN 协议"
#: protocols/luci-proto-openconnect/htdocs/luci-static/resources/protocol/openconnect.js:102
#: protocols/luci-proto-openfortivpn/htdocs/luci-static/resources/protocol/openfortivpn.js:42
@@ -7114,16 +7124,16 @@ msgstr "VPNC(CISCO 3000 和其他 VPN)"
#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:10
msgid "VXLAN (RFC7348)"
-msgstr ""
+msgstr "VXLAN (RFC7348)"
#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan.js:53
#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:48
msgid "VXLAN network identifier"
-msgstr ""
+msgstr "VXLAN 网络标识符"
#: protocols/luci-proto-vxlan/htdocs/luci-static/resources/protocol/vxlan6.js:10
msgid "VXLANv6 (RFC7348)"
-msgstr ""
+msgstr "VXLANv6 (RFC7348)"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1508
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1566
@@ -7134,15 +7144,15 @@ msgstr "使用系统内置的 CA 包验证服务器证书,<br />需要“ca-bu
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:387
msgid "Validation for all slaves"
-msgstr ""
+msgstr "验证所有 slave"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:385
msgid "Validation only for active slave"
-msgstr ""
+msgstr "仅验证活跃 slave"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:386
msgid "Validation only for backup slaves"
-msgstr ""
+msgstr "仅验证备份 slave"
#: protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js:154
msgid "Value must not be empty"
@@ -7162,7 +7172,7 @@ msgstr "正在验证上传的镜像文件。"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:903
msgid "Very High"
-msgstr ""
+msgstr "非常高"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:59
msgid "Virtual dynamic interface"
@@ -7205,7 +7215,7 @@ msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/60_wifi.js:147
msgid "WPS status"
-msgstr ""
+msgstr "WPS 状态"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:47
msgid "Waiting for device..."
@@ -7237,13 +7247,13 @@ msgstr ""
msgid ""
"Where Wi-Fi Multimedia (WMM) Mode QoS is disabled, clients may be limited to "
"802.11a/802.11g rates."
-msgstr ""
+msgstr "如果禁用 Wi-Fi 多媒体 (WMM) 模式 QoS,则客户端的速率可能限制为 802.11a/802.11g。"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1076
msgid ""
"Where the ESSID is hidden, clients may fail to roam and airtime efficiency "
"may be significantly reduced."
-msgstr ""
+msgstr "在 ESSID 被隐藏的地方,客户端可能无法漫游,通话时间效率可能显著降低。"
#: modules/luci-compat/luasrc/view/cbi/wireless_modefreq.htm:166
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:471
@@ -7315,7 +7325,7 @@ msgstr "将系统日志写入文件"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:204
msgid "XOR policy (balance-xor, 2)"
-msgstr ""
+msgstr "XOR 策略 (balance-xor, 2)"
#: modules/luci-base/htdocs/luci-static/resources/form.js:3643
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:295
@@ -7326,7 +7336,7 @@ msgstr "是"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:303
msgid "Yes (none, 0)"
-msgstr ""
+msgstr "好(无,0)"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:176
msgid ""
@@ -7354,12 +7364,12 @@ msgstr "必须开启浏览器的 JavaScript 支持,否则 LuCI 无法正常工
msgid ""
"You must select a primary interface which is included in selected slave "
"interfaces!"
-msgstr ""
+msgstr "你必须选择一个主接口,该主接口包含在已选从接口中!"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:96
msgid ""
"You must select at least one ARP IP target if ARP monitoring is selected!"
-msgstr ""
+msgstr "若 ARP 监控被选中,你必须选择至少一个 ARP IP 目标!"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js:192
msgid "ZRam Compression Algorithm"
@@ -7470,11 +7480,11 @@ msgstr "驱动默认"
#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:81
msgid "e.g: --proxy 10.10.10.10"
-msgstr ""
+msgstr "比如: --proxy 10.10.10.10"
#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:83
msgid "e.g: dump"
-msgstr ""
+msgstr "比如: dump"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:521
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:542
@@ -7555,7 +7565,7 @@ msgstr "分钟"
#: protocols/luci-proto-bonding/htdocs/luci-static/resources/protocol/bonding.js:422
msgid "netif_carrier_ok()"
-msgstr ""
+msgstr "netif_carrier_ok()"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:46
msgid "no"
@@ -7633,7 +7643,7 @@ msgstr "服务器模式"
#: protocols/luci-proto-sstp/htdocs/luci-static/resources/protocol/sstp.js:53
msgid "sstpc Log-level"
-msgstr ""
+msgstr "sstpc 记录级别"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:649
msgid "stateful-only"
diff --git a/modules/luci-base/po/zh_Hant/base.po b/modules/luci-base/po/zh_Hant/base.po
index 67765b4219..2c2bed6db0 100644
--- a/modules/luci-base/po/zh_Hant/base.po
+++ b/modules/luci-base/po/zh_Hant/base.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
-"PO-Revision-Date: 2021-01-05 19:20+0000\n"
+"PO-Revision-Date: 2021-01-10 16:32+0000\n"
"Last-Translator: akibou <jinwenxin1997@icloud.com>\n"
"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/"
"openwrt/luci/zh_Hant/>\n"
@@ -1200,7 +1200,7 @@ msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:938
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js:1043
msgid "Client"
-msgstr "用戶端"
+msgstr "客户端"
#: modules/luci-base/htdocs/luci-static/resources/protocol/dhcp.js:52
#: protocols/luci-proto-ipv6/htdocs/luci-static/resources/protocol/dhcpv6.js:47
@@ -1818,7 +1818,7 @@ msgstr "您確定要清除所有設定?"
#: modules/luci-base/htdocs/luci-static/resources/ui.js:2753
msgid "Do you really want to recursively delete the directory \"%s\" ?"
-msgstr "您真的要遞迴刪除此 \"%s\"資料夾 ?"
+msgstr "您真的要遞迴刪除目錄 \"%s\" 嗎?"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js:168
msgid "Domain required"
@@ -2522,35 +2522,35 @@ msgstr "前往相應設定頁"
#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:33
msgid "Grant access to DHCP configuration"
-msgstr "授予權限執行 DHCP 配置"
+msgstr "授予存取 DHCP 組態的權限"
#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:102
msgid "Grant access to DHCP status display"
-msgstr "授予對 DHCP 設定的存取權限"
+msgstr "授予存取 DHCP 狀態顯示的權限"
#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:111
msgid "Grant access to DSL status display"
-msgstr "授予對 DSL 狀態顯示的存取權限"
+msgstr "授予存取 DSL 狀態顯示的權限"
#: protocols/luci-proto-openconnect/root/usr/share/rpcd/acl.d/luci-openconnect.json:3
msgid "Grant access to LuCI OpenConnect procedures"
-msgstr "授予對 LuCI OpenConnect 程序的存取權限"
+msgstr "授予存取 LuCI OpenConnect 程序的權限"
#: protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json:3
msgid "Grant access to LuCI Wireguard procedures"
-msgstr "授予對 LuCI Wireguard 程序的存取權限"
+msgstr "授予存取 LuCI Wireguard 程序的權限"
#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:19
msgid "Grant access to SSH configuration"
-msgstr "授予對 SSH 設定的存取權限"
+msgstr "授予存取 SSH 組態的權限"
#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:12
msgid "Grant access to basic LuCI procedures"
-msgstr "授予存取基本 LuCI 程式的權限"
+msgstr "授予存取基本 LuCI 程序的權限"
#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:64
msgid "Grant access to crontab configuration"
-msgstr "授予對 crontab 設定的存取權限"
+msgstr "授予存取 Crontab 組態的權限"
#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:60
msgid "Grant access to firewall status"
@@ -2570,47 +2570,47 @@ msgstr "授予存取 mmcli 的權限"
#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:84
msgid "Grant access to mount configuration"
-msgstr "授予對掛載設定的存取權限"
+msgstr "授予存取掛載組態的權限"
#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:3
msgid "Grant access to network configuration"
-msgstr "授予存取網路設定的權限"
+msgstr "授予存取網路組態的權限"
#: modules/luci-mod-network/root/usr/share/rpcd/acl.d/luci-mod-network.json:46
msgid "Grant access to network diagnostic tools"
-msgstr "授予使用網路診斷工具的權限"
+msgstr "授予存取網路診斷工具的權限"
#: modules/luci-base/root/usr/share/rpcd/acl.d/luci-base.json:36
msgid "Grant access to network status information"
-msgstr "授予檢視網路狀態資訊的權限"
+msgstr "授予存取網路狀態資訊的權限"
#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:13
msgid "Grant access to process status"
-msgstr "授予檢視處理程序狀態資訊的權限"
+msgstr "授予存取處理狀態的權限"
#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:3
msgid "Grant access to realtime statistics"
-msgstr "授予檢視即時統計資料的權限"
+msgstr "授予存取即時統計資料的權限"
#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:42
msgid "Grant access to startup configuration"
-msgstr "授予啟動設定的權限"
+msgstr "授予存取啟動組態的權限"
#: modules/luci-mod-system/root/usr/share/rpcd/acl.d/luci-mod-system.json:3
msgid "Grant access to system configuration"
-msgstr "授予系統設定的權限"
+msgstr "授予存取系統組態的權限"
#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:30
msgid "Grant access to system logs"
-msgstr "授予檢視系統日誌的權限"
+msgstr "授予存取系統日誌的權限"
#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:47
msgid "Grant access to the system route status"
-msgstr "授予檢視系統路由狀態的權限"
+msgstr "授予存取系統路由狀態的權限"
#: modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json:120
msgid "Grant access to wireless status display"
-msgstr "授予無線狀態顯示的權限"
+msgstr "授予存取無線狀態顯示的權限"
#: protocols/luci-proto-vpnc/htdocs/luci-static/resources/protocol/vpnc.js:66
msgid "Group Password"
@@ -2809,7 +2809,7 @@ msgstr "IPv4+IPv6"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:87
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:155
msgid "IPv4-Address"
-msgstr "IPv4-位址"
+msgstr "IPv4 位址"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:165
msgid "IPv4-Gateway"
@@ -2913,7 +2913,7 @@ msgstr "IPv6 支援"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/include/40_dhcp.js:126
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/routes.js:174
msgid "IPv6-Address"
-msgstr "IPv6-位址"
+msgstr "IPv6 位址"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js:100
msgid "IPv6-PD"
@@ -5102,7 +5102,7 @@ msgstr "重新綁護"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/reboot.js:20
#: modules/luci-mod-system/root/usr/share/luci/menu.d/luci-mod-system.json:126
msgid "Reboot"
-msgstr "重啟"
+msgstr "重新啟動"
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:153
#: modules/luci-mod-system/htdocs/luci-static/resources/view/system/flash.js:162
diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/svg/channel_analysis.svg b/modules/luci-mod-status/htdocs/luci-static/resources/svg/channel_analysis.svg
new file mode 100644
index 0000000000..8f01075d0b
--- /dev/null
+++ b/modules/luci-mod-status/htdocs/luci-static/resources/svg/channel_analysis.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <polyline id="rx" points="" style="fill:blue;fill-opacity:0.4;stroke:blue;stroke-width:1" />
+ <polyline id="tx" points="" style="fill:green;fill-opacity:0.4;stroke:green;stroke-width:1" />
+
+ <line x1="0" y1="25%" x2="100%" y2="25%" style="stroke:black;stroke-width:0.1" />
+ <text id="label_75" x="10" y="24%" style="fill:#eee; font-size:9pt; font-family:sans-serif; text-shadow:1px 1px 1px #000">-25 dbm</text>
+
+ <line x1="0" y1="50%" x2="100%" y2="50%" style="stroke:black;stroke-width:0.1" />
+ <text id="label_50" x="10" y="49%" style="fill:#eee; font-size:9pt; font-family:sans-serif; text-shadow:1px 1px 1px #000">-50 dbm</text>
+
+ <line x1="0" y1="75%" x2="100%" y2="75%" style="stroke:black;stroke-width:0.1" />
+ <text id="label_25" x="10" y="74%" style="fill:#eee; font-size:9pt; font-family:sans-serif; text-shadow:1px 1px 1px #000">-75 dbm</text>
+
+ <line x1="0" y1="90%" x2="100%" y2="90%" style="stroke:black;stroke-width:0.1" />
+ <text id="label_10" x="10" y="89%" style="fill:#eee; font-size:9pt; font-family:sans-serif; text-shadow:1px 1px 1px #000">-90 dbm</text>
+</svg>
diff --git a/modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js
new file mode 100644
index 0000000000..b2f32bb635
--- /dev/null
+++ b/modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js
@@ -0,0 +1,396 @@
+'use strict';
+'require view';
+'require poll';
+'require request';
+'require network';
+'require ui';
+'require rpc';
+'require tools.prng as random';
+
+return view.extend({
+ callFrequencyList : rpc.declare({
+ object: 'iwinfo',
+ method: 'freqlist',
+ params: [ 'device' ],
+ expect: { results: [] }
+ }),
+
+ callInfo : rpc.declare({
+ object: 'iwinfo',
+ method: 'info',
+ params: [ 'device' ],
+ expect: { }
+ }),
+
+ render_signal_badge: function(signalPercent, signalValue) {
+ var icon, title, value;
+
+ if (signalPercent < 0)
+ icon = L.resource('icons/signal-none.png');
+ else if (signalPercent == 0)
+ icon = L.resource('icons/signal-0.png');
+ else if (signalPercent < 25)
+ icon = L.resource('icons/signal-0-25.png');
+ else if (signalPercent < 50)
+ icon = L.resource('icons/signal-25-50.png');
+ else if (signalPercent < 75)
+ icon = L.resource('icons/signal-50-75.png');
+ else
+ icon = L.resource('icons/signal-75-100.png');
+
+ value = '%d\xa0%s'.format(signalValue, _('dBm'));
+ title = '%s: %d %s'.format(_('Signal'), signalValue, _('dBm'));
+
+ return E('div', {
+ 'class': 'ifacebadge',
+ 'title': title,
+ 'data-signal': signalValue
+ }, [
+ E('img', { 'src': icon }),
+ value
+ ]);
+ },
+
+ add_wifi_to_graph: function(chan_analysis, res, scanCache, channels, channel_width) {
+ var offset_tbl = chan_analysis.offset_tbl,
+ height = chan_analysis.graph.offsetHeight - 2,
+ step = chan_analysis.col_width,
+ height_diff = (height-(height-(res.signal*-4)));
+
+ if (scanCache[res.bssid].color == null)
+ scanCache[res.bssid].color = random.derive_color(res.bssid);
+
+ if (scanCache[res.bssid].graph == null)
+ scanCache[res.bssid].graph = [];
+
+ for (var i=0; i < channels.length; i++) {
+ var chan_offset = offset_tbl[channels[i]],
+ points = [
+ (chan_offset-(step*channel_width))+','+height,
+ (chan_offset-(step*(channel_width-1)))+','+height_diff,
+ (chan_offset+(step*(channel_width-1)))+','+height_diff,
+ (chan_offset+(step*(channel_width)))+','+height
+ ];
+
+ if (scanCache[res.bssid].graph[i] == null) {
+ var group = document.createElementNS('http://www.w3.org/2000/svg', 'g'),
+ line = document.createElementNS('http://www.w3.org/2000/svg', 'polyline'),
+ text = document.createElementNS('http://www.w3.org/2000/svg', 'text'),
+ color = scanCache[res.bssid].color;
+
+ line.setAttribute('style', 'fill:'+color+'4f'+';stroke:'+color+';stroke-width:0.5');
+ text.setAttribute('style', 'fill:'+color+';font-size:9pt; font-family:sans-serif; text-shadow:1px 1px 1px #000');
+ text.appendChild(document.createTextNode(res.ssid || res.bssid));
+
+ group.appendChild(line)
+ group.appendChild(text)
+
+ chan_analysis.graph.firstElementChild.appendChild(group);
+ scanCache[res.bssid].graph[i] = { group : group, line : line, text : text };
+ }
+
+ scanCache[res.bssid].graph[i].text.setAttribute('x', chan_offset-step);
+ scanCache[res.bssid].graph[i].text.setAttribute('y', height_diff - 2);
+ scanCache[res.bssid].graph[i].line.setAttribute('points', points);
+ scanCache[res.bssid].graph[i].group.style.zIndex = res.signal*-1;
+ scanCache[res.bssid].graph[i].group.style.opacity = res.stale ? '0.5' : null;
+ }
+ },
+
+ create_channel_graph: function(chan_analysis, freq_tbl, is5GHz) {
+ var columns = is5GHz ? freq_tbl.length * 4 : freq_tbl.length + 3,
+ chan_graph = chan_analysis.graph,
+ G = chan_graph.firstElementChild,
+ step = (chan_graph.offsetWidth - 2) / columns,
+ curr_offset = step;
+
+ function createGraphHLine(graph, pos) {
+ var elem = document.createElementNS('http://www.w3.org/2000/svg', 'line');
+ elem.setAttribute('x1', pos);
+ elem.setAttribute('y1', 0);
+ elem.setAttribute('x2', pos);
+ elem.setAttribute('y2', '100%');
+ elem.setAttribute('style', 'stroke:black;stroke-width:0.1');
+ graph.appendChild(elem);
+ }
+
+ function createGraphText(graph, pos, text) {
+ var elem = document.createElementNS('http://www.w3.org/2000/svg', 'text');
+ elem.setAttribute('y', 15);
+ elem.setAttribute('style', 'fill:#eee; font-size:9pt; font-family:sans-serif; text-shadow:1px 1px 1px #000');
+ elem.setAttribute('x', pos + 5);
+ elem.appendChild(document.createTextNode(text));
+ graph.appendChild(elem);
+ }
+
+ chan_analysis.col_width = step;
+
+ createGraphHLine(G,curr_offset);
+ for (var i=0; i< freq_tbl.length;i++) {
+ var channel = freq_tbl[i].channel
+ chan_analysis.offset_tbl[channel] = curr_offset+step;
+
+ createGraphHLine(G,curr_offset+step);
+ createGraphText(G,curr_offset+step, channel);
+ curr_offset += step;
+
+ if (is5GHz && freq_tbl[i+1]) {
+ var next_channel = freq_tbl[i+1].channel;
+ /* Check if we are transitioning to another 5Ghz band range */
+ if ((next_channel - channel) == 4) {
+ for (var j=1; j < 4; j++) {
+ chan_analysis.offset_tbl[channel+j] = curr_offset+step;
+ createGraphHLine(G,curr_offset+step);
+ curr_offset += step;
+ }
+ } else {
+ chan_analysis.offset_tbl[channel+1] = curr_offset+step;
+ createGraphHLine(G,curr_offset+step);
+ curr_offset += step;
+
+ chan_analysis.offset_tbl[next_channel-2] = curr_offset+step;
+ createGraphHLine(G,curr_offset+step);
+ curr_offset += step;
+
+ chan_analysis.offset_tbl[next_channel-1] = curr_offset+step;
+ createGraphHLine(G,curr_offset+step);
+ curr_offset += step;
+ }
+ }
+ }
+ createGraphHLine(G,curr_offset+step);
+
+ chan_analysis.tab.addEventListener('cbi-tab-active', L.bind(function(ev) {
+ this.active_tab = ev.detail.tab;
+ }, this));
+ },
+
+ handleScanRefresh: function() {
+ if (!this.active_tab)
+ return;
+
+ var radioDev = this.radios[this.active_tab].dev,
+ table = this.radios[this.active_tab].table,
+ chan_analysis = this.radios[this.active_tab].graph,
+ scanCache = this.radios[this.active_tab].scanCache;
+
+ return Promise.all([
+ radioDev.getScanList(),
+ this.callInfo(radioDev.getName())
+ ]).then(L.bind(function(data) {
+ var results = data[0],
+ local_wifi = data[1];
+
+ var rows = [];
+
+ for (var i = 0; i < results.length; i++) {
+ if (scanCache[results[i].bssid] == null)
+ scanCache[results[i].bssid] = {};
+
+ scanCache[results[i].bssid].data = results[i];
+ }
+
+ if (scanCache[local_wifi.bssid] == null)
+ scanCache[local_wifi.bssid] = {};
+
+ scanCache[local_wifi.bssid].data = local_wifi;
+
+ var center_channels = [local_wifi.center_chan1],
+ chan_width_text = local_wifi.htmode.replace(/(V)*HT/,''),
+ chan_width;
+
+ if (local_wifi.center_chan2) {
+ center_channels.push(local_wifi.center_chan2);
+ chan_width = 8;
+ } else {
+ chan_width = parseInt(chan_width_text)/10;
+ }
+
+ local_wifi.signal = -10;
+ local_wifi.ssid = 'Local Interface';
+
+ this.add_wifi_to_graph(chan_analysis, local_wifi, scanCache, center_channels, chan_width);
+ rows.push([
+ this.render_signal_badge(q, local_wifi.signal),
+ [
+ E('span', { 'style': 'color:'+scanCache[local_wifi.bssid].color }, '⬤ '),
+ local_wifi.ssid
+ ],
+ '%d'.format(local_wifi.channel),
+ '%h MHz'.format(chan_width_text),
+ '%h'.format(local_wifi.mode),
+ '%h'.format(local_wifi.bssid)
+ ]);
+
+ for (var k in scanCache)
+ if (scanCache[k].stale)
+ results.push(scanCache[k].data);
+
+ results.sort(function(a, b) {
+ var diff = (b.quality - a.quality) || (a.channel - b.channel);
+
+ if (diff)
+ return diff;
+
+ if (a.ssid < b.ssid)
+ return -1;
+ else if (a.ssid > b.ssid)
+ return 1;
+
+ if (a.bssid < b.bssid)
+ return -1;
+ else if (a.bssid > b.bssid)
+ return 1;
+ });
+
+ for (var i = 0; i < results.length; i++) {
+ var res = results[i],
+ qv = res.quality || 0,
+ qm = res.quality_max || 0,
+ q = (qv > 0 && qm > 0) ? Math.floor((100 / qm) * qv) : 0,
+ s = res.stale ? 'opacity:0.5' : '',
+ center_channels = [res.channel],
+ chan_width = 2;
+
+ res.channel_width = "20 MHz";
+ if (res.ht_operation.channel_width == 2040) { /* 40 MHz Channel Enabled */
+ if (res.ht_operation.secondary_channel_offset == "below") {
+ res.channel_width = "40 MHz";
+ chan_width = 4; /* 40 MHz Channel Used */
+ center_channels[0] -= 2;
+ } else if (res.ht_operation.secondary_channel_offset == "above") {
+ res.channel_width = "40 MHz";
+ chan_width = 4; /* 40 MHz Channel Used */
+ center_channels[0] += 2;
+ } else {
+ res.channel_width = "20 MHz (40 MHz Intolerant)";
+ }
+ }
+
+ if (res.vht_operation != null) {
+ center_channels[0] = res.vht_operation.center_freq_1;
+ if (res.vht_operation.channel_width == 80) {
+ chan_width = 8;
+ res.channel_width = "80 MHz";
+ } else if (res.vht_operation.channel_width == 8080) {
+ res.channel_width = "80+80 MHz";
+ chan_width = 8;
+ center_channels.push(res.vht_operation.center_freq_2);
+ } else if (res.vht_operation.channel_width == 160) {
+ res.channel_width = "160 MHz";
+ chan_width = 16;
+ }
+ }
+
+ this.add_wifi_to_graph(chan_analysis, res, scanCache, center_channels, chan_width);
+
+ rows.push([
+ E('span', { 'style': s }, this.render_signal_badge(q, res.signal)),
+ E('span', { 'style': s }, [
+ E('span', { 'style': 'color:'+scanCache[results[i].bssid].color }, '⬤ '),
+ (res.ssid != null) ? '%h'.format(res.ssid) : E('em', _('hidden'))
+ ]),
+ E('span', { 'style': s }, '%d'.format(res.channel)),
+ E('span', { 'style': s }, '%h'.format(res.channel_width)),
+ E('span', { 'style': s }, '%h'.format(res.mode)),
+ E('span', { 'style': s }, '%h'.format(res.bssid))
+ ]);
+
+ res.stale = true;
+ }
+
+ cbi_update_table(table, rows);
+ }, this))
+ },
+
+ radios : {},
+
+ loadSVG : function(src) {
+ return request.get(src).then(function(response) {
+ if (!response.ok)
+ throw new Error(response.statusText);
+
+ return E('div', {
+ 'id': 'channel_graph',
+ 'style': 'width:100%;height:400px;border:1px solid #000;background:#fff'
+ }, E(response.text()));
+ });
+ },
+
+ load: function() {
+ return Promise.all([
+ this.loadSVG(L.resource('svg/channel_analysis.svg')),
+ network.getWifiDevices().then(L.bind(function(data) {
+ var tasks = [], ret = [];
+
+ for (var i = 0; i < data.length; i++) {
+ ret[data[i].getName()] = { dev : data[i] };
+
+ tasks.push(this.callFrequencyList(data[i].getName())
+ .then(L.bind(function(radio, data) {
+ ret[radio.getName()].freq = data;
+ }, this, data[i])));
+ }
+
+ return Promise.all(tasks).then(function() { return ret; })
+ }, this))
+ ]);
+ },
+
+ render: function(data) {
+ var svg = data[0],
+ wifiDevs = data[1];
+
+ var v = E('div', {}, E('div'));
+
+ for (var ifname in wifiDevs) {
+ var csvg = svg.cloneNode(true),
+ freq_tbl = wifiDevs[ifname].freq,
+ is5GHz = freq_tbl[0].mhz >= 5000,
+ table = E('div', { 'class': 'table' }, [
+ E('div', { 'class': 'tr table-titles' }, [
+ E('div', { 'class': 'th col-2 middle center' }, _('Signal')),
+ E('div', { 'class': 'th col-4 middle left' }, _('SSID')),
+ E('div', { 'class': 'th col-2 middle center hide-xs' }, _('Channel')),
+ E('div', { 'class': 'th col-3 middle left' }, _('Channel Width')),
+ E('div', { 'class': 'th col-2 middle left hide-xs' }, _('Mode')),
+ E('div', { 'class': 'th col-3 middle left hide-xs' }, _('BSSID'))
+ ])
+ ]),
+ tab = E('div', { 'data-tab': ifname, 'data-tab-title': ifname+' ('+(is5GHz ? '5GHz' : '2.4GHz')+') ' },
+ [E('br'),csvg,E('br'),table,E('br')]),
+ graph_data = {
+ graph: csvg,
+ offset_tbl: {},
+ col_width: 0,
+ tab: tab,
+ };
+
+ this.radios[ifname] = {
+ dev: wifiDevs[ifname].dev,
+ graph: graph_data,
+ table: table,
+ scanCache: {}
+ };
+
+ cbi_update_table(table, [], E('em', { class: 'spinning' }, _('Starting wireless scan...')));
+
+ v.firstElementChild.appendChild(tab)
+
+ requestAnimationFrame(L.bind(this.create_channel_graph, this, graph_data, freq_tbl, is5GHz));
+ }
+
+ ui.tabs.initTabGroup(v.firstElementChild.childNodes);
+
+ this.pollFn = L.bind(this.handleScanRefresh, this);
+
+ poll.add(this.pollFn);
+ poll.start();
+
+ return v;
+ },
+
+ handleSaveApply: null,
+ handleSave: null,
+ handleReset: null
+});
diff --git a/modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json b/modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json
index e8eee643d5..0f066e67ad 100644
--- a/modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json
+++ b/modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json
@@ -71,6 +71,19 @@
}
},
+ "admin/status/channel_analysis": {
+ "title": "Channel Analysis",
+ "order": 7,
+ "action": {
+ "type": "view",
+ "path": "status/channel_analysis"
+ },
+ "depends": {
+ "acl": [ "luci-mod-status-channel_analysis" ],
+ "uci": { "wireless": { "@wifi-device": true } }
+ }
+ },
+
"admin/status/realtime": {
"title": "Realtime Graphs",
"order": 7,
diff --git a/modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json b/modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json
index db52c73137..5029bbed47 100644
--- a/modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json
+++ b/modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json
@@ -56,6 +56,15 @@
}
},
+ "luci-mod-status-channel_analysis": {
+ "description": "Grant access to the system route status",
+ "read": {
+ "ubus": {
+ "iwinfo": [ "info", "freqlist" ]
+ }
+ }
+ },
+
"luci-mod-status-firewall": {
"description": "Grant access to firewall status",
"read": {
diff --git a/modules/luci-mod-status/src/luci-bwc.c b/modules/luci-mod-status/src/luci-bwc.c
index 6f7016ec9d..b7682f9e21 100644
--- a/modules/luci-mod-status/src/luci-bwc.c
+++ b/modules/luci-mod-status/src/luci-bwc.c
@@ -253,7 +253,21 @@ static void umap_file(struct file_map *m)
static void * iw_open(void)
{
- return dlopen("/usr/lib/libiwinfo.so", RTLD_LAZY);
+ void *iwlib = NULL;
+ glob_t paths;
+ int i;
+
+ if (glob("/usr/lib/libiwinfo.so*", 0, NULL, &paths) != 0)
+ return NULL;
+
+ for (i = 0; i < paths.gl_pathc && !iwlib; i++)
+ iwlib = dlopen(paths.gl_pathv[i], RTLD_LAZY | RTLD_LOCAL);
+
+ globfree(&paths);
+
+ if (!iwlib)
+ return NULL;
+ return iwlib;
}
static int iw_update(
diff --git a/modules/luci-mod-system/Makefile b/modules/luci-mod-system/Makefile
index f0ca7987ed..a6d5a7a456 100644
--- a/modules/luci-mod-system/Makefile
+++ b/modules/luci-mod-system/Makefile
@@ -7,11 +7,7 @@
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Administration - Global System Settings
-LUCI_DEPENDS:=+luci-base \
- +kmod-ledtrig-default-on \
- +kmod-ledtrig-heartbeat \
- +kmod-ledtrig-netdev \
- +kmod-ledtrig-timer
+LUCI_DEPENDS:=+luci-base
PKG_LICENSE:=Apache-2.0