From ed73e42a08aa9b1db3fb2cb6cbb42e1543587e4b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 12 Nov 2026 18:00:39 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Sync=202026-11-12=2018:00:39?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gately/Makefile | 4 +- honk/Makefile | 6 +- luci-app-fastnet/Makefile | 6 +- .../resources/view/fchomo/client.js | 474 ++++----- luci-app-flowproxy/Makefile | 4 +- .../resources/view/flowproxy/flowproxy.js | 14 +- luci-app-flowproxy/po/templates/flowproxy.pot | 6 + luci-app-flowproxy/po/zh_Hans/flowproxy.po | 6 + luci-app-flowproxy/root/etc/config/flowproxy | 1 + luci-app-flowproxy/root/etc/init.d/flowproxy | 329 ++----- .../root/usr/share/flowproxy/common.sh | 328 +++++++ .../root/usr/share/flowproxy/watchdog.sh | 171 ++++ .../root/usr/share/rpcd/ucode/luci.flowproxy | 10 +- luci-app-open-box/Makefile | 4 +- luci-app-vantage/Makefile | 14 +- .../luci-static/resources/vantage/app.css | 19 + .../luci-static/resources/vantage/model.js | 7 +- .../resources/view/vantage/overview.js | 23 +- luci-app-vantage/po/templates/vantage.pot | 900 ++++++++--------- luci-app-vantage/po/zh_Hans/vantage.po | 922 +++++++++--------- .../share/rpcd/acl.d/luci-app-vantage.json | 6 +- .../root/usr/share/rpcd/ucode/luci.vantage | 57 +- luci-theme-vantage/Makefile | 4 +- .../luci-static/resources/menu-vantage.js | 2 +- .../htdocs/luci-static/vantage/vantage.css | 23 +- pcat-mgr/Makefile | 49 - pcat-mgr/files/pcat-mgr.init | 13 - 27 files changed, 1828 insertions(+), 1574 deletions(-) create mode 100755 luci-app-flowproxy/root/usr/share/flowproxy/common.sh create mode 100755 luci-app-flowproxy/root/usr/share/flowproxy/watchdog.sh delete mode 100644 pcat-mgr/Makefile delete mode 100644 pcat-mgr/files/pcat-mgr.init diff --git a/gately/Makefile b/gately/Makefile index 2afa2063d..b6bee283c 100644 --- a/gately/Makefile +++ b/gately/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=gately -PKG_VERSION:=0.6.5.5 -PKG_RELEASE:=32 +PKG_VERSION:=0.6.6 +PKG_RELEASE:=33 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/wangwanjie/gately/tar.gz/v$(PKG_VERSION)? diff --git a/honk/Makefile b/honk/Makefile index eace91c2f..f6759b767 100644 --- a/honk/Makefile +++ b/honk/Makefile @@ -5,11 +5,11 @@ include $(TOPDIR)/rules.mk PKG_NAME:=honk -PKG_VERSION:=2026.11.09~6484888 -PKG_RELEASE:=34 +PKG_VERSION:=2026.11.12~a09d3bf +PKG_RELEASE:=35 HONK_SRC_URL:=https://github.com/daeuniverse/honk.git -HONK_SRC_VERSION:=64848881b7304e250e7a25422f4f1d86a5975eca +HONK_SRC_VERSION:=a09d3bfa272f3670d6606373452be41606bdc29e PKG_LICENSE:=AGPL-3.0-only PKG_LICENSE_FILES:=LICENSE diff --git a/luci-app-fastnet/Makefile b/luci-app-fastnet/Makefile index 581fe8a5c..8bb1bfa43 100644 --- a/luci-app-fastnet/Makefile +++ b/luci-app-fastnet/Makefile @@ -10,10 +10,8 @@ LUCI_DEPENDS:=+fastnet +luci-lib-linkeaseauth +linkease-app-entry # APK uses -rN; OPKG uses -N for runtime package releases. LUCI_EXTRA_DEPENDS:=fastnet (>=0.8.9-$(if $(CONFIG_USE_APK),r)1) LUCI_PKGARCH:=all -PKG_VERSION:=0.8.9-r1 -PKG_RELEASE:=8 -# Preserve LuCI translation version ordering when upgrading older git-* packages. -PKG_PO_VERSION:=git-26.313.00000-082 +PKG_VERSION:=0.8.9-r2 +PKG_RELEASE:=9 LUCI_MINIFY_CSS:=0 LUCI_MINIFY_JS:=0 diff --git a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js index d2ae0b070..d0c853f37 100644 --- a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js @@ -490,42 +490,39 @@ function flagToBool(flag) { function renderPayload(s, total, uciconfig) { // common payload - let initPayload = function(o, n, key) { + const initPayload = function(o, n, key, + load_callback = (n, k, inst) => inst.getPayload(n)[k], + onchange_callback = (n, k, v, inst) => inst.setPayload(n, Object.fromEntries([[k, v]])) + ) { o.load = function(section_id) { - return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayload(n)[key]; + return load_callback(n, key, this.section.getOption('entry').instget(section_id)); } o.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'entry'); - let n = this.option.match(/^payload(\d+)_/)[1]; - let rule = new RulesEntry(UIEl.getValue()).setPayload(n, {factor: value}); - - UIEl.node.previousSibling.innerText = rule.toString('mihomo'); - UIEl.setValue(rule.toString('json')); + this.section.getOption('entry').instset(section_id, L.bind(onchange_callback, this, n, key, value)); } o.write = function() {}; o.rmempty = false; o.modalonly = true; } - let initDynamicPayload = function(o, n, key) { + const initDynamicPayload = function(o, n, key, + load_callback = (n, k, inst) => inst.getPayloads().slice(n).map(e => e[k] ?? ''), + onchange_callback = (n, k, v, inst) => { + const limit = inst.getPayloads().length; + v.forEach((val) => { + inst.setPayload(n, Object.fromEntries([[k, val]])); n++; + }); + inst.setPayload(limit, Object.fromEntries([[k, null]]), limit); + } + ) { o.allowduplicates = true; o.load = function(section_id) { - return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayloads().slice(n).map(e => e[key] ?? ''); + return load_callback(n, key, this.section.getOption('entry').instget(section_id)); } o.validate = function(section_id, value) { value = this.formvalue(section_id); - let UIEl = this.section.getUIElement(section_id, 'entry'); - let rule = new RulesEntry(UIEl.getValue()); - let n = this.option.match(/^payload(\d+)_/)[1]; - let limit = rule.getPayloads().length; - value.forEach((val) => { - rule.setPayload(n, {factor: val}); n++; - }); - rule.setPayload(limit, {factor: null}, limit); - - UIEl.node.previousSibling.innerText = rule.toString('mihomo'); - UIEl.setValue(rule.toString('json')); + this.section.getOption('entry').instset(section_id, L.bind(onchange_callback, this, n, key, value)); return true; } @@ -535,6 +532,7 @@ function renderPayload(s, total, uciconfig) { } let o, prefix; + // StaticList payload for (let n=0; n (inst.getPayload(n)[k] || '').split('/'), + (n, k, v, inst) => inst.setPayload(n, Object.fromEntries([[k, v.join('/')]])) + ); o = s.option(form.ListValue, prefix + 'inname', _('Factor') + ` ${n+1}`); if (n === 0) o.depends('type', 'IN-NAME'); o.depends(prefix + 'type', 'IN-NAME'); initPayload(o, n, 'factor'); - o.load = L.bind(function(n, key, uciconfig, section_id) { + const inname_old_load = o.load; + o.load = function(section_id) { hm.loadLabel.call(this, [ ['', _('-- Please choose --')], ...hm.loadLabelValues(this.config, 'inbound') ], section_id); - return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayload(n)[key]; - }, o, n, 'factor', uciconfig) + return inname_old_load.apply(this, arguments); + } o = s.option(form.ListValue, prefix + 'rematchname', _('Factor') + ` ${n+1}`); if (n === 0) o.depends('type', 'REMATCH-NAME'); o.depends(prefix + 'type', 'REMATCH-NAME'); initPayload(o, n, 'factor'); - o.load = L.bind(function(n, key, uciconfig, section_id) { + const rematchname_old_load = o.load; + o.load = function(section_id) { hm.loadLabel.call(this, [ ['', _('-- Please choose --')], ...hm.loadLabelValues(this.config, 'rematch-name') ], section_id); - return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayload(n)[key]; - }, o, n, 'factor', uciconfig) + return rematchname_old_load.apply(this, arguments); + } o = s.option(form.Value, prefix + 'uint', _('Factor') + ` ${n+1}`); o.datatype = 'uinteger'; @@ -678,28 +659,20 @@ function renderPayload(s, total, uciconfig) { o.depends('type', 'RULE-SET'); o.depends(prefix + 'type', 'RULE-SET'); initPayload(o, n, 'factor'); - o.load = L.bind(function(n, key, uciconfig, section_id) { + const rule_set_old_load = o.load; + o.load = function(section_id) { hm.loadLabel.call(this, hm.loadLabelValues(this.config, 'ruleset'), section_id); - return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayload(n)[key]; - }, o, n, 'factor', uciconfig) + return rule_set_old_load.apply(this, arguments); + } o = s.option(form.Flag, prefix + 'NOT', _('NOT') + ` ${n+1}`); o.default = o.disabled; o.depends(Object.fromEntries([[prefix + 'type', /.+/]])); - initPayload(o, n, 'deny'); - o.load = L.bind(function(n, key, uciconfig, section_id) { - return boolToFlag(new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayload(n)[key] ? true : false); - }, o, n, 'deny', uciconfig); - o.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'entry'); - - let n = this.option.match(/^payload(\d+)_/)[1]; - let rule = new RulesEntry(UIEl.getValue()).setPayload(n, {deny: flagToBool(value) || null}); - - UIEl.node.previousSibling.innerText = rule.toString('mihomo'); - UIEl.setValue(rule.toString('json')); - } + initPayload(o, n, 'deny', + (n, k, inst) => boolToFlag(inst.getPayload(n)[k] ? true : false), + (n, k, v, inst) => inst.setPayload(n, Object.fromEntries([[k, flagToBool(v) || null]])) + ); } // DynamicList payload @@ -721,23 +694,15 @@ function renderPayload(s, total, uciconfig) { extenbox[n].forEach((type) => { o.depends('type', type); }) - initDynamicPayload(o, n, 'type'); - o.validate = function(section_id, value) { - value = this.formvalue(section_id); - let UIEl = this.section.getUIElement(section_id, 'entry'); - let rule = new RulesEntry(UIEl.getValue()); - - let n = this.option.match(/^payload(\d+)_/)[1]; - value.forEach((val) => { - rule.setPayload(n, {type: val}); n++; - }); - rule.setPayload(n, {type: null}, n); - - UIEl.node.previousSibling.innerText = rule.toString('mihomo'); - UIEl.setValue(rule.toString('json')); - - return true; - } + initDynamicPayload(o, n, 'type', + undefined, + (n, k, v, inst) => { + v.forEach((val) => { + inst.setPayload(n, Object.fromEntries([[k, val]])); n++; + }); + inst.setPayload(n, Object.fromEntries([[k, null]]), n); + } + ); o = s.option(hm.GroupDynamicList, prefix + 'fused', _('Factor') + ' ++', _('Content will not be verified, Please make sure you enter it correctly.')); @@ -745,7 +710,8 @@ function renderPayload(s, total, uciconfig) { o.depends(Object.fromEntries([['type', type], [prefix + 'type', /.+/]])); }) initDynamicPayload(o, n, 'factor'); - o.load = L.bind(function(n, key, uciconfig, section_id) { + const fused_old_load = o.load; + o.load = function(section_id) { hm.loadLabel.call(this, [ ...hm.inbound_type.map(e => [e, _('IN-TYPE')]), // Multi-values are not supported ...hm.loadLabelValues(this.config, 'inbound').map(e => [e, _('IN-NAME')]), @@ -755,8 +721,8 @@ function renderPayload(s, total, uciconfig) { ...hm.loadLabelValues(this.config, 'ruleset').map(e => [e, _('RULE-SET')]) ], section_id); - return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayloads().slice(n).map(e => e[key] ?? ''); - }, o, n, 'factor', uciconfig) + return fused_old_load.apply(this, arguments); + } o = s.option(hm.StaticList, prefix + 'NOTs', _('NOT') + ' ++', _('0 or 1 only.')); @@ -765,27 +731,16 @@ function renderPayload(s, total, uciconfig) { extenbox[n].forEach((type) => { o.depends(Object.fromEntries([['type', type], [prefix + 'type', /.+/]])); }) - initDynamicPayload(o, n, 'deny'); - o.load = L.bind(function(n, key, uciconfig, section_id) { - return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayloads().slice(n).map(e => boolToFlag(e[key] ? true : false)); - }, o, n, 'deny', uciconfig); - o.validate = function(section_id, value) { - value = this.formvalue(section_id); - let UIEl = this.section.getUIElement(section_id, 'entry'); - let rule = new RulesEntry(UIEl.getValue()); - - let n = this.option.match(/^payload(\d+)_/)[1]; - let limit = rule.getPayloads().length; - value.forEach((value) => { - rule.setPayload(n, {deny: flagToBool(value) || null}); n++; - }); - rule.setPayload(limit, {deny: null}, limit); - - UIEl.node.previousSibling.innerText = rule.toString('mihomo'); - UIEl.setValue(rule.toString('json')); - - return true; - } + initDynamicPayload(o, n, 'deny', + (n, k, inst) => inst.getPayloads().slice(n).map(e => boolToFlag(e[k] ? true : false)), + (n, k, v, inst) => { + const limit = inst.getPayloads().length; + v.forEach((val) => { + inst.setPayload(n, Object.fromEntries([[k, flagToBool(val) || null]])); n++; + }); + inst.setPayload(limit, Object.fromEntries([[k, null]]), limit); + } + ); }) } @@ -801,94 +756,90 @@ function renderRules(s, uciconfig) { return El; } o.load = function(section_id) { - return form.DummyValue.prototype.load.call(this, section_id) || new RulesEntry().toString('json'); + const value = this.super('load', section_id); + + this[`${this.option}_${section_id}`] = new RulesEntry(value); + + return value; + } + o.instget = function(section_id) {return this[`${this.option}_${section_id}`]} + o.instset = function(section_id, callback = inst => inst) { + const UIEl = this.getUIElement(section_id); + + const inst = this[`${this.option}_${section_id}`]; + callback(inst); + + UIEl.node.previousSibling.innerText = inst.toString('mihomo'); + UIEl.setValue(inst.toString('json')); } o.write = form.AbstractValue.prototype.write; o.remove = form.AbstractValue.prototype.remove; o.editable = true; + // common part + const initEntryOption = function(o, key, + load_callback = (k, inst) => inst[k], + onchange_callback = (k, v, inst) => inst.setKey(k, v) + ) { + o.load = function(section_id) { + return load_callback(key, this.section.getOption('entry').instget(section_id)); + } + o.onchange = function(ev, section_id, value) { + this.section.getOption('entry').instset(section_id, L.bind(onchange_callback, this, key, value)); + } + o.write = function() {}; + } + o = s.option(hm.GroupListValue, 'type', _('Type')); o.default = hm.rules_type[0].types[0][0]; for (const {label, types} of hm.rules_type.concat(hm.rules_logical_type)) { types.forEach((res) => o.value.call(o, res, label)); } - o.load = function(section_id) { - return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).type; - } + initEntryOption(o, 'type'); o.validate = function(section_id, value) { // params only available for types other than - if (hm.rules_type_allowparms.includes(value)) { - ['no-resolve', 'src'].forEach((opt) => { - let UIEl = this.section.getUIElement(section_id, opt); + const params = ['no-resolve', 'src']; + for (let param of params) { + let UIEl = this.section.getUIElement(section_id, param); + + if (hm.rules_type_allowparms.includes(value)) UIEl.node.querySelector('input').removeAttribute('disabled'); - }); - } else { - ['no-resolve', 'src'].forEach((opt) => { - let UIEl = this.section.getUIElement(section_id, opt); + else { UIEl.setValue(''); UIEl.node.querySelector('input').disabled = true; - }); - let UIEl = this.section.getUIElement(section_id, 'entry'); - - let rule = new RulesEntry(UIEl.getValue()).setParam('no-resolve').setParam('src'); - - UIEl.node.previousSibling.innerText = rule.toString('mihomo'); - UIEl.setValue(rule.toString('json')); + this.section.getOption('entry').instset(section_id, inst => params.forEach(param => inst.setParam(param))); + } } return true; } - o.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'entry'); - - let rule = new RulesEntry(UIEl.getValue()).setKey('type', value); - - UIEl.node.previousSibling.innerText = rule.toString('mihomo'); - UIEl.setValue(rule.toString('json')); - } - o.write = function() {}; o.rmempty = false; o.modalonly = true; renderPayload(s, Math.max(...Object.values(hm.rules_logical_payload_count).map(e => e.low)), uciconfig); o = s.option(hm.ListValue, 'detour', _('Proxy group')); + initEntryOption(o, 'detour'); + const detour_old_load = o.load; o.load = function(section_id) { hm.loadLabel.call(this, [ ...hm.preset_outbound.full, ...hm.loadLabelValues(this.config, 'proxy_group') ], section_id); - return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).detour; + return detour_old_load.apply(this, arguments); } - o.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'entry'); - - let rule = new RulesEntry(UIEl.getValue()).setKey('detour', value); - - UIEl.node.previousSibling.innerText = rule.toString('mihomo'); - UIEl.setValue(rule.toString('json')); - } - o.write = function() {}; //o.depends('SUB-RULE', ''); // work on subrules not rules o.editable = true; o = s.option(form.Flag, 'src', _('src'), _('Treat the destination IP as the source IP.')); o.default = o.disabled; - o.load = function(section_id) { - return boolToFlag(new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getParam('src') ? true : false); - } - o.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'entry'); - - let rule = new RulesEntry(UIEl.getValue()).setParam('src', flagToBool(value) || null); - - UIEl.node.previousSibling.innerText = rule.toString('mihomo'); - UIEl.setValue(rule.toString('json')); - } - o.write = function() {}; + initEntryOption(o, 'src', + (k, inst) => boolToFlag(inst.getParam(k) ? true : false), + (k, v, inst) => inst.setParam(k, flagToBool(v) || null) + ); o.depends('SUB-RULE', ''); o.modalonly = true; @@ -896,18 +847,10 @@ function renderRules(s, uciconfig) { _('Do not resolve the domain connection to IP for this match.
' + 'Only works for pure domain inbound connections without DNS resolution. e.g., socks5h')); o.default = o.disabled; - o.load = function(section_id) { - return boolToFlag(new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getParam('no-resolve') ? true : false); - } - o.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'entry'); - - let rule = new RulesEntry(UIEl.getValue()).setParam('no-resolve', flagToBool(value) || null); - - UIEl.node.previousSibling.innerText = rule.toString('mihomo'); - UIEl.setValue(rule.toString('json')); - } - o.write = function() {}; + initEntryOption(o, 'no-resolve', + (k, inst) => boolToFlag(inst.getParam(k) ? true : false), + (k, v, inst) => inst.setParam(k, flagToBool(v) || null) + ); o.depends('SUB-RULE', ''); o.modalonly = true; } @@ -1421,7 +1364,10 @@ return view.extend({ ...hm.loadLabelValues(this.config, 'subrule-group') ], section_id); - return new RulesEntry(uci.get(data[0], section_id, 'entry')).subrule || ''; + return this.section.getOption('entry').instget(section_id).subrule || ''; + } + so.onchange = function(ev, section_id, value) { + this.section.getOption('entry').instset(section_id, inst => inst.setKey('subrule', value)); } so.validate = function(section_id, value) { let UIEl = this.section.getUIElement(section_id, 'detour'); @@ -1431,14 +1377,6 @@ return view.extend({ return true; } - so.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'entry'); - - let rule = new RulesEntry(UIEl.getValue()).setKey('subrule', value); - - UIEl.node.previousSibling.innerText = rule.toString('mihomo'); - UIEl.setValue(rule.toString('json')); - } so.write = function() {}; so.modalonly = true; /* Routing rules END */ @@ -1642,85 +1580,84 @@ return view.extend({ so.editable = true; so = ss.option(form.DummyValue, 'address', _('Address')); + so.load = function(section_id) { + const value = this.super('load', section_id); + + this[`${this.option}_${section_id}`] = new DNSAddress(value); + + return value; + } + so.instget = function(section_id) {return this[`${this.option}_${section_id}`]} + so.instset = function(section_id, callback = inst => inst) { + const UIEl = this.getUIElement(section_id); + + const inst = this[`${this.option}_${section_id}`]; + callback(inst); + + UIEl.node.previousSibling.innerText = inst.toString(); + UIEl.setValue(inst.toString()); + } so.write = form.AbstractValue.prototype.write; so.remove = form.AbstractValue.prototype.remove; so.editable = true; - so = ss.option(form.Value, 'addr', _('Address')); - so.load = function(section_id) { - return new DNSAddress(uci.get(data[0], section_id, 'address')).addr; + // common part + const initAddressOption = function(o, key, + load_callback = (k, inst) => boolToFlag(inst.parseParam(k) ? true : false), + onchange_callback = (k, v, inst) => inst.setParam(k, flagToBool(v) || null) + ) { + o.load = function(section_id) { + return load_callback(key, this.section.getOption('address').instget(section_id)); + } + o.onchange = function(ev, section_id, value) { + this.section.getOption('address').instset(section_id, L.bind(onchange_callback, this, key, value)); + } + o.write = function() {}; } + + so = ss.option(form.Value, 'addr', _('Address')); + initAddressOption(so, 'addr', + (k, inst) => inst[k], + (k, v, inst) => inst[k] = v + ); so.validate = function(section_id, value) { if (value.match('#')) return _('Expecting: %s').format(_('No add\'l params')); - // params only available on DoH - // https://github.com/muink/mihomo/blob/43f21c0b412b7a8701fe7a2ea6510c5b985a53d6/config/config.go#L1211C8-L1211C14 - if (value.match(/^https?:\/\//)){ - this.section.getUIElement(section_id, 'h3').node.querySelector('input').removeAttribute('disabled'); - } else { - let UIEl = this.section.getUIElement(section_id, 'address'); + let UIEl = this.section.getUIElement(section_id, 'h3'); + if (value.match(/^https?:\/\//)) + UIEl.node.querySelector('input').removeAttribute('disabled'); + else { + this.section.getOption('address').instset(section_id, inst => inst.setParam('h3')); - let newvalue = new DNSAddress(UIEl.getValue()).setParam('h3').toString(); - - UIEl.node.previousSibling.innerText = newvalue; - UIEl.setValue(newvalue); - - ['h3'].forEach((opt) => { - let UIEl = this.section.getUIElement(section_id, opt); - UIEl.setValue(''); - UIEl.node.querySelector('input').disabled = true; - }); + UIEl.setValue(''); + UIEl.node.querySelector('input').disabled = true; } return true; } - so.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'address'); - - let newvalue = ('N' + UIEl.getValue()).replace(/^[^#]+/, value); - - UIEl.node.previousSibling.innerText = newvalue; - UIEl.setValue(newvalue); - } - so.write = function() {}; so.rmempty = false; so.modalonly = true; so = ss.option(hm.ListValue, 'detour', _('Proxy group')); + initAddressOption(so, 'detour', + (k, inst) => inst.parseParam(k), + (k, v, inst) => inst.setParam(k, v) + ); + const detour_old_load = so.load; so.load = function(section_id) { hm.loadLabel.call(this, [ ...hm.preset_outbound.dns, ...hm.loadLabelValues(this.config, 'proxy_group') ], section_id); - return new DNSAddress(uci.get(data[0], section_id, 'address')).parseParam('detour'); + return detour_old_load.apply(this, arguments); } - so.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'address'); - - let newvalue = new DNSAddress(UIEl.getValue()).setParam('detour', value).toString(); - - UIEl.node.previousSibling.innerText = newvalue; - UIEl.setValue(newvalue); - } - so.write = function() {}; so.editable = true; so = ss.option(form.Flag, 'h3', _('HTTP/3')); so.default = so.disabled; - so.load = function(section_id) { - return boolToFlag(new DNSAddress(uci.get(data[0], section_id, 'address')).parseParam('h3') ? true : false); - } - so.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'address'); - - let newvalue = new DNSAddress(UIEl.getValue()).setParam('h3', flagToBool(value) || null).toString(); - - UIEl.node.previousSibling.innerText = newvalue; - UIEl.setValue(newvalue); - } - so.write = function() {}; + initAddressOption(so, 'h3'); so.modalonly = true; so = ss.option(form.Flag, 'skip-cert-verify', _('Skip cert verify'), @@ -1728,101 +1665,42 @@ return view.extend({ '
' + _('This is DANGEROUS, your traffic is almost like PLAIN TEXT! Use at your own risk!')); so.default = so.disabled; - so.load = function(section_id) { - return boolToFlag(new DNSAddress(uci.get(data[0], section_id, 'address')).parseParam('skip-cert-verify') ? true : false); - } - so.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'address'); - - let newvalue = new DNSAddress(UIEl.getValue()).setParam('skip-cert-verify', flagToBool(value) || null).toString(); - - UIEl.node.previousSibling.innerText = newvalue; - UIEl.setValue(newvalue); - } - so.write = function() {}; + initAddressOption(so, 'skip-cert-verify'); so.modalonly = true; so = ss.option(form.Value, 'ecs', _('EDNS Client Subnet')); so.datatype = 'cidr'; - so.load = function(section_id) { - return new DNSAddress(uci.get(data[0], section_id, 'address')).parseParam('ecs'); - } - so.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'address'); - - let newvalue = new DNSAddress(UIEl.getValue()).setParam('ecs', value).toString(); - - UIEl.node.previousSibling.innerText = newvalue; - UIEl.setValue(newvalue); - } - so.write = function() {}; + initAddressOption(so, 'ecs', + (k, inst) => inst.parseParam(k), + (k, v, inst) => inst.setParam(k, v) + ); so.modalonly = true; so = ss.option(form.Flag, 'ecs-override', _('ECS override'), _('Override the existing ECS in original request.')); so.default = so.disabled; - so.load = function(section_id) { - return boolToFlag(new DNSAddress(uci.get(data[0], section_id, 'address')).parseParam('ecs-override') ? true : false); - } - so.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'address'); - - let newvalue = new DNSAddress(UIEl.getValue()).setParam('ecs-override', flagToBool(value) || null).toString(); - - UIEl.node.previousSibling.innerText = newvalue; - UIEl.setValue(newvalue); - } - so.write = function() {}; + initAddressOption(so, 'ecs-override'); so.depends({'ecs': /.+/}); so.modalonly = true; so = ss.option(form.Flag, 'disable-ipv4', _('Filter record: %s').format('A')); so.default = so.disabled; - so.load = function(section_id) { - return boolToFlag(new DNSAddress(uci.get(data[0], section_id, 'address')).parseParam('disable-ipv4') ? true : false); - } - so.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'address'); - - let newvalue = new DNSAddress(UIEl.getValue()).setParam('disable-ipv4', flagToBool(value) || null).toString(); - - UIEl.node.previousSibling.innerText = newvalue; - UIEl.setValue(newvalue); - } + initAddressOption(so, 'disable-ipv4'); so.write = function() {}; so.modalonly = true; so = ss.option(form.Flag, 'disable-ipv6', _('Filter record: %s').format('AAAA')); so.default = so.disabled; - so.load = function(section_id) { - return boolToFlag(new DNSAddress(uci.get(data[0], section_id, 'address')).parseParam('disable-ipv6') ? true : false); - } - so.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'address'); - - let newvalue = new DNSAddress(UIEl.getValue()).setParam('disable-ipv6', flagToBool(value) || null).toString(); - - UIEl.node.previousSibling.innerText = newvalue; - UIEl.setValue(newvalue); - } - so.write = function() {}; + initAddressOption(so, 'disable-ipv6'); so.modalonly = true; so = ss.option(form.DynamicList, 'disable-qtypes', _('Filter record type:')); so.datatype = 'uinteger'; so.placeholder = '65'; - so.load = function(section_id) { - return new DNSAddress(uci.get(data[0], section_id, 'address')).parseParam('disable-qtypes'); - } - so.onchange = function(ev, section_id, value) { - let UIEl = this.section.getUIElement(section_id, 'address'); - - let newvalue = new DNSAddress(UIEl.getValue()).setParam('disable-qtypes', value).toString(); - - UIEl.node.previousSibling.innerText = newvalue; - UIEl.setValue(newvalue); - } - so.write = function() {}; + initAddressOption(so, 'disable-qtypes', + (k, inst) => inst.parseParam(k), + (k, v, inst) => inst.setParam(k, v) + ); so.modalonly = true; /* DNS server END */ diff --git a/luci-app-flowproxy/Makefile b/luci-app-flowproxy/Makefile index 424633c55..eb3eb7558 100644 --- a/luci-app-flowproxy/Makefile +++ b/luci-app-flowproxy/Makefile @@ -2,10 +2,10 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-flowproxy PKG_VERSION:=1.0.3 -PKG_RELEASE:=6 +PKG_RELEASE:=7 LUCI_TITLE:=LuCI Support for FlowProxy Traffic Diversion -LUCI_DEPENDS:=+luci-base +nftables +ip-full +LUCI_DEPENDS:=+luci-base +nftables +ip-full +iputils-arping LUCI_PKGARCH:=all define Package/$(PKG_NAME)/conffiles diff --git a/luci-app-flowproxy/htdocs/luci-static/resources/view/flowproxy/flowproxy.js b/luci-app-flowproxy/htdocs/luci-static/resources/view/flowproxy/flowproxy.js index 72dfb5687..201c8aff4 100644 --- a/luci-app-flowproxy/htdocs/luci-static/resources/view/flowproxy/flowproxy.js +++ b/luci-app-flowproxy/htdocs/luci-static/resources/view/flowproxy/flowproxy.js @@ -75,12 +75,21 @@ return L.view.extend({ return callGetStatus().then(L.bind(function(status) { if (!status) return; var isRunning = (status.running == 1); + var isDegraded = (status.degraded == 1); var container = node || document; var statusEl = container.querySelector('#service-status'); if (statusEl) { var content = []; - if (isRunning) { + if (isRunning && isDegraded) { + content.push(E('span', { 'style': 'color: #FF9800; font-weight: bold;' }, [ _('degraded (direct fallback)') ])); + content.push(' '); + content.push(E('button', { + 'class': 'btn cbi-button cbi-button-apply', + 'style': 'margin-left: 10px;', + 'click': ui.createHandlerFn(this, 'handleRestart') + }, [ _('Restart') ])); + } else if (isRunning) { var chains = []; if (status.nft && status.nft.tcp) chains.push('TCP'); if (status.nft && status.nft.udp) chains.push('UDP'); @@ -187,6 +196,9 @@ return L.view.extend({ s.taboption('settings', form.Flag, 'enabled', _('Enable FlowProxy')).rmempty = false; s.taboption('settings', form.Flag, 'dns_proxy_enabled', _('Force upstream DNS to proxy server')).rmempty = false; + o = s.taboption('settings', form.Flag, 'monitor_enabled', _('Enable proxy server monitoring')); + o.default = '0'; + o.rmempty = false; o = s.taboption('settings', form.Value, 'proxy_server_ip_addr', _('Proxy server IP address')); o.datatype = 'ip4addr'; o.rmempty = true; diff --git a/luci-app-flowproxy/po/templates/flowproxy.pot b/luci-app-flowproxy/po/templates/flowproxy.pot index 0734ed227..0ba959bb8 100644 --- a/luci-app-flowproxy/po/templates/flowproxy.pot +++ b/luci-app-flowproxy/po/templates/flowproxy.pot @@ -226,3 +226,9 @@ msgstr "" msgid "this will delete ALL current %s rules and generate default templates. are you sure?" msgstr "" +msgid "Enable proxy server monitoring" +msgstr "" + +msgid "degraded (direct fallback)" +msgstr "" + diff --git a/luci-app-flowproxy/po/zh_Hans/flowproxy.po b/luci-app-flowproxy/po/zh_Hans/flowproxy.po index 1faa8dfff..1a57368c6 100644 --- a/luci-app-flowproxy/po/zh_Hans/flowproxy.po +++ b/luci-app-flowproxy/po/zh_Hans/flowproxy.po @@ -250,3 +250,9 @@ msgstr "RPC 错误: %s" msgid "The proxy server IP address must be within the subnet of the selected interface (%s)." msgstr "代理服务器 IP 地址必须在所选网络接口的子网网段之内 (%s)。" +msgid "Enable proxy server monitoring" +msgstr "启用代理服务器监控" + +msgid "degraded (direct fallback)" +msgstr "已降级 (回退直连状态)" + diff --git a/luci-app-flowproxy/root/etc/config/flowproxy b/luci-app-flowproxy/root/etc/config/flowproxy index 8b3c0c6d2..b2af3b5fb 100644 --- a/luci-app-flowproxy/root/etc/config/flowproxy +++ b/luci-app-flowproxy/root/etc/config/flowproxy @@ -8,6 +8,7 @@ config flowproxy 'global' option routing_table '888' option rule_priority '1000' option dns_proxy_enabled '0' + option monitor_enabled '0' option proxy_server_dns_port '5353' option log_level 'info' option log_size '1024' diff --git a/luci-app-flowproxy/root/etc/init.d/flowproxy b/luci-app-flowproxy/root/etc/init.d/flowproxy index d628633ed..0e780f639 100755 --- a/luci-app-flowproxy/root/etc/init.d/flowproxy +++ b/luci-app-flowproxy/root/etc/init.d/flowproxy @@ -5,299 +5,86 @@ START=99 STOP=10 USE_PROCD=1 -NAME="flowproxy" -UCI_CONFIG="flowproxy" -LOG_FILE="/var/log/flowproxy.log" -NFT_CONF="/tmp/flowproxy/nft.conf" -GENERATE_SCRIPT="/usr/share/flowproxy/generate_nft.sh" -STATE_FILE="/var/run/flowproxy.running" +. /usr/share/flowproxy/common.sh -get_level_weight() { - case "$1" in - debug) echo 0 ;; - info) echo 1 ;; - warn) echo 2 ;; - error) echo 3 ;; - *) echo 1 ;; - esac +_stop_unlocked() { + log_msg info "Stopping FlowProxy..." + # 强制先移除标记,防止状态误报及旧守护进程继续动作 + rm -f "$STATE_FILE" "$DEGRADED_FILE" "$GEN_FILE" + delete_route + delete_nft + cleanup_dns + rm -f "$NFT_CONF" + log_msg info "FlowProxy service stopped" } -log_msg() { - local level="$1"; shift - local msg="$*" - local timestamp=$(date '+%Y-%m-%d %H:%M:%S') - - # 等级过滤 - local conf_level=$(uci -q get "$UCI_CONFIG.global.log_level" || echo "info") - local conf_weight=$(get_level_weight "$conf_level") - local msg_weight=$(get_level_weight "$level") - [ "$msg_weight" -lt "$conf_weight" ] && return +_start_unlocked() { + local enabled=$(uci -q get "$UCI_CONFIG.global.enabled") - # 简单的日志截断逻辑,防止日志无限增长 - # 读取配置的大小限制,默认 1024KB - local max_size=$(uci -q get "$UCI_CONFIG.global.log_size" || echo 1024) - local current_size=$(du -k "$LOG_FILE" 2>/dev/null | cut -f1) - if [ "${current_size:-0}" -gt "$max_size" ]; then - mv "$LOG_FILE" "$LOG_FILE.old" - touch "$LOG_FILE" - fi + if [ "${enabled:-0}" != "1" ]; then + log_msg info "FlowProxy is disabled, ensuring service is stopped" + _stop_unlocked + return 0 + fi - echo "[$timestamp] [$level] $msg" >> "$LOG_FILE" -} + log_msg info "Starting FlowProxy..." -check_env() { - # 检测核心二进制工具是否存在 - if ! command -v nft >/dev/null 2>&1; then - log_msg error "nftables binary not found" - return 1 - fi - return 0 -} + check_env || return 1 + check_config || return 1 + apply_nft_rules || return 1 + add_route || { delete_nft; return 1; } + setup_dns -check_config() { - local proxy_server_ip_addr=$(uci -q get "$UCI_CONFIG.global.proxy_server_ip_addr") - [ -z "$proxy_server_ip_addr" ] && { log_msg error "proxy_server_ip_addr not configured"; return 1; } - return 0 -} + rm -f "$DEGRADED_FILE" + touch "$STATE_FILE" -apply_nft_rules() { - log_msg info "Generating nftables configuration..." - local conf_level=$(uci -q get "$UCI_CONFIG.global.log_level" || echo "info") + local gen="$(date +%s)-$$" + echo "$gen" > "$GEN_FILE" - mkdir -p "$(dirname "$NFT_CONF")" - if [ -x "$GENERATE_SCRIPT" ]; then - # 传递日志等级并捕获 stderr 到临时文件 - local err_file="/tmp/flowproxy/gen_err.tmp" - FLOWPROXY_LOG_LEVEL="$conf_level" "$GENERATE_SCRIPT" >/dev/null 2> "$err_file" - local ret=$? - - # 将脚本的输出记录到日志 - if [ -s "$err_file" ]; then - while read -r line; do - log_msg debug "Script: $line" - done < "$err_file" - rm -f "$err_file" - fi + local monitor_enabled=$(uci -q get "$UCI_CONFIG.global.monitor_enabled" || echo 0) + if [ "$monitor_enabled" = "1" ]; then + procd_open_instance "watchdog" + procd_set_param command /usr/share/flowproxy/watchdog.sh "$gen" + procd_set_param respawn 3600 5 5 + procd_close_instance + fi - if [ $ret -eq 0 ]; then - log_msg info "Applying nftables rules from $NFT_CONF" - # 确保内核支持 inet 表 - nft delete table inet flowproxy 2>/dev/null - if nft -f "$NFT_CONF"; then - return 0 - else - log_msg error "nftables rules application failed (syntax error)" - return 1 - fi - else - log_msg error "Failed to generate nftables config" - return 1 - fi - else - log_msg error "Generator script $GENERATE_SCRIPT not found or not executable" - return 1 - fi -} - -add_route() { - local proxy_server_ip_addr=$(uci -q get "$UCI_CONFIG.global.proxy_server_ip_addr") - local interface=$(uci -q get "$UCI_CONFIG.global.interface" || echo "br-lan") - local traffic_mark=$(uci -q get "$UCI_CONFIG.global.traffic_mark" || echo "0x666") - local routing_table=$(uci -q get "$UCI_CONFIG.global.routing_table" || echo "888") - local rule_priority=$(uci -q get "$UCI_CONFIG.global.rule_priority" || echo "1000") - - # 1. 先尝试用旧记录清理一次,防止由于配置变更导致的残留 - delete_route "quiet" - - log_msg info "Setting up routing table $routing_table and rule for mark $traffic_mark with priority $rule_priority..." - - # 2. 记录当前使用的标记值、路由表 ID 和优先级 - echo "$traffic_mark:$routing_table:$rule_priority" > "/var/run/flowproxy.mark" - - # 3. 再次确保新标记和表的规则是干净的 - while ip rule del fwmark "$traffic_mark" lookup "$routing_table" 2>/dev/null; do :; done - ip route flush table "$routing_table" 2>/dev/null - - # 4. 添加路由和策略 - local err - ip route add default via "$proxy_server_ip_addr" dev "$interface" table "$routing_table" 2>/dev/null - err=$(ip rule add fwmark "$traffic_mark" lookup "$routing_table" priority "$rule_priority" 2>&1) - if [ $? -eq 0 ]; then - log_msg info "Route added: via $proxy_server_ip_addr dev $interface table $routing_table for mark $traffic_mark with priority $rule_priority" - else - log_msg error "Failed to add ip rule: $err" - fi -} - -delete_route() { - local traffic_mark routing_table rule_priority - local quiet="$1" - - # 1. 获取两组清理目标:旧值(记录文件) 和 新值(当前UCI) - local old_mark="" old_table="" old_prio="" - if [ -f "/var/run/flowproxy.mark" ]; then - local saved_val=$(cat "/var/run/flowproxy.mark") - old_mark=$(echo "$saved_val" | cut -d':' -f1) - old_table=$(echo "$saved_val" | cut -d':' -f2) - old_prio=$(echo "$saved_val" | cut -d':' -f3) - [ "$quiet" != "quiet" ] && rm -f "/var/run/flowproxy.mark" - fi - - local curr_mark=$(uci -q get "$UCI_CONFIG.global.traffic_mark" || echo "0x666") - local curr_table=$(uci -q get "$UCI_CONFIG.global.routing_table" || echo "888") - local curr_prio=$(uci -q get "$UCI_CONFIG.global.rule_priority" || echo "1000") - - [ "$quiet" != "quiet" ] && log_msg info "Cleaning up FlowProxy routes (Atomic Mode)..." - - # 2. 核心清理函数:只清理带 fwmark 且指向特定 table 的规则 - safe_del_rule() { - local m="$1" t="$2" p="$3" - [ -z "$m" ] || [ -z "$t" ] && return - log_msg debug "Attempting cleanup: mark=$m, table=$t, priority=${p:-any}" - # 精准清理 (带优先级) - [ -n "$p" ] && while ip rule del fwmark "$m" lookup "$t" priority "$p" 2>/dev/null; do - log_msg debug "Removed stale ip rule: mark $m lookup $t priority $p" - done - # 模糊清理 (不带优先级,防止配置中途被手动改动) - while ip rule del fwmark "$m" lookup "$t" 2>/dev/null; do - log_msg debug "Removed stale ip rule (fuzzy): mark $m lookup $t" - done - # 清空路由表 - ip route flush table "$t" 2>/dev/null - log_msg debug "Flushed routing table $t" - } - - # 执行清理:先清旧值,再清当前值 (防止残留) - safe_del_rule "$old_mark" "$old_table" "$old_prio" - [ "$old_mark" != "$curr_mark" ] || [ "$old_table" != "$curr_table" ] && \ - safe_del_rule "$curr_mark" "$curr_table" "$curr_prio" -} - -delete_nft() { - nft delete table inet flowproxy 2>/dev/null - log_msg info "Removed nftables table 'flowproxy'" -} - -setup_dns() { - local enabled=$(uci -q get "$UCI_CONFIG.global.enabled" || echo 0) - local dns_proxy_enabled=$(uci -q get "$UCI_CONFIG.global.dns_proxy_enabled" || echo 0) - local proxy_server_dns_port=$(uci -q get "$UCI_CONFIG.global.proxy_server_dns_port" || echo 5353) - local proxy_server_ip_addr=$(uci -q get "$UCI_CONFIG.global.proxy_server_ip_addr") - - # Only apply DNS proxy if BOTH main service and DNS proxy are enabled - if [ "$enabled" -eq 0 ] || [ "$dns_proxy_enabled" -eq 0 ]; then - cleanup_dns - return 0 - fi - - [ -z "$proxy_server_ip_addr" ] && { log_msg error "proxy_server_ip_addr not configured, cannot setup DNS"; return 1; } - - log_msg info "Setting up DNS redirection to $proxy_server_ip_addr#$proxy_server_dns_port..." - - # Persistent backup in UCI - if ! uci -q get "$UCI_CONFIG.dns_backup" >/dev/null; then - local old_noresolv=$(uci -q get dhcp.@dnsmasq[0].noresolv) - local old_dns_redirect=$(uci -q get dhcp.@dnsmasq[0].dns_redirect) - local old_servers=$(uci -q get dhcp.@dnsmasq[0].server | tr '\n' ',' | sed 's/,$//') - - log_msg debug "Backing up DNS: noresolv=${old_noresolv:-empty}, redirect=${old_dns_redirect:-empty}, servers=${old_servers:-empty}" - - uci set "$UCI_CONFIG.dns_backup=dns_backup" - [ -n "$old_noresolv" ] && uci set "$UCI_CONFIG.dns_backup.noresolv=$old_noresolv" - [ -n "$old_dns_redirect" ] && uci set "$UCI_CONFIG.dns_backup.dns_redirect=$old_dns_redirect" - [ -n "$old_servers" ] && uci set "$UCI_CONFIG.dns_backup.servers=$old_servers" - uci commit "$UCI_CONFIG" - fi - - log_msg debug "Applying new DNS: noresolv=1, redirect=0, server=$proxy_server_ip_addr#$proxy_server_dns_port" - uci set dhcp.@dnsmasq[0].noresolv='1' - uci set dhcp.@dnsmasq[0].dns_redirect='0' - - # Delete current servers and add our proxy - uci -q delete dhcp.@dnsmasq[0].server - uci add_list dhcp.@dnsmasq[0].server="$proxy_server_ip_addr#$proxy_server_dns_port" - - uci commit dhcp - /etc/init.d/dnsmasq restart -} - -cleanup_dns() { - if uci -q get "$UCI_CONFIG.dns_backup" >/dev/null; then - log_msg info "Restoring original DNS configuration..." - - local noresolv=$(uci -q get "$UCI_CONFIG.dns_backup.noresolv") - local dns_redirect=$(uci -q get "$UCI_CONFIG.dns_backup.dns_redirect") - local servers=$(uci -q get "$UCI_CONFIG.dns_backup.servers") - - log_msg debug "Restoring DNS values: noresolv=${noresolv:-0}, redirect=${dns_redirect:-1}, servers=${servers:-empty}" - - # Restore noresolv (default to 0 if not backed up) - [ -n "$noresolv" ] && uci set dhcp.@dnsmasq[0].noresolv="$noresolv" || uci set dhcp.@dnsmasq[0].noresolv="0" - - # Restore dns_redirect (only restore if it originally existed, avoid polluting config) - if [ -n "$dns_redirect" ]; then - uci set dhcp.@dnsmasq[0].dns_redirect="$dns_redirect" - else - uci -q delete dhcp.@dnsmasq[0].dns_redirect - fi - - # Restore servers correctly splitting comma-separated list - uci -q delete dhcp.@dnsmasq[0].server - if [ -n "$servers" ]; then - for s in $(echo "$servers" | tr ',' ' '); do - [ -n "$s" ] && uci add_list dhcp.@dnsmasq[0].server="$s" - done - fi - - uci commit dhcp - uci delete "$UCI_CONFIG.dns_backup" - uci commit "$UCI_CONFIG" - /etc/init.d/dnsmasq restart - fi + log_msg info "FlowProxy service started successfully" + return 0 } start_service() { - local enabled=$(uci -q get "$UCI_CONFIG.global.enabled" || echo 0) - - if [ "$enabled" -eq 0 ]; then - log_msg info "FlowProxy is disabled, ensuring service is stopped" - stop_service - return 0 - fi - - log_msg info "Starting FlowProxy..." - - check_env || return 1 - check_config || return 1 - apply_nft_rules || return 1 - add_route - setup_dns - - touch "$STATE_FILE" - log_msg info "FlowProxy service started successfully" + acquire_lock + _start_unlocked + local ret=$? + release_lock + return $ret } + stop_service() { - log_msg info "Stopping FlowProxy..." - # 强制先移除标记,防止状态误报 - rm -f "$STATE_FILE" - delete_route - delete_nft - cleanup_dns - log_msg info "FlowProxy service stopped" + acquire_lock + _stop_unlocked + local ret=$? + release_lock + return $ret } restart_service() { - stop_service - start_service + acquire_lock + _stop_unlocked + _start_unlocked + local ret=$? + release_lock + return $ret } reload_service() { - restart_service + restart_service } service_triggers() { - # 监听自身配置改动 - procd_add_reload_trigger "$UCI_CONFIG" - # 监听防火墙重载事件,防止规则被 fw4 清空后无法自动恢复 - procd_add_reload_trigger "firewall" + # 监听自身配置改动 + procd_add_reload_trigger "$UCI_CONFIG" + # 监听防火墙重载事件,防止规则被 fw4 清空后无法自动恢复 + procd_add_reload_trigger "firewall" } diff --git a/luci-app-flowproxy/root/usr/share/flowproxy/common.sh b/luci-app-flowproxy/root/usr/share/flowproxy/common.sh new file mode 100755 index 000000000..300e55bc7 --- /dev/null +++ b/luci-app-flowproxy/root/usr/share/flowproxy/common.sh @@ -0,0 +1,328 @@ +#!/bin/sh +# FlowProxy shared runtime helpers + +UCI_CONFIG="flowproxy" +LOG_FILE="/var/log/flowproxy.log" +NFT_CONF="/tmp/flowproxy/nft.conf" +GENERATE_SCRIPT="/usr/share/flowproxy/generate_nft.sh" +STATE_FILE="/var/run/flowproxy.running" +DEGRADED_FILE="/var/run/flowproxy.degraded" +GEN_FILE="/var/run/flowproxy.gen" +MARK_FILE="/var/run/flowproxy.mark" +LOCK_FILE="/var/lock/flowproxy.lock" + +get_level_weight() { + case "$1" in + debug) echo 0 ;; + info) echo 1 ;; + warn) echo 2 ;; + error) echo 3 ;; + *) echo 1 ;; + esac +} + +log_msg() { + local level="$1"; shift + local msg="$*" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + + # 等级过滤 + local conf_level=$(uci -q get "$UCI_CONFIG.global.log_level") + conf_level="${conf_level:-info}" + local conf_weight=$(get_level_weight "$conf_level") + local msg_weight=$(get_level_weight "$level") + [ "$msg_weight" -lt "$conf_weight" ] && return + + # 简单的日志截断逻辑,防止日志无限增长 + # 读取配置的大小限制,默认 1024KB + local max_size=$(uci -q get "$UCI_CONFIG.global.log_size") + case "$max_size" in + ''|*[!0-9]*) max_size=1024 ;; + esac + local current_size=$(du -k "$LOG_FILE" 2>/dev/null | cut -f1) + if [ "${current_size:-0}" -gt "$max_size" ]; then + mv "$LOG_FILE" "$LOG_FILE.old" + touch "$LOG_FILE" + fi + + echo "[$timestamp] [$level] $msg" >> "$LOG_FILE" +} + +acquire_lock() { + [ "${FLOWPROXY_LOCKED:-0}" = "1" ] && return 0 + mkdir -p "$(dirname "$LOCK_FILE")" + if command -v flock >/dev/null 2>&1; then + exec 9>"$LOCK_FILE" + flock -x 9 + else + local wait_cnt=0 + while ! mkdir "${LOCK_FILE}.d" 2>/dev/null; do + wait_cnt=$((wait_cnt + 1)) + [ "$wait_cnt" -ge 50 ] && break + sleep 1 + done + fi + FLOWPROXY_LOCKED=1 + return 0 +} + +release_lock() { + [ "${FLOWPROXY_LOCKED:-0}" != "1" ] && return 0 + if command -v flock >/dev/null 2>&1; then + flock -u 9 2>/dev/null + exec 9>&- + else + rmdir "${LOCK_FILE}.d" 2>/dev/null + fi + FLOWPROXY_LOCKED=0 + return 0 +} + +check_env() { + # 检测核心二进制工具是否存在 + if ! command -v nft >/dev/null 2>&1; then + log_msg error "nftables binary not found" + return 1 + fi + return 0 +} + +check_config() { + local proxy_server_ip_addr=$(uci -q get "$UCI_CONFIG.global.proxy_server_ip_addr") + [ -z "$proxy_server_ip_addr" ] && { log_msg error "proxy_server_ip_addr not configured"; return 1; } + return 0 +} + +apply_nft_rules() { + log_msg info "Generating nftables configuration..." + local conf_level=$(uci -q get "$UCI_CONFIG.global.log_level" || echo "info") + + mkdir -p "$(dirname "$NFT_CONF")" + if [ -x "$GENERATE_SCRIPT" ]; then + # 传递日志等级并捕获 stderr 到临时文件 + local err_file="/tmp/flowproxy/gen_err.tmp" + FLOWPROXY_LOG_LEVEL="$conf_level" "$GENERATE_SCRIPT" >/dev/null 2> "$err_file" + local ret=$? + + # 将脚本的输出记录到日志 + if [ -s "$err_file" ]; then + while read -r line; do + log_msg debug "Script: $line" + done < "$err_file" + fi + rm -f "$err_file" + + if [ $ret -eq 0 ]; then + log_msg info "Applying nftables rules from $NFT_CONF" + # 确保内核支持 inet 表 + nft delete table inet flowproxy 2>/dev/null + if nft -f "$NFT_CONF"; then + return 0 + else + log_msg error "nftables rules application failed (syntax error)" + return 1 + fi + else + log_msg error "Failed to generate nftables config" + return 1 + fi + else + log_msg error "Generator script $GENERATE_SCRIPT not found or not executable" + return 1 + fi +} + +restore_nft_rules() { + if [ -s "$NFT_CONF" ]; then + log_msg info "Restoring nftables rules from cached $NFT_CONF" + nft delete table inet flowproxy 2>/dev/null + if nft -f "$NFT_CONF"; then + return 0 + fi + log_msg warn "Cached nftables config failed, regenerating..." + fi + apply_nft_rules +} + +add_route() { + local proxy_server_ip_addr=$(uci -q get "$UCI_CONFIG.global.proxy_server_ip_addr") + local interface=$(uci -q get "$UCI_CONFIG.global.interface"); interface="${interface:-br-lan}" + local traffic_mark=$(uci -q get "$UCI_CONFIG.global.traffic_mark"); traffic_mark="${traffic_mark:-0x666}" + local routing_table=$(uci -q get "$UCI_CONFIG.global.routing_table"); routing_table="${routing_table:-888}" + local rule_priority=$(uci -q get "$UCI_CONFIG.global.rule_priority"); rule_priority="${rule_priority:-1000}" + + # 1. 先尝试用旧记录清理一次,防止由于配置变更导致的残留 + delete_route "quiet" + + log_msg info "Setting up routing table $routing_table and rule for mark $traffic_mark with priority $rule_priority..." + + # 2. 记录当前使用的标记值、路由表 ID 和优先级 + echo "$traffic_mark:$routing_table:$rule_priority" > "$MARK_FILE" + + # 3. 再次确保新标记和表的规则是干净的 + while ip rule del fwmark "$traffic_mark" lookup "$routing_table" 2>/dev/null; do :; done + ip route flush table "$routing_table" 2>/dev/null + + # 4. 添加路由和策略 + local err + if ! err=$(ip route add default via "$proxy_server_ip_addr" dev "$interface" table "$routing_table" 2>&1); then + log_msg error "Failed to add default route: $err" + return 1 + fi + err=$(ip rule add fwmark "$traffic_mark" lookup "$routing_table" priority "$rule_priority" 2>&1) + if [ $? -eq 0 ]; then + log_msg info "Route added: via $proxy_server_ip_addr dev $interface table $routing_table for mark $traffic_mark with priority $rule_priority" + return 0 + else + log_msg error "Failed to add ip rule: $err" + return 1 + fi +} + +delete_route() { + local quiet="$1" + + # 1. 获取两组清理目标:旧值(记录文件) 和 新值(当前UCI) + local old_mark="" old_table="" old_prio="" + if [ -f "$MARK_FILE" ]; then + local saved_val=$(cat "$MARK_FILE") + old_mark=$(echo "$saved_val" | cut -d':' -f1) + old_table=$(echo "$saved_val" | cut -d':' -f2) + old_prio=$(echo "$saved_val" | cut -d':' -f3) + [ "$quiet" != "quiet" ] && rm -f "$MARK_FILE" + fi + + local curr_mark=$(uci -q get "$UCI_CONFIG.global.traffic_mark"); curr_mark="${curr_mark:-0x666}" + local curr_table=$(uci -q get "$UCI_CONFIG.global.routing_table"); curr_table="${curr_table:-888}" + local curr_prio=$(uci -q get "$UCI_CONFIG.global.rule_priority"); curr_prio="${curr_prio:-1000}" + + [ "$quiet" != "quiet" ] && log_msg info "Cleaning up FlowProxy routes (Atomic Mode)..." + + # 2. 核心清理函数:只清理带 fwmark 且指向特定 table 的规则 + safe_del_rule() { + local m="$1" t="$2" p="$3" + [ -z "$m" ] || [ -z "$t" ] && return + log_msg debug "Attempting cleanup: mark=$m, table=$t, priority=${p:-any}" + # 精准清理 (带优先级) + [ -n "$p" ] && while ip rule del fwmark "$m" lookup "$t" priority "$p" 2>/dev/null; do + log_msg debug "Removed stale ip rule: mark $m lookup $t priority $p" + done + # 模糊清理 (不带优先级,防止配置中途被手动改动) + while ip rule del fwmark "$m" lookup "$t" 2>/dev/null; do + log_msg debug "Removed stale ip rule (fuzzy): mark $m lookup $t" + done + # 清空路由表 + ip route flush table "$t" 2>/dev/null + log_msg debug "Flushed routing table $t" + } + + # 执行清理:先清旧值,再清当前值 (防止残留) + safe_del_rule "$old_mark" "$old_table" "$old_prio" + [ "$old_mark" != "$curr_mark" ] || [ "$old_table" != "$curr_table" ] && \ + safe_del_rule "$curr_mark" "$curr_table" "$curr_prio" +} + +delete_nft() { + nft delete table inet flowproxy 2>/dev/null + log_msg info "Removed nftables table 'flowproxy'" +} + +setup_dns() { + local enabled=$(uci -q get "$UCI_CONFIG.global.enabled") + local dns_proxy_enabled=$(uci -q get "$UCI_CONFIG.global.dns_proxy_enabled") + local proxy_server_dns_port=$(uci -q get "$UCI_CONFIG.global.proxy_server_dns_port"); proxy_server_dns_port="${proxy_server_dns_port:-5353}" + local proxy_server_ip_addr=$(uci -q get "$UCI_CONFIG.global.proxy_server_ip_addr") + + # Only apply DNS proxy if BOTH main service and DNS proxy are enabled + if [ "${enabled:-0}" != "1" ] || [ "${dns_proxy_enabled:-0}" != "1" ]; then + cleanup_dns + return 0 + fi + + [ -z "$proxy_server_ip_addr" ] && { log_msg error "proxy_server_ip_addr not configured, cannot setup DNS"; return 1; } + + log_msg info "Setting up DNS redirection to $proxy_server_ip_addr#$proxy_server_dns_port..." + + # Persistent backup in UCI + if ! uci -q get "$UCI_CONFIG.dns_backup" >/dev/null; then + local old_noresolv=$(uci -q get dhcp.@dnsmasq[0].noresolv) + local old_dns_redirect=$(uci -q get dhcp.@dnsmasq[0].dns_redirect) + local old_servers=$(uci -q get dhcp.@dnsmasq[0].server | tr '\n' ',' | sed 's/,$//') + + log_msg debug "Backing up DNS: noresolv=${old_noresolv:-empty}, redirect=${old_dns_redirect:-empty}, servers=${old_servers:-empty}" + + uci set "$UCI_CONFIG.dns_backup=dns_backup" + [ -n "$old_noresolv" ] && uci set "$UCI_CONFIG.dns_backup.noresolv=$old_noresolv" + [ -n "$old_dns_redirect" ] && uci set "$UCI_CONFIG.dns_backup.dns_redirect=$old_dns_redirect" + [ -n "$old_servers" ] && uci set "$UCI_CONFIG.dns_backup.servers=$old_servers" + uci commit "$UCI_CONFIG" + fi + + log_msg debug "Applying new DNS: noresolv=1, redirect=0, server=$proxy_server_ip_addr#$proxy_server_dns_port" + uci set dhcp.@dnsmasq[0].noresolv='1' + uci set dhcp.@dnsmasq[0].dns_redirect='0' + + # Delete current servers and add our proxy + uci -q delete dhcp.@dnsmasq[0].server + uci add_list dhcp.@dnsmasq[0].server="$proxy_server_ip_addr#$proxy_server_dns_port" + + uci commit dhcp + /etc/init.d/dnsmasq restart +} + +cleanup_dns() { + if uci -q get "$UCI_CONFIG.dns_backup" >/dev/null; then + log_msg info "Restoring original DNS configuration..." + + local noresolv=$(uci -q get "$UCI_CONFIG.dns_backup.noresolv") + local dns_redirect=$(uci -q get "$UCI_CONFIG.dns_backup.dns_redirect") + local servers=$(uci -q get "$UCI_CONFIG.dns_backup.servers") + + log_msg debug "Restoring DNS values: noresolv=${noresolv:-0}, redirect=${dns_redirect:-1}, servers=${servers:-empty}" + + # Restore noresolv (default to 0 if not backed up) + [ -n "$noresolv" ] && uci set dhcp.@dnsmasq[0].noresolv="$noresolv" || uci set dhcp.@dnsmasq[0].noresolv="0" + + # Restore dns_redirect (only restore if it originally existed, avoid polluting config) + if [ -n "$dns_redirect" ]; then + uci set dhcp.@dnsmasq[0].dns_redirect="$dns_redirect" + else + uci -q delete dhcp.@dnsmasq[0].dns_redirect + fi + + # Restore servers correctly splitting comma-separated list + uci -q delete dhcp.@dnsmasq[0].server + if [ -n "$servers" ]; then + for s in $(echo "$servers" | tr ',' ' '); do + [ -n "$s" ] && uci add_list dhcp.@dnsmasq[0].server="$s" + done + fi + + uci commit dhcp + uci delete "$UCI_CONFIG.dns_backup" + uci commit "$UCI_CONFIG" + /etc/init.d/dnsmasq restart + fi +} + +do_degrade() { + local proxy_ip=$(uci -q get "$UCI_CONFIG.global.proxy_server_ip_addr") + log_msg warn "Proxy server ${proxy_ip:-unknown} unreachable, degrading FlowProxy to direct mode..." + # 先写入降级标记,避免 RPCD 状态自愈误删 STATE_FILE + touch "$DEGRADED_FILE" + delete_route + delete_nft + cleanup_dns + log_msg warn "FlowProxy degraded to direct mode (monitoring remains active)" +} + +do_recover() { + local proxy_ip=$(uci -q get "$UCI_CONFIG.global.proxy_server_ip_addr") + log_msg info "Proxy server ${proxy_ip:-unknown} is online, recovering FlowProxy..." + restore_nft_rules || return 1 + add_route || { delete_nft; return 1; } + setup_dns + rm -f "$DEGRADED_FILE" + log_msg info "FlowProxy recovered to active proxy mode" + return 0 +} diff --git a/luci-app-flowproxy/root/usr/share/flowproxy/watchdog.sh b/luci-app-flowproxy/root/usr/share/flowproxy/watchdog.sh new file mode 100755 index 000000000..21a31a7c2 --- /dev/null +++ b/luci-app-flowproxy/root/usr/share/flowproxy/watchdog.sh @@ -0,0 +1,171 @@ +#!/bin/sh +# FlowProxy sidecar watchdog daemon (ARP + Ping health probe) + +. /usr/share/flowproxy/common.sh + +MY_GEN="$1" +[ -z "$MY_GEN" ] && exit 0 + +STOP_REQUESTED=0 +SLEEP_PID="" + +handle_signal() { + STOP_REQUESTED=1 + [ -n "$SLEEP_PID" ] && kill "$SLEEP_PID" 2>/dev/null +} + +trap 'handle_signal' TERM INT + +interruptible_sleep() { + local secs="$1" + [ "$STOP_REQUESTED" -eq 1 ] && return 1 + sleep "$secs" & + SLEEP_PID=$! + wait "$SLEEP_PID" 2>/dev/null + SLEEP_PID="" + [ "$STOP_REQUESTED" -eq 1 ] && return 1 + return 0 +} + +resolve_probe_iface() { + local iface="$1" + if [ -L "/sys/class/net/$iface/master" ]; then + local master_path=$(readlink "/sys/class/net/$iface/master" 2>/dev/null) + local master_name=$(basename "$master_path" 2>/dev/null) + [ -n "$master_name" ] && { echo "$master_name"; return; } + fi + echo "$iface" +} + +get_uint_or_default() { + local val="$1" + local def="$2" + local min="$3" + case "$val" in + ''|*[!0-9]*) echo "$def"; return ;; + esac + [ "$val" -lt "$min" ] && echo "$min" || echo "$val" +} + +is_context_valid() { + [ "$STOP_REQUESTED" -eq 0 ] || return 1 + [ -f "$STATE_FILE" ] || return 1 + [ "$(cat "$GEN_FILE" 2>/dev/null)" = "$MY_GEN" ] || return 1 + [ "$(uci -q get "$UCI_CONFIG.global.enabled" || echo 0)" = "1" ] || return 1 + [ "$(uci -q get "$UCI_CONFIG.global.monitor_enabled" || echo 0)" = "1" ] || return 1 + return 0 +} + +check_proxy_alive() { + local ip="$1" + local iface="$2" + + # 1. ICMP Ping (首次成功即毫秒级返回;失败则补测一次防单包抖动) + if ping -c 1 -W 1 -I "$iface" "$ip" >/dev/null 2>&1; then + return 0 + fi + if [ "$STOP_REQUESTED" -eq 1 ]; then + return 0 + fi + if ping -c 1 -W 1 -I "$iface" "$ip" >/dev/null 2>&1; then + return 0 + fi + + # 2. ARP 互补探测 (防止旁路由禁 Ping 误报) + if command -v arping >/dev/null 2>&1; then + if arping -f -q -c 2 -w 1 -I "$iface" "$ip" >/dev/null 2>&1; then + return 0 + fi + else + ip neigh flush to "$ip" dev "$iface" >/dev/null 2>&1 + ping -c 1 -W 1 -I "$iface" "$ip" >/dev/null 2>&1 + if ip neigh show to "$ip" dev "$iface" 2>/dev/null | grep -qE "REACHABLE|DELAY|PROBE"; then + return 0 + fi + fi + + return 1 +} + +proxy_ip=$(uci -q get "$UCI_CONFIG.global.proxy_server_ip_addr") +conf_iface=$(uci -q get "$UCI_CONFIG.global.interface") +conf_iface="${conf_iface:-br-lan}" +probe_iface=$(resolve_probe_iface "$conf_iface") + +interval=$(get_uint_or_default "$(uci -q get "$UCI_CONFIG.global.monitor_interval")" 5 2) +fail_threshold=$(get_uint_or_default "$(uci -q get "$UCI_CONFIG.global.monitor_fail_threshold")" 3 1) +recover_threshold=$(get_uint_or_default "$(uci -q get "$UCI_CONFIG.global.monitor_recover_threshold")" 2 1) + +[ -z "$proxy_ip" ] && exit 0 + +log_msg info "Watchdog started (target=$proxy_ip, iface=$probe_iface, interval=${interval}s, fail=$fail_threshold, recover=$recover_threshold)" + +# 启动后先等待一个探测周期,确保主服务完全进入稳定运行态 +interruptible_sleep "$interval" || exit 0 + +[ -f "$DEGRADED_FILE" ] && state="degraded" || state="online" +fail_count=0 +ok_count=0 + +while is_context_valid; do + if check_proxy_alive "$proxy_ip" "$probe_iface"; then + fail_count=0 + if [ "$state" = "degraded" ]; then + ok_count=$((ok_count + 1)) + log_msg debug "Watchdog: probe succeeded ($ok_count/$recover_threshold)" + if [ "$ok_count" -ge "$recover_threshold" ]; then + acquire_lock + if ! is_context_valid; then + release_lock + break + fi + if [ -f "$DEGRADED_FILE" ]; then + if do_recover; then + state="online" + ok_count=0 + fail_count=0 + else + log_msg error "Watchdog: recovery failed, staying in degraded mode" + fi + else + state="online" + ok_count=0 + fi + release_lock + fi + else + ok_count=0 + fi + else + [ "$STOP_REQUESTED" -eq 1 ] && break + ok_count=0 + if [ "$state" = "online" ]; then + fail_count=$((fail_count + 1)) + log_msg warn "Watchdog: probe failed ($fail_count/$fail_threshold) for $proxy_ip via $probe_iface" + if [ "$fail_count" -ge "$fail_threshold" ]; then + acquire_lock + if ! is_context_valid; then + release_lock + break + fi + if [ ! -f "$DEGRADED_FILE" ]; then + do_degrade + state="degraded" + fail_count=0 + ok_count=0 + else + state="degraded" + fail_count=0 + fi + release_lock + fi + else + fail_count=0 + fi + fi + + interruptible_sleep "$interval" || break +done + +log_msg info "Watchdog stopped" +exit 0 diff --git a/luci-app-flowproxy/root/usr/share/rpcd/ucode/luci.flowproxy b/luci-app-flowproxy/root/usr/share/rpcd/ucode/luci.flowproxy index 45f1aad6d..5e0b3aebb 100755 --- a/luci-app-flowproxy/root/usr/share/rpcd/ucode/luci.flowproxy +++ b/luci-app-flowproxy/root/usr/share/rpcd/ucode/luci.flowproxy @@ -6,6 +6,7 @@ import { connect } from 'ubus'; const UCI_CONFIG = 'flowproxy'; const STATE_FILE = '/var/run/flowproxy.running'; +const DEGRADED_FILE = '/var/run/flowproxy.degraded'; const IP_CACHE = '/tmp/flowproxy/lan_ip.cache'; const LOG_FILE = '/var/log/flowproxy.log'; const NFT_TABLE = 'flowproxy'; @@ -20,6 +21,7 @@ const methods = { call: function() { // 1. 快速探测 let is_running = access(STATE_FILE, 'f'); + let is_degraded = access(DEGRADED_FILE, 'f'); // 2. 自愈:检查内核状态并同步标记文件 let tcp_active = (system('nft list chain inet ' + NFT_TABLE + ' LAN_MARKFLOW_TCP >/dev/null 2>&1') === 0); @@ -28,7 +30,7 @@ const methods = { if (real_running && !is_running) { try { writefile(STATE_FILE, ''); } catch(e) {} - } else if (!real_running && is_running) { + } else if (!real_running && is_running && !is_degraded) { try { system('rm -f ' + STATE_FILE); } catch(e) {} } @@ -67,11 +69,15 @@ const methods = { let proxy_server_ip_addr = uci_cursor.get(UCI_CONFIG, 'global', 'proxy_server_ip_addr') || ''; let dns_running = (uci_cursor.get(UCI_CONFIG, 'dns_backup') ? 1 : 0); + let monitor_enabled = int(uci_cursor.get(UCI_CONFIG, 'global', 'monitor_enabled') || '0'); + let degraded_active = (is_degraded && is_running && !real_running) ? 1 : 0; return { - running: real_running ? 1 : 0, + running: (real_running || degraded_active) ? 1 : 0, + degraded: degraded_active, dns_running: dns_running, enabled: int(uci_cursor.get(UCI_CONFIG, 'global', 'enabled') || '0'), + monitor_enabled: monitor_enabled, proxy_server_ip_addr: proxy_server_ip_addr, proxy_server_dns_port: uci_cursor.get(UCI_CONFIG, 'global', 'proxy_server_dns_port') || '5353', lan_ip: safe_trim(lan_ip), diff --git a/luci-app-open-box/Makefile b/luci-app-open-box/Makefile index 201391e25..388b4b8f6 100644 --- a/luci-app-open-box/Makefile +++ b/luci-app-open-box/Makefile @@ -1,8 +1,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-open-box -PKG_VERSION:=0.1.423 -PKG_RELEASE:=73 +PKG_VERSION:=0.1.425 +PKG_RELEASE:=74 PKG_MAINTAINER:=liandu2024 PKG_LICENSE:=GPL-3.0-or-later diff --git a/luci-app-vantage/Makefile b/luci-app-vantage/Makefile index 9954ebdf3..8654ab06e 100644 --- a/luci-app-vantage/Makefile +++ b/luci-app-vantage/Makefile @@ -10,8 +10,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-vantage -PKG_VERSION:=1.0.19 -PKG_RELEASE:=34 +PKG_VERSION:=1.0.20 +PKG_RELEASE:=35 PKG_LICENSE:=GPL-3.0-or-later LUCI_TITLE:=Vantage dashboard @@ -20,15 +20,19 @@ LUCI_DESCRIPTION:=Live network dashboard (landing page under admin/dashboard): d Read-only except for station names and stations set not to warn about \ their signal, which are kept in /etc/config/vantage. # rpcd-mod-iwinfo provides the station lists and the radios' state -# (iwinfo info/assoclist/survey). +# (iwinfo info/assoclist). # rpcd-mod-ucode runs the app's plugin (/usr/share/rpcd/ucode/luci.vantage: # key-free wireless status, thermal zones, validated alias writes), which # imports the uci, ubus and fs ucode modules; luci-base pulls all four in -# already, they are listed because the plugin needs them. +# already, they are listed because the plugin needs them. It also imports +# rtnl (the bridges' hosts, the default routes) and nl80211: it reads the +# radios' channel survey (the noise floor) through nl80211 itself, because +# rpcd's iwinfo survey crashes rpcd on drivers other than nl80211's (#124). +# Wi-Fi images already have both, as wifi-scripts needs them. # Optional at runtime, degrade when absent: rpcd-mod-rrdns (reverse DNS # names), umdns (mDNS names), hostapd ubus objects (WPS names, client # capabilities). -LUCI_DEPENDS:=+luci-base +rpcd +rpcd-mod-iwinfo +rpcd-mod-ucode +ucode-mod-uci +ucode-mod-ubus +ucode-mod-fs +ucode-mod-rtnl +LUCI_DEPENDS:=+luci-base +rpcd +rpcd-mod-iwinfo +rpcd-mod-ucode +ucode-mod-uci +ucode-mod-ubus +ucode-mod-fs +ucode-mod-rtnl +ucode-mod-nl80211 LUCI_PKGARCH:=all LUCI_MAINTAINER:=anothaDev <10740588+anothaDev@users.noreply.github.com> LUCI_URL:=https://github.com/anothaDev/luci-theme-vantage diff --git a/luci-app-vantage/htdocs/luci-static/resources/vantage/app.css b/luci-app-vantage/htdocs/luci-static/resources/vantage/app.css index cbd855f96..8a318f5fd 100644 --- a/luci-app-vantage/htdocs/luci-static/resources/vantage/app.css +++ b/luci-app-vantage/htdocs/luci-static/resources/vantage/app.css @@ -729,6 +729,13 @@ header.bg-primary { font-size: var(--vt-fs-sm); color: var(--vt-text-2); margin-top: 2px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } +/* a health card's reason in its parts (overview.js): each part stays + whole, and its dot sits in the .9em before it (" · " is .89em). The + parts start .9em further left, under the clip, so a part that begins + a line hides its dot (#122) */ +.vt-app .vt-chip-reason > .vt-parts { display: block; margin-inline-start: -.9em; } +.vt-app .vt-chip-reason .vt-part { display: inline-block; } +.vt-app .vt-chip-reason .vt-part::before { content: "·"; display: inline-block; width: .9em; text-align: center; } /* -------------------------------------------------- 5. hero: network path */ @@ -892,12 +899,24 @@ header.bg-primary { .vt-app .vt-branch-ssids .vt-node { max-width: 260px; } /* a network has no second column: its rates take that room */ .vt-app .vt-branch > .vt-node-net { grid-column: 1 / -1; justify-self: start; width: 100%; max-width: 260px; } +/* with subgrid every branch shares one radio column: 172px, or wider up + to 240px when the widest radio's own text needs it, so "Ch 128 · 160 + MHz" in a wider font or a larger text size no longer ends in "…" + (#122). Without subgrid, the fixed column above. Narrower windows lay + the branches out as below. */ +@supports (grid-template-columns: subgrid) { + .vt-app .vt-branches { display: grid; grid-template-columns: minmax(172px, max-content) minmax(0, 1fr); column-gap: 34px; row-gap: 18px; align-content: space-between; } + .vt-app .vt-branches > * { grid-column: 1 / -1; } + .vt-app .vt-branch { grid-template-columns: subgrid; } + .vt-app .vt-branch > .vt-node:first-child:not(.vt-node-net) { max-width: 240px; } +} /* medium widths: the rates need their column, and the branches have room to give; what a radio or the Wired node leads to goes under it, too narrow beside it */ @container vthero (max-width: 1020px) { .vt-app .vt-path { grid-template-columns: minmax(150px, 1.05fr) minmax(136px, .9fr) minmax(190px, 1.1fr) minmax(204px, 2fr); } + .vt-app .vt-branches { display: flex; } .vt-app .vt-branch { grid-template-columns: minmax(0, 1fr); row-gap: 8px; } .vt-app .vt-branch > .vt-node { justify-self: start; min-width: min(200px, 100%); } .vt-app .vt-branch-ssids { padding-left: 34px; } diff --git a/luci-app-vantage/htdocs/luci-static/resources/vantage/model.js b/luci-app-vantage/htdocs/luci-static/resources/vantage/model.js index 0de4691ec..3c9d78d9d 100644 --- a/luci-app-vantage/htdocs/luci-static/resources/vantage/model.js +++ b/luci-app-vantage/htdocs/luci-static/resources/vantage/model.js @@ -588,9 +588,10 @@ return baseclass.extend({ return out; }, - /* iwinfo survey [ { mhz, noise, ... } ] -> the noise floor (dBm) on the - channel at mhz, or null. Drivers send it as a signed byte, some as an - unsigned one (ath12k: 146 for -110 dBm), and 0 when they have none */ + /* luci.vantage survey [ { mhz, noise } ] -> the noise floor (dBm) on + the channel at mhz, or null. A signed byte, as nl80211 carries it; + rpcd's iwinfo survey (1.0.19) gave some drivers' as an unsigned one + (ath12k: 146 for -110 dBm); 0 when the driver has none */ surveyNoise: function(entries, mhz) { if (!mhz) return null; var e = arr(entries).filter(function(x) { return x && num(x.mhz) === mhz; })[0]; diff --git a/luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js b/luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js index c01c6a66e..ceb6c7794 100644 --- a/luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js +++ b/luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js @@ -38,8 +38,8 @@ var LOW_IDLE_POLL_MS = 30 * 1000; IWINFO_MS, or at once when the interface's state moved (its radio up, down, pending or reconfigured in luci.vantage wireless; its channel, frequency, BSSID or SSID in hostapd's get_status, asked every poll). - The noise floor, which moves, comes every poll from iwinfo survey - (1.5-2 ms a radio), its entry for the radio's channel */ + The noise floor, which moves, comes every poll from luci.vantage + survey (1.5-2.5 ms a radio), its entry for the radio's channel */ var IWINFO_MS = 30 * 1000; /* luci-rpc getHostHints reads the DHCP leases and the ARP table: asked again after HINTS_MS, and on each of the HINTS_HOT polls after a @@ -70,7 +70,7 @@ var GONE_KEEP_MS = 5 * 60 * 1000; /* disconnected stations stay listed */ var TALKERS = 3; /* top talkers shown; the tile keeps room for all */ var SWITCH_MS = 30 * 1000; /* LuCI runs swconfig for each switch's link state: at most this often */ var STORE_KEY = 'vantage.hist.v1'; -var VERSION = '1.0.19'; /* this package's, as its Makefile has it (tests/version.test.js) */ +var VERSION = '1.0.20'; /* this package's, as its Makefile has it (tests/version.test.js) */ var SVGNS = 'http://www.w3.org/2000/svg'; var HOSTAPD_OBJ = /^[A-Za-z0-9_.-]{1,64}$/; @@ -98,8 +98,11 @@ var callHints = rpc.declare({ object: 'luci-rpc', method: 'getHostHints', expect var callIwInfo = rpc.declare({ object: 'iwinfo', method: 'info', params: [ 'device' ], expect: { '': {} } }); var callAssoc = rpc.declare({ object: 'iwinfo', method: 'assoclist', params: [ 'device' ], expect: { results: [] } }); /* the channels' survey: the noise floor of the radio's own (model.js - surveyNoise); null when the call fails */ -var callSurvey = rpc.declare({ object: 'iwinfo', method: 'survey', params: [ 'device' ], expect: { results: [] } }); + surveyNoise); null when the call fails. The plugin's, read through + nl80211, not iwinfo's: rpcd's iwinfo survey crashes rpcd on every + iwinfo backend but nl80211's (MediaTek's mtwifi in the mt798x builds, + #124) */ +var callSurvey = rpc.declare({ object: 'luci.vantage', method: 'survey', params: [ 'device' ], expect: { results: [] } }); var callRrdns = rpc.declare({ object: 'network.rrdns', method: 'lookup', params: [ 'addrs', 'timeout', 'limit' ], expect: { '': {} } }); var callMdns = rpc.declare({ object: 'umdns', method: 'hosts' }); var callUciGet = rpc.declare({ object: 'uci', method: 'get', params: [ 'config' ], expect: { values: {} } }); @@ -2147,7 +2150,15 @@ return view.extend({ cell.check = c; txt(cell.title, c.title); txt(cell.value, c.value); - txt(cell.reason, c.reason); + /* the reason in its " · " parts: a part that does not fit goes + whole to the next line, without its dot (app.css), so "1 Gbit/s + link" never breaks after its "/" or inside a word (#122) */ + var reason = c.reason == null ? '' : String(c.reason); + if (cell.reasonText !== reason) { + cell.reasonText = reason; + dom.content(cell.reason, reason === '' ? [] : E('span', { 'class': 'vt-parts' }, + reason.split(' · ').map(function(p) { return E('span', { 'class': 'vt-part' }, [ p ]); }))); + } setTitle(cell.el, c.detail || c.reason); patch(cell.viz, self.checkPicture(c)); }); diff --git a/luci-app-vantage/po/templates/vantage.pot b/luci-app-vantage/po/templates/vantage.pot index 503e1f970..25922329a 100644 --- a/luci-app-vantage/po/templates/vantage.pot +++ b/luci-app-vantage/po/templates/vantage.pot @@ -1,7 +1,7 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4050 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4061 msgid "%d MHz (%d–%d MHz)" msgstr "" @@ -29,19 +29,19 @@ msgid_plural "%d SSIDs · %d idle" msgstr[0] "" msgstr[1] "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1981 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2548 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3107 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1984 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2559 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3118 msgid "%d clients" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3444 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3455 msgid "%d connected" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2575 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2579 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3443 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2586 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2590 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3454 msgid "%d devices" msgstr "" @@ -56,22 +56,22 @@ msgid_plural "%d measured clients are above %s" msgstr[0] "" msgstr[1] "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:526 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:529 msgctxt "vantage" msgid "%d min" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/fmt.js:118 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:520 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:523 msgctxt "vantage" msgid "%d min ago" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3442 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3453 msgid "%d of %d" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1865 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1868 msgid "%d of %d columns" msgstr "" @@ -101,17 +101,17 @@ msgid_plural "%d radios up" msgstr[0] "" msgstr[1] "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3099 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3110 msgid "%d radios" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:526 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:529 msgctxt "vantage" msgid "%d s" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/fmt.js:117 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:520 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:523 msgctxt "vantage" msgid "%d s ago" msgstr "" @@ -125,7 +125,7 @@ msgstr "" msgid "%d weak" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3118 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3129 msgid "%d–%d MHz of the %d–%d MHz band" msgstr "" @@ -143,7 +143,7 @@ msgstr "" msgid "%s (IPv%d)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3817 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3828 msgid "%s (new this session)" msgstr "" @@ -154,10 +154,10 @@ msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/fmt.js:166 #: luci-app-vantage/htdocs/luci-static/resources/vantage/wifi.js:103 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3125 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3139 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3541 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4043 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3136 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3150 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3552 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4054 msgid "%s MHz" msgstr "" @@ -176,13 +176,13 @@ msgid "%s at %s; below %s roaming and throughput suffer" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:83 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2799 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2810 msgctxt "vantage" msgid "%s available" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3145 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4051 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3156 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4062 msgid "%s dBm" msgstr "" @@ -194,13 +194,13 @@ msgstr "" msgid "%s device on a newer radio; uses more airtime per byte" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4077 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4088 msgid "%s error" msgid_plural "%s errors" msgstr[0] "" msgstr[1] "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3784 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3795 msgid "%s experience" msgstr "" @@ -216,11 +216,11 @@ msgstr "" msgid "%s has no carrier: cable unplugged or switch port down" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1831 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1834 msgid "%s hidden" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4121 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4132 msgid "%s in · %s out" msgstr "" @@ -236,7 +236,7 @@ msgstr "" msgid "%s is in no zone and accepts every connection" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1824 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1827 msgid "%s is narrower" msgstr "" @@ -244,17 +244,17 @@ msgstr "" msgid "%s is not up" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3500 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3511 msgid "" "%s is shared by %d devices (a switch or another access point behind it); its " "%s link is not theirs" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3499 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3510 msgid "%s is shared by %d devices behind the switch" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1827 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1830 msgid "%s is wider" msgstr "" @@ -270,23 +270,23 @@ msgstr "" msgid "%s may open the router's admin" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1946 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1949 msgid "%s moved" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1821 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1824 msgid "%s moved down" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1812 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1815 msgid "%s moved left" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1815 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1818 msgid "%s moved right" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1818 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1821 msgid "%s moved up" msgstr "" @@ -299,9 +299,9 @@ msgid "%s negotiated only %d Mbit/s; a cable pair or port may be faulty" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:84 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2800 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2829 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4147 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2811 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2840 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4158 msgid "%s of %s" msgstr "" @@ -322,21 +322,21 @@ msgstr "" msgid "%s of frames to the device fail; interference likely" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4145 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4156 msgid "%s over %d core" msgid_plural "%s over %d cores" msgstr[0] "" msgstr[1] "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2894 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2905 msgid "%s radio" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3822 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3833 msgid "%s sent · %s retried · %s failed" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1871 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1874 msgid "%s shown" msgstr "" @@ -352,11 +352,11 @@ msgstr "" msgid "%s used" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2837 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2848 msgid "%s used of %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3497 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3508 msgid "%s · %d devices" msgstr "" @@ -364,7 +364,7 @@ msgstr "" msgid "%s · %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3814 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3825 msgid "%s · channel %d · %d MHz" msgstr "" @@ -380,27 +380,27 @@ msgstr "" msgid "%s: no carrier" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4051 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4062 msgid "(configured %d dBm, limited by regulatory rules)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2547 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3633 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2558 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3644 msgid "(hidden)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1981 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2548 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3107 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1984 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2559 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3118 msgid "1 client" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3444 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3455 msgid "1 connected" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2579 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3443 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2590 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3454 msgid "1 device" msgstr "" @@ -408,7 +408,7 @@ msgstr "" msgid "1 older device (Wi-Fi 4 or earlier) slows airtime" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3099 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3110 msgid "1 radio" msgstr "" @@ -436,20 +436,20 @@ msgstr "" msgid "60 GHz" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3307 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3318 msgid "Active" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3826 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3858 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3837 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3869 msgid "Address type" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4110 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4121 msgid "Addresses" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3147 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3158 msgid "Airtime" msgstr "" @@ -458,8 +458,8 @@ msgctxt "vantage" msgid "Alias" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3298 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3304 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3309 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3315 msgid "All" msgstr "" @@ -488,7 +488,7 @@ msgstr "" msgid "Busiest radio: %s of Wi-Fi traffic" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2764 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2775 msgid "Busy share of each CPU core" msgstr "" @@ -504,8 +504,8 @@ msgstr[1] "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:71 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:72 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2757 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4145 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2768 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4156 msgctxt "vantage" msgid "CPU" msgstr "" @@ -514,78 +514,78 @@ msgstr "" msgid "Cache (reclaimable)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3931 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3942 msgid "Cancel" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3809 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3820 msgctxt "vantage" msgid "Capabilities" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4102 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4113 msgid "Carrier" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4050 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4061 msgid "Centre frequency" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3138 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3149 msgid "Ch %d" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2528 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3106 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2539 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3117 msgid "Ch %d · %d MHz" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4043 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4054 msgid "Channel" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2528 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2539 msgid "Channel —" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3171 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3182 msgctxt "vantage" msgid "Clear filter" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1508 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3144 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3189 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3190 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1511 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3155 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3200 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3201 msgid "Clients" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4057 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4068 msgid "Clients on this radio" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3650 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3661 msgid "Close" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3556 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3567 msgid "Connected" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3526 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3537 msgid "Connected after you opened this page" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3815 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3826 msgid "Connected for" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3812 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3843 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3823 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3854 msgid "Connection" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2791 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2802 msgid "Core %d: %s" msgstr "" @@ -593,23 +593,23 @@ msgstr "" msgid "Could not read the firewall configuration" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3914 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3925 msgid "Could not save the name (no permission or the device refused it)." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1708 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1711 msgid "Could not save this for every browser. Try again." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4001 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4012 msgid "Could not save this." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4118 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4129 msgid "Counters since boot" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4055 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4066 msgid "Country" msgstr "" @@ -618,13 +618,13 @@ msgid "" "Custom rule files are configured (%s); rules in them are not listed here." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1967 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1970 msgid "Customize" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1775 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1776 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1966 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1778 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1779 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1969 msgid "Customize the dashboard" msgstr "" @@ -632,16 +632,16 @@ msgstr "" msgid "DHCP" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3871 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3882 msgid "DHCP hostname" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:45 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4116 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4127 msgid "DNS" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2459 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2470 msgid "DNS %s" msgstr "" @@ -650,117 +650,117 @@ msgstr "" msgid "Dashboard" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3379 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3471 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4136 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3390 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3482 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4147 msgid "Device" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3898 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3909 msgid "Device name" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3927 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3938 msgid "Device type" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3457 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3468 msgid "" "Devices on the Ethernet ports appear here once they send traffic; the bridge " "forgets quiet ones after about five minutes." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2529 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3108 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3133 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4048 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2540 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3119 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3144 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4059 msgid "Disabled" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3777 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3788 msgid "Disconnected %s; shown from the last sample." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3972 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3983 msgid "Don't warn about its signal" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1790 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1793 msgctxt "vantage" msgid "Done" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:45 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2529 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3108 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3133 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4048 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2540 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3119 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3144 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4059 msgctxt "vantage" msgid "Down" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2871 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2966 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3041 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2882 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2977 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3052 msgid "Download" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:445 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:448 msgid "Download (to clients)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3820 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3831 msgctxt "vantage" msgid "Downloaded" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1852 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1855 msgid "" "Drag a tile by its handle or use its buttons. Done saves it for medium " "screens in every browser." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1853 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1856 msgid "" "Drag a tile by its handle or use its buttons. Done saves it for narrow " "screens in every browser." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1851 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1854 msgid "" "Drag a tile by its handle or use its buttons. Done saves it for wide screens " "in every browser." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1852 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1855 msgid "" "Drag a tile by its handle or use its buttons. Saved in this browser for " "medium screens." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1853 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1856 msgid "" "Drag a tile by its handle or use its buttons. Saved in this browser for " "narrow screens." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1851 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1854 msgid "" "Drag a tile by its handle or use its buttons. Saved in this browser for wide " "screens." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1803 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1806 msgid "Drag to move" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4121 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4132 msgctxt "vantage" msgid "Dropped" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3612 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3623 msgid "Edit" msgstr "" @@ -768,7 +768,7 @@ msgstr "" msgid "Enhanced Open (OWE)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2130 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2133 msgid "Error" msgstr "" @@ -786,8 +786,8 @@ msgctxt "vantage" msgid "Excellent" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3550 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3561 msgid "Experience" msgstr "" @@ -805,20 +805,20 @@ msgstr "" msgid "Fair signal %s; lower rates at range" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3168 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3369 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3179 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3380 msgid "Filter by name, address, SSID…" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3369 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3380 msgid "Filter by name, address, port…" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3169 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3180 msgid "Filter clients" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4139 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4150 msgctxt "vantage" msgid "Firmware" msgstr "" @@ -831,7 +831,7 @@ msgstr "" msgid "Forwarding is accepted by default" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3822 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3833 msgid "Frames to device" msgstr "" @@ -840,15 +840,15 @@ msgctxt "vantage" msgid "Free" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3807 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3818 msgid "From device" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3539 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3550 msgid "From device: %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4097 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4108 msgid "From network" msgstr "" @@ -858,9 +858,9 @@ msgid "" "files are not shown." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2457 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3491 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4113 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2468 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3502 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4124 msgid "Gateway" msgstr "" @@ -873,7 +873,7 @@ msgstr "" msgid "General Settings" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3808 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3819 msgctxt "vantage" msgid "Generation" msgstr "" @@ -883,13 +883,13 @@ msgctxt "vantage" msgid "GiB" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3826 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3858 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3837 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3869 msgid "Globally unique" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3826 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3858 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3837 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3869 msgid "Globally unique · %s" msgstr "" @@ -907,7 +907,7 @@ msgstr "" msgid "Good signal %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1736 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1739 msgid "Grid" msgstr "" @@ -923,36 +923,36 @@ msgstr "" msgid "Half duplex" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1371 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1374 msgctxt "vantage" msgid "Health checks" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1868 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3633 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1871 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3644 msgctxt "vantage" msgid "Hidden" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1830 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1833 msgid "Hide %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3827 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3859 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3838 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3870 msgid "IP addresses" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4111 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4122 msgid "IPv4" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4112 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4123 msgid "IPv6" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3824 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3856 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3835 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3867 msgid "Identity" msgstr "" @@ -960,7 +960,7 @@ msgstr "" msgid "In no zone: the default policies apply." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4108 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4119 msgid "In the tunnel" msgstr "" @@ -974,21 +974,21 @@ msgctxt "vantage" msgid "Input" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2507 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2518 msgid "Interface" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4105 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4116 msgid "Interface up for" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3841 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4083 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4095 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3852 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4094 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4106 msgid "Interfaces" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2457 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2468 msgid "Internet" msgstr "" @@ -1014,15 +1014,15 @@ msgid "" "itself." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3965 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3976 msgid "Its weak signal is left out of the warnings." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4140 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4151 msgid "Kernel" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2843 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2854 msgid "Kernel %s" msgstr "" @@ -1031,58 +1031,58 @@ msgctxt "vantage" msgid "KiB" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3183 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3194 msgid "Kind of client" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3816 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3827 msgctxt "vantage" msgid "Last activity" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3380 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3515 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3854 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3391 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3526 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3865 msgid "Last heard" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1788 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1791 msgid "Layout reset" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3525 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3536 msgid "Left %s" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:180 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3527 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3538 msgctxt "vantage" msgid "Legacy" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3379 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3495 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3805 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3845 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4101 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3390 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3506 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3816 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3856 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4112 msgctxt "vantage" msgid "Link" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3538 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3549 msgid "Link rate" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2003 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3379 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3506 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3543 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2006 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3390 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3517 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3554 msgid "Live" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4144 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4155 msgid "Load" msgstr "" @@ -1098,24 +1098,24 @@ msgid_plural "Load %s · %d cores" msgstr[0] "" msgstr[1] "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4146 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4157 msgctxt "vantage" msgid "Load average" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2745 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2756 msgid "Load average over 1, 5 and 15 minutes" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2781 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2792 msgid "Load avg %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4142 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4153 msgid "Local time" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1667 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1670 msgid "Log in again to save this for every browser." msgstr "" @@ -1131,8 +1131,8 @@ msgstr "" msgid "MAC" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3825 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3857 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3836 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3868 msgid "MAC address" msgstr "" @@ -1140,11 +1140,11 @@ msgstr "" msgid "MCS %d" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1823 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1826 msgid "Make %s narrower" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1826 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1829 msgid "Make %s wider" msgstr "" @@ -1161,11 +1161,11 @@ msgid "Measuring…" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:83 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2768 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2779 msgid "Memory" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4147 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4158 msgid "Memory in use" msgstr "" @@ -1174,63 +1174,63 @@ msgctxt "vantage" msgid "MiB" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1722 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1725 msgid "Mirrored" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1723 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1726 msgid "Mirrored, scale per direction" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4049 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4060 msgid "Mode" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4137 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4148 msgid "Model" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1820 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1823 msgid "Move %s down" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1811 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1814 msgid "Move %s left" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1814 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1817 msgid "Move %s right" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1817 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1820 msgid "Move %s up" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1803 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1806 msgid "Move %s: drag, or use the arrow keys" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3926 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3937 msgid "Name" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:138 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4021 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4032 msgid "Name contains invisible or control characters" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3828 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3860 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3839 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3871 msgid "Name from" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3476 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3487 msgid "Name from: %s" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:136 #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:141 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4022 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4033 msgid "Name is longer than %d characters" msgstr "" @@ -1238,27 +1238,27 @@ msgstr "" msgid "Name must be text" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3768 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3838 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3779 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3849 msgid "Name this device" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3379 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3505 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3535 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3813 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3853 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3390 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3516 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3546 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3824 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3864 msgid "Network" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1508 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2244 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2245 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1511 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2255 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2256 msgid "Network path" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1741 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1744 msgid "Network path background" msgstr "" @@ -1266,13 +1266,13 @@ msgstr "" msgid "Networks: %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3309 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3526 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3320 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3537 msgctxt "vantage" msgid "New" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2404 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2415 msgid "No SSIDs" msgstr "" @@ -1280,24 +1280,24 @@ msgstr "" msgid "No clients" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3459 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4062 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3470 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4073 msgid "No clients connected" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3587 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3598 msgid "No clients connected." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3450 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3461 msgid "No clients in this view" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3450 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3461 msgid "No clients match “%s”" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2458 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2469 msgctxt "vantage" msgid "No default route" msgstr "" @@ -1306,7 +1306,7 @@ msgstr "" msgid "No interface with a route" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4087 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4098 msgid "No interface with a route is up." msgstr "" @@ -1315,7 +1315,7 @@ msgid "No internet-facing zone found" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:47 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4102 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4113 msgid "No link" msgstr "" @@ -1323,7 +1323,7 @@ msgstr "" msgid "No network interface with a route is up" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2385 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2396 msgid "No other interfaces are up" msgstr "" @@ -1333,7 +1333,7 @@ msgid "No problems detected" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:105 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2408 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2419 msgid "No radios reported" msgstr "" @@ -1354,16 +1354,16 @@ msgstr "" msgid "No warnings asked for" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3456 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3467 msgid "No wired devices heard" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3621 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3632 msgctxt "vantage" msgid "No wireless networks configured." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3113 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3124 msgid "No wireless radios are reported by this device." msgstr "" @@ -1378,39 +1378,39 @@ msgstr "" msgid "No zones are configured." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3587 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3598 msgid "Nobody is moving data right now." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3146 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3157 msgid "Noise" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3810 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3821 msgid "Noise / SNR" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4053 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4054 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4064 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4065 msgid "Noise floor" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:105 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1736 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1739 msgid "None" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:154 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4020 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4031 msgid "Not a station MAC address" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3752 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3763 msgid "Not connected" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3507 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3850 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3518 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3861 msgid "Not counted per device on a shared port" msgstr "" @@ -1418,7 +1418,7 @@ msgstr "" msgid "Not in effect" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2818 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2829 msgid "Not reported" msgstr "" @@ -1426,7 +1426,7 @@ msgstr "" msgid "Not reported by the driver" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3874 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3885 msgid "Nothing better known" msgstr "" @@ -1447,7 +1447,7 @@ msgstr "" msgid "Older %s device" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3527 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3538 msgid "Older Wi-Fi generation than the radio; uses more airtime" msgstr "" @@ -1455,7 +1455,7 @@ msgstr "" msgid "On this router" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 msgctxt "vantage" msgid "Online" msgstr "" @@ -1472,7 +1472,7 @@ msgctxt "vantage" msgid "Open" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3425 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3436 msgid "Open details of %s" msgstr "" @@ -1488,7 +1488,7 @@ msgstr "" msgid "Open network" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/vantage/model.js:889 +#: luci-app-vantage/htdocs/luci-static/resources/vantage/model.js:890 msgid "OpenWrt device" msgstr "" @@ -1498,11 +1498,11 @@ msgid "" "new rules: what is open is unknown." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1720 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1723 msgid "Overlaid" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1721 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1724 msgid "Overlaid, log scale" msgstr "" @@ -1510,15 +1510,15 @@ msgstr "" msgid "Overview" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3809 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3820 msgid "PMF" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2001 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2004 msgid "Paused" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2001 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2004 msgid "Paused while hidden" msgstr "" @@ -1532,7 +1532,7 @@ msgid "" "on to your network: what every router lets in." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4138 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4149 msgctxt "vantage" msgid "Platform" msgstr "" @@ -1542,7 +1542,7 @@ msgctxt "vantage" msgid "Poor" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3844 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3855 msgid "Port" msgstr "" @@ -1550,11 +1550,11 @@ msgstr "" msgid "Port %d" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3500 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3511 msgid "Port %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2572 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2583 msgid "Port total: %s" msgstr "" @@ -1562,11 +1562,11 @@ msgstr "" msgid "Private" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3826 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3837 msgid "Private Wi-Fi address (randomised by the device)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3858 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3869 msgid "Private address (randomised by the device)" msgstr "" @@ -1574,26 +1574,26 @@ msgstr "" msgid "Private device" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4135 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4146 msgid "Processes" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4104 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4115 msgid "Protocol" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3178 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3180 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3189 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3191 msgid "Quick filters" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3814 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4047 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3825 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4058 msgctxt "vantage" msgid "Radio" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3134 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3145 msgid "Radio details" msgstr "" @@ -1605,66 +1605,66 @@ msgstr "" msgid "Radio is enabled but not up" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3158 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4041 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3169 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4052 msgid "Radio settings" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1508 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3086 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3088 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1511 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3097 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3099 msgid "Radios" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2459 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2470 msgid "Reachability not probed" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3492 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3503 msgid "Reached through the uplink port %s, not connected to this device" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4095 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4106 msgid "Realtime graphs" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4119 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4130 msgctxt "vantage" msgid "Received" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2002 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2005 msgctxt "vantage" msgid "Reconnecting…" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3325 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3336 msgid "Remove filter: %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3932 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3943 msgid "Remove name" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3768 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3838 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3779 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3849 msgctxt "vantage" msgid "Rename" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1789 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1792 msgid "Reset" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3869 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3880 msgid "Reverse DNS of its address" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/vantage/model.js:901 +#: luci-app-vantage/htdocs/luci-static/resources/vantage/model.js:902 msgid "Root (overlay)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4115 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4126 msgid "Route metric" msgstr "" @@ -1676,20 +1676,20 @@ msgstr "" msgid "SSH (port 22)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3924 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3935 msgid "Save" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3817 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3828 msgid "Seen since" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4120 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4131 msgctxt "vantage" msgid "Sent" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1724 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1727 msgid "Separate lanes" msgstr "" @@ -1697,48 +1697,48 @@ msgstr "" msgid "Settings to check" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3845 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3856 msgid "Shared by %d devices" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3496 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3507 msgid "Shared port" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1870 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1873 msgid "Show %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3451 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3462 msgid "Show all clients" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2754 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2765 msgid "Show or hide system details" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2245 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2256 msgid "Show or hide the network path" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3089 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3100 msgid "Show or hide the radio details" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2874 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2885 msgid "Show or hide the throughput chart" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3612 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3623 msgid "Show or hide the wireless networks" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2546 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3630 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2557 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3641 msgid "Show the clients of %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2572 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2583 msgid "Show the devices on %s" msgstr "" @@ -1746,9 +1746,9 @@ msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:124 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:132 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:134 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3532 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3793 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3543 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3804 msgid "Signal" msgstr "" @@ -1756,7 +1756,7 @@ msgstr "" msgid "Signal not reported" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4103 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4114 msgctxt "vantage" msgid "Speed" msgstr "" @@ -1767,24 +1767,24 @@ msgid_plural "Standard housekeeping: %d rules" msgstr[0] "" msgstr[1] "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1736 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1739 msgid "Starfield" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3460 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3471 msgid "Stations appear here as soon as they associate with one of the SSIDs." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4048 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4059 msgid "Status" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:93 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2771 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2782 msgid "Storage" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3933 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3944 msgid "Stored on this device in /etc/config/vantage" msgstr "" @@ -1800,16 +1800,16 @@ msgstr "" msgid "Strong signal, %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2828 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2839 msgctxt "vantage" msgid "Swap" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3848 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3859 msgid "Switch ports" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:458 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:461 msgid "Switch ports of VLAN %d on %s: %s" msgstr "" @@ -1817,13 +1817,13 @@ msgstr "" msgid "Switched off" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1509 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2753 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2754 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1512 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2764 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2765 msgid "System" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4135 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4146 msgid "System settings" msgstr "" @@ -1836,19 +1836,19 @@ msgid "Telnet (port 23)" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:76 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2785 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2796 msgid "Temperature %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/vantage/model.js:901 +#: luci-app-vantage/htdocs/luci-static/resources/vantage/model.js:902 msgid "Temporary (RAM)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3380 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3391 msgid "The bridge forgets a device after about five minutes without traffic" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3454 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3465 msgid "" "The bridges have learned so many addresses that listing them here would " "strain this device." @@ -1861,8 +1861,8 @@ msgid "" "reject in General Settings." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3996 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4025 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4007 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4036 msgid "The device could not write /etc/config/vantage." msgstr "" @@ -1886,7 +1886,7 @@ msgid "" "an uplink in no zone would be open. Set Input to reject in General Settings." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3872 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3883 msgid "The name the device announces (WPS)" msgstr "" @@ -1898,7 +1898,7 @@ msgstr "" msgid "The only measured client" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3491 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3502 msgid "The router this device sends its traffic to" msgstr "" @@ -1914,7 +1914,7 @@ msgstr "" msgid "The uplinks could not be checked" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2474 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2485 msgid "This access point" msgstr "" @@ -1922,15 +1922,15 @@ msgstr "" msgid "This address family is in no zone: the default policies apply." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2474 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2485 msgid "This device" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3995 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4006 msgid "This device already keeps %d of these; turn some off first." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4024 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4035 msgid "This device already stores %d names; remove some first." msgstr "" @@ -1938,7 +1938,7 @@ msgstr "" msgid "This device reports no radios" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4084 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4095 msgid "This line is down or has no default route now." msgstr "" @@ -1948,7 +1948,7 @@ msgid "" "the firewall pages." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4032 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4043 msgid "This radio is not reported any more." msgstr "" @@ -1956,23 +1956,23 @@ msgstr "" msgid "This setup is beyond what this overview checks" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3752 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3763 msgid "This station is not associated right now." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1508 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2866 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2868 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3799 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1511 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2877 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2879 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3810 msgctxt "vantage" msgid "Throughput" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1729 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1732 msgid "Throughput chart" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2859 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2870 msgid "Throughput per link; arrow keys read the values over time" msgstr "" @@ -1981,38 +1981,38 @@ msgctxt "vantage" msgid "TiB" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3806 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3817 msgid "To device" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3512 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3547 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3600 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3523 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3558 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3611 msgid "To device %s, from device %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3539 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3550 msgid "To device: %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4098 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4109 msgid "To network" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3453 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3464 msgid "Too many devices to list" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1509 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3564 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3565 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1512 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3575 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3576 msgctxt "vantage" msgid "Top talkers" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3819 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3849 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4044 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3830 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3860 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4055 msgid "Traffic" msgstr "" @@ -2028,16 +2028,16 @@ msgid "" "networks. Set Forward to reject in General Settings." msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2470 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2481 msgid "Traffic to the internet goes through %s, a tunnel over this line" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4107 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4118 msgid "Tunnel" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3145 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4051 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3156 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4062 msgid "Tx power" msgstr "" @@ -2048,16 +2048,16 @@ msgid "" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:289 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3751 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3762 msgctxt "vantage" msgid "Unknown device" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4023 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4034 msgid "Unknown device type" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4032 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4043 msgid "Unknown radio" msgstr "" @@ -2072,14 +2072,14 @@ msgid "Unnamed rule" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:57 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3133 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4048 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4102 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3144 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4059 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4113 msgctxt "vantage" msgid "Up" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2778 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2789 msgid "Up %s" msgstr "" @@ -2088,47 +2088,47 @@ msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:49 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:51 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:57 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2892 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4087 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2903 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4098 msgctxt "vantage" msgid "Uplink" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2892 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2893 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2903 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2904 msgid "Uplink %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4080 #: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4091 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4102 msgid "Uplink · %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2872 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2968 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3042 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2883 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2979 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3053 msgid "Upload" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:446 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:449 msgid "Upload (from clients)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3821 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3832 msgctxt "vantage" msgid "Uploaded" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3492 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3503 msgid "Upstream" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4141 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4152 msgid "Uptime" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3493 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3853 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3504 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3864 msgid "VLAN %d" msgstr "" @@ -2152,8 +2152,10 @@ msgid "" "wireless), its temperature sensors (luci.vantage thermal), the wired hosts " "its bridges have learned (luci.vantage wired: MAC, port and when last heard, " "and which switch ports a port's VLAN has), the link state of those switch " -"ports (luci getSwconfigPortState) and the default route the kernel takes to " -"the internet (luci.vantage routes: family, device and metric, no gateways)" +"ports (luci getSwconfigPortState), the default route the kernel takes to the " +"internet (luci.vantage routes: family, device and metric, no gateways) and " +"each radio's noise floor (luci.vantage survey: the channel survey read " +"through nl80211)" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:46 @@ -2264,11 +2266,11 @@ msgstr "" msgid "WPS" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3829 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3840 msgid "WPS device name" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2130 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2133 msgid "Warning" msgstr "" @@ -2282,7 +2284,7 @@ msgid "Weak" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:163 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3308 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3319 msgid "Weak signal" msgstr "" @@ -2306,27 +2308,27 @@ msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:106 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:110 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:112 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3362 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3373 msgid "Wi-Fi" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2416 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3362 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2427 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3373 msgid "Wired" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1509 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3611 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3612 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1512 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3622 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3623 msgctxt "vantage" msgid "Wireless networks" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3778 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3789 msgid "Wireless settings" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3868 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3879 msgid "Your name for this device" msgstr "" @@ -2364,15 +2366,15 @@ msgstr "" msgid "any zone (default policy)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3139 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3150 msgid "auto" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3817 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3828 msgid "before this page opened" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3846 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3857 msgid "behind %s, VLAN %d" msgstr "" @@ -2381,16 +2383,16 @@ msgctxt "vantage" msgid "bit/s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3000 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3011 msgid "collecting · %s of data" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3000 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3011 msgid "collecting · first samples" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:319 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2980 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:322 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2991 msgid "collecting…" msgstr "" @@ -2402,18 +2404,18 @@ msgstr "" msgid "dBm" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2334 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2472 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2345 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2483 msgid "default route" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2472 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2483 msgid "default route via %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:453 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3496 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3845 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:456 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3507 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3856 msgid "down" msgstr "" @@ -2422,7 +2424,7 @@ msgctxt "vantage" msgid "drop" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3898 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3909 msgctxt "vantage" msgid "e.g. Living room TV" msgstr "" @@ -2461,8 +2463,8 @@ msgid "half duplex" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/fmt.js:62 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2492 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3638 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2503 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3649 msgid "idle" msgstr "" @@ -2504,18 +2506,18 @@ msgctxt "vantage" msgid "kbit/s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2763 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2999 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2774 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3010 msgid "last 5 min" msgstr "" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:181 #: luci-app-vantage/htdocs/luci-static/resources/vantage/wifi.js:104 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3541 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3552 msgid "legacy" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:453 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:456 msgid "link up" msgstr "" @@ -2523,45 +2525,45 @@ msgstr "" msgid "mDNS" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3870 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3881 msgid "mDNS announcement" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3801 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3852 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3812 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3863 msgid "measuring" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2975 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2986 msgid "measuring…" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2956 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2967 msgctxt "vantage" msgid "no data" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2465 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2476 msgid "no uplink" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3827 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3838 msgid "not known to this AP" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3859 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3870 msgid "not known to this device" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4054 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4065 msgid "not reported (driver placeholder %s)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3810 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3821 msgid "not reported by the driver" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2996 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3007 msgctxt "vantage" msgid "now" msgstr "" @@ -2570,16 +2572,16 @@ msgstr "" msgid "now %s down, %s up" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3808 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3819 msgid "older than the radio (%s)" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2973 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2984 msgctxt "vantage" msgid "peak" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2764 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2775 msgid "per core" msgstr "" @@ -2588,11 +2590,11 @@ msgctxt "vantage" msgid "port forward" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3795 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3806 msgid "range %s … %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4097 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4108 msgid "received on %s" msgstr "" @@ -2605,7 +2607,7 @@ msgstr "" msgid "router port %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4098 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4109 msgid "sent on %s" msgstr "" @@ -2613,12 +2615,12 @@ msgstr "" msgid "short GI" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3515 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3854 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3526 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3865 msgid "static entry" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3847 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3858 msgid "switch port %s" msgstr "" @@ -2630,11 +2632,11 @@ msgstr "" msgid "the covered subnets of zone %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3851 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3862 msgid "the port in total: %s" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3846 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3857 msgid "the port: %s" msgstr "" @@ -2650,7 +2652,7 @@ msgstr "" msgid "traffic rule" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2477 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2488 msgid "up %s" msgstr "" @@ -2667,6 +2669,6 @@ msgstr "" msgid "zones %s and %s if they share a device" msgstr "" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2993 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3004 msgid "−%d min" msgstr "" diff --git a/luci-app-vantage/po/zh_Hans/vantage.po b/luci-app-vantage/po/zh_Hans/vantage.po index 652815a89..d988ace33 100644 --- a/luci-app-vantage/po/zh_Hans/vantage.po +++ b/luci-app-vantage/po/zh_Hans/vantage.po @@ -12,7 +12,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4050 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4061 msgid "%d MHz (%d–%d MHz)" msgstr "%d MHz(%d–%d MHz)" @@ -36,19 +36,19 @@ msgid "%d SSID · %d idle" msgid_plural "%d SSIDs · %d idle" msgstr[0] "%d 个 SSID · %d 个空闲" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1981 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2548 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3107 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1984 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2559 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3118 msgid "%d clients" msgstr "%d 个客户端" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3444 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3455 msgid "%d connected" msgstr "已连接 %d 个" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2575 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2579 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3443 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2586 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2590 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3454 msgid "%d devices" msgstr "%d 台设备" @@ -62,22 +62,22 @@ msgid "%d measured client is above %s" msgid_plural "%d measured clients are above %s" msgstr[0] "%d 个已测客户端高于 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:526 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:529 msgctxt "vantage" msgid "%d min" msgstr "%d 分钟" #: luci-app-vantage/htdocs/luci-static/resources/vantage/fmt.js:118 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:520 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:523 msgctxt "vantage" msgid "%d min ago" msgstr "%d 分钟前" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3442 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3453 msgid "%d of %d" msgstr "%d/%d" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1865 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1868 msgid "%d of %d columns" msgstr "%d/%d 列" @@ -104,17 +104,17 @@ msgid "%d radio up" msgid_plural "%d radios up" msgstr[0] "%d 个射频已上线" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3099 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3110 msgid "%d radios" msgstr "%d 个射频" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:526 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:529 msgctxt "vantage" msgid "%d s" msgstr "%d 秒" #: luci-app-vantage/htdocs/luci-static/resources/vantage/fmt.js:117 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:520 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:523 msgctxt "vantage" msgid "%d s ago" msgstr "%d 秒前" @@ -128,7 +128,7 @@ msgstr "%d 项需要关注" msgid "%d weak" msgstr "%d 个信号弱" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3118 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3129 msgid "%d–%d MHz of the %d–%d MHz band" msgstr "%d–%d MHz 属于 %d–%d MHz 频段" @@ -146,7 +146,7 @@ msgstr "%s(%s)已启用但未上线" msgid "%s (IPv%d)" msgstr "%s(IPv%d)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3817 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3828 msgid "%s (new this session)" msgstr "%s(本次新增)" @@ -157,10 +157,10 @@ msgstr "%s Gbit/s" #: luci-app-vantage/htdocs/luci-static/resources/vantage/fmt.js:166 #: luci-app-vantage/htdocs/luci-static/resources/vantage/wifi.js:103 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3125 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3139 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3541 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4043 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3136 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3150 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3552 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4054 msgid "%s MHz" msgstr "%s MHz" @@ -179,13 +179,13 @@ msgid "%s at %s; below %s roaming and throughput suffer" msgstr "%s(%s);低于 %s 时漫游和吞吐量会受影响" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:83 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2799 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2810 msgctxt "vantage" msgid "%s available" msgstr "可用 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3145 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4051 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3156 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4062 msgid "%s dBm" msgstr "%s dBm" @@ -197,12 +197,12 @@ msgstr "%s 设备" msgid "%s device on a newer radio; uses more airtime per byte" msgstr "%s 设备连接在较新的射频上,每字节占用更多空口时间" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4077 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4088 msgid "%s error" msgid_plural "%s errors" msgstr[0] "%s 个错误" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3784 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3795 msgid "%s experience" msgstr "%s 体验" @@ -218,11 +218,11 @@ msgstr "overlay 空闲 %s(已用 %s)" msgid "%s has no carrier: cable unplugged or switch port down" msgstr "%s 无载波:网线未插或交换机端口关闭" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1831 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1834 msgid "%s hidden" msgstr "%s 已隐藏" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4121 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4132 msgid "%s in · %s out" msgstr "%s 入 · %s 出" @@ -238,7 +238,7 @@ msgstr "%s 被转发到 %s" msgid "%s is in no zone and accepts every connection" msgstr "%s 不属于任何区域,接受所有连接" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1824 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1827 msgid "%s is narrower" msgstr "%s 已变窄" @@ -246,18 +246,18 @@ msgstr "%s 已变窄" msgid "%s is not up" msgstr "%s 未上线" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3500 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3511 msgid "" "%s is shared by %d devices (a switch or another access point behind it); its " "%s link is not theirs" msgstr "" "%s 由 %d 台设备共用(其后接有交换机或另一个接入点);%s 的链路不属于这些设备" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3499 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3510 msgid "%s is shared by %d devices behind the switch" msgstr "%s 由交换机后的 %d 台设备共用" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1827 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1830 msgid "%s is wider" msgstr "%s 已加宽" @@ -273,23 +273,23 @@ msgstr "%s 链路" msgid "%s may open the router's admin" msgstr "%s 可能暴露了路由器管理界面" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1946 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1949 msgid "%s moved" msgstr "%s 已移动" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1821 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1824 msgid "%s moved down" msgstr "%s 已下移" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1812 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1815 msgid "%s moved left" msgstr "%s 已左移" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1815 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1818 msgid "%s moved right" msgstr "%s 已右移" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1818 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1821 msgid "%s moved up" msgstr "%s 已上移" @@ -302,9 +302,9 @@ msgid "%s negotiated only %d Mbit/s; a cable pair or port may be faulty" msgstr "%s 仅协商到 %d Mbit/s;网线线对或端口可能有故障" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:84 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2800 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2829 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4147 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2811 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2840 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4158 msgid "%s of %s" msgstr "%s / %s" @@ -325,20 +325,20 @@ msgstr "发往设备的帧失败率:%s" msgid "%s of frames to the device fail; interference likely" msgstr "发往设备的帧失败率:%s,可能存在干扰" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4145 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4156 msgid "%s over %d core" msgid_plural "%s over %d cores" msgstr[0] "%s / %d 核" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2894 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2905 msgid "%s radio" msgstr "%s 射频" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3822 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3833 msgid "%s sent · %s retried · %s failed" msgstr "发送 %s · 重传 %s · 失败 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1871 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1874 msgid "%s shown" msgstr "%s 已显示" @@ -354,11 +354,11 @@ msgstr "%s 已连接,速率 %s" msgid "%s used" msgstr "已用 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2837 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2848 msgid "%s used of %s" msgstr "已用 %s / 共 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3497 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3508 msgid "%s · %d devices" msgstr "%s · %d 台设备" @@ -366,7 +366,7 @@ msgstr "%s · %d 台设备" msgid "%s · %s" msgstr "%s · %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3814 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3825 msgid "%s · channel %d · %d MHz" msgstr "%s · 信道 %d · %d MHz" @@ -382,27 +382,27 @@ msgstr "%s · 链路较慢" msgid "%s: no carrier" msgstr "%s:无载波" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4051 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4062 msgid "(configured %d dBm, limited by regulatory rules)" msgstr "(配置 %d dBm,受管制规则限制)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2547 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3633 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2558 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3644 msgid "(hidden)" msgstr "(隐藏)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1981 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2548 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3107 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1984 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2559 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3118 msgid "1 client" msgstr "1 个客户端" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3444 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3455 msgid "1 connected" msgstr "已连接 1 个" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2579 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3443 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2590 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3454 msgid "1 device" msgstr "1 台设备" @@ -410,7 +410,7 @@ msgstr "1 台设备" msgid "1 older device (Wi-Fi 4 or earlier) slows airtime" msgstr "1 台旧设备(Wi-Fi 4 或更早)占用更多空口时间" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3099 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3110 msgid "1 radio" msgstr "1 个射频" @@ -438,20 +438,20 @@ msgstr "6 GHz" msgid "60 GHz" msgstr "60 GHz" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3307 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3318 msgid "Active" msgstr "活跃" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3826 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3858 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3837 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3869 msgid "Address type" msgstr "地址类型" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4110 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4121 msgid "Addresses" msgstr "地址" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3147 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3158 msgid "Airtime" msgstr "空口时间" @@ -460,8 +460,8 @@ msgctxt "vantage" msgid "Alias" msgstr "别名" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3298 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3304 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3309 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3315 msgid "All" msgstr "全部" @@ -490,7 +490,7 @@ msgstr "B" msgid "Busiest radio: %s of Wi-Fi traffic" msgstr "最繁忙射频:占 Wi-Fi 流量的 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2764 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2775 msgid "Busy share of each CPU core" msgstr "每个 CPU 核心的繁忙占比" @@ -505,8 +505,8 @@ msgstr[0] "繁忙;负载 %s(%d 核);查看最繁忙进程" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:71 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:72 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2757 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4145 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2768 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4156 msgctxt "vantage" msgid "CPU" msgstr "CPU" @@ -515,78 +515,78 @@ msgstr "CPU" msgid "Cache (reclaimable)" msgstr "缓存(可回收)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3931 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3942 msgid "Cancel" msgstr "取消" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3809 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3820 msgctxt "vantage" msgid "Capabilities" msgstr "能力" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4102 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4113 msgid "Carrier" msgstr "链路状态" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4050 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4061 msgid "Centre frequency" msgstr "中心频率" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3138 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3149 msgid "Ch %d" msgstr "信道 %d" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2528 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3106 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2539 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3117 msgid "Ch %d · %d MHz" msgstr "信道 %d · %d MHz" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4043 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4054 msgid "Channel" msgstr "信道" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2528 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2539 msgid "Channel —" msgstr "信道 —" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3171 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3182 msgctxt "vantage" msgid "Clear filter" msgstr "清除筛选" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1508 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3144 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3189 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3190 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1511 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3155 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3200 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3201 msgid "Clients" msgstr "客户端" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4057 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4068 msgid "Clients on this radio" msgstr "此射频上的客户端" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3650 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3661 msgid "Close" msgstr "关闭" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3556 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3567 msgid "Connected" msgstr "已连接" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3526 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3537 msgid "Connected after you opened this page" msgstr "打开本页面后连接" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3815 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3826 msgid "Connected for" msgstr "已连接时长" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3812 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3843 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3823 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3854 msgid "Connection" msgstr "连接" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2791 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2802 msgid "Core %d: %s" msgstr "核心 %d:%s" @@ -594,23 +594,23 @@ msgstr "核心 %d:%s" msgid "Could not read the firewall configuration" msgstr "无法读取防火墙配置" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3914 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3925 msgid "Could not save the name (no permission or the device refused it)." msgstr "无法保存名称(无权限或设备拒绝)。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1708 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1711 msgid "Could not save this for every browser. Try again." msgstr "无法为所有浏览器保存此设置,请重试。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4001 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4012 msgid "Could not save this." msgstr "无法保存。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4118 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4129 msgid "Counters since boot" msgstr "自启动以来的计数器" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4055 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4066 msgid "Country" msgstr "国家" @@ -619,13 +619,13 @@ msgid "" "Custom rule files are configured (%s); rules in them are not listed here." msgstr "已配置自定义规则文件(%s);其中的规则不会在此列出。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1967 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1970 msgid "Customize" msgstr "自定义" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1775 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1776 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1966 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1778 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1779 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1969 msgid "Customize the dashboard" msgstr "自定义仪表盘" @@ -633,16 +633,16 @@ msgstr "自定义仪表盘" msgid "DHCP" msgstr "DHCP" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3871 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3882 msgid "DHCP hostname" msgstr "DHCP 主机名" #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:45 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4116 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4127 msgid "DNS" msgstr "DNS" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2459 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2470 msgid "DNS %s" msgstr "DNS %s" @@ -651,121 +651,121 @@ msgstr "DNS %s" msgid "Dashboard" msgstr "仪表盘" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3379 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3471 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4136 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3390 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3482 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4147 msgid "Device" msgstr "设备" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3898 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3909 msgid "Device name" msgstr "设备名" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3927 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3938 msgid "Device type" msgstr "设备类型" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3457 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3468 msgid "" "Devices on the Ethernet ports appear here once they send traffic; the bridge " "forgets quiet ones after about five minutes." msgstr "" "以太网端口上的设备发送流量后会显示在这里;网桥会在约五分钟无流量后忘记它们。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2529 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3108 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3133 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4048 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2540 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3119 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3144 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4059 msgid "Disabled" msgstr "已禁用" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3777 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3788 msgid "Disconnected %s; shown from the last sample." msgstr "断开于 %s;显示最后一次采样的数据。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3972 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3983 msgid "Don't warn about its signal" msgstr "不对其信号发出警告" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1790 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1793 msgctxt "vantage" msgid "Done" msgstr "完成" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:45 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2529 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3108 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3133 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4048 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2540 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3119 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3144 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4059 msgctxt "vantage" msgid "Down" msgstr "已下线" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2871 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2966 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3041 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2882 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2977 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3052 msgid "Download" msgstr "下载" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:445 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:448 msgid "Download (to clients)" msgstr "下载(到客户端)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3820 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3831 msgctxt "vantage" msgid "Downloaded" msgstr "已下载" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1852 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1855 msgid "" "Drag a tile by its handle or use its buttons. Done saves it for medium " "screens in every browser." msgstr "" "拖动卡片手柄或使用其按钮移动。点击“完成”后,中屏布局将保存到所有浏览器。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1853 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1856 msgid "" "Drag a tile by its handle or use its buttons. Done saves it for narrow " "screens in every browser." msgstr "" "拖动卡片手柄或使用其按钮移动。点击“完成”后,窄屏布局将保存到所有浏览器。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1851 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1854 msgid "" "Drag a tile by its handle or use its buttons. Done saves it for wide screens " "in every browser." msgstr "" "拖动卡片手柄或使用其按钮移动。点击“完成”后,宽屏布局将保存到所有浏览器。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1852 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1855 msgid "" "Drag a tile by its handle or use its buttons. Saved in this browser for " "medium screens." msgstr "拖动卡片手柄或使用其按钮移动。中屏布局保存在此浏览器中。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1853 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1856 msgid "" "Drag a tile by its handle or use its buttons. Saved in this browser for " "narrow screens." msgstr "拖动卡片手柄或使用其按钮移动。窄屏布局保存在此浏览器中。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1851 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1854 msgid "" "Drag a tile by its handle or use its buttons. Saved in this browser for wide " "screens." msgstr "拖动卡片手柄或使用其按钮移动。宽屏布局保存在此浏览器中。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1803 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1806 msgid "Drag to move" msgstr "拖动以移动" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4121 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4132 msgctxt "vantage" msgid "Dropped" msgstr "已丢弃" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3612 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3623 msgid "Edit" msgstr "编辑" @@ -773,7 +773,7 @@ msgstr "编辑" msgid "Enhanced Open (OWE)" msgstr "增强开放 (OWE)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2130 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2133 msgid "Error" msgstr "错误" @@ -791,8 +791,8 @@ msgctxt "vantage" msgid "Excellent" msgstr "极好" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3550 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3561 msgid "Experience" msgstr "体验" @@ -810,20 +810,20 @@ msgstr "信号一般" msgid "Fair signal %s; lower rates at range" msgstr "信号一般 %s;远距离速率较低" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3168 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3369 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3179 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3380 msgid "Filter by name, address, SSID…" msgstr "按名称、地址、SSID…筛选" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3369 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3380 msgid "Filter by name, address, port…" msgstr "按名称、地址、端口…筛选" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3169 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3180 msgid "Filter clients" msgstr "筛选客户端" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4139 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4150 msgctxt "vantage" msgid "Firmware" msgstr "固件" @@ -836,7 +836,7 @@ msgstr "从 %s 转发到 %s" msgid "Forwarding is accepted by default" msgstr "默认接受转发" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3822 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3833 msgid "Frames to device" msgstr "发往设备的帧" @@ -845,15 +845,15 @@ msgctxt "vantage" msgid "Free" msgstr "空闲" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3807 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3818 msgid "From device" msgstr "来自设备" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3539 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3550 msgid "From device: %s" msgstr "来自设备:%s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4097 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4108 msgid "From network" msgstr "来自网络" @@ -863,9 +863,9 @@ msgid "" "files are not shown." msgstr "内容来自防火墙配置。由 UPnP 或自定义规则文件开放的端口不会显示。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2457 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3491 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4113 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2468 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3502 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4124 msgid "Gateway" msgstr "网关" @@ -878,7 +878,7 @@ msgstr "Gbit/s" msgid "General Settings" msgstr "基本设置" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3808 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3819 msgctxt "vantage" msgid "Generation" msgstr "代际" @@ -888,13 +888,13 @@ msgctxt "vantage" msgid "GiB" msgstr "GiB" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3826 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3858 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3837 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3869 msgid "Globally unique" msgstr "全局唯一" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3826 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3858 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3837 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3869 msgid "Globally unique · %s" msgstr "全局唯一 · %s" @@ -912,7 +912,7 @@ msgstr "信号良好" msgid "Good signal %s" msgstr "信号良好 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1736 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1739 msgid "Grid" msgstr "网格" @@ -928,36 +928,36 @@ msgstr "HTTPS(端口 443)" msgid "Half duplex" msgstr "半双工" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1371 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1374 msgctxt "vantage" msgid "Health checks" msgstr "健康检查" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1868 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3633 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1871 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3644 msgctxt "vantage" msgid "Hidden" msgstr "隐藏" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1830 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1833 msgid "Hide %s" msgstr "隐藏 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3827 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3859 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3838 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3870 msgid "IP addresses" msgstr "IP 地址" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4111 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4122 msgid "IPv4" msgstr "IPv4" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4112 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4123 msgid "IPv6" msgstr "IPv6" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3824 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3856 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3835 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3867 msgid "Identity" msgstr "身份" @@ -965,7 +965,7 @@ msgstr "身份" msgid "In no zone: the default policies apply." msgstr "不属于任何区域:适用默认策略。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4108 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4119 msgid "In the tunnel" msgstr "隧道内" @@ -979,21 +979,21 @@ msgctxt "vantage" msgid "Input" msgstr "入站数据" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2507 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2518 msgid "Interface" msgstr "接口" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4105 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4116 msgid "Interface up for" msgstr "接口已启用时长" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3841 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4083 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4095 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3852 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4094 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4106 msgid "Interfaces" msgstr "接口" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2457 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2468 msgid "Internet" msgstr "互联网" @@ -1023,15 +1023,15 @@ msgstr "" "它将来自互联网上任何地址的 %s 转发到 %s。无法读取接口列表,因此本页无法判断该" "地址是否为路由器本身。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3965 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3976 msgid "Its weak signal is left out of the warnings." msgstr "其弱信号不计入警告。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4140 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4151 msgid "Kernel" msgstr "内核" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2843 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2854 msgid "Kernel %s" msgstr "内核 %s" @@ -1040,58 +1040,58 @@ msgctxt "vantage" msgid "KiB" msgstr "KiB" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3183 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3194 msgid "Kind of client" msgstr "客户端类型" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3816 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3827 msgctxt "vantage" msgid "Last activity" msgstr "最后活动" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3380 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3515 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3854 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3391 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3526 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3865 msgid "Last heard" msgstr "最后活动" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1788 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1791 msgid "Layout reset" msgstr "布局已重置" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3525 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3536 msgid "Left %s" msgstr "离开于 %s" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:180 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3527 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3538 msgctxt "vantage" msgid "Legacy" msgstr "旧版" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3379 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3495 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3805 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3845 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4101 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3390 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3506 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3816 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3856 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4112 msgctxt "vantage" msgid "Link" msgstr "链路" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3538 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3549 msgid "Link rate" msgstr "链路速率" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2003 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3379 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3506 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3543 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2006 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3390 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3517 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3554 msgid "Live" msgstr "实时" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4144 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4155 msgid "Load" msgstr "负载" @@ -1105,24 +1105,24 @@ msgid "Load %s · %d core" msgid_plural "Load %s · %d cores" msgstr[0] "负载 %s · %d 核" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4146 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4157 msgctxt "vantage" msgid "Load average" msgstr "平均负载" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2745 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2756 msgid "Load average over 1, 5 and 15 minutes" msgstr "1、5、15 分钟平均负载" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2781 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2792 msgid "Load avg %s" msgstr "平均负载 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4142 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4153 msgid "Local time" msgstr "本地时间" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1667 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1670 msgid "Log in again to save this for every browser." msgstr "重新登录后即可为所有浏览器保存此设置。" @@ -1138,8 +1138,8 @@ msgstr "链路速率低于信号预期" msgid "MAC" msgstr "MAC" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3825 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3857 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3836 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3868 msgid "MAC address" msgstr "MAC 地址" @@ -1147,11 +1147,11 @@ msgstr "MAC 地址" msgid "MCS %d" msgstr "MCS %d" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1823 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1826 msgid "Make %s narrower" msgstr "使 %s 变窄" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1826 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1829 msgid "Make %s wider" msgstr "使 %s 加宽" @@ -1168,11 +1168,11 @@ msgid "Measuring…" msgstr "测量中…" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:83 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2768 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2779 msgid "Memory" msgstr "内存" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4147 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4158 msgid "Memory in use" msgstr "已用内存" @@ -1181,63 +1181,63 @@ msgctxt "vantage" msgid "MiB" msgstr "MiB" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1722 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1725 msgid "Mirrored" msgstr "镜像" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1723 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1726 msgid "Mirrored, scale per direction" msgstr "镜像,每个方向单独刻度" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4049 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4060 msgid "Mode" msgstr "模式" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4137 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4148 msgid "Model" msgstr "型号" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1820 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1823 msgid "Move %s down" msgstr "下移 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1811 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1814 msgid "Move %s left" msgstr "左移 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1814 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1817 msgid "Move %s right" msgstr "右移 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1817 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1820 msgid "Move %s up" msgstr "上移 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1803 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1806 msgid "Move %s: drag, or use the arrow keys" msgstr "移动 %s:拖动或使用方向键" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3926 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3937 msgid "Name" msgstr "名称" #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:138 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4021 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4032 msgid "Name contains invisible or control characters" msgstr "名称包含不可见或控制字符" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3828 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3860 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3839 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3871 msgid "Name from" msgstr "名称来源" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3476 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3487 msgid "Name from: %s" msgstr "名称来源:%s" #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:136 #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:141 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4022 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4033 msgid "Name is longer than %d characters" msgstr "名称超过 %d 个字符" @@ -1245,27 +1245,27 @@ msgstr "名称超过 %d 个字符" msgid "Name must be text" msgstr "名称必须是文本" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3768 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3838 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3779 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3849 msgid "Name this device" msgstr "命名此设备" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3379 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3505 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3535 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3813 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3853 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3390 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3516 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3546 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3824 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3864 msgid "Network" msgstr "网络" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1508 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2244 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2245 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1511 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2255 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2256 msgid "Network path" msgstr "网络路径" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1741 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1744 msgid "Network path background" msgstr "网络路径背景" @@ -1273,13 +1273,13 @@ msgstr "网络路径背景" msgid "Networks: %s" msgstr "网络:%s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3309 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3526 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3320 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3537 msgctxt "vantage" msgid "New" msgstr "新增" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2404 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2415 msgid "No SSIDs" msgstr "无 SSID" @@ -1287,24 +1287,24 @@ msgstr "无 SSID" msgid "No clients" msgstr "无客户端" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3459 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4062 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3470 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4073 msgid "No clients connected" msgstr "无客户端连接" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3587 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3598 msgid "No clients connected." msgstr "没有客户端连接。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3450 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3461 msgid "No clients in this view" msgstr "此视图中没有客户端" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3450 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3461 msgid "No clients match “%s”" msgstr "没有匹配“%s”的客户端" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2458 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2469 msgctxt "vantage" msgid "No default route" msgstr "无默认路由" @@ -1313,7 +1313,7 @@ msgstr "无默认路由" msgid "No interface with a route" msgstr "没有带路由的接口" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4087 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4098 msgid "No interface with a route is up." msgstr "没有带路由的接口处于启用状态。" @@ -1322,7 +1322,7 @@ msgid "No internet-facing zone found" msgstr "未找到面向互联网的区域" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:47 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4102 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4113 msgid "No link" msgstr "无链路" @@ -1330,7 +1330,7 @@ msgstr "无链路" msgid "No network interface with a route is up" msgstr "没有带路由的网络接口处于启用状态" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2385 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2396 msgid "No other interfaces are up" msgstr "没有其他接口处于启用状态" @@ -1340,7 +1340,7 @@ msgid "No problems detected" msgstr "未检测到问题" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:105 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2408 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2419 msgid "No radios reported" msgstr "未报告射频" @@ -1361,16 +1361,16 @@ msgstr "当前没有站点关联" msgid "No warnings asked for" msgstr "已设为不警告" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3456 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3467 msgid "No wired devices heard" msgstr "未发现有线设备" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3621 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3632 msgctxt "vantage" msgid "No wireless networks configured." msgstr "未配置无线网络。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3113 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3124 msgid "No wireless radios are reported by this device." msgstr "此设备未报告任何无线射频。" @@ -1387,39 +1387,39 @@ msgstr "" msgid "No zones are configured." msgstr "尚未配置区域。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3587 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3598 msgid "Nobody is moving data right now." msgstr "当前没有设备在传输数据。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3146 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3157 msgid "Noise" msgstr "噪声" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3810 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3821 msgid "Noise / SNR" msgstr "噪声 / 信噪比" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4053 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4054 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4064 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4065 msgid "Noise floor" msgstr "底噪" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:105 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1736 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1739 msgid "None" msgstr "无" #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:154 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4020 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4031 msgid "Not a station MAC address" msgstr "不是站点 MAC 地址" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3752 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3763 msgid "Not connected" msgstr "未连接" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3507 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3850 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3518 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3861 msgid "Not counted per device on a shared port" msgstr "共用端口不按设备统计" @@ -1427,7 +1427,7 @@ msgstr "共用端口不按设备统计" msgid "Not in effect" msgstr "未生效" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2818 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2829 msgid "Not reported" msgstr "未报告" @@ -1435,7 +1435,7 @@ msgstr "未报告" msgid "Not reported by the driver" msgstr "驱动未报告" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3874 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3885 msgid "Nothing better known" msgstr "无更多信息" @@ -1456,7 +1456,7 @@ msgstr "OWE" msgid "Older %s device" msgstr "较旧的 %s 设备" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3527 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3538 msgid "Older Wi-Fi generation than the radio; uses more airtime" msgstr "比射频支持的 Wi-Fi 代际更旧;占用更多空口时间" @@ -1464,7 +1464,7 @@ msgstr "比射频支持的 Wi-Fi 代际更旧;占用更多空口时间" msgid "On this router" msgstr "在此路由器上" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 msgctxt "vantage" msgid "Online" msgstr "在线" @@ -1480,7 +1480,7 @@ msgctxt "vantage" msgid "Open" msgstr "开放" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3425 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3436 msgid "Open details of %s" msgstr "打开 %s 的详情" @@ -1496,7 +1496,7 @@ msgstr "对互联网开放:%d" msgid "Open network" msgstr "开放网络" -#: luci-app-vantage/htdocs/luci-static/resources/vantage/model.js:889 +#: luci-app-vantage/htdocs/luci-static/resources/vantage/model.js:890 msgid "OpenWrt device" msgstr "OpenWrt 设备" @@ -1508,11 +1508,11 @@ msgstr "" "基本设置中的选项 %s 的值被 firewall4 拒绝,因此不会加载新规则:无法确定开放了" "哪些内容。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1720 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1723 msgid "Overlaid" msgstr "叠加" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1721 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1724 msgid "Overlaid, log scale" msgstr "叠加,对数刻度" @@ -1520,15 +1520,15 @@ msgstr "叠加,对数刻度" msgid "Overview" msgstr "概览" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3809 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3820 msgid "PMF" msgstr "PMF" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2001 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2004 msgid "Paused" msgstr "已暂停" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2001 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2004 msgid "Paused while hidden" msgstr "页面隐藏时暂停" @@ -1544,7 +1544,7 @@ msgstr "" "Ping 和其他控制消息、组播、DHCP 续租以及转发到你网络的 IPsec:每台路由器都会" "放行的流量。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4138 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4149 msgctxt "vantage" msgid "Platform" msgstr "平台" @@ -1554,7 +1554,7 @@ msgctxt "vantage" msgid "Poor" msgstr "较差" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3844 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3855 msgid "Port" msgstr "端口" @@ -1562,11 +1562,11 @@ msgstr "端口" msgid "Port %d" msgstr "端口 %d" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3500 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3511 msgid "Port %s" msgstr "端口 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2572 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2583 msgid "Port total: %s" msgstr "端口合计:%s" @@ -1574,11 +1574,11 @@ msgstr "端口合计:%s" msgid "Private" msgstr "私有" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3826 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3837 msgid "Private Wi-Fi address (randomised by the device)" msgstr "私有 Wi-Fi 地址(设备随机化)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3858 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3869 msgid "Private address (randomised by the device)" msgstr "私有地址(设备随机化)" @@ -1586,26 +1586,26 @@ msgstr "私有地址(设备随机化)" msgid "Private device" msgstr "私有设备" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4135 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4146 msgid "Processes" msgstr "进程" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4104 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4115 msgid "Protocol" msgstr "协议" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3178 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3180 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3189 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3191 msgid "Quick filters" msgstr "快速筛选" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3814 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4047 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3825 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4058 msgctxt "vantage" msgid "Radio" msgstr "射频" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3134 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3145 msgid "Radio details" msgstr "射频详情" @@ -1617,66 +1617,66 @@ msgstr "射频已禁用" msgid "Radio is enabled but not up" msgstr "射频已启用但未上线" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3158 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4041 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3169 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4052 msgid "Radio settings" msgstr "射频设置" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1508 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3086 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3088 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1511 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3097 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3099 msgid "Radios" msgstr "射频" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2459 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2470 msgid "Reachability not probed" msgstr "未探测可达性" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3492 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3503 msgid "Reached through the uplink port %s, not connected to this device" msgstr "经由上行端口 %s 到达,并未连接到本设备" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4095 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4106 msgid "Realtime graphs" msgstr "实时图表" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4119 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4130 msgctxt "vantage" msgid "Received" msgstr "已接收" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2002 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2005 msgctxt "vantage" msgid "Reconnecting…" msgstr "重新连接中…" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3325 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3336 msgid "Remove filter: %s" msgstr "移除筛选:%s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3932 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3943 msgid "Remove name" msgstr "移除名称" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3768 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3838 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3779 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3849 msgctxt "vantage" msgid "Rename" msgstr "重命名" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1789 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1792 msgid "Reset" msgstr "重置" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3869 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3880 msgid "Reverse DNS of its address" msgstr "其地址的反向 DNS" -#: luci-app-vantage/htdocs/luci-static/resources/vantage/model.js:901 +#: luci-app-vantage/htdocs/luci-static/resources/vantage/model.js:902 msgid "Root (overlay)" msgstr "Root(overlay)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4115 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4126 msgid "Route metric" msgstr "路由跃点数" @@ -1688,20 +1688,20 @@ msgstr "路由器管理界面已开放:%s" msgid "SSH (port 22)" msgstr "SSH(端口 22)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3924 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3935 msgid "Save" msgstr "保存" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3817 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3828 msgid "Seen since" msgstr "首次出现" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4120 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4131 msgctxt "vantage" msgid "Sent" msgstr "已发送" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1724 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1727 msgid "Separate lanes" msgstr "分开显示" @@ -1709,48 +1709,48 @@ msgstr "分开显示" msgid "Settings to check" msgstr "待检查的设置" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3845 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3856 msgid "Shared by %d devices" msgstr "%d 台设备共用" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3496 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3507 msgid "Shared port" msgstr "共用端口" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1870 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1873 msgid "Show %s" msgstr "显示 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3451 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3462 msgid "Show all clients" msgstr "显示全部客户端" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2754 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2765 msgid "Show or hide system details" msgstr "显示/隐藏系统详情" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2245 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2256 msgid "Show or hide the network path" msgstr "显示/隐藏网络路径" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3089 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3100 msgid "Show or hide the radio details" msgstr "显示/隐藏射频详情" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2874 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2885 msgid "Show or hide the throughput chart" msgstr "显示/隐藏吞吐量图表" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3612 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3623 msgid "Show or hide the wireless networks" msgstr "显示/隐藏无线网络" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2546 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3630 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2557 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3641 msgid "Show the clients of %s" msgstr "显示 %s 的客户端" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2572 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2583 msgid "Show the devices on %s" msgstr "显示 %s 上的设备" @@ -1758,9 +1758,9 @@ msgstr "显示 %s 上的设备" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:124 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:132 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:134 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3381 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3532 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3793 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3392 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3543 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3804 msgid "Signal" msgstr "信号强度" @@ -1768,7 +1768,7 @@ msgstr "信号强度" msgid "Signal not reported" msgstr "未报告信号" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4103 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4114 msgctxt "vantage" msgid "Speed" msgstr "速率" @@ -1778,24 +1778,24 @@ msgid "Standard housekeeping: %d rule" msgid_plural "Standard housekeeping: %d rules" msgstr[0] "标准常规规则:%d 条" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1736 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1739 msgid "Starfield" msgstr "星空" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3460 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3471 msgid "Stations appear here as soon as they associate with one of the SSIDs." msgstr "站点一旦关联到任一 SSID 便会显示在这里。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4048 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4059 msgid "Status" msgstr "状态" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:93 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2771 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2782 msgid "Storage" msgstr "存储" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3933 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3944 msgid "Stored on this device in /etc/config/vantage" msgstr "保存在本设备 /etc/config/vantage 中" @@ -1811,16 +1811,16 @@ msgstr "信号强 %s,链路 %s" msgid "Strong signal, %s" msgstr "信号强,%s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2828 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2839 msgctxt "vantage" msgid "Swap" msgstr "交换分区" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3848 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3859 msgid "Switch ports" msgstr "交换机端口" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:458 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:461 msgid "Switch ports of VLAN %d on %s: %s" msgstr "VLAN %d(%s)的交换机端口:%s" @@ -1828,13 +1828,13 @@ msgstr "VLAN %d(%s)的交换机端口:%s" msgid "Switched off" msgstr "已关闭" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1509 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2753 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2754 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1512 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2764 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2765 msgid "System" msgstr "系统" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4135 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4146 msgid "System settings" msgstr "系统设置" @@ -1847,19 +1847,19 @@ msgid "Telnet (port 23)" msgstr "Telnet(端口 23)" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:76 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2785 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2796 msgid "Temperature %s" msgstr "温度 %s" -#: luci-app-vantage/htdocs/luci-static/resources/vantage/model.js:901 +#: luci-app-vantage/htdocs/luci-static/resources/vantage/model.js:902 msgid "Temporary (RAM)" msgstr "临时(RAM)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3380 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3391 msgid "The bridge forgets a device after about five minutes without traffic" msgstr "设备约五分钟无流量后,网桥会将其遗忘" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3454 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3465 msgid "" "The bridges have learned so many addresses that listing them here would " "strain this device." @@ -1874,8 +1874,8 @@ msgstr "" "该处适用默认入站数据策略且为接受,因此互联网上的任何主机都能访问路由器本身。" "请将其加入 wan 区域,或在基本设置中将入站数据设为拒绝。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3996 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4025 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4007 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4036 msgid "The device could not write /etc/config/vantage." msgstr "设备无法写入 /etc/config/vantage。" @@ -1901,7 +1901,7 @@ msgstr "" "无法读取接口列表,且默认入站数据策略为接受:不属于任何区域的上行接口将会开" "放。请在基本设置中将入站数据设为拒绝。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3872 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3883 msgid "The name the device announces (WPS)" msgstr "设备广播的名称(WPS)" @@ -1913,7 +1913,7 @@ msgstr "唯一已测客户端高于 %s" msgid "The only measured client" msgstr "唯一已测客户端" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3491 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3502 msgid "The router this device sends its traffic to" msgstr "此设备发送流量所经的路由器" @@ -1929,7 +1929,7 @@ msgstr "保存的名称包含无效的配置节 ID" msgid "The uplinks could not be checked" msgstr "无法检查上行接口" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2474 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2485 msgid "This access point" msgstr "此接入点" @@ -1937,15 +1937,15 @@ msgstr "此接入点" msgid "This address family is in no zone: the default policies apply." msgstr "此地址族不属于任何区域:适用默认策略。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2474 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2485 msgid "This device" msgstr "此设备" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3995 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4006 msgid "This device already keeps %d of these; turn some off first." msgstr "此设备已保存 %d 项此类设置,请先关闭一些。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4024 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4035 msgid "This device already stores %d names; remove some first." msgstr "此设备已存储 %d 个名称;请先移除部分。" @@ -1953,7 +1953,7 @@ msgstr "此设备已存储 %d 个名称;请先移除部分。" msgid "This device reports no radios" msgstr "此设备未报告任何射频" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4084 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4095 msgid "This line is down or has no default route now." msgstr "此线路已断开,或当前没有默认路由。" @@ -1963,7 +1963,7 @@ msgid "" "the firewall pages." msgstr "本页无法判断开放了哪些内容。请重新加载;如果仍无效,请检查防火墙页面。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4032 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4043 msgid "This radio is not reported any more." msgstr "驱动不再报告此射频。" @@ -1971,23 +1971,23 @@ msgstr "驱动不再报告此射频。" msgid "This setup is beyond what this overview checks" msgstr "此配置超出本概览的检查范围" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3752 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3763 msgid "This station is not associated right now." msgstr "此站点当前未关联。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1508 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2866 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2868 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3799 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1511 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2877 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2879 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3810 msgctxt "vantage" msgid "Throughput" msgstr "吞吐量" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1729 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1732 msgid "Throughput chart" msgstr "吞吐量图表" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2859 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2870 msgid "Throughput per link; arrow keys read the values over time" msgstr "每条链路的吞吐量;方向键可查看历史值" @@ -1996,38 +1996,38 @@ msgctxt "vantage" msgid "TiB" msgstr "TiB" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3806 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3817 msgid "To device" msgstr "到设备" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3512 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3547 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3600 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3523 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3558 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3611 msgid "To device %s, from device %s" msgstr "到设备 %s,来自设备 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3539 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3550 msgid "To device: %s" msgstr "到设备:%s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4098 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4109 msgid "To network" msgstr "发往网络" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3453 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3464 msgid "Too many devices to list" msgstr "设备过多,无法列出" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1509 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3564 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3565 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1512 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3575 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3576 msgctxt "vantage" msgid "Top talkers" msgstr "流量大户" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3819 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3849 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4044 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3830 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3860 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4055 msgid "Traffic" msgstr "流量" @@ -2045,16 +2045,16 @@ msgstr "" "未被任何转发覆盖的互联网流量仍会到达你的其他网络。请在基本设置中将转发设为拒" "绝。" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2470 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2481 msgid "Traffic to the internet goes through %s, a tunnel over this line" msgstr "去往互联网的流量经过 %s,一条在此线路上运行的隧道" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4107 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4118 msgid "Tunnel" msgstr "隧道" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3145 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4051 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3156 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4062 msgid "Tx power" msgstr "发射功率" @@ -2066,16 +2066,16 @@ msgstr "" "已安装 UPnP:它运行时,你网络中的设备可以自行开放端口,这些端口不会在此列出。" #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:289 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3751 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3762 msgctxt "vantage" msgid "Unknown device" msgstr "未知设备" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4023 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4034 msgid "Unknown device type" msgstr "未知设备类型" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4032 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4043 msgid "Unknown radio" msgstr "未知射频" @@ -2090,14 +2090,14 @@ msgid "Unnamed rule" msgstr "未命名的规则" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:57 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3133 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4048 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4102 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3144 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4059 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4113 msgctxt "vantage" msgid "Up" msgstr "已上线" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2778 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2789 msgid "Up %s" msgstr "已运行 %s" @@ -2106,47 +2106,47 @@ msgstr "已运行 %s" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:49 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:51 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:57 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2892 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4087 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2903 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4098 msgctxt "vantage" msgid "Uplink" msgstr "上行链路" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2892 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2893 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2903 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2904 msgid "Uplink %s" msgstr "上行链路 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4080 #: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4091 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4102 msgid "Uplink · %s" msgstr "上行链路 · %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2872 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2968 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3042 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2883 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2979 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3053 msgid "Upload" msgstr "上传" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:446 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:449 msgid "Upload (from clients)" msgstr "上传(来自客户端)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3821 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3832 msgctxt "vantage" msgid "Uploaded" msgstr "已上传" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3492 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3503 msgid "Upstream" msgstr "上游" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4141 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4152 msgid "Uptime" msgstr "运行时间" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3493 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3853 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3504 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3864 msgid "VLAN %d" msgstr "VLAN %d" @@ -2175,15 +2175,18 @@ msgid "" "wireless), its temperature sensors (luci.vantage thermal), the wired hosts " "its bridges have learned (luci.vantage wired: MAC, port and when last heard, " "and which switch ports a port's VLAN has), the link state of those switch " -"ports (luci getSwconfigPortState) and the default route the kernel takes to " -"the internet (luci.vantage routes: family, device and metric, no gateways)" +"ports (luci getSwconfigPortState), the default route the kernel takes to the " +"internet (luci.vantage routes: family, device and metric, no gateways) and " +"each radio's noise floor (luci.vantage survey: the channel survey read " +"through nl80211)" msgstr "" "Vantage 仪表盘:设备、上行链路、射频与站点的只读状态(经 luci.vantage " "wireless 读取无线配置,不含密钥),温度传感器(luci.vantage thermal),网桥已" "学习到的有线主机(luci.vantage wired:MAC、端口、最后一次收到的时间,以及某端" "口的 VLAN 包含哪些交换机端口),这些交换机端口的链路状态(luci " -"getSwconfigPortState),以及内核去往互联网所走的默认路由(luci.vantage " -"routes:协议族、设备和跃点数,不含网关)" +"getSwconfigPortState),内核去往互联网所走的默认路由(luci.vantage routes:协" +"议族、设备和跃点数,不含网关),以及各射频的底噪(luci.vantage survey:经 " +"nl80211 读取的信道勘测)" #: luci-app-vantage/htdocs/luci-static/resources/vantage/names.js:46 msgid "Vendor" @@ -2293,11 +2296,11 @@ msgstr "WPA3 个人版" msgid "WPS" msgstr "WPS" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3829 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3840 msgid "WPS device name" msgstr "WPS 设备名称" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2130 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2133 msgid "Warning" msgstr "警告" @@ -2311,7 +2314,7 @@ msgid "Weak" msgstr "弱" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:163 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3308 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3319 msgid "Weak signal" msgstr "信号弱" @@ -2334,27 +2337,27 @@ msgstr "开放内容取决于 firewall4 如何处理 %s,本页无法跟踪。 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:106 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:110 #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:112 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3362 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3373 msgid "Wi-Fi" msgstr "Wi-Fi" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2416 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3362 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2427 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3373 msgid "Wired" msgstr "有线" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1509 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3611 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3612 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:1512 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3622 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3623 msgctxt "vantage" msgid "Wireless networks" msgstr "无线网络" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3778 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3789 msgid "Wireless settings" msgstr "无线设置" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3868 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3879 msgid "Your name for this device" msgstr "你为此设备设置的名称" @@ -2392,15 +2395,15 @@ msgstr "任意区域" msgid "any zone (default policy)" msgstr "任意区域(默认策略)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3139 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3150 msgid "auto" msgstr "自动" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3817 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3828 msgid "before this page opened" msgstr "打开本页之前" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3846 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3857 msgid "behind %s, VLAN %d" msgstr "位于 %s 之后,VLAN %d" @@ -2409,16 +2412,16 @@ msgctxt "vantage" msgid "bit/s" msgstr "bit/s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3000 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3011 msgid "collecting · %s of data" msgstr "采集中 · 已采集 %s 数据" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3000 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3011 msgid "collecting · first samples" msgstr "采集中 · 首个样本" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:319 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2980 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:322 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2991 msgid "collecting…" msgstr "采集中…" @@ -2430,18 +2433,18 @@ msgstr "自定义规则文件" msgid "dBm" msgstr "dBm" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2334 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2472 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2345 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2483 msgid "default route" msgstr "默认路由" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2472 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2483 msgid "default route via %s" msgstr "默认路由经由 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:453 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3496 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3845 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:456 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3507 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3856 msgid "down" msgstr "已断开" @@ -2450,7 +2453,7 @@ msgctxt "vantage" msgid "drop" msgstr "丢弃" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3898 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3909 msgctxt "vantage" msgid "e.g. Living room TV" msgstr "例如:客厅电视" @@ -2489,8 +2492,8 @@ msgid "half duplex" msgstr "半双工" #: luci-app-vantage/htdocs/luci-static/resources/vantage/fmt.js:62 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2492 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3638 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2503 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3649 msgid "idle" msgstr "空闲" @@ -2532,18 +2535,18 @@ msgctxt "vantage" msgid "kbit/s" msgstr "kbit/s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2763 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2999 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2774 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3010 msgid "last 5 min" msgstr "最近 5 分钟" #: luci-app-vantage/htdocs/luci-static/resources/vantage/insight.js:181 #: luci-app-vantage/htdocs/luci-static/resources/vantage/wifi.js:104 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3541 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3552 msgid "legacy" msgstr "旧版" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:453 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:456 msgid "link up" msgstr "已连接" @@ -2551,45 +2554,45 @@ msgstr "已连接" msgid "mDNS" msgstr "mDNS" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3870 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3881 msgid "mDNS announcement" msgstr "mDNS 广播" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3801 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3852 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3812 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3863 msgid "measuring" msgstr "测量中" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2975 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2986 msgid "measuring…" msgstr "测量中…" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2956 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2967 msgctxt "vantage" msgid "no data" msgstr "无数据" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2465 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2476 msgid "no uplink" msgstr "无上行链路" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3827 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3838 msgid "not known to this AP" msgstr "此 AP 未识别" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3859 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3870 msgid "not known to this device" msgstr "此设备未识别" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4054 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4065 msgid "not reported (driver placeholder %s)" msgstr "未报告(驱动占位值 %s)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3810 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3821 msgid "not reported by the driver" msgstr "驱动未报告" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2996 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3007 msgctxt "vantage" msgid "now" msgstr "现在" @@ -2598,16 +2601,16 @@ msgstr "现在" msgid "now %s down, %s up" msgstr "当前下行 %s,上行 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3808 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3819 msgid "older than the radio (%s)" msgstr "比射频支持的标准更旧(%s)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2973 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2984 msgctxt "vantage" msgid "peak" msgstr "峰值" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2764 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2775 msgid "per core" msgstr "每核" @@ -2616,11 +2619,11 @@ msgctxt "vantage" msgid "port forward" msgstr "端口转发" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3795 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3806 msgid "range %s … %s" msgstr "范围 %s … %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4097 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4108 msgid "received on %s" msgstr "在 %s 上接收" @@ -2633,7 +2636,7 @@ msgstr "拒绝" msgid "router port %s" msgstr "路由器端口 %s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4098 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:4109 msgid "sent on %s" msgstr "在 %s 上发送" @@ -2641,12 +2644,12 @@ msgstr "在 %s 上发送" msgid "short GI" msgstr "短 GI" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3515 -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3854 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3526 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3865 msgid "static entry" msgstr "静态条目" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3847 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3858 msgid "switch port %s" msgstr "交换机端口 %s" @@ -2658,11 +2661,11 @@ msgstr "已关闭" msgid "the covered subnets of zone %s" msgstr "区域 %s 覆盖的子网" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3851 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3862 msgid "the port in total: %s" msgstr "该端口合计:%s" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3846 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3857 msgid "the port: %s" msgstr "端口:%s" @@ -2678,7 +2681,7 @@ msgstr "此路由器" msgid "traffic rule" msgstr "通信规则" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2477 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2488 msgid "up %s" msgstr "已运行 %s" @@ -2695,10 +2698,27 @@ msgstr "区域转发" msgid "zones %s and %s if they share a device" msgstr "区域 %s 和 %s(若两者共用设备)" -#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:2993 +#: luci-app-vantage/htdocs/luci-static/resources/view/vantage/overview.js:3004 msgid "−%d min" msgstr "−%d 分钟" +#~ msgid "" +#~ "Vantage dashboard: read-only status of the device, uplink, radios and " +#~ "stations (wireless configuration without keys, through luci.vantage " +#~ "wireless), its temperature sensors (luci.vantage thermal), the wired " +#~ "hosts its bridges have learned (luci.vantage wired: MAC, port and when " +#~ "last heard, and which switch ports a port's VLAN has), the link state of " +#~ "those switch ports (luci getSwconfigPortState) and the default route the " +#~ "kernel takes to the internet (luci.vantage routes: family, device and " +#~ "metric, no gateways)" +#~ msgstr "" +#~ "Vantage 仪表盘:设备、上行链路、射频与站点的只读状态(经 luci.vantage " +#~ "wireless 读取无线配置,不含密钥),温度传感器(luci.vantage thermal),网" +#~ "桥已学习到的有线主机(luci.vantage wired:MAC、端口、最后一次收到的时间," +#~ "以及某端口的 VLAN 包含哪些交换机端口),这些交换机端口的链路状态(luci " +#~ "getSwconfigPortState),以及内核去往互联网所走的默认路由(luci.vantage " +#~ "routes:协议族、设备和跃点数,不含网关)" + #~ msgid "Grid packets" #~ msgstr "网格数据包" diff --git a/luci-app-vantage/root/usr/share/rpcd/acl.d/luci-app-vantage.json b/luci-app-vantage/root/usr/share/rpcd/acl.d/luci-app-vantage.json index 98353039f..697138c86 100644 --- a/luci-app-vantage/root/usr/share/rpcd/acl.d/luci-app-vantage.json +++ b/luci-app-vantage/root/usr/share/rpcd/acl.d/luci-app-vantage.json @@ -1,6 +1,6 @@ { "luci-app-vantage": { - "description": "Vantage dashboard: read-only status of the device, uplink, radios and stations (wireless configuration without keys, through luci.vantage wireless), its temperature sensors (luci.vantage thermal), the wired hosts its bridges have learned (luci.vantage wired: MAC, port and when last heard, and which switch ports a port's VLAN has), the link state of those switch ports (luci getSwconfigPortState) and the default route the kernel takes to the internet (luci.vantage routes: family, device and metric, no gateways)", + "description": "Vantage dashboard: read-only status of the device, uplink, radios and stations (wireless configuration without keys, through luci.vantage wireless), its temperature sensors (luci.vantage thermal), the wired hosts its bridges have learned (luci.vantage wired: MAC, port and when last heard, and which switch ports a port's VLAN has), the link state of those switch ports (luci getSwconfigPortState), the default route the kernel takes to the internet (luci.vantage routes: family, device and metric, no gateways) and each radio's noise floor (luci.vantage survey: the channel survey read through nl80211)", "read": { "file": { "/proc/stat": [ "read" ] @@ -12,8 +12,8 @@ "network.device": [ "status" ], "luci-rpc": [ "getHostHints" ], "luci": [ "getSwconfigPortState" ], - "luci.vantage": [ "routes", "thermal", "wired", "wireless" ], - "iwinfo": [ "assoclist", "info", "survey" ], + "luci.vantage": [ "routes", "survey", "thermal", "wired", "wireless" ], + "iwinfo": [ "assoclist", "info" ], "hostapd.*": [ "get_clients", "get_status" ], "umdns": [ "hosts" ], "uci": [ "get" ] diff --git a/luci-app-vantage/root/usr/share/rpcd/ucode/luci.vantage b/luci-app-vantage/root/usr/share/rpcd/ucode/luci.vantage index 341b0b603..7bb785de4 100644 --- a/luci-app-vantage/root/usr/share/rpcd/ucode/luci.vantage +++ b/luci-app-vantage/root/usr/share/rpcd/ucode/luci.vantage @@ -43,6 +43,16 @@ // when a lookup could not be sent. One lookup a family, so // the work does not grow with the routing table. Read group // luci-app-vantage. +// survey { device }: the channel survey of one Wi-Fi interface, for +// the noise floor: { mhz, noise } (dBm) for each channel the +// driver gives a noise value, at most MAX_SURVEY: one +// read-only NL80211 survey dump. Not through rpcd's iwinfo +// survey: libiwinfo has a survey for its NL80211 backend +// only, and for any other (the MediaTek mtwifi backend of +// the mt798x builds) rpcd calls the missing function and +// dies (#124). Only an interface that cfg80211 drives (a +// phy80211 link in sysfs) is asked; any other device: no +// channels. Read group luci-app-vantage. // set_alias { mac, name, icon }: name one station, or remove its name // with name ''. Validated here, whatever the browser did, and // written to /etc/config/vantage only. Write group @@ -60,8 +70,9 @@ import { cursor } from 'uci'; import { connect } from 'ubus'; -import { lsdir, readfile } from 'fs'; +import { access, lsdir, readfile } from 'fs'; import * as rtnl from 'rtnl'; +import * as nl80211 from 'nl80211'; const CONFIG = 'vantage'; const WIRELESS = 'wireless'; // read only, by wireless_from_config() @@ -85,11 +96,13 @@ const NETWORK = 'network'; // read only, by switches(): switch_vlan secti const BOARD = '/etc/board.json'; const BOARD_MAX = 65536; // bytes read of it const MAX_SWITCH_VLANS = 64; +const MAX_SURVEY = 256; // channels in a survey reply (a tri-band wiphy has about 100) +const MAX_MHZ = 100000; // a channel's frequency, MHz (60 GHz is 70200) // Patterns, compiled once: ucode compiles a regular expression literal each // time the code reaches it, and a counted repeat ({1,64}) costs musl // milliseconds to compile on a router (8.5 ms against 0.07 ms for the same -// test with the pattern compiled once, on an ARM access point). rpcd keeps +// test with the pattern compiled once, on an ARM Wi-Fi AP). rpcd keeps // this module loaded, these with it, between calls. const RE_MAC_COLON = /^[0-9a-f]{2}(:[0-9a-f]{2}){5}$/; const RE_MAC_DASH = /^[0-9a-f]{2}(-[0-9a-f]{2}){5}$/; @@ -683,6 +696,39 @@ function routes() { return out; } +/* ------------------------------------------------------------- survey */ + +// The channel survey of one Wi-Fi interface: [ { mhz, noise } ] for each +// channel the driver reports with a noise value (dBm, a signed byte as +// NL80211 carries it; 0 is "none"), at most MAX_SURVEY. Asked of the +// kernel only for an interface cfg80211 drives (its phy80211 link): any +// other device would be refused by the kernel anyway, and is not asked. +// The reply of a dump is an array of messages; null when it had none or +// failed, false when it was cut short. +function survey(dev) { + let out = []; + + if (!netdev(dev) || dev == '.' || dev == '..' || !access(NET + '/' + dev + '/phy80211')) + return out; + + let res = nl80211.request(nl80211.const.NL80211_CMD_GET_SURVEY, nl80211.const.NLM_F_DUMP, { dev }); + + for (let m in ((type(res) == 'array') ? res : ((type(res) == 'object') ? [ res ] : []))) { + let s = (type(m) == 'object' && type(m.survey_info) == 'object') ? m.survey_info : null; + let mhz = s?.frequency, noise = s?.noise; + + if (type(mhz) != 'int' || mhz <= 0 || mhz > MAX_MHZ || type(noise) != 'int' || noise == 0 || noise < -128 || noise > 127) + continue; + + push(out, { mhz, noise }); + + if (length(out) >= MAX_SURVEY) + break; + } + + return out; +} + // a switch port's number (0..63), or null function switch_port(v) { return (type(v) == 'int' && v >= 0 && v < 64) ? v : null; @@ -842,6 +888,13 @@ const methods = { } }, + survey: { + args: { device: 'device' }, + call: function(request) { + return { results: survey(request.args?.device) }; + } + }, + set_alias: { args: { mac: 'mac', name: 'name', icon: 'icon' }, call: function(request) { diff --git a/luci-theme-vantage/Makefile b/luci-theme-vantage/Makefile index db5b23b4e..6887da630 100644 --- a/luci-theme-vantage/Makefile +++ b/luci-theme-vantage/Makefile @@ -10,8 +10,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-theme-vantage -PKG_VERSION:=1.0.19 -PKG_RELEASE:=43 +PKG_VERSION:=1.0.20 +PKG_RELEASE:=44 PKG_LICENSE:=GPL-3.0-or-later LUCI_TITLE:=Vantage theme diff --git a/luci-theme-vantage/htdocs/luci-static/resources/menu-vantage.js b/luci-theme-vantage/htdocs/luci-static/resources/menu-vantage.js index 42feab8a1..5cea833ed 100644 --- a/luci-theme-vantage/htdocs/luci-static/resources/menu-vantage.js +++ b/luci-theme-vantage/htdocs/luci-static/resources/menu-vantage.js @@ -56,7 +56,7 @@ const MOTION_EVENT = 'vantage:tick'; key, also what the dashboard reads under another theme) counts until the router has one. */ /* this package's version, as its Makefile has it (tests/version.test.js) */ -const VERSION = '1.0.19'; +const VERSION = '1.0.20'; /* Check for updates (Appearance): when asked, never on its own, the browser reads the project's 24.10 package list on GitHub Pages (the same release as 25.12's), without cookies or a referrer. Only a version number passes; diff --git a/luci-theme-vantage/htdocs/luci-static/vantage/vantage.css b/luci-theme-vantage/htdocs/luci-static/vantage/vantage.css index f0c0c1d0d..9f8c097e2 100644 --- a/luci-theme-vantage/htdocs/luci-static/vantage/vantage.css +++ b/luci-theme-vantage/htdocs/luci-static/vantage/vantage.css @@ -1939,6 +1939,10 @@ div.right > .btn, div.right > .cbi-button, div.right > button { margin-left: 0; .ifacebadge img { width: 16px; height: 16px; } .ifacebadge.large { padding: 6px 10px; gap: 8px; font-size: var(--fs-base); } .ifacebadge.large img { width: 20px; height: 20px; } +/* a network's status (Wireless, its dialog): the signal beside the details + keeps one width, wide enough for "-100/-110 dBm", so the details do not + move as the reading changes (#122) */ +.ifacebadge.large > small:first-child { flex: none; min-width: 8.5em; text-align: center; } .ifacebadge-active { border-color: var(--accent-line); box-shadow: inset 0 0 0 1px var(--accent-line); } /* the device details tooltip (Interfaces): icon beside the details */ .cbi-tooltip.ifacebadge { display: inline-grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 10px; } @@ -2403,6 +2407,10 @@ body.modal-overlay-active #modal_overlay { display: block; } #view .cbi-section > .cbi-title:has(+ div > .table:first-child), #view > .cbi-section > h3:first-child:has(+ div > .table:first-child), #view .cbi-section:not(.cbi-tblsection, .cbi-section .cbi-section) > h3:first-child:has(+ .table) { margin-bottom: 0; } +/* a table section whose table starts with its rows, no column titles + (Network -> Wireless): the band read as a taller first row (#122). + LuCI 25.12 adds a thead only for titles; 24.10 puts rows in the table */ +#view .cbi-tblsection:not(.cbi-section .cbi-section) > h3:first-child:has(+ .table > :is(tbody, .tbody):first-child, + .table > .tr:first-child:not(.cbi-section-table-titles, .table-titles)) { margin-bottom: 0; } #view > h2:not(:first-child), #view > h3:not(:first-child) { margin-top: var(--sp-6); } .cbi-section > .table + h3, .cbi-section > .table + .cbi-title, .cbi-section > div + h3 { margin-top: var(--sp-6); } .includes { margin-top: var(--sp-4); } @@ -2757,18 +2765,23 @@ body[data-page="admin-statistics-graphs"] p.controls > .nowrap > .cbi-button { m /* Network -> Wireless: radios as group headers, networks as rows */ .td[data-name="_badge"] > .center { text-align: left; } +/* the space between items is each item's own margin, not a gap: a + hidden " | " is still a flex item, and a gap around it indented a line + that starts with one (a network's second line, #122) */ .td[data-name="_stat"] > div, .td[data-name="_stat"] > div > div { - display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 20px; + display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 0; font-size: 0; /* hides the " | " separators */ } .td[data-name="_stat"] > div > br, .td[data-name="_stat"] > div > div > br { display: none; } -.td[data-name="_stat"] .nowrap { display: inline-flex; align-items: baseline; gap: 6px; font-size: var(--fs-base); } +.td[data-name="_stat"] .nowrap { display: inline-flex; align-items: baseline; gap: 6px; margin-inline-end: 20px; font-size: var(--fs-base); } .td[data-name="_stat"] > div > big { flex-basis: 100%; font-size: var(--fs-md); } .td[data-name="_stat"] > div > div { flex-basis: 100%; } -.td[data-name="_stat"] > div > .nowrap:first-child { flex-basis: 100%; font-size: var(--fs-md); font-weight: 600; } +.td[data-name="_stat"] > div > .nowrap:first-child { flex-basis: 100%; margin-inline-end: 0; font-size: var(--fs-md); font-weight: 600; } .td[data-name="_stat"] > div > .nowrap:first-child > strong { display: none; } -.cbi-section-table-row:has(> .td[data-name="_stat"] big) > .td { background: var(--s2); border-top: 1px solid var(--line-2); } -.cbi-section-table-row:has(> .td[data-name="_stat"] big):first-child > .td { border-top: 0; } +.cbi-section-table-row:has(> .td[data-name="_stat"] big) > .td { background: var(--s2); } +/* the darker line above a radio is the row above's own bottom border: + a top border of its own stacked under it as a double line (#122) */ +.cbi-section-table-row:has(+ .cbi-section-table-row > .td[data-name="_stat"] big) > .td { border-bottom-color: var(--line-2); } .cbi-section-table-row:not(:has(big)) > .td[data-name="_badge"] { padding-left: calc(var(--card-px) + 16px); } /* progress bars (their text only exists in title): a thin track, the diff --git a/pcat-mgr/Makefile b/pcat-mgr/Makefile deleted file mode 100644 index 1fc534bef..000000000 --- a/pcat-mgr/Makefile +++ /dev/null @@ -1,49 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -# -# Copyright (C) 2025 ImmortalWrt.org - -include $(TOPDIR)/rules.mk - -PKG_NAME:=pcat-mgr -PKG_RELEASE:=4 - -PKG_SOURCE_PROTO:=git -PKG_SOURCE_URL:=https://gitlab.com/CoiaPrant/pcat-mgr.git -PKG_SOURCE_DATE:=2025-08-01 -PKG_SOURCE_VERSION:=754b4f0b783a44d48d91e2dbd6c1dfca667a3049 -PKG_MIRROR_HASH:=skip - -PKG_LICENSE:=GPL-3.0-or-later -PKG_LICENSE_FILES:=LICENSE -PKG_MAINTAINER:=Tianling Shen - -PKG_FLAGS:=nonshared -PKG_BUILD_DEPENDS:=golang/host -PKG_BUILD_PARALLEL:=1 -PKG_BUILD_FLAGS:=no-mips16 - -GO_PKG:=pcat-mgr - -include $(INCLUDE_DIR)/package.mk -include $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk - -define Package/pcat-mgr - SECTION:=utils - CATEGORY:=Utilities - TITLE:=Photonicat Manager (Go Edition) - URL:=https://gitlab.com/CoiaPrant/pcat-mgr - DEPENDS:=$(GO_ARCH_DEPENDS) @TARGET_rockchip_armv8 +fuse-utils - CONFLICTS:=pcat-manager -endef - -define Package/pcat-mgr/install - $(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR)) - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/pcat-mgr $(1)/usr/sbin/pcat-mgr - - $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_BIN) ./files/pcat-mgr.init $(1)/etc/init.d/pcat-mgr -endef - -$(eval $(call GoBinPackage,pcat-mgr)) -$(eval $(call BuildPackage,pcat-mgr)) diff --git a/pcat-mgr/files/pcat-mgr.init b/pcat-mgr/files/pcat-mgr.init deleted file mode 100644 index c5e6e4fba..000000000 --- a/pcat-mgr/files/pcat-mgr.init +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh /etc/rc.common - -START=45 -USE_PROCD=1 - -start_service() { - procd_open_instance - procd_set_param command /usr/sbin/pcat-mgr - procd_set_param respawn - procd_set_param stdout 1 - procd_set_param stderr 1 - procd_close_instance -}