diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/luci-base/htdocs/luci-static/resources/firewall.js | 16 | ||||
-rw-r--r-- | modules/luci-base/htdocs/luci-static/resources/tools/prng.js | 18 | ||||
-rw-r--r-- | modules/luci-base/htdocs/luci-static/resources/ui.js | 8 | ||||
-rw-r--r-- | modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua | 3 | ||||
-rw-r--r-- | modules/luci-base/po/en/base.po | 13 | ||||
-rw-r--r-- | modules/luci-base/po/it/base.po | 16 | ||||
-rw-r--r-- | modules/luci-base/po/ru/base.po | 8 | ||||
-rw-r--r-- | modules/luci-base/po/zh_Hans/base.po | 246 | ||||
-rw-r--r-- | modules/luci-base/po/zh_Hant/base.po | 50 | ||||
-rw-r--r-- | modules/luci-mod-status/htdocs/luci-static/resources/svg/channel_analysis.svg | 19 | ||||
-rw-r--r-- | modules/luci-mod-status/htdocs/luci-static/resources/view/status/channel_analysis.js | 396 | ||||
-rw-r--r-- | modules/luci-mod-status/root/usr/share/luci/menu.d/luci-mod-status.json | 13 | ||||
-rw-r--r-- | modules/luci-mod-status/root/usr/share/rpcd/acl.d/luci-mod-status.json | 9 | ||||
-rw-r--r-- | modules/luci-mod-status/src/luci-bwc.c | 16 | ||||
-rw-r--r-- | modules/luci-mod-system/Makefile | 6 |
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 |