summaryrefslogtreecommitdiffhomepage
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/cbi.js1397
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/firewall.js575
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/form.js1676
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/luci.js1420
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/network.js2139
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/promis.min.js5
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/rpc.js160
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/tools/prng.js93
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/tools/widgets.js315
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/uci.js540
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/ui.js2054
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/validation.js568
-rw-r--r--modules/luci-base/htdocs/luci-static/resources/xhr.js251
-rw-r--r--modules/luci-base/luasrc/cbi.lua12
-rw-r--r--modules/luci-base/luasrc/controller/admin/index.lua121
-rw-r--r--modules/luci-base/luasrc/controller/admin/uci.lua49
-rw-r--r--modules/luci-base/luasrc/dispatcher.lua9
-rw-r--r--modules/luci-base/luasrc/sys.lua12
-rw-r--r--modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua12
-rw-r--r--modules/luci-base/luasrc/view/admin_uci/changelog.htm66
-rw-r--r--modules/luci-base/luasrc/view/admin_uci/changes.htm45
-rw-r--r--modules/luci-base/luasrc/view/admin_uci/revert.htm33
-rw-r--r--modules/luci-base/luasrc/view/cbi/apply_widget.htm172
-rw-r--r--modules/luci-base/luasrc/view/cbi/cell_valueheader.htm2
-rw-r--r--modules/luci-base/luasrc/view/cbi/dropdown.htm69
-rw-r--r--modules/luci-base/luasrc/view/cbi/dynlist.htm21
-rw-r--r--modules/luci-base/luasrc/view/cbi/full_valueheader.htm2
-rw-r--r--modules/luci-base/luasrc/view/cbi/fvalue.htm18
-rw-r--r--modules/luci-base/luasrc/view/cbi/lvalue.htm53
-rw-r--r--modules/luci-base/luasrc/view/cbi/mvalue.htm55
-rw-r--r--modules/luci-base/luasrc/view/cbi/value.htm57
-rw-r--r--modules/luci-base/luasrc/view/footer.htm13
-rw-r--r--modules/luci-base/luasrc/view/header.htm23
-rw-r--r--modules/luci-base/luasrc/view/view.htm8
-rw-r--r--modules/luci-base/po/ca/base.po115
-rw-r--r--modules/luci-base/po/cs/base.po115
-rw-r--r--modules/luci-base/po/de/base.po139
-rw-r--r--modules/luci-base/po/el/base.po115
-rw-r--r--modules/luci-base/po/en/base.po115
-rw-r--r--modules/luci-base/po/es/base.po118
-rw-r--r--modules/luci-base/po/fr/base.po115
-rw-r--r--modules/luci-base/po/he/base.po115
-rw-r--r--modules/luci-base/po/hu/base.po115
-rw-r--r--modules/luci-base/po/it/base.po115
-rw-r--r--modules/luci-base/po/ja/base.po118
-rw-r--r--modules/luci-base/po/ko/base.po115
-rw-r--r--modules/luci-base/po/ms/base.po115
-rw-r--r--modules/luci-base/po/no/base.po115
-rw-r--r--modules/luci-base/po/pl/base.po118
-rw-r--r--modules/luci-base/po/pt-br/base.po115
-rw-r--r--modules/luci-base/po/pt/base.po115
-rw-r--r--modules/luci-base/po/ro/base.po115
-rw-r--r--modules/luci-base/po/ru/base.po118
-rw-r--r--modules/luci-base/po/sk/base.po115
-rw-r--r--modules/luci-base/po/sv/base.po115
-rw-r--r--modules/luci-base/po/templates/base.pot115
-rw-r--r--modules/luci-base/po/tr/base.po115
-rw-r--r--modules/luci-base/po/uk/base.po118
-rw-r--r--modules/luci-base/po/vi/base.po115
-rw-r--r--modules/luci-base/po/zh-cn/base.po118
-rw-r--r--modules/luci-base/po/zh-tw/base.po123
-rwxr-xr-xmodules/luci-base/root/usr/libexec/rpcd/luci338
-rw-r--r--modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js410
-rw-r--r--modules/luci-mod-network/luasrc/controller/admin/network.lua2
-rw-r--r--modules/luci-mod-network/luasrc/model/cbi/admin_network/dhcp.lua344
-rwxr-xr-xmodules/luci-mod-network/root/etc/uci-defaults/50_luci-mod-admin-full2
-rw-r--r--modules/luci-mod-status/luasrc/view/admin_status/connections.htm51
-rw-r--r--modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js146
-rw-r--r--modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js287
-rw-r--r--modules/luci-mod-system/luasrc/controller/admin/system.lua4
-rw-r--r--modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua188
-rw-r--r--modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua271
-rw-r--r--modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm56
73 files changed, 12393 insertions, 4906 deletions
diff --git a/modules/luci-base/htdocs/luci-static/resources/cbi.js b/modules/luci-base/htdocs/luci-static/resources/cbi.js
index 67ddc6af36..d4d61eb381 100644
--- a/modules/luci-base/htdocs/luci-static/resources/cbi.js
+++ b/modules/luci-base/htdocs/luci-static/resources/cbi.js
@@ -98,540 +98,6 @@ function _(s) {
return (window.TR && TR[sfh(s)]) || s;
}
-function Int(x) {
- return (/^-?\d+$/.test(x) ? +x : NaN);
-}
-
-function Dec(x) {
- return (/^-?\d+(?:\.\d+)?$/.test(x) ? +x : NaN);
-}
-
-function IPv4(x) {
- if (!x.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/))
- return null;
-
- if (RegExp.$1 > 255 || RegExp.$2 > 255 || RegExp.$3 > 255 || RegExp.$4 > 255)
- return null;
-
- return [ +RegExp.$1, +RegExp.$2, +RegExp.$3, +RegExp.$4 ];
-}
-
-function IPv6(x) {
- if (x.match(/^([a-fA-F0-9:]+):(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/)) {
- var v6 = RegExp.$1, v4 = IPv4(RegExp.$2);
-
- if (!v4)
- return null;
-
- x = v6 + ':' + (v4[0] * 256 + v4[1]).toString(16)
- + ':' + (v4[2] * 256 + v4[3]).toString(16);
- }
-
- if (!x.match(/^[a-fA-F0-9:]+$/))
- return null;
-
- var prefix_suffix = x.split(/::/);
-
- if (prefix_suffix.length > 2)
- return null;
-
- var prefix = (prefix_suffix[0] || '0').split(/:/);
- var suffix = prefix_suffix.length > 1 ? (prefix_suffix[1] || '0').split(/:/) : [];
-
- if (suffix.length ? (prefix.length + suffix.length > 7)
- : ((prefix_suffix.length < 2 && prefix.length < 8) || prefix.length > 8))
- return null;
-
- var i, word;
- var words = [];
-
- for (i = 0, word = parseInt(prefix[0], 16); i < prefix.length; word = parseInt(prefix[++i], 16))
- if (prefix[i].length <= 4 && !isNaN(word) && word <= 0xFFFF)
- words.push(word);
- else
- return null;
-
- for (i = 0; i < (8 - prefix.length - suffix.length); i++)
- words.push(0);
-
- for (i = 0, word = parseInt(suffix[0], 16); i < suffix.length; word = parseInt(suffix[++i], 16))
- if (suffix[i].length <= 4 && !isNaN(word) && word <= 0xFFFF)
- words.push(word);
- else
- return null;
-
- return words;
-}
-
-var CBIValidatorPrototype = {
- apply: function(name, value, args) {
- var func;
-
- if (typeof(name) === 'function')
- func = name;
- else if (typeof(this.types[name]) === 'function')
- func = this.types[name];
- else
- return false;
-
- if (value !== undefined && value !== null)
- this.value = value;
-
- return func.apply(this, args);
- },
-
- assert: function(condition, message) {
- if (!condition) {
- this.field.classList.add('cbi-input-invalid');
- this.error = message;
- return false;
- }
-
- this.field.classList.remove('cbi-input-invalid');
- this.error = null;
- return true;
- },
-
- compile: function(code) {
- var pos = 0;
- var esc = false;
- var depth = 0;
- var stack = [ ];
-
- code += ',';
-
- for (var i = 0; i < code.length; i++) {
- if (esc) {
- esc = false;
- continue;
- }
-
- switch (code.charCodeAt(i))
- {
- case 92:
- esc = true;
- break;
-
- case 40:
- case 44:
- if (depth <= 0) {
- if (pos < i) {
- var label = code.substring(pos, i);
- label = label.replace(/\\(.)/g, '$1');
- label = label.replace(/^[ \t]+/g, '');
- label = label.replace(/[ \t]+$/g, '');
-
- if (label && !isNaN(label)) {
- stack.push(parseFloat(label));
- }
- else if (label.match(/^(['"]).*\1$/)) {
- stack.push(label.replace(/^(['"])(.*)\1$/, '$2'));
- }
- else if (typeof this.types[label] == 'function') {
- stack.push(this.types[label]);
- stack.push(null);
- }
- else {
- throw "Syntax error, unhandled token '"+label+"'";
- }
- }
-
- pos = i+1;
- }
-
- depth += (code.charCodeAt(i) == 40);
- break;
-
- case 41:
- if (--depth <= 0) {
- if (typeof stack[stack.length-2] != 'function')
- throw "Syntax error, argument list follows non-function";
-
- stack[stack.length-1] = this.compile(code.substring(pos, i));
- pos = i+1;
- }
-
- break;
- }
- }
-
- return stack;
- },
-
- validate: function() {
- /* element is detached */
- if (!findParent(this.field, 'form'))
- return true;
-
- this.field.classList.remove('cbi-input-invalid');
- this.value = matchesElem(this.field, 'select') ? this.field.options[this.field.selectedIndex].value : this.field.value;
- this.error = null;
-
- var valid;
-
- if (this.value.length === 0)
- valid = this.assert(this.optional, _('non-empty value'));
- else
- valid = this.vstack[0].apply(this, this.vstack[1]);
-
- if (!valid) {
- this.field.setAttribute('data-tooltip', _('Expecting %s').format(this.error));
- this.field.setAttribute('data-tooltip-style', 'error');
- this.field.dispatchEvent(new CustomEvent('validation-failure', { bubbles: true }));
- }
- else {
- this.field.removeAttribute('data-tooltip');
- this.field.removeAttribute('data-tooltip-style');
- this.field.dispatchEvent(new CustomEvent('validation-success', { bubbles: true }));
- }
-
- return valid;
- },
-
- types: {
- integer: function() {
- return this.assert(Int(this.value) !== NaN, _('valid integer value'));
- },
-
- uinteger: function() {
- return this.assert(Int(this.value) >= 0, _('positive integer value'));
- },
-
- float: function() {
- return this.assert(Dec(this.value) !== NaN, _('valid decimal value'));
- },
-
- ufloat: function() {
- return this.assert(Dec(this.value) >= 0, _('positive decimal value'));
- },
-
- ipaddr: function(nomask) {
- return this.assert(this.apply('ip4addr', null, [nomask]) || this.apply('ip6addr', null, [nomask]),
- nomask ? _('valid IP address') : _('valid IP address or prefix'));
- },
-
- ip4addr: function(nomask) {
- var re = nomask ? /^(\d+\.\d+\.\d+\.\d+)$/ : /^(\d+\.\d+\.\d+\.\d+)(?:\/(\d+\.\d+\.\d+\.\d+)|\/(\d{1,2}))?$/,
- m = this.value.match(re);
-
- return this.assert(m && IPv4(m[1]) && (m[2] ? IPv4(m[2]) : (m[3] ? this.apply('ip4prefix', m[3]) : true)),
- nomask ? _('valid IPv4 address') : _('valid IPv4 address or network'));
- },
-
- ip6addr: function(nomask) {
- var re = nomask ? /^([0-9a-fA-F:.]+)$/ : /^([0-9a-fA-F:.]+)(?:\/(\d{1,3}))?$/,
- m = this.value.match(re);
-
- return this.assert(m && IPv6(m[1]) && (m[2] ? this.apply('ip6prefix', m[2]) : true),
- nomask ? _('valid IPv6 address') : _('valid IPv6 address or prefix'));
- },
-
- ip4prefix: function() {
- return this.assert(!isNaN(this.value) && this.value >= 0 && this.value <= 32,
- _('valid IPv4 prefix value (0-32)'));
- },
-
- ip6prefix: function() {
- return this.assert(!isNaN(this.value) && this.value >= 0 && this.value <= 128,
- _('valid IPv6 prefix value (0-128)'));
- },
-
- cidr: function() {
- return this.assert(this.apply('cidr4') || this.apply('cidr6'), _('valid IPv4 or IPv6 CIDR'));
- },
-
- cidr4: function() {
- var m = this.value.match(/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\/(\d{1,2})$/);
- return this.assert(m && IPv4(m[1]) && this.apply('ip4prefix', m[2]), _('valid IPv4 CIDR'));
- },
-
- cidr6: function() {
- var m = this.value.match(/^([0-9a-fA-F:.]+)\/(\d{1,3})$/);
- return this.assert(m && IPv6(m[1]) && this.apply('ip6prefix', m[2]), _('valid IPv6 CIDR'));
- },
-
- ipnet4: function() {
- var m = this.value.match(/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/);
- return this.assert(m && IPv4(m[1]) && IPv4(m[2]), _('IPv4 network in address/netmask notation'));
- },
-
- ipnet6: function() {
- var m = this.value.match(/^([0-9a-fA-F:.]+)\/([0-9a-fA-F:.]+)$/);
- return this.assert(m && IPv6(m[1]) && IPv6(m[2]), _('IPv6 network in address/netmask notation'));
- },
-
- ip6hostid: function() {
- if (this.value == "eui64" || this.value == "random")
- return true;
-
- var v6 = IPv6(this.value);
- return this.assert(!(!v6 || v6[0] || v6[1] || v6[2] || v6[3]), _('valid IPv6 host id'));
- },
-
- ipmask: function() {
- return this.assert(this.apply('ipmask4') || this.apply('ipmask6'),
- _('valid network in address/netmask notation'));
- },
-
- ipmask4: function() {
- return this.assert(this.apply('cidr4') || this.apply('ipnet4') || this.apply('ip4addr'),
- _('valid IPv4 network'));
- },
-
- ipmask6: function() {
- return this.assert(this.apply('cidr6') || this.apply('ipnet6') || this.apply('ip6addr'),
- _('valid IPv6 network'));
- },
-
- port: function() {
- var p = Int(this.value);
- return this.assert(p >= 0 && p <= 65535, _('valid port value'));
- },
-
- portrange: function() {
- if (this.value.match(/^(\d+)-(\d+)$/)) {
- var p1 = +RegExp.$1;
- var p2 = +RegExp.$2;
- return this.assert(p1 <= p2 && p2 <= 65535,
- _('valid port or port range (port1-port2)'));
- }
-
- return this.assert(this.apply('port'), _('valid port or port range (port1-port2)'));
- },
-
- macaddr: function() {
- return this.assert(this.value.match(/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/) != null,
- _('valid MAC address'));
- },
-
- host: function(ipv4only) {
- return this.assert(this.apply('hostname') || this.apply(ipv4only == 1 ? 'ip4addr' : 'ipaddr'),
- _('valid hostname or IP address'));
- },
-
- hostname: function(strict) {
- if (this.value.length <= 253)
- return this.assert(
- (this.value.match(/^[a-zA-Z0-9_]+$/) != null ||
- (this.value.match(/^[a-zA-Z0-9_][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$/) &&
- this.value.match(/[^0-9.]/))) &&
- (!strict || !this.value.match(/^_/)),
- _('valid hostname'));
-
- return this.assert(false, _('valid hostname'));
- },
-
- network: function() {
- return this.assert(this.apply('uciname') || this.apply('host'),
- _('valid UCI identifier, hostname or IP address'));
- },
-
- hostport: function(ipv4only) {
- var hp = this.value.split(/:/);
- return this.assert(hp.length == 2 && this.apply('host', hp[0], [ipv4only]) && this.apply('port', hp[1]),
- _('valid host:port'));
- },
-
- ip4addrport: function() {
- var hp = this.value.split(/:/);
- return this.assert(hp.length == 2 && this.apply('ip4addr', hp[0], [true]) && this.apply('port', hp[1]),
- _('valid IPv4 address:port'));
- },
-
- ipaddrport: function(bracket) {
- var m4 = this.value.match(/^([^\[\]:]+):(\d+)$/),
- m6 = this.value.match((bracket == 1) ? /^\[(.+)\]:(\d+)$/ : /^([^\[\]]+):(\d+)$/);
-
- if (m4)
- return this.assert(this.apply('ip4addr', m4[1], [true]) && this.apply('port', m4[2]),
- _('valid address:port'));
-
- return this.assert(m6 && this.apply('ip6addr', m6[1], [true]) && this.apply('port', m6[2]),
- _('valid address:port'));
- },
-
- wpakey: function() {
- var v = this.value;
-
- if (v.length == 64)
- return this.assert(v.match(/^[a-fA-F0-9]{64}$/), _('valid hexadecimal WPA key'));
-
- return this.assert((v.length >= 8) && (v.length <= 63), _('key between 8 and 63 characters'));
- },
-
- wepkey: function() {
- var v = this.value;
-
- if (v.substr(0, 2) === 's:')
- v = v.substr(2);
-
- if ((v.length == 10) || (v.length == 26))
- return this.assert(v.match(/^[a-fA-F0-9]{10,26}$/), _('valid hexadecimal WEP key'));
-
- return this.assert((v.length === 5) || (v.length === 13), _('key with either 5 or 13 characters'));
- },
-
- uciname: function() {
- return this.assert(this.value.match(/^[a-zA-Z0-9_]+$/), _('valid UCI identifier'));
- },
-
- range: function(min, max) {
- var val = Dec(this.value);
- return this.assert(val >= +min && val <= +max, _('value between %f and %f').format(min, max));
- },
-
- min: function(min) {
- return this.assert(Dec(this.value) >= +min, _('value greater or equal to %f').format(min));
- },
-
- max: function(max) {
- return this.assert(Dec(this.value) <= +max, _('value smaller or equal to %f').format(max));
- },
-
- rangelength: function(min, max) {
- var val = '' + this.value;
- return this.assert((val.length >= +min) && (val.length <= +max),
- _('value between %d and %d characters').format(min, max));
- },
-
- minlength: function(min) {
- return this.assert((''+this.value).length >= +min,
- _('value with at least %d characters').format(min));
- },
-
- maxlength: function(max) {
- return this.assert((''+this.value).length <= +max,
- _('value with at most %d characters').format(max));
- },
-
- or: function() {
- var errors = [];
-
- for (var i = 0; i < arguments.length; i += 2) {
- if (typeof arguments[i] != 'function') {
- if (arguments[i] == this.value)
- return this.assert(true);
- errors.push('"%s"'.format(arguments[i]));
- i--;
- }
- else if (arguments[i].apply(this, arguments[i+1])) {
- return this.assert(true);
- }
- else {
- errors.push(this.error);
- }
- }
-
- return this.assert(false, _('one of:\n - %s'.format(errors.join('\n - '))));
- },
-
- and: function() {
- for (var i = 0; i < arguments.length; i += 2) {
- if (typeof arguments[i] != 'function') {
- if (arguments[i] != this.value)
- return this.assert(false, '"%s"'.format(arguments[i]));
- i--;
- }
- else if (!arguments[i].apply(this, arguments[i+1])) {
- return this.assert(false, this.error);
- }
- }
-
- return this.assert(true);
- },
-
- neg: function() {
- return this.apply('or', this.value.replace(/^[ \t]*![ \t]*/, ''), arguments);
- },
-
- list: function(subvalidator, subargs) {
- this.field.setAttribute('data-is-list', 'true');
-
- var tokens = this.value.match(/[^ \t]+/g);
- for (var i = 0; i < tokens.length; i++)
- if (!this.apply(subvalidator, tokens[i], subargs))
- return this.assert(false, this.error);
-
- return this.assert(true);
- },
-
- phonedigit: function() {
- return this.assert(this.value.match(/^[0-9\*#!\.]+$/),
- _('valid phone digit (0-9, "*", "#", "!" or ".")'));
- },
-
- timehhmmss: function() {
- return this.assert(this.value.match(/^[0-6][0-9]:[0-6][0-9]:[0-6][0-9]$/),
- _('valid time (HH:MM:SS)'));
- },
-
- dateyyyymmdd: function() {
- if (this.value.match(/^(\d\d\d\d)-(\d\d)-(\d\d)/)) {
- var year = +RegExp.$1,
- month = +RegExp.$2,
- day = +RegExp.$3,
- days_in_month = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
-
- function is_leap_year(year) {
- return ((!(year % 4) && (year % 100)) || !(year % 400));
- }
-
- function get_days_in_month(month, year) {
- return (month === 2 && is_leap_year(year)) ? 29 : days_in_month[month - 1];
- }
-
- /* Firewall rules in the past don't make sense */
- return this.assert(year >= 2015 && month && month <= 12 && day && day <= get_days_in_month(month, year),
- _('valid date (YYYY-MM-DD)'));
-
- }
-
- return this.assert(false, _('valid date (YYYY-MM-DD)'));
- },
-
- unique: function(subvalidator, subargs) {
- var ctx = this,
- option = findParent(ctx.field, '[data-type][data-name]'),
- section = findParent(option, '.cbi-section'),
- query = '[data-type="%s"][data-name="%s"]'.format(option.getAttribute('data-type'), option.getAttribute('data-name')),
- unique = true;
-
- section.querySelectorAll(query).forEach(function(sibling) {
- if (sibling === option)
- return;
-
- var input = sibling.querySelector('[data-type]'),
- values = input ? (input.getAttribute('data-is-list') ? input.value.match(/[^ \t]+/g) : [ input.value ]) : null;
-
- if (values !== null && values.indexOf(ctx.value) !== -1)
- unique = false;
- });
-
- if (!unique)
- return this.assert(false, _('unique value'));
-
- if (typeof(subvalidator) === 'function')
- return this.apply(subvalidator, undefined, subargs);
-
- return this.assert(true);
- },
-
- hexstring: function() {
- return this.assert(this.value.match(/^([a-f0-9][a-f0-9]|[A-F0-9][A-F0-9])+$/),
- _('hexadecimal encoded value'));
- }
- }
-};
-
-function CBIValidator(field, type, optional)
-{
- this.field = field;
- this.optional = optional;
- this.vstack = this.compile(type);
-}
-
-CBIValidator.prototype = CBIValidatorPrototype;
-
function cbi_d_add(field, dep, index) {
var obj = (typeof(field) === 'string') ? document.getElementById(field) : field;
@@ -738,6 +204,11 @@ function cbi_d_update() {
function cbi_init() {
var nodes;
+ document.querySelectorAll('.cbi-dropdown').forEach(function(node) {
+ cbi_dropdown_init(node);
+ node.addEventListener('cbi-dropdown-change', cbi_d_update);
+ });
+
nodes = document.querySelectorAll('[data-strings]');
for (var i = 0, node; (node = nodes[i]) !== undefined; i++) {
@@ -772,8 +243,8 @@ function cbi_init() {
nodes = document.querySelectorAll('[data-choices]');
for (var i = 0, node; (node = nodes[i]) !== undefined; i++) {
- var choices = JSON.parse(node.getAttribute('data-choices'));
- var options = {};
+ var choices = JSON.parse(node.getAttribute('data-choices')),
+ options = {};
for (var j = 0; j < choices[0].length; j++)
options[choices[0][j]] = choices[1][j];
@@ -781,15 +252,24 @@ function cbi_init() {
var def = (node.getAttribute('data-optional') === 'true')
? node.placeholder || '' : null;
- cbi_combobox_init(node, options, def,
- node.getAttribute('data-manual'));
+ var cb = new L.ui.Combobox(node.value, options, {
+ name: node.getAttribute('name'),
+ sort: choices[0],
+ select_placeholder: def || _('-- Please choose --'),
+ custom_placeholder: node.getAttribute('data-manual') || _('-- custom --')
+ });
+
+ var n = cb.render();
+ n.addEventListener('cbi-dropdown-change', cbi_d_update);
+ node.parentNode.replaceChild(n, node);
}
nodes = document.querySelectorAll('[data-dynlist]');
for (var i = 0, node; (node = nodes[i]) !== undefined; i++) {
- var choices = JSON.parse(node.getAttribute('data-dynlist'));
- var options = null;
+ var choices = JSON.parse(node.getAttribute('data-dynlist')),
+ values = JSON.parse(node.getAttribute('data-values') || '[]'),
+ options = null;
if (choices[0] && choices[0].length) {
options = {};
@@ -798,7 +278,17 @@ function cbi_init() {
options[choices[0][j]] = choices[1][j];
}
- cbi_dynlist_init(node, choices[2], choices[3], options);
+ var dl = new L.ui.DynamicList(values, options, {
+ name: node.getAttribute('data-prefix'),
+ sort: choices[0],
+ datatype: choices[2],
+ optional: choices[3],
+ placeholder: node.getAttribute('data-placeholder')
+ });
+
+ var n = dl.render();
+ n.addEventListener('cbi-dynlist-change', cbi_d_update);
+ node.parentNode.replaceChild(n, node);
}
nodes = document.querySelectorAll('[data-type]');
@@ -808,7 +298,6 @@ function cbi_init() {
node.getAttribute('data-type'));
}
- document.querySelectorAll('.cbi-dropdown').forEach(cbi_dropdown_init);
document.querySelectorAll('[data-browser]').forEach(cbi_browser_init);
document.querySelectorAll('.cbi-tooltip:not(:empty)').forEach(function(s) {
@@ -827,47 +316,16 @@ function cbi_init() {
i.addEventListener('mouseout', handler);
});
- cbi_d_update();
-}
-
-function cbi_combobox_init(id, values, def, man) {
- var obj = (typeof(id) === 'string') ? document.getElementById(id) : id;
- var sb = E('div', {
- 'name': obj.name,
- 'class': 'cbi-dropdown',
- 'display-items': 5,
- 'optional': obj.getAttribute('data-optional'),
- 'placeholder': _('-- Please choose --'),
- 'data-type': obj.getAttribute('data-type'),
- 'data-optional': obj.getAttribute('data-optional')
- }, [ E('ul') ]);
-
- if (!(obj.value in values) && obj.value.length) {
- sb.lastElementChild.appendChild(E('li', {
- 'data-value': obj.value,
- 'selected': ''
- }, obj.value.length ? obj.value : (def || _('-- Please choose --'))));
- }
+ document.querySelectorAll('[data-ui-widget]').forEach(function(node) {
+ var args = JSON.parse(node.getAttribute('data-ui-widget') || '[]'),
+ widget = new (Function.prototype.bind.apply(L.ui[args[0]], args)),
+ markup = widget.render();
- for (var i in values) {
- sb.lastElementChild.appendChild(E('li', {
- 'data-value': i,
- 'selected': (i == obj.value) ? '' : null
- }, values[i]));
- }
+ markup.addEventListener('widget-change', cbi_d_update);
+ node.parentNode.replaceChild(markup, node);
+ });
- sb.lastElementChild.appendChild(E('li', { 'data-value': '-' }, [
- E('input', {
- 'type': 'text',
- 'class': 'create-item-input',
- 'data-type': obj.getAttribute('data-type'),
- 'data-optional': true,
- 'placeholder': (man || _('-- custom --'))
- })
- ]));
-
- sb.value = obj.value;
- obj.parentNode.replaceChild(sb, obj);
+ cbi_d_update();
}
function cbi_filebrowser(id, defpath) {
@@ -893,156 +351,6 @@ function cbi_browser_init(field)
}), field.nextSibling);
}
-CBIDynamicList = {
- addItem: function(dl, value, text, flash) {
- var exists = false,
- new_item = E('div', { 'class': flash ? 'item flash' : 'item', 'tabindex': 0 }, [
- E('span', {}, text || value),
- E('input', {
- 'type': 'hidden',
- 'name': dl.getAttribute('data-prefix'),
- 'value': value })]);
-
- dl.querySelectorAll('.item, .add-item').forEach(function(item) {
- if (exists)
- return;
-
- var hidden = item.querySelector('input[type="hidden"]');
-
- if (hidden && hidden.value === value)
- exists = true;
- else if (!hidden || hidden.value >= value)
- exists = !!item.parentNode.insertBefore(new_item, item);
- });
-
- cbi_d_update();
- },
-
- removeItem: function(dl, item) {
- var sb = dl.querySelector('.cbi-dropdown');
- if (sb) {
- var value = item.querySelector('input[type="hidden"]').value;
-
- sb.querySelectorAll('ul > li').forEach(function(li) {
- if (li.getAttribute('data-value') === value)
- li.removeAttribute('unselectable');
- });
- }
-
- item.parentNode.removeChild(item);
- cbi_d_update();
- },
-
- handleClick: function(ev) {
- var dl = ev.currentTarget,
- item = findParent(ev.target, '.item');
-
- if (item) {
- this.removeItem(dl, item);
- }
- else if (matchesElem(ev.target, '.cbi-button-add')) {
- var input = ev.target.previousElementSibling;
- if (input.value.length && !input.classList.contains('cbi-input-invalid')) {
- this.addItem(dl, input.value, null, true);
- input.value = '';
- }
- }
- },
-
- handleDropdownChange: function(ev) {
- var dl = ev.currentTarget,
- sbIn = ev.detail.instance,
- sbEl = ev.detail.element,
- sbVal = ev.detail.value;
-
- if (sbVal === null)
- return;
-
- sbIn.setValues(sbEl, null);
- sbVal.element.setAttribute('unselectable', '');
-
- this.addItem(dl, sbVal.value, sbVal.text, true);
- },
-
- handleKeydown: function(ev) {
- var dl = ev.currentTarget,
- item = findParent(ev.target, '.item');
-
- if (item) {
- switch (ev.keyCode) {
- case 8: /* backspace */
- if (item.previousElementSibling)
- item.previousElementSibling.focus();
-
- this.removeItem(dl, item);
- break;
-
- case 46: /* delete */
- if (item.nextElementSibling) {
- if (item.nextElementSibling.classList.contains('item'))
- item.nextElementSibling.focus();
- else
- item.nextElementSibling.firstElementChild.focus();
- }
-
- this.removeItem(dl, item);
- break;
- }
- }
- else if (matchesElem(ev.target, '.cbi-input-text')) {
- switch (ev.keyCode) {
- case 13: /* enter */
- if (ev.target.value.length && !ev.target.classList.contains('cbi-input-invalid')) {
- this.addItem(dl, ev.target.value, null, true);
- ev.target.value = '';
- ev.target.blur();
- ev.target.focus();
- }
-
- ev.preventDefault();
- break;
- }
- }
- }
-};
-
-function cbi_dynlist_init(dl, datatype, optional, choices)
-{
- if (!(this instanceof cbi_dynlist_init))
- return new cbi_dynlist_init(dl, datatype, optional, choices);
-
- dl.classList.add('cbi-dynlist');
- dl.appendChild(E('div', { 'class': 'add-item' }, E('input', {
- 'type': 'text',
- 'name': 'cbi.dynlist.' + dl.getAttribute('data-prefix'),
- 'class': 'cbi-input-text',
- 'placeholder': dl.getAttribute('data-placeholder'),
- 'data-type': datatype,
- 'data-optional': true
- })));
-
- if (choices)
- cbi_combobox_init(dl.lastElementChild.lastElementChild, choices, '', _('-- custom --'));
- else
- dl.lastElementChild.appendChild(E('div', { 'class': 'cbi-button cbi-button-add' }, '+'));
-
- dl.addEventListener('click', this.handleClick.bind(this));
- dl.addEventListener('keydown', this.handleKeydown.bind(this));
- dl.addEventListener('cbi-dropdown-change', this.handleDropdownChange.bind(this));
-
- try {
- var values = JSON.parse(dl.getAttribute('data-values') || '[]');
-
- if (typeof(values) === 'object' && Array.isArray(values))
- for (var i = 0; i < values.length; i++)
- this.addItem(dl, values[i], choices ? choices[values[i]] : null);
- }
- catch (e) {}
-}
-
-cbi_dynlist_init.prototype = CBIDynamicList;
-
-
function cbi_validate_form(form, errmsg)
{
/* if triggered by a section removal or addition, don't validate */
@@ -1078,7 +386,7 @@ function cbi_validate_field(cbid, optional, type)
var validatorFn;
try {
- var cbiValidator = new CBIValidator(field, type, optional);
+ var cbiValidator = L.validation.create(field, type, optional);
validatorFn = cbiValidator.validate.bind(cbiValidator);
}
catch(e) {
@@ -1258,7 +566,7 @@ String.prototype.format = function()
switch(pType) {
case 'b':
- subst = (+param || 0).toString(2);
+ subst = (~~param || 0).toString(2);
break;
case 'c':
@@ -1266,7 +574,7 @@ String.prototype.format = function()
break;
case 'd':
- subst = ~~(+param || 0);
+ subst = (~~param || 0);
break;
case 'u':
@@ -1280,7 +588,7 @@ String.prototype.format = function()
break;
case 'o':
- subst = (+param || 0).toString(8);
+ subst = (~~param || 0).toString(8);
break;
case 's':
@@ -1288,11 +596,11 @@ String.prototype.format = function()
break;
case 'x':
- subst = ('' + (+param || 0).toString(16)).toLowerCase();
+ subst = ('' + (~~param || 0).toString(16)).toLowerCase();
break;
case 'X':
- subst = ('' + (+param || 0).toString(16)).toUpperCase();
+ subst = ('' + (~~param || 0).toString(16)).toUpperCase();
break;
case 'h':
@@ -1425,622 +733,11 @@ if (typeof(window.CustomEvent) !== 'function') {
window.CustomEvent = CustomEvent;
}
-CBIDropdown = {
- openDropdown: function(sb) {
- var st = window.getComputedStyle(sb, null),
- ul = sb.querySelector('ul'),
- li = ul.querySelectorAll('li'),
- fl = findParent(sb, '.cbi-value-field'),
- sel = ul.querySelector('[selected]'),
- rect = sb.getBoundingClientRect(),
- items = Math.min(this.dropdown_items, li.length);
-
- document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
- s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
- });
-
- sb.setAttribute('open', '');
-
- var pv = ul.cloneNode(true);
- pv.classList.add('preview');
-
- if (fl)
- fl.classList.add('cbi-dropdown-open');
-
- if ('ontouchstart' in window) {
- var vpWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0),
- vpHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0),
- scrollFrom = window.pageYOffset,
- scrollTo = scrollFrom + rect.top - vpHeight * 0.5,
- start = null;
-
- ul.style.top = sb.offsetHeight + 'px';
- ul.style.left = -rect.left + 'px';
- ul.style.right = (rect.right - vpWidth) + 'px';
- ul.style.maxHeight = (vpHeight * 0.5) + 'px';
- ul.style.WebkitOverflowScrolling = 'touch';
-
- var scrollStep = function(timestamp) {
- if (!start) {
- start = timestamp;
- ul.scrollTop = sel ? Math.max(sel.offsetTop - sel.offsetHeight, 0) : 0;
- }
-
- var duration = Math.max(timestamp - start, 1);
- if (duration < 100) {
- document.body.scrollTop = scrollFrom + (scrollTo - scrollFrom) * (duration / 100);
- window.requestAnimationFrame(scrollStep);
- }
- else {
- document.body.scrollTop = scrollTo;
- }
- };
-
- window.requestAnimationFrame(scrollStep);
- }
- else {
- ul.style.maxHeight = '1px';
- ul.style.top = ul.style.bottom = '';
-
- window.requestAnimationFrame(function() {
- var height = items * li[Math.max(0, li.length - 2)].offsetHeight;
-
- ul.scrollTop = sel ? Math.max(sel.offsetTop - sel.offsetHeight, 0) : 0;
- ul.style[((rect.top + rect.height + height) > window.innerHeight) ? 'bottom' : 'top'] = rect.height + 'px';
- ul.style.maxHeight = height + 'px';
- });
- }
-
- ul.querySelectorAll('[selected] input[type="checkbox"]').forEach(function(c) {
- c.checked = true;
- });
-
- ul.classList.add('dropdown');
-
- sb.insertBefore(pv, ul.nextElementSibling);
-
- li.forEach(function(l) {
- l.setAttribute('tabindex', 0);
- });
-
- sb.lastElementChild.setAttribute('tabindex', 0);
-
- this.setFocus(sb, sel || li[0], true);
- },
-
- closeDropdown: function(sb, no_focus) {
- if (!sb.hasAttribute('open'))
- return;
-
- var pv = sb.querySelector('ul.preview'),
- ul = sb.querySelector('ul.dropdown'),
- li = ul.querySelectorAll('li'),
- fl = findParent(sb, '.cbi-value-field');
-
- li.forEach(function(l) { l.removeAttribute('tabindex'); });
- sb.lastElementChild.removeAttribute('tabindex');
-
- sb.removeChild(pv);
- sb.removeAttribute('open');
- sb.style.width = sb.style.height = '';
-
- ul.classList.remove('dropdown');
- ul.style.top = ul.style.bottom = ul.style.maxHeight = '';
-
- if (fl)
- fl.classList.remove('cbi-dropdown-open');
-
- if (!no_focus)
- this.setFocus(sb, sb);
-
- this.saveValues(sb, ul);
- },
-
- toggleItem: function(sb, li, force_state) {
- if (li.hasAttribute('unselectable'))
- return;
-
- if (this.multi) {
- var cbox = li.querySelector('input[type="checkbox"]'),
- items = li.parentNode.querySelectorAll('li'),
- label = sb.querySelector('ul.preview'),
- sel = li.parentNode.querySelectorAll('[selected]').length,
- more = sb.querySelector('.more'),
- ndisplay = this.display_items,
- n = 0;
-
- if (li.hasAttribute('selected')) {
- if (force_state !== true) {
- if (sel > 1 || this.optional) {
- li.removeAttribute('selected');
- cbox.checked = cbox.disabled = false;
- sel--;
- }
- else {
- cbox.disabled = true;
- }
- }
- }
- else {
- if (force_state !== false) {
- li.setAttribute('selected', '');
- cbox.checked = true;
- cbox.disabled = false;
- sel++;
- }
- }
-
- while (label.firstElementChild)
- label.removeChild(label.firstElementChild);
-
- for (var i = 0; i < items.length; i++) {
- items[i].removeAttribute('display');
- if (items[i].hasAttribute('selected')) {
- if (ndisplay-- > 0) {
- items[i].setAttribute('display', n++);
- label.appendChild(items[i].cloneNode(true));
- }
- var c = items[i].querySelector('input[type="checkbox"]');
- if (c)
- c.disabled = (sel == 1 && !this.optional);
- }
- }
-
- if (ndisplay < 0)
- sb.setAttribute('more', '');
- else
- sb.removeAttribute('more');
-
- if (ndisplay === this.display_items)
- sb.setAttribute('empty', '');
- else
- sb.removeAttribute('empty');
-
- more.innerHTML = (ndisplay === this.display_items) ? this.placeholder : '···';
- }
- else {
- var sel = li.parentNode.querySelector('[selected]');
- if (sel) {
- sel.removeAttribute('display');
- sel.removeAttribute('selected');
- }
-
- li.setAttribute('display', 0);
- li.setAttribute('selected', '');
-
- this.closeDropdown(sb, true);
- }
-
- this.saveValues(sb, li.parentNode);
- },
-
- transformItem: function(sb, li) {
- var cbox = E('form', {}, E('input', { type: 'checkbox', tabindex: -1, onclick: 'event.preventDefault()' })),
- label = E('label');
-
- while (li.firstChild)
- label.appendChild(li.firstChild);
-
- li.appendChild(cbox);
- li.appendChild(label);
- },
-
- saveValues: function(sb, ul) {
- var sel = ul.querySelectorAll('li[selected]'),
- div = sb.lastElementChild,
- strval = '',
- values = [];
-
- while (div.lastElementChild)
- div.removeChild(div.lastElementChild);
-
- sel.forEach(function (s) {
- if (s.hasAttribute('placeholder'))
- return;
-
- var v = {
- text: s.innerText,
- value: s.hasAttribute('data-value') ? s.getAttribute('data-value') : s.innerText,
- element: s
- };
-
- div.appendChild(E('input', {
- type: 'hidden',
- name: s.hasAttribute('name') ? s.getAttribute('name') : (sb.getAttribute('name') || ''),
- value: v.value
- }));
-
- values.push(v);
-
- strval += strval.length ? ' ' + v.value : v.value;
- });
-
- var detail = {
- instance: this,
- element: sb
- };
-
- if (this.multi)
- detail.values = values;
- else
- detail.value = values.length ? values[0] : null;
-
- sb.value = strval;
-
- sb.dispatchEvent(new CustomEvent('cbi-dropdown-change', {
- bubbles: true,
- detail: detail
- }));
-
- cbi_d_update();
- },
-
- setValues: function(sb, values) {
- var ul = sb.querySelector('ul');
-
- if (this.multi) {
- ul.querySelectorAll('li[data-value]').forEach(function(li) {
- if (values === null || !(li.getAttribute('data-value') in values))
- this.toggleItem(sb, li, false);
- else
- this.toggleItem(sb, li, true);
- });
- }
- else {
- var ph = ul.querySelector('li[placeholder]');
- if (ph)
- this.toggleItem(sb, ph);
-
- ul.querySelectorAll('li[data-value]').forEach(function(li) {
- if (values !== null && (li.getAttribute('data-value') in values))
- this.toggleItem(sb, li);
- });
- }
- },
-
- setFocus: function(sb, elem, scroll) {
- if (sb && sb.hasAttribute && sb.hasAttribute('locked-in'))
- return;
-
- if (sb.target && findParent(sb.target, 'ul.dropdown'))
- return;
-
- document.querySelectorAll('.focus').forEach(function(e) {
- if (!matchesElem(e, 'input')) {
- e.classList.remove('focus');
- e.blur();
- }
- });
-
- if (elem) {
- elem.focus();
- elem.classList.add('focus');
-
- if (scroll)
- elem.parentNode.scrollTop = elem.offsetTop - elem.parentNode.offsetTop;
- }
- },
-
- createItems: function(sb, value) {
- var sbox = this,
- val = (value || '').trim(),
- ul = sb.querySelector('ul');
-
- if (!sbox.multi)
- val = val.length ? [ val ] : [];
- else
- val = val.length ? val.split(/\s+/) : [];
-
- val.forEach(function(item) {
- var new_item = null;
-
- ul.childNodes.forEach(function(li) {
- if (li.getAttribute && li.getAttribute('data-value') === item)
- new_item = li;
- });
-
- if (!new_item) {
- var markup,
- tpl = sb.querySelector(sbox.template);
-
- if (tpl)
- markup = (tpl.textContent || tpl.innerHTML || tpl.firstChild.data).replace(/^<!--|-->$/, '').trim();
- else
- markup = '<li data-value="{{value}}">{{value}}</li>';
-
- new_item = E(markup.replace(/{{value}}/g, item));
-
- if (sbox.multi) {
- sbox.transformItem(sb, new_item);
- }
- else {
- var old = ul.querySelector('li[created]');
- if (old)
- ul.removeChild(old);
-
- new_item.setAttribute('created', '');
- }
-
- new_item = ul.insertBefore(new_item, ul.lastElementChild);
- }
-
- sbox.toggleItem(sb, new_item, true);
- sbox.setFocus(sb, new_item, true);
- });
- },
-
- closeAllDropdowns: function() {
- document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
- s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
- });
- },
-
- handleClick: function(ev) {
- var sb = ev.currentTarget;
-
- if (!sb.hasAttribute('open')) {
- if (!matchesElem(ev.target, 'input'))
- this.openDropdown(sb);
- }
- else {
- var li = findParent(ev.target, 'li');
- if (li && li.parentNode.classList.contains('dropdown'))
- this.toggleItem(sb, li);
- else if (li && li.parentNode.classList.contains('preview'))
- this.closeDropdown(sb);
- }
-
- ev.preventDefault();
- ev.stopPropagation();
- },
-
- handleKeydown: function(ev) {
- var sb = ev.currentTarget;
-
- if (matchesElem(ev.target, 'input'))
- return;
-
- if (!sb.hasAttribute('open')) {
- switch (ev.keyCode) {
- case 37:
- case 38:
- case 39:
- case 40:
- this.openDropdown(sb);
- ev.preventDefault();
- }
- }
- else {
- var active = findParent(document.activeElement, 'li');
-
- switch (ev.keyCode) {
- case 27:
- this.closeDropdown(sb);
- break;
-
- case 13:
- if (active) {
- if (!active.hasAttribute('selected'))
- this.toggleItem(sb, active);
- this.closeDropdown(sb);
- ev.preventDefault();
- }
- break;
-
- case 32:
- if (active) {
- this.toggleItem(sb, active);
- ev.preventDefault();
- }
- break;
-
- case 38:
- if (active && active.previousElementSibling) {
- this.setFocus(sb, active.previousElementSibling);
- ev.preventDefault();
- }
- break;
-
- case 40:
- if (active && active.nextElementSibling) {
- this.setFocus(sb, active.nextElementSibling);
- ev.preventDefault();
- }
- break;
- }
- }
- },
-
- handleDropdownClose: function(ev) {
- var sb = ev.currentTarget;
-
- this.closeDropdown(sb, true);
- },
-
- handleDropdownSelect: function(ev) {
- var sb = ev.currentTarget,
- li = findParent(ev.target, 'li');
-
- if (!li)
- return;
-
- this.toggleItem(sb, li);
- this.closeDropdown(sb, true);
- },
-
- handleMouseover: function(ev) {
- var sb = ev.currentTarget;
-
- if (!sb.hasAttribute('open'))
- return;
-
- var li = findParent(ev.target, 'li');
-
- if (li && li.parentNode.classList.contains('dropdown'))
- this.setFocus(sb, li);
- },
-
- handleFocus: function(ev) {
- var sb = ev.currentTarget;
-
- document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
- if (s !== sb || sb.hasAttribute('open'))
- s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
- });
- },
-
- handleCanaryFocus: function(ev) {
- this.closeDropdown(ev.currentTarget.parentNode);
- },
-
- handleCreateKeydown: function(ev) {
- var input = ev.currentTarget,
- sb = findParent(input, '.cbi-dropdown');
-
- switch (ev.keyCode) {
- case 13:
- ev.preventDefault();
-
- if (input.classList.contains('cbi-input-invalid'))
- return;
-
- this.createItems(sb, input.value);
- input.value = '';
- input.blur();
- break;
- }
- },
-
- handleCreateFocus: function(ev) {
- var input = ev.currentTarget,
- cbox = findParent(input, 'li').querySelector('input[type="checkbox"]'),
- sb = findParent(input, '.cbi-dropdown');
-
- if (cbox)
- cbox.checked = true;
-
- sb.setAttribute('locked-in', '');
- },
-
- handleCreateBlur: function(ev) {
- var input = ev.currentTarget,
- cbox = findParent(input, 'li').querySelector('input[type="checkbox"]'),
- sb = findParent(input, '.cbi-dropdown');
-
- if (cbox)
- cbox.checked = false;
-
- sb.removeAttribute('locked-in');
- },
-
- handleCreateClick: function(ev) {
- ev.currentTarget.querySelector(this.create).focus();
- }
-};
-
function cbi_dropdown_init(sb) {
- if (!(this instanceof cbi_dropdown_init))
- return new cbi_dropdown_init(sb);
-
- this.multi = sb.hasAttribute('multiple');
- this.optional = sb.hasAttribute('optional');
- this.placeholder = sb.getAttribute('placeholder') || '---';
- this.display_items = parseInt(sb.getAttribute('display-items') || 3);
- this.dropdown_items = parseInt(sb.getAttribute('dropdown-items') || 5);
- this.create = sb.getAttribute('item-create') || '.create-item-input';
- this.template = sb.getAttribute('item-template') || 'script[type="item-template"]';
-
- var ul = sb.querySelector('ul'),
- more = sb.appendChild(E('span', { class: 'more', tabindex: -1 }, '···')),
- open = sb.appendChild(E('span', { class: 'open', tabindex: -1 }, 'â–¾')),
- canary = sb.appendChild(E('div')),
- create = sb.querySelector(this.create),
- ndisplay = this.display_items,
- n = 0;
-
- if (this.multi) {
- var items = ul.querySelectorAll('li');
-
- for (var i = 0; i < items.length; i++) {
- this.transformItem(sb, items[i]);
-
- if (items[i].hasAttribute('selected') && ndisplay-- > 0)
- items[i].setAttribute('display', n++);
- }
- }
- else {
- if (this.optional && !ul.querySelector('li[data-value=""]')) {
- var placeholder = E('li', { placeholder: '' }, this.placeholder);
- ul.firstChild ? ul.insertBefore(placeholder, ul.firstChild) : ul.appendChild(placeholder);
- }
-
- var items = ul.querySelectorAll('li'),
- sel = sb.querySelectorAll('[selected]');
-
- sel.forEach(function(s) {
- s.removeAttribute('selected');
- });
-
- var s = sel[0] || items[0];
- if (s) {
- s.setAttribute('selected', '');
- s.setAttribute('display', n++);
- }
-
- ndisplay--;
- }
-
- this.saveValues(sb, ul);
-
- ul.setAttribute('tabindex', -1);
- sb.setAttribute('tabindex', 0);
-
- if (ndisplay < 0)
- sb.setAttribute('more', '')
- else
- sb.removeAttribute('more');
-
- if (ndisplay === this.display_items)
- sb.setAttribute('empty', '')
- else
- sb.removeAttribute('empty');
-
- more.innerHTML = (ndisplay === this.display_items) ? this.placeholder : '···';
-
-
- sb.addEventListener('click', this.handleClick.bind(this));
- sb.addEventListener('keydown', this.handleKeydown.bind(this));
- sb.addEventListener('cbi-dropdown-close', this.handleDropdownClose.bind(this));
- sb.addEventListener('cbi-dropdown-select', this.handleDropdownSelect.bind(this));
-
- if ('ontouchstart' in window) {
- sb.addEventListener('touchstart', function(ev) { ev.stopPropagation(); });
- window.addEventListener('touchstart', this.closeAllDropdowns);
- }
- else {
- sb.addEventListener('mouseover', this.handleMouseover.bind(this));
- sb.addEventListener('focus', this.handleFocus.bind(this));
-
- canary.addEventListener('focus', this.handleCanaryFocus.bind(this));
-
- window.addEventListener('mouseover', this.setFocus);
- window.addEventListener('click', this.closeAllDropdowns);
- }
-
- if (create) {
- create.addEventListener('keydown', this.handleCreateKeydown.bind(this));
- create.addEventListener('focus', this.handleCreateFocus.bind(this));
- create.addEventListener('blur', this.handleCreateBlur.bind(this));
-
- var li = findParent(create, 'li');
-
- li.setAttribute('unselectable', '');
- li.addEventListener('click', this.handleCreateClick.bind(this));
- }
+ var dl = new L.ui.Dropdown(sb, null, { name: sb.getAttribute('name') });
+ return dl.bind(sb);
}
-cbi_dropdown_init.prototype = CBIDropdown;
-
function cbi_update_table(table, data, placeholder) {
var target = isElem(table) ? table : document.querySelector(table);
diff --git a/modules/luci-base/htdocs/luci-static/resources/firewall.js b/modules/luci-base/htdocs/luci-static/resources/firewall.js
new file mode 100644
index 0000000000..e99f8b83bc
--- /dev/null
+++ b/modules/luci-base/htdocs/luci-static/resources/firewall.js
@@ -0,0 +1,575 @@
+'use strict';
+'require uci';
+'require rpc';
+'require tools.prng as random';
+
+
+function initFirewallState() {
+ return uci.load('firewall');
+}
+
+function toArray(val) {
+ if (val == null)
+ return [];
+
+ if (Array.isArray(val))
+ return val;
+
+ var s = String(val).trim();
+
+ if (s == '')
+ return [];
+
+ return s.split(/\s+/);
+}
+
+function parseEnum(s, values) {
+ if (s == null)
+ return null;
+
+ s = String(s).toUpperCase();
+
+ if (s == '')
+ return null;
+
+ for (var i = 0; i < values.length; i++)
+ if (values[i].toUpperCase().indexOf(s) == 0)
+ return values[i];
+
+ return null;
+}
+
+function parsePolicy(s, defaultValue) {
+ return parseEnum(s, ['DROP', 'REJECT', 'ACCEPT']) || (arguments.length < 2 ? null : defaultValue);
+}
+
+
+var Firewall, AbstractFirewallItem, Defaults, Zone, Forwarding, Redirect, Rule;
+
+function lookupZone(name) {
+ var z = uci.get('firewall', name);
+
+ if (z != null && z['.type'] == 'zone')
+ return new Zone(z['.name']);
+
+ var sections = uci.sections('firewall', 'zone');
+
+ for (var i = 0; i < sections.length; i++) {
+ if (sections[i].name != name)
+ continue;
+
+ return new Zone(sections[i]['.name']);
+ }
+
+ return null;
+}
+
+function getColorForName(forName) {
+ if (forName == null)
+ return '#eeeeee';
+ else if (forName == 'lan')
+ return '#90f090';
+ else if (forName == 'wan')
+ return '#f09090';
+
+ random.seed(parseInt(sfh(forName), 16));
+
+ var r = random.get(128),
+ g = random.get(128),
+ min = 0,
+ max = 128;
+
+ if ((r + g) < 128)
+ min = 128 - r - g;
+ else
+ max = 255 - r - g;
+
+ var b = min + Math.floor(random.get() * (max - min));
+
+ return '#%02x%02x%02x'.format(0xff - r, 0xff - g, 0xff - b);
+}
+
+
+Firewall = L.Class.extend({
+ getDefaults: function() {
+ return initFirewallState().then(function() {
+ return new Defaults();
+ });
+ },
+
+ newZone: function() {
+ return initFirewallState().then(L.bind(function() {
+ var name = 'newzone',
+ count = 1;
+
+ while (this.getZone(name) != null)
+ name = 'newzone%d'.format(++count);
+
+ return this.addZone(name);
+ }, this));
+ },
+
+ addZone: function(name) {
+ return initFirewallState().then(L.bind(function() {
+ if (name == null || !/^[a-zA-Z0-9_]+$/.test(name))
+ return null;
+
+ if (this.getZone(name) != null)
+ return null;
+
+ var d = new Defaults(),
+ z = uci.add('firewall', 'zone');
+
+ uci.set('firewall', z, 'name', name);
+ uci.set('firewall', z, 'network', ' ');
+ uci.set('firewall', z, 'input', d.getInput() || 'DROP');
+ uci.set('firewall', z, 'output', d.getOutput() || 'DROP');
+ uci.set('firewall', z, 'forward', d.getForward() || 'DROP');
+
+ return new Zone(z);
+ }, this));
+ },
+
+ getZone: function(name) {
+ return initFirewallState().then(function() {
+ return lookupZone(name);
+ });
+ },
+
+ getZones: function() {
+ return initFirewallState().then(function() {
+ var sections = uci.sections('firewall', 'zone'),
+ zones = [];
+
+ for (var i = 0; i < sections.length; i++)
+ zones.push(new Zone(sections[i]['.name']));
+
+ zones.sort(function(a, b) { return a.getName() > b.getName() });
+
+ return zones;
+ });
+ },
+
+ getZoneByNetwork: function(network) {
+ return initFirewallState().then(function() {
+ var sections = uci.sections('firewall', 'zone');
+
+ for (var i = 0; i < sections.length; i++)
+ if (toArray(sections[i].network || sections[i].name).indexOf(network) != -1)
+ return new Zone(sections[i]['.name']);
+
+ return null;
+ });
+ },
+
+ deleteZone: function(name) {
+ return initFirewallState().then(function() {
+ var section = uci.get('firewall', name),
+ found = false;
+
+ if (section != null && section['.type'] == 'zone') {
+ found = true;
+ name = zone.name;
+ uci.remove('firewall', zone['.name']);
+ }
+ else if (name != null) {
+ var sections = uci.sections('firewall', 'zone');
+
+ for (var i = 0; i < sections.length; i++) {
+ if (sections[i].name != name)
+ continue;
+
+ found = true;
+ uci.remove('firewall', sections[i]['.name']);
+ }
+ }
+
+ if (found == true) {
+ sections = uci.sections('firewall');
+
+ for (var i = 0; i < sections.length; i++) {
+ if (sections[i]['.type'] != 'rule' &&
+ sections[i]['.type'] != 'redirect' &&
+ sections[i]['.type'] != 'forwarding')
+ continue;
+
+ if (sections[i].src == name || sections[i].dest == name)
+ uci.remove('firewall', sections[i]['.name']);
+ }
+ }
+
+ return found;
+ });
+ },
+
+ renameZone: function(oldName, newName) {
+ return initFirewallState().then(L.bind(function() {
+ if (oldName == null || newName == null || !/^[a-zA-Z0-9_]+$/.test(newName))
+ return false;
+
+ if (lookupZone(newName) != null)
+ return false;
+
+ var sections = uci.sections('firewall', 'zone'),
+ found = false;
+
+ for (var i = 0; i < sections.length; i++) {
+ if (sections[i].name != oldName)
+ continue;
+
+ if (toArray(sections[i].network).length == 0)
+ uci.set('firewall', sections[i]['.name'], 'network', oldName);
+
+ uci.set('firewall', sections[i]['.name'], 'name', newName);
+ found = true;
+ }
+
+ if (found == true) {
+ sections = uci.sections('firewall');
+
+ for (var i = 0; i < sections.length; i++) {
+ if (sections[i]['.type'] != 'rule' &&
+ sections[i]['.type'] != 'redirect' &&
+ sections[i]['.type'] != 'forwarding')
+ continue;
+
+ if (sections[i].src == oldName)
+ uci.set('firewall', sections[i]['.name'], 'src', newName);
+
+ if (sections[i].dest == oldName)
+ uci.set('firewall', sections[i]['.name'], 'dest', newName);
+ }
+ }
+
+ return found;
+ }, this));
+ },
+
+ deleteNetwork: function(network) {
+ return this.getZones().then(L.bind(function(zones) {
+ var rv = false;
+
+ for (var i = 0; i < zones.length; i++)
+ if (zones[i].deleteNetwork(network))
+ rv = true;
+
+ return rv;
+ }, this));
+ },
+
+ getColorForName: getColorForName
+});
+
+
+AbstractFirewallItem = L.Class.extend({
+ get: function(option) {
+ return uci.get('firewall', this.sid, option);
+ },
+
+ set: function(option, value) {
+ return uci.set('firewall', this.sid, option, value);
+ }
+});
+
+
+Defaults = AbstractFirewallItem.extend({
+ __init__: function() {
+ var sections = uci.sections('firewall', 'defaults');
+
+ for (var i = 0; i < sections.length; i++) {
+ this.sid = sections[i]['.name'];
+ break;
+ }
+
+ if (this.sid == null)
+ this.sid = uci.add('firewall', 'defaults');
+ },
+
+ isSynFlood: function() {
+ return (this.get('syn_flood') == '1');
+ },
+
+ isDropInvalid: function() {
+ return (this.get('drop_invalid') == '1');
+ },
+
+ getInput: function() {
+ return parsePolicy(this.get('input'), 'DROP');
+ },
+
+ getOutput: function() {
+ return parsePolicy(this.get('output'), 'DROP');
+ },
+
+ getForward: function() {
+ return parsePolicy(this.get('forward'), 'DROP');
+ }
+});
+
+
+Zone = AbstractFirewallItem.extend({
+ __init__: function(name) {
+ var section = uci.get('firewall', name);
+
+ if (section != null && section['.type'] == 'zone') {
+ this.sid = name;
+ this.data = section;
+ }
+ else if (name != null) {
+ var sections = uci.get('firewall', 'zone');
+
+ for (var i = 0; i < sections.length; i++) {
+ if (sections[i].name != name)
+ continue;
+
+ this.sid = sections[i]['.name'];
+ this.data = sections[i];
+ break;
+ }
+ }
+ },
+
+ isMasquerade: function() {
+ return (this.get('masq') == '1');
+ },
+
+ getName: function() {
+ return this.get('name');
+ },
+
+ getNetwork: function() {
+ return this.get('network');
+ },
+
+ getInput: function() {
+ return parsePolicy(this.get('input'), (new Defaults()).getInput());
+ },
+
+ getOutput: function() {
+ return parsePolicy(this.get('output'), (new Defaults()).getOutput());
+ },
+
+ getForward: function() {
+ return parsePolicy(this.get('forward'), (new Defaults()).getForward());
+ },
+
+ addNetwork: function(network) {
+ var section = uci.get('network', network);
+
+ if (section == null || section['.type'] != 'interface')
+ return false;
+
+ var newNetworks = this.getNetworks();
+
+ if (newNetworks.filter(function(net) { return net == network }).length)
+ return false;
+
+ newNetworks.push(network);
+ this.set('network', newNetworks.join(' '));
+
+ return true;
+ },
+
+ deleteNetwork: function(network) {
+ var oldNetworks = this.getNetworks(),
+ newNetworks = oldNetworks.filter(function(net) { return net != network });
+
+ if (newNetworks.length > 0)
+ this.set('network', newNetworks.join(' '));
+ else
+ this.set('network', ' ');
+
+ return (newNetworks.length < oldNetworks.length);
+ },
+
+ getNetworks: function() {
+ return toArray(this.get('network') || this.get('name'));
+ },
+
+ clearNetworks: function() {
+ this.set('network', ' ');
+ },
+
+ getForwardingsBy: function(what) {
+ var sections = uci.sections('firewall', 'forwarding'),
+ forwards = [];
+
+ for (var i = 0; i < sections.length; i++) {
+ if (sections[i].src == null || sections[i].dest == null)
+ continue;
+
+ if (sections[i][what] != this.getName())
+ continue;
+
+ forwards.push(new Forwarding(sections[i]['.name']));
+ }
+
+ return forwards;
+ },
+
+ addForwardingTo: function(dest) {
+ var forwards = this.getForwardingsBy('src'),
+ zone = lookupZone(dest);
+
+ if (zone == null || zone.getName() == this.getName())
+ return null;
+
+ for (var i = 0; i < forwards.length; i++)
+ if (forwards[i].getDestination() == zone.getName())
+ return null;
+
+ var sid = uci.add('firewall', 'forwarding');
+
+ uci.set('firewall', sid, 'src', this.getName());
+ uci.set('firewall', sid, 'dest', zone.getName());
+
+ return new Forwarding(sid);
+ },
+
+ addForwardingFrom: function(src) {
+ var forwards = this.getForwardingsBy('dest'),
+ zone = lookupZone(src);
+
+ if (zone == null || zone.getName() == this.getName())
+ return null;
+
+ for (var i = 0; i < forwards.length; i++)
+ if (forwards[i].getSource() == zone.getName())
+ return null;
+
+ var sid = uci.add('firewall', 'forwarding');
+
+ uci.set('firewall', sid, 'src', zone.getName());
+ uci.set('firewall', sid, 'dest', this.getName());
+
+ return new Forwarding(sid);
+ },
+
+ deleteForwardingsBy: function(what) {
+ var sections = uci.sections('firewall', 'forwarding'),
+ found = false;
+
+ for (var i = 0; i < sections.length; i++) {
+ if (sections[i].src == null || sections[i].dest == null)
+ continue;
+
+ if (sections[i][what] != this.getName())
+ continue;
+
+ uci.remove('firewall', sections[i]['.name']);
+ found = true;
+ }
+
+ return found;
+ },
+
+ deleteForwarding: function(forwarding) {
+ if (!(forwarding instanceof Forwarding))
+ return false;
+
+ var section = uci.get('firewall', forwarding.sid);
+
+ if (!section || section['.type'] != 'forwarding')
+ return false;
+
+ uci.remove('firewall', section['.name']);
+
+ return true;
+ },
+
+ addRedirect: function(options) {
+ var sid = uci.add('firewall', 'redirect');
+
+ if (options != null && typeof(options) == 'object')
+ for (var key in options)
+ if (options.hasOwnProperty(key))
+ uci.set('firewall', sid, key, options[key]);
+
+ uci.set('firewall', sid, 'src', this.getName());
+
+ return new Redirect(sid);
+ },
+
+ addRule: function(options) {
+ var sid = uci.add('firewall', 'rule');
+
+ if (options != null && typeof(options) == 'object')
+ for (var key in options)
+ if (options.hasOwnProperty(key))
+ uci.set('firewall', sid, key, options[key]);
+
+ uci.set('firewall', sid, 'src', this.getName());
+
+ return new Redirect(sid);
+ },
+
+ getColor: function(forName) {
+ var name = (arguments.length > 0 ? forName : this.getName());
+
+ return getColorForName(name);
+ }
+});
+
+
+Forwarding = AbstractFirewallItem.extend({
+ __init__: function(sid) {
+ this.sid = sid;
+ },
+
+ getSource: function() {
+ return this.get('src');
+ },
+
+ getDestination: function() {
+ return this.get('dest');
+ },
+
+ getSourceZone: function() {
+ return lookupZone(this.getSource());
+ },
+
+ getDestinationZone: function() {
+ return lookupZone(this.getDestination());
+ }
+});
+
+
+Rule = AbstractFirewallItem.extend({
+ getSource: function() {
+ return this.get('src');
+ },
+
+ getDestination: function() {
+ return this.get('dest');
+ },
+
+ getSourceZone: function() {
+ return lookupZone(this.getSource());
+ },
+
+ getDestinationZone: function() {
+ return lookupZone(this.getDestination());
+ }
+});
+
+
+Redirect = AbstractFirewallItem.extend({
+ getSource: function() {
+ return this.get('src');
+ },
+
+ getDestination: function() {
+ return this.get('dest');
+ },
+
+ getSourceZone: function() {
+ return lookupZone(this.getSource());
+ },
+
+ getDestinationZone: function() {
+ return lookupZone(this.getDestination());
+ }
+});
+
+
+return Firewall;
diff --git a/modules/luci-base/htdocs/luci-static/resources/form.js b/modules/luci-base/htdocs/luci-static/resources/form.js
new file mode 100644
index 0000000000..8bb0da4a40
--- /dev/null
+++ b/modules/luci-base/htdocs/luci-static/resources/form.js
@@ -0,0 +1,1676 @@
+'use strict';
+'require ui';
+'require uci';
+
+var scope = this;
+
+var CBINode = Class.extend({
+ __init__: function(title, description) {
+ this.title = title || '';
+ this.description = description || '';
+ this.children = [];
+ },
+
+ append: function(obj) {
+ this.children.push(obj);
+ },
+
+ parse: function() {
+ var args = arguments;
+ this.children.forEach(function(child) {
+ child.parse.apply(child, args);
+ });
+ },
+
+ render: function() {
+ L.error('InternalError', 'Not implemented');
+ },
+
+ loadChildren: function(/* ... */) {
+ var tasks = [];
+
+ if (Array.isArray(this.children))
+ for (var i = 0; i < this.children.length; i++)
+ if (!this.children[i].disable)
+ tasks.push(this.children[i].load.apply(this.children[i], arguments));
+
+ return Promise.all(tasks);
+ },
+
+ renderChildren: function(tab_name /*, ... */) {
+ var tasks = [],
+ index = 0;
+
+ if (Array.isArray(this.children))
+ for (var i = 0; i < this.children.length; i++)
+ if (tab_name === null || this.children[i].tab === tab_name)
+ if (!this.children[i].disable)
+ tasks.push(this.children[i].render.apply(
+ this.children[i], this.varargs(arguments, 1, index++)));
+
+ return Promise.all(tasks);
+ },
+
+ stripTags: function(s) {
+ if (!s.match(/[<>]/))
+ return s;
+
+ var x = E('div', {}, s);
+ return x.textContent || x.innerText || '';
+ }
+});
+
+var CBIMap = CBINode.extend({
+ __init__: function(config /*, ... */) {
+ this.super('__init__', this.varargs(arguments, 1));
+
+ this.config = config;
+ this.parsechain = [ config ];
+ },
+
+ findElements: function(/* ... */) {
+ var q = null;
+
+ if (arguments.length == 1)
+ q = arguments[0];
+ else if (arguments.length == 2)
+ q = '[%s="%s"]'.format(arguments[0], arguments[1]);
+ else
+ L.error('InternalError', 'Expecting one or two arguments to findElements()');
+
+ return this.root.querySelectorAll(q);
+ },
+
+ findElement: function(/* ... */) {
+ var res = this.findElements.apply(this, arguments);
+ return res.length ? res[0] : null;
+ },
+
+ chain: function(config) {
+ if (this.parsechain.indexOf(config) == -1)
+ this.parsechain.push(config);
+ },
+
+ section: function(cbiClass /*, ... */) {
+ if (!CBIAbstractSection.isSubclass(cbiClass))
+ L.error('TypeError', 'Class must be a descendent of CBIAbstractSection');
+
+ var obj = cbiClass.instantiate(this.varargs(arguments, 1, this));
+ this.append(obj);
+ return obj;
+ },
+
+ load: function() {
+ return uci.load(this.parsechain || [ this.config ])
+ .then(this.loadChildren.bind(this));
+ },
+
+ parse: function() {
+ var tasks = [];
+
+ if (Array.isArray(this.children))
+ for (var i = 0; i < this.children.length; i++)
+ tasks.push(this.children[i].parse());
+
+ return Promise.all(tasks);
+ },
+
+ save: function() {
+ this.checkDepends();
+
+ return this.parse()
+ .then(uci.save.bind(uci))
+ .then(this.load.bind(this))
+ .then(this.renderContents.bind(this))
+ .catch(function(e) {
+ alert('Cannot save due to invalid values')
+ return Promise.reject();
+ });
+ },
+
+ reset: function() {
+ return this.renderContents();
+ },
+
+ render: function() {
+ return this.load().then(this.renderContents.bind(this));
+ },
+
+ renderContents: function() {
+ var mapEl = this.root || (this.root = E('div', {
+ 'id': 'cbi-%s'.format(this.config),
+ 'class': 'cbi-map',
+ 'cbi-dependency-check': L.bind(this.checkDepends, this)
+ }));
+
+ L.dom.bindClassInstance(mapEl, this);
+
+ return this.renderChildren(null).then(L.bind(function(nodes) {
+ var initialRender = !mapEl.firstChild;
+
+ L.dom.content(mapEl, null);
+
+ if (this.title != null && this.title != '')
+ mapEl.appendChild(E('h2', { 'name': 'content' }, this.title));
+
+ if (this.description != null && this.description != '')
+ mapEl.appendChild(E('div', { 'class': 'cbi-map-descr' }, this.description));
+
+ L.dom.append(mapEl, nodes);
+
+ if (!initialRender) {
+ mapEl.classList.remove('flash');
+
+ window.setTimeout(function() {
+ mapEl.classList.add('flash');
+ }, 1);
+ }
+
+ this.checkDepends();
+
+ return mapEl;
+ }, this));
+ },
+
+ lookupOption: function(name, section_id) {
+ var id, elem, sid, inst;
+
+ if (name.indexOf('.') > -1)
+ id = 'cbid.%s'.format(name);
+ else
+ id = 'cbid.%s.%s.%s'.format(this.config, section_id, name);
+
+ elem = this.findElement('data-field', id);
+ sid = elem ? id.split(/\./)[2] : null;
+ inst = elem ? L.dom.findClassInstance(elem) : null;
+
+ return (inst instanceof CBIAbstractValue) ? [ inst, sid ] : null;
+ },
+
+ checkDepends: function(ev, n) {
+ var changed = false;
+
+ for (var i = 0, s = this.children[0]; (s = this.children[i]) != null; i++)
+ if (s.checkDepends(ev, n))
+ changed = true;
+
+ if (changed && (n || 0) < 10)
+ this.checkDepends(ev, (n || 10) + 1);
+ }
+});
+
+var CBIAbstractSection = CBINode.extend({
+ __init__: function(map, sectionType /*, ... */) {
+ this.super('__init__', this.varargs(arguments, 2));
+
+ this.sectiontype = sectionType;
+ this.map = map;
+ this.config = map.config;
+
+ this.optional = true;
+ this.addremove = false;
+ this.dynamic = false;
+ },
+
+ cfgsections: function() {
+ L.error('InternalError', 'Not implemented');
+ },
+
+ filter: function(section_id) {
+ return true;
+ },
+
+ load: function() {
+ var section_ids = this.cfgsections(),
+ tasks = [];
+
+ if (Array.isArray(this.children))
+ for (var i = 0; i < section_ids.length; i++)
+ tasks.push(this.loadChildren(section_ids[i])
+ .then(Function.prototype.bind.call(function(section_id, set_values) {
+ for (var i = 0; i < set_values.length; i++)
+ this.children[i].cfgvalue(section_id, set_values[i]);
+ }, this, section_ids[i])));
+
+ return Promise.all(tasks);
+ },
+
+ parse: function() {
+ var section_ids = this.cfgsections(),
+ tasks = [];
+
+ if (Array.isArray(this.children))
+ for (var i = 0; i < section_ids.length; i++)
+ for (var j = 0; j < this.children.length; j++)
+ tasks.push(this.children[j].parse(section_ids[i]));
+
+ return Promise.all(tasks);
+ },
+
+ tab: function(name, title, description) {
+ if (this.tabs && this.tabs[name])
+ throw 'Tab already declared';
+
+ var entry = {
+ name: name,
+ title: title,
+ description: description,
+ children: []
+ };
+
+ this.tabs = this.tabs || [];
+ this.tabs.push(entry);
+ this.tabs[name] = entry;
+
+ this.tab_names = this.tab_names || [];
+ this.tab_names.push(name);
+ },
+
+ option: function(cbiClass /*, ... */) {
+ if (!CBIAbstractValue.isSubclass(cbiClass))
+ throw L.error('TypeError', 'Class must be a descendent of CBIAbstractValue');
+
+ var obj = cbiClass.instantiate(this.varargs(arguments, 1, this.map, this));
+ this.append(obj);
+ return obj;
+ },
+
+ taboption: function(tabName /*, ... */) {
+ if (!this.tabs || !this.tabs[tabName])
+ throw L.error('ReferenceError', 'Associated tab not declared');
+
+ var obj = this.option.apply(this, this.varargs(arguments, 1));
+ obj.tab = tabName;
+ this.tabs[tabName].children.push(obj);
+ return obj;
+ },
+
+ renderUCISection: function(section_id) {
+ var renderTasks = [];
+
+ if (!this.tabs)
+ return this.renderOptions(null, section_id);
+
+ for (var i = 0; i < this.tab_names.length; i++)
+ renderTasks.push(this.renderOptions(this.tab_names[i], section_id));
+
+ return Promise.all(renderTasks)
+ .then(this.renderTabContainers.bind(this, section_id));
+ },
+
+ renderTabContainers: function(section_id, nodes) {
+ var config_name = this.uciconfig || this.map.config,
+ containerEls = E([]);
+
+ for (var i = 0; i < nodes.length; i++) {
+ var tab_name = this.tab_names[i],
+ tab_data = this.tabs[tab_name],
+ containerEl = E('div', {
+ 'id': 'container.%s.%s.%s'.format(config_name, section_id, tab_name),
+ 'data-tab': tab_name,
+ 'data-tab-title': tab_data.title,
+ 'data-tab-active': tab_name === this.selected_tab
+ });
+
+ if (tab_data.description != null && tab_data.description != '')
+ containerEl.appendChild(
+ E('div', { 'class': 'cbi-tab-descr' }, tab_data.description));
+
+ containerEl.appendChild(nodes[i]);
+ containerEls.appendChild(containerEl);
+ }
+
+ return containerEls;
+ },
+
+ renderOptions: function(tab_name, section_id) {
+ var in_table = (this instanceof CBITableSection);
+ return this.renderChildren(tab_name, section_id, in_table).then(function(nodes) {
+ var optionEls = E([]);
+ for (var i = 0; i < nodes.length; i++)
+ optionEls.appendChild(nodes[i]);
+ return optionEls;
+ });
+ },
+
+ checkDepends: function(ev, n) {
+ var changed = false,
+ sids = this.cfgsections();
+
+ for (var i = 0, sid = sids[0]; (sid = sids[i]) != null; i++) {
+ for (var j = 0, o = this.children[0]; (o = this.children[j]) != null; j++) {
+ var isActive = o.isActive(sid),
+ isSatisified = o.checkDepends(sid);
+
+ if (isActive != isSatisified) {
+ o.setActive(sid, !isActive);
+ changed = true;
+ }
+
+ if (!n && isActive)
+ o.triggerValidation(sid);
+ }
+ }
+
+ return changed;
+ }
+});
+
+
+var isEqual = function(x, y) {
+ if (x != null && y != null && typeof(x) != typeof(y))
+ return false;
+
+ if ((x == null && y != null) || (x != null && y == null))
+ return false;
+
+ if (Array.isArray(x)) {
+ if (x.length != y.length)
+ return false;
+
+ for (var i = 0; i < x.length; i++)
+ if (!isEqual(x[i], y[i]))
+ return false;
+ }
+ else if (typeof(x) == 'object') {
+ for (var k in x) {
+ if (x.hasOwnProperty(k) && !y.hasOwnProperty(k))
+ return false;
+
+ if (!isEqual(x[k], y[k]))
+ return false;
+ }
+
+ for (var k in y)
+ if (y.hasOwnProperty(k) && !x.hasOwnProperty(k))
+ return false;
+ }
+ else if (x != y) {
+ return false;
+ }
+
+ return true;
+};
+
+var CBIAbstractValue = CBINode.extend({
+ __init__: function(map, section, option /*, ... */) {
+ this.super('__init__', this.varargs(arguments, 3));
+
+ this.section = section;
+ this.option = option;
+ this.map = map;
+ this.config = map.config;
+
+ this.deps = [];
+ this.initial = {};
+ this.rmempty = true;
+ this.default = null;
+ this.size = null;
+ this.optional = false;
+ },
+
+ depends: function(field, value) {
+ var deps;
+
+ if (typeof(field) === 'string')
+ deps = {}, deps[field] = value;
+ else
+ deps = field;
+
+ this.deps.push(deps);
+ },
+
+ transformDepList: function(section_id, deplist) {
+ var list = deplist || this.deps,
+ deps = [];
+
+ if (Array.isArray(list)) {
+ for (var i = 0; i < list.length; i++) {
+ var dep = {};
+
+ for (var k in list[i]) {
+ if (list[i].hasOwnProperty(k)) {
+ if (k.charAt(0) === '!')
+ dep[k] = list[i][k];
+ else if (k.indexOf('.') !== -1)
+ dep['cbid.%s'.format(k)] = list[i][k];
+ else
+ dep['cbid.%s.%s.%s'.format(this.config, this.ucisection || section_id, k)] = list[i][k];
+ }
+ }
+
+ for (var k in dep) {
+ if (dep.hasOwnProperty(k)) {
+ deps.push(dep);
+ break;
+ }
+ }
+ }
+ }
+
+ return deps;
+ },
+
+ transformChoices: function() {
+ if (!Array.isArray(this.keylist) || this.keylist.length == 0)
+ return null;
+
+ var choices = {};
+
+ for (var i = 0; i < this.keylist.length; i++)
+ choices[this.keylist[i]] = this.vallist[i];
+
+ return choices;
+ },
+
+ checkDepends: function(section_id) {
+ var def = false;
+
+ if (!Array.isArray(this.deps) || !this.deps.length)
+ return true;
+
+ for (var i = 0; i < this.deps.length; i++) {
+ var istat = true,
+ reverse = false;
+
+ for (var dep in this.deps[i]) {
+ if (dep == '!reverse') {
+ reverse = true;
+ }
+ else if (dep == '!default') {
+ def = true;
+ istat = false;
+ }
+ else {
+ var res = this.map.lookupOption(dep, section_id),
+ val = res ? res[0].formvalue(res[1]) : null;
+
+ istat = (istat && isEqual(val, this.deps[i][dep]));
+ }
+ }
+
+ if (istat ^ reverse)
+ return true;
+ }
+
+ return def;
+ },
+
+ cbid: function(section_id) {
+ if (section_id == null)
+ L.error('TypeError', 'Section ID required');
+
+ return 'cbid.%s.%s.%s'.format(this.map.config, section_id, this.option);
+ },
+
+ load: function(section_id) {
+ if (section_id == null)
+ L.error('TypeError', 'Section ID required');
+
+ return uci.get(
+ this.uciconfig || this.map.config,
+ this.ucisection || section_id,
+ this.ucioption || this.option);
+ },
+
+ cfgvalue: function(section_id, set_value) {
+ if (section_id == null)
+ L.error('TypeError', 'Section ID required');
+
+ if (arguments.length == 2) {
+ this.data = this.data || {};
+ this.data[section_id] = set_value;
+ }
+
+ return this.data ? this.data[section_id] : null;
+ },
+
+ formvalue: function(section_id) {
+ var node = this.map.findElement('id', this.cbid(section_id));
+ return node ? L.dom.callClassMethod(node, 'getValue') : null;
+ },
+
+ textvalue: function(section_id) {
+ var cval = this.cfgvalue(section_id);
+
+ if (cval == null)
+ cval = this.default;
+
+ return (cval != null) ? '%h'.format(cval) : null;
+ },
+
+ validate: function(section_id, value) {
+ return true;
+ },
+
+ isValid: function(section_id) {
+ var node = this.map.findElement('id', this.cbid(section_id));
+ return node ? L.dom.callClassMethod(node, 'isValid') : true;
+ },
+
+ isActive: function(section_id) {
+ var field = this.map.findElement('data-field', this.cbid(section_id));
+ return (field != null && !field.classList.contains('hidden'));
+ },
+
+ setActive: function(section_id, active) {
+ var field = this.map.findElement('data-field', this.cbid(section_id));
+
+ if (field && field.classList.contains('hidden') == active) {
+ field.classList[active ? 'remove' : 'add']('hidden');
+ return true;
+ }
+
+ return false;
+ },
+
+ triggerValidation: function(section_id) {
+ var node = this.map.findElement('id', this.cbid(section_id));
+ return node ? L.dom.callClassMethod(node, 'triggerValidation') : true;
+ },
+
+ parse: function(section_id) {
+ var active = this.isActive(section_id),
+ cval = this.cfgvalue(section_id),
+ fval = active ? this.formvalue(section_id) : null;
+
+ if (active && !this.isValid(section_id))
+ return Promise.reject();
+
+ if (fval != '' && fval != null) {
+ if (this.forcewrite || !isEqual(cval, fval))
+ return Promise.resolve(this.write(section_id, fval));
+ }
+ else {
+ if (this.rmempty || this.optional) {
+ return Promise.resolve(this.remove(section_id));
+ }
+ else if (!isEqual(cval, fval)) {
+ console.log('This should have been catched by isValid()');
+ return Promise.reject();
+ }
+ }
+
+ return Promise.resolve();
+ },
+
+ write: function(section_id, formvalue) {
+ return uci.set(
+ this.uciconfig || this.map.config,
+ this.ucisection || section_id,
+ this.ucioption || this.option,
+ formvalue);
+ },
+
+ remove: function(section_id) {
+ return uci.unset(
+ this.uciconfig || this.map.config,
+ this.ucisection || section_id,
+ this.ucioption || this.option);
+ }
+});
+
+var CBITypedSection = CBIAbstractSection.extend({
+ __name__: 'CBI.TypedSection',
+
+ cfgsections: function() {
+ return uci.sections(this.uciconfig || this.map.config, this.sectiontype)
+ .map(function(s) { return s['.name'] })
+ .filter(L.bind(this.filter, this));
+ },
+
+ handleAdd: function(ev, name) {
+ var config_name = this.uciconfig || this.map.config;
+
+ uci.add(config_name, this.sectiontype, name);
+ this.map.save();
+ },
+
+ handleRemove: function(section_id, ev) {
+ var config_name = this.uciconfig || this.map.config;
+
+ uci.remove(config_name, section_id);
+ this.map.save();
+ },
+
+ renderSectionAdd: function(extra_class) {
+ if (!this.addremove)
+ return E([]);
+
+ var createEl = E('div', { 'class': 'cbi-section-create' }),
+ config_name = this.uciconfig || this.map.config;
+
+ if (extra_class != null)
+ createEl.classList.add(extra_class);
+
+ if (this.anonymous) {
+ createEl.appendChild(E('input', {
+ 'type': 'submit',
+ 'class': 'cbi-button cbi-button-add',
+ 'value': _('Add'),
+ 'title': _('Add'),
+ 'click': L.bind(this.handleAdd, this)
+ }));
+ }
+ else {
+ var nameEl = E('input', {
+ 'type': 'text',
+ 'class': 'cbi-section-create-name'
+ });
+
+ L.dom.append(createEl, [
+ E('div', {}, nameEl),
+ E('input', {
+ 'class': 'cbi-button cbi-button-add',
+ 'type': 'submit',
+ 'value': _('Add'),
+ 'title': _('Add'),
+ 'click': L.bind(function(ev) {
+ if (nameEl.classList.contains('cbi-input-invalid'))
+ return;
+
+ this.handleAdd(ev, nameEl.value);
+ }, this)
+ })
+ ]);
+
+ ui.addValidator(nameEl, 'uciname', true, 'blur', 'keyup');
+ }
+
+ return createEl;
+ },
+
+ renderContents: function(cfgsections, nodes) {
+ var section_id = null,
+ config_name = this.uciconfig || this.map.config,
+ sectionEl = E('div', {
+ 'id': 'cbi-%s-%s'.format(config_name, this.sectiontype),
+ 'class': 'cbi-section'
+ });
+
+ if (this.title != null && this.title != '')
+ sectionEl.appendChild(E('legend', {}, this.title));
+
+ if (this.description != null && this.description != '')
+ sectionEl.appendChild(E('div', { 'class': 'cbi-section-descr' }, this.description));
+
+ for (var i = 0; i < nodes.length; i++) {
+ if (this.addremove) {
+ sectionEl.appendChild(
+ E('div', { 'class': 'cbi-section-remove right' },
+ E('input', {
+ 'type': 'submit',
+ 'class': 'cbi-button',
+ 'name': 'cbi.rts.%s.%s'.format(config_name, cfgsections[i]),
+ 'value': _('Delete'),
+ 'data-section-id': cfgsections[i],
+ 'click': L.bind(this.handleRemove, this, cfgsections[i])
+ })));
+ }
+
+ if (!this.anonymous)
+ sectionEl.appendChild(E('h3', cfgsections[i].toUpperCase()));
+
+ sectionEl.appendChild(E('div', {
+ 'id': 'cbi-%s-%s'.format(config_name, cfgsections[i]),
+ 'class': this.tabs
+ ? 'cbi-section-node cbi-section-node-tabbed' : 'cbi-section-node'
+ }, nodes[i]));
+
+ if (this.tabs)
+ ui.tabs.initTabGroup(sectionEl.lastChild.childNodes);
+ }
+
+ if (nodes.length == 0)
+ L.dom.append(sectionEl, [
+ E('em', _('This section contains no values yet')),
+ E('br'), E('br')
+ ]);
+
+ sectionEl.appendChild(this.renderSectionAdd());
+
+ L.dom.bindClassInstance(sectionEl, this);
+
+ return sectionEl;
+ },
+
+ render: function() {
+ var cfgsections = this.cfgsections(),
+ renderTasks = [];
+
+ for (var i = 0; i < cfgsections.length; i++)
+ renderTasks.push(this.renderUCISection(cfgsections[i]));
+
+ return Promise.all(renderTasks).then(this.renderContents.bind(this, cfgsections));
+ }
+});
+
+var CBITableSection = CBITypedSection.extend({
+ __name__: 'CBI.TableSection',
+
+ tab: function() {
+ throw 'Tabs are not supported by TableSection';
+ },
+
+ renderContents: function(cfgsections, nodes) {
+ var section_id = null,
+ config_name = this.uciconfig || this.map.config,
+ max_cols = isNaN(this.max_cols) ? this.children.length : this.max_cols,
+ has_more = max_cols < this.children.length,
+ sectionEl = E('div', {
+ 'id': 'cbi-%s-%s'.format(config_name, this.sectiontype),
+ 'class': 'cbi-section cbi-tblsection'
+ }),
+ tableEl = E('div', {
+ 'class': 'table cbi-section-table'
+ });
+
+ if (this.title != null && this.title != '')
+ sectionEl.appendChild(E('h3', {}, this.title));
+
+ if (this.description != null && this.description != '')
+ sectionEl.appendChild(E('div', { 'class': 'cbi-section-descr' }, this.description));
+
+ tableEl.appendChild(this.renderHeaderRows(max_cols));
+
+ for (var i = 0; i < nodes.length; i++) {
+ var sectionname = this.stripTags((typeof(this.sectiontitle) == 'function')
+ ? String(this.sectiontitle(cfgsections[i]) || '') : cfgsections[i]).trim();
+
+ var trEl = E('div', {
+ 'id': 'cbi-%s-%s'.format(config_name, cfgsections[i]),
+ 'class': 'tr cbi-section-table-row',
+ 'data-sid': cfgsections[i],
+ 'draggable': this.sortable ? true : null,
+ 'mousedown': this.sortable ? L.bind(this.handleDragInit, this) : null,
+ 'dragstart': this.sortable ? L.bind(this.handleDragStart, this) : null,
+ 'dragover': this.sortable ? L.bind(this.handleDragOver, this) : null,
+ 'dragenter': this.sortable ? L.bind(this.handleDragEnter, this) : null,
+ 'dragleave': this.sortable ? L.bind(this.handleDragLeave, this) : null,
+ 'dragend': this.sortable ? L.bind(this.handleDragEnd, this) : null,
+ 'drop': this.sortable ? L.bind(this.handleDrop, this) : null,
+ 'data-title': (sectionname && (!this.anonymous || this.sectiontitle)) ? sectionname : null
+ });
+
+ if (this.extedit || this.rowcolors)
+ trEl.classList.add(!(tableEl.childNodes.length % 2)
+ ? 'cbi-rowstyle-1' : 'cbi-rowstyle-2');
+
+ for (var j = 0; j < max_cols && nodes[i].firstChild; j++)
+ trEl.appendChild(nodes[i].firstChild);
+
+ trEl.appendChild(this.renderRowActions(cfgsections[i], has_more ? _('More…') : null));
+ tableEl.appendChild(trEl);
+ }
+
+ if (nodes.length == 0)
+ tableEl.appendChild(E('div', { 'class': 'tr cbi-section-table-row placeholder' },
+ E('div', { 'class': 'td' },
+ E('em', {}, _('This section contains no values yet')))));
+
+ sectionEl.appendChild(tableEl);
+
+ sectionEl.appendChild(this.renderSectionAdd('cbi-tblsection-create'));
+
+ L.dom.bindClassInstance(sectionEl, this);
+
+ return sectionEl;
+ },
+
+ renderHeaderRows: function(max_cols) {
+ var has_titles = false,
+ has_descriptions = false,
+ anon_class = (!this.anonymous || this.sectiontitle) ? 'named' : 'anonymous',
+ trEls = E([]);
+
+ for (var i = 0, opt; i < max_cols && (opt = this.children[i]) != null; i++) {
+ if (opt.optional || opt.modalonly)
+ continue;
+
+ has_titles = has_titles || !!opt.title;
+ has_descriptions = has_descriptions || !!opt.description;
+ }
+
+ if (has_titles) {
+ var trEl = E('div', {
+ 'class': 'tr cbi-section-table-titles ' + anon_class,
+ 'data-title': (!this.anonymous || this.sectiontitle) ? _('Name') : null
+ });
+
+ for (var i = 0, opt; i < max_cols && (opt = this.children[i]) != null; i++) {
+ if (opt.optional || opt.modalonly)
+ continue;
+
+ trEl.appendChild(E('div', {
+ 'class': 'th cbi-section-table-cell',
+ 'data-type': opt.__name__
+ }));
+
+ if (opt.width != null)
+ trEl.lastElementChild.style.width =
+ (typeof(opt.width) == 'number') ? opt.width+'px' : opt.width;
+
+ if (opt.titleref)
+ trEl.lastElementChild.appendChild(E('a', {
+ 'href': opt.titleref,
+ 'class': 'cbi-title-ref',
+ 'title': this.titledesc || _('Go to relevant configuration page')
+ }, opt.title));
+ else
+ L.dom.content(trEl.lastElementChild, opt.title);
+ }
+
+ if (this.sortable || this.extedit || this.addremove || has_more)
+ trEl.appendChild(E('div', {
+ 'class': 'th cbi-section-table-cell cbi-section-actions'
+ }));
+
+ trEls.appendChild(trEl);
+ }
+
+ if (has_descriptions) {
+ var trEl = E('div', {
+ 'class': 'tr cbi-section-table-descr ' + anon_class
+ });
+
+ for (var i = 0, opt; i < max_cols && (opt = this.children[i]) != null; i++) {
+ if (opt.optional || opt.modalonly)
+ continue;
+
+ trEl.appendChild(E('div', {
+ 'class': 'th cbi-section-table-cell',
+ 'data-type': opt.__name__
+ }, opt.description));
+
+ if (opt.width != null)
+ trEl.lastElementChild.style.width =
+ (typeof(opt.width) == 'number') ? opt.width+'px' : opt.width;
+ }
+
+ if (this.sortable || this.extedit || this.addremove || has_more)
+ trEl.appendChild(E('div', {
+ 'class': 'th cbi-section-table-cell cbi-section-actions'
+ }));
+
+ trEls.appendChild(trEl);
+ }
+
+ return trEls;
+ },
+
+ renderRowActions: function(section_id, more_label) {
+ var config_name = this.uciconfig || this.map.config;
+
+ if (!this.sortable && !this.extedit && !this.addremove && !more_label)
+ return E([]);
+
+ var tdEl = E('div', {
+ 'class': 'td cbi-section-table-cell nowrap cbi-section-actions'
+ }, E('div'));
+
+ if (this.sortable) {
+ L.dom.append(tdEl.lastElementChild, [
+ E('div', {
+ 'title': _('Drag to reorder'),
+ 'class': 'cbi-button drag-handle center',
+ 'style': 'cursor:move'
+ }, '☰')
+ ]);
+ }
+
+ if (this.extedit) {
+ var evFn = null;
+
+ if (typeof(this.extedit) == 'function')
+ evFn = L.bind(this.extedit, this);
+ else if (typeof(this.extedit) == 'string')
+ evFn = L.bind(function(sid, ev) {
+ location.href = this.extedit.format(sid);
+ }, this, section_id);
+
+ L.dom.append(tdEl.lastElementChild,
+ E('input', {
+ 'type': 'button',
+ 'value': _('Edit'),
+ 'title': _('Edit'),
+ 'class': 'cbi-button cbi-button-edit',
+ 'click': evFn
+ })
+ );
+ }
+
+ if (more_label) {
+ L.dom.append(tdEl.lastElementChild,
+ E('input', {
+ 'type': 'button',
+ 'value': more_label,
+ 'title': more_label,
+ 'class': 'cbi-button cbi-button-edit',
+ 'click': L.bind(this.renderMoreOptionsModal, this, section_id)
+ })
+ );
+ }
+
+ if (this.addremove) {
+ L.dom.append(tdEl.lastElementChild,
+ E('input', {
+ 'type': 'submit',
+ 'value': _('Delete'),
+ 'title': _('Delete'),
+ 'class': 'cbi-button cbi-button-remove',
+ 'click': L.bind(function(sid, ev) {
+ uci.remove(config_name, sid);
+ this.map.save();
+ }, this, section_id)
+ })
+ );
+ }
+
+ return tdEl;
+ },
+
+ handleDragInit: function(ev) {
+ scope.dragState = { node: ev.target };
+ },
+
+ handleDragStart: function(ev) {
+ if (!scope.dragState || !scope.dragState.node.classList.contains('drag-handle')) {
+ scope.dragState = null;
+ ev.preventDefault();
+ return false;
+ }
+
+ scope.dragState.node = L.dom.parent(scope.dragState.node, '.tr');
+ ev.dataTransfer.setData('text', 'drag');
+ ev.target.style.opacity = 0.4;
+ },
+
+ handleDragOver: function(ev) {
+ var n = scope.dragState.targetNode,
+ r = scope.dragState.rect,
+ t = r.top + r.height / 2;
+
+ if (ev.clientY <= t) {
+ n.classList.remove('drag-over-below');
+ n.classList.add('drag-over-above');
+ }
+ else {
+ n.classList.remove('drag-over-above');
+ n.classList.add('drag-over-below');
+ }
+
+ ev.dataTransfer.dropEffect = 'move';
+ ev.preventDefault();
+ return false;
+ },
+
+ handleDragEnter: function(ev) {
+ scope.dragState.rect = ev.currentTarget.getBoundingClientRect();
+ scope.dragState.targetNode = ev.currentTarget;
+ },
+
+ handleDragLeave: function(ev) {
+ ev.currentTarget.classList.remove('drag-over-above');
+ ev.currentTarget.classList.remove('drag-over-below');
+ },
+
+ handleDragEnd: function(ev) {
+ var n = ev.target;
+
+ n.style.opacity = '';
+ n.classList.add('flash');
+ n.parentNode.querySelectorAll('.drag-over-above, .drag-over-below')
+ .forEach(function(tr) {
+ tr.classList.remove('drag-over-above');
+ tr.classList.remove('drag-over-below');
+ });
+ },
+
+ handleDrop: function(ev) {
+ var s = scope.dragState;
+
+ if (s.node && s.targetNode) {
+ var config_name = this.uciconfig || this.map.config,
+ ref_node = s.targetNode,
+ after = false;
+
+ if (ref_node.classList.contains('drag-over-below')) {
+ ref_node = ref_node.nextElementSibling;
+ after = true;
+ }
+
+ var sid1 = s.node.getAttribute('data-sid'),
+ sid2 = s.targetNode.getAttribute('data-sid');
+
+ s.node.parentNode.insertBefore(s.node, ref_node);
+ uci.move(config_name, sid1, sid2, after);
+ }
+
+ scope.dragState = null;
+ ev.target.style.opacity = '';
+ ev.stopPropagation();
+ ev.preventDefault();
+ return false;
+ },
+
+ handleModalCancel: function(modalMap, ev) {
+ return Promise.resolve(L.ui.hideModal());
+ },
+
+ handleModalSave: function(modalMap, ev) {
+ return modalMap.save()
+ .then(L.bind(this.map.reset, this.map))
+ .then(L.ui.hideModal)
+ .catch(function() {});
+ },
+
+ renderMoreOptionsModal: function(section_id, ev) {
+ var parent = this.map,
+ title = parent.title,
+ name = null,
+ m = new CBIMap(this.map.config, null, null),
+ s = m.section(CBINamedSection, section_id, this.sectiontype);
+ s.tabs = this.tabs;
+ s.tab_names = this.tab_names;
+
+ if (typeof(this.sectiontitle) == 'function')
+ name = this.stripTags(String(this.sectiontitle(section_id) || ''));
+ else if (!this.anonymous)
+ name = section_id;
+
+ if (name)
+ title += ' - ' + name;
+
+ for (var i = 0; i < this.children.length; i++) {
+ var o1 = this.children[i];
+
+ if (o1.modalonly === false)
+ continue;
+
+ var o2 = s.option(o1.constructor, o1.option, o1.title, o1.description);
+
+ for (var k in o1) {
+ if (!o1.hasOwnProperty(k))
+ continue;
+
+ switch (k) {
+ case 'map':
+ case 'section':
+ case 'option':
+ case 'title':
+ case 'description':
+ continue;
+
+ default:
+ o2[k] = o1[k];
+ }
+ }
+ }
+
+ //ev.target.classList.add('spinning');
+ m.render().then(L.bind(function(nodes) {
+ //ev.target.classList.remove('spinning');
+ L.ui.showModal(title, [
+ nodes,
+ E('div', { 'class': 'right' }, [
+ E('input', {
+ 'type': 'button',
+ 'class': 'btn',
+ 'click': L.bind(this.handleModalCancel, this, m),
+ 'value': _('Dismiss')
+ }), ' ',
+ E('input', {
+ 'type': 'button',
+ 'class': 'cbi-button cbi-button-positive important',
+ 'click': L.bind(this.handleModalSave, this, m),
+ 'value': _('Save')
+ })
+ ])
+ ], 'cbi-modal');
+ }, this)).catch(L.error);
+ }
+});
+
+var CBIGridSection = CBITableSection.extend({
+ tab: function(name, title, description) {
+ CBIAbstractSection.prototype.tab.call(this, name, title, description);
+ },
+
+ handleAdd: function(ev) {
+ var config_name = this.uciconfig || this.map.config,
+ section_id = uci.add(config_name, this.sectiontype);
+
+ this.addedSection = section_id;
+ this.renderMoreOptionsModal(section_id);
+ },
+
+ handleModalSave: function(/* ... */) {
+ return this.super('handleModalSave', arguments)
+ .then(L.bind(function() { this.addedSection = null }, this));
+ },
+
+ handleModalCancel: function(/* ... */) {
+ var config_name = this.uciconfig || this.map.config;
+
+ if (this.addedSection != null) {
+ uci.remove(config_name, this.addedSection);
+ this.addedSection = null;
+ }
+
+ return this.super('handleModalCancel', arguments);
+ },
+
+ renderUCISection: function(section_id) {
+ return this.renderOptions(null, section_id);
+ },
+
+ renderChildren: function(tab_name, section_id, in_table) {
+ var tasks = [], index = 0;
+
+ for (var i = 0, opt; (opt = this.children[i]) != null; i++) {
+ if (opt.disable || opt.modalonly)
+ continue;
+
+ if (opt.editable)
+ tasks.push(opt.render(index++, section_id, in_table));
+ else
+ tasks.push(this.renderTextValue(section_id, opt));
+ }
+
+ return Promise.all(tasks);
+ },
+
+ renderTextValue: function(section_id, opt) {
+ var title = this.stripTags(opt.title).trim(),
+ descr = this.stripTags(opt.description).trim(),
+ value = opt.textvalue(section_id);
+
+ return E('div', {
+ 'class': 'td cbi-value-field',
+ 'data-title': (title != '') ? title : opt.option,
+ 'data-description': (descr != '') ? descr : null,
+ 'data-name': opt.option,
+ 'data-type': opt.typename || opt.__name__
+ }, (value != null) ? value : E('em', _('none')));
+ },
+
+ renderRowActions: function(section_id) {
+ return this.super('renderRowActions', [ section_id, _('Edit') ]);
+ },
+
+ parse: function() {
+ var section_ids = this.cfgsections(),
+ tasks = [];
+
+ if (Array.isArray(this.children)) {
+ for (var i = 0; i < section_ids.length; i++) {
+ for (var j = 0; j < this.children.length; j++) {
+ if (!this.children[j].editable || this.children[j].modalonly)
+ continue;
+
+ tasks.push(this.children[j].parse(section_ids[i]));
+ }
+ }
+ }
+
+ return Promise.all(tasks);
+ }
+});
+
+var CBINamedSection = CBIAbstractSection.extend({
+ __name__: 'CBI.NamedSection',
+ __init__: function(map, section_id /*, ... */) {
+ this.super('__init__', this.varargs(arguments, 2, map));
+
+ this.section = section_id;
+ },
+
+ cfgsections: function() {
+ return [ this.section ];
+ },
+
+ handleAdd: function(ev) {
+ var section_id = this.section,
+ config_name = this.uciconfig || this.map.config;
+
+ uci.add(config_name, this.sectiontype, section_id);
+ this.map.save();
+ },
+
+ handleRemove: function(ev) {
+ var section_id = this.section,
+ config_name = this.uciconfig || this.map.config;
+
+ uci.remove(config_name, section_id);
+ this.map.save();
+ },
+
+ renderContents: function(data) {
+ var ucidata = data[0], nodes = data[1],
+ section_id = this.section,
+ config_name = this.uciconfig || this.map.config,
+ sectionEl = E('div', {
+ 'id': ucidata ? null : 'cbi-%s-%s'.format(config_name, section_id),
+ 'class': 'cbi-section'
+ });
+
+ if (typeof(this.title) === 'string' && this.title !== '')
+ sectionEl.appendChild(E('legend', {}, this.title));
+
+ if (typeof(this.description) === 'string' && this.description !== '')
+ sectionEl.appendChild(E('div', { 'class': 'cbi-section-descr' }, this.description));
+
+ if (ucidata) {
+ if (this.addremove) {
+ sectionEl.appendChild(
+ E('div', { 'class': 'cbi-section-remove right' },
+ E('input', {
+ 'type': 'submit',
+ 'class': 'cbi-button',
+ 'value': _('Delete'),
+ 'click': L.bind(this.handleRemove, this)
+ })));
+ }
+
+ sectionEl.appendChild(E('div', {
+ 'id': 'cbi-%s-%s'.format(config_name, section_id),
+ 'class': this.tabs
+ ? 'cbi-section-node cbi-section-node-tabbed' : 'cbi-section-node'
+ }, nodes));
+
+ if (this.tabs)
+ ui.tabs.initTabGroup(sectionEl.lastChild.childNodes);
+ }
+ else if (this.addremove) {
+ sectionEl.appendChild(
+ E('input', {
+ 'type': 'submit',
+ 'class': 'cbi-button cbi-button-add',
+ 'value': _('Add'),
+ 'click': L.bind(this.handleAdd, this)
+ }));
+ }
+
+ L.dom.bindClassInstance(sectionEl, this);
+
+ return sectionEl;
+ },
+
+ render: function() {
+ var config_name = this.uciconfig || this.map.config,
+ section_id = this.section;
+
+ return Promise.all([
+ uci.get(config_name, section_id),
+ this.renderUCISection(section_id)
+ ]).then(this.renderContents.bind(this));
+ }
+});
+
+var CBIValue = CBIAbstractValue.extend({
+ __name__: 'CBI.Value',
+
+ value: function(key, val) {
+ this.keylist = this.keylist || [];
+ this.keylist.push(String(key));
+
+ this.vallist = this.vallist || [];
+ this.vallist.push(String(val != null ? val : key));
+ },
+
+ render: function(option_index, section_id, in_table) {
+ return Promise.resolve(this.cfgvalue(section_id))
+ .then(this.renderWidget.bind(this, section_id, option_index))
+ .then(this.renderFrame.bind(this, section_id, in_table, option_index));
+ },
+
+ renderFrame: function(section_id, in_table, option_index, nodes) {
+ var config_name = this.uciconfig || this.map.config,
+ depend_list = this.transformDepList(section_id),
+ optionEl;
+
+ if (in_table) {
+ optionEl = E('div', {
+ 'class': 'td cbi-value-field',
+ 'data-title': this.stripTags(this.title).trim(),
+ 'data-description': this.stripTags(this.description).trim(),
+ 'data-name': this.option,
+ 'data-type': this.typename || (this.template ? this.template.replace(/^.+\//, '') : null) || this.__name__
+ }, E('div', {
+ 'id': 'cbi-%s-%s-%s'.format(config_name, section_id, this.option),
+ 'data-index': option_index,
+ 'data-depends': depend_list,
+ 'data-field': this.cbid(section_id)
+ }));
+ }
+ else {
+ optionEl = E('div', {
+ 'class': 'cbi-value',
+ 'id': 'cbi-%s-%s-%s'.format(config_name, section_id, this.option),
+ 'data-index': option_index,
+ 'data-depends': depend_list,
+ 'data-field': this.cbid(section_id),
+ 'data-name': this.option,
+ 'data-type': this.typename || (this.template ? this.template.replace(/^.+\//, '') : null) || this.__name__
+ });
+
+ if (this.last_child)
+ optionEl.classList.add('cbi-value-last');
+
+ if (typeof(this.title) === 'string' && this.title !== '') {
+ optionEl.appendChild(E('label', {
+ 'class': 'cbi-value-title',
+ 'for': 'cbid.%s.%s.%s'.format(config_name, section_id, this.option)
+ },
+ this.titleref ? E('a', {
+ 'class': 'cbi-title-ref',
+ 'href': this.titleref,
+ 'title': this.titledesc || _('Go to relevant configuration page')
+ }, this.title) : this.title));
+
+ optionEl.appendChild(E('div', { 'class': 'cbi-value-field' }));
+ }
+ }
+
+ if (nodes)
+ (optionEl.lastChild || optionEl).appendChild(nodes);
+
+ if (!in_table && typeof(this.description) === 'string' && this.description !== '')
+ L.dom.append(optionEl.lastChild || optionEl,
+ E('div', { 'class': 'cbi-value-description' }, this.description));
+
+ if (depend_list && depend_list.length)
+ optionEl.classList.add('hidden');
+
+ optionEl.addEventListener('widget-change',
+ L.bind(this.map.checkDepends, this.map));
+
+ L.dom.bindClassInstance(optionEl, this);
+
+ return optionEl;
+ },
+
+ renderWidget: function(section_id, option_index, cfgvalue) {
+ var value = (cfgvalue != null) ? cfgvalue : this.default,
+ choices = this.transformChoices(),
+ widget;
+
+ if (choices) {
+ var placeholder = (this.optional || this.rmempty)
+ ? E('em', _('unspecified')) : _('-- Please choose --');
+
+ widget = new ui.Combobox(Array.isArray(value) ? value.join(' ') : value, choices, {
+ id: this.cbid(section_id),
+ sort: this.keylist,
+ optional: this.optional || this.rmempty,
+ datatype: this.datatype,
+ select_placeholder: this.placeholder || placeholder,
+ validate: L.bind(this.validate, this, section_id)
+ });
+ }
+ else {
+ widget = new ui.Textfield(Array.isArray(value) ? value.join(' ') : value, {
+ id: this.cbid(section_id),
+ password: this.password,
+ optional: this.optional || this.rmempty,
+ datatype: this.datatype,
+ placeholder: this.placeholder,
+ validate: L.bind(this.validate, this, section_id)
+ });
+ }
+
+ return widget.render();
+ }
+});
+
+var CBIDynamicList = CBIValue.extend({
+ __name__: 'CBI.DynamicList',
+
+ renderWidget: function(section_id, option_index, cfgvalue) {
+ var value = (cfgvalue != null) ? cfgvalue : this.default,
+ choices = this.transformChoices(),
+ items = null;
+
+ if (Array.isArray(value))
+ items = value;
+ else if (value != null)
+ items = String(value).trim().split(/\s+/);
+
+ var widget = new ui.DynamicList(items, choices, {
+ id: this.cbid(section_id),
+ sort: this.keylist,
+ optional: this.optional || this.rmempty,
+ datatype: this.datatype,
+ placeholder: this.placeholder,
+ validate: L.bind(this.validate, this, section_id)
+ });
+
+ return widget.render();
+ },
+});
+
+var CBIListValue = CBIValue.extend({
+ __name__: 'CBI.ListValue',
+
+ __init__: function() {
+ this.super('__init__', arguments);
+ this.widget = 'select';
+ this.deplist = [];
+ },
+
+ renderWidget: function(section_id, option_index, cfgvalue) {
+ var choices = this.transformChoices();
+ var widget = new ui.Select((cfgvalue != null) ? cfgvalue : this.default, choices, {
+ id: this.cbid(section_id),
+ size: this.size,
+ sort: this.keylist,
+ optional: this.rmempty || this.optional,
+ validate: L.bind(this.validate, this, section_id)
+ });
+
+ return widget.render();
+ },
+});
+
+var CBIFlagValue = CBIValue.extend({
+ __name__: 'CBI.FlagValue',
+
+ __init__: function() {
+ this.super('__init__', arguments);
+
+ this.enabled = '1';
+ this.disabled = '0';
+ this.default = this.disabled;
+ },
+
+ renderWidget: function(section_id, option_index, cfgvalue) {
+ var widget = new ui.Checkbox((cfgvalue != null) ? cfgvalue : this.default, {
+ id: this.cbid(section_id),
+ value_enabled: this.enabled,
+ value_disabled: this.disabled,
+ validate: L.bind(this.validate, this, section_id)
+ });
+
+ return widget.render();
+ },
+
+ formvalue: function(section_id) {
+ var node = this.map.findElement('id', this.cbid(section_id)),
+ checked = node ? L.dom.callClassMethod(node, 'isChecked') : false;
+
+ return checked ? this.enabled : this.disabled;
+ },
+
+ textvalue: function(section_id) {
+ var cval = this.cfgvalue(section_id);
+
+ if (cval == null)
+ cval = this.default;
+
+ return (cval == this.enabled) ? _('Yes') : _('No');
+ },
+
+ parse: function(section_id) {
+ if (this.isActive(section_id)) {
+ var fval = this.formvalue(section_id);
+
+ if (!this.isValid(section_id))
+ return Promise.reject();
+
+ if (fval == this.default && (this.optional || this.rmempty))
+ return Promise.resolve(this.remove(section_id));
+ else
+ return Promise.resolve(this.write(section_id, fval));
+ }
+ else {
+ return Promise.resolve(this.remove(section_id));
+ }
+ },
+});
+
+var CBIMultiValue = CBIDynamicList.extend({
+ __name__: 'CBI.MultiValue',
+
+ __init__: function() {
+ this.super('__init__', arguments);
+ this.placeholder = _('-- Please choose --');
+ },
+
+ renderWidget: function(section_id, option_index, cfgvalue) {
+ var value = (cfgvalue != null) ? cfgvalue : this.default,
+ choices = this.transformChoices();
+
+ if (!Array.isArray(value))
+ value = String(value).split(/\s+/);
+
+ var widget = new ui.Dropdown(value, choices, {
+ id: this.cbid(section_id),
+ sort: this.keylist,
+ multiple: true,
+ optional: this.optional || this.rmempty,
+ select_placeholder: this.placeholder,
+ display_items: this.display_size || this.size || 3,
+ dropdown_items: this.dropdown_size || this.size || -1,
+ validate: L.bind(this.validate, this, section_id)
+ });
+
+ return widget.render();
+ },
+});
+
+var CBIDummyValue = CBIValue.extend({
+ __name__: 'CBI.DummyValue',
+
+ renderWidget: function(section_id, option_index, cfgvalue) {
+ var value = (cfgvalue != null) ? cfgvalue : this.default,
+ hiddenEl = new ui.Hiddenfield(value, { id: this.cbid(section_id) }),
+ outputEl = E('div');
+
+ if (this.href)
+ outputEl.appendChild(E('a', { 'href': this.href }));
+
+ L.dom.append(outputEl.lastChild || outputEl,
+ this.rawhtml ? value : [ value ]);
+
+ return E([
+ outputEl,
+ hiddenEl.render()
+ ]);
+ },
+});
+
+var CBIButtonValue = CBIValue.extend({
+ __name__: 'CBI.ButtonValue',
+
+ renderWidget: function(section_id, option_index, cfgvalue) {
+ var value = (cfgvalue != null) ? cfgvalue : this.default;
+
+ if (value !== false)
+ return E([
+ E('input', {
+ 'type': 'hidden',
+ 'id': this.cbid(section_id)
+ }),
+ E('input', {
+ 'class': 'cbi-button cbi-button-%s'.format(this.inputstyle || 'button'),
+ 'type': 'submit',
+ //'id': this.cbid(section_id),
+ //'name': this.cbid(section_id),
+ 'value': this.inputtitle || this.title,
+ 'click': L.bind(function(ev) {
+ ev.target.previousElementSibling.value = ev.target.value;
+ this.map.save();
+ }, this)
+ })
+ ]);
+ else
+ return document.createTextNode(' - ');
+ }
+});
+
+var CBIHiddenValue = CBIValue.extend({
+ __name__: 'CBI.HiddenValue',
+
+ renderWidget: function(section_id, option_index, cfgvalue) {
+ var widget = new ui.Hiddenfield((cfgvalue != null) ? cfgvalue : this.default, {
+ id: this.cbid(section_id)
+ });
+
+ return widget.render();
+ }
+});
+
+var CBISectionValue = CBIValue.extend({
+ __name__: 'CBI.ContainerValue',
+ __init__: function(map, section, option, cbiClass /*, ... */) {
+ this.super('__init__', [map, section, option]);
+
+ if (!CBIAbstractSection.isSubclass(cbiClass))
+ throw 'Sub section must be a descendent of CBIAbstractSection';
+
+ this.subsection = cbiClass.instantiate(this.varargs(arguments, 4, this.map));
+ },
+
+ load: function(section_id) {
+ return this.subsection.load();
+ },
+
+ parse: function(section_id) {
+ return this.subsection.parse();
+ },
+
+ renderWidget: function(section_id, option_index, cfgvalue) {
+ return this.subsection.render();
+ },
+
+ checkDepends: function(section_id) {
+ this.subsection.checkDepends();
+ return this.super('checkDepends');
+ },
+
+ write: function() {},
+ remove: function() {},
+ cfgvalue: function() { return null },
+ formvalue: function() { return null }
+});
+
+return L.Class.extend({
+ Map: CBIMap,
+ AbstractSection: CBIAbstractSection,
+ AbstractValue: CBIAbstractValue,
+
+ TypedSection: CBITypedSection,
+ TableSection: CBITableSection,
+ GridSection: CBIGridSection,
+ NamedSection: CBINamedSection,
+
+ Value: CBIValue,
+ DynamicList: CBIDynamicList,
+ ListValue: CBIListValue,
+ Flag: CBIFlagValue,
+ MultiValue: CBIMultiValue,
+ DummyValue: CBIDummyValue,
+ Button: CBIButtonValue,
+ HiddenValue: CBIHiddenValue,
+ SectionValue: CBISectionValue
+});
diff --git a/modules/luci-base/htdocs/luci-static/resources/luci.js b/modules/luci-base/htdocs/luci-static/resources/luci.js
index 4cb8bf4e5d..1e1c38bbed 100644
--- a/modules/luci-base/htdocs/luci-static/resources/luci.js
+++ b/modules/luci-base/htdocs/luci-static/resources/luci.js
@@ -1,511 +1,1215 @@
(function(window, document, undefined) {
- var modalDiv = null,
- tooltipDiv = null,
- tooltipTimeout = null,
- dummyElem = null,
- domParser = null;
+ 'use strict';
+
+ /* Object.assign polyfill for IE */
+ if (typeof Object.assign !== 'function') {
+ Object.defineProperty(Object, 'assign', {
+ value: function assign(target, varArgs) {
+ if (target == null)
+ throw new TypeError('Cannot convert undefined or null to object');
+
+ var to = Object(target);
+
+ for (var index = 1; index < arguments.length; index++)
+ if (arguments[index] != null)
+ for (var nextKey in arguments[index])
+ if (Object.prototype.hasOwnProperty.call(arguments[index], nextKey))
+ to[nextKey] = arguments[index][nextKey];
+
+ return to;
+ },
+ writable: true,
+ configurable: true
+ });
+ }
- LuCI.prototype = {
- /* URL construction helpers */
- path: function(prefix, parts) {
- var url = [ prefix || '' ];
+ /*
+ * Class declaration and inheritance helper
+ */
- for (var i = 0; i < parts.length; i++)
- if (/^(?:[a-zA-Z0-9_.%,;-]+\/)*[a-zA-Z0-9_.%,;-]+$/.test(parts[i]))
- url.push('/', parts[i]);
+ var toCamelCase = function(s) {
+ return s.replace(/(?:^|[\. -])(.)/g, function(m0, m1) { return m1.toUpperCase() });
+ };
- if (url.length === 1)
- url.push('/');
+ var superContext = null, Class = Object.assign(function() {}, {
+ extend: function(properties) {
+ var props = {
+ __base__: { value: this.prototype },
+ __name__: { value: properties.__name__ || 'anonymous' }
+ };
- return url.join('');
- },
+ var ClassConstructor = function() {
+ if (!(this instanceof ClassConstructor))
+ throw new TypeError('Constructor must not be called without "new"');
- url: function() {
- return this.path(this.env.scriptname, arguments);
+ if (Object.getPrototypeOf(this).hasOwnProperty('__init__')) {
+ if (typeof(this.__init__) != 'function')
+ throw new TypeError('Class __init__ member is not a function');
+
+ this.__init__.apply(this, arguments)
+ }
+ else {
+ this.super('__init__', arguments);
+ }
+ };
+
+ for (var key in properties)
+ if (!props[key] && properties.hasOwnProperty(key))
+ props[key] = { value: properties[key], writable: true };
+
+ ClassConstructor.prototype = Object.create(this.prototype, props);
+ ClassConstructor.prototype.constructor = ClassConstructor;
+ Object.assign(ClassConstructor, this);
+ ClassConstructor.displayName = toCamelCase(props.__name__.value + 'Class');
+
+ return ClassConstructor;
},
- resource: function() {
- return this.path(this.env.resource, arguments);
+ singleton: function(properties /*, ... */) {
+ return Class.extend(properties)
+ .instantiate(Class.prototype.varargs(arguments, 1));
},
- location: function() {
- return this.path(this.env.scriptname, this.env.requestpath);
+ instantiate: function(args) {
+ return new (Function.prototype.bind.apply(this,
+ Class.prototype.varargs(args, 0, null)))();
},
+ call: function(self, method) {
+ if (typeof(this.prototype[method]) != 'function')
+ throw new ReferenceError(method + ' is not defined in class');
- /* HTTP resource fetching */
- get: function(url, args, cb) {
- return this.poll(0, url, args, cb, false);
+ return this.prototype[method].apply(self, self.varargs(arguments, 1));
},
- post: function(url, args, cb) {
- return this.poll(0, url, args, cb, true);
+ isSubclass: function(_class) {
+ return (_class != null &&
+ typeof(_class) == 'function' &&
+ _class.prototype instanceof this);
},
- poll: function(interval, url, args, cb, post) {
- var data = post ? { token: this.env.token } : null;
+ prototype: {
+ varargs: function(args, offset /*, ... */) {
+ return Array.prototype.slice.call(arguments, 2)
+ .concat(Array.prototype.slice.call(args, offset));
+ },
- if (!/^(?:\/|\S+:\/\/)/.test(url))
- url = this.url(url);
+ super: function(key, callArgs) {
+ for (superContext = Object.getPrototypeOf(superContext ||
+ Object.getPrototypeOf(this));
+ superContext && !superContext.hasOwnProperty(key);
+ superContext = Object.getPrototypeOf(superContext)) { }
- if (typeof(args) === 'object' && args !== null) {
- data = data || {};
+ if (!superContext)
+ return null;
- for (var key in args)
- if (args.hasOwnProperty(key))
- switch (typeof(args[key])) {
- case 'string':
- case 'number':
- case 'boolean':
- data[key] = args[key];
- break;
+ var res = superContext[key];
- case 'object':
- data[key] = JSON.stringify(args[key]);
- break;
- }
+ if (arguments.length > 1) {
+ if (typeof(res) != 'function')
+ throw new ReferenceError(key + ' is not a function in base class');
+
+ if (typeof(callArgs) != 'object')
+ callArgs = this.varargs(arguments, 1);
+
+ res = res.apply(this, callArgs);
+ }
+
+ superContext = null;
+
+ return res;
+ },
+
+ toString: function() {
+ var s = '[' + this.constructor.displayName + ']', f = true;
+ for (var k in this) {
+ if (this.hasOwnProperty(k)) {
+ s += (f ? ' {\n' : '') + ' ' + k + ': ' + typeof(this[k]) + '\n';
+ f = false;
+ }
+ }
+ return s + (f ? '' : '}');
}
+ }
+ });
- if (interval > 0)
- return XHR.poll(interval, url, data, cb, post);
- else if (post)
- return XHR.post(url, data, cb);
- else
- return XHR.get(url, data, cb);
+
+ /*
+ * HTTP Request helper
+ */
+
+ var Headers = Class.extend({
+ __name__: 'LuCI.XHR.Headers',
+ __init__: function(xhr) {
+ var hdrs = this.headers = {};
+ xhr.getAllResponseHeaders().split(/\r\n/).forEach(function(line) {
+ var m = /^([^:]+):(.*)$/.exec(line);
+ if (m != null)
+ hdrs[m[1].trim().toLowerCase()] = m[2].trim();
+ });
},
- stop: function(entry) { XHR.stop(entry) },
- halt: function() { XHR.halt() },
- run: function() { XHR.run() },
+ has: function(name) {
+ return this.headers.hasOwnProperty(String(name).toLowerCase());
+ },
+ get: function(name) {
+ var key = String(name).toLowerCase();
+ return this.headers.hasOwnProperty(key) ? this.headers[key] : null;
+ }
+ });
+
+ var Response = Class.extend({
+ __name__: 'LuCI.XHR.Response',
+ __init__: function(xhr, url, duration, headers, content) {
+ this.ok = (xhr.status >= 200 && xhr.status <= 299);
+ this.status = xhr.status;
+ this.statusText = xhr.statusText;
+ this.headers = (headers != null) ? headers : new Headers(xhr);
+ this.duration = duration;
+ this.url = url;
+ this.xhr = xhr;
+
+ if (content != null && typeof(content) == 'object') {
+ this.responseJSON = content;
+ this.responseText = null;
+ }
+ else if (content != null) {
+ this.responseJSON = null;
+ this.responseText = String(content);
+ }
+ else {
+ this.responseJSON = null;
+ this.responseText = xhr.responseText;
+ }
+ },
- /* Modal dialog */
- showModal: function(title, children) {
- var dlg = modalDiv.firstElementChild;
+ clone: function(content) {
+ var copy = new Response(this.xhr, this.url, this.duration, this.headers, content);
- dlg.setAttribute('class', 'modal');
+ copy.ok = this.ok;
+ copy.status = this.status;
+ copy.statusText = this.statusText;
- this.dom.content(dlg, this.dom.create('h4', {}, title));
- this.dom.append(dlg, children);
+ return copy;
+ },
- document.body.classList.add('modal-overlay-active');
+ json: function() {
+ if (this.responseJSON == null)
+ this.responseJSON = JSON.parse(this.responseText);
- return dlg;
+ return this.responseJSON;
},
- hideModal: function() {
- document.body.classList.remove('modal-overlay-active');
+ text: function() {
+ if (this.responseText == null && this.responseJSON != null)
+ this.responseText = JSON.stringify(this.responseJSON);
+
+ return this.responseText;
+ }
+ });
+
+
+ var requestQueue = [],
+ rpcBaseURL = null;
+
+ function isQueueableRequest(opt) {
+ if (!classes.rpc)
+ return false;
+
+ if (opt.method != 'POST' || typeof(opt.content) != 'object')
+ return false;
+
+ if (opt.nobatch === true)
+ return false;
+
+ if (rpcBaseURL == null)
+ rpcBaseURL = Request.expandURL(classes.rpc.getBaseURL());
+
+ return (rpcBaseURL != null && opt.url.indexOf(rpcBaseURL) == 0);
+ }
+
+ function flushRequestQueue() {
+ if (!requestQueue.length)
+ return;
+
+ var reqopt = Object.assign({}, requestQueue[0][0], { content: [], nobatch: true }),
+ batch = [];
+
+ for (var i = 0; i < requestQueue.length; i++) {
+ batch[i] = requestQueue[i];
+ reqopt.content[i] = batch[i][0].content;
+ }
+
+ requestQueue.length = 0;
+
+ Request.request(rpcBaseURL, reqopt).then(function(reply) {
+ var json = null, req = null;
+
+ try { json = reply.json() }
+ catch(e) { }
+
+ while ((req = batch.shift()) != null)
+ if (Array.isArray(json) && json.length)
+ req[2].call(reqopt, reply.clone(json.shift()));
+ else
+ req[1].call(reqopt, new Error('No related RPC reply'));
+ }).catch(function(error) {
+ var req = null;
+
+ while ((req = batch.shift()) != null)
+ req[1].call(reqopt, error);
+ });
+ }
+
+ var Request = Class.singleton({
+ __name__: 'LuCI.Request',
+
+ interceptors: [],
+
+ expandURL: function(url) {
+ if (!/^(?:[^/]+:)?\/\//.test(url))
+ url = location.protocol + '//' + location.host + url;
+
+ return url;
},
+ request: function(target, options) {
+ var state = { xhr: new XMLHttpRequest(), url: this.expandURL(target), start: Date.now() },
+ opt = Object.assign({}, options, state),
+ content = null,
+ contenttype = null,
+ callback = this.handleReadyStateChange;
+
+ return new Promise(function(resolveFn, rejectFn) {
+ opt.xhr.onreadystatechange = callback.bind(opt, resolveFn, rejectFn);
+ opt.method = String(opt.method || 'GET').toUpperCase();
+
+ if ('query' in opt) {
+ var q = (opt.query != null) ? Object.keys(opt.query).map(function(k) {
+ if (opt.query[k] != null) {
+ var v = (typeof(opt.query[k]) == 'object')
+ ? JSON.stringify(opt.query[k])
+ : String(opt.query[k]);
+
+ return '%s=%s'.format(encodeURIComponent(k), encodeURIComponent(v));
+ }
+ else {
+ return encodeURIComponent(k);
+ }
+ }).join('&') : '';
+
+ if (q !== '') {
+ switch (opt.method) {
+ case 'GET':
+ case 'HEAD':
+ case 'OPTIONS':
+ opt.url += ((/\?/).test(opt.url) ? '&' : '?') + q;
+ break;
- /* Tooltip */
- showTooltip: function(ev) {
- var target = findParent(ev.target, '[data-tooltip]');
+ default:
+ if (content == null) {
+ content = q;
+ contenttype = 'application/x-www-form-urlencoded';
+ }
+ }
+ }
+ }
- if (!target)
- return;
+ if (!opt.cache)
+ opt.url += ((/\?/).test(opt.url) ? '&' : '?') + (new Date()).getTime();
- if (tooltipTimeout !== null) {
- window.clearTimeout(tooltipTimeout);
- tooltipTimeout = null;
- }
+ if (isQueueableRequest(opt)) {
+ requestQueue.push([opt, rejectFn, resolveFn]);
+ requestAnimationFrame(flushRequestQueue);
+ return;
+ }
- var rect = target.getBoundingClientRect(),
- x = rect.left + window.pageXOffset,
- y = rect.top + rect.height + window.pageYOffset;
+ if ('username' in opt && 'password' in opt)
+ opt.xhr.open(opt.method, opt.url, true, opt.username, opt.password);
+ else
+ opt.xhr.open(opt.method, opt.url, true);
- tooltipDiv.className = 'cbi-tooltip';
- tooltipDiv.innerHTML = 'â–² ';
- tooltipDiv.firstChild.data += target.getAttribute('data-tooltip');
+ opt.xhr.responseType = 'text';
+ opt.xhr.overrideMimeType('application/octet-stream');
- if (target.hasAttribute('data-tooltip-style'))
- tooltipDiv.classList.add(target.getAttribute('data-tooltip-style'));
+ if ('timeout' in opt)
+ opt.xhr.timeout = +opt.timeout;
- if ((y + tooltipDiv.offsetHeight) > (window.innerHeight + window.pageYOffset)) {
- y -= (tooltipDiv.offsetHeight + target.offsetHeight);
- tooltipDiv.firstChild.data = 'â–¼ ' + tooltipDiv.firstChild.data.substr(2);
- }
+ if ('credentials' in opt)
+ opt.xhr.withCredentials = !!opt.credentials;
- tooltipDiv.style.top = y + 'px';
- tooltipDiv.style.left = x + 'px';
- tooltipDiv.style.opacity = 1;
+ if (opt.content != null) {
+ switch (typeof(opt.content)) {
+ case 'function':
+ content = opt.content(xhr);
+ break;
- tooltipDiv.dispatchEvent(new CustomEvent('tooltip-open', {
- bubbles: true,
- detail: { target: target }
- }));
+ case 'object':
+ content = JSON.stringify(opt.content);
+ contenttype = 'application/json';
+ break;
+
+ default:
+ content = String(opt.content);
+ }
+ }
+
+ if ('headers' in opt)
+ for (var header in opt.headers)
+ if (opt.headers.hasOwnProperty(header)) {
+ if (header.toLowerCase() != 'content-type')
+ opt.xhr.setRequestHeader(header, opt.headers[header]);
+ else
+ contenttype = opt.headers[header];
+ }
+
+ if (contenttype != null)
+ opt.xhr.setRequestHeader('Content-Type', contenttype);
+
+ try {
+ opt.xhr.send(content);
+ }
+ catch (e) {
+ rejectFn.call(opt, e);
+ }
+ });
},
- hideTooltip: function(ev) {
- if (ev.target === tooltipDiv || ev.relatedTarget === tooltipDiv ||
- tooltipDiv.contains(ev.target) || tooltipDiv.contains(ev.relatedTarget))
+ handleReadyStateChange: function(resolveFn, rejectFn, ev) {
+ var xhr = this.xhr;
+
+ if (xhr.readyState !== 4)
return;
- if (tooltipTimeout !== null) {
- window.clearTimeout(tooltipTimeout);
- tooltipTimeout = null;
+ if (xhr.status === 0 && xhr.statusText === '') {
+ rejectFn.call(this, new Error('XHR request aborted by browser'));
}
+ else {
+ var response = new Response(
+ xhr, xhr.responseURL || this.url, Date.now() - this.start);
- tooltipDiv.style.opacity = 0;
- tooltipTimeout = window.setTimeout(function() { tooltipDiv.removeAttribute('style'); }, 250);
-
- tooltipDiv.dispatchEvent(new CustomEvent('tooltip-close', { bubbles: true }));
+ Promise.all(Request.interceptors.map(function(fn) { return fn(response) }))
+ .then(resolveFn.bind(this, response))
+ .catch(rejectFn.bind(this));
+ }
},
+ get: function(url, options) {
+ return this.request(url, Object.assign({ method: 'GET' }, options));
+ },
- /* Widget helper */
- itemlist: function(node, items, separators) {
- var children = [];
+ post: function(url, data, options) {
+ return this.request(url, Object.assign({ method: 'POST', content: data }, options));
+ },
- if (!Array.isArray(separators))
- separators = [ separators || E('br') ];
+ addInterceptor: function(interceptorFn) {
+ if (typeof(interceptorFn) == 'function')
+ this.interceptors.push(interceptorFn);
+ return interceptorFn;
+ },
- for (var i = 0; i < items.length; i += 2) {
- if (items[i+1] !== null && items[i+1] !== undefined) {
- var sep = separators[(i/2) % separators.length],
- cld = [];
+ removeInterceptor: function(interceptorFn) {
+ var oldlen = this.interceptors.length, i = oldlen;
+ while (i--)
+ if (this.interceptors[i] === interceptorFn)
+ this.interceptors.splice(i, 1);
+ return (this.interceptors.length < oldlen);
+ },
- children.push(E('span', { class: 'nowrap' }, [
- items[i] ? E('strong', items[i] + ': ') : '',
- items[i+1]
- ]));
+ poll: {
+ add: function(interval, url, options, callback) {
+ if (isNaN(interval) || interval <= 0)
+ throw new TypeError('Invalid poll interval');
- if ((i+2) < items.length)
- children.push(this.dom.elem(sep) ? sep.cloneNode(true) : sep);
- }
- }
+ var ival = interval >>> 0,
+ opts = Object.assign({}, options, { timeout: ival * 1000 - 5 });
- this.dom.content(node, children);
+ return Poll.add(function() {
+ return Request.request(url, options).then(function(res) {
+ if (!Poll.active())
+ return;
- return node;
+ try {
+ callback(res, res.json(), res.duration);
+ }
+ catch (err) {
+ callback(res, null, res.duration);
+ }
+ });
+ }, ival);
+ },
+
+ remove: function(entry) { return Poll.remove(entry) },
+ start: function() { return Poll.start() },
+ stop: function() { return Poll.stop() },
+ active: function() { return Poll.active() }
}
- };
+ });
- /* Tabs */
- LuCI.prototype.tabs = {
- init: function() {
- var groups = [], prevGroup = null, currGroup = null;
+ var Poll = Class.singleton({
+ __name__: 'LuCI.Poll',
- document.querySelectorAll('[data-tab]').forEach(function(tab) {
- var parent = tab.parentNode;
+ queue: [],
- if (!parent.hasAttribute('data-tab-group'))
- parent.setAttribute('data-tab-group', groups.length);
+ add: function(fn, interval) {
+ if (interval == null || interval <= 0)
+ interval = window.L ? window.L.env.pollinterval : null;
- currGroup = +parent.getAttribute('data-tab-group');
+ if (isNaN(interval) || typeof(fn) != 'function')
+ throw new TypeError('Invalid argument to LuCI.Poll.add()');
- if (currGroup !== prevGroup) {
- prevGroup = currGroup;
+ for (var i = 0; i < this.queue.length; i++)
+ if (this.queue[i].fn === fn)
+ return false;
- if (!groups[currGroup])
- groups[currGroup] = [];
- }
+ var e = {
+ r: true,
+ i: interval >>> 0,
+ fn: fn
+ };
- groups[currGroup].push(tab);
- });
+ this.queue.push(e);
+
+ if (this.tick != null && !this.active())
+ this.start();
+
+ return true;
+ },
- for (var i = 0; i < groups.length; i++)
- this.initTabGroup(groups[i]);
+ remove: function(entry) {
+ if (typeof(fn) != 'function')
+ throw new TypeError('Invalid argument to LuCI.Poll.remove()');
- document.addEventListener('dependency-update', this.updateTabs.bind(this));
+ var len = this.queue.length;
- this.updateTabs();
+ for (var i = len; i > 0; i--)
+ if (this.queue[i-1].fn === fn)
+ this.queue.splice(i-1, 1);
- if (!groups.length)
- this.setActiveTabId(-1, -1);
+ if (!this.queue.length && this.stop())
+ this.tick = 0;
+
+ return (this.queue.length != len);
},
- initTabGroup: function(panes) {
- if (!Array.isArray(panes) || panes.length === 0)
- return;
+ start: function() {
+ if (this.active())
+ return false;
+
+ this.tick = 0;
- var menu = E('ul', { 'class': 'cbi-tabmenu' }),
- group = panes[0].parentNode,
- groupId = +group.getAttribute('data-tab-group'),
- selected = null;
-
- for (var i = 0, pane; pane = panes[i]; i++) {
- var name = pane.getAttribute('data-tab'),
- title = pane.getAttribute('data-tab-title'),
- active = pane.getAttribute('data-tab-active') === 'true';
-
- menu.appendChild(E('li', {
- 'class': active ? 'cbi-tab' : 'cbi-tab-disabled',
- 'data-tab': name
- }, E('a', {
- 'href': '#',
- 'click': this.switchTab.bind(this)
- }, title)));
-
- if (active)
- selected = i;
+ if (this.queue.length) {
+ this.timer = window.setInterval(this.step, 1000);
+ this.step();
+ document.dispatchEvent(new CustomEvent('poll-start'));
}
- group.parentNode.insertBefore(menu, group);
+ return true;
+ },
+
+ stop: function() {
+ if (!this.active())
+ return false;
- if (selected === null) {
- selected = this.getActiveTabId(groupId);
+ document.dispatchEvent(new CustomEvent('poll-stop'));
+ window.clearInterval(this.timer);
+ delete this.timer;
+ delete this.tick;
+ return true;
+ },
+
+ step: function() {
+ for (var i = 0, e = null; (e = Poll.queue[i]) != null; i++) {
+ if ((Poll.tick % e.i) != 0)
+ continue;
- if (selected < 0 || selected >= panes.length)
- selected = 0;
+ if (!e.r)
+ continue;
- menu.childNodes[selected].classList.add('cbi-tab');
- menu.childNodes[selected].classList.remove('cbi-tab-disabled');
- panes[selected].setAttribute('data-tab-active', 'true');
+ e.r = false;
- this.setActiveTabId(groupId, selected);
+ Promise.resolve(e.fn()).finally((function() { this.r = true }).bind(e));
}
+
+ Poll.tick = (Poll.tick + 1) % Math.pow(2, 32);
},
- getActiveTabState: function() {
- var page = document.body.getAttribute('data-page');
+ active: function() {
+ return (this.timer != null);
+ }
+ });
- try {
- var val = JSON.parse(window.sessionStorage.getItem('tab'));
- if (val.page === page && Array.isArray(val.groups))
- return val;
- }
- catch(e) {}
- window.sessionStorage.removeItem('tab');
- return { page: page, groups: [] };
+ var dummyElem = null,
+ domParser = null,
+ originalCBIInit = null,
+ classes = {};
+
+ var LuCI = Class.extend({
+ __name__: 'LuCI',
+ __init__: function(env) {
+
+ document.querySelectorAll('script[src*="/luci.js"]').forEach(function(s) {
+ if (env.base_url == null || env.base_url == '')
+ env.base_url = s.getAttribute('src').replace(/\/luci\.js(?:\?v=[^?]+)?$/, '');
+ });
+
+ if (env.base_url == null)
+ this.error('InternalError', 'Cannot find url of luci.js');
+
+ Object.assign(this.env, env);
+
+ document.addEventListener('poll-start', function(ev) {
+ document.querySelectorAll('[id^="xhr_poll_status"]').forEach(function(e) {
+ e.style.display = (e.id == 'xhr_poll_status_off') ? 'none' : '';
+ });
+ });
+
+ document.addEventListener('poll-stop', function(ev) {
+ document.querySelectorAll('[id^="xhr_poll_status"]').forEach(function(e) {
+ e.style.display = (e.id == 'xhr_poll_status_on') ? 'none' : '';
+ });
+ });
+
+ var domReady = new Promise(function(resolveFn, rejectFn) {
+ document.addEventListener('DOMContentLoaded', resolveFn);
+ });
+
+ Promise.all([
+ domReady,
+ this.require('ui'),
+ this.require('form')
+ ]).then(this.setupDOM.bind(this)).catch(this.error);
+
+ originalCBIInit = window.cbi_init;
+ window.cbi_init = function() {};
},
- getActiveTabId: function(groupId) {
- return +this.getActiveTabState().groups[groupId] || 0;
+ raise: function(type, fmt /*, ...*/) {
+ var e = null,
+ msg = fmt ? String.prototype.format.apply(fmt, this.varargs(arguments, 2)) : null,
+ stack = null;
+
+ if (type instanceof Error) {
+ e = type;
+ stack = (e.stack || '').split(/\n/);
+
+ if (msg)
+ e.message = msg + ': ' + e.message;
+ }
+ else {
+ e = new (window[type || 'Error'] || Error)(msg || 'Unspecified error');
+ e.name = type || 'Error';
+ }
+
+ if (window.console && console.debug)
+ console.debug(e);
+
+ throw e;
},
- setActiveTabId: function(groupId, tabIndex) {
+ error: function(type, fmt /*, ...*/) {
try {
- var state = this.getActiveTabState();
- state.groups[groupId] = tabIndex;
+ L.raise.apply(L, Array.prototype.slice.call(arguments));
+ }
+ catch (e) {
+ var stack = (e.stack || '').split(/\n/).map(function(frame) {
+ frame = frame.replace(/(.*?)@(.+):(\d+):(\d+)/g, 'at $1 ($2:$3:$4)').trim();
+ return frame ? ' ' + frame : '';
+ });
+
+ if (!/^ at /.test(stack[0]))
+ stack.shift();
+
+ if (/\braise /.test(stack[0]))
+ stack.shift();
+
+ if (/\berror /.test(stack[0]))
+ stack.shift();
+
+ stack = stack.length ? '\n' + stack.join('\n') : '';
- window.sessionStorage.setItem('tab', JSON.stringify(state));
+ if (L.ui)
+ L.ui.showModal(e.name || _('Runtime error'),
+ E('pre', { 'class': 'alert-message error' }, e.message + stack));
+ else
+ L.dom.content(document.querySelector('#maincontent'),
+ E('pre', { 'class': 'alert-message error' }, e + stack));
+
+ throw e;
}
- catch (e) { return false; }
+ },
- return true;
+ bind: function(fn, self /*, ... */) {
+ return Function.prototype.bind.apply(fn, this.varargs(arguments, 2, self));
},
- updateTabs: function(ev) {
- document.querySelectorAll('[data-tab-title]').forEach(function(pane) {
- var menu = pane.parentNode.previousElementSibling,
- tab = menu.querySelector('[data-tab="%s"]'.format(pane.getAttribute('data-tab'))),
- n_errors = pane.querySelectorAll('.cbi-input-invalid').length;
+ /* Class require */
+ require: function(name, from) {
+ var L = this, url = null, from = from || [];
- if (!pane.firstElementChild) {
- tab.style.display = 'none';
- tab.classList.remove('flash');
- }
- else if (tab.style.display === 'none') {
- tab.style.display = '';
- requestAnimationFrame(function() { tab.classList.add('flash') });
- }
+ /* Class already loaded */
+ if (classes[name] != null) {
+ /* Circular dependency */
+ if (from.indexOf(name) != -1)
+ L.raise('DependencyError',
+ 'Circular dependency: class "%s" depends on "%s"',
+ name, from.join('" which depends on "'));
- if (n_errors) {
- tab.setAttribute('data-errors', n_errors);
- tab.setAttribute('data-tooltip', _('%d invalid field(s)').format(n_errors));
- tab.setAttribute('data-tooltip-style', 'error');
- }
- else {
- tab.removeAttribute('data-errors');
- tab.removeAttribute('data-tooltip');
- }
- });
- },
+ return classes[name];
+ }
- switchTab: function(ev) {
- var tab = ev.target.parentNode,
- name = tab.getAttribute('data-tab'),
- menu = tab.parentNode,
- group = menu.nextElementSibling,
- groupId = +group.getAttribute('data-tab-group'),
- index = 0;
+ url = '%s/%s.js'.format(L.env.base_url, name.replace(/\./g, '/'));
+ from = [ name ].concat(from);
- ev.preventDefault();
+ var compileClass = function(res) {
+ if (!res.ok)
+ L.raise('NetworkError',
+ 'HTTP error %d while loading class file "%s"', res.status, url);
- if (!tab.classList.contains('cbi-tab-disabled'))
- return;
+ var source = res.text(),
+ requirematch = /^require[ \t]+(\S+)(?:[ \t]+as[ \t]+([a-zA-Z_]\S*))?$/,
+ strictmatch = /^use[ \t]+strict$/,
+ depends = [],
+ args = '';
- menu.querySelectorAll('[data-tab]').forEach(function(tab) {
- tab.classList.remove('cbi-tab');
- tab.classList.remove('cbi-tab-disabled');
- tab.classList.add(
- tab.getAttribute('data-tab') === name ? 'cbi-tab' : 'cbi-tab-disabled');
- });
+ /* find require statements in source */
+ for (var i = 0, off = -1, quote = -1, esc = false; i < source.length; i++) {
+ var chr = source.charCodeAt(i);
- group.childNodes.forEach(function(pane) {
- if (L.dom.matches(pane, '[data-tab]')) {
- if (pane.getAttribute('data-tab') === name) {
- pane.setAttribute('data-tab-active', 'true');
- L.tabs.setActiveTabId(groupId, index);
+ if (esc) {
+ esc = false;
}
- else {
- pane.setAttribute('data-tab-active', 'false');
+ else if (chr == 92) {
+ esc = true;
}
+ else if (chr == quote) {
+ var s = source.substring(off, i),
+ m = requirematch.exec(s);
+
+ if (m) {
+ var dep = m[1], as = m[2] || dep.replace(/[^a-zA-Z0-9_]/g, '_');
+ depends.push(L.require(dep, from));
+ args += ', ' + as;
+ }
+ else if (!strictmatch.exec(s)) {
+ break;
+ }
- index++;
+ off = -1;
+ quote = -1;
+ }
+ else if (quote == -1 && (chr == 34 || chr == 39)) {
+ off = i + 1;
+ quote = chr;
+ }
}
+
+ /* load dependencies and instantiate class */
+ return Promise.all(depends).then(function(instances) {
+ var _factory, _class;
+
+ try {
+ _factory = eval(
+ '(function(window, document, L%s) { %s })\n\n//# sourceURL=%s\n'
+ .format(args, source, res.url));
+ }
+ catch (error) {
+ L.raise('SyntaxError', '%s\n in %s:%s',
+ error.message, res.url, error.lineNumber || '?');
+ }
+
+ _factory.displayName = toCamelCase(name + 'ClassFactory');
+ _class = _factory.apply(_factory, [window, document, L].concat(instances));
+
+ if (!Class.isSubclass(_class))
+ L.error('TypeError', '"%s" factory yields invalid constructor', name);
+
+ if (_class.displayName == 'AnonymousClass')
+ _class.displayName = toCamelCase(name + 'Class');
+
+ var ptr = Object.getPrototypeOf(L),
+ parts = name.split(/\./),
+ instance = new _class();
+
+ for (var i = 0; ptr && i < parts.length - 1; i++)
+ ptr = ptr[parts[i]];
+
+ if (ptr)
+ ptr[parts[i]] = instance;
+
+ classes[name] = instance;
+
+ return instance;
+ });
+ };
+
+ /* Request class file */
+ classes[name] = Request.get(url, { cache: true }).then(compileClass);
+
+ return classes[name];
+ },
+
+ /* DOM setup */
+ setupDOM: function(ev) {
+ Request.addInterceptor(function(res) {
+ if (res.status != 403 || res.headers.get('X-LuCI-Login-Required') != 'yes')
+ return;
+
+ Poll.stop();
+
+ L.ui.showModal(_('Session expired'), [
+ E('div', { class: 'alert-message warning' },
+ _('A new login is required since the authentication session expired.')),
+ E('div', { class: 'right' },
+ E('div', {
+ class: 'btn primary',
+ click: function() {
+ var loc = window.location;
+ window.location = loc.protocol + '//' + loc.host + loc.pathname + loc.search;
+ }
+ }, _('To login…')))
+ ]);
+
+ throw 'Session expired';
});
- }
- };
- /* DOM manipulation */
- LuCI.prototype.dom = {
- elem: function(e) {
- return (typeof(e) === 'object' && e !== null && 'nodeType' in e);
+ originalCBIInit();
+
+ Poll.start();
+
+ document.dispatchEvent(new CustomEvent('luci-loaded'));
},
- parse: function(s) {
- var elem;
+ env: {},
- try {
- domParser = domParser || new DOMParser();
- elem = domParser.parseFromString(s, 'text/html').body.firstChild;
- }
- catch(e) {}
+ /* URL construction helpers */
+ path: function(prefix, parts) {
+ var url = [ prefix || '' ];
- if (!elem) {
- try {
- dummyElem = dummyElem || document.createElement('div');
- dummyElem.innerHTML = s;
- elem = dummyElem.firstChild;
- }
- catch (e) {}
- }
+ for (var i = 0; i < parts.length; i++)
+ if (/^(?:[a-zA-Z0-9_.%,;-]+\/)*[a-zA-Z0-9_.%,;-]+$/.test(parts[i]))
+ url.push('/', parts[i]);
- return elem || null;
+ if (url.length === 1)
+ url.push('/');
+
+ return url.join('');
},
- matches: function(node, selector) {
- var m = this.elem(node) ? node.matches || node.msMatchesSelector : null;
- return m ? m.call(node, selector) : false;
+ url: function() {
+ return this.path(this.env.scriptname, arguments);
},
- parent: function(node, selector) {
- if (this.elem(node) && node.closest)
- return node.closest(selector);
+ resource: function() {
+ return this.path(this.env.resource, arguments);
+ },
+
+ location: function() {
+ return this.path(this.env.scriptname, this.env.requestpath);
+ },
- while (this.elem(node))
- if (this.matches(node, selector))
- return node;
- else
- node = node.parentNode;
- return null;
+ /* HTTP resource fetching */
+ get: function(url, args, cb) {
+ return this.poll(null, url, args, cb, false);
},
- append: function(node, children) {
- if (!this.elem(node))
- return null;
+ post: function(url, args, cb) {
+ return this.poll(null, url, args, cb, true);
+ },
- if (Array.isArray(children)) {
- for (var i = 0; i < children.length; i++)
- if (this.elem(children[i]))
- node.appendChild(children[i]);
- else if (children !== null && children !== undefined)
- node.appendChild(document.createTextNode('' + children[i]));
+ poll: function(interval, url, args, cb, post) {
+ if (interval !== null && interval <= 0)
+ interval = this.env.pollinterval;
- return node.lastChild;
- }
- else if (typeof(children) === 'function') {
- return this.append(node, children(node));
- }
- else if (this.elem(children)) {
- return node.appendChild(children);
- }
- else if (children !== null && children !== undefined) {
- node.innerHTML = '' + children;
- return node.lastChild;
- }
+ var data = post ? { token: this.env.token } : null,
+ method = post ? 'POST' : 'GET';
+
+ if (!/^(?:\/|\S+:\/\/)/.test(url))
+ url = this.url(url);
+
+ if (args != null)
+ data = Object.assign(data || {}, args);
- return null;
+ if (interval !== null)
+ return Request.poll.add(interval, url, { method: method, query: data }, cb);
+ else
+ return Request.request(url, { method: method, query: data })
+ .then(function(res) {
+ var json = null;
+ if (/^application\/json\b/.test(res.headers.get('Content-Type')))
+ try { json = res.json() } catch(e) {}
+ cb(res.xhr, json, res.duration);
+ });
},
- content: function(node, children) {
- if (!this.elem(node))
+ stop: function(entry) { return Poll.remove(entry) },
+ halt: function() { return Poll.stop() },
+ run: function() { return Poll.start() },
+
+ /* DOM manipulation */
+ dom: Class.singleton({
+ __name__: 'LuCI.DOM',
+
+ elem: function(e) {
+ return (e != null && typeof(e) == 'object' && 'nodeType' in e);
+ },
+
+ parse: function(s) {
+ var elem;
+
+ try {
+ domParser = domParser || new DOMParser();
+ elem = domParser.parseFromString(s, 'text/html').body.firstChild;
+ }
+ catch(e) {}
+
+ if (!elem) {
+ try {
+ dummyElem = dummyElem || document.createElement('div');
+ dummyElem.innerHTML = s;
+ elem = dummyElem.firstChild;
+ }
+ catch (e) {}
+ }
+
+ return elem || null;
+ },
+
+ matches: function(node, selector) {
+ var m = this.elem(node) ? node.matches || node.msMatchesSelector : null;
+ return m ? m.call(node, selector) : false;
+ },
+
+ parent: function(node, selector) {
+ if (this.elem(node) && node.closest)
+ return node.closest(selector);
+
+ while (this.elem(node))
+ if (this.matches(node, selector))
+ return node;
+ else
+ node = node.parentNode;
+
return null;
+ },
- while (node.firstChild)
- node.removeChild(node.firstChild);
+ append: function(node, children) {
+ if (!this.elem(node))
+ return null;
- return this.append(node, children);
- },
+ if (Array.isArray(children)) {
+ for (var i = 0; i < children.length; i++)
+ if (this.elem(children[i]))
+ node.appendChild(children[i]);
+ else if (children !== null && children !== undefined)
+ node.appendChild(document.createTextNode('' + children[i]));
+
+ return node.lastChild;
+ }
+ else if (typeof(children) === 'function') {
+ return this.append(node, children(node));
+ }
+ else if (this.elem(children)) {
+ return node.appendChild(children);
+ }
+ else if (children !== null && children !== undefined) {
+ node.innerHTML = '' + children;
+ return node.lastChild;
+ }
- attr: function(node, key, val) {
- if (!this.elem(node))
return null;
+ },
- var attr = null;
+ content: function(node, children) {
+ if (!this.elem(node))
+ return null;
- if (typeof(key) === 'object' && key !== null)
- attr = key;
- else if (typeof(key) === 'string')
- attr = {}, attr[key] = val;
+ var dataNodes = node.querySelectorAll('[data-idref]');
- for (key in attr) {
- if (!attr.hasOwnProperty(key) || attr[key] === null || attr[key] === undefined)
- continue;
+ for (var i = 0; i < dataNodes.length; i++)
+ delete this.registry[dataNodes[i].getAttribute('data-idref')];
+
+ while (node.firstChild)
+ node.removeChild(node.firstChild);
+
+ return this.append(node, children);
+ },
+
+ attr: function(node, key, val) {
+ if (!this.elem(node))
+ return null;
- switch (typeof(attr[key])) {
- case 'function':
- node.addEventListener(key, attr[key]);
- break;
+ var attr = null;
- case 'object':
- node.setAttribute(key, JSON.stringify(attr[key]));
- break;
+ if (typeof(key) === 'object' && key !== null)
+ attr = key;
+ else if (typeof(key) === 'string')
+ attr = {}, attr[key] = val;
- default:
- node.setAttribute(key, attr[key]);
+ for (key in attr) {
+ if (!attr.hasOwnProperty(key) || attr[key] == null)
+ continue;
+
+ switch (typeof(attr[key])) {
+ case 'function':
+ node.addEventListener(key, attr[key]);
+ break;
+
+ case 'object':
+ node.setAttribute(key, JSON.stringify(attr[key]));
+ break;
+
+ default:
+ node.setAttribute(key, attr[key]);
+ }
}
- }
- },
+ },
- create: function() {
- var html = arguments[0],
- attr = (arguments[1] instanceof Object && !Array.isArray(arguments[1])) ? arguments[1] : null,
- data = attr ? arguments[2] : arguments[1],
- elem;
+ create: function() {
+ var html = arguments[0],
+ attr = arguments[1],
+ data = arguments[2],
+ elem;
- if (this.elem(html))
- elem = html;
- else if (html.charCodeAt(0) === 60)
- elem = this.parse(html);
- else
- elem = document.createElement(html);
+ if (!(attr instanceof Object) || Array.isArray(attr))
+ data = attr, attr = null;
+
+ if (Array.isArray(html)) {
+ elem = document.createDocumentFragment();
+ for (var i = 0; i < html.length; i++)
+ elem.appendChild(this.create(html[i]));
+ }
+ else if (this.elem(html)) {
+ elem = html;
+ }
+ else if (html.charCodeAt(0) === 60) {
+ elem = this.parse(html);
+ }
+ else {
+ elem = document.createElement(html);
+ }
+
+ if (!elem)
+ return null;
+
+ this.attr(elem, attr);
+ this.append(elem, data);
+
+ return elem;
+ },
+
+ registry: {},
+
+ data: function(node, key, val) {
+ var id = node.getAttribute('data-idref');
+
+ /* clear all data */
+ if (arguments.length > 1 && key == null) {
+ if (id != null) {
+ node.removeAttribute('data-idref');
+ val = this.registry[id]
+ delete this.registry[id];
+ return val;
+ }
+
+ return null;
+ }
+
+ /* clear a key */
+ else if (arguments.length > 2 && key != null && val == null) {
+ if (id != null) {
+ val = this.registry[id][key];
+ delete this.registry[id][key];
+ return val;
+ }
+
+ return null;
+ }
+
+ /* set a key */
+ else if (arguments.length > 2 && key != null && val != null) {
+ if (id == null) {
+ do { id = Math.floor(Math.random() * 0xffffffff).toString(16) }
+ while (this.registry.hasOwnProperty(id));
+
+ node.setAttribute('data-idref', id);
+ this.registry[id] = {};
+ }
+
+ return (this.registry[id][key] = val);
+ }
+
+ /* get all data */
+ else if (arguments.length == 1) {
+ if (id != null)
+ return this.registry[id];
+
+ return null;
+ }
+
+ /* get a key */
+ else if (arguments.length == 2) {
+ if (id != null)
+ return this.registry[id][key];
+ }
- if (!elem)
return null;
+ },
- this.attr(elem, attr);
- this.append(elem, data);
+ bindClassInstance: function(node, inst) {
+ if (!(inst instanceof Class))
+ L.error('TypeError', 'Argument must be a class instance');
- return elem;
- }
- };
+ return this.data(node, '_class', inst);
+ },
- /* Setup */
- LuCI.prototype.setupDOM = function(ev) {
- this.tabs.init();
- };
+ findClassInstance: function(node) {
+ var inst = null;
- function LuCI(env) {
- this.env = env;
+ do {
+ inst = this.data(node, '_class');
+ node = node.parentNode;
+ }
+ while (!(inst instanceof Class) && node != null);
- modalDiv = document.body.appendChild(
- this.dom.create('div', { id: 'modal_overlay' },
- this.dom.create('div', { class: 'modal', role: 'dialog', 'aria-modal': true })));
+ return inst;
+ },
- tooltipDiv = document.body.appendChild(this.dom.create('div', { class: 'cbi-tooltip' }));
+ callClassMethod: function(node, method /*, ... */) {
+ var inst = this.findClassInstance(node);
- document.addEventListener('mouseover', this.showTooltip.bind(this), true);
- document.addEventListener('mouseout', this.hideTooltip.bind(this), true);
- document.addEventListener('focus', this.showTooltip.bind(this), true);
- document.addEventListener('blur', this.hideTooltip.bind(this), true);
+ if (inst == null || typeof(inst[method]) != 'function')
+ return null;
- document.addEventListener('DOMContentLoaded', this.setupDOM.bind(this));
- }
+ return inst[method].apply(inst, inst.varargs(arguments, 2));
+ }
+ }),
+
+ Poll: Poll,
+ Class: Class,
+ Request: Request,
+
+ view: Class.extend({
+ __name__: 'LuCI.View',
+
+ __init__: function() {
+ var vp = document.getElementById('view');
+
+ L.dom.content(vp, E('div', { 'class': 'spinning' }, _('Loading view…')));
+
+ return Promise.resolve(this.load())
+ .then(L.bind(this.render, this))
+ .then(L.bind(function(nodes) {
+ var vp = document.getElementById('view');
+
+ L.dom.content(vp, nodes);
+ L.dom.append(vp, this.addFooter());
+ }, this)).catch(L.error);
+ },
+
+ load: function() {},
+ render: function() {},
+
+ handleSave: function(ev) {
+ var tasks = [];
+
+ document.getElementById('maincontent')
+ .querySelectorAll('.cbi-map').forEach(function(map) {
+ tasks.push(L.dom.callClassMethod(map, 'save'));
+ });
+
+ return Promise.all(tasks);
+ },
+
+ handleSaveApply: function(ev) {
+ return this.handleSave(ev).then(function() {
+ L.ui.changes.apply(true);
+ });
+ },
+
+ handleReset: function(ev) {
+ var tasks = [];
+
+ document.getElementById('maincontent')
+ .querySelectorAll('.cbi-map').forEach(function(map) {
+ tasks.push(L.dom.callClassMethod(map, 'reset'));
+ });
+
+ return Promise.all(tasks);
+ },
+
+ addFooter: function() {
+ var footer = E([]),
+ mc = document.getElementById('maincontent');
+
+ if (mc.querySelector('.cbi-map')) {
+ footer.appendChild(E('div', { 'class': 'cbi-page-actions' }, [
+ E('input', {
+ 'class': 'cbi-button cbi-button-apply',
+ 'type': 'button',
+ 'value': _('Save & Apply'),
+ 'click': L.bind(this.handleSaveApply, this)
+ }), ' ',
+ E('input', {
+ 'class': 'cbi-button cbi-button-save',
+ 'type': 'submit',
+ 'value': _('Save'),
+ 'click': L.bind(this.handleSave, this)
+ }), ' ',
+ E('input', {
+ 'class': 'cbi-button cbi-button-reset',
+ 'type': 'button',
+ 'value': _('Reset'),
+ 'click': L.bind(this.handleReset, this)
+ })
+ ]));
+ }
+
+ return footer;
+ }
+ })
+ });
+
+ var XHR = Class.extend({
+ __name__: 'LuCI.XHR',
+ __init__: function() {
+ if (window.console && console.debug)
+ console.debug('Direct use XHR() is deprecated, please use L.Request instead');
+ },
+
+ _response: function(cb, res, json, duration) {
+ if (this.active)
+ cb(res, json, duration);
+ delete this.active;
+ },
+
+ get: function(url, data, callback, timeout) {
+ this.active = true;
+ L.get(url, data, this._response.bind(this, callback), timeout);
+ },
+
+ post: function(url, data, callback, timeout) {
+ this.active = true;
+ L.post(url, data, this._response.bind(this, callback), timeout);
+ },
+ cancel: function() { delete this.active },
+ busy: function() { return (this.active === true) },
+ abort: function() {},
+ send_form: function() { L.error('InternalError', 'Not implemented') },
+ });
+
+ XHR.get = function() { return window.L.get.apply(window.L, arguments) };
+ XHR.post = function() { return window.L.post.apply(window.L, arguments) };
+ XHR.poll = function() { return window.L.poll.apply(window.L, arguments) };
+ XHR.stop = Request.poll.remove.bind(Request.poll);
+ XHR.halt = Request.poll.stop.bind(Request.poll);
+ XHR.run = Request.poll.start.bind(Request.poll);
+ XHR.running = Request.poll.active.bind(Request.poll);
+
+ window.XHR = XHR;
window.LuCI = LuCI;
})(window, document);
diff --git a/modules/luci-base/htdocs/luci-static/resources/network.js b/modules/luci-base/htdocs/luci-static/resources/network.js
new file mode 100644
index 0000000000..cfaec34298
--- /dev/null
+++ b/modules/luci-base/htdocs/luci-static/resources/network.js
@@ -0,0 +1,2139 @@
+'use strict';
+'require uci';
+'require rpc';
+'require validation';
+
+var proto_errors = {
+ CONNECT_FAILED: _('Connection attempt failed'),
+ INVALID_ADDRESS: _('IP address in invalid'),
+ INVALID_GATEWAY: _('Gateway address is invalid'),
+ INVALID_LOCAL_ADDRESS: _('Local IP address is invalid'),
+ MISSING_ADDRESS: _('IP address is missing'),
+ MISSING_PEER_ADDRESS: _('Peer address is missing'),
+ NO_DEVICE: _('Network device is not present'),
+ NO_IFACE: _('Unable to determine device name'),
+ NO_IFNAME: _('Unable to determine device name'),
+ NO_WAN_ADDRESS: _('Unable to determine external IP address'),
+ NO_WAN_LINK: _('Unable to determine upstream interface'),
+ PEER_RESOLVE_FAIL: _('Unable to resolve peer host name'),
+ PIN_FAILED: _('PIN code rejected')
+};
+
+var iface_patterns_ignore = [
+ /^wmaster\d+/,
+ /^wifi\d+/,
+ /^hwsim\d+/,
+ /^imq\d+/,
+ /^ifb\d+/,
+ /^mon\.wlan\d+/,
+ /^sit\d+/,
+ /^gre\d+/,
+ /^gretap\d+/,
+ /^ip6gre\d+/,
+ /^ip6tnl\d+/,
+ /^tunl\d+/,
+ /^lo$/
+];
+
+var iface_patterns_wireless = [
+ /^wlan\d+/,
+ /^wl\d+/,
+ /^ath\d+/,
+ /^\w+\.network\d+/
+];
+
+var iface_patterns_virtual = [ ];
+
+var callNetworkWirelessStatus = rpc.declare({
+ object: 'network.wireless',
+ method: 'status'
+});
+
+var callLuciNetdevs = rpc.declare({
+ object: 'luci',
+ method: 'netdevs'
+});
+
+var callLuciIfaddrs = rpc.declare({
+ object: 'luci',
+ method: 'ifaddrs',
+ expect: { result: [] }
+});
+
+var callLuciBoardjson = rpc.declare({
+ object: 'luci',
+ method: 'boardjson'
+});
+
+var callIwinfoInfo = rpc.declare({
+ object: 'iwinfo',
+ method: 'info',
+ params: [ 'device' ]
+});
+
+var callNetworkInterfaceStatus = rpc.declare({
+ object: 'network.interface',
+ method: 'dump',
+ expect: { 'interface': [] }
+});
+
+var callNetworkDeviceStatus = rpc.declare({
+ object: 'network.device',
+ method: 'status',
+ expect: { '': {} }
+});
+
+var _cache = {},
+ _state = null,
+ _protocols = {};
+
+function getWifiState() {
+ if (_cache.wifi == null)
+ return callNetworkWirelessStatus().then(function(state) {
+ if (!isObject(state))
+ throw !1;
+ return (_cache.wifi = state);
+ }).catch(function() {
+ return (_cache.wifi = {});
+ });
+
+ return Promise.resolve(_cache.wifi);
+}
+
+function getInterfaceState() {
+ if (_cache.interfacedump == null)
+ return callNetworkInterfaceStatus().then(function(state) {
+ if (!Array.isArray(state))
+ throw !1;
+ return (_cache.interfacedump = state);
+ }).catch(function() {
+ return (_cache.interfacedump = []);
+ });
+
+ return Promise.resolve(_cache.interfacedump);
+}
+
+function getDeviceState() {
+ if (_cache.devicedump == null)
+ return callNetworkDeviceStatus().then(function(state) {
+ if (!isObject(state))
+ throw !1;
+ return (_cache.devicedump = state);
+ }).catch(function() {
+ return (_cache.devicedump = {});
+ });
+
+ return Promise.resolve(_cache.devicedump);
+}
+
+function getIfaddrState() {
+ if (_cache.ifaddrs == null)
+ return callLuciIfaddrs().then(function(addrs) {
+ if (!Array.isArray(addrs))
+ throw !1;
+ return (_cache.ifaddrs = addrs);
+ }).catch(function() {
+ return (_cache.ifaddrs = []);
+ });
+
+ return Promise.resolve(_cache.ifaddrs);
+}
+
+function getNetdevState() {
+ if (_cache.devices == null)
+ return callLuciNetdevs().then(function(state) {
+ if (!isObject(state))
+ throw !1;
+ return (_cache.devices = state);
+ }).catch(function() {
+ return (_cache.devices = {});
+ });
+
+ return Promise.resolve(_cache.devices);
+}
+
+function getBoardState() {
+ if (_cache.board == null)
+ return callLuciBoardjson().then(function(state) {
+ if (!isObject(state))
+ throw !1;
+ return (_cache.board = state);
+ }).catch(function() {
+ return (_cache.board = {});
+ });
+
+ return Promise.resolve(_cache.board);
+}
+
+function getWifiStateBySid(sid) {
+ var s = uci.get('wireless', sid);
+
+ if (s != null && s['.type'] == 'wifi-iface') {
+ for (var radioname in _cache.wifi) {
+ for (var i = 0; i < _cache.wifi[radioname].interfaces.length; i++) {
+ var netstate = _cache.wifi[radioname].interfaces[i];
+
+ if (typeof(netstate.section) != 'string')
+ continue;
+
+ var s2 = uci.get('wireless', netstate.section);
+
+ if (s2 != null && s['.type'] == s2['.type'] && s['.name'] == s2['.name'])
+ return [ radioname, _cache.wifi[radioname], netstate ];
+ }
+ }
+ }
+
+ return null;
+}
+
+function getWifiStateByIfname(ifname) {
+ for (var radioname in _cache.wifi) {
+ for (var i = 0; i < _cache.wifi[radioname].interfaces.length; i++) {
+ var netstate = _cache.wifi[radioname].interfaces[i];
+
+ if (typeof(netstate.ifname) != 'string')
+ continue;
+
+ if (netstate.ifname == ifname)
+ return [ radioname, _cache.wifi[radioname], netstate ];
+ }
+ }
+
+ return null;
+}
+
+function isWifiIfname(ifname) {
+ for (var i = 0; i < iface_patterns_wireless.length; i++)
+ if (iface_patterns_wireless[i].test(ifname))
+ return true;
+
+ return false;
+}
+
+function getWifiIwinfoByIfname(ifname, forcePhyOnly) {
+ var tasks = [ callIwinfoInfo(ifname) ];
+
+ if (!forcePhyOnly)
+ tasks.push(getNetdevState());
+
+ return Promise.all(tasks).then(function(info) {
+ var iwinfo = info[0],
+ devstate = info[1],
+ phyonly = forcePhyOnly || !devstate[ifname] || (devstate[ifname].type != 1);
+
+ if (isObject(iwinfo)) {
+ if (phyonly) {
+ delete iwinfo.bitrate;
+ delete iwinfo.quality;
+ delete iwinfo.quality_max;
+ delete iwinfo.mode;
+ delete iwinfo.ssid;
+ delete iwinfo.bssid;
+ delete iwinfo.encryption;
+ }
+
+ iwinfo.ifname = ifname;
+ }
+
+ return iwinfo;
+ }).catch(function() {
+ return null;
+ });
+}
+
+function getWifiSidByNetid(netid) {
+ var m = /^(\w+)\.network(\d+)$/.exec(netid);
+ if (m) {
+ var sections = uci.sections('wireless', 'wifi-iface');
+ for (var i = 0, n = 0; i < sections.length; i++) {
+ if (sections[i].device != m[1])
+ continue;
+
+ if (++n == +m[2])
+ return sections[i]['.name'];
+ }
+ }
+
+ return null;
+}
+
+function getWifiSidByIfname(ifname) {
+ var sid = getWifiSidByNetid(ifname);
+
+ if (sid != null)
+ return sid;
+
+ var res = getWifiStateByIfname(ifname);
+
+ if (res != null && isObject(res[2]) && typeof(res[2].section) == 'string')
+ return res[2].section;
+
+ return null;
+}
+
+function getWifiNetidBySid(sid) {
+ var s = uci.get('wireless', sid);
+ if (s != null && s['.type'] == 'wifi-iface') {
+ var radioname = s.device;
+ if (typeof(s.device) == 'string') {
+ var i = 0, netid = null, sections = uci.sections('wireless', 'wifi-iface');
+ for (var i = 0, n = 0; i < sections.length; i++) {
+ if (sections[i].device != s.device)
+ continue;
+
+ n++;
+
+ if (sections[i]['.name'] != s['.name'])
+ continue;
+
+ return [ '%s.network%d'.format(s.device, n), s.device ];
+ }
+
+ }
+ }
+
+ return null;
+}
+
+function getWifiNetidByNetname(name) {
+ var sections = uci.sections('wireless', 'wifi-iface');
+ for (var i = 0; i < sections.length; i++) {
+ if (typeof(sections[i].network) != 'string')
+ continue;
+
+ var nets = sections[i].network.split(/\s+/);
+ for (var j = 0; j < nets.length; j++) {
+ if (nets[j] != name)
+ continue;
+
+ return getWifiNetidBySid(sections[i]['.name']);
+ }
+ }
+
+ return null;
+}
+
+function isVirtualIfname(ifname) {
+ for (var i = 0; i < iface_patterns_virtual.length; i++)
+ if (iface_patterns_virtual[i].test(ifname))
+ return true;
+
+ return false;
+}
+
+function isIgnoredIfname(ifname) {
+ for (var i = 0; i < iface_patterns_ignore.length; i++)
+ if (iface_patterns_ignore[i].test(ifname))
+ return true;
+
+ return false;
+}
+
+function isObject(val) {
+ return (val != null && typeof(val) == 'object')
+}
+
+function appendValue(config, section, option, value) {
+ var values = uci.get(config, section, option),
+ isArray = Array.isArray(values),
+ rv = false;
+
+ if (isArray == false)
+ values = String(values || '').split(/\s+/);
+
+ if (values.indexOf(value) == -1) {
+ values.push(value);
+ rv = true;
+ }
+
+ uci.set(config, section, option, isArray ? values : values.join(' '));
+
+ return rv;
+}
+
+function removeValue(config, section, option, value) {
+ var values = uci.get(config, section, option),
+ isArray = Array.isArray(values),
+ rv = false;
+
+ if (isArray == false)
+ values = String(values || '').split(/\s+/);
+
+ for (var i = values.length - 1; i >= 0; i--) {
+ if (values[i] == value) {
+ values.splice(i, 1);
+ rv = true;
+ }
+ }
+
+ if (values.length > 0)
+ uci.set(config, section, option, isArray ? values : values.join(' '));
+ else
+ uci.unset(config, section, option);
+
+ return rv;
+}
+
+function toArray(val) {
+ if (val == null)
+ return [];
+
+ if (Array.isArray(val))
+ return val;
+
+ var s = String(val).trim();
+
+ if (s == '')
+ return [];
+
+ return s.split(/\s+/);
+}
+
+function prefixToMask(bits, v6) {
+ var w = v6 ? 128 : 32,
+ m = [];
+
+ if (bits > w)
+ return null;
+
+ for (var i = 0; i < w / 16; i++) {
+ var b = Math.min(16, bits);
+ m.push((0xffff << (16 - b)) & 0xffff);
+ bits -= b;
+ }
+
+ if (v6)
+ return String.prototype.format.apply('%x:%x:%x:%x:%x:%x:%x:%x', m).replace(/:0(?::0)+$/, '::');
+ else
+ return '%d.%d.%d.%d'.format(m[0] >>> 8, m[0] & 0xff, m[1] >>> 8, m[1] & 0xff);
+}
+
+function maskToPrefix(mask, v6) {
+ var m = v6 ? validation.parseIPv6(mask) : validation.parseIPv4(mask);
+
+ if (!m)
+ return null;
+
+ var bits = 0;
+
+ for (var i = 0, z = false; i < m.length; i++) {
+ z = z || !m[i];
+
+ while (!z && (m[i] & (v6 ? 0x8000 : 0x80))) {
+ m[i] = (m[i] << 1) & (v6 ? 0xffff : 0xff);
+ bits++;
+ }
+
+ if (m[i])
+ return null;
+ }
+
+ return bits;
+}
+
+function initNetworkState() {
+ if (_state == null)
+ return (_state = Promise.all([
+ getInterfaceState(), getDeviceState(), getBoardState(),
+ getWifiState(), getIfaddrState(), getNetdevState(),
+ uci.load('network'), uci.load('wireless'), uci.load('luci')
+ ]).finally(function() {
+ var ifaddrs = _cache.ifaddrs,
+ devices = _cache.devices,
+ board = _cache.board,
+ s = { isTunnel: {}, isBridge: {}, isSwitch: {}, isWifi: {}, interfaces: {}, bridges: {}, switches: {} };
+
+ for (var i = 0, a; (a = ifaddrs[i]) != null; i++) {
+ var name = a.name.replace(/:.+$/, '');
+
+ if (isVirtualIfname(name))
+ s.isTunnel[name] = true;
+
+ if (s.isTunnel[name] || !(isIgnoredIfname(name) || isVirtualIfname(name))) {
+ s.interfaces[name] = s.interfaces[name] || {
+ idx: a.ifindex || i,
+ name: name,
+ rawname: a.name,
+ flags: [],
+ ipaddrs: [],
+ ip6addrs: []
+ };
+
+ if (a.family == 'packet') {
+ s.interfaces[name].flags = a.flags;
+ s.interfaces[name].stats = a.data;
+ s.interfaces[name].macaddr = a.addr;
+ }
+ else if (a.family == 'inet') {
+ s.interfaces[name].ipaddrs.push(a.addr + '/' + a.netmask);
+ }
+ else if (a.family == 'inet6') {
+ s.interfaces[name].ip6addrs.push(a.addr + '/' + a.netmask);
+ }
+ }
+ }
+
+ for (var devname in devices) {
+ var dev = devices[devname];
+
+ if (dev.bridge) {
+ var b = {
+ name: devname,
+ id: dev.id,
+ stp: dev.stp,
+ ifnames: []
+ };
+
+ for (var i = 0; dev.ports && i < dev.ports.length; i++) {
+ var subdev = s.interfaces[dev.ports[i]];
+
+ if (subdev == null)
+ continue;
+
+ b.ifnames.push(subdev);
+ subdev.bridge = b;
+ }
+
+ s.bridges[devname] = b;
+ }
+ }
+
+ if (isObject(board.switch)) {
+ for (var switchname in board.switch) {
+ var layout = board.switch[switchname],
+ netdevs = {},
+ nports = {},
+ ports = [],
+ pnum = null,
+ role = null;
+
+ if (isObject(layout) && Array.isArray(layout.ports)) {
+ for (var i = 0, port; (port = layout.ports[i]) != null; i++) {
+ if (typeof(port) == 'object' && typeof(port.num) == 'number' &&
+ (typeof(port.role) == 'string' || typeof(port.device) == 'string')) {
+ var spec = {
+ num: port.num,
+ role: port.role || 'cpu',
+ index: (port.index != null) ? port.index : port.num
+ };
+
+ if (port.device != null) {
+ spec.device = port.device;
+ spec.tagged = spec.need_tag;
+ netdevs[port.num] = port.device;
+ }
+
+ ports.push(spec);
+
+ if (port.role != null)
+ nports[port.role] = (nports[port.role] || 0) + 1;
+ }
+ }
+
+ ports.sort(function(a, b) {
+ if (a.role != b.role)
+ return (a.role < b.role) ? -1 : 1;
+
+ return (a.index - b.index);
+ });
+
+ for (var i = 0, port; (port = ports[i]) != null; i++) {
+ if (port.role != role) {
+ role = port.role;
+ pnum = 1;
+ }
+
+ if (role == 'cpu')
+ port.label = 'CPU (%s)'.format(port.device);
+ else if (nports[role] > 1)
+ port.label = '%s %d'.format(role.toUpperCase(), pnum++);
+ else
+ port.label = role.toUpperCase();
+
+ delete port.role;
+ delete port.index;
+ }
+
+ s.switches[switchname] = {
+ ports: ports,
+ netdevs: netdevs
+ };
+ }
+ }
+ }
+
+ return (_state = s);
+ }));
+
+ return Promise.resolve(_state);
+}
+
+function ifnameOf(obj) {
+ if (obj instanceof Interface)
+ return obj.name();
+ else if (obj instanceof Protocol)
+ return obj.ifname();
+ else if (typeof(obj) == 'string')
+ return obj.replace(/:.+$/, '');
+
+ return null;
+}
+
+function networkSort(a, b) {
+ return a.getName() > b.getName();
+}
+
+function deviceSort(a, b) {
+ var typeWeigth = { wifi: 2, alias: 3 },
+ weightA = typeWeigth[a.getType()] || 1,
+ weightB = typeWeigth[b.getType()] || 1;
+
+ if (weightA != weightB)
+ return weightA - weightB;
+
+ return a.getName() > b.getName();
+}
+
+
+var Network, Protocol, Device, WifiDevice, WifiNetwork;
+
+Network = L.Class.extend({
+ getProtocol: function(protoname, netname) {
+ var v = _protocols[protoname];
+ if (v != null)
+ return v(netname || '__dummy__');
+
+ return null;
+ },
+
+ getProtocols: function() {
+ var rv = [];
+
+ for (var protoname in _protocols)
+ rv.push(_protocols[protoname]('__dummy__'));
+
+ return rv;
+ },
+
+ registerProtocol: function(protoname, methods) {
+ var proto = Protocol.extend(Object.assign({}, methods, {
+ __init__: function(name) {
+ this.sid = name;
+ },
+
+ proto: function() {
+ return protoname;
+ }
+ }));
+
+ _protocols[protoname] = proto;
+
+ return proto;
+ },
+
+ registerPatternVirtual: function(pat) {
+ iface_patterns_virtual.push(pat);
+ },
+
+ registerErrorCode: function(code, message) {
+ if (typeof(code) == 'string' &&
+ typeof(message) == 'string' &&
+ proto_errors.hasOwnProperty(code)) {
+ proto_errors[code] = message;
+ return true;
+ }
+
+ return false;
+ },
+
+ addNetwork: function(name, options) {
+ return this.getNetwork(name).then(L.bind(function(existingNetwork) {
+ if (name != null && /^[a-zA-Z0-9_]+$/.test(name) && existingNetwork == null) {
+ var sid = uci.add('network', 'interface', name);
+
+ if (sid != null) {
+ if (isObject(options))
+ for (var key in options)
+ if (options.hasOwnProperty(key))
+ uci.set('network', sid, key, options[key]);
+
+ return this.instantiateNetwork(sid);
+ }
+ }
+ else if (existingNetwork != null && existingNetwork.isEmpty()) {
+ if (isObject(options))
+ for (var key in options)
+ if (options.hasOwnProperty(key))
+ existingNetwork.set(key, options[key]);
+
+ return existingNetwork;
+ }
+ }, this));
+ },
+
+ getNetwork: function(name) {
+ return initNetworkState().then(L.bind(function() {
+ var section = (name != null) ? uci.get('network', name) : null;
+
+ if (section != null && section['.type'] == 'interface') {
+ return this.instantiateNetwork(name);
+ }
+ else if (name != null) {
+ for (var i = 0; i < _cache.interfacedump.length; i++)
+ if (_cache.interfacedump[i].interface == name)
+ return this.instantiateNetwork(name, _cache.interfacedump[i].proto);
+ }
+
+ return null;
+ }, this));
+ },
+
+ getNetworks: function() {
+ return initNetworkState().then(L.bind(function() {
+ var uciInterfaces = uci.sections('network', 'interface'),
+ networks = {};
+
+ for (var i = 0; i < uciInterfaces.length; i++)
+ networks[uciInterfaces[i]['.name']] = this.instantiateNetwork(uciInterfaces[i]['.name']);
+
+ for (var i = 0; i < _cache.interfacedump.length; i++)
+ if (networks[_cache.interfacedump[i].interface] == null)
+ networks[_cache.interfacedump[i].interface] =
+ this.instantiateNetwork(_cache.interfacedump[i].interface, _cache.interfacedump[i].proto);
+
+ var rv = [];
+
+ for (var network in networks)
+ if (networks.hasOwnProperty(network))
+ rv.push(networks[network]);
+
+ rv.sort(networkSort);
+
+ return rv;
+ }, this));
+ },
+
+ deleteNetwork: function(name) {
+ return Promise.all([ L.require('firewall').catch(function() { return null }), initNetworkState() ]).then(function() {
+ var uciInterface = uci.get('network', name);
+
+ if (uciInterface != null && uciInterface['.type'] == 'interface') {
+ uci.remove('network', name);
+
+ uci.sections('luci', 'ifstate', function(s) {
+ if (s.interface == name)
+ uci.remove('luci', s['.name']);
+ });
+
+ uci.sections('network', 'alias', function(s) {
+ if (s.interface == name)
+ uci.remove('network', s['.name']);
+ });
+
+ uci.sections('network', 'route', function(s) {
+ if (s.interface == name)
+ uci.remove('network', s['.name']);
+ });
+
+ uci.sections('network', 'route6', function(s) {
+ if (s.interface == name)
+ uci.remove('network', s['.name']);
+ });
+
+ uci.sections('wireless', 'wifi-iface', function(s) {
+ var networks = toArray(s.network).filter(function(network) { return network != name });
+
+ if (networks.length > 0)
+ uci.set('wireless', s['.name'], 'network', networks.join(' '));
+ else
+ uci.unset('wireless', s['.name'], 'network');
+ });
+
+ if (L.firewall)
+ return L.firewall.deleteNetwork(name).then(function() { return true });
+
+ return true;
+ }
+
+ return false;
+ });
+ },
+
+ renameNetwork: function(oldName, newName) {
+ return initNetworkState().then(function() {
+ if (newName == null || !/^[a-zA-Z0-9_]+$/.test(newName) || uci.get('network', newName) != null)
+ return false;
+
+ var oldNetwork = uci.get('network', oldName);
+
+ if (oldNetwork == null || oldNetwork['.type'] != 'interface')
+ return false;
+
+ var sid = uci.add('network', 'interface', newName);
+
+ for (var key in oldNetwork)
+ if (oldNetwork.hasOwnProperty(key) && key.charAt(0) != '.')
+ uci.set('network', sid, key, oldNetwork[key]);
+
+ uci.sections('luci', 'ifstate', function(s) {
+ if (s.interface == oldName)
+ uci.set('luci', s['.name'], 'interface', newName);
+ });
+
+ uci.sections('network', 'alias', function(s) {
+ if (s.interface == oldName)
+ uci.set('network', s['.name'], 'interface', newName);
+ });
+
+ uci.sections('network', 'route', function(s) {
+ if (s.interface == oldName)
+ uci.set('network', s['.name'], 'interface', newName);
+ });
+
+ uci.sections('network', 'route6', function(s) {
+ if (s.interface == oldName)
+ uci.set('network', s['.name'], 'interface', newName);
+ });
+
+ uci.sections('wireless', 'wifi-iface', function(s) {
+ var networks = toArray(s.network).map(function(network) { return (network == oldName ? newName : network) });
+
+ if (networks.length > 0)
+ uci.set('wireless', s['.name'], 'network', networks.join(' '));
+ });
+
+ uci.remove('network', oldName);
+
+ return true;
+ });
+ },
+
+ getDevice: function(name) {
+ return initNetworkState().then(L.bind(function() {
+ if (name == null)
+ return null;
+
+ if (_state.interfaces.hasOwnProperty(name) || isWifiIfname(name))
+ return this.instantiateDevice(name);
+
+ var netid = getWifiNetidBySid(name);
+ if (netid != null)
+ return this.instantiateDevice(netid[0]);
+
+ return null;
+ }, this));
+ },
+
+ getDevices: function() {
+ return initNetworkState().then(L.bind(function() {
+ var devices = {};
+
+ /* find simple devices */
+ var uciInterfaces = uci.sections('network', 'interface');
+ for (var i = 0; i < uciInterfaces.length; i++) {
+ var ifnames = toArray(uciInterfaces[i].ifname);
+
+ for (var j = 0; j < ifnames.length; j++) {
+ if (ifnames[j].charAt(0) == '@')
+ continue;
+
+ if (isIgnoredIfname(ifnames[j]) || isVirtualIfname(ifnames[j]) || isWifiIfname(ifnames[j]))
+ continue;
+
+ devices[ifnames[j]] = this.instantiateDevice(ifnames[j]);
+ }
+ }
+
+ for (var ifname in _state.interfaces) {
+ if (devices.hasOwnProperty(ifname))
+ continue;
+
+ if (isIgnoredIfname(ifname) || isVirtualIfname(ifname) || isWifiIfname(ifname))
+ continue;
+
+ devices[ifname] = this.instantiateDevice(ifname);
+ }
+
+ /* find VLAN devices */
+ var uciSwitchVLANs = uci.sections('network', 'switch_vlan');
+ for (var i = 0; i < uciSwitchVLANs.length; i++) {
+ if (typeof(uciSwitchVLANs[i].ports) != 'string' ||
+ typeof(uciSwitchVLANs[i].device) != 'string' ||
+ !_state.switches.hasOwnProperty(uciSwitchVLANs[i].device))
+ continue;
+
+ var ports = uciSwitchVLANs[i].ports.split(/\s+/);
+ for (var j = 0; j < ports.length; j++) {
+ var m = ports[j].match(/^(\d+)([tu]?)$/);
+ if (m == null)
+ continue;
+
+ var netdev = _state.switches[uciSwitchVLANs[i].device].netdevs[m[1]];
+ if (netdev == null)
+ continue;
+
+ if (!devices.hasOwnProperty(netdev))
+ devices[netdev] = this.instantiateDevice(netdev);
+
+ _state.isSwitch[netdev] = true;
+
+ if (m[2] != 't')
+ continue;
+
+ var vid = uciSwitchVLANs[i].vid || uciSwitchVLANs[i].vlan;
+ vid = (vid != null ? +vid : null);
+
+ if (vid == null || vid < 0 || vid > 4095)
+ continue;
+
+ var vlandev = '%s.%d'.format(netdev, vid);
+
+ if (!devices.hasOwnProperty(vlandev))
+ devices[vlandev] = this.instantiateDevice(vlandev);
+
+ _state.isSwitch[vlandev] = true;
+ }
+ }
+
+ /* find wireless interfaces */
+ var uciWifiIfaces = uci.sections('wireless', 'wifi-iface'),
+ networkCount = {};
+
+ for (var i = 0; i < uciWifiIfaces.length; i++) {
+ if (typeof(uciWifiIfaces[i].device) != 'string')
+ continue;
+
+ networkCount[uciWifiIfaces[i].device] = (networkCount[uciWifiIfaces[i].device] || 0) + 1;
+
+ var netid = '%s.network%d'.format(uciWifiIfaces[i].device, networkCount[uciWifiIfaces[i].device]);
+
+ devices[netid] = this.instantiateDevice(netid);
+ }
+
+ var rv = [];
+
+ for (var netdev in devices)
+ if (devices.hasOwnProperty(netdev))
+ rv.push(devices[netdev]);
+
+ rv.sort(deviceSort);
+
+ return rv;
+ }, this));
+ },
+
+ isIgnoredDevice: function(name) {
+ return isIgnoredIfname(name);
+ },
+
+ getWifiDevice: function(devname) {
+ return Promise.all([ getWifiIwinfoByIfname(devname, true), initNetworkState() ]).then(L.bind(function(res) {
+ var existingDevice = uci.get('wireless', devname);
+
+ if (existingDevice == null || existingDevice['.type'] != 'wifi-device')
+ return null;
+
+ return this.instantiateWifiDevice(devname, res[0]);
+ }, this));
+ },
+
+ getWifiDevices: function() {
+ var deviceNames = [];
+
+ return initNetworkState().then(L.bind(function() {
+ var uciWifiDevices = uci.sections('wireless', 'wifi-device'),
+ tasks = [];
+
+ for (var i = 0; i < uciWifiDevices.length; i++) {
+ tasks.push(callIwinfoInfo(uciWifiDevices['.name'], true));
+ deviceNames.push(uciWifiDevices['.name']);
+ }
+
+ return Promise.all(tasks);
+ }, this)).then(L.bind(function(iwinfos) {
+ var rv = [];
+
+ for (var i = 0; i < deviceNames.length; i++)
+ if (isObject(iwinfos[i]))
+ rv.push(this.instantiateWifiDevice(deviceNames[i], iwinfos[i]));
+
+ rv.sort(function(a, b) { return a.getName() < b.getName() });
+
+ return rv;
+ }, this));
+ },
+
+ getWifiNetwork: function(netname) {
+ var sid, res, netid, radioname, radiostate, netstate;
+
+ return initNetworkState().then(L.bind(function() {
+ sid = getWifiSidByNetid(netname);
+
+ if (sid != null) {
+ res = getWifiStateBySid(sid);
+ netid = netname;
+ radioname = res ? res[0] : null;
+ radiostate = res ? res[1] : null;
+ netstate = res ? res[2] : null;
+ }
+ else {
+ res = getWifiStateByIfname(netname);
+
+ if (res != null) {
+ radioname = res[0];
+ radiostate = res[1];
+ netstate = res[2];
+ sid = netstate.section;
+ netid = getWifiNetidBySid(sid);
+ }
+ else {
+ res = getWifiStateBySid(netname);
+
+ if (res != null) {
+ radioname = res[0];
+ radiostate = res[1];
+ netstate = res[2];
+ sid = netname;
+ netid = getWifiNetidBySid(sid);
+ }
+ else {
+ res = getWifiNetidBySid(netname);
+
+ if (res != null) {
+ netid = res[0];
+ radioname = res[1];
+ sid = netname;
+ }
+ }
+ }
+ }
+
+ return (netstate ? getWifiIwinfoByIfname(netstate.ifname) : Promise.reject())
+ .catch(function() { return radioname ? getWifiIwinfoByIfname(radioname) : Promise.reject() })
+ .catch(function() { return Promise.resolve({ ifname: netid || sid || netname }) });
+ }, this)).then(L.bind(function(iwinfo) {
+ return this.instantiateWifiNetwork(sid || netname, radioname, radiostate, netid, netstate, iwinfo);
+ }, this));
+ },
+
+ addWifiNetwork: function(options) {
+ return initNetworkState().then(L.bind(function() {
+ if (options == null ||
+ typeof(options) != 'object' ||
+ typeof(options.device) != 'string')
+ return null;
+
+ var existingDevice = uci.get('wireless', options.device);
+ if (existingDevice == null || existingDevice['.type'] != 'wifi-device')
+ return null;
+
+ var sid = uci.add('wireless', 'wifi-iface');
+ for (var key in options)
+ if (options.hasOwnProperty(key))
+ uci.set('wireless', sid, key, options[key]);
+
+ var radioname = existingDevice['.name'],
+ netid = getWifiNetidBySid(sid);
+
+ return this.instantiateWifiNetwork(sid, radioname, _cache.wifi[radioname], netid, null, { ifname: netid });
+ }, this));
+ },
+
+ deleteWifiNetwork: function(netname) {
+ return initNetworkState().then(L.bind(function() {
+ var sid = getWifiSidByIfname(netname);
+
+ if (sid == null)
+ return false;
+
+ uci.remove('wireless', sid);
+ return true;
+ }, this));
+ },
+
+ getStatusByRoute: function(addr, mask) {
+ return initNetworkState().then(L.bind(function() {
+ var rv = [];
+
+ for (var i = 0; i < _state.interfacedump.length; i++) {
+ if (!Array.isArray(_state.interfacedump[i].route))
+ continue;
+
+ for (var j = 0; j < _state.interfacedump[i].route.length; j++) {
+ if (typeof(_state.interfacedump[i].route[j]) != 'object' ||
+ typeof(_state.interfacedump[i].route[j].target) != 'string' ||
+ typeof(_state.interfacedump[i].route[j].mask) != 'number')
+ continue;
+
+ if (_state.interfacedump[i].route[j].table)
+ continue;
+
+ rv.push(_state.interfacedump[i]);
+ }
+ }
+
+ return rv;
+ }, this));
+ },
+
+ getStatusByAddress: function(addr) {
+ return initNetworkState().then(L.bind(function() {
+ var rv = [];
+
+ for (var i = 0; i < _state.interfacedump.length; i++) {
+ if (Array.isArray(_state.interfacedump[i]['ipv4-address']))
+ for (var j = 0; j < _state.interfacedump[i]['ipv4-address'].length; j++)
+ if (typeof(_state.interfacedump[i]['ipv4-address'][j]) == 'object' &&
+ _state.interfacedump[i]['ipv4-address'][j].address == addr)
+ return _state.interfacedump[i];
+
+ if (Array.isArray(_state.interfacedump[i]['ipv6-address']))
+ for (var j = 0; j < _state.interfacedump[i]['ipv6-address'].length; j++)
+ if (typeof(_state.interfacedump[i]['ipv6-address'][j]) == 'object' &&
+ _state.interfacedump[i]['ipv6-address'][j].address == addr)
+ return _state.interfacedump[i];
+
+ if (Array.isArray(_state.interfacedump[i]['ipv6-prefix-assignment']))
+ for (var j = 0; j < _state.interfacedump[i]['ipv6-prefix-assignment'].length; j++)
+ if (typeof(_state.interfacedump[i]['ipv6-prefix-assignment'][j]) == 'object' &&
+ typeof(_state.interfacedump[i]['ipv6-prefix-assignment'][j]['local-address']) == 'object' &&
+ _state.interfacedump[i]['ipv6-prefix-assignment'][j]['local-address'].address == addr)
+ return _state.interfacedump[i];
+ }
+
+ return null;
+ }, this));
+ },
+
+ getWANNetworks: function() {
+ return this.getStatusByRoute('0.0.0.0', 0).then(L.bind(function(statuses) {
+ var rv = [];
+
+ for (var i = 0; i < statuses.length; i++)
+ rv.push(this.instantiateNetwork(statuses[i].interface, statuses[i].proto));
+
+ return rv;
+ }, this));
+ },
+
+ getWAN6Networks: function() {
+ return this.getStatusByRoute('::', 0).then(L.bind(function(statuses) {
+ var rv = [];
+
+ for (var i = 0; i < statuses.length; i++)
+ rv.push(this.instantiateNetwork(statuses[i].interface, statuses[i].proto));
+
+ return rv;
+ }, this));
+ },
+
+ getSwitchTopologies: function() {
+ return initNetworkState().then(function() {
+ return _state.switches;
+ });
+ },
+
+ instantiateNetwork: function(name, proto) {
+ if (name == null)
+ return null;
+
+ proto = (proto == null ? uci.get('network', name, 'proto') : proto);
+
+ var protoClass = _protocols[proto] || Protocol;
+ return new protoClass(name);
+ },
+
+ instantiateDevice: function(name, network) {
+ return new Device(name, network);
+ },
+
+ instantiateWifiDevice: function(radioname, iwinfo) {
+ return new WifiDevice(radioname, iwinfo);
+ },
+
+ instantiateWifiNetwork: function(sid, radioname, radiostate, netid, netstate, iwinfo) {
+ return new WifiNetwork(sid, radioname, radiostate, netid, netstate, iwinfo);
+ }
+});
+
+Protocol = L.Class.extend({
+ __init__: function(name) {
+ this.sid = name;
+ },
+
+ _get: function(opt) {
+ var val = uci.get('network', this.sid, opt);
+
+ if (Array.isArray(val))
+ return val.join(' ');
+
+ return val || '';
+ },
+
+ _ubus: function(field) {
+ for (var i = 0; i < _cache.interfacedump.length; i++) {
+ if (_cache.interfacedump[i].interface != this.sid)
+ continue;
+
+ return (field != null ? _cache.interfacedump[i][field] : _cache.interfacedump[i]);
+ }
+ },
+
+ get: function(opt) {
+ return uci.get('network', this.sid, opt);
+ },
+
+ set: function(opt, val) {
+ return uci.set('network', this.sid, opt, val);
+ },
+
+ getIfname: function() {
+ var ifname;
+
+ if (this.isFloating())
+ ifname = this._ubus('l3_device');
+ else
+ ifname = this._ubus('device');
+
+ if (ifname != null)
+ return ifname;
+
+ var res = getWifiNetidByNetname(this.sid);
+ return (res != null ? res[0] : null);
+ },
+
+ getProtocol: function() {
+ return 'none';
+ },
+
+ getI18n: function() {
+ switch (this.getProtocol()) {
+ case 'none': return _('Unmanaged');
+ case 'static': return _('Static address');
+ case 'dhcp': return _('DHCP client');
+ default: return _('Unknown');
+ }
+ },
+
+ getType: function() {
+ return this._get('type');
+ },
+
+ getName: function() {
+ return this.sid;
+ },
+
+ getUptime: function() {
+ return this._ubus('uptime') || 0;
+ },
+
+ getExpiry: function() {
+ var u = this._ubus('uptime'),
+ d = this._ubus('data');
+
+ if (typeof(u) == 'number' && d != null &&
+ typeof(d) == 'object' && typeof(d.leasetime) == 'number') {
+ var r = d.leasetime - (u % d.leasetime);
+ return (r > 0 ? r : 0);
+ }
+
+ return -1;
+ },
+
+ getMetric: function() {
+ return this._ubus('metric') || 0;
+ },
+
+ getZoneName: function() {
+ var d = this._ubus('data');
+
+ if (isObject(d) && typeof(d.zone) == 'string')
+ return d.zone;
+
+ return null;
+ },
+
+ getIPAddr: function() {
+ var addrs = this._ubus('ipv4-address');
+ return ((Array.isArray(addrs) && addrs.length) ? addrs[0].address : null);
+ },
+
+ getIPAddrs: function() {
+ var addrs = this._ubus('ipv4-address'),
+ rv = [];
+
+ if (Array.isArray(addrs))
+ for (var i = 0; i < addrs.length; i++)
+ rv.push('%s/%d'.format(addrs[i].address, addrs[i].mask));
+
+ return rv;
+ },
+
+ getNetmask: function() {
+ var addrs = this._ubus('ipv4-address');
+ if (Array.isArray(addrs) && addrs.length) {
+ switch (addrs[0].mask) {
+ case 0: return '0.0.0.0';
+ case 1: return '128.0.0.0';
+ case 2: return '192.0.0.0';
+ case 3: return '224.0.0.0';
+ case 4: return '240.0.0.0';
+ case 5: return '248.0.0.0';
+ case 6: return '252.0.0.0';
+ case 7: return '254.0.0.0';
+ case 8: return '255.0.0.0';
+ case 9: return '255.128.0.0';
+ case 10: return '255.192.0.0';
+ case 11: return '255.224.0.0';
+ case 12: return '255.240.0.0';
+ case 13: return '255.248.0.0';
+ case 14: return '255.252.0.0';
+ case 15: return '255.254.0.0';
+ case 16: return '255.255.0.0';
+ case 17: return '255.255.128.0';
+ case 18: return '255.255.192.0';
+ case 19: return '255.255.224.0';
+ case 20: return '255.255.240.0';
+ case 21: return '255.255.248.0';
+ case 22: return '255.255.252.0';
+ case 23: return '255.255.254.0';
+ case 24: return '255.255.255.0';
+ case 25: return '255.255.255.128';
+ case 26: return '255.255.255.192';
+ case 27: return '255.255.255.224';
+ case 28: return '255.255.255.240';
+ case 29: return '255.255.255.248';
+ case 30: return '255.255.255.252';
+ case 31: return '255.255.255.254';
+ case 32: return '255.255.255.255';
+ }
+ }
+ },
+
+ getGatewayAddr: function() {
+ var routes = this._ubus('route');
+
+ if (Array.isArray(routes))
+ for (var i = 0; i < routes.length; i++)
+ if (typeof(routes[i]) == 'object' &&
+ routes[i].target == '0.0.0.0' &&
+ routes[i].mask == 0)
+ return routes[i].nexthop;
+
+ return null;
+ },
+
+ getDNSAddrs: function() {
+ var addrs = this._ubus('dns-server'),
+ rv = [];
+
+ if (Array.isArray(addrs))
+ for (var i = 0; i < addrs.length; i++)
+ if (!/:/.test(addrs[i]))
+ rv.push(addrs[i]);
+
+ return rv;
+ },
+
+ getIP6Addr: function() {
+ var addrs = this._ubus('ipv6-address');
+
+ if (Array.isArray(addrs) && isObject(addrs[0]))
+ return '%s/%d'.format(addrs[0].address, addrs[0].mask);
+
+ addrs = this._ubus('ipv6-prefix-assignment');
+
+ if (Array.isArray(addrs) && isObject(addrs[0]) && isObject(addrs[0]['local-address']))
+ return '%s/%d'.format(addrs[0]['local-address'].address, addrs[0]['local-address'].mask);
+
+ return null;
+ },
+
+ getIP6Addrs: function() {
+ var addrs = this._ubus('ipv6-address'),
+ rv = [];
+
+ if (Array.isArray(addrs))
+ for (var i = 0; i < addrs.length; i++)
+ if (isObject(addrs[i]))
+ rv.push('%s/%d'.format(addrs[i].address, addrs[i].mask));
+
+ addrs = this._ubus('ipv6-prefix-assignment');
+
+ if (Array.isArray(addrs))
+ for (var i = 0; i < addrs.length; i++)
+ if (isObject(addrs[i]) && isObject(addrs[i]['local-address']))
+ rv.push('%s/%d'.format(addrs[i]['local-address'].address, addrs[i]['local-address'].mask));
+
+ return rv;
+ },
+
+ getDNS6Addrs: function() {
+ var addrs = this._ubus('dns-server'),
+ rv = [];
+
+ if (Array.isArray(addrs))
+ for (var i = 0; i < addrs.length; i++)
+ if (/:/.test(addrs[i]))
+ rv.push(addrs[i]);
+
+ return rv;
+ },
+
+ getIP6Prefix: function() {
+ var prefixes = this._ubus('ipv6-prefix');
+
+ if (Array.isArray(prefixes) && isObject(prefixes[0]))
+ return '%s/%d'.format(prefixes[0].address, prefixes[0].mask);
+
+ return null;
+ },
+
+ getErrors: function() {
+ var errors = this._ubus('errors'),
+ rv = null;
+
+ if (Array.isArray(errors)) {
+ for (var i = 0; i < errors.length; i++) {
+ if (!isObject(errors[i]) || typeof(errors[i].code) != 'string')
+ continue;
+
+ rv = rv || [];
+ rv.push(proto_errors[errors[i].code] || _('Unknown error (%s)').format(errors[i].code));
+ }
+ }
+
+ return rv;
+ },
+
+ isBridge: function() {
+ return (!this.isVirtual() && this.getType() == 'bridge');
+ },
+
+ getOpkgPackage: function() {
+ return null;
+ },
+
+ isInstalled: function() {
+ return true;
+ },
+
+ isVirtual: function() {
+ return false;
+ },
+
+ isFloating: function() {
+ return false;
+ },
+
+ isDynamic: function() {
+ return (this._ubus('dynamic') == true);
+ },
+
+ isAlias: function() {
+ var ifnames = toArray(uci.get('network', this.sid, 'ifname')),
+ parent = null;
+
+ for (var i = 0; i < ifnames.length; i++)
+ if (ifnames[i].charAt(0) == '@')
+ parent = ifnames[i].substr(1);
+ else if (parent != null)
+ parent = null;
+
+ return parent;
+ },
+
+ isEmpty: function() {
+ if (this.isFloating())
+ return false;
+
+ var empty = true,
+ ifname = this._get('ifname');
+
+ if (ifname != null && ifname.match(/\S+/))
+ empty = false;
+
+ if (empty == true && getWifiNetidBySid(this.sid) != null)
+ empty = false;
+
+ return empty;
+ },
+
+ isUp: function() {
+ return (this._ubus('up') == true);
+ },
+
+ addDevice: function(ifname) {
+ ifname = ifnameOf(ifname);
+
+ if (ifname == null || this.isFloating())
+ return false;
+
+ var wif = getWifiSidByIfname(ifname);
+
+ if (wif != null)
+ return appendValue('wireless', wif, 'network', this.sid);
+
+ return appendValue('network', this.sid, 'ifname', ifname);
+ },
+
+ deleteDevice: function(ifname) {
+ var rv = false;
+
+ ifname = ifnameOf(ifname);
+
+ if (ifname == null || this.isFloating())
+ return false;
+
+ var wif = getWifiSidByIfname(ifname);
+
+ if (wif != null)
+ rv = removeValue('wireless', wif, 'network', this.sid);
+
+ if (removeValue('network', this.sid, 'ifname', ifname))
+ rv = true;
+
+ return rv;
+ },
+
+ getDevice: function() {
+ if (this.isVirtual()) {
+ var ifname = '%s-%s'.format(this.getProtocol(), this.sid);
+ _state.isTunnel[this.getProtocol() + '-' + this.sid] = true;
+ return L.network.instantiateDevice(ifname, this);
+ }
+ else if (this.isBridge()) {
+ var ifname = 'br-%s'.format(this.sid);
+ _state.isBridge[ifname] = true;
+ return new Device(ifname, this);
+ }
+ else {
+ var ifname = this._ubus('l3_device') || this._ubus('device');
+
+ if (ifname != null)
+ return L.network.instantiateDevice(ifname, this);
+
+ var ifnames = toArray(uci.get('network', this.sid, 'ifname'));
+
+ for (var i = 0; i < ifnames.length; i++) {
+ var m = ifnames[i].match(/^([^:/]+)/);
+ return ((m && m[1]) ? L.network.instantiateDevice(m[1], this) : null);
+ }
+
+ ifname = getWifiNetidByNetname(this.sid);
+
+ return (ifname != null ? L.network.instantiateDevice(ifname, this) : null);
+ }
+ },
+
+ getDevices: function() {
+ var rv = [];
+
+ if (!this.isBridge() && !(this.isVirtual() && !this.isFloating()))
+ return null;
+
+ var ifnames = toArray(uci.get('network', this.sid, 'ifname'));
+
+ for (var i = 0; i < ifnames.length; i++) {
+ if (ifnames[i].charAt(0) == '@')
+ continue;
+
+ var m = ifnames[i].match(/^([^:/]+)/);
+ if (m != null)
+ rv.push(L.network.instantiateDevice(m[1], this));
+ }
+
+ var uciWifiIfaces = uci.sections('wireless', 'wifi-iface');
+
+ for (var i = 0; i < uciWifiIfaces.length; i++) {
+ if (typeof(uciWifiIfaces[i].device) != 'string')
+ continue;
+
+ var networks = toArray(uciWifiIfaces[i].network);
+
+ for (var j = 0; j < networks.length; j++) {
+ if (networks[j] != this.sid)
+ continue;
+
+ var netid = getWifiNetidBySid(uciWifiIfaces[i]['.name']);
+
+ if (netid != null)
+ rv.push(L.network.instantiateDevice(netid[0], this));
+ }
+ }
+
+ rv.sort(deviceSort);
+
+ return rv;
+ },
+
+ containsDevice: function(ifname) {
+ ifname = ifnameOf(ifname);
+
+ if (ifname == null)
+ return false;
+ else if (this.isVirtual() && '%s-%s'.format(this.getProtocol(), this.sid) == ifname)
+ return true;
+ else if (this.isBridge() && 'br-%s'.format(this.sid) == ifname)
+ return true;
+
+ var ifnames = toArray(uci.get('network', this.sid, 'ifname'));
+
+ for (var i = 0; i < ifnames.length; i++) {
+ var m = ifnames[i].match(/^([^:/]+)/);
+ if (m != null && m[1] == ifname)
+ return true;
+ }
+
+ var wif = getWifiSidByIfname(ifname);
+
+ if (wif != null) {
+ var networks = toArray(uci.get('wireless', wif, 'network'));
+
+ for (var i = 0; i < networks.length; i++)
+ if (networks[i] == this.sid)
+ return true;
+ }
+
+ return false;
+ }
+});
+
+Device = L.Class.extend({
+ __init__: function(ifname, network) {
+ var wif = getWifiSidByIfname(ifname);
+
+ if (wif != null) {
+ var res = getWifiStateBySid(wif) || [],
+ netid = getWifiNetidBySid(wif);
+
+ this.wif = new WifiNetwork(wif, res[0], res[1], netid, res[2], { ifname: ifname });
+ this.ifname = this.wif.getIfname();
+ }
+
+ this.ifname = this.ifname || ifname;
+ this.dev = _state.interfaces[this.ifname];
+ this.network = network;
+ },
+
+ _ubus: function(field) {
+ var dump = _cache.devicedump[this.ifname] || {};
+
+ return (field != null ? dump[field] : dump);
+ },
+
+ getName: function() {
+ return (this.wif != null ? this.wif.getIfname() : this.ifname);
+ },
+
+ getMAC: function() {
+ return this._ubus('macaddr');
+ },
+
+ getIPAddrs: function() {
+ var addrs = (this.dev != null ? this.dev.ipaddrs : null);
+ return (Array.isArray(addrs) ? addrs : []);
+ },
+
+ getIP6Addrs: function() {
+ var addrs = (this.dev != null ? this.dev.ip6addrs : null);
+ return (Array.isArray(addrs) ? addrs : []);
+ },
+
+ getType: function() {
+ if (this.ifname.charAt(0) == '@')
+ return 'alias';
+ else if (this.wif != null || isWifiIfname(this.ifname))
+ return 'wifi';
+ else if (_state.isBridge[this.ifname])
+ return 'bridge';
+ else if (_state.isTunnel[this.ifname])
+ return 'tunnel';
+ else if (this.ifname.indexOf('.') > -1)
+ return 'vlan';
+ else if (_state.isSwitch[this.ifname])
+ return 'switch';
+ else
+ return 'ethernet';
+ },
+
+ getShortName: function() {
+ if (this.wif != null)
+ return this.wif.getShortName();
+
+ return this.ifname;
+ },
+
+ getI18n: function() {
+ if (this.wif != null) {
+ return '%s: %s "%s"'.format(
+ _('Wireless Network'),
+ this.wif.getActiveMode(),
+ this.wif.getActiveSSID() || this.wif.getActiveBSSID() || this.wif.getID() || '?');
+ }
+
+ return '%s: "%s"'.format(this.getTypeI18n(), this.getName());
+ },
+
+ getTypeI18n: function() {
+ switch (this.getType()) {
+ case 'alias':
+ return _('Alias Interface');
+
+ case 'wifi':
+ return _('Wireless Adapter');
+
+ case 'bridge':
+ return _('Bridge');
+
+ case 'switch':
+ return _('Ethernet Switch');
+
+ case 'vlan':
+ return (_state.isSwitch[this.ifname] ? _('Switch VLAN') : _('Software VLAN'));
+
+ case 'tunnel':
+ return _('Tunnel Interface');
+
+ default:
+ return _('Ethernet Adapter');
+ }
+ },
+
+ getPorts: function() {
+ var br = _state.bridges[this.ifname],
+ rv = [];
+
+ if (br == null || !Array.isArray(br.ifnames))
+ return null;
+
+ for (var i = 0; i < br.ifnames.length; i++)
+ rv.push(L.network.instantiateDevice(br.ifnames[i]));
+
+ return rv;
+ },
+
+ getBridgeID: function() {
+ var br = _state.bridges[this.ifname];
+ return (br != null ? br.id : null);
+ },
+
+ getBridgeSTP: function() {
+ var br = _state.bridges[this.ifname];
+ return (br != null ? !!br.stp : false);
+ },
+
+ isUp: function() {
+ var up = this._ubus('up');
+
+ if (up == null)
+ up = (this.getType() == 'alias');
+
+ return up;
+ },
+
+ isBridge: function() {
+ return (this.getType() == 'bridge');
+ },
+
+ isBridgePort: function() {
+ return (this.dev != null && this.dev.bridge != null);
+ },
+
+ getTXBytes: function() {
+ var stat = this._ubus('statistics');
+ return (stat != null ? stat.tx_bytes || 0 : 0);
+ },
+
+ getRXBytes: function() {
+ var stat = this._ubus('statistics');
+ return (stat != null ? stat.rx_bytes || 0 : 0);
+ },
+
+ getTXPackets: function() {
+ var stat = this._ubus('statistics');
+ return (stat != null ? stat.tx_packets || 0 : 0);
+ },
+
+ getRXPackets: function() {
+ var stat = this._ubus('statistics');
+ return (stat != null ? stat.rx_packets || 0 : 0);
+ },
+
+ getNetwork: function() {
+ return this.getNetworks()[0];
+ },
+
+ getNetworks: function() {
+ if (this.networks == null) {
+ this.networks = [];
+
+ var networks = L.network.getNetworks();
+
+ for (var i = 0; i < networks.length; i++)
+ if (networks[i].containsDevice(this.ifname) || networks[i].getIfname() == this.ifname)
+ this.networks.push(networks[i]);
+
+ this.networks.sort(networkSort);
+ }
+
+ return this.networks;
+ },
+
+ getWifiNetwork: function() {
+ return (this.wif != null ? this.wif : null);
+ }
+});
+
+WifiDevice = L.Class.extend({
+ __init__: function(name, iwinfo) {
+ var uciWifiDevice = uci.get('wireless', name);
+
+ if (uciWifiDevice != null &&
+ uciWifiDevice['.type'] == 'wifi-device' &&
+ uciWifiDevice['.name'] != null) {
+ this.sid = uciWifiDevice['.name'];
+ this.iwinfo = iwinfo;
+ }
+
+ this.sid = this.sid || name;
+ this.iwinfo = this.iwinfo || { ifname: this.sid };
+ },
+
+ get: function(opt) {
+ return uci.get('wireless', this.sid, opt);
+ },
+
+ set: function(opt, value) {
+ return uci.set('wireless', this.sid, opt, value);
+ },
+
+ getName: function() {
+ return this.sid;
+ },
+
+ getHWModes: function() {
+ if (isObject(this.iwinfo.hwmodelist))
+ for (var k in this.iwinfo.hwmodelist)
+ return this.iwinfo.hwmodelist;
+
+ return { b: true, g: true };
+ },
+
+ getI18n: function() {
+ var type = this.iwinfo.hardware_name || 'Generic';
+
+ if (this.iwinfo.type == 'wl')
+ type = 'Broadcom';
+
+ var hwmodes = this.getHWModes(),
+ modestr = '';
+
+ if (hwmodes.a) modestr += 'a';
+ if (hwmodes.b) modestr += 'b';
+ if (hwmodes.g) modestr += 'g';
+ if (hwmodes.n) modestr += 'n';
+ if (hwmodes.ad) modestr += 'ac';
+
+ return '%s 802.11%s Wireless Controller (%s)'.format(type, modestr, this.getName());
+ },
+
+ isUp: function() {
+ if (isObject(_cache.wifi[this.sid]))
+ return (_cache.wifi[this.sid].up == true);
+
+ return false;
+ },
+
+ getWifiNetwork: function(network) {
+ return L.network.getWifiNetwork(network).then(L.bind(function(networkInstance) {
+ var uciWifiIface = (networkInstance.sid ? uci.get('wireless', networkInstance.sid) : null);
+
+ if (uciWifiIface == null || uciWifiIface['.type'] != 'wifi-iface' || uciWifiIface.device != this.sid)
+ return Promise.reject();
+
+ return networkInstance;
+ }, this));
+ },
+
+ getWifiNetworks: function() {
+ var uciWifiIfaces = uci.sections('wireless', 'wifi-iface'),
+ tasks = [];
+
+ for (var i = 0; i < uciWifiIfaces.length; i++)
+ if (uciWifiIfaces[i].device == this.sid)
+ tasks.push(L.network.getWifiNetwork(uciWifiIfaces[i]['.name']));
+
+ return Promise.all(tasks);
+ },
+
+ addWifiNetwork: function(options) {
+ if (!isObject(options))
+ options = {};
+
+ options.device = this.sid;
+
+ return L.network.addWifiNetwork(options);
+ },
+
+ deleteWifiNetwork: function(network) {
+ var sid = null;
+
+ if (network instanceof WifiNetwork) {
+ sid = network.sid;
+ }
+ else {
+ var uciWifiIface = uci.get('wireless', network);
+
+ if (uciWifiIface == null || uciWifiIface['.type'] != 'wifi-iface')
+ sid = getWifiSidByIfname(network);
+ }
+
+ if (sid == null || uci.get('wireless', sid, 'device') != this.sid)
+ return Promise.resolve(false);
+
+ uci.delete('wireless', network);
+
+ return Promise.resolve(true);
+ }
+});
+
+WifiNetwork = L.Class.extend({
+ __init__: function(sid, radioname, radiostate, netid, netstate, iwinfo) {
+ this.sid = sid;
+ this.wdev = iwinfo.ifname;
+ this.iwinfo = iwinfo;
+ this.netid = netid;
+ this._ubusdata = {
+ radio: radioname,
+ dev: radiostate,
+ net: netstate
+ };
+ },
+
+ ubus: function(/* ... */) {
+ var v = this._ubusdata;
+
+ for (var i = 0; i < arguments.length; i++)
+ if (isObject(v))
+ v = v[arguments[i]];
+ else
+ return null;
+
+ return v;
+ },
+
+ get: function(opt) {
+ return uci.get('wireless', this.sid, opt);
+ },
+
+ set: function(opt, value) {
+ return uci.set('wireless', this.sid, opt, value);
+ },
+
+ getMode: function() {
+ return this.ubus('net', 'config', 'mode') || this.get('mode') || 'ap';
+ },
+
+ getSSID: function() {
+ return this.ubus('net', 'config', 'ssid') || this.get('ssid');
+ },
+
+ getBSSID: function() {
+ return this.ubus('net', 'config', 'bssid') || this.get('bssid');
+ },
+
+ getNetworkNames: function() {
+ return toArray(this.ubus('net', 'config', 'network') || this.get('network'));
+ },
+
+ getID: function() {
+ return this.netid;
+ },
+
+ getName: function() {
+ return this.sid;
+ },
+
+ getIfname: function() {
+ var ifname = this.ubus('net', 'ifname') || this.iwinfo.ifname;
+
+ if (ifname == null || ifname.match(/^(wifi|radio)\d/))
+ ifname = this.netid;
+
+ return ifname;
+ },
+
+ getWifiDevice: function() {
+ var radioname = this.ubus('radio') || this.get('device');
+
+ if (radioname == null)
+ return Promise.reject();
+
+ return L.network.getWifiDevice(radioname);
+ },
+
+ isUp: function() {
+ var device = this.getDevice();
+
+ if (device == null)
+ return false;
+
+ return device.isUp();
+ },
+
+ getActiveMode: function() {
+ var mode = this.iwinfo.mode || this.ubus('net', 'config', 'mode') || this.get('mode') || 'ap';
+
+ switch (mode) {
+ case 'ap': return 'Master';
+ case 'sta': return 'Client';
+ case 'adhoc': return 'Ad-Hoc';
+ case 'mesh': return 'Mesh';
+ case 'monitor': return 'Monitor';
+ default: return mode;
+ }
+ },
+
+ getActiveModeI18n: function() {
+ var mode = this.getActiveMode();
+
+ switch (mode) {
+ case 'Master': return _('Master');
+ case 'Client': return _('Client');
+ case 'Ad-Hoc': return _('Ad-Hoc');
+ case 'Mash': return _('Mesh');
+ case 'Monitor': return _('Monitor');
+ default: return mode;
+ }
+ },
+
+ getActiveSSID: function() {
+ return this.iwinfo.ssid || this.ubus('net', 'config', 'ssid') || this.get('ssid');
+ },
+
+ getActiveBSSID: function() {
+ return this.iwinfo.bssid || this.ubus('net', 'config', 'bssid') || this.get('bssid');
+ },
+
+ getActiveEncryption: function() {
+ var encryption = this.iwinfo.encryption;
+
+ return (isObject(encryption) ? encryption.description || '-' : '-');
+ },
+
+ getAssocList: function() {
+ // XXX tbd
+ },
+
+ getFrequency: function() {
+ var freq = this.iwinfo.frequency;
+
+ if (freq != null && freq > 0)
+ return '%.03f'.format(freq / 1000);
+
+ return null;
+ },
+
+ getBitRate: function() {
+ var rate = this.iwinfo.bitrate;
+
+ if (rate != null && rate > 0)
+ return (rate / 1000);
+
+ return null;
+ },
+
+ getChannel: function() {
+ return this.iwinfo.channel || this.ubus('dev', 'config', 'channel') || this.get('channel');
+ },
+
+ getSignal: function() {
+ return this.iwinfo.signal || 0;
+ },
+
+ getNoise: function() {
+ return this.iwinfo.noise || 0;
+ },
+
+ getCountryCode: function() {
+ return this.iwinfo.country || this.ubus('dev', 'config', 'country') || '00';
+ },
+
+ getTXPower: function() {
+ var pwr = this.iwinfo.txpower || 0;
+ return (pwr + this.getTXPowerOffset());
+ },
+
+ getTXPowerOffset: function() {
+ return this.iwinfo.txpower_offset || 0;
+ },
+
+ getSignalLevel: function(signal, noise) {
+ if (this.getActiveBSSID() == '00:00:00:00:00:00')
+ return -1;
+
+ signal = signal || this.getSignal();
+ noise = noise || this.getNoise();
+
+ if (signal < 0 && noise < 0) {
+ var snr = -1 * (noise - signal);
+ return Math.floor(snr / 5);
+ }
+
+ return 0;
+ },
+
+ getSignalPercent: function() {
+ var qc = this.iwinfo.quality || 0,
+ qm = this.iwinfo.quality_max || 0;
+
+ if (qc > 0 && qm > 0)
+ return Math.floor((100 / qm) * qc);
+
+ return 0;
+ },
+
+ getShortName: function() {
+ return '%s "%s"'.format(
+ this.getActiveModeI18n(),
+ this.getActiveSSID() || this.getActiveBSSID() || this.getID());
+ },
+
+ getI18n: function() {
+ return '%s: %s "%s" (%s)'.format(
+ _('Wireless Network'),
+ this.getActiveModeI18n(),
+ this.getActiveSSID() || this.getActiveBSSID() || this.getID(),
+ this.getIfname());
+ },
+
+ getNetwork: function() {
+ return this.getNetworks()[0];
+ },
+
+ getNetworks: function() {
+ var networkNames = this.getNetworkNames(),
+ networks = [];
+
+ for (var i = 0; i < networkNames.length; i++) {
+ var uciInterface = uci.get('network', networkNames[i]);
+
+ if (uciInterface == null || uciInterface['.type'] != 'interface')
+ continue;
+
+ networks.push(L.network.instantiateNetwork(networkNames[i]));
+ }
+
+ networks.sort(networkSort);
+
+ return networks;
+ },
+
+ getDevice: function() {
+ return L.network.instantiateDevice(this.getIfname());
+ }
+});
+
+return Network;
diff --git a/modules/luci-base/htdocs/luci-static/resources/promis.min.js b/modules/luci-base/htdocs/luci-static/resources/promis.min.js
new file mode 100644
index 0000000000..ff71b6999c
--- /dev/null
+++ b/modules/luci-base/htdocs/luci-static/resources/promis.min.js
@@ -0,0 +1,5 @@
+/* Licensed under the BSD license. Copyright 2014 - Bram Stein. All rights reserved.
+ * https://github.com/bramstein/promis */
+(function(){'use strict';var f,g=[];function l(a){g.push(a);1==g.length&&f()}function m(){for(;g.length;)g[0](),g.shift()}f=function(){setTimeout(m)};function n(a){this.a=p;this.b=void 0;this.f=[];var b=this;try{a(function(a){q(b,a)},function(a){r(b,a)})}catch(c){r(b,c)}}var p=2;function t(a){return new n(function(b,c){c(a)})}function u(a){return new n(function(b){b(a)})}function q(a,b){if(a.a==p){if(b==a)throw new TypeError;var c=!1;try{var d=b&&b.then;if(null!=b&&"object"==typeof b&&"function"==typeof d){d.call(b,function(b){c||q(a,b);c=!0},function(b){c||r(a,b);c=!0});return}}catch(e){c||r(a,e);return}a.a=0;a.b=b;v(a)}}
+function r(a,b){if(a.a==p){if(b==a)throw new TypeError;a.a=1;a.b=b;v(a)}}function v(a){l(function(){if(a.a!=p)for(;a.f.length;){var b=a.f.shift(),c=b[0],d=b[1],e=b[2],b=b[3];try{0==a.a?"function"==typeof c?e(c.call(void 0,a.b)):e(a.b):1==a.a&&("function"==typeof d?e(d.call(void 0,a.b)):b(a.b))}catch(h){b(h)}}})}n.prototype.g=function(a){return this.c(void 0,a)};n.prototype.c=function(a,b){var c=this;return new n(function(d,e){c.f.push([a,b,d,e]);v(c)})};
+function w(a){return new n(function(b,c){function d(c){return function(d){h[c]=d;e+=1;e==a.length&&b(h)}}var e=0,h=[];0==a.length&&b(h);for(var k=0;k<a.length;k+=1)u(a[k]).c(d(k),c)})}function x(a){return new n(function(b,c){for(var d=0;d<a.length;d+=1)u(a[d]).c(b,c)})};window.Promise||(window.Promise=n,window.Promise.resolve=u,window.Promise.reject=t,window.Promise.race=x,window.Promise.all=w,window.Promise.prototype.then=n.prototype.c,window.Promise.prototype["catch"]=n.prototype.g,window.Promise.prototype.finally=function(a){return this.c(a,a)});}());
diff --git a/modules/luci-base/htdocs/luci-static/resources/rpc.js b/modules/luci-base/htdocs/luci-static/resources/rpc.js
new file mode 100644
index 0000000000..e12c2f77ee
--- /dev/null
+++ b/modules/luci-base/htdocs/luci-static/resources/rpc.js
@@ -0,0 +1,160 @@
+'use strict';
+
+var rpcRequestID = 1,
+ rpcSessionID = L.env.sessionid || '00000000000000000000000000000000',
+ rpcBaseURL = L.url('admin/ubus');
+
+return L.Class.extend({
+ call: function(req, cb) {
+ var q = '';
+
+ if (Array.isArray(req)) {
+ if (req.length == 0)
+ return Promise.resolve([]);
+
+ for (var i = 0; i < req.length; i++)
+ q += '%s%s.%s'.format(
+ q ? ';' : '/',
+ req[i].params[1],
+ req[i].params[2]
+ );
+ }
+ else {
+ q += '/%s.%s'.format(req.params[1], req.params[2]);
+ }
+
+ return L.Request.post(rpcBaseURL + q, req, {
+ timeout: (L.env.rpctimeout || 5) * 1000,
+ credentials: true
+ }).then(cb);
+ },
+
+ handleListReply: function(req, msg) {
+ var list = msg.result;
+
+ /* verify message frame */
+ if (typeof(msg) != 'object' || msg.jsonrpc != '2.0' || !msg.id || !Array.isArray(list))
+ list = [ ];
+
+ req.resolve(list);
+ },
+
+ handleCallReply: function(req, res) {
+ var type = Object.prototype.toString,
+ msg = null;
+
+ if (!res.ok)
+ L.error('RPCError', 'RPC call failed with HTTP error %d: %s',
+ res.status, res.statusText || '?');
+
+ msg = res.json();
+
+ /* fetch response attribute and verify returned type */
+ var ret = undefined;
+
+ /* verify message frame */
+ if (typeof(msg) == 'object' && msg.jsonrpc == '2.0') {
+ if (typeof(msg.error) == 'object' && msg.error.code && msg.error.message)
+ req.reject(new Error('RPC call failed with error %d: %s'
+ .format(msg.error.code, msg.error.message || '?')));
+ else if (Array.isArray(msg.result) && msg.result[0] == 0)
+ ret = (msg.result.length > 1) ? msg.result[1] : msg.result[0];
+ }
+ else {
+ req.reject(new Error('Invalid message frame received'));
+ }
+
+ if (req.expect) {
+ for (var key in req.expect) {
+ if (ret != null && key != '')
+ ret = ret[key];
+
+ if (ret == null || type.call(ret) != type.call(req.expect[key]))
+ ret = req.expect[key];
+
+ break;
+ }
+ }
+
+ /* apply filter */
+ if (typeof(req.filter) == 'function') {
+ req.priv[0] = ret;
+ req.priv[1] = req.params;
+ ret = req.filter.apply(this, req.priv);
+ }
+
+ req.resolve(ret);
+ },
+
+ list: function() {
+ var msg = {
+ jsonrpc: '2.0',
+ id: rpcRequestID++,
+ method: 'list',
+ params: arguments.length ? this.varargs(arguments) : undefined
+ };
+
+ return this.call(msg, this.handleListReply);
+ },
+
+ declare: function(options) {
+ return Function.prototype.bind.call(function(rpc, options) {
+ var args = this.varargs(arguments, 2);
+ return new Promise(function(resolveFn, rejectFn) {
+ /* build parameter object */
+ var p_off = 0;
+ var params = { };
+ if (Array.isArray(options.params))
+ for (p_off = 0; p_off < options.params.length; p_off++)
+ params[options.params[p_off]] = args[p_off];
+
+ /* all remaining arguments are private args */
+ var priv = [ undefined, undefined ];
+ for (; p_off < args.length; p_off++)
+ priv.push(args[p_off]);
+
+ /* store request info */
+ var req = {
+ expect: options.expect,
+ filter: options.filter,
+ resolve: resolveFn,
+ reject: rejectFn,
+ params: params,
+ priv: priv
+ };
+
+ /* build message object */
+ var msg = {
+ jsonrpc: '2.0',
+ id: rpcRequestID++,
+ method: 'call',
+ params: [
+ rpcSessionID,
+ options.object,
+ options.method,
+ params
+ ]
+ };
+
+ /* call rpc */
+ rpc.call(msg, rpc.handleCallReply.bind(rpc, req));
+ });
+ }, this, this, options);
+ },
+
+ getSessionID: function() {
+ return rpcSessionID;
+ },
+
+ setSessionID: function(sid) {
+ rpcSessionID = sid;
+ },
+
+ getBaseURL: function() {
+ return rpcBaseURL;
+ },
+
+ setBaseURL: function(url) {
+ rpcBaseURL = url;
+ }
+});
diff --git a/modules/luci-base/htdocs/luci-static/resources/tools/prng.js b/modules/luci-base/htdocs/luci-static/resources/tools/prng.js
new file mode 100644
index 0000000000..752dc75ce8
--- /dev/null
+++ b/modules/luci-base/htdocs/luci-static/resources/tools/prng.js
@@ -0,0 +1,93 @@
+'use strict';
+
+var s = [0x0000, 0x0000, 0x0000, 0x0000];
+
+function mul(a, b) {
+ var r = [0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000];
+
+ for (var j = 0; j < 4; j++) {
+ var k = 0;
+ for (var i = 0; i < 4; i++) {
+ var t = a[i] * b[j] + r[i+j] + k;
+ r[i+j] = t & 0xffff;
+ k = t >>> 16;
+ }
+ r[j+4] = k;
+ }
+
+ r.length = 4;
+
+ return r;
+}
+
+function add(a, n) {
+ var r = [0x0000, 0x0000, 0x0000, 0x0000],
+ k = n;
+
+ for (var i = 0; i < 4; i++) {
+ var t = a[i] + k;
+ r[i] = t & 0xffff;
+ k = t >>> 16;
+ }
+
+ return r;
+}
+
+function shr(a, n) {
+ var r = [a[0], a[1], a[2], a[3], 0x0000],
+ i = 4,
+ k = 0;
+
+ for (; n > 16; n -= 16, i--)
+ for (var j = 0; j < 4; j++)
+ r[j] = r[j+1];
+
+ for (; i > 0; i--) {
+ var s = r[i-1];
+ r[i-1] = (s >>> n) | k;
+ k = ((s & ((1 << n) - 1)) << (16 - n));
+ }
+
+ r.length = 4;
+
+ return r;
+}
+
+return L.Class.extend({
+ seed: function(n) {
+ n = (n - 1)|0;
+ s[0] = n & 0xffff;
+ s[1] = n >>> 16;
+ s[2] = 0;
+ s[3] = 0;
+ },
+
+ int: function() {
+ s = mul(s, [0x7f2d, 0x4c95, 0xf42d, 0x5851]);
+ s = add(s, 1);
+
+ var r = shr(s, 33);
+ return (r[1] << 16) | r[0];
+ },
+
+ get: function() {
+ var r = (this.int() % 0x7fffffff) / 0x7fffffff, l, u;
+
+ switch (arguments.length) {
+ case 0:
+ return r;
+
+ case 1:
+ l = 1;
+ u = arguments[0]|0;
+ break;
+
+ case 2:
+ l = arguments[0]|0;
+ u = arguments[1]|0;
+ break;
+ }
+
+ return Math.floor(r * (u - l + 1)) + l;
+ }
+});
diff --git a/modules/luci-base/htdocs/luci-static/resources/tools/widgets.js b/modules/luci-base/htdocs/luci-static/resources/tools/widgets.js
new file mode 100644
index 0000000000..b1917eb356
--- /dev/null
+++ b/modules/luci-base/htdocs/luci-static/resources/tools/widgets.js
@@ -0,0 +1,315 @@
+'use strict';
+'require ui';
+'require form';
+'require network';
+'require firewall';
+
+function toArray(x) {
+ if (x == null)
+ return [];
+ else if (Array.isArray(x))
+ return x.map(String);
+ else if (typeof(x) == 'object')
+ return [ x ];
+
+ var s = String(x).trim();
+
+ if (s == '')
+ return [];
+
+ return s.split(/\s+/);
+}
+
+var CBIZoneSelect = form.ListValue.extend({
+ __name__: 'CBI.ZoneSelect',
+
+ load: function(section_id) {
+ return Promise.all([ firewall.getZones(), network.getNetworks() ]).then(L.bind(function(zn) {
+ this.zones = zn[0];
+ this.networks = zn[1];
+
+ return this.super('load', section_id);
+ }, this));
+ },
+
+ filter: function(section_id, value) {
+ return true;
+ },
+
+ lookupZone: function(name) {
+ return this.zones.filter(function(zone) { return zone.getName() == name })[0];
+ },
+
+ lookupNetwork: function(name) {
+ return this.networks.filter(function(network) { return network.getName() == name })[0];
+ },
+
+ renderWidget: function(section_id, option_index, cfgvalue) {
+ var values = toArray((cfgvalue != null) ? cfgvalue : this.default),
+ choices = {};
+
+ if (this.allowlocal) {
+ choices[''] = E('span', {
+ 'class': 'zonebadge',
+ 'style': 'background-color:' + firewall.getColorForName(null)
+ }, [
+ E('strong', _('Device')),
+ (this.allowany || this.allowlocal)
+ ? ' (%s)'.format(this.alias != 'dest' ? _('output') : _('input')) : ''
+ ]);
+ }
+ else if (!this.multiple && (this.rmempty || this.optional)) {
+ choices[''] = E('span', {
+ 'class': 'zonebadge',
+ 'style': 'background-color:' + firewall.getColorForName(null)
+ }, E('em', _('unspecified')));
+ }
+
+ if (this.allowany) {
+ choices['*'] = E('span', {
+ 'class': 'zonebadge',
+ 'style': 'background-color:' + firewall.getColorForName(null)
+ }, [
+ E('strong', _('Any zone')),
+ (this.allowany && this.allowlocal) ? ' (%s)'.format(_('forward')) : ''
+ ]);
+ }
+
+ for (var i = 0; i < this.zones.length; i++) {
+ var zone = this.zones[i],
+ name = zone.getName(),
+ networks = zone.getNetworks(),
+ ifaces = [];
+
+ if (!this.filter(section_id, name))
+ continue;
+
+ for (var j = 0; j < networks.length; j++) {
+ var network = this.lookupNetwork(networks[j]);
+
+ if (!network)
+ continue;
+
+ var span = E('span', {
+ 'class': 'ifacebadge' + (network.getName() == this.network ? ' ifacebadge-active' : '')
+ }, network.getName() + ': ');
+
+ var devices = network.isBridge() ? network.getDevices() : toArray(network.getDevice());
+
+ for (var k = 0; k < devices.length; k++) {
+ span.appendChild(E('img', {
+ 'title': devices[k].getI18n(),
+ 'src': L.resource('icons/%s%s.png'.format(devices[k].getType(), devices[k].isUp() ? '' : '_disabled'))
+ }));
+ }
+
+ if (!devices.length)
+ span.appendChild(E('em', _('(empty)')));
+
+ ifaces.push(span);
+ }
+
+ if (!ifaces.length)
+ ifaces.push(E('em', _('(empty)')));
+
+ choices[name] = E('span', {
+ 'class': 'zonebadge',
+ 'style': 'background-color:' + zone.getColor()
+ }, [ E('strong', name) ].concat(ifaces));
+ }
+
+ var widget = new ui.Dropdown(values, choices, {
+ id: this.cbid(section_id),
+ sort: true,
+ multiple: this.multiple,
+ optional: this.optional || this.rmempty,
+ select_placeholder: E('em', _('unspecified')),
+ display_items: this.display_size || this.size || 3,
+ dropdown_items: this.dropdown_size || this.size || 5,
+ validate: L.bind(this.validate, this, section_id),
+ create: !this.nocreate,
+ create_markup: '' +
+ '<li data-value="{{value}}">' +
+ '<span class="zonebadge" style="background:repeating-linear-gradient(45deg,rgba(204,204,204,0.5),rgba(204,204,204,0.5) 5px,rgba(255,255,255,0.5) 5px,rgba(255,255,255,0.5) 10px)">' +
+ '<strong>{{value}}:</strong> <em>('+_('create')+')</em>' +
+ '</span>' +
+ '</li>'
+ });
+
+ return widget.render();
+ },
+});
+
+var CBIZoneForwards = form.DummyValue.extend({
+ __name__: 'CBI.ZoneForwards',
+
+ load: function(section_id) {
+ return Promise.all([ firewall.getDefaults(), firewall.getZones(), network.getNetworks() ]).then(L.bind(function(dzn) {
+ this.defaults = dzn[0];
+ this.zones = dzn[1];
+ this.networks = dzn[2];
+
+ return this.super('load', section_id);
+ }, this));
+ },
+
+ renderZone: function(zone) {
+ var name = zone.getName(),
+ networks = zone.getNetworks(),
+ ifaces = [];
+
+ for (var j = 0; j < networks.length; j++) {
+ var network = this.networks.filter(function(net) { return net.getName() == networks[j] })[0];
+
+ if (!network)
+ continue;
+
+ var span = E('span', {
+ 'class': 'ifacebadge' + (network.getName() == this.network ? ' ifacebadge-active' : '')
+ }, network.getName() + ': ');
+
+ var devices = network.isBridge() ? network.getDevices() : toArray(network.getDevice());
+
+ for (var k = 0; k < devices.length && devices[k]; k++) {
+ span.appendChild(E('img', {
+ 'title': devices[k].getI18n(),
+ 'src': L.resource('icons/%s%s.png'.format(devices[k].getType(), devices[k].isUp() ? '' : '_disabled'))
+ }));
+ }
+
+ if (!devices.length)
+ span.appendChild(E('em', _('(empty)')));
+
+ ifaces.push(span);
+ }
+
+ if (!ifaces.length)
+ ifaces.push(E('span', { 'class': 'ifacebadge' }, E('em', _('(empty)'))));
+
+ return E('label', {
+ 'class': 'zonebadge cbi-tooltip-container',
+ 'style': 'background-color:' + zone.getColor()
+ }, [
+ E('strong', name),
+ E('div', { 'class': 'cbi-tooltip' }, ifaces)
+ ]);
+ },
+
+ renderWidget: function(section_id, option_index, cfgvalue) {
+ var value = (cfgvalue != null) ? cfgvalue : this.default,
+ zone = this.zones.filter(function(z) { return z.getName() == value })[0];
+
+ if (!zone)
+ return E([]);
+
+ var forwards = zone.getForwardingsBy('src'),
+ dzones = [];
+
+ for (var i = 0; i < forwards.length; i++) {
+ var dzone = forwards[i].getDestinationZone();
+
+ if (!dzone)
+ continue;
+
+ dzones.push(this.renderZone(dzone));
+ }
+
+ if (!dzones.length)
+ dzones.push(E('label', { 'class': 'zonebadge zonebadge-empty' },
+ E('strong', this.defaults.getForward())));
+
+ return E('div', { 'class': 'zone-forwards' }, [
+ E('div', { 'class': 'zone-src' }, this.renderZone(zone)),
+ E('span', '⇒'),
+ E('div', { 'class': 'zone-dest' }, dzones)
+ ]);
+ },
+});
+
+var CBINetworkSelect = form.ListValue.extend({
+ __name__: 'CBI.NetworkSelect',
+
+ load: function(section_id) {
+ return network.getNetworks().then(L.bind(function(networks) {
+ this.networks = networks;
+
+ return this.super('load', section_id);
+ }, this));
+ },
+
+ filter: function(section_id, value) {
+ return true;
+ },
+
+ renderWidget: function(section_id, option_index, cfgvalue) {
+ var values = toArray((cfgvalue != null) ? cfgvalue : this.default),
+ choices = {},
+ checked = {};
+
+ for (var i = 0; i < values.length; i++)
+ checked[values[i]] = true;
+
+ values = [];
+
+ if (!this.multiple && (this.rmempty || this.optional))
+ choices[''] = E('em', _('unspecified'));
+
+ for (var i = 0; i < this.networks.length; i++) {
+ var network = this.networks[i],
+ name = network.getName();
+
+ if (name == 'loopback' || !this.filter(section_id, name))
+ continue;
+
+ if (this.novirtual && network.isVirtual())
+ continue;
+
+ var span = E('span', { 'class': 'ifacebadge' }, network.getName() + ': '),
+ devices = network.isBridge() ? network.getDevices() : toArray(network.getDevice());
+
+ for (var j = 0; j < devices.length && devices[j]; j++) {
+ span.appendChild(E('img', {
+ 'title': devices[j].getI18n(),
+ 'src': L.resource('icons/%s%s.png'.format(devices[j].getType(), devices[j].isUp() ? '' : '_disabled'))
+ }));
+ }
+
+ if (!devices.length) {
+ span.appendChild(E('em', { 'class': 'hide-close' }, _('(no interfaces attached)')));
+ span.appendChild(E('em', { 'class': 'hide-open' }, '-'));
+ }
+
+ if (checked[name])
+ values.push(name);
+
+ choices[name] = span;
+ }
+
+ var widget = new ui.Dropdown(this.multiple ? values : values[0], choices, {
+ id: this.cbid(section_id),
+ sort: true,
+ multiple: this.multiple,
+ optional: this.optional || this.rmempty,
+ select_placeholder: E('em', _('unspecified')),
+ display_items: this.display_size || this.size || 3,
+ dropdown_items: this.dropdown_size || this.size || 5,
+ validate: L.bind(this.validate, this, section_id),
+ create: !this.nocreate,
+ create_markup: '' +
+ '<li data-value="{{value}}">' +
+ '<span class="ifacebadge" style="background:repeating-linear-gradient(45deg,rgba(204,204,204,0.5),rgba(204,204,204,0.5) 5px,rgba(255,255,255,0.5) 5px,rgba(255,255,255,0.5) 10px)">' +
+ '{{value}}: <em>('+_('create')+')</em>' +
+ '</span>' +
+ '</li>'
+ });
+
+ return widget.render();
+ },
+});
+
+
+return L.Class.extend({
+ ZoneSelect: CBIZoneSelect,
+ ZoneForwards: CBIZoneForwards,
+ NetworkSelect: CBINetworkSelect
+});
diff --git a/modules/luci-base/htdocs/luci-static/resources/uci.js b/modules/luci-base/htdocs/luci-static/resources/uci.js
new file mode 100644
index 0000000000..17f11eecb8
--- /dev/null
+++ b/modules/luci-base/htdocs/luci-static/resources/uci.js
@@ -0,0 +1,540 @@
+'use strict';
+'require rpc';
+
+return L.Class.extend({
+ __init__: function() {
+ this.state = {
+ newidx: 0,
+ values: { },
+ creates: { },
+ changes: { },
+ deletes: { },
+ reorder: { }
+ };
+
+ this.loaded = {};
+ },
+
+ callLoad: rpc.declare({
+ object: 'uci',
+ method: 'get',
+ params: [ 'config' ],
+ expect: { values: { } }
+ }),
+
+ callOrder: rpc.declare({
+ object: 'uci',
+ method: 'order',
+ params: [ 'config', 'sections' ]
+ }),
+
+ callAdd: rpc.declare({
+ object: 'uci',
+ method: 'add',
+ params: [ 'config', 'type', 'name', 'values' ],
+ expect: { section: '' }
+ }),
+
+ callSet: rpc.declare({
+ object: 'uci',
+ method: 'set',
+ params: [ 'config', 'section', 'values' ]
+ }),
+
+ callDelete: rpc.declare({
+ object: 'uci',
+ method: 'delete',
+ params: [ 'config', 'section', 'options' ]
+ }),
+
+ callApply: rpc.declare({
+ object: 'uci',
+ method: 'apply',
+ params: [ 'timeout', 'rollback' ]
+ }),
+
+ callConfirm: rpc.declare({
+ object: 'uci',
+ method: 'confirm'
+ }),
+
+ createSID: function(conf) {
+ var v = this.state.values,
+ n = this.state.creates,
+ sid;
+
+ do {
+ sid = "new%06x".format(Math.random() * 0xFFFFFF);
+ } while ((n[conf] && n[conf][sid]) || (v[conf] && v[conf][sid]));
+
+ return sid;
+ },
+
+ resolveSID: function(conf, sid) {
+ if (typeof(sid) != 'string')
+ return sid;
+
+ var m = /^@([a-zA-Z0-9_-]+)\[(-?[0-9]+)\]$/.exec(sid);
+
+ if (m) {
+ var type = m[1],
+ pos = +m[2],
+ sections = this.sections(conf, type),
+ section = sections[pos >= 0 ? pos : sections.length + pos];
+
+ return section ? section['.name'] : null;
+ }
+
+ return sid;
+ },
+
+ reorderSections: function() {
+ var v = this.state.values,
+ n = this.state.creates,
+ r = this.state.reorder,
+ tasks = [];
+
+ if (Object.keys(r).length === 0)
+ return Promise.resolve();
+
+ /*
+ gather all created and existing sections, sort them according
+ to their index value and issue an uci order call
+ */
+ for (var c in r) {
+ var o = [ ];
+
+ if (n[c])
+ for (var s in n[c])
+ o.push(n[c][s]);
+
+ for (var s in v[c])
+ o.push(v[c][s]);
+
+ if (o.length > 0) {
+ o.sort(function(a, b) {
+ return (a['.index'] - b['.index']);
+ });
+
+ var sids = [ ];
+
+ for (var i = 0; i < o.length; i++)
+ sids.push(o[i]['.name']);
+
+ tasks.push(this.callOrder(c, sids));
+ }
+ }
+
+ this.state.reorder = { };
+ return Promise.all(tasks);
+ },
+
+ loadPackage: function(packageName) {
+ if (this.loaded[packageName] == null)
+ return (this.loaded[packageName] = this.callLoad(packageName));
+
+ return Promise.resolve(this.loaded[packageName]);
+ },
+
+ load: function(packages) {
+ var self = this,
+ pkgs = [ ],
+ tasks = [];
+
+ if (!Array.isArray(packages))
+ packages = [ packages ];
+
+ for (var i = 0; i < packages.length; i++)
+ if (!self.state.values[packages[i]]) {
+ pkgs.push(packages[i]);
+ tasks.push(self.loadPackage(packages[i]));
+ }
+
+ return Promise.all(tasks).then(function(responses) {
+ for (var i = 0; i < responses.length; i++)
+ self.state.values[pkgs[i]] = responses[i];
+
+ if (responses.length)
+ document.dispatchEvent(new CustomEvent('uci-loaded'));
+
+ return pkgs;
+ });
+ },
+
+ unload: function(packages) {
+ if (!Array.isArray(packages))
+ packages = [ packages ];
+
+ for (var i = 0; i < packages.length; i++) {
+ delete this.state.values[packages[i]];
+ delete this.state.creates[packages[i]];
+ delete this.state.changes[packages[i]];
+ delete this.state.deletes[packages[i]];
+
+ delete this.loaded[packages[i]];
+ }
+ },
+
+ add: function(conf, type, name) {
+ var n = this.state.creates,
+ sid = name || this.createSID(conf);
+
+ if (!n[conf])
+ n[conf] = { };
+
+ n[conf][sid] = {
+ '.type': type,
+ '.name': sid,
+ '.create': name,
+ '.anonymous': !name,
+ '.index': 1000 + this.state.newidx++
+ };
+
+ return sid;
+ },
+
+ remove: function(conf, sid) {
+ var n = this.state.creates,
+ c = this.state.changes,
+ d = this.state.deletes;
+
+ /* requested deletion of a just created section */
+ if (n[conf] && n[conf][sid]) {
+ delete n[conf][sid];
+ }
+ else {
+ if (c[conf])
+ delete c[conf][sid];
+
+ if (!d[conf])
+ d[conf] = { };
+
+ d[conf][sid] = true;
+ }
+ },
+
+ sections: function(conf, type, cb) {
+ var sa = [ ],
+ v = this.state.values[conf],
+ n = this.state.creates[conf],
+ c = this.state.changes[conf],
+ d = this.state.deletes[conf];
+
+ if (!v)
+ return sa;
+
+ for (var s in v)
+ if (!d || d[s] !== true)
+ if (!type || v[s]['.type'] == type)
+ sa.push(Object.assign({ }, v[s], c ? c[s] : undefined));
+
+ if (n)
+ for (var s in n)
+ if (!type || n[s]['.type'] == type)
+ sa.push(Object.assign({ }, n[s]));
+
+ sa.sort(function(a, b) {
+ return a['.index'] - b['.index'];
+ });
+
+ for (var i = 0; i < sa.length; i++)
+ sa[i]['.index'] = i;
+
+ if (typeof(cb) == 'function')
+ for (var i = 0; i < sa.length; i++)
+ cb.call(this, sa[i], sa[i]['.name']);
+
+ return sa;
+ },
+
+ get: function(conf, sid, opt) {
+ var v = this.state.values,
+ n = this.state.creates,
+ c = this.state.changes,
+ d = this.state.deletes;
+
+ sid = this.resolveSID(conf, sid);
+
+ if (sid == null)
+ return null;
+
+ /* requested option in a just created section */
+ if (n[conf] && n[conf][sid]) {
+ if (!n[conf])
+ return undefined;
+
+ if (opt == null)
+ return n[conf][sid];
+
+ return n[conf][sid][opt];
+ }
+
+ /* requested an option value */
+ if (opt != null) {
+ /* check whether option was deleted */
+ if (d[conf] && d[conf][sid]) {
+ if (d[conf][sid] === true)
+ return undefined;
+
+ for (var i = 0; i < d[conf][sid].length; i++)
+ if (d[conf][sid][i] == opt)
+ return undefined;
+ }
+
+ /* check whether option was changed */
+ if (c[conf] && c[conf][sid] && c[conf][sid][opt] != null)
+ return c[conf][sid][opt];
+
+ /* return base value */
+ if (v[conf] && v[conf][sid])
+ return v[conf][sid][opt];
+
+ return undefined;
+ }
+
+ /* requested an entire section */
+ if (v[conf])
+ return v[conf][sid];
+
+ return undefined;
+ },
+
+ set: function(conf, sid, opt, val) {
+ var v = this.state.values,
+ n = this.state.creates,
+ c = this.state.changes,
+ d = this.state.deletes;
+
+ sid = this.resolveSID(conf, sid);
+
+ if (sid == null || opt == null || opt.charAt(0) == '.')
+ return;
+
+ if (n[conf] && n[conf][sid]) {
+ if (val != null)
+ n[conf][sid][opt] = val;
+ else
+ delete n[conf][sid][opt];
+ }
+ else if (val != null && val !== '') {
+ /* do not set within deleted section */
+ if (d[conf] && d[conf][sid] === true)
+ return;
+
+ /* only set in existing sections */
+ if (!v[conf] || !v[conf][sid])
+ return;
+
+ if (!c[conf])
+ c[conf] = {};
+
+ if (!c[conf][sid])
+ c[conf][sid] = {};
+
+ /* undelete option */
+ if (d[conf] && d[conf][sid])
+ d[conf][sid] = d[conf][sid].filter(function(o) { return o !== opt });
+
+ c[conf][sid][opt] = val;
+ }
+ else {
+ /* only delete in existing sections */
+ if (!(v[conf] && v[conf][sid] && v[conf][sid].hasOwnProperty(opt)) &&
+ !(c[conf] && c[conf][sid] && c[conf][sid].hasOwnProperty(opt)))
+ return;
+
+ if (!d[conf])
+ d[conf] = { };
+
+ if (!d[conf][sid])
+ d[conf][sid] = [ ];
+
+ if (d[conf][sid] !== true)
+ d[conf][sid].push(opt);
+ }
+ },
+
+ unset: function(conf, sid, opt) {
+ return this.set(conf, sid, opt, null);
+ },
+
+ get_first: function(conf, type, opt) {
+ var sid = null;
+
+ this.sections(conf, type, function(s) {
+ if (sid == null)
+ sid = s['.name'];
+ });
+
+ return this.get(conf, sid, opt);
+ },
+
+ set_first: function(conf, type, opt, val) {
+ var sid = null;
+
+ this.sections(conf, type, function(s) {
+ if (sid == null)
+ sid = s['.name'];
+ });
+
+ return this.set(conf, sid, opt, val);
+ },
+
+ unset_first: function(conf, type, opt) {
+ return this.set_first(conf, type, opt, null);
+ },
+
+ move: function(conf, sid1, sid2, after) {
+ var sa = this.sections(conf),
+ s1 = null, s2 = null;
+
+ sid1 = this.resolveSID(conf, sid1);
+ sid2 = this.resolveSID(conf, sid2);
+
+ for (var i = 0; i < sa.length; i++) {
+ if (sa[i]['.name'] != sid1)
+ continue;
+
+ s1 = sa[i];
+ sa.splice(i, 1);
+ break;
+ }
+
+ if (s1 == null)
+ return false;
+
+ if (sid2 == null) {
+ sa.push(s1);
+ }
+ else {
+ for (var i = 0; i < sa.length; i++) {
+ if (sa[i]['.name'] != sid2)
+ continue;
+
+ s2 = sa[i];
+ sa.splice(i + !!after, 0, s1);
+ break;
+ }
+
+ if (s2 == null)
+ return false;
+ }
+
+ for (var i = 0; i < sa.length; i++)
+ this.get(conf, sa[i]['.name'])['.index'] = i;
+
+ this.state.reorder[conf] = true;
+
+ return true;
+ },
+
+ save: function() {
+ var v = this.state.values,
+ n = this.state.creates,
+ c = this.state.changes,
+ d = this.state.deletes,
+ r = this.state.reorder,
+ self = this,
+ snew = [ ],
+ pkgs = { },
+ tasks = [];
+
+ if (n)
+ for (var conf in n) {
+ for (var sid in n[conf]) {
+ var r = {
+ config: conf,
+ values: { }
+ };
+
+ for (var k in n[conf][sid]) {
+ if (k == '.type')
+ r.type = n[conf][sid][k];
+ else if (k == '.create')
+ r.name = n[conf][sid][k];
+ else if (k.charAt(0) != '.')
+ r.values[k] = n[conf][sid][k];
+ }
+
+ snew.push(n[conf][sid]);
+ tasks.push(self.callAdd(r.config, r.type, r.name, r.values));
+ }
+
+ pkgs[conf] = true;
+ }
+
+ if (c)
+ for (var conf in c) {
+ for (var sid in c[conf])
+ tasks.push(self.callSet(conf, sid, c[conf][sid]));
+
+ pkgs[conf] = true;
+ }
+
+ if (d)
+ for (var conf in d) {
+ for (var sid in d[conf]) {
+ var o = d[conf][sid];
+ tasks.push(self.callDelete(conf, sid, (o === true) ? null : o));
+ }
+
+ pkgs[conf] = true;
+ }
+
+ if (r)
+ for (var conf in r)
+ pkgs[conf] = true;
+
+ return Promise.all(tasks).then(function(responses) {
+ /*
+ array "snew" holds references to the created uci sections,
+ use it to assign the returned names of the new sections
+ */
+ for (var i = 0; i < snew.length; i++)
+ snew[i]['.name'] = responses[i];
+
+ return self.reorderSections();
+ }).then(function() {
+ pkgs = Object.keys(pkgs);
+
+ self.unload(pkgs);
+
+ return self.load(pkgs);
+ });
+ },
+
+ apply: function(timeout) {
+ var self = this,
+ date = new Date();
+
+ if (typeof(timeout) != 'number' || timeout < 1)
+ timeout = 10;
+
+ return self.callApply(timeout, true).then(function(rv) {
+ if (rv != 0)
+ return Promise.reject(rv);
+
+ var try_deadline = date.getTime() + 1000 * timeout;
+ var try_confirm = function() {
+ return self.callConfirm().then(function(rv) {
+ if (rv != 0) {
+ if (date.getTime() < try_deadline)
+ window.setTimeout(try_confirm, 250);
+ else
+ return Promise.reject(rv);
+ }
+
+ return rv;
+ });
+ };
+
+ window.setTimeout(try_confirm, 1000);
+ });
+ },
+
+ changes: rpc.declare({
+ object: 'uci',
+ method: 'changes',
+ expect: { changes: { } }
+ })
+});
diff --git a/modules/luci-base/htdocs/luci-static/resources/ui.js b/modules/luci-base/htdocs/luci-static/resources/ui.js
new file mode 100644
index 0000000000..28d1fa90ae
--- /dev/null
+++ b/modules/luci-base/htdocs/luci-static/resources/ui.js
@@ -0,0 +1,2054 @@
+'use strict';
+'require uci';
+'require validation';
+
+var modalDiv = null,
+ tooltipDiv = null,
+ tooltipTimeout = null;
+
+var UIElement = L.Class.extend({
+ getValue: function() {
+ if (L.dom.matches(this.node, 'select') || L.dom.matches(this.node, 'input'))
+ return this.node.value;
+
+ return null;
+ },
+
+ setValue: function(value) {
+ if (L.dom.matches(this.node, 'select') || L.dom.matches(this.node, 'input'))
+ this.node.value = value;
+ },
+
+ isValid: function() {
+ return (this.validState !== false);
+ },
+
+ triggerValidation: function() {
+ if (typeof(this.vfunc) != 'function')
+ return false;
+
+ var wasValid = this.isValid();
+
+ this.vfunc();
+
+ return (wasValid != this.isValid());
+ },
+
+ registerEvents: function(targetNode, synevent, events) {
+ var dispatchFn = L.bind(function(ev) {
+ this.node.dispatchEvent(new CustomEvent(synevent, { bubbles: true }));
+ }, this);
+
+ for (var i = 0; i < events.length; i++)
+ targetNode.addEventListener(events[i], dispatchFn);
+ },
+
+ setUpdateEvents: function(targetNode /*, ... */) {
+ var datatype = this.options.datatype,
+ optional = this.options.hasOwnProperty('optional') ? this.options.optional : true,
+ validate = this.options.validate,
+ events = this.varargs(arguments, 1);
+
+ this.registerEvents(targetNode, 'widget-update', events);
+
+ if (!datatype && !validate)
+ return;
+
+ this.vfunc = L.ui.addValidator.apply(L.ui, [
+ targetNode, datatype || 'string',
+ optional, validate
+ ].concat(events));
+
+ this.node.addEventListener('validation-success', L.bind(function(ev) {
+ this.validState = true;
+ }, this));
+
+ this.node.addEventListener('validation-failure', L.bind(function(ev) {
+ this.validState = false;
+ }, this));
+ },
+
+ setChangeEvents: function(targetNode /*, ... */) {
+ this.registerEvents(targetNode, 'widget-change', this.varargs(arguments, 1));
+ }
+});
+
+var UITextfield = UIElement.extend({
+ __init__: function(value, options) {
+ this.value = value;
+ this.options = Object.assign({
+ optional: true,
+ password: false
+ }, options);
+ },
+
+ render: function() {
+ var frameEl = E('div', { 'id': this.options.id });
+
+ if (this.options.password) {
+ frameEl.classList.add('nowrap');
+ frameEl.appendChild(E('input', {
+ 'type': 'password',
+ 'style': 'position:absolute; left:-100000px',
+ 'aria-hidden': true,
+ 'tabindex': -1,
+ 'name': this.options.name ? 'password.%s'.format(this.options.name) : null
+ }));
+ }
+
+ frameEl.appendChild(E('input', {
+ 'name': this.options.name,
+ 'type': this.options.password ? 'password' : 'text',
+ 'class': this.options.password ? 'cbi-input-password' : 'cbi-input-text',
+ 'readonly': this.options.readonly ? '' : null,
+ 'maxlength': this.options.maxlength,
+ 'placeholder': this.options.placeholder,
+ 'value': this.value,
+ }));
+
+ if (this.options.password)
+ frameEl.appendChild(E('button', {
+ 'class': 'cbi-button cbi-button-neutral',
+ 'title': _('Reveal/hide password'),
+ 'aria-label': _('Reveal/hide password'),
+ 'click': function(ev) {
+ var e = this.previousElementSibling;
+ e.type = (e.type === 'password') ? 'text' : 'password';
+ ev.preventDefault();
+ }
+ }, '∗'));
+
+ return this.bind(frameEl);
+ },
+
+ bind: function(frameEl) {
+ var inputEl = frameEl.childNodes[+!!this.options.password];
+
+ this.node = frameEl;
+
+ this.setUpdateEvents(inputEl, 'keyup', 'blur');
+ this.setChangeEvents(inputEl, 'change');
+
+ L.dom.bindClassInstance(frameEl, this);
+
+ return frameEl;
+ },
+
+ getValue: function() {
+ var inputEl = this.node.childNodes[+!!this.options.password];
+ return inputEl.value;
+ },
+
+ setValue: function(value) {
+ var inputEl = this.node.childNodes[+!!this.options.password];
+ inputEl.value = value;
+ }
+});
+
+var UICheckbox = UIElement.extend({
+ __init__: function(value, options) {
+ this.value = value;
+ this.options = Object.assign({
+ value_enabled: '1',
+ value_disabled: '0'
+ }, options);
+ },
+
+ render: function() {
+ var frameEl = E('div', {
+ 'id': this.options.id,
+ 'class': 'cbi-checkbox'
+ });
+
+ if (this.options.hiddenname)
+ frameEl.appendChild(E('input', {
+ 'type': 'hidden',
+ 'name': this.options.hiddenname,
+ 'value': 1
+ }));
+
+ frameEl.appendChild(E('input', {
+ 'name': this.options.name,
+ 'type': 'checkbox',
+ 'value': this.options.value_enabled,
+ 'checked': (this.value == this.options.value_enabled) ? '' : null
+ }));
+
+ return this.bind(frameEl);
+ },
+
+ bind: function(frameEl) {
+ this.node = frameEl;
+
+ this.setUpdateEvents(frameEl.lastElementChild, 'click', 'blur');
+ this.setChangeEvents(frameEl.lastElementChild, 'change');
+
+ L.dom.bindClassInstance(frameEl, this);
+
+ return frameEl;
+ },
+
+ isChecked: function() {
+ return this.node.lastElementChild.checked;
+ },
+
+ getValue: function() {
+ return this.isChecked()
+ ? this.options.value_enabled
+ : this.options.value_disabled;
+ },
+
+ setValue: function(value) {
+ this.node.lastElementChild.checked = (value == this.options.value_enabled);
+ }
+});
+
+var UISelect = UIElement.extend({
+ __init__: function(value, choices, options) {
+ if (typeof(choices) != 'object')
+ choices = {};
+
+ if (!Array.isArray(value))
+ value = (value != null && value != '') ? [ value ] : [];
+
+ if (!options.multi && value.length > 1)
+ value.length = 1;
+
+ this.values = value;
+ this.choices = choices;
+ this.options = Object.assign({
+ multi: false,
+ widget: 'select',
+ orientation: 'horizontal'
+ }, options);
+ },
+
+ render: function() {
+ var frameEl,
+ keys = Object.keys(this.choices);
+
+ if (this.options.sort === true)
+ keys.sort();
+ else if (Array.isArray(this.options.sort))
+ keys = this.options.sort;
+
+ if (this.options.widget == 'select') {
+ frameEl = E('select', {
+ 'id': this.options.id,
+ 'name': this.options.name,
+ 'size': this.options.size,
+ 'class': 'cbi-input-select',
+ 'multiple': this.options.multi ? '' : null
+ });
+
+ if (this.options.optional)
+ frameEl.appendChild(E('option', {
+ 'value': '',
+ 'selected': (this.values.length == 0 || this.values[0] == '') ? '' : null
+ }, this.choices[''] || this.options.placeholder || _('-- Please choose --')));
+
+ for (var i = 0; i < keys.length; i++) {
+ if (keys[i] == null || keys[i] == '')
+ continue;
+
+ frameEl.appendChild(E('option', {
+ 'value': keys[i],
+ 'selected': (this.values.indexOf(keys[i]) > -1) ? '' : null
+ }, this.choices[keys[i]] || keys[i]));
+ }
+ }
+ else {
+ frameEl = E('div', {
+ 'id': this.options.id
+ });
+
+ var brEl = (this.options.orientation === 'horizontal') ? document.createTextNode(' ') : E('br');
+
+ for (var i = 0; i < keys.length; i++) {
+ frameEl.appendChild(E('label', {}, [
+ E('input', {
+ 'name': this.options.id || this.options.name,
+ 'type': this.options.multi ? 'checkbox' : 'radio',
+ 'class': this.options.multi ? 'cbi-input-checkbox' : 'cbi-input-radio',
+ 'value': keys[i],
+ 'checked': (this.values.indexOf(keys[i]) > -1) ? '' : null
+ }),
+ this.choices[keys[i]] || keys[i]
+ ]));
+
+ if (i + 1 == this.options.size)
+ frameEl.appendChild(brEl);
+ }
+ }
+
+ return this.bind(frameEl);
+ },
+
+ bind: function(frameEl) {
+ this.node = frameEl;
+
+ if (this.options.widget == 'select') {
+ this.setUpdateEvents(frameEl, 'change', 'click', 'blur');
+ this.setChangeEvents(frameEl, 'change');
+ }
+ else {
+ var radioEls = frameEl.querySelectorAll('input[type="radio"]');
+ for (var i = 0; i < radioEls.length; i++) {
+ this.setUpdateEvents(radioEls[i], 'change', 'click', 'blur');
+ this.setChangeEvents(radioEls[i], 'change', 'click', 'blur');
+ }
+ }
+
+ L.dom.bindClassInstance(frameEl, this);
+
+ return frameEl;
+ },
+
+ getValue: function() {
+ if (this.options.widget == 'select')
+ return this.node.value;
+
+ var radioEls = frameEl.querySelectorAll('input[type="radio"]');
+ for (var i = 0; i < radioEls.length; i++)
+ if (radioEls[i].checked)
+ return radioEls[i].value;
+
+ return null;
+ },
+
+ setValue: function(value) {
+ if (this.options.widget == 'select') {
+ if (value == null)
+ value = '';
+
+ for (var i = 0; i < this.node.options.length; i++)
+ this.node.options[i].selected = (this.node.options[i].value == value);
+
+ return;
+ }
+
+ var radioEls = frameEl.querySelectorAll('input[type="radio"]');
+ for (var i = 0; i < radioEls.length; i++)
+ radioEls[i].checked = (radioEls[i].value == value);
+ }
+});
+
+var UIDropdown = UIElement.extend({
+ __init__: function(value, choices, options) {
+ if (typeof(choices) != 'object')
+ choices = {};
+
+ if (!Array.isArray(value))
+ this.values = (value != null && value != '') ? [ value ] : [];
+ else
+ this.values = value;
+
+ this.choices = choices;
+ this.options = Object.assign({
+ sort: true,
+ multi: Array.isArray(value),
+ optional: true,
+ select_placeholder: _('-- Please choose --'),
+ custom_placeholder: _('-- custom --'),
+ display_items: 3,
+ dropdown_items: -1,
+ create: false,
+ create_query: '.create-item-input',
+ create_template: 'script[type="item-template"]'
+ }, options);
+ },
+
+ render: function() {
+ var sb = E('div', {
+ 'id': this.options.id,
+ 'class': 'cbi-dropdown',
+ 'multiple': this.options.multi ? '' : null,
+ 'optional': this.options.optional ? '' : null,
+ }, E('ul'));
+
+ var keys = Object.keys(this.choices);
+
+ if (this.options.sort === true)
+ keys.sort();
+ else if (Array.isArray(this.options.sort))
+ keys = this.options.sort;
+
+ if (this.options.create)
+ for (var i = 0; i < this.values.length; i++)
+ if (!this.choices.hasOwnProperty(this.values[i]))
+ keys.push(this.values[i]);
+
+ for (var i = 0; i < keys.length; i++)
+ sb.lastElementChild.appendChild(E('li', {
+ 'data-value': keys[i],
+ 'selected': (this.values.indexOf(keys[i]) > -1) ? '' : null
+ }, this.choices[keys[i]] || keys[i]));
+
+ if (this.options.create) {
+ var createEl = E('input', {
+ 'type': 'text',
+ 'class': 'create-item-input',
+ 'readonly': this.options.readonly ? '' : null,
+ 'maxlength': this.options.maxlength,
+ 'placeholder': this.options.custom_placeholder || this.options.placeholder
+ });
+
+ if (this.options.datatype)
+ L.ui.addValidator(createEl, this.options.datatype,
+ true, null, 'blur', 'keyup');
+
+ sb.lastElementChild.appendChild(E('li', { 'data-value': '-' }, createEl));
+ }
+
+ if (this.options.create_markup)
+ sb.appendChild(E('script', { type: 'item-template' },
+ this.options.create_markup));
+
+ return this.bind(sb);
+ },
+
+ bind: function(sb) {
+ var o = this.options;
+
+ o.multi = sb.hasAttribute('multiple');
+ o.optional = sb.hasAttribute('optional');
+ o.placeholder = sb.getAttribute('placeholder') || o.placeholder;
+ o.display_items = parseInt(sb.getAttribute('display-items') || o.display_items);
+ o.dropdown_items = parseInt(sb.getAttribute('dropdown-items') || o.dropdown_items);
+ o.create_query = sb.getAttribute('item-create') || o.create_query;
+ o.create_template = sb.getAttribute('item-template') || o.create_template;
+
+ var ul = sb.querySelector('ul'),
+ more = sb.appendChild(E('span', { class: 'more', tabindex: -1 }, '···')),
+ open = sb.appendChild(E('span', { class: 'open', tabindex: -1 }, 'â–¾')),
+ canary = sb.appendChild(E('div')),
+ create = sb.querySelector(this.options.create_query),
+ ndisplay = this.options.display_items,
+ n = 0;
+
+ if (this.options.multi) {
+ var items = ul.querySelectorAll('li');
+
+ for (var i = 0; i < items.length; i++) {
+ this.transformItem(sb, items[i]);
+
+ if (items[i].hasAttribute('selected') && ndisplay-- > 0)
+ items[i].setAttribute('display', n++);
+ }
+ }
+ else {
+ if (this.options.optional && !ul.querySelector('li[data-value=""]')) {
+ var placeholder = E('li', { placeholder: '' },
+ this.options.select_placeholder || this.options.placeholder);
+
+ ul.firstChild
+ ? ul.insertBefore(placeholder, ul.firstChild)
+ : ul.appendChild(placeholder);
+ }
+
+ var items = ul.querySelectorAll('li'),
+ sel = sb.querySelectorAll('[selected]');
+
+ sel.forEach(function(s) {
+ s.removeAttribute('selected');
+ });
+
+ var s = sel[0] || items[0];
+ if (s) {
+ s.setAttribute('selected', '');
+ s.setAttribute('display', n++);
+ }
+
+ ndisplay--;
+ }
+
+ this.saveValues(sb, ul);
+
+ ul.setAttribute('tabindex', -1);
+ sb.setAttribute('tabindex', 0);
+
+ if (ndisplay < 0)
+ sb.setAttribute('more', '')
+ else
+ sb.removeAttribute('more');
+
+ if (ndisplay == this.options.display_items)
+ sb.setAttribute('empty', '')
+ else
+ sb.removeAttribute('empty');
+
+ L.dom.content(more, (ndisplay == this.options.display_items)
+ ? (this.options.select_placeholder || this.options.placeholder) : '···');
+
+
+ sb.addEventListener('click', this.handleClick.bind(this));
+ sb.addEventListener('keydown', this.handleKeydown.bind(this));
+ sb.addEventListener('cbi-dropdown-close', this.handleDropdownClose.bind(this));
+ sb.addEventListener('cbi-dropdown-select', this.handleDropdownSelect.bind(this));
+
+ if ('ontouchstart' in window) {
+ sb.addEventListener('touchstart', function(ev) { ev.stopPropagation(); });
+ window.addEventListener('touchstart', this.closeAllDropdowns);
+ }
+ else {
+ sb.addEventListener('mouseover', this.handleMouseover.bind(this));
+ sb.addEventListener('focus', this.handleFocus.bind(this));
+
+ canary.addEventListener('focus', this.handleCanaryFocus.bind(this));
+
+ window.addEventListener('mouseover', this.setFocus);
+ window.addEventListener('click', this.closeAllDropdowns);
+ }
+
+ if (create) {
+ create.addEventListener('keydown', this.handleCreateKeydown.bind(this));
+ create.addEventListener('focus', this.handleCreateFocus.bind(this));
+ create.addEventListener('blur', this.handleCreateBlur.bind(this));
+
+ var li = findParent(create, 'li');
+
+ li.setAttribute('unselectable', '');
+ li.addEventListener('click', this.handleCreateClick.bind(this));
+ }
+
+ this.node = sb;
+
+ this.setUpdateEvents(sb, 'cbi-dropdown-open', 'cbi-dropdown-close');
+ this.setChangeEvents(sb, 'cbi-dropdown-change', 'cbi-dropdown-close');
+
+ L.dom.bindClassInstance(sb, this);
+
+ return sb;
+ },
+
+ openDropdown: function(sb) {
+ var st = window.getComputedStyle(sb, null),
+ ul = sb.querySelector('ul'),
+ li = ul.querySelectorAll('li'),
+ fl = findParent(sb, '.cbi-value-field'),
+ sel = ul.querySelector('[selected]'),
+ rect = sb.getBoundingClientRect(),
+ items = Math.min(this.options.dropdown_items, li.length);
+
+ document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+ s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
+ });
+
+ sb.setAttribute('open', '');
+
+ var pv = ul.cloneNode(true);
+ pv.classList.add('preview');
+
+ if (fl)
+ fl.classList.add('cbi-dropdown-open');
+
+ if ('ontouchstart' in window) {
+ var vpWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0),
+ vpHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0),
+ scrollFrom = window.pageYOffset,
+ scrollTo = scrollFrom + rect.top - vpHeight * 0.5,
+ start = null;
+
+ ul.style.top = sb.offsetHeight + 'px';
+ ul.style.left = -rect.left + 'px';
+ ul.style.right = (rect.right - vpWidth) + 'px';
+ ul.style.maxHeight = (vpHeight * 0.5) + 'px';
+ ul.style.WebkitOverflowScrolling = 'touch';
+
+ var scrollStep = function(timestamp) {
+ if (!start) {
+ start = timestamp;
+ ul.scrollTop = sel ? Math.max(sel.offsetTop - sel.offsetHeight, 0) : 0;
+ }
+
+ var duration = Math.max(timestamp - start, 1);
+ if (duration < 100) {
+ document.body.scrollTop = scrollFrom + (scrollTo - scrollFrom) * (duration / 100);
+ window.requestAnimationFrame(scrollStep);
+ }
+ else {
+ document.body.scrollTop = scrollTo;
+ }
+ };
+
+ window.requestAnimationFrame(scrollStep);
+ }
+ else {
+ ul.style.maxHeight = '1px';
+ ul.style.top = ul.style.bottom = '';
+
+ window.requestAnimationFrame(function() {
+ var itemHeight = li[Math.max(0, li.length - 2)].getBoundingClientRect().height,
+ fullHeight = 0,
+ spaceAbove = rect.top,
+ spaceBelow = window.innerHeight - rect.height - rect.top;
+
+ for (var i = 0; i < (items == -1 ? li.length : items); i++)
+ fullHeight += li[i].getBoundingClientRect().height;
+
+ if (fullHeight <= spaceBelow) {
+ ul.style.top = rect.height + 'px';
+ ul.style.maxHeight = spaceBelow + 'px';
+ }
+ else if (fullHeight <= spaceAbove) {
+ ul.style.bottom = rect.height + 'px';
+ ul.style.maxHeight = spaceAbove + 'px';
+ }
+ else if (spaceBelow >= spaceAbove) {
+ ul.style.top = rect.height + 'px';
+ ul.style.maxHeight = (spaceBelow - (spaceBelow % itemHeight)) + 'px';
+ }
+ else {
+ ul.style.bottom = rect.height + 'px';
+ ul.style.maxHeight = (spaceAbove - (spaceAbove % itemHeight)) + 'px';
+ }
+
+ ul.scrollTop = sel ? Math.max(sel.offsetTop - sel.offsetHeight, 0) : 0;
+ });
+ }
+
+ var cboxes = ul.querySelectorAll('[selected] input[type="checkbox"]');
+ for (var i = 0; i < cboxes.length; i++) {
+ cboxes[i].checked = true;
+ cboxes[i].disabled = (cboxes.length == 1 && !this.options.optional);
+ };
+
+ ul.classList.add('dropdown');
+
+ sb.insertBefore(pv, ul.nextElementSibling);
+
+ li.forEach(function(l) {
+ l.setAttribute('tabindex', 0);
+ });
+
+ sb.lastElementChild.setAttribute('tabindex', 0);
+
+ this.setFocus(sb, sel || li[0], true);
+ },
+
+ closeDropdown: function(sb, no_focus) {
+ if (!sb.hasAttribute('open'))
+ return;
+
+ var pv = sb.querySelector('ul.preview'),
+ ul = sb.querySelector('ul.dropdown'),
+ li = ul.querySelectorAll('li'),
+ fl = findParent(sb, '.cbi-value-field');
+
+ li.forEach(function(l) { l.removeAttribute('tabindex'); });
+ sb.lastElementChild.removeAttribute('tabindex');
+
+ sb.removeChild(pv);
+ sb.removeAttribute('open');
+ sb.style.width = sb.style.height = '';
+
+ ul.classList.remove('dropdown');
+ ul.style.top = ul.style.bottom = ul.style.maxHeight = '';
+
+ if (fl)
+ fl.classList.remove('cbi-dropdown-open');
+
+ if (!no_focus)
+ this.setFocus(sb, sb);
+
+ this.saveValues(sb, ul);
+ },
+
+ toggleItem: function(sb, li, force_state) {
+ if (li.hasAttribute('unselectable'))
+ return;
+
+ if (this.options.multi) {
+ var cbox = li.querySelector('input[type="checkbox"]'),
+ items = li.parentNode.querySelectorAll('li'),
+ label = sb.querySelector('ul.preview'),
+ sel = li.parentNode.querySelectorAll('[selected]').length,
+ more = sb.querySelector('.more'),
+ ndisplay = this.options.display_items,
+ n = 0;
+
+ if (li.hasAttribute('selected')) {
+ if (force_state !== true) {
+ if (sel > 1 || this.options.optional) {
+ li.removeAttribute('selected');
+ cbox.checked = cbox.disabled = false;
+ sel--;
+ }
+ else {
+ cbox.disabled = true;
+ }
+ }
+ }
+ else {
+ if (force_state !== false) {
+ li.setAttribute('selected', '');
+ cbox.checked = true;
+ cbox.disabled = false;
+ sel++;
+ }
+ }
+
+ while (label && label.firstElementChild)
+ label.removeChild(label.firstElementChild);
+
+ for (var i = 0; i < items.length; i++) {
+ items[i].removeAttribute('display');
+ if (items[i].hasAttribute('selected')) {
+ if (ndisplay-- > 0) {
+ items[i].setAttribute('display', n++);
+ if (label)
+ label.appendChild(items[i].cloneNode(true));
+ }
+ var c = items[i].querySelector('input[type="checkbox"]');
+ if (c)
+ c.disabled = (sel == 1 && !this.options.optional);
+ }
+ }
+
+ if (ndisplay < 0)
+ sb.setAttribute('more', '');
+ else
+ sb.removeAttribute('more');
+
+ if (ndisplay === this.options.display_items)
+ sb.setAttribute('empty', '');
+ else
+ sb.removeAttribute('empty');
+
+ L.dom.content(more, (ndisplay === this.options.display_items)
+ ? (this.options.select_placeholder || this.options.placeholder) : '···');
+ }
+ else {
+ var sel = li.parentNode.querySelector('[selected]');
+ if (sel) {
+ sel.removeAttribute('display');
+ sel.removeAttribute('selected');
+ }
+
+ li.setAttribute('display', 0);
+ li.setAttribute('selected', '');
+
+ this.closeDropdown(sb, true);
+ }
+
+ this.saveValues(sb, li.parentNode);
+ },
+
+ transformItem: function(sb, li) {
+ var cbox = E('form', {}, E('input', { type: 'checkbox', tabindex: -1, onclick: 'event.preventDefault()' })),
+ label = E('label');
+
+ while (li.firstChild)
+ label.appendChild(li.firstChild);
+
+ li.appendChild(cbox);
+ li.appendChild(label);
+ },
+
+ saveValues: function(sb, ul) {
+ var sel = ul.querySelectorAll('li[selected]'),
+ div = sb.lastElementChild,
+ name = this.options.name,
+ strval = '',
+ values = [];
+
+ while (div.lastElementChild)
+ div.removeChild(div.lastElementChild);
+
+ sel.forEach(function (s) {
+ if (s.hasAttribute('placeholder'))
+ return;
+
+ var v = {
+ text: s.innerText,
+ value: s.hasAttribute('data-value') ? s.getAttribute('data-value') : s.innerText,
+ element: s
+ };
+
+ div.appendChild(E('input', {
+ type: 'hidden',
+ name: name,
+ value: v.value
+ }));
+
+ values.push(v);
+
+ strval += strval.length ? ' ' + v.value : v.value;
+ });
+
+ var detail = {
+ instance: this,
+ element: sb
+ };
+
+ if (this.options.multi)
+ detail.values = values;
+ else
+ detail.value = values.length ? values[0] : null;
+
+ sb.value = strval;
+
+ sb.dispatchEvent(new CustomEvent('cbi-dropdown-change', {
+ bubbles: true,
+ detail: detail
+ }));
+ },
+
+ setValues: function(sb, values) {
+ var ul = sb.querySelector('ul');
+
+ if (this.options.create) {
+ for (var value in values) {
+ this.createItems(sb, value);
+
+ if (!this.options.multi)
+ break;
+ }
+ }
+
+ if (this.options.multi) {
+ var lis = ul.querySelectorAll('li[data-value]');
+ for (var i = 0; i < lis.length; i++) {
+ var value = lis[i].getAttribute('data-value');
+ if (values === null || !(value in values))
+ this.toggleItem(sb, lis[i], false);
+ else
+ this.toggleItem(sb, lis[i], true);
+ }
+ }
+ else {
+ var ph = ul.querySelector('li[placeholder]');
+ if (ph)
+ this.toggleItem(sb, ph);
+
+ var lis = ul.querySelectorAll('li[data-value]');
+ for (var i = 0; i < lis.length; i++) {
+ var value = lis[i].getAttribute('data-value');
+ if (values !== null && (value in values))
+ this.toggleItem(sb, lis[i]);
+ }
+ }
+ },
+
+ setFocus: function(sb, elem, scroll) {
+ if (sb && sb.hasAttribute && sb.hasAttribute('locked-in'))
+ return;
+
+ if (sb.target && findParent(sb.target, 'ul.dropdown'))
+ return;
+
+ document.querySelectorAll('.focus').forEach(function(e) {
+ if (!matchesElem(e, 'input')) {
+ e.classList.remove('focus');
+ e.blur();
+ }
+ });
+
+ if (elem) {
+ elem.focus();
+ elem.classList.add('focus');
+
+ if (scroll)
+ elem.parentNode.scrollTop = elem.offsetTop - elem.parentNode.offsetTop;
+ }
+ },
+
+ createItems: function(sb, value) {
+ var sbox = this,
+ val = (value || '').trim(),
+ ul = sb.querySelector('ul');
+
+ if (!sbox.options.multi)
+ val = val.length ? [ val ] : [];
+ else
+ val = val.length ? val.split(/\s+/) : [];
+
+ val.forEach(function(item) {
+ var new_item = null;
+
+ ul.childNodes.forEach(function(li) {
+ if (li.getAttribute && li.getAttribute('data-value') === item)
+ new_item = li;
+ });
+
+ if (!new_item) {
+ var markup,
+ tpl = sb.querySelector(sbox.options.create_template);
+
+ if (tpl)
+ markup = (tpl.textContent || tpl.innerHTML || tpl.firstChild.data).replace(/^<!--|-->$/, '').trim();
+ else
+ markup = '<li data-value="{{value}}">{{value}}</li>';
+
+ new_item = E(markup.replace(/{{value}}/g, item));
+
+ if (sbox.options.multi) {
+ sbox.transformItem(sb, new_item);
+ }
+ else {
+ var old = ul.querySelector('li[created]');
+ if (old)
+ ul.removeChild(old);
+
+ new_item.setAttribute('created', '');
+ }
+
+ new_item = ul.insertBefore(new_item, ul.lastElementChild);
+ }
+
+ sbox.toggleItem(sb, new_item, true);
+ sbox.setFocus(sb, new_item, true);
+ });
+ },
+
+ closeAllDropdowns: function() {
+ document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+ s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
+ });
+ },
+
+ handleClick: function(ev) {
+ var sb = ev.currentTarget;
+
+ if (!sb.hasAttribute('open')) {
+ if (!matchesElem(ev.target, 'input'))
+ this.openDropdown(sb);
+ }
+ else {
+ var li = findParent(ev.target, 'li');
+ if (li && li.parentNode.classList.contains('dropdown'))
+ this.toggleItem(sb, li);
+ else if (li && li.parentNode.classList.contains('preview'))
+ this.closeDropdown(sb);
+ else if (matchesElem(ev.target, 'span.open, span.more'))
+ this.closeDropdown(sb);
+ }
+
+ ev.preventDefault();
+ ev.stopPropagation();
+ },
+
+ handleKeydown: function(ev) {
+ var sb = ev.currentTarget;
+
+ if (matchesElem(ev.target, 'input'))
+ return;
+
+ if (!sb.hasAttribute('open')) {
+ switch (ev.keyCode) {
+ case 37:
+ case 38:
+ case 39:
+ case 40:
+ this.openDropdown(sb);
+ ev.preventDefault();
+ }
+ }
+ else {
+ var active = findParent(document.activeElement, 'li');
+
+ switch (ev.keyCode) {
+ case 27:
+ this.closeDropdown(sb);
+ break;
+
+ case 13:
+ if (active) {
+ if (!active.hasAttribute('selected'))
+ this.toggleItem(sb, active);
+ this.closeDropdown(sb);
+ ev.preventDefault();
+ }
+ break;
+
+ case 32:
+ if (active) {
+ this.toggleItem(sb, active);
+ ev.preventDefault();
+ }
+ break;
+
+ case 38:
+ if (active && active.previousElementSibling) {
+ this.setFocus(sb, active.previousElementSibling);
+ ev.preventDefault();
+ }
+ break;
+
+ case 40:
+ if (active && active.nextElementSibling) {
+ this.setFocus(sb, active.nextElementSibling);
+ ev.preventDefault();
+ }
+ break;
+ }
+ }
+ },
+
+ handleDropdownClose: function(ev) {
+ var sb = ev.currentTarget;
+
+ this.closeDropdown(sb, true);
+ },
+
+ handleDropdownSelect: function(ev) {
+ var sb = ev.currentTarget,
+ li = findParent(ev.target, 'li');
+
+ if (!li)
+ return;
+
+ this.toggleItem(sb, li);
+ this.closeDropdown(sb, true);
+ },
+
+ handleMouseover: function(ev) {
+ var sb = ev.currentTarget;
+
+ if (!sb.hasAttribute('open'))
+ return;
+
+ var li = findParent(ev.target, 'li');
+
+ if (li && li.parentNode.classList.contains('dropdown'))
+ this.setFocus(sb, li);
+ },
+
+ handleFocus: function(ev) {
+ var sb = ev.currentTarget;
+
+ document.querySelectorAll('.cbi-dropdown[open]').forEach(function(s) {
+ if (s !== sb || sb.hasAttribute('open'))
+ s.dispatchEvent(new CustomEvent('cbi-dropdown-close', {}));
+ });
+ },
+
+ handleCanaryFocus: function(ev) {
+ this.closeDropdown(ev.currentTarget.parentNode);
+ },
+
+ handleCreateKeydown: function(ev) {
+ var input = ev.currentTarget,
+ sb = findParent(input, '.cbi-dropdown');
+
+ switch (ev.keyCode) {
+ case 13:
+ ev.preventDefault();
+
+ if (input.classList.contains('cbi-input-invalid'))
+ return;
+
+ this.createItems(sb, input.value);
+ input.value = '';
+ input.blur();
+ break;
+ }
+ },
+
+ handleCreateFocus: function(ev) {
+ var input = ev.currentTarget,
+ cbox = findParent(input, 'li').querySelector('input[type="checkbox"]'),
+ sb = findParent(input, '.cbi-dropdown');
+
+ if (cbox)
+ cbox.checked = true;
+
+ sb.setAttribute('locked-in', '');
+ },
+
+ handleCreateBlur: function(ev) {
+ var input = ev.currentTarget,
+ cbox = findParent(input, 'li').querySelector('input[type="checkbox"]'),
+ sb = findParent(input, '.cbi-dropdown');
+
+ if (cbox)
+ cbox.checked = false;
+
+ sb.removeAttribute('locked-in');
+ },
+
+ handleCreateClick: function(ev) {
+ ev.currentTarget.querySelector(this.options.create_query).focus();
+ },
+
+ setValue: function(values) {
+ if (this.options.multi) {
+ if (!Array.isArray(values))
+ values = (values != null && values != '') ? [ values ] : [];
+
+ var v = {};
+
+ for (var i = 0; i < values.length; i++)
+ v[values[i]] = true;
+
+ this.setValues(this.node, v);
+ }
+ else {
+ var v = {};
+
+ if (values != null) {
+ if (Array.isArray(values))
+ v[values[0]] = true;
+ else
+ v[values] = true;
+ }
+
+ this.setValues(this.node, v);
+ }
+ },
+
+ getValue: function() {
+ var div = this.node.lastElementChild,
+ h = div.querySelectorAll('input[type="hidden"]'),
+ v = [];
+
+ for (var i = 0; i < h.length; i++)
+ v.push(h[i].value);
+
+ return this.options.multi ? v : v[0];
+ }
+});
+
+var UICombobox = UIDropdown.extend({
+ __init__: function(value, choices, options) {
+ this.super('__init__', [ value, choices, Object.assign({
+ select_placeholder: _('-- Please choose --'),
+ custom_placeholder: _('-- custom --'),
+ dropdown_items: -1,
+ sort: true
+ }, options, {
+ multi: false,
+ create: true,
+ optional: true
+ }) ]);
+ }
+});
+
+var UIDynamicList = UIElement.extend({
+ __init__: function(values, choices, options) {
+ if (!Array.isArray(values))
+ values = (values != null && values != '') ? [ values ] : [];
+
+ if (typeof(choices) != 'object')
+ choices = null;
+
+ this.values = values;
+ this.choices = choices;
+ this.options = Object.assign({}, options, {
+ multi: false,
+ optional: true
+ });
+ },
+
+ render: function() {
+ var dl = E('div', {
+ 'id': this.options.id,
+ 'class': 'cbi-dynlist'
+ }, E('div', { 'class': 'add-item' }));
+
+ if (this.choices) {
+ var cbox = new UICombobox(null, this.choices, this.options);
+ dl.lastElementChild.appendChild(cbox.render());
+ }
+ else {
+ var inputEl = E('input', {
+ 'type': 'text',
+ 'class': 'cbi-input-text',
+ 'placeholder': this.options.placeholder
+ });
+
+ dl.lastElementChild.appendChild(inputEl);
+ dl.lastElementChild.appendChild(E('div', { 'class': 'cbi-button cbi-button-add' }, '+'));
+
+ if (this.options.datatype)
+ L.ui.addValidator(inputEl, this.options.datatype,
+ true, null, 'blur', 'keyup');
+ }
+
+ for (var i = 0; i < this.values.length; i++)
+ this.addItem(dl, this.values[i],
+ this.choices ? this.choices[this.values[i]] : null);
+
+ return this.bind(dl);
+ },
+
+ bind: function(dl) {
+ dl.addEventListener('click', L.bind(this.handleClick, this));
+ dl.addEventListener('keydown', L.bind(this.handleKeydown, this));
+ dl.addEventListener('cbi-dropdown-change', L.bind(this.handleDropdownChange, this));
+
+ this.node = dl;
+
+ this.setUpdateEvents(dl, 'cbi-dynlist-change');
+ this.setChangeEvents(dl, 'cbi-dynlist-change');
+
+ L.dom.bindClassInstance(dl, this);
+
+ return dl;
+ },
+
+ addItem: function(dl, value, text, flash) {
+ var exists = false,
+ new_item = E('div', { 'class': flash ? 'item flash' : 'item', 'tabindex': 0 }, [
+ E('span', {}, text || value),
+ E('input', {
+ 'type': 'hidden',
+ 'name': this.options.name,
+ 'value': value })]);
+
+ dl.querySelectorAll('.item, .add-item').forEach(function(item) {
+ if (exists)
+ return;
+
+ var hidden = item.querySelector('input[type="hidden"]');
+
+ if (hidden && hidden.parentNode !== item)
+ hidden = null;
+
+ if (hidden && hidden.value === value)
+ exists = true;
+ else if (!hidden || hidden.value >= value)
+ exists = !!item.parentNode.insertBefore(new_item, item);
+ });
+
+ dl.dispatchEvent(new CustomEvent('cbi-dynlist-change', {
+ bubbles: true,
+ detail: {
+ instance: this,
+ element: dl,
+ value: value,
+ add: true
+ }
+ }));
+ },
+
+ removeItem: function(dl, item) {
+ var value = item.querySelector('input[type="hidden"]').value;
+ var sb = dl.querySelector('.cbi-dropdown');
+ if (sb)
+ sb.querySelectorAll('ul > li').forEach(function(li) {
+ if (li.getAttribute('data-value') === value) {
+ if (li.hasAttribute('dynlistcustom'))
+ li.parentNode.removeChild(li);
+ else
+ li.removeAttribute('unselectable');
+ }
+ });
+
+ item.parentNode.removeChild(item);
+
+ dl.dispatchEvent(new CustomEvent('cbi-dynlist-change', {
+ bubbles: true,
+ detail: {
+ instance: this,
+ element: dl,
+ value: value,
+ remove: true
+ }
+ }));
+ },
+
+ handleClick: function(ev) {
+ var dl = ev.currentTarget,
+ item = findParent(ev.target, '.item');
+
+ if (item) {
+ this.removeItem(dl, item);
+ }
+ else if (matchesElem(ev.target, '.cbi-button-add')) {
+ var input = ev.target.previousElementSibling;
+ if (input.value.length && !input.classList.contains('cbi-input-invalid')) {
+ this.addItem(dl, input.value, null, true);
+ input.value = '';
+ }
+ }
+ },
+
+ handleDropdownChange: function(ev) {
+ var dl = ev.currentTarget,
+ sbIn = ev.detail.instance,
+ sbEl = ev.detail.element,
+ sbVal = ev.detail.value;
+
+ if (sbVal === null)
+ return;
+
+ sbIn.setValues(sbEl, null);
+ sbVal.element.setAttribute('unselectable', '');
+
+ if (sbVal.element.hasAttribute('created')) {
+ sbVal.element.removeAttribute('created');
+ sbVal.element.setAttribute('dynlistcustom', '');
+ }
+
+ this.addItem(dl, sbVal.value, sbVal.text, true);
+ },
+
+ handleKeydown: function(ev) {
+ var dl = ev.currentTarget,
+ item = findParent(ev.target, '.item');
+
+ if (item) {
+ switch (ev.keyCode) {
+ case 8: /* backspace */
+ if (item.previousElementSibling)
+ item.previousElementSibling.focus();
+
+ this.removeItem(dl, item);
+ break;
+
+ case 46: /* delete */
+ if (item.nextElementSibling) {
+ if (item.nextElementSibling.classList.contains('item'))
+ item.nextElementSibling.focus();
+ else
+ item.nextElementSibling.firstElementChild.focus();
+ }
+
+ this.removeItem(dl, item);
+ break;
+ }
+ }
+ else if (matchesElem(ev.target, '.cbi-input-text')) {
+ switch (ev.keyCode) {
+ case 13: /* enter */
+ if (ev.target.value.length && !ev.target.classList.contains('cbi-input-invalid')) {
+ this.addItem(dl, ev.target.value, null, true);
+ ev.target.value = '';
+ ev.target.blur();
+ ev.target.focus();
+ }
+
+ ev.preventDefault();
+ break;
+ }
+ }
+ },
+
+ getValue: function() {
+ var items = this.node.querySelectorAll('.item > input[type="hidden"]'),
+ v = [];
+
+ for (var i = 0; i < items.length; i++)
+ v.push(items[i].value);
+
+ return v;
+ },
+
+ setValue: function(values) {
+ if (!Array.isArray(values))
+ values = (values != null && values != '') ? [ values ] : [];
+
+ var items = this.node.querySelectorAll('.item');
+
+ for (var i = 0; i < items.length; i++)
+ if (items[i].parentNode === this.node)
+ this.removeItem(this.node, items[i]);
+
+ for (var i = 0; i < values.length; i++)
+ this.addItem(this.node, values[i],
+ this.choices ? this.choices[values[i]] : null);
+ }
+});
+
+var UIHiddenfield = UIElement.extend({
+ __init__: function(value, options) {
+ this.value = value;
+ this.options = Object.assign({
+
+ }, options);
+ },
+
+ render: function() {
+ var hiddenEl = E('input', {
+ 'id': this.options.id,
+ 'type': 'hidden',
+ 'value': this.value
+ });
+
+ return this.bind(hiddenEl);
+ },
+
+ bind: function(hiddenEl) {
+ this.node = hiddenEl;
+
+ L.dom.bindClassInstance(hiddenEl, this);
+
+ return hiddenEl;
+ },
+
+ getValue: function() {
+ return this.node.value;
+ },
+
+ setValue: function(value) {
+ this.node.value = value;
+ }
+});
+
+
+return L.Class.extend({
+ __init__: function() {
+ modalDiv = document.body.appendChild(
+ L.dom.create('div', { id: 'modal_overlay' },
+ L.dom.create('div', { class: 'modal', role: 'dialog', 'aria-modal': true })));
+
+ tooltipDiv = document.body.appendChild(
+ L.dom.create('div', { class: 'cbi-tooltip' }));
+
+ /* setup old aliases */
+ L.showModal = this.showModal;
+ L.hideModal = this.hideModal;
+ L.showTooltip = this.showTooltip;
+ L.hideTooltip = this.hideTooltip;
+ L.itemlist = this.itemlist;
+
+ document.addEventListener('mouseover', this.showTooltip.bind(this), true);
+ document.addEventListener('mouseout', this.hideTooltip.bind(this), true);
+ document.addEventListener('focus', this.showTooltip.bind(this), true);
+ document.addEventListener('blur', this.hideTooltip.bind(this), true);
+
+ document.addEventListener('luci-loaded', this.tabs.init.bind(this.tabs));
+ document.addEventListener('luci-loaded', this.changes.init.bind(this.changes));
+ document.addEventListener('uci-loaded', this.changes.init.bind(this.changes));
+ },
+
+ /* Modal dialog */
+ showModal: function(title, children /* , ... */) {
+ var dlg = modalDiv.firstElementChild;
+
+ dlg.setAttribute('class', 'modal');
+
+ for (var i = 2; i < arguments.length; i++)
+ dlg.classList.add(arguments[i]);
+
+ L.dom.content(dlg, L.dom.create('h4', {}, title));
+ L.dom.append(dlg, children);
+
+ document.body.classList.add('modal-overlay-active');
+
+ return dlg;
+ },
+
+ hideModal: function() {
+ document.body.classList.remove('modal-overlay-active');
+ },
+
+ /* Tooltip */
+ showTooltip: function(ev) {
+ var target = findParent(ev.target, '[data-tooltip]');
+
+ if (!target)
+ return;
+
+ if (tooltipTimeout !== null) {
+ window.clearTimeout(tooltipTimeout);
+ tooltipTimeout = null;
+ }
+
+ var rect = target.getBoundingClientRect(),
+ x = rect.left + window.pageXOffset,
+ y = rect.top + rect.height + window.pageYOffset;
+
+ tooltipDiv.className = 'cbi-tooltip';
+ tooltipDiv.innerHTML = 'â–² ';
+ tooltipDiv.firstChild.data += target.getAttribute('data-tooltip');
+
+ if (target.hasAttribute('data-tooltip-style'))
+ tooltipDiv.classList.add(target.getAttribute('data-tooltip-style'));
+
+ if ((y + tooltipDiv.offsetHeight) > (window.innerHeight + window.pageYOffset)) {
+ y -= (tooltipDiv.offsetHeight + target.offsetHeight);
+ tooltipDiv.firstChild.data = 'â–¼ ' + tooltipDiv.firstChild.data.substr(2);
+ }
+
+ tooltipDiv.style.top = y + 'px';
+ tooltipDiv.style.left = x + 'px';
+ tooltipDiv.style.opacity = 1;
+
+ tooltipDiv.dispatchEvent(new CustomEvent('tooltip-open', {
+ bubbles: true,
+ detail: { target: target }
+ }));
+ },
+
+ hideTooltip: function(ev) {
+ if (ev.target === tooltipDiv || ev.relatedTarget === tooltipDiv ||
+ tooltipDiv.contains(ev.target) || tooltipDiv.contains(ev.relatedTarget))
+ return;
+
+ if (tooltipTimeout !== null) {
+ window.clearTimeout(tooltipTimeout);
+ tooltipTimeout = null;
+ }
+
+ tooltipDiv.style.opacity = 0;
+ tooltipTimeout = window.setTimeout(function() { tooltipDiv.removeAttribute('style'); }, 250);
+
+ tooltipDiv.dispatchEvent(new CustomEvent('tooltip-close', { bubbles: true }));
+ },
+
+ /* Widget helper */
+ itemlist: function(node, items, separators) {
+ var children = [];
+
+ if (!Array.isArray(separators))
+ separators = [ separators || E('br') ];
+
+ for (var i = 0; i < items.length; i += 2) {
+ if (items[i+1] !== null && items[i+1] !== undefined) {
+ var sep = separators[(i/2) % separators.length],
+ cld = [];
+
+ children.push(E('span', { class: 'nowrap' }, [
+ items[i] ? E('strong', items[i] + ': ') : '',
+ items[i+1]
+ ]));
+
+ if ((i+2) < items.length)
+ children.push(L.dom.elem(sep) ? sep.cloneNode(true) : sep);
+ }
+ }
+
+ L.dom.content(node, children);
+
+ return node;
+ },
+
+ /* Tabs */
+ tabs: L.Class.singleton({
+ init: function() {
+ var groups = [], prevGroup = null, currGroup = null;
+
+ document.querySelectorAll('[data-tab]').forEach(function(tab) {
+ var parent = tab.parentNode;
+
+ if (!parent.hasAttribute('data-tab-group'))
+ parent.setAttribute('data-tab-group', groups.length);
+
+ currGroup = +parent.getAttribute('data-tab-group');
+
+ if (currGroup !== prevGroup) {
+ prevGroup = currGroup;
+
+ if (!groups[currGroup])
+ groups[currGroup] = [];
+ }
+
+ groups[currGroup].push(tab);
+ });
+
+ for (var i = 0; i < groups.length; i++)
+ this.initTabGroup(groups[i]);
+
+ document.addEventListener('dependency-update', this.updateTabs.bind(this));
+
+ this.updateTabs();
+
+ if (!groups.length)
+ this.setActiveTabId(-1, -1);
+ },
+
+ initTabGroup: function(panes) {
+ if (typeof(panes) != 'object' || !('length' in panes) || panes.length === 0)
+ return;
+
+ var menu = E('ul', { 'class': 'cbi-tabmenu' }),
+ group = panes[0].parentNode,
+ groupId = +group.getAttribute('data-tab-group'),
+ selected = null;
+
+ for (var i = 0, pane; pane = panes[i]; i++) {
+ var name = pane.getAttribute('data-tab'),
+ title = pane.getAttribute('data-tab-title'),
+ active = pane.getAttribute('data-tab-active') === 'true';
+
+ menu.appendChild(E('li', {
+ 'class': active ? 'cbi-tab' : 'cbi-tab-disabled',
+ 'data-tab': name
+ }, E('a', {
+ 'href': '#',
+ 'click': this.switchTab.bind(this)
+ }, title)));
+
+ if (active)
+ selected = i;
+ }
+
+ group.parentNode.insertBefore(menu, group);
+
+ if (selected === null) {
+ selected = this.getActiveTabId(groupId);
+
+ if (selected < 0 || selected >= panes.length)
+ selected = 0;
+
+ menu.childNodes[selected].classList.add('cbi-tab');
+ menu.childNodes[selected].classList.remove('cbi-tab-disabled');
+ panes[selected].setAttribute('data-tab-active', 'true');
+
+ this.setActiveTabId(groupId, selected);
+ }
+ },
+
+ getActiveTabState: function() {
+ var page = document.body.getAttribute('data-page');
+
+ try {
+ var val = JSON.parse(window.sessionStorage.getItem('tab'));
+ if (val.page === page && Array.isArray(val.groups))
+ return val;
+ }
+ catch(e) {}
+
+ window.sessionStorage.removeItem('tab');
+ return { page: page, groups: [] };
+ },
+
+ getActiveTabId: function(groupId) {
+ return +this.getActiveTabState().groups[groupId] || 0;
+ },
+
+ setActiveTabId: function(groupId, tabIndex) {
+ try {
+ var state = this.getActiveTabState();
+ state.groups[groupId] = tabIndex;
+
+ window.sessionStorage.setItem('tab', JSON.stringify(state));
+ }
+ catch (e) { return false; }
+
+ return true;
+ },
+
+ updateTabs: function(ev) {
+ document.querySelectorAll('[data-tab-title]').forEach(function(pane) {
+ var menu = pane.parentNode.previousElementSibling,
+ tab = menu.querySelector('[data-tab="%s"]'.format(pane.getAttribute('data-tab'))),
+ n_errors = pane.querySelectorAll('.cbi-input-invalid').length;
+
+ if (!pane.firstElementChild) {
+ tab.style.display = 'none';
+ tab.classList.remove('flash');
+ }
+ else if (tab.style.display === 'none') {
+ tab.style.display = '';
+ requestAnimationFrame(function() { tab.classList.add('flash') });
+ }
+
+ if (n_errors) {
+ tab.setAttribute('data-errors', n_errors);
+ tab.setAttribute('data-tooltip', _('%d invalid field(s)').format(n_errors));
+ tab.setAttribute('data-tooltip-style', 'error');
+ }
+ else {
+ tab.removeAttribute('data-errors');
+ tab.removeAttribute('data-tooltip');
+ }
+ });
+ },
+
+ switchTab: function(ev) {
+ var tab = ev.target.parentNode,
+ name = tab.getAttribute('data-tab'),
+ menu = tab.parentNode,
+ group = menu.nextElementSibling,
+ groupId = +group.getAttribute('data-tab-group'),
+ index = 0;
+
+ ev.preventDefault();
+
+ if (!tab.classList.contains('cbi-tab-disabled'))
+ return;
+
+ menu.querySelectorAll('[data-tab]').forEach(function(tab) {
+ tab.classList.remove('cbi-tab');
+ tab.classList.remove('cbi-tab-disabled');
+ tab.classList.add(
+ tab.getAttribute('data-tab') === name ? 'cbi-tab' : 'cbi-tab-disabled');
+ });
+
+ group.childNodes.forEach(function(pane) {
+ if (L.dom.matches(pane, '[data-tab]')) {
+ if (pane.getAttribute('data-tab') === name) {
+ pane.setAttribute('data-tab-active', 'true');
+ L.ui.tabs.setActiveTabId(groupId, index);
+ }
+ else {
+ pane.setAttribute('data-tab-active', 'false');
+ }
+
+ index++;
+ }
+ });
+ }
+ }),
+
+ /* UCI Changes */
+ changes: L.Class.singleton({
+ init: function() {
+ if (!L.env.sessionid)
+ return;
+
+ return uci.changes().then(L.bind(this.renderChangeIndicator, this));
+ },
+
+ setIndicator: function(n) {
+ var i = document.querySelector('.uci_change_indicator');
+ if (i == null) {
+ var poll = document.getElementById('xhr_poll_status');
+ i = poll.parentNode.insertBefore(E('a', {
+ 'href': '#',
+ 'class': 'uci_change_indicator label notice',
+ 'click': L.bind(this.displayChanges, this)
+ }), poll);
+ }
+
+ if (n > 0) {
+ L.dom.content(i, [ _('Unsaved Changes'), ': ', n ]);
+ i.classList.add('flash');
+ i.style.display = '';
+ }
+ else {
+ i.classList.remove('flash');
+ i.style.display = 'none';
+ }
+ },
+
+ renderChangeIndicator: function(changes) {
+ var n_changes = 0;
+
+ for (var config in changes)
+ if (changes.hasOwnProperty(config))
+ n_changes += changes[config].length;
+
+ this.changes = changes;
+ this.setIndicator(n_changes);
+ },
+
+ changeTemplates: {
+ 'add-3': '<ins>uci add %0 <strong>%3</strong> # =%2</ins>',
+ 'set-3': '<ins>uci set %0.<strong>%2</strong>=%3</ins>',
+ 'set-4': '<var><ins>uci set %0.%2.%3=<strong>%4</strong></ins></var>',
+ 'remove-2': '<del>uci del %0.<strong>%2</strong></del>',
+ 'remove-3': '<var><del>uci del %0.%2.<strong>%3</strong></del></var>',
+ 'order-3': '<var>uci reorder %0.%2=<strong>%3</strong></var>',
+ 'list-add-4': '<var><ins>uci add_list %0.%2.%3=<strong>%4</strong></ins></var>',
+ 'list-del-4': '<var><del>uci del_list %0.%2.%3=<strong>%4</strong></del></var>',
+ 'rename-3': '<var>uci rename %0.%2=<strong>%3</strong></var>',
+ 'rename-4': '<var>uci rename %0.%2.%3=<strong>%4</strong></var>'
+ },
+
+ displayChanges: function() {
+ var list = E('div', { 'class': 'uci-change-list' }),
+ dlg = L.ui.showModal(_('Configuration') + ' / ' + _('Changes'), [
+ E('div', { 'class': 'cbi-section' }, [
+ E('strong', _('Legend:')),
+ E('div', { 'class': 'uci-change-legend' }, [
+ E('div', { 'class': 'uci-change-legend-label' }, [
+ E('ins', '&#160;'), ' ', _('Section added') ]),
+ E('div', { 'class': 'uci-change-legend-label' }, [
+ E('del', '&#160;'), ' ', _('Section removed') ]),
+ E('div', { 'class': 'uci-change-legend-label' }, [
+ E('var', {}, E('ins', '&#160;')), ' ', _('Option changed') ]),
+ E('div', { 'class': 'uci-change-legend-label' }, [
+ E('var', {}, E('del', '&#160;')), ' ', _('Option removed') ])]),
+ E('br'), list,
+ E('div', { 'class': 'right' }, [
+ E('input', {
+ 'type': 'button',
+ 'class': 'btn',
+ 'click': L.ui.hideModal,
+ 'value': _('Dismiss')
+ }), ' ',
+ E('input', {
+ 'type': 'button',
+ 'class': 'cbi-button cbi-button-positive important',
+ 'click': L.bind(this.apply, this, true),
+ 'value': _('Save & Apply')
+ }), ' ',
+ E('input', {
+ 'type': 'button',
+ 'class': 'cbi-button cbi-button-reset',
+ 'click': L.bind(this.revert, this),
+ 'value': _('Revert')
+ })])])
+ ]);
+
+ for (var config in this.changes) {
+ if (!this.changes.hasOwnProperty(config))
+ continue;
+
+ list.appendChild(E('h5', '# /etc/config/%s'.format(config)));
+
+ for (var i = 0, added = null; i < this.changes[config].length; i++) {
+ var chg = this.changes[config][i],
+ tpl = this.changeTemplates['%s-%d'.format(chg[0], chg.length)];
+
+ list.appendChild(E(tpl.replace(/%([01234])/g, function(m0, m1) {
+ switch (+m1) {
+ case 0:
+ return config;
+
+ case 2:
+ if (added != null && chg[1] == added[0])
+ return '@' + added[1] + '[-1]';
+ else
+ return chg[1];
+
+ case 4:
+ return "'" + chg[3].replace(/'/g, "'\"'\"'") + "'";
+
+ default:
+ return chg[m1-1];
+ }
+ })));
+
+ if (chg[0] == 'add')
+ added = [ chg[1], chg[2] ];
+ }
+ }
+
+ list.appendChild(E('br'));
+ dlg.classList.add('uci-dialog');
+ },
+
+ displayStatus: function(type, content) {
+ if (type) {
+ var message = L.ui.showModal('', '');
+
+ message.classList.add('alert-message');
+ DOMTokenList.prototype.add.apply(message.classList, type.split(/\s+/));
+
+ if (content)
+ L.dom.content(message, content);
+
+ if (!this.was_polling) {
+ this.was_polling = L.Request.poll.active();
+ L.Request.poll.stop();
+ }
+ }
+ else {
+ L.ui.hideModal();
+
+ if (this.was_polling)
+ L.Request.poll.start();
+ }
+ },
+
+ rollback: function(checked) {
+ if (checked) {
+ this.displayStatus('warning spinning',
+ E('p', _('Failed to confirm apply within %ds, waiting for rollback…')
+ .format(L.env.apply_rollback)));
+
+ var call = function(r, data, duration) {
+ if (r.status === 204) {
+ L.ui.changes.displayStatus('warning', [
+ E('h4', _('Configuration has been rolled back!')),
+ E('p', _('The device could not be reached within %d seconds after applying the pending changes, which caused the configuration to be rolled back for safety reasons. If you believe that the configuration changes are correct nonetheless, perform an unchecked configuration apply. Alternatively, you can dismiss this warning and edit changes before attempting to apply again, or revert all pending changes to keep the currently working configuration state.').format(L.env.apply_rollback)),
+ E('div', { 'class': 'right' }, [
+ E('input', {
+ 'type': 'button',
+ 'class': 'btn',
+ 'click': L.bind(L.ui.changes.displayStatus, L.ui.changes, false),
+ 'value': _('Dismiss')
+ }), ' ',
+ E('input', {
+ 'type': 'button',
+ 'class': 'btn cbi-button-action important',
+ 'click': L.bind(L.ui.changes.revert, L.ui.changes),
+ 'value': _('Revert changes')
+ }), ' ',
+ E('input', {
+ 'type': 'button',
+ 'class': 'btn cbi-button-negative important',
+ 'click': L.bind(L.ui.changes.apply, L.ui.changes, false),
+ 'value': _('Apply unchecked')
+ })
+ ])
+ ]);
+
+ return;
+ }
+
+ var delay = isNaN(duration) ? 0 : Math.max(1000 - duration, 0);
+ window.setTimeout(function() {
+ L.Request.request(L.url('admin/uci/confirm'), {
+ method: 'post',
+ timeout: L.env.apply_timeout * 1000,
+ query: { sid: L.env.sessionid, token: L.env.token }
+ }).then(call);
+ }, delay);
+ };
+
+ call({ status: 0 });
+ }
+ else {
+ this.displayStatus('warning', [
+ E('h4', _('Device unreachable!')),
+ E('p', _('Could not regain access to the device after applying the configuration changes. You might need to reconnect if you modified network related settings such as the IP address or wireless security credentials.'))
+ ]);
+ }
+ },
+
+ confirm: function(checked, deadline, override_token) {
+ var tt;
+ var ts = Date.now();
+
+ this.displayStatus('notice');
+
+ if (override_token)
+ this.confirm_auth = { token: override_token };
+
+ var call = function(r, data, duration) {
+ if (Date.now() >= deadline) {
+ window.clearTimeout(tt);
+ L.ui.changes.rollback(checked);
+ return;
+ }
+ else if (r && (r.status === 200 || r.status === 204)) {
+ document.dispatchEvent(new CustomEvent('uci-applied'));
+
+ L.ui.changes.setIndicator(0);
+ L.ui.changes.displayStatus('notice',
+ E('p', _('Configuration has been applied.')));
+
+ window.clearTimeout(tt);
+ window.setTimeout(function() {
+ //L.ui.changes.displayStatus(false);
+ window.location = window.location.href.split('#')[0];
+ }, L.env.apply_display * 1000);
+
+ return;
+ }
+
+ var delay = isNaN(duration) ? 0 : Math.max(1000 - duration, 0);
+ window.setTimeout(function() {
+ L.Request.request(L.url('admin/uci/confirm'), {
+ method: 'post',
+ timeout: L.env.apply_timeout * 1000,
+ query: L.ui.changes.confirm_auth
+ }).then(call);
+ }, delay);
+ };
+
+ var tick = function() {
+ var now = Date.now();
+
+ L.ui.changes.displayStatus('notice spinning',
+ E('p', _('Waiting for configuration to get applied… %ds')
+ .format(Math.max(Math.floor((deadline - Date.now()) / 1000), 0))));
+
+ if (now >= deadline)
+ return;
+
+ tt = window.setTimeout(tick, 1000 - (now - ts));
+ ts = now;
+ };
+
+ tick();
+
+ /* wait a few seconds for the settings to become effective */
+ window.setTimeout(call, Math.max(L.env.apply_holdoff * 1000 - ((ts + L.env.apply_rollback * 1000) - deadline), 1));
+ },
+
+ apply: function(checked) {
+ this.displayStatus('notice spinning',
+ E('p', _('Starting configuration apply…')));
+
+ L.Request.request(L.url('admin/uci', checked ? 'apply_rollback' : 'apply_unchecked'), {
+ method: 'post',
+ query: { sid: L.env.sessionid, token: L.env.token }
+ }).then(function(r) {
+ if (r.status === (checked ? 200 : 204)) {
+ var tok = null; try { tok = r.json(); } catch(e) {}
+ if (checked && tok !== null && typeof(tok) === 'object' && typeof(tok.token) === 'string')
+ L.ui.changes.confirm_auth = tok;
+
+ L.ui.changes.confirm(checked, Date.now() + L.env.apply_rollback * 1000);
+ }
+ else if (checked && r.status === 204) {
+ L.ui.changes.displayStatus('notice',
+ E('p', _('There are no changes to apply')));
+
+ window.setTimeout(function() {
+ L.ui.changes.displayStatus(false);
+ }, L.env.apply_display * 1000);
+ }
+ else {
+ L.ui.changes.displayStatus('warning',
+ E('p', _('Apply request failed with status <code>%h</code>%>')
+ .format(r.responseText || r.statusText || r.status)));
+
+ window.setTimeout(function() {
+ L.ui.changes.displayStatus(false);
+ }, L.env.apply_display * 1000);
+ }
+ });
+ },
+
+ revert: function() {
+ this.displayStatus('notice spinning',
+ E('p', _('Reverting configuration…')));
+
+ L.Request.request(L.url('admin/uci/revert'), {
+ method: 'post',
+ query: { sid: L.env.sessionid, token: L.env.token }
+ }).then(function(r) {
+ if (r.status === 200) {
+ document.dispatchEvent(new CustomEvent('uci-reverted'));
+
+ L.ui.changes.setIndicator(0);
+ L.ui.changes.displayStatus('notice',
+ E('p', _('Changes have been reverted.')));
+
+ window.setTimeout(function() {
+ //L.ui.changes.displayStatus(false);
+ window.location = window.location.href.split('#')[0];
+ }, L.env.apply_display * 1000);
+ }
+ else {
+ L.ui.changes.displayStatus('warning',
+ E('p', _('Revert request failed with status <code>%h</code>')
+ .format(r.statusText || r.status)));
+
+ window.setTimeout(function() {
+ L.ui.changes.displayStatus(false);
+ }, L.env.apply_display * 1000);
+ }
+ });
+ }
+ }),
+
+ addValidator: function(field, type, optional, vfunc /*, ... */) {
+ if (type == null)
+ return;
+
+ var events = this.varargs(arguments, 3);
+ if (events.length == 0)
+ events.push('blur', 'keyup');
+
+ try {
+ var cbiValidator = L.validation.create(field, type, optional, vfunc),
+ validatorFn = cbiValidator.validate.bind(cbiValidator);
+
+ for (var i = 0; i < events.length; i++)
+ field.addEventListener(events[i], validatorFn);
+
+ validatorFn();
+
+ return validatorFn;
+ }
+ catch (e) { }
+ },
+
+ /* Widgets */
+ Textfield: UITextfield,
+ Checkbox: UICheckbox,
+ Select: UISelect,
+ Dropdown: UIDropdown,
+ DynamicList: UIDynamicList,
+ Combobox: UICombobox,
+ Hiddenfield: UIHiddenfield
+});
diff --git a/modules/luci-base/htdocs/luci-static/resources/validation.js b/modules/luci-base/htdocs/luci-static/resources/validation.js
new file mode 100644
index 0000000000..621e5b8bd5
--- /dev/null
+++ b/modules/luci-base/htdocs/luci-static/resources/validation.js
@@ -0,0 +1,568 @@
+'use strict';
+
+var Validator = L.Class.extend({
+ __name__: 'Validation',
+
+ __init__: function(field, type, optional, vfunc, validatorFactory) {
+ this.field = field;
+ this.optional = optional;
+ this.vfunc = vfunc;
+ this.vstack = validatorFactory.compile(type);
+ this.factory = validatorFactory;
+ },
+
+ assert: function(condition, message) {
+ if (!condition) {
+ this.field.classList.add('cbi-input-invalid');
+ this.error = message;
+ return false;
+ }
+
+ this.field.classList.remove('cbi-input-invalid');
+ this.error = null;
+ return true;
+ },
+
+ apply: function(name, value, args) {
+ var func;
+
+ if (typeof(name) === 'function')
+ func = name;
+ else if (typeof(this.factory.types[name]) === 'function')
+ func = this.factory.types[name];
+ else
+ return false;
+
+ if (value != null)
+ this.value = value;
+
+ return func.apply(this, args);
+ },
+
+ validate: function() {
+ /* element is detached */
+ if (!findParent(this.field, 'body') && !findParent(this.field, '[data-field]'))
+ return true;
+
+ this.field.classList.remove('cbi-input-invalid');
+ this.value = (this.field.value != null) ? this.field.value : '';
+ this.error = null;
+
+ var valid;
+
+ if (this.value.length === 0)
+ valid = this.assert(this.optional, _('non-empty value'));
+ else
+ valid = this.vstack[0].apply(this, this.vstack[1]);
+
+ if (valid !== true) {
+ this.field.setAttribute('data-tooltip', _('Expecting: %s').format(this.error));
+ this.field.setAttribute('data-tooltip-style', 'error');
+ this.field.dispatchEvent(new CustomEvent('validation-failure', { bubbles: true }));
+ return false;
+ }
+
+ if (typeof(this.vfunc) == 'function')
+ valid = this.vfunc(this.value);
+
+ if (valid !== true) {
+ this.assert(false, valid);
+ this.field.setAttribute('data-tooltip', valid);
+ this.field.setAttribute('data-tooltip-style', 'error');
+ this.field.dispatchEvent(new CustomEvent('validation-failure', { bubbles: true }));
+ return false;
+ }
+
+ this.field.removeAttribute('data-tooltip');
+ this.field.removeAttribute('data-tooltip-style');
+ this.field.dispatchEvent(new CustomEvent('validation-success', { bubbles: true }));
+ return true;
+ },
+
+});
+
+var ValidatorFactory = L.Class.extend({
+ __name__: 'ValidatorFactory',
+
+ create: function(field, type, optional, vfunc) {
+ return new Validator(field, type, optional, vfunc, this);
+ },
+
+ compile: function(code) {
+ var pos = 0;
+ var esc = false;
+ var depth = 0;
+ var stack = [ ];
+
+ code += ',';
+
+ for (var i = 0; i < code.length; i++) {
+ if (esc) {
+ esc = false;
+ continue;
+ }
+
+ switch (code.charCodeAt(i))
+ {
+ case 92:
+ esc = true;
+ break;
+
+ case 40:
+ case 44:
+ if (depth <= 0) {
+ if (pos < i) {
+ var label = code.substring(pos, i);
+ label = label.replace(/\\(.)/g, '$1');
+ label = label.replace(/^[ \t]+/g, '');
+ label = label.replace(/[ \t]+$/g, '');
+
+ if (label && !isNaN(label)) {
+ stack.push(parseFloat(label));
+ }
+ else if (label.match(/^(['"]).*\1$/)) {
+ stack.push(label.replace(/^(['"])(.*)\1$/, '$2'));
+ }
+ else if (typeof this.types[label] == 'function') {
+ stack.push(this.types[label]);
+ stack.push(null);
+ }
+ else {
+ L.raise('SyntaxError', 'Unhandled token "%s"', label);
+ }
+ }
+
+ pos = i+1;
+ }
+
+ depth += (code.charCodeAt(i) == 40);
+ break;
+
+ case 41:
+ if (--depth <= 0) {
+ if (typeof stack[stack.length-2] != 'function')
+ L.raise('SyntaxError', 'Argument list follows non-function');
+
+ stack[stack.length-1] = this.compile(code.substring(pos, i));
+ pos = i+1;
+ }
+
+ break;
+ }
+ }
+
+ return stack;
+ },
+
+ parseInteger: function(x) {
+ return (/^-?\d+$/.test(x) ? +x : NaN);
+ },
+
+ parseDecimal: function(x) {
+ return (/^-?\d+(?:\.\d+)?$/.test(x) ? +x : NaN);
+ },
+
+ parseIPv4: function(x) {
+ if (!x.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/))
+ return null;
+
+ if (RegExp.$1 > 255 || RegExp.$2 > 255 || RegExp.$3 > 255 || RegExp.$4 > 255)
+ return null;
+
+ return [ +RegExp.$1, +RegExp.$2, +RegExp.$3, +RegExp.$4 ];
+ },
+
+ parseIPv6: function(x) {
+ if (x.match(/^([a-fA-F0-9:]+):(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/)) {
+ var v6 = RegExp.$1, v4 = this.parseIPv4(RegExp.$2);
+
+ if (!v4)
+ return null;
+
+ x = v6 + ':' + (v4[0] * 256 + v4[1]).toString(16)
+ + ':' + (v4[2] * 256 + v4[3]).toString(16);
+ }
+
+ if (!x.match(/^[a-fA-F0-9:]+$/))
+ return null;
+
+ var prefix_suffix = x.split(/::/);
+
+ if (prefix_suffix.length > 2)
+ return null;
+
+ var prefix = (prefix_suffix[0] || '0').split(/:/);
+ var suffix = prefix_suffix.length > 1 ? (prefix_suffix[1] || '0').split(/:/) : [];
+
+ if (suffix.length ? (prefix.length + suffix.length > 7)
+ : ((prefix_suffix.length < 2 && prefix.length < 8) || prefix.length > 8))
+ return null;
+
+ var i, word;
+ var words = [];
+
+ for (i = 0, word = parseInt(prefix[0], 16); i < prefix.length; word = parseInt(prefix[++i], 16))
+ if (prefix[i].length <= 4 && !isNaN(word) && word <= 0xFFFF)
+ words.push(word);
+ else
+ return null;
+
+ for (i = 0; i < (8 - prefix.length - suffix.length); i++)
+ words.push(0);
+
+ for (i = 0, word = parseInt(suffix[0], 16); i < suffix.length; word = parseInt(suffix[++i], 16))
+ if (suffix[i].length <= 4 && !isNaN(word) && word <= 0xFFFF)
+ words.push(word);
+ else
+ return null;
+
+ return words;
+ },
+
+ types: {
+ integer: function() {
+ return this.assert(this.factory.parseInteger(this.value) !== NaN, _('valid integer value'));
+ },
+
+ uinteger: function() {
+ return this.assert(this.factory.parseInteger(this.value) >= 0, _('positive integer value'));
+ },
+
+ float: function() {
+ return this.assert(this.factory.parseDecimal(this.value) !== NaN, _('valid decimal value'));
+ },
+
+ ufloat: function() {
+ return this.assert(this.factory.parseDecimal(this.value) >= 0, _('positive decimal value'));
+ },
+
+ ipaddr: function(nomask) {
+ return this.assert(this.apply('ip4addr', null, [nomask]) || this.apply('ip6addr', null, [nomask]),
+ nomask ? _('valid IP address') : _('valid IP address or prefix'));
+ },
+
+ ip4addr: function(nomask) {
+ var re = nomask ? /^(\d+\.\d+\.\d+\.\d+)$/ : /^(\d+\.\d+\.\d+\.\d+)(?:\/(\d+\.\d+\.\d+\.\d+)|\/(\d{1,2}))?$/,
+ m = this.value.match(re);
+
+ return this.assert(m && this.factory.parseIPv4(m[1]) && (m[2] ? this.factory.parseIPv4(m[2]) : (m[3] ? this.apply('ip4prefix', m[3]) : true)),
+ nomask ? _('valid IPv4 address') : _('valid IPv4 address or network'));
+ },
+
+ ip6addr: function(nomask) {
+ var re = nomask ? /^([0-9a-fA-F:.]+)$/ : /^([0-9a-fA-F:.]+)(?:\/(\d{1,3}))?$/,
+ m = this.value.match(re);
+
+ return this.assert(m && this.factory.parseIPv6(m[1]) && (m[2] ? this.apply('ip6prefix', m[2]) : true),
+ nomask ? _('valid IPv6 address') : _('valid IPv6 address or prefix'));
+ },
+
+ ip4prefix: function() {
+ return this.assert(!isNaN(this.value) && this.value >= 0 && this.value <= 32,
+ _('valid IPv4 prefix value (0-32)'));
+ },
+
+ ip6prefix: function() {
+ return this.assert(!isNaN(this.value) && this.value >= 0 && this.value <= 128,
+ _('valid IPv6 prefix value (0-128)'));
+ },
+
+ cidr: function() {
+ return this.assert(this.apply('cidr4') || this.apply('cidr6'), _('valid IPv4 or IPv6 CIDR'));
+ },
+
+ cidr4: function() {
+ var m = this.value.match(/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\/(\d{1,2})$/);
+ return this.assert(m && this.factory.parseIPv4(m[1]) && this.apply('ip4prefix', m[2]), _('valid IPv4 CIDR'));
+ },
+
+ cidr6: function() {
+ var m = this.value.match(/^([0-9a-fA-F:.]+)\/(\d{1,3})$/);
+ return this.assert(m && this.factory.parseIPv6(m[1]) && this.apply('ip6prefix', m[2]), _('valid IPv6 CIDR'));
+ },
+
+ ipnet4: function() {
+ var m = this.value.match(/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/);
+ return this.assert(m && this.factory.parseIPv4(m[1]) && this.factory.parseIPv4(m[2]), _('IPv4 network in address/netmask notation'));
+ },
+
+ ipnet6: function() {
+ var m = this.value.match(/^([0-9a-fA-F:.]+)\/([0-9a-fA-F:.]+)$/);
+ return this.assert(m && this.factory.parseIPv6(m[1]) && this.factory.parseIPv6(m[2]), _('IPv6 network in address/netmask notation'));
+ },
+
+ ip6hostid: function() {
+ if (this.value == "eui64" || this.value == "random")
+ return true;
+
+ var v6 = this.factory.parseIPv6(this.value);
+ return this.assert(!(!v6 || v6[0] || v6[1] || v6[2] || v6[3]), _('valid IPv6 host id'));
+ },
+
+ ipmask: function() {
+ return this.assert(this.apply('ipmask4') || this.apply('ipmask6'),
+ _('valid network in address/netmask notation'));
+ },
+
+ ipmask4: function() {
+ return this.assert(this.apply('cidr4') || this.apply('ipnet4') || this.apply('ip4addr'),
+ _('valid IPv4 network'));
+ },
+
+ ipmask6: function() {
+ return this.assert(this.apply('cidr6') || this.apply('ipnet6') || this.apply('ip6addr'),
+ _('valid IPv6 network'));
+ },
+
+ port: function() {
+ var p = this.factory.parseInteger(this.value);
+ return this.assert(p >= 0 && p <= 65535, _('valid port value'));
+ },
+
+ portrange: function() {
+ if (this.value.match(/^(\d+)-(\d+)$/)) {
+ var p1 = +RegExp.$1;
+ var p2 = +RegExp.$2;
+ return this.assert(p1 <= p2 && p2 <= 65535,
+ _('valid port or port range (port1-port2)'));
+ }
+
+ return this.assert(this.apply('port'), _('valid port or port range (port1-port2)'));
+ },
+
+ macaddr: function() {
+ return this.assert(this.value.match(/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/) != null,
+ _('valid MAC address'));
+ },
+
+ host: function(ipv4only) {
+ return this.assert(this.apply('hostname') || this.apply(ipv4only == 1 ? 'ip4addr' : 'ipaddr'),
+ _('valid hostname or IP address'));
+ },
+
+ hostname: function(strict) {
+ if (this.value.length <= 253)
+ return this.assert(
+ (this.value.match(/^[a-zA-Z0-9_]+$/) != null ||
+ (this.value.match(/^[a-zA-Z0-9_][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$/) &&
+ this.value.match(/[^0-9.]/))) &&
+ (!strict || !this.value.match(/^_/)),
+ _('valid hostname'));
+
+ return this.assert(false, _('valid hostname'));
+ },
+
+ network: function() {
+ return this.assert(this.apply('uciname') || this.apply('host'),
+ _('valid UCI identifier, hostname or IP address'));
+ },
+
+ hostport: function(ipv4only) {
+ var hp = this.value.split(/:/);
+ return this.assert(hp.length == 2 && this.apply('host', hp[0], [ipv4only]) && this.apply('port', hp[1]),
+ _('valid host:port'));
+ },
+
+ ip4addrport: function() {
+ var hp = this.value.split(/:/);
+ return this.assert(hp.length == 2 && this.apply('ip4addr', hp[0], [true]) && this.apply('port', hp[1]),
+ _('valid IPv4 address:port'));
+ },
+
+ ipaddrport: function(bracket) {
+ var m4 = this.value.match(/^([^\[\]:]+):(\d+)$/),
+ m6 = this.value.match((bracket == 1) ? /^\[(.+)\]:(\d+)$/ : /^([^\[\]]+):(\d+)$/);
+
+ if (m4)
+ return this.assert(this.apply('ip4addr', m4[1], [true]) && this.apply('port', m4[2]),
+ _('valid address:port'));
+
+ return this.assert(m6 && this.apply('ip6addr', m6[1], [true]) && this.apply('port', m6[2]),
+ _('valid address:port'));
+ },
+
+ wpakey: function() {
+ var v = this.value;
+
+ if (v.length == 64)
+ return this.assert(v.match(/^[a-fA-F0-9]{64}$/), _('valid hexadecimal WPA key'));
+
+ return this.assert((v.length >= 8) && (v.length <= 63), _('key between 8 and 63 characters'));
+ },
+
+ wepkey: function() {
+ var v = this.value;
+
+ if (v.substr(0, 2) === 's:')
+ v = v.substr(2);
+
+ if ((v.length == 10) || (v.length == 26))
+ return this.assert(v.match(/^[a-fA-F0-9]{10,26}$/), _('valid hexadecimal WEP key'));
+
+ return this.assert((v.length === 5) || (v.length === 13), _('key with either 5 or 13 characters'));
+ },
+
+ uciname: function() {
+ return this.assert(this.value.match(/^[a-zA-Z0-9_]+$/), _('valid UCI identifier'));
+ },
+
+ range: function(min, max) {
+ var val = this.factory.parseDecimal(this.value);
+ return this.assert(val >= +min && val <= +max, _('value between %f and %f').format(min, max));
+ },
+
+ min: function(min) {
+ return this.assert(this.factory.parseDecimal(this.value) >= +min, _('value greater or equal to %f').format(min));
+ },
+
+ max: function(max) {
+ return this.assert(this.factory.parseDecimal(this.value) <= +max, _('value smaller or equal to %f').format(max));
+ },
+
+ rangelength: function(min, max) {
+ var val = '' + this.value;
+ return this.assert((val.length >= +min) && (val.length <= +max),
+ _('value between %d and %d characters').format(min, max));
+ },
+
+ minlength: function(min) {
+ return this.assert((''+this.value).length >= +min,
+ _('value with at least %d characters').format(min));
+ },
+
+ maxlength: function(max) {
+ return this.assert((''+this.value).length <= +max,
+ _('value with at most %d characters').format(max));
+ },
+
+ or: function() {
+ var errors = [];
+
+ for (var i = 0; i < arguments.length; i += 2) {
+ if (typeof arguments[i] != 'function') {
+ if (arguments[i] == this.value)
+ return this.assert(true);
+ errors.push('"%s"'.format(arguments[i]));
+ i--;
+ }
+ else if (arguments[i].apply(this, arguments[i+1])) {
+ return this.assert(true);
+ }
+ else {
+ errors.push(this.error);
+ }
+ }
+
+ var t = _('One of the following: %s');
+
+ return this.assert(false, t.format('\n - ' + errors.join('\n - ')));
+ },
+
+ and: function() {
+ for (var i = 0; i < arguments.length; i += 2) {
+ if (typeof arguments[i] != 'function') {
+ if (arguments[i] != this.value)
+ return this.assert(false, '"%s"'.format(arguments[i]));
+ i--;
+ }
+ else if (!arguments[i].apply(this, arguments[i+1])) {
+ return this.assert(false, this.error);
+ }
+ }
+
+ return this.assert(true);
+ },
+
+ neg: function() {
+ this.value = this.value.replace(/^[ \t]*![ \t]*/, '');
+
+ if (arguments[0].apply(this, arguments[1]))
+ return this.assert(true);
+
+ return this.assert(false, _('Potential negation of: %s').format(this.error));
+ },
+
+ list: function(subvalidator, subargs) {
+ this.field.setAttribute('data-is-list', 'true');
+
+ var tokens = this.value.match(/[^ \t]+/g);
+ for (var i = 0; i < tokens.length; i++)
+ if (!this.apply(subvalidator, tokens[i], subargs))
+ return this.assert(false, this.error);
+
+ return this.assert(true);
+ },
+
+ phonedigit: function() {
+ return this.assert(this.value.match(/^[0-9\*#!\.]+$/),
+ _('valid phone digit (0-9, "*", "#", "!" or ".")'));
+ },
+
+ timehhmmss: function() {
+ return this.assert(this.value.match(/^[0-6][0-9]:[0-6][0-9]:[0-6][0-9]$/),
+ _('valid time (HH:MM:SS)'));
+ },
+
+ dateyyyymmdd: function() {
+ if (this.value.match(/^(\d\d\d\d)-(\d\d)-(\d\d)/)) {
+ var year = +RegExp.$1,
+ month = +RegExp.$2,
+ day = +RegExp.$3,
+ days_in_month = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
+
+ function is_leap_year(year) {
+ return ((!(year % 4) && (year % 100)) || !(year % 400));
+ }
+
+ function get_days_in_month(month, year) {
+ return (month === 2 && is_leap_year(year)) ? 29 : days_in_month[month - 1];
+ }
+
+ /* Firewall rules in the past don't make sense */
+ return this.assert(year >= 2015 && month && month <= 12 && day && day <= get_days_in_month(month, year),
+ _('valid date (YYYY-MM-DD)'));
+
+ }
+
+ return this.assert(false, _('valid date (YYYY-MM-DD)'));
+ },
+
+ unique: function(subvalidator, subargs) {
+ var ctx = this,
+ option = findParent(ctx.field, '[data-type][data-name]'),
+ section = findParent(option, '.cbi-section'),
+ query = '[data-type="%s"][data-name="%s"]'.format(option.getAttribute('data-type'), option.getAttribute('data-name')),
+ unique = true;
+
+ section.querySelectorAll(query).forEach(function(sibling) {
+ if (sibling === option)
+ return;
+
+ var input = sibling.querySelector('[data-type]'),
+ values = input ? (input.getAttribute('data-is-list') ? input.value.match(/[^ \t]+/g) : [ input.value ]) : null;
+
+ if (values !== null && values.indexOf(ctx.value) !== -1)
+ unique = false;
+ });
+
+ if (!unique)
+ return this.assert(false, _('unique value'));
+
+ if (typeof(subvalidator) === 'function')
+ return this.apply(subvalidator, null, subargs);
+
+ return this.assert(true);
+ },
+
+ hexstring: function() {
+ return this.assert(this.value.match(/^([a-f0-9][a-f0-9]|[A-F0-9][A-F0-9])+$/),
+ _('hexadecimal encoded value'));
+ },
+
+ string: function() {
+ return true;
+ }
+ }
+});
+
+return ValidatorFactory;
diff --git a/modules/luci-base/htdocs/luci-static/resources/xhr.js b/modules/luci-base/htdocs/luci-static/resources/xhr.js
index 3133898b5e..10bc88e1f4 100644
--- a/modules/luci-base/htdocs/luci-static/resources/xhr.js
+++ b/modules/luci-base/htdocs/luci-static/resources/xhr.js
@@ -1,250 +1 @@
-/*
- * xhr.js - XMLHttpRequest helper class
- * (c) 2008-2018 Jo-Philipp Wich <jo@mein.io>
- */
-
-XHR.prototype = {
- _encode: function(obj) {
- obj = obj ? obj : { };
- obj['_'] = Math.random();
-
- if (typeof obj == 'object') {
- var code = '';
- var self = this;
-
- for (var k in obj)
- code += (code ? '&' : '') +
- k + '=' + encodeURIComponent(obj[k]);
-
- return code;
- }
-
- return obj;
- },
-
- _response: function(callback, ts) {
- if (this._xmlHttp.readyState !== 4)
- return;
-
- var status = this._xmlHttp.status,
- login = this._xmlHttp.getResponseHeader("X-LuCI-Login-Required"),
- type = this._xmlHttp.getResponseHeader("Content-Type"),
- json = null;
-
- if (status === 403 && login === 'yes') {
- XHR.halt();
-
- showModal(_('Session expired'), [
- E('div', { class: 'alert-message warning' },
- _('A new login is required since the authentication session expired.')),
- E('div', { class: 'right' },
- E('div', {
- class: 'btn primary',
- click: function() {
- var loc = window.location;
- window.location = loc.protocol + '//' + loc.host + loc.pathname + loc.search;
- }
- }, _('To login…')))
- ]);
- }
- else if (type && type.toLowerCase().match(/^application\/json\b/)) {
- try {
- json = JSON.parse(this._xmlHttp.responseText);
- }
- catch(e) {
- json = null;
- }
- }
-
- callback(this._xmlHttp, json, Date.now() - ts);
- },
-
- busy: function() {
- if (!this._xmlHttp)
- return false;
-
- switch (this._xmlHttp.readyState)
- {
- case 1:
- case 2:
- case 3:
- return true;
-
- default:
- return false;
- }
- },
-
- abort: function() {
- if (this.busy())
- this._xmlHttp.abort();
- },
-
- get: function(url, data, callback, timeout) {
- this._xmlHttp = new XMLHttpRequest();
-
- var xhr = this._xmlHttp,
- code = this._encode(data);
-
- url = location.protocol + '//' + location.host + url;
-
- if (code)
- if (url.substr(url.length-1,1) == '&')
- url += code;
- else
- url += '?' + code;
-
- xhr.open('GET', url, true);
-
- if (!isNaN(timeout))
- xhr.timeout = timeout;
-
- xhr.onreadystatechange = this._response.bind(this, callback, Date.now());
- xhr.send(null);
- },
-
- post: function(url, data, callback, timeout) {
- this._xmlHttp = new XMLHttpRequest();
-
- var xhr = this._xmlHttp,
- code = this._encode(data);
-
- xhr.open('POST', url, true);
-
- if (!isNaN(timeout))
- xhr.timeout = timeout;
-
- xhr.onreadystatechange = this._response.bind(this, callback, Date.now());
- xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
- xhr.send(code);
- },
-
- cancel: function() {
- this._xmlHttp.onreadystatechange = function() {};
- this._xmlHttp.abort();
- },
-
- send_form: function(form, callback, extra_values) {
- var code = '';
-
- for (var i = 0; i < form.elements.length; i++) {
- var e = form.elements[i];
-
- if (e.options) {
- code += (code ? '&' : '') +
- form.elements[i].name + '=' + encodeURIComponent(
- e.options[e.selectedIndex].value
- );
- }
- else if (e.length) {
- for (var j = 0; j < e.length; j++)
- if (e[j].name) {
- code += (code ? '&' : '') +
- e[j].name + '=' + encodeURIComponent(e[j].value);
- }
- }
- else {
- code += (code ? '&' : '') +
- e.name + '=' + encodeURIComponent(e.value);
- }
- }
-
- if (typeof extra_values == 'object')
- for (var key in extra_values)
- code += (code ? '&' : '') +
- key + '=' + encodeURIComponent(extra_values[key]);
-
- return (form.method == 'get'
- ? this.get(form.getAttribute('action'), code, callback)
- : this.post(form.getAttribute('action'), code, callback));
- }
-}
-
-XHR.get = function(url, data, callback) {
- (new XHR()).get(url, data, callback);
-}
-
-XHR.post = function(url, data, callback) {
- (new XHR()).post(url, data, callback);
-}
-
-XHR.poll = function(interval, url, data, callback, post) {
- if (isNaN(interval) || interval <= 0)
- interval = L.env.pollinterval;
-
- if (!XHR._q) {
- XHR._t = 0;
- XHR._q = [ ];
- XHR._r = function() {
- for (var i = 0, e = XHR._q[0]; i < XHR._q.length; e = XHR._q[++i])
- {
- if (!(XHR._t % e.interval) && !e.xhr.busy())
- e.xhr[post ? 'post' : 'get'](e.url, e.data, e.callback, e.interval * 1000 * 5 - 5);
- }
-
- XHR._t++;
- };
- }
-
- var e = {
- interval: interval,
- callback: callback,
- url: url,
- data: data,
- xhr: new XHR()
- };
-
- XHR._q.push(e);
-
- return e;
-}
-
-XHR.stop = function(e) {
- for (var i = 0; XHR._q && XHR._q[i]; i++) {
- if (XHR._q[i] === e) {
- e.xhr.cancel();
- XHR._q.splice(i, 1);
- return true;
- }
- }
-
- return false;
-}
-
-XHR.halt = function() {
- if (XHR._i) {
- /* show & set poll indicator */
- try {
- document.getElementById('xhr_poll_status').style.display = '';
- document.getElementById('xhr_poll_status_on').style.display = 'none';
- document.getElementById('xhr_poll_status_off').style.display = '';
- } catch(e) { }
-
- window.clearInterval(XHR._i);
- XHR._i = null;
- }
-}
-
-XHR.run = function() {
- if (XHR._r && !XHR._i) {
- /* show & set poll indicator */
- try {
- document.getElementById('xhr_poll_status').style.display = '';
- document.getElementById('xhr_poll_status_on').style.display = '';
- document.getElementById('xhr_poll_status_off').style.display = 'none';
- } catch(e) { }
-
- /* kick first round manually to prevent one second lag when setting up
- * the poll interval */
- XHR._r();
- XHR._i = window.setInterval(XHR._r, 1000);
- }
-}
-
-XHR.running = function() {
- return !!(XHR._r && XHR._i);
-}
-
-function XHR() {}
-
-document.addEventListener('DOMContentLoaded', XHR.run);
+/* replaced by luci.js */
diff --git a/modules/luci-base/luasrc/cbi.lua b/modules/luci-base/luasrc/cbi.lua
index 971830fe81..450e413916 100644
--- a/modules/luci-base/luasrc/cbi.lua
+++ b/modules/luci-base/luasrc/cbi.lua
@@ -1347,6 +1347,18 @@ function AbstractValue.deplist2json(self, section, deplist)
return util.serialize_json(deps)
end
+-- Serialize choices
+function AbstractValue.choices(self)
+ if type(self.keylist) == "table" and #self.keylist > 0 then
+ local i, k, v = nil, nil, {}
+ for i, k in ipairs(self.keylist) do
+ v[k] = self.vallist[i] or k
+ end
+ return v
+ end
+ return nil
+end
+
-- Generates the unique CBID
function AbstractValue.cbid(self, section)
return "cbid."..self.map.config.."."..section.."."..self.option
diff --git a/modules/luci-base/luasrc/controller/admin/index.lua b/modules/luci-base/luasrc/controller/admin/index.lua
index 1f7db0cb38..9fcfe4a309 100644
--- a/modules/luci-base/luasrc/controller/admin/index.lua
+++ b/modules/luci-base/luasrc/controller/admin/index.lua
@@ -88,6 +88,9 @@ function index()
page = entry({"admin", "translations"}, call("action_translations"), nil)
page.leaf = true
+ page = entry({"admin", "ubus"}, call("action_ubus"), nil)
+ page.leaf = true
+
-- Logout is last
entry({"admin", "logout"}, call("action_logout"), _("Logout"), 999)
end
@@ -129,6 +132,124 @@ function action_translations(lang)
http.write_json(i18n.dump())
end
+local function ubus_reply(id, data, code, errmsg)
+ local reply = { jsonrpc = "2.0", id = id }
+ if errmsg then
+ reply.error = {
+ code = code,
+ message = errmsg
+ }
+ else
+ reply.result = { code, data }
+ end
+
+ return reply
+end
+
+local ubus_types = {
+ nil,
+ "array",
+ "object",
+ "string",
+ nil, -- INT64
+ "number",
+ nil, -- INT16,
+ "boolean",
+ "double"
+}
+
+local function ubus_request(req)
+ if type(req) ~= "table" or type(req.method) ~= "string" or type(req.params) ~= "table" or
+ #req.params < 2 or req.jsonrpc ~= "2.0" or req.id == nil then
+ return ubus_reply(nil, nil, -32600, "Invalid request")
+
+ elseif req.method == "call" then
+ local sid, obj, fun, arg =
+ req.params[1], req.params[2], req.params[3], req.params[4] or {}
+ if type(arg) ~= "table" or arg.ubus_rpc_session ~= nil then
+ return ubus_reply(req.id, nil, -32602, "Invalid parameters")
+ end
+
+ if sid == "00000000000000000000000000000000" then
+ sid = luci.dispatcher.context.authsession
+ end
+
+ arg.ubus_rpc_session = sid
+
+ local res, code = luci.util.ubus(obj, fun, arg)
+ return ubus_reply(req.id, res, code or 0)
+
+ elseif req.method == "list" then
+ if type(params) ~= "table" or #params == 0 then
+ local objs = { luci.util.ubus() }
+ return ubus_reply(req.id, objs, 0)
+ else
+ local n, rv = nil, {}
+ for n = 1, #params do
+ if type(params[n]) ~= "string" then
+ return ubus_reply(req.id, nil, -32602, "Invalid parameters")
+ end
+
+ local sig = luci.util.ubus(params[n])
+ if sig and type(sig) == "table" then
+ rv[params[n]] = {}
+
+ local m, p
+ for m, p in pairs(sig) do
+ if type(p) == "table" then
+ rv[params[n]][m] = {}
+
+ local pn, pt
+ for pn, pt in pairs(p) do
+ rv[params[n]][m][pn] = ubus_types[pt] or "unknown"
+ end
+ end
+ end
+ end
+ end
+ return ubus_reply(req.id, rv, 0)
+ end
+ end
+
+ return ubus_reply(req.id, nil, -32601, "Method not found")
+end
+
+function action_ubus()
+ local parser = require "luci.jsonc".new()
+
+ luci.http.context.request:setfilehandler(function(_, s)
+ if not s then
+ return nil
+ end
+
+ local ok, err = parser:parse(s)
+ return (not err or nil)
+ end)
+
+ luci.http.context.request:content()
+
+ local json = parser:get()
+ if json == nil or type(json) ~= "table" then
+ luci.http.prepare_content("application/json")
+ luci.http.write_json(ubus_reply(nil, nil, -32700, "Parse error"))
+ return
+ end
+
+ local response
+ if #json == 0 then
+ response = ubus_request(json)
+ else
+ response = {}
+
+ local _, request
+ for _, request in ipairs(json) do
+ response[_] = ubus_request(request)
+ end
+ end
+
+ luci.http.prepare_content("application/json")
+ luci.http.write_json(response)
+end
function lease_status()
local s = require "luci.tools.status"
diff --git a/modules/luci-base/luasrc/controller/admin/uci.lua b/modules/luci-base/luasrc/controller/admin/uci.lua
index 1d955dd982..6b19c62f81 100644
--- a/modules/luci-base/luasrc/controller/admin/uci.lua
+++ b/modules/luci-base/luasrc/controller/admin/uci.lua
@@ -1,5 +1,5 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2010-2015 Jo-Philipp Wich <jow@openwrt.org>
+-- Copyright 2010-2019 Jo-Philipp Wich <jo@mein.io>
-- Licensed to the public under the Apache License 2.0.
module("luci.controller.admin.uci", package.seeall)
@@ -9,8 +9,7 @@ function index()
or table.concat(luci.dispatcher.context.request, "/")
entry({"admin", "uci"}, nil, _("Configuration"))
- entry({"admin", "uci", "changes"}, post_on({ trigger_apply = true }, "action_changes"), _("Changes"), 40).query = {redir=redir}
- entry({"admin", "uci", "revert"}, post("action_revert"), _("Revert"), 30).query = {redir=redir}
+ entry({"admin", "uci", "revert"}, post("action_revert"), nil)
local node
local authen = function(checkpass, allowed_users)
@@ -31,34 +30,6 @@ function index()
end
-function action_changes()
- local uci = require "luci.model.uci"
- local changes = uci:changes()
-
- luci.template.render("admin_uci/changes", {
- changes = next(changes) and changes,
- timeout = timeout,
- trigger_apply = luci.http.formvalue("trigger_apply") and true or false
- })
-end
-
-function action_revert()
- local uci = require "luci.model.uci"
- local changes = uci:changes()
-
- -- Collect files to be reverted
- local r, tbl
- for r, tbl in pairs(changes) do
- uci:revert(r)
- end
-
- luci.template.render("admin_uci/revert", {
- changes = next(changes) and changes,
- trigger_revert = true
- })
-end
-
-
local function ubus_state_to_http(errstr)
local map = {
["Invalid command"] = 400,
@@ -107,3 +78,19 @@ function action_confirm()
local _, errstr = uci:confirm(token)
ubus_state_to_http(errstr)
end
+
+function action_revert()
+ local uci = require "luci.model.uci"
+ local changes = uci:changes()
+
+ -- Collect files to be reverted
+ local _, errstr, r, tbl
+ for r, tbl in pairs(changes) do
+ _, errstr = uci:revert(r)
+ if errstr then
+ break
+ end
+ end
+
+ ubus_state_to_http(errstr or "OK")
+end
diff --git a/modules/luci-base/luasrc/dispatcher.lua b/modules/luci-base/luasrc/dispatcher.lua
index 626a46dfd2..e8106b741d 100644
--- a/modules/luci-base/luasrc/dispatcher.lua
+++ b/modules/luci-base/luasrc/dispatcher.lua
@@ -857,6 +857,15 @@ function template(name)
end
+local _view = function(self, ...)
+ require "luci.template".render("view", { view = self.view })
+end
+
+function view(name)
+ return {type = "view", view = name, target = _view}
+end
+
+
local function _cbi(self, ...)
local cbi = require "luci.cbi"
local tpl = require "luci.template"
diff --git a/modules/luci-base/luasrc/sys.lua b/modules/luci-base/luasrc/sys.lua
index bb4c67fe88..d0df275724 100644
--- a/modules/luci-base/luasrc/sys.lua
+++ b/modules/luci-base/luasrc/sys.lua
@@ -443,11 +443,11 @@ function process.list()
for line in ps do
local pid, ppid, user, stat, vsz, mem, cpu, cmd = line:match(
- "^ *(%d+) +(%d+) +(%S.-%S) +([RSDZTW][W ][<N ]) +(%d+) +(%d+%%) +(%d+%%) +(.+)"
+ "^ *(%d+) +(%d+) +(%S.-%S) +([RSDZTW][<NW ][<N ]) +(%d+) +(%d+%%) +(%d+%%) +(.+)"
)
local idx = tonumber(pid)
- if idx then
+ if idx and not cmd:match("top %-bn1") then
data[idx] = {
['PID'] = pid,
['PPID'] = ppid,
@@ -659,3 +659,11 @@ end
function init.stop(name)
return (init_action("stop", name) == 0)
end
+
+function init.restart(name)
+ return (init_action("restart", name) == 0)
+end
+
+function init.reload(name)
+ return (init_action("reload", name) == 0)
+end
diff --git a/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua b/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua
index 39fd4a3c89..eec91820a3 100644
--- a/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua
+++ b/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua
@@ -16,12 +16,14 @@ TZ = {
{ 'Africa/Brazzaville', 'WAT-1' },
{ 'Africa/Bujumbura', 'CAT-2' },
{ 'Africa/Cairo', 'EET-2' },
+ { 'Africa/Casablanca', '<+01>-1' },
{ 'Africa/Ceuta', 'CET-1CEST,M3.5.0,M10.5.0/3' },
{ 'Africa/Conakry', 'GMT0' },
{ 'Africa/Dakar', 'GMT0' },
{ 'Africa/Dar es Salaam', 'EAT-3' },
{ 'Africa/Djibouti', 'EAT-3' },
{ 'Africa/Douala', 'WAT-1' },
+ { 'Africa/El Aaiun', '<+01>-1' },
{ 'Africa/Freetown', 'GMT0' },
{ 'Africa/Gaborone', 'CAT-2' },
{ 'Africa/Harare', 'CAT-2' },
@@ -83,7 +85,7 @@ TZ = {
{ 'America/Bogota', '<-05>5' },
{ 'America/Boise', 'MST7MDT,M3.2.0,M11.1.0' },
{ 'America/Cambridge Bay', 'MST7MDT,M3.2.0,M11.1.0' },
- { 'America/Campo Grande', '<-04>4<-03>,M11.1.0/0,M2.3.0/0' },
+ { 'America/Campo Grande', '<-04>4' },
{ 'America/Cancun', 'EST5' },
{ 'America/Caracas', '<-04>4' },
{ 'America/Cayenne', '<-03>3' },
@@ -92,7 +94,7 @@ TZ = {
{ 'America/Chihuahua', 'MST7MDT,M4.1.0,M10.5.0' },
{ 'America/Costa Rica', 'CST6' },
{ 'America/Creston', 'MST7' },
- { 'America/Cuiaba', '<-04>4<-03>,M11.1.0/0,M2.3.0/0' },
+ { 'America/Cuiaba', '<-04>4' },
{ 'America/Curacao', 'AST4' },
{ 'America/Danmarkshavn', 'GMT0' },
{ 'America/Dawson', 'PST8PDT,M3.2.0,M11.1.0' },
@@ -179,7 +181,7 @@ TZ = {
{ 'America/Santarem', '<-03>3' },
{ 'America/Santiago', '<-04>4<-03>,M9.1.6/24,M4.1.6/24' },
{ 'America/Santo Domingo', 'AST4' },
- { 'America/Sao Paulo', '<-03>3<-02>,M11.1.0/0,M2.3.0/0' },
+ { 'America/Sao Paulo', '<-03>3' },
{ 'America/Scoresbysund', '<-01>1<+00>,M3.5.0/0,M10.5.0/1' },
{ 'America/Sitka', 'AKST9AKDT,M3.2.0,M11.1.0' },
{ 'America/St Barthelemy', 'AST4' },
@@ -237,8 +239,8 @@ TZ = {
{ 'Asia/Dubai', '<+04>-4' },
{ 'Asia/Dushanbe', '<+05>-5' },
{ 'Asia/Famagusta', 'EET-2EEST,M3.5.0/3,M10.5.0/4' },
- { 'Asia/Gaza', 'EET-2EEST,M3.4.6/1,M10.5.6/1' },
- { 'Asia/Hebron', 'EET-2EEST,M3.4.6/1,M10.5.6/1' },
+ { 'Asia/Gaza', 'EET-2EEST,M3.5.5/0,M10.5.6/1' },
+ { 'Asia/Hebron', 'EET-2EEST,M3.5.5/0,M10.5.6/1' },
{ 'Asia/Ho Chi Minh', '<+07>-7' },
{ 'Asia/Hong Kong', 'HKT-8' },
{ 'Asia/Hovd', '<+07>-7' },
diff --git a/modules/luci-base/luasrc/view/admin_uci/changelog.htm b/modules/luci-base/luasrc/view/admin_uci/changelog.htm
deleted file mode 100644
index 9d6267cf31..0000000000
--- a/modules/luci-base/luasrc/view/admin_uci/changelog.htm
+++ /dev/null
@@ -1,66 +0,0 @@
-<%#
- Copyright 2010 Jo-Philipp Wich <jo@mein.io>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<% export("uci_changelog", function(changes) -%>
-<div class="cbi-section">
- <strong><%:Legend:%></strong>
- <div class="uci-change-legend">
- <div class="uci-change-legend-label"><ins>&#160;</ins> <%:Section added%></div>
- <div class="uci-change-legend-label"><del>&#160;</del> <%:Section removed%></div>
- <div class="uci-change-legend-label"><var><ins>&#160;</ins></var> <%:Option changed%></div>
- <div class="uci-change-legend-label"><var><del>&#160;</del></var> <%:Option removed%></div>
- <br style="clear:both" />
- </div>
- <br />
-
- <div class="uci-change-list"><%
- local util = luci.util
- local tpl = {
- ["add-3"] = "<ins>uci add %0 <strong>%3</strong> # =%2</ins>",
- ["set-3"] = "<ins>uci set %0.<strong>%2</strong>=%3</ins>",
- ["set-4"] = "<var><ins>uci set %0.%2.%3=<strong>%4</strong></ins></var>",
- ["remove-2"] = "<del>uci del %0.<strong>%2</strong></del>",
- ["remove-3"] = "<var><del>uci del %0.%2.<strong>%3</strong></del></var>",
- ["order-3"] = "<var>uci reorder %0.%2=<strong>%3</strong></var>",
- ["list-add-4"] = "<var><ins>uci add_list %0.%2.%3=<strong>%4</strong></ins></var>",
- ["list-del-4"] = "<var><del>uci del_list %0.%2.%3=<strong>%4</strong></del></var>",
- ["rename-3"] = "<var>uci rename %0.%2=<strong>%3</strong></var>",
- ["rename-4"] = "<var>uci rename %0.%2.%3=<strong>%4</strong></var>"
- }
-
- local conf, deltas
- for conf, deltas in util.kspairs(changes) do
- write("<h3># /etc/config/%s</h3>" % conf)
-
- local _, delta, added
- for _, delta in pairs(deltas) do
- local t = tpl["%s-%d" %{ delta[1], #delta }]
-
- write(t:gsub("%%(%d)", function(n)
- if n == "0" then
- return conf
- elseif n == "2" then
- if added and delta[2] == added[1] then
- return "@%s[-1]" % added[2]
- else
- return delta[2]
- end
- elseif n == "4" then
- return util.shellquote(delta[4])
- else
- return delta[tonumber(n)]
- end
- end))
-
- if delta[1] == "add" then
- added = { delta[2], delta[3] }
- end
- end
-
- write("<br />")
- end
- %></div>
-</div>
-<%- end) %>
diff --git a/modules/luci-base/luasrc/view/admin_uci/changes.htm b/modules/luci-base/luasrc/view/admin_uci/changes.htm
deleted file mode 100644
index 43bd7c23fb..0000000000
--- a/modules/luci-base/luasrc/view/admin_uci/changes.htm
+++ /dev/null
@@ -1,45 +0,0 @@
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008-2018 Jo-Philipp Wich <jo@mein.io>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%+header%>
-
-<%-
- local node, redir_url = luci.dispatcher.lookup(luci.http.formvalue("redir"))
- export("redirect", redir_url or url("admin/uci/changes"))
-
- include("admin_uci/changelog")
--%>
-
-<h2 name="content"><%:Configuration%> / <%:Changes%></h2>
-
-<% if changes then %>
- <%- uci_changelog(changes) -%>
-<% else %>
- <p><strong><%:There are no pending changes!%></strong></p>
-<% end %>
-
-<div class="alert-message" id="cbi_apply_status" style="display:none"></div>
-
-<div class="cbi-page-actions">
- <% if redir_url then %>
- <form method="get" action="<%=luci.util.pcdata(redir_url)%>">
- <input class="cbi-button cbi-button-link" type="submit" value="<%:Back%>" />
- </form>
- <% end %>
-
- <form method="post" action="<%=url("admin/uci/changes")%>">
- <input type="hidden" name="token" value="<%=token%>" />
- <input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
- <input class="cbi-button cbi-button-save" type="submit" name="trigger_apply" value="<%:Save & Apply%>" />
- </form>
- <form method="post" action="<%=url("admin/uci/revert")%>">
- <input type="hidden" name="token" value="<%=token%>" />
- <input type="hidden" name="redir" value="<%=pcdata(luci.http.formvalue("redir"))%>" />
- <input class="cbi-button cbi-button-reset" type="submit" value="<%:Revert%>" />
- </form>
-</div>
-
-<%+footer%>
diff --git a/modules/luci-base/luasrc/view/admin_uci/revert.htm b/modules/luci-base/luasrc/view/admin_uci/revert.htm
deleted file mode 100644
index d8fd3de01e..0000000000
--- a/modules/luci-base/luasrc/view/admin_uci/revert.htm
+++ /dev/null
@@ -1,33 +0,0 @@
-<%#
- Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008-2018 Jo-Philipp Wich <jo@mein.io>
- Licensed to the public under the Apache License 2.0.
--%>
-
-<%+header%>
-
-<%-
- local node, redir_url = luci.dispatcher.lookup(luci.http.formvalue("redir"))
- export("redirect", redir_url or url("admin/uci/changes"))
-
- include("admin_uci/changelog")
--%>
-
-<h2 name="content"><%:Configuration%> / <%:Revert%></h2>
-
-<% if changes then %>
- <p><strong><%:The following changes have been reverted%>:</strong></p>
- <%- uci_changelog(changes) -%>
-<% else %>
- <p><strong><%:There are no pending changes to revert!%></strong></p>
-<% end %>
-
-<% if redir_url then %>
- <div class="cbi-page-actions">
- <form class="inline" method="get" action="<%=luci.util.pcdata(redir_url)%>">
- <input class="cbi-button cbi-button-link" style="margin:0" type="submit" value="<%:Back%>" />
- </form>
- </div>
-<% end %>
-
-<%+footer%>
diff --git a/modules/luci-base/luasrc/view/cbi/apply_widget.htm b/modules/luci-base/luasrc/view/cbi/apply_widget.htm
deleted file mode 100644
index 0f9667390e..0000000000
--- a/modules/luci-base/luasrc/view/cbi/apply_widget.htm
+++ /dev/null
@@ -1,172 +0,0 @@
-<% export("cbi_apply_widget", function(redirect_ok, rollback_token) -%>
-<script type="text/javascript">//<![CDATA[
- var xhr = new XHR(),
- uci_apply_auth = { sid: '<%=luci.dispatcher.context.authsession%>', token: '<%=token%>' },
- uci_apply_rollback = <%=math.max(luci.config and luci.config.apply and luci.config.apply.rollback or 30, 30)%>,
- uci_apply_holdoff = <%=math.max(luci.config and luci.config.apply and luci.config.apply.holdoff or 4, 1)%>,
- uci_apply_timeout = <%=math.max(luci.config and luci.config.apply and luci.config.apply.timeout or 5, 1)%>,
- uci_apply_display = <%=math.max(luci.config and luci.config.apply and luci.config.apply.display or 1.5, 1)%>,
- uci_confirm_auth = <% if rollback_token then %>{ token: '<%=rollback_token%>' }<% else %>null<% end %>,
- was_xhr_poll_running = false;
-
- function uci_status_message(type, content) {
- if (type) {
- var message = showModal('', '');
-
- message.classList.add('alert-message');
- DOMTokenList.prototype.add.apply(message.classList, type.split(/\s+/));
-
- if (content)
- message.innerHTML = content;
-
- if (!was_xhr_poll_running) {
- was_xhr_poll_running = XHR.running();
- XHR.halt();
- }
- }
- else {
- hideModal();
-
- if (was_xhr_poll_running)
- XHR.run();
- }
- }
-
- function uci_rollback(checked) {
- if (checked) {
- uci_status_message('warning spinning',
- '<p><%:Failed to confirm apply within %ds, waiting for rollback…%></p>'.format(uci_apply_rollback));
-
- var call = function(r, data, duration) {
- if (r.status === 204) {
- uci_status_message('warning',
- '<h4><%:Configuration has been rolled back!%></h4>' +
- '<p><%:The device could not be reached within %d seconds after applying the pending changes, which caused the configuration to be rolled back for safety reasons. If you believe that the configuration changes are correct nonetheless, proceed by applying anyway. Alternatively, you can dismiss this warning and edit changes before attempting to apply again, or revert all pending changes to keep the currently working configuration state.%></p>'.format(uci_apply_rollback) +
- '<div class="right">' +
- '<input type="button" class="btn" onclick="uci_status_message(false)" value="<%:Dismiss%>" /> ' +
- '<input type="button" class="btn cbi-button-action important" onclick="uci_revert()" value="<%:Revert changes%>" /> ' +
- '<input type="button" class="btn cbi-button-negative important" onclick="uci_apply(false)" value="<%:Apply anyway%>" />' +
- '</div>');
-
- return;
- }
-
- var delay = isNaN(duration) ? 0 : Math.max(1000 - duration, 0);
- window.setTimeout(function() {
- xhr.post('<%=url("admin/uci/confirm")%>', uci_apply_auth, call, uci_apply_timeout * 1000);
- }, delay);
- };
-
- call({ status: 0 });
- }
- else {
- uci_status_message('warning',
- '<h4><%:Device unreachable!%></h4>' +
- '<p><%:Could not regain access to the device after applying the configuration changes. You might need to reconnect if you modified network related settings such as the IP address or wireless security credentials.%></p>');
- }
- }
-
- function uci_confirm(checked, deadline) {
- var tt;
- var ts = Date.now();
-
- uci_status_message('notice');
-
- var call = function(r, data, duration) {
- if (Date.now() >= deadline) {
- window.clearTimeout(tt);
- uci_rollback(checked);
- return;
- }
- else if (r && (r.status === 200 || r.status === 204)) {
- var indicator = document.querySelector('.uci_change_indicator');
- if (indicator) indicator.style.display = 'none';
-
- uci_status_message('notice', '<p><%:Configuration has been applied.%></p>');
-
- window.clearTimeout(tt);
- window.setTimeout(function() {
- <% if redirect_ok then -%>
- location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');
- <%- else -%>
- window.location = window.location.href.split('#')[0];
- <% end %>
- }, uci_apply_display * 1000);
-
- return;
- }
-
- var delay = isNaN(duration) ? 0 : Math.max(1000 - duration, 0);
- window.setTimeout(function() {
- xhr.post('<%=url("admin/uci/confirm")%>', uci_confirm_auth, call, uci_apply_timeout * 1000);
- }, delay);
- };
-
- var tick = function() {
- var now = Date.now();
-
- uci_status_message('notice spinning',
- '<p><%:Waiting for configuration to be applied… %ds%></p>'.format(Math.max(Math.floor((deadline - Date.now()) / 1000), 0)));
-
- if (now >= deadline)
- return;
-
- tt = window.setTimeout(tick, 1000 - (now - ts));
- ts = now;
- };
-
- tick();
-
- /* wait a few seconds for the settings to become effective */
- window.setTimeout(call, Math.max(uci_apply_holdoff * 1000 - ((ts + uci_apply_rollback * 1000) - deadline), 1));
- }
-
- function uci_apply(checked) {
- uci_status_message('notice spinning', '<p><%:Starting configuration apply…%></p>');
-
- xhr.post('<%=url("admin/uci")%>/' + (checked ? 'apply_rollback' : 'apply_unchecked'), uci_apply_auth, function(r, tok) {
- if (r.status === (checked ? 200 : 204)) {
- if (checked && tok !== null && typeof(tok) === 'object' && typeof(tok.token) === 'string')
- uci_confirm_auth = tok;
-
- uci_confirm(checked, Date.now() + uci_apply_rollback * 1000);
- }
- else if (checked && r.status === 204) {
- uci_status_message('notice', '<p><%:There are no changes to apply.%></p>');
- window.setTimeout(function() {
- <% if redirect_ok then -%>
- location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');
- <%- else -%>
- uci_status_message(false);
- <%- end %>
- }, uci_apply_display * 1000);
- }
- else {
- uci_status_message('warning', '<p><%_Apply request failed with status <code>%h</code>%></p>'.format(r.responseText || r.statusText || r.status));
- window.setTimeout(function() { uci_status_message(false); }, uci_apply_display * 1000);
- }
- });
- }
-
- function uci_revert() {
- uci_status_message('notice spinning', '<p><%:Reverting configuration…%></p>');
-
- xhr.post('<%=url("admin/uci/revert")%>', uci_apply_auth, function(r) {
- if (r.status === 200) {
- uci_status_message('notice', '<p><%:Changes have been reverted.%></p>');
- window.setTimeout(function() {
- <% if redirect_ok then -%>
- location.href = decodeURIComponent('<%=luci.util.urlencode(redirect_ok)%>');
- <%- else -%>
- window.location = window.location.href.split('#')[0];
- <%- end %>
- }, uci_apply_display * 1000);
- }
- else {
- uci_status_message('warning', '<p><%_Revert request failed with status <code>%h</code>%></p>'.format(r.statusText || r.status));
- window.setTimeout(function() { uci_status_message(false); }, uci_apply_display * 1000);
- }
- });
- }
-//]]></script>
-<%- end) %>
diff --git a/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm b/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm
index cb11d8f61a..4b70957543 100644
--- a/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm
+++ b/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm
@@ -3,7 +3,7 @@
local descr = luci.util.trim(striptags(self.description))
local ftype = self.typename or (self.template and self.template:gsub("^.+/", ""))
-%>
-<div class="td cbi-value-field<% if self.error and self.error[section] then %> cbi-value-error<% end %>"<%=
+<div class="td cbi-value-field<% if self.error and self.error[section] then %> cbi-value-error<% end %><% if self.password then %> nowrap<% end %>"<%=
attr("data-name", self.option) ..
ifattr(ftype and #ftype > 0, "data-type", ftype) ..
ifattr(title and #title > 0, "data-title", title, true) ..
diff --git a/modules/luci-base/luasrc/view/cbi/dropdown.htm b/modules/luci-base/luasrc/view/cbi/dropdown.htm
index 6f4b89905b..40bd8e9536 100644
--- a/modules/luci-base/luasrc/view/cbi/dropdown.htm
+++ b/modules/luci-base/luasrc/view/cbi/dropdown.htm
@@ -1,54 +1,19 @@
<%+cbi/valueheader%>
-
-<%-
- local selected = { }
-
- if self.multiple then
- local val
- for val in luci.util.imatch(self:cfgvalue(section)) do
- selected[val] = true
- end
- else
- selected[self:cfgvalue(section)] = true
- end
-
- if not next(selected) and self.default then
- selected[self.default] = true
- end
--%>
-
-<div class="cbi-dropdown"<%=
- attr("name", cbid) ..
- attr("display-items", self.display or self.size or 3) ..
- attr("dropdown-items", self.dropdown or self.display or self.size or 5) ..
- attr("placeholder", self.placeholder or translate("-- please select --")) ..
- ifattr(self.multiple, "multiple", "multiple") ..
- ifattr(self.optional or self.rmempty, "optional", "optional")
-%>>
- <ul>
- <% local i, key; for i, key in pairs(self.keylist) do %>
- <li<%=
- attr("data-index", i) ..
- attr("data-depends", self:deplist2json(section, self.deplist[i])) ..
- attr("data-value", key) ..
- ifattr(selected[key], "selected", "selected")
- %>>
- <%=pcdata(self.vallist[i])%>
- </li>
- <% end %>
- <% if self.custom then %>
- <li>
- <input type="password" style="display:none" />
- <input class="create-item-input" type="text"<%=
- attr("placeholder", self.custom ~= true and
- self.custom or
- (self.multiple and
- translate("Enter custom values") or
- translate("Enter custom value")))
- %> />
- </li>
- <% end %>
- </ul>
-</div>
-
+<div<%=attr("data-ui-widget", luci.util.serialize_json({
+ "Dropdown", self:cfgvalue(section), self:choices(), {
+ id = cbid,
+ name = cbid,
+ sort = self.keylist,
+ multi = self.multiple,
+ datatype = self.datatype,
+ optional = self.optional or self.rmempty,
+ readonly = self.readonly,
+ maxlength = self.maxlength,
+ placeholder = self.placeholder,
+ display_items = self.display or self.size or 3,
+ dropdown_items = self.dropdown or self.display or self.size or 5,
+ custom_placeholder = self.custom or
+ (self.multiple and translate("Enter custom values") or translate("Enter custom value"))
+ }
+}))%>></div>
<%+cbi/valuefooter%>
diff --git a/modules/luci-base/luasrc/view/cbi/dynlist.htm b/modules/luci-base/luasrc/view/cbi/dynlist.htm
index fa7dbdb418..d50328d79f 100644
--- a/modules/luci-base/luasrc/view/cbi/dynlist.htm
+++ b/modules/luci-base/luasrc/view/cbi/dynlist.htm
@@ -1,13 +1,12 @@
<%+cbi/valueheader%>
-<div<%=
- attr("data-prefix", cbid) ..
- attr("data-browser-path", self.default_path) ..
- attr("data-dynlist", luci.util.serialize_json({
- self.keylist, self.vallist,
- self.datatype, self.optional or self.rmempty
- })) ..
- attr("data-values", luci.util.serialize_json(self:cfgvalue(section))) ..
- ifattr(self.size, "data-size", self.size) ..
- ifattr(self.placeholder, "data-placeholder", self.placeholder)
-%>></div>
+<div<%=attr("data-ui-widget", luci.util.serialize_json({
+ "DynamicList", self:cfgvalue(section), self:choices(), {
+ name = cbid,
+ size = self.size,
+ sort = self.keylist,
+ datatype = self.datatype,
+ optional = self.optional or self.rmempty,
+ placeholder = self.placeholder
+ }
+}))%>></div>
<%+cbi/valuefooter%>
diff --git a/modules/luci-base/luasrc/view/cbi/full_valueheader.htm b/modules/luci-base/luasrc/view/cbi/full_valueheader.htm
index 10a554329f..1d9ebeba94 100644
--- a/modules/luci-base/luasrc/view/cbi/full_valueheader.htm
+++ b/modules/luci-base/luasrc/view/cbi/full_valueheader.htm
@@ -1,4 +1,4 @@
-<div class="cbi-value<% if self.error and self.error[section] then %> cbi-value-error<% end %><% if self.last_child then %> cbi-value-last<% end %>" id="cbi-<%=self.config.."-"..section.."-"..self.option%>" data-index="<%=self.index%>" data-depends="<%=pcdata(self:deplist2json(section))%>">
+<div class="cbi-value<% if self.error and self.error[section] then %> cbi-value-error<% end %><% if self.last_child then %> cbi-value-last<% end %><% if self.password then %> nowrap<% end %>" id="cbi-<%=self.config.."-"..section.."-"..self.option%>" data-index="<%=self.index%>" data-depends="<%=pcdata(self:deplist2json(section))%>">
<%- if self.title and #self.title > 0 then -%>
<label class="cbi-value-title"<%= attr("for", cbid) %>>
<%- if self.titleref then -%><a title="<%=self.titledesc or translate('Go to relevant configuration page')%>" class="cbi-title-ref" href="<%=self.titleref%>"><%- end -%>
diff --git a/modules/luci-base/luasrc/view/cbi/fvalue.htm b/modules/luci-base/luasrc/view/cbi/fvalue.htm
index 197d03cf31..7f975b95e1 100644
--- a/modules/luci-base/luasrc/view/cbi/fvalue.htm
+++ b/modules/luci-base/luasrc/view/cbi/fvalue.htm
@@ -1,10 +1,12 @@
<%+cbi/valueheader%>
- <input type="hidden" value="1"<%=
- attr("name", "cbi.cbe." .. self.config .. "." .. section .. "." .. self.option)
- %> />
- <input class="cbi-input-checkbox" data-update="click change" type="checkbox"<%=
- attr("id", cbid) .. attr("name", cbid) .. attr("value", self.enabled or 1) ..
- ifattr((self:cfgvalue(section) or self.default) == self.enabled, "checked", "checked")
- %> />
- <label<%= attr("for", cbid)%>></label>
+<div<%=attr("data-ui-widget", luci.util.serialize_json({
+ "Checkbox", self:cfgvalue(section) or self.default, {
+ id = cbid,
+ name = cbid,
+ readonly = self.readonly,
+ hiddenname = "cbi.cbe." .. self.config .. "." .. section .. "." .. self.option,
+ value_enabled = self.enabled or 1,
+ value_disabled = self.disabled or 0
+ }
+}))%>></div>
<%+cbi/valuefooter%>
diff --git a/modules/luci-base/luasrc/view/cbi/lvalue.htm b/modules/luci-base/luasrc/view/cbi/lvalue.htm
index 34d02eeca0..e076488356 100644
--- a/modules/luci-base/luasrc/view/cbi/lvalue.htm
+++ b/modules/luci-base/luasrc/view/cbi/lvalue.htm
@@ -1,43 +1,14 @@
-<%
- local i, key
- local br = self.orientation == "horizontal" and '&#160;' or '<br />'
-%>
-
<%+cbi/valueheader%>
-<% if self.widget == "select" then %>
- <select class="cbi-input-select" data-update="change"<%=
- attr("id", cbid) ..
- attr("name", cbid) ..
- ifattr(self.size, "size")
- %>>
- <% for i, key in pairs(self.keylist) do -%>
- <option<%=
- attr("id", cbid.."-"..key) ..
- attr("value", key) ..
- attr("data-index", i) ..
- attr("data-depends", self:deplist2json(section, self.deplist[i])) ..
- ifattr(tostring(self:cfgvalue(section) or self.default) == key, "selected", "selected")
- %>><%=pcdata(self.vallist[i])%></option>
- <%- end %>
- </select>
-<% elseif self.widget == "radio" then %>
- <div>
- <% for i, key in pairs(self.keylist) do %>
- <label<%=
- attr("data-index", i) ..
- attr("data-depends", self:deplist2json(section, self.deplist[i]))
- %>>
- <input class="cbi-input-radio" data-update="click change" type="radio"<%=
- attr("id", cbid.."-"..key) ..
- attr("name", cbid) ..
- attr("value", key) ..
- ifattr((self:cfgvalue(section) or self.default) == key, "checked", "checked")
- %> />
- <label<%= attr("for", cbid.."-"..key)%>></label>
- <%=pcdata(self.vallist[i])%>
- </label>
- <% if i == self.size then write(br) end %>
- <% end %>
- </div>
-<% end %>
+<div<%=attr("data-ui-widget", luci.util.serialize_json({
+ "Select", self:cfgvalue(section), self:choices(), {
+ id = cbid,
+ name = cbid,
+ size = self.size,
+ sort = self.keylist,
+ widget = self.widget,
+ datatype = self.datatype,
+ optional = self.optional or self.rmempty,
+ placeholder = self.placeholder
+ }
+}))%>></div>
<%+cbi/valuefooter%>
diff --git a/modules/luci-base/luasrc/view/cbi/mvalue.htm b/modules/luci-base/luasrc/view/cbi/mvalue.htm
index db17450d27..4974a4ed28 100644
--- a/modules/luci-base/luasrc/view/cbi/mvalue.htm
+++ b/modules/luci-base/luasrc/view/cbi/mvalue.htm
@@ -1,43 +1,16 @@
-<%
- local i, key
- local v = self:valuelist(section) or {}
--%>
-
<%+cbi/valueheader%>
-<% if self.widget == "select" then %>
- <select class="cbi-input-select" multiple="multiple" data-update="click change"<%=
- attr("id", cbid) ..
- attr("name", cbid) ..
- ifattr(self.size, "size")
- %>>
- <% for i, key in pairs(self.keylist) do -%>
- <option<%=
- attr("id", cbid.."-"..key) ..
- attr("value", key) ..
- attr("data-index", i) ..
- attr("data-depends", self:deplist2json(section, self.deplist[i])) ..
- ifattr(luci.util.contains(v, key), "selected", "selected")
- %>><%=pcdata(self.vallist[i])%></option>
- <%- end %>
- </select>
-<% elseif self.widget == "checkbox" then %>
- <div>
- <% for i, key in pairs(self.keylist) do %>
- <label<%=
- attr("data-index", i) ..
- attr("data-depends", self:deplist2json(section, self.deplist[i]))
- %>>
- <input class="cbi-input-checkbox" type="checkbox" data-update="click change"<%=
- attr("id", cbid.."-"..key) ..
- attr("name", cbid) ..
- attr("value", key) ..
- ifattr(luci.util.contains(v, key), "checked", "checked")
- %> />
- <label<%= attr("for", cbid.."-"..key)%>></label>
- <%=pcdata(self.vallist[i])%>
- </label>
- <% if self.size and (i % self.size) == 0 then write('<br />') end %>
- <% end %>
- </div>
-<% end %>
+<div<%=attr("data-ui-widget", luci.util.serialize_json({
+ "Select", self:cfgvalues(section), self:choices(), {
+ id = cbid,
+ name = cbid,
+ size = self.size,
+ sort = self.keylist,
+ multi = true,
+ widget = self.widget,
+ datatype = self.datatype,
+ optional = self.optional or self.rmempty,
+ readonly = self.readonly,
+ placeholder = self.placeholder
+ }
+}))%>></div>
<%+cbi/valuefooter%>
diff --git a/modules/luci-base/luasrc/view/cbi/value.htm b/modules/luci-base/luasrc/view/cbi/value.htm
index 27f3cb2bd9..6060310b19 100644
--- a/modules/luci-base/luasrc/view/cbi/value.htm
+++ b/modules/luci-base/luasrc/view/cbi/value.htm
@@ -1,26 +1,35 @@
<%+cbi/valueheader%>
- <%- if self.password then -%>
- <input type="password" style="position:absolute; left:-1000px" aria-hidden="true" tabindex="-1"<%=
- attr("name", "password." .. cbid)
- %> />
- <%- end -%>
- <input data-update="change"<%=
- attr("id", cbid) ..
- attr("name", cbid) ..
- attr("type", self.password and "password" or "text") ..
- attr("class", self.password and "cbi-input-password" or "cbi-input-text") ..
- attr("value", self:cfgvalue(section) or self.default) ..
- ifattr(self.password, "autocomplete", "new-password") ..
- ifattr(self.size, "size") ..
- ifattr(self.placeholder, "placeholder") ..
- ifattr(self.readonly, "readonly") ..
- ifattr(self.maxlength, "maxlength") ..
- ifattr(self.datatype, "data-type", self.datatype) ..
- ifattr(self.datatype, "data-optional", self.optional or self.rmempty) ..
- ifattr(self.combobox_manual, "data-manual", self.combobox_manual) ..
- ifattr(#self.keylist > 0, "data-choices", { self.keylist, self.vallist })
- %> />
- <%- if self.password then -%>
- <button class="cbi-button cbi-button-neutral" title="<%:Reveal/hide password%>" aria-label="<%:Reveal/hide password%>" onclick="var e = this.previousElementSibling; e.type = (e.type === 'password') ? 'text' : 'password'; event.preventDefault()">∗</button>
- <% end %>
+
+<% local choices = self:choices()
+ if choices then %>
+ <div<%=attr("data-ui-widget", luci.util.serialize_json({
+ "Combobox", self:cfgvalue(section) or self.default, choices, {
+ id = cbid,
+ name = cbid,
+ size = self.size,
+ sort = self.keylist,
+ datatype = self.datatype,
+ optional = self.optional or self.rmempty,
+ readonly = self.readonly,
+ maxlength = self.maxlength,
+ placeholder = self.placeholder,
+ custom_placeholder = self.combobox_manual
+ }
+ }))%>></div>
+<% else %>
+ <div<%=attr("data-ui-widget", luci.util.serialize_json({
+ "Textfield", self:cfgvalue(section) or self.default, {
+ id = cbid,
+ name = cbid,
+ size = self.size,
+ datatype = self.datatype,
+ optional = self.optional or self.rmempty,
+ password = self.password,
+ readonly = self.readonly,
+ maxlength = self.maxlength,
+ placeholder = self.placeholder
+ }
+ }))%>></div>
+<% end %>
+
<%+cbi/valuefooter%>
diff --git a/modules/luci-base/luasrc/view/footer.htm b/modules/luci-base/luasrc/view/footer.htm
index 1667d3aa9a..ba14ec8678 100644
--- a/modules/luci-base/luasrc/view/footer.htm
+++ b/modules/luci-base/luasrc/view/footer.htm
@@ -1,6 +1,6 @@
<%#
Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2008-2019 Jo-Philipp Wich <jo@mein.io>
Licensed to the public under the Apache License 2.0.
-%>
@@ -8,18 +8,15 @@
local is_rollback_pending, rollback_time_remaining, rollback_session, rollback_token = luci.model.uci:rollback_pending()
if is_rollback_pending or trigger_apply or trigger_revert then
- include("cbi/apply_widget")
- cbi_apply_widget(redirect, rollback_token)
%>
- <div class="alert-message" id="cbi_apply_status" style="display:none"></div>
<script type="text/javascript">
- document.addEventListener("DOMContentLoaded", function() {
+ document.addEventListener("luci-loaded", function() {
<% if trigger_apply then -%>
- uci_apply(true);
+ L.ui.changes.apply(true);
<%- elseif trigger_revert then -%>
- uci_revert();
+ L.ui.changes.revert();
<%- else -%>
- uci_confirm(true, Date.now() + <%=rollback_time_remaining%> * 1000);
+ L.ui.changes.confirm(true, Date.now() + <%=rollback_time_remaining%> * 1000, <%=luci.http.write_json(rollback_token)%>);
<%- end %>
});
</script>
diff --git a/modules/luci-base/luasrc/view/header.htm b/modules/luci-base/luasrc/view/header.htm
index d68e39f917..1ef0e5b013 100644
--- a/modules/luci-base/luasrc/view/header.htm
+++ b/modules/luci-base/luasrc/view/header.htm
@@ -1,6 +1,6 @@
<%#
Copyright 2008 Steven Barth <steven@midlink.org>
- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
+ Copyright 2008-2019 Jo-Philipp Wich <jo@mein.io>
Licensed to the public under the Apache License 2.0.
-%>
@@ -9,16 +9,25 @@
include("themes/" .. theme .. "/header")
luci.dispatcher.context.template_header_sent = true
end
+
+ local applyconf = luci.config and luci.config.apply
%>
+<script type="text/javascript" src="<%=resource%>/promis.min.js"></script>
<script type="text/javascript" src="<%=resource%>/luci.js"></script>
<script type="text/javascript">
L = new LuCI(<%= luci.http.write_json({
- token = token,
- resource = resource,
- scriptname = luci.http.getenv("SCRIPT_NAME"),
- pathinfo = luci.http.getenv("PATH_INFO"),
- requestpath = luci.dispatcher.context.requestpath,
- pollinterval = luci.config.main.pollinterval or 5
+ token = token,
+ resource = resource,
+ scriptname = luci.http.getenv("SCRIPT_NAME"),
+ pathinfo = luci.http.getenv("PATH_INFO"),
+ requestpath = luci.dispatcher.context.requestpath,
+ pollinterval = luci.config.main.pollinterval or 5,
+ sessionid = luci.dispatcher.context.authsession,
+ apply_rollback = math.max(applyconf and applyconf.rollback or 30, 30),
+ apply_holdoff = math.max(applyconf and applyconf.holdoff or 4, 1),
+ apply_timeout = math.max(applyconf and applyconf.timeout or 5, 1),
+ apply_display = math.max(applyconf and applyconf.display or 1.5, 1),
+ rollback_token = rollback_token
}) %>);
</script>
diff --git a/modules/luci-base/luasrc/view/view.htm b/modules/luci-base/luasrc/view/view.htm
new file mode 100644
index 0000000000..bddd8e4464
--- /dev/null
+++ b/modules/luci-base/luasrc/view/view.htm
@@ -0,0 +1,8 @@
+<%+header%>
+
+<div id="view">
+ <div class="spinning"><%:Loading view…%></div>
+ <script type="text/javascript">L.require('view.<%=view%>');</script>
+</div>
+
+<%+footer%>
diff --git a/modules/luci-base/po/ca/base.po b/modules/luci-base/po/ca/base.po
index 8e3871fa25..801f58fec8 100644
--- a/modules/luci-base/po/ca/base.po
+++ b/modules/luci-base/po/ca/base.po
@@ -61,7 +61,6 @@ msgstr "-- Camp addicional --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Escolliu, si us plau --"
@@ -332,7 +331,7 @@ msgstr "Rutes <abbr title=\"Internet Protocol Version 4\">IPv4</abbr> actives"
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr "Rutes <abbr title=\"Internet Protocol Version 6\">IPv6</abbr> actives"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Connexions actives"
@@ -670,7 +669,7 @@ msgstr ""
msgid "Authentication"
msgstr "Autenticació"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -695,7 +694,7 @@ msgstr "Refresc automàtic"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -733,9 +732,9 @@ msgstr "Disponible"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1054,12 +1053,13 @@ msgstr "Tanca la llista..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Aplegant dades..."
@@ -1197,7 +1197,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1379,7 +1379,7 @@ msgid "Description"
msgstr "Descripció"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Destí"
@@ -1418,6 +1418,7 @@ msgid "Diagnostics"
msgstr "Diagnòstics"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1450,9 +1451,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1647,7 +1648,7 @@ msgstr "Habilita l'<abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1715,13 +1716,13 @@ msgstr ""
msgid "Enable this swap"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Activa/Desactiva"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Habilitat"
@@ -1934,6 +1935,12 @@ msgstr "Escriptura del microprogramari a la memòria flaix"
msgid "Flash image..."
msgstr "Puja una imatge..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "Escriu una imatge nova a la memòria flaix"
@@ -1946,12 +1953,6 @@ msgstr "Operacions a la memòria flaix"
msgid "Flashing..."
msgstr "Escrivint a la memòria flaix..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Força"
@@ -2142,7 +2143,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2444,7 +2445,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2458,7 +2459,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2534,11 +2535,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Script d'inici"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Scripts d'inici"
@@ -2897,7 +2898,7 @@ msgstr "Adreça IPv6 local"
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Inici local"
@@ -3029,7 +3030,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3058,7 +3059,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr ""
@@ -3150,7 +3152,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "Temps d'espera d'inici de mòdem"
@@ -3276,7 +3279,7 @@ msgstr "Màscara de xarxa"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3325,7 +3328,7 @@ msgstr "Cap fitxer trobat"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "No hi ha informació disponible"
@@ -3579,7 +3582,7 @@ msgstr ""
msgid "Options"
msgstr "Opcions"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Altres:"
@@ -3657,7 +3660,7 @@ msgstr "Propietari"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "Contrasenya PAP/CHAP"
@@ -3668,7 +3671,7 @@ msgstr "Contrasenya PAP/CHAP"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "Nom d'usuari PAP/CHAP"
@@ -3799,9 +3802,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3859,7 +3862,7 @@ msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Paquets"
@@ -3956,7 +3959,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protocol"
@@ -4098,7 +4101,7 @@ msgstr ""
msgid "Really switch protocol?"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Connexions en temps real"
@@ -4272,7 +4275,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Reinicia"
@@ -4628,7 +4631,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Origen"
@@ -4675,11 +4678,11 @@ msgid "Specify the secret encryption key here."
msgstr "Especifiqueu el clau de xifració secret aquí."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Inici"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Prioritat d'inici"
@@ -4734,7 +4737,7 @@ msgid "Status"
msgstr "Estat"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Atura"
@@ -4838,7 +4841,7 @@ msgstr "Propietats del sistema"
msgid "System log buffer size"
msgstr "Mida de la memòria intermèdia per al registre del sistema"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5136,7 +5139,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5187,7 +5190,7 @@ msgstr ""
"Aquesta llista mostra una vista general sobre els processos corrent al "
"sistema actualment i el seu estat."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr ""
"Aquesta pàgina ofereix una vista general de les connexions de xarxa actives "
@@ -5250,7 +5253,7 @@ msgstr "Rastre de ruta"
msgid "Traffic"
msgstr "Trànsit"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Transferència"
@@ -5305,7 +5308,7 @@ msgstr "Potència Tx"
msgid "Type"
msgstr "Tipus"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5442,7 +5445,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5494,7 +5497,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5508,7 +5511,7 @@ msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5528,7 +5531,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5800,7 +5803,7 @@ msgstr "Escriure el registre del sistema al fitxer"
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/cs/base.po b/modules/luci-base/po/cs/base.po
index 2ab06f4e5c..136f58d710 100644
--- a/modules/luci-base/po/cs/base.po
+++ b/modules/luci-base/po/cs/base.po
@@ -59,7 +59,6 @@ msgstr "-- Doplňující pole --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Prosím vyberte --"
@@ -331,7 +330,7 @@ msgstr ""
"Aktivní záznamy ve směrovací tabulce <abbr title=\"Internet Protocol Version "
"6\">IPv6</abbr>"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Aktivní spojení"
@@ -666,7 +665,7 @@ msgstr ""
msgid "Authentication"
msgstr "Autentizace"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -691,7 +690,7 @@ msgstr "Automaticky obnovovat"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -729,9 +728,9 @@ msgstr "Dostupné"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1050,12 +1049,13 @@ msgstr "Zavřít seznam..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Probíhá sběr dat..."
@@ -1193,7 +1193,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1377,7 +1377,7 @@ msgid "Description"
msgstr "Popis"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Cíl"
@@ -1416,6 +1416,7 @@ msgid "Diagnostics"
msgstr "Diagnostika"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1448,9 +1449,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1649,7 +1650,7 @@ msgstr "Povolit <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Povolit dynamickou aktualizaci koncového bodu HE.net"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1717,13 +1718,13 @@ msgstr ""
msgid "Enable this swap"
msgstr "Povolit tento swapovací oddíl"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Povolit/Zakázat"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Povoleno"
@@ -1938,6 +1939,12 @@ msgstr "Nahrát firmware"
msgid "Flash image..."
msgstr "Nahrát obraz..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "Nahrát nový obraz s firmwarem"
@@ -1950,12 +1957,6 @@ msgstr "Operace nad flash pamětí"
msgid "Flashing..."
msgstr "Nahrávám..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Vynutit"
@@ -2144,7 +2145,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2446,7 +2447,7 @@ msgstr "Namísto pevného uzlu zařízení připojovat pomocí názvu oddílu"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2460,7 +2461,7 @@ msgstr "Pokud není povoleno, není nastaven žádný výchozí směrovací záz
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2536,11 +2537,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Initskript"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Initskripty"
@@ -2902,7 +2903,7 @@ msgstr "Místní IPv6 adresa"
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Místní startup"
@@ -3040,7 +3041,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3069,7 +3070,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "Nejvyšší povolená velikost EDNS.0 UDP paketů"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "Nejvyšší poÄet sekund Äekání, než bude modem pÅ™ipraven"
@@ -3161,7 +3163,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "Časový limit inicializace modemu"
@@ -3287,7 +3290,7 @@ msgstr "Síťová maska"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3336,7 +3339,7 @@ msgstr "Nebyly nalezeny žádné soubory"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Údaje nejsou k dispozici"
@@ -3589,7 +3592,7 @@ msgstr ""
msgid "Options"
msgstr "Možnosti"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Ostatní:"
@@ -3669,7 +3672,7 @@ msgstr "Vlastník"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "Heslo PAP/CHAP"
@@ -3680,7 +3683,7 @@ msgstr "Heslo PAP/CHAP"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "Uživatelské jméno PAP/CHAP"
@@ -3811,9 +3814,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3871,7 +3874,7 @@ msgstr "Ping"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Paketů"
@@ -3970,7 +3973,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protokol"
@@ -4115,7 +4118,7 @@ msgstr "Opravdu resetovat všechny změny?"
msgid "Really switch protocol?"
msgstr "Opravdu prohodit protokol?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "PÅ™ipojení v reálném Äase"
@@ -4290,7 +4293,7 @@ msgstr "Soubor resolve"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Restart"
@@ -4650,7 +4653,7 @@ msgstr ""
"wiki pro zařízení specifické instalaÄní instrukce."
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Zdroj"
@@ -4699,11 +4702,11 @@ msgid "Specify the secret encryption key here."
msgstr "Zde nastavte soukromý Å¡ifrovací klíÄ."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Start"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Priorita spouštění"
@@ -4761,7 +4764,7 @@ msgid "Status"
msgstr "Stav"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Stop"
@@ -4865,7 +4868,7 @@ msgstr "Vlastnosti systému"
msgid "System log buffer size"
msgstr "Velikost bufferu systémového logu"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5172,7 +5175,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5222,7 +5225,7 @@ msgstr ""
"V tomto seznamu vidíte přehled aktuálně běžících systémových procesů a "
"jejich stavy."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "Tato stránka zobrazuje přehled aktivních síťových spojení."
@@ -5282,7 +5285,7 @@ msgstr "Traceroute"
msgid "Traffic"
msgstr "Provoz"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Přenos"
@@ -5337,7 +5340,7 @@ msgstr "Tx-Power"
msgid "Type"
msgstr "Typ"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5474,7 +5477,7 @@ msgstr "Použít DHCP bránu"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5526,7 +5529,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5540,7 +5543,7 @@ msgstr "Použít vlastní DNS servery"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5560,7 +5563,7 @@ msgstr "Použít výchozí bránu"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5835,7 +5838,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/de/base.po b/modules/luci-base/po/de/base.po
index 0983eb4a0a..4d5a676232 100644
--- a/modules/luci-base/po/de/base.po
+++ b/modules/luci-base/po/de/base.po
@@ -61,7 +61,6 @@ msgstr "-- Zusätzliches Feld --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Bitte auswählen --"
@@ -333,7 +332,7 @@ msgstr "Aktive IPv4-Routen"
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr "Aktive IPv6-Routen"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Aktive Verbindungen"
@@ -513,11 +512,11 @@ msgstr "Immer Defaultrouter ankündigen"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:50
msgid "Always off (%s)"
-msgstr ""
+msgstr "Immer aus (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:48
msgid "Always on (%s)"
-msgstr ""
+msgstr "Immer an (%s)"
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:259
msgid ""
@@ -685,7 +684,7 @@ msgstr "Berechtigungsgruppe"
msgid "Authentication"
msgstr "Authentifizierung"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr "Authentifizierungstyp"
@@ -710,7 +709,7 @@ msgstr "Automatisches Neuladen"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -748,9 +747,9 @@ msgstr "Verfügbar"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1081,12 +1080,13 @@ msgstr "Schließe Liste..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Sammle Daten..."
@@ -1235,8 +1235,8 @@ msgstr ""
"Werkseinstellungen zurückgesetzt werden."
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
-msgstr ""
+msgid "Custom flash interval (%s)"
+msgstr "Benutzerdefiniertes Blinkintervall (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
msgid ""
@@ -1417,7 +1417,7 @@ msgid "Description"
msgstr "Beschreibung"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Ziel"
@@ -1456,6 +1456,7 @@ msgid "Diagnostics"
msgstr "Diagnosen"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr "Einwahlnummer"
@@ -1488,9 +1489,9 @@ msgstr "Inaktivitäts-Proben deaktivieren"
msgid "Disable this network"
msgstr "Dieses Netzwerk deaktivieren"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1694,7 +1695,7 @@ msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> aktivieren"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Dynamisches HE.net IP-Adress-Update aktivieren"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr "IPv6 anfordern"
@@ -1762,13 +1763,13 @@ msgstr "Dieses Netzwerk aktivieren"
msgid "Enable this swap"
msgstr "Diesen Auslagerungsspeicher aktivieren"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Aktivieren/Deaktivieren"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Aktiviert"
@@ -1991,6 +1992,12 @@ msgstr "Firmware aktualisieren"
msgid "Flash image..."
msgstr "Firmware aktualisieren..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr "Aktivität des Flashspeichers (%s)"
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "Neues Firmware Image schreiben"
@@ -2003,12 +2010,6 @@ msgstr "Flash-Operationen"
msgid "Flashing..."
msgstr "Firmware wird installiert..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Start erzwingen"
@@ -2203,8 +2204,8 @@ msgid "Header Error Code Errors (HEC)"
msgstr "Anzahl Header-Error-Code-Fehler (HEC)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
-msgstr ""
+msgid "Heartbeat interval (%s)"
+msgstr "Herzschlag / Durchschnittliche Systemlast (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
msgid ""
@@ -2508,7 +2509,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2522,7 +2523,7 @@ msgstr "Wenn deaktiviert, wird keine Default-Route gesetzt"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2599,11 +2600,11 @@ msgstr ""
msgid "Initialization failure"
msgstr "Initialisierung fehlgeschlagen"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Startscript"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Startscripte"
@@ -2982,7 +2983,7 @@ msgstr "Lokale IPv6 Adresse"
msgid "Local Service Only"
msgstr "Nur lokale Dienste"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Lokales Startskript"
@@ -3122,7 +3123,7 @@ msgid ""
msgstr "Das Root-Dateisystem muss mit folgenden Kommandsos vorbereitet werden:"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3151,7 +3152,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "Maximal zulässige Größe von EDNS.0 UDP Paketen"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "Maximale Zeit die gewartet wird bis das Modem bereit ist (in Sekunden)"
@@ -3246,7 +3248,8 @@ msgid "Modem information query failed"
msgstr "Modem-Informationsabfrage fehlgeschlagen"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "Wartezeit für Modeminitialisierung"
@@ -3372,7 +3375,7 @@ msgstr "Netzmaske"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3389,7 +3392,7 @@ msgstr "Netzwerk-Boot-Image"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:54
msgid "Network device activity (%s)"
-msgstr ""
+msgstr "Aktivität einer Netzwerkschnittstelle (%s)"
#: modules/luci-base/luasrc/model/network.lua:33
msgid "Network device is not present"
@@ -3421,7 +3424,7 @@ msgstr "Keine Dateien gefunden"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Keine Informationen verfügbar"
@@ -3691,7 +3694,7 @@ msgstr ""
msgid "Options"
msgstr "Optionen"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Andere:"
@@ -3771,7 +3774,7 @@ msgstr "Besitzer"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "PAP/CHAP Passwort"
@@ -3782,7 +3785,7 @@ msgstr "PAP/CHAP Passwort"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "PAP/CHAP Benutzername"
@@ -3913,9 +3916,9 @@ msgstr "Pfad zum inneren, privaten Schlüssel"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3973,7 +3976,7 @@ msgstr "Ping-Anfrage"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Pkte."
@@ -4072,7 +4075,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protokoll"
@@ -4230,7 +4233,7 @@ msgstr "Sollen wirklich alle Änderungen verworfen werden?"
msgid "Really switch protocol?"
msgstr "Protokoll wirklich wechseln?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Echtzeitverbindungen"
@@ -4413,7 +4416,7 @@ msgstr "Resolv-Datei"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Neustarten"
@@ -4781,7 +4784,7 @@ msgstr ""
"Installationsanleitungen entnehmen Sie bitte dem Wiki."
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Quelle"
@@ -4836,11 +4839,11 @@ msgid "Specify the secret encryption key here."
msgstr "Geben Sie hier den geheimen Netzwerkschlüssel an"
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Start"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Startpriorität"
@@ -4899,7 +4902,7 @@ msgid "Status"
msgstr "Status"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Stoppen"
@@ -4970,7 +4973,7 @@ msgstr "Auf CIDR-Listen-Notation wechseln"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:64
msgid "Switchport activity (%s)"
-msgstr ""
+msgstr "Aktivität eines Switchports (%s)"
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:53
msgid "Sync with NTP-Server"
@@ -5006,7 +5009,7 @@ msgstr "Systemeigenschaften"
msgid "System log buffer size"
msgstr "Größe des Systemprotokoll-Puffers"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5342,7 +5345,7 @@ msgstr ""
"wurde oder das normale Account-Passwort wenn kein separater Schlüssel "
"gesetzt wurde."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5395,7 +5398,7 @@ msgstr ""
"Diese Tabelle gibt eine Übersicht über aktuell laufende Systemprozesse und "
"deren Status."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "Diese Seite gibt eine Übersicht über aktive Netzwerkverbindungen."
@@ -5457,7 +5460,7 @@ msgstr "Routenverfolgung"
msgid "Traffic"
msgstr "Traffic"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Transfer"
@@ -5512,7 +5515,7 @@ msgstr "Sendestärke"
msgid "Type"
msgstr "Typ"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5649,7 +5652,7 @@ msgstr "Benutze DHCP-Gateway"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5701,7 +5704,7 @@ msgstr "Eingebautes IPv6-Management nutzen"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5715,7 +5718,7 @@ msgstr "Benutze eigene DNS-Server"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5735,7 +5738,7 @@ msgstr "Benutze Standard-Gateway"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5932,23 +5935,23 @@ msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:74
msgid "Wi-Fi activity (%s)"
-msgstr ""
+msgstr "Wi-Fi Aktivität (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:70
msgid "Wi-Fi client association (%s)"
-msgstr ""
+msgstr "Wi-Fi Clientverbindung (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:66
msgid "Wi-Fi data reception (%s)"
-msgstr ""
+msgstr "Wi-Fi Datenempfang (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:68
msgid "Wi-Fi data transmission (%s)"
-msgstr ""
+msgstr "Wi-Fi Datenübertragung (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:72
msgid "Wi-Fi on (%s)"
-msgstr ""
+msgstr "Wi-Fi ein (%s)"
#: modules/luci-base/luasrc/view/cbi/wireless_modefreq.htm:166
msgid "Width"
@@ -6018,7 +6021,7 @@ msgstr "Systemprotokoll in Datei schreiben"
msgid "Yes"
msgstr "Ja"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
@@ -6026,7 +6029,7 @@ msgid ""
msgstr ""
"Hier können installierte Startscripte aktiviert oder deaktiviert werden. "
"Änderungen werden erst mit einem Geräteneustart angewendet.<br /"
-"><strong>Warnung: Wenn essentialle Startscripte wie \"network\" deaktiviert "
+"><strong>Warnung: Wenn essentielle Startscripte wie \"network\" deaktiviert "
"werden könnte das Gerät unerreichbar werden!</strong>"
#: themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm:206
diff --git a/modules/luci-base/po/el/base.po b/modules/luci-base/po/el/base.po
index 25a8f34ea3..137f7458a8 100644
--- a/modules/luci-base/po/el/base.po
+++ b/modules/luci-base/po/el/base.po
@@ -61,7 +61,6 @@ msgstr "-- Επιπλέον Πεδίο --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- ΠαÏακαλώ επιλέξτε --"
@@ -332,7 +331,7 @@ msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr ""
"ΕνεÏγές ΔιαδÏομές <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "ΕνεÏγές Συνδέσεις"
@@ -673,7 +672,7 @@ msgstr ""
msgid "Authentication"
msgstr "Εξουσιοδότηση"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -698,7 +697,7 @@ msgstr "Αυτόματη Ανανέωση"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -736,9 +735,9 @@ msgstr "Διαθέσιμο"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1059,12 +1058,13 @@ msgstr "Κλείσιμο λίστας..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Συλλογή δεδομένων..."
@@ -1202,7 +1202,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1386,7 +1386,7 @@ msgid "Description"
msgstr "ΠεÏιγÏαφή"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "ΠÏοοÏισμός"
@@ -1425,6 +1425,7 @@ msgid "Diagnostics"
msgstr "Διαγνωστικά"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1457,9 +1458,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1661,7 +1662,7 @@ msgstr "ΕνεÏγοποίηση <abbr title=\"Spanning Tree Protocol\">STP</abb
msgid "Enable HE.net dynamic endpoint update"
msgstr "ΕνεÏγοποίηση ενημέÏωσης Î´Ï…Î½Î±Î¼Î¹ÎºÎ¿Ï Ï„ÎµÏÎ¼Î±Ï„Î¹ÎºÎ¿Ï ÏƒÎ·Î¼ÎµÎ¯Î¿Ï… HE.net."
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1729,13 +1730,13 @@ msgstr ""
msgid "Enable this swap"
msgstr "ΕνεÏγοποίηση αυτής της swap"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "ΕνεÏγοποίηση/ΑπενεÏγοποίηση"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "ΕνεÏγοποιημένο"
@@ -1951,6 +1952,12 @@ msgstr "ΦλασάÏισμα Firmware"
msgid "Flash image..."
msgstr "ΦλασάÏισμα εικόνας..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "ΦλασάÏισμα νέας εικόνας υλικολογισμικοÏ"
@@ -1963,12 +1970,6 @@ msgstr "ΛειτουÏγίες φλασάÏισματος"
msgid "Flashing..."
msgstr "ΦλασάÏεται..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Επιβολή"
@@ -2158,7 +2159,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2464,7 +2465,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2478,7 +2479,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2554,11 +2555,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "ΣενάÏιο εκκίνησης"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "ΣενάÏια Εκκίνησης"
@@ -2915,7 +2916,7 @@ msgstr "Τοπική διεÏθυνση IPv6"
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr ""
@@ -3047,7 +3048,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3076,7 +3077,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "Μέγιστο επιτÏεπόμενο μέγεθος EDNS.0 UDP πακέτων"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr ""
"Μέγιστος αÏιθμός δευτεÏολέπτων αναμονής ώστε το modem να καταστεί έτοιμο"
@@ -3169,7 +3171,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr ""
@@ -3296,7 +3299,7 @@ msgstr "Μάσκα δικτÏου"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3345,7 +3348,7 @@ msgstr "Δε βÏέθηκαν αÏχεία"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Δεν υπάÏχουν πληÏοφοÏίες διαθέσιμες"
@@ -3599,7 +3602,7 @@ msgstr ""
msgid "Options"
msgstr "Επιλογές"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr ""
@@ -3677,7 +3680,7 @@ msgstr "Κάτοχος"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr ""
@@ -3688,7 +3691,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr ""
@@ -3819,9 +3822,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3879,7 +3882,7 @@ msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Πκτ."
@@ -3977,7 +3980,7 @@ msgstr "ΠÏωτ."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "ΠÏωτόκολλο"
@@ -4119,7 +4122,7 @@ msgstr "ΑÏχικοποίηση όλων των αλλαγών;"
msgid "Really switch protocol?"
msgstr "Αλλαγή Ï€Ïωτοκόλλου;"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Συνδέσεις Ï€ÏÎ±Î³Î¼Î±Ï„Î¹ÎºÎ¿Ï Ï‡Ïόνου"
@@ -4293,7 +4296,7 @@ msgstr "ΑÏχείο Resolve"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Επανεκκίνηση"
@@ -4650,7 +4653,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Πηγή"
@@ -4699,11 +4702,11 @@ msgid "Specify the secret encryption key here."
msgstr "ΟÏίστε το κÏυφό κλειδί κÏυπτογÏάφησης."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "ΑÏχή"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "ΠÏοτεÏαιότητα εκκίνησης"
@@ -4758,7 +4761,7 @@ msgid "Status"
msgstr "Κατάσταση"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr ""
@@ -4862,7 +4865,7 @@ msgstr "Ιδιότητες Συστήματος"
msgid "System log buffer size"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5145,7 +5148,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5193,7 +5196,7 @@ msgstr ""
"Αυτή η λίστα δίνει μία εικόνα των Ï„Ïέχοντων εÏγασιών συστήματος και της "
"κατάστασής τους."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr ""
"Αυτή η σελίδα δίνει μία εικόνα για τις Ï„Ïέχουσες ενεÏγές συνδέσεις δικτÏου."
@@ -5255,7 +5258,7 @@ msgstr ""
msgid "Traffic"
msgstr "Κίνηση"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "ΜεταφέÏθηκαν"
@@ -5310,7 +5313,7 @@ msgstr "ΙσχÏÏ‚ Εκπομπής"
msgid "Type"
msgstr "ΤÏπος"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5444,7 +5447,7 @@ msgstr "ΧÏήση Ï€Ïλης DHCP"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5496,7 +5499,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5510,7 +5513,7 @@ msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5530,7 +5533,7 @@ msgstr "ΧÏήση Ï€Ïοεπιλεγμένης Ï€Ïλης"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5800,7 +5803,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/en/base.po b/modules/luci-base/po/en/base.po
index 5da6daf19a..e748971112 100644
--- a/modules/luci-base/po/en/base.po
+++ b/modules/luci-base/po/en/base.po
@@ -61,7 +61,6 @@ msgstr "-- Additional Field --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Please choose --"
@@ -330,7 +329,7 @@ msgstr "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Active Connections"
@@ -664,7 +663,7 @@ msgstr ""
msgid "Authentication"
msgstr "Authentication"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -689,7 +688,7 @@ msgstr "Auto Refresh"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -727,9 +726,9 @@ msgstr "Available"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1047,12 +1046,13 @@ msgstr "Close list..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Collecting data..."
@@ -1190,7 +1190,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1375,7 +1375,7 @@ msgid "Description"
msgstr "Description"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Destination"
@@ -1414,6 +1414,7 @@ msgid "Diagnostics"
msgstr "Diagnostics"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1444,9 +1445,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1641,7 +1642,7 @@ msgstr "Enable <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1709,13 +1710,13 @@ msgstr ""
msgid "Enable this swap"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Enable/Disable"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Enabled"
@@ -1928,6 +1929,12 @@ msgstr "Flash Firmware"
msgid "Flash image..."
msgstr ""
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr ""
@@ -1940,12 +1947,6 @@ msgstr ""
msgid "Flashing..."
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Force"
@@ -2134,7 +2135,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2435,7 +2436,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2449,7 +2450,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2524,11 +2525,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Initscript"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Initscripts"
@@ -2885,7 +2886,7 @@ msgstr ""
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr ""
@@ -3017,7 +3018,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3046,7 +3047,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr ""
@@ -3138,7 +3140,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr ""
@@ -3264,7 +3267,7 @@ msgstr ""
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3313,7 +3316,7 @@ msgstr ""
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr ""
@@ -3567,7 +3570,7 @@ msgstr ""
msgid "Options"
msgstr "Options"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr ""
@@ -3645,7 +3648,7 @@ msgstr "Owner"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr ""
@@ -3656,7 +3659,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr ""
@@ -3787,9 +3790,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3847,7 +3850,7 @@ msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Pkts."
@@ -3944,7 +3947,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protocol"
@@ -4086,7 +4089,7 @@ msgstr ""
msgid "Really switch protocol?"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr ""
@@ -4260,7 +4263,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Restart"
@@ -4615,7 +4618,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Source"
@@ -4662,11 +4665,11 @@ msgid "Specify the secret encryption key here."
msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Start"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Start priority"
@@ -4721,7 +4724,7 @@ msgid "Status"
msgstr "Status"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Stop"
@@ -4825,7 +4828,7 @@ msgstr ""
msgid "System log buffer size"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr ""
@@ -5106,7 +5109,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5152,7 +5155,7 @@ msgstr ""
"This list gives an overview over currently running system processes and "
"their status."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "This page gives an overview over currently active network connections."
@@ -5212,7 +5215,7 @@ msgstr ""
msgid "Traffic"
msgstr "Traffic"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Transfer"
@@ -5267,7 +5270,7 @@ msgstr ""
msgid "Type"
msgstr "Type"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr ""
@@ -5401,7 +5404,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5453,7 +5456,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5467,7 +5470,7 @@ msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5487,7 +5490,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5759,7 +5762,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/es/base.po b/modules/luci-base/po/es/base.po
index ff174872a5..f285ecb9db 100644
--- a/modules/luci-base/po/es/base.po
+++ b/modules/luci-base/po/es/base.po
@@ -61,7 +61,6 @@ msgstr "-- Campo adicional --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Por favor elija --"
@@ -335,7 +334,7 @@ msgstr "Rutas <abbr title=\"Internet Protocol Version 4\">IPv4</abbr> activas"
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr "Rutas <abbr title=\"Internet Protocol Version 6\">IPv6</abbr> activas"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Conexiones activas"
@@ -686,7 +685,7 @@ msgstr "Grupo de autenticaciones"
msgid "Authentication"
msgstr "Autenticación"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr "Tipo de autenticación"
@@ -711,7 +710,7 @@ msgstr "Autorefrescar"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -751,9 +750,9 @@ msgstr "Disponible"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1081,12 +1080,13 @@ msgstr "Cerrar lista..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Un momento..."
@@ -1235,7 +1235,7 @@ msgstr ""
"sistema. Para evitar esto, primero realice un restablecimiento de fábrica."
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr "Intervalo de flash personalizado (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1420,7 +1420,7 @@ msgid "Description"
msgstr "Descripción"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Destino"
@@ -1459,6 +1459,7 @@ msgid "Diagnostics"
msgstr "Diagnósticos"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr "Marcar el número"
@@ -1491,9 +1492,9 @@ msgstr "Deshabilitar el sondeo de inactividad"
msgid "Disable this network"
msgstr "Deshabilitar esta red"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1696,7 +1697,7 @@ msgstr "Habilitar <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Habilitar actualización dinámica de punto final HE.net"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr "Habilitar negociación IPv6"
@@ -1765,13 +1766,13 @@ msgstr "Habilitar esta red"
msgid "Enable this swap"
msgstr "Habilitar este swap"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Habilitar/Deshabilitar"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Habilitado"
@@ -1993,6 +1994,12 @@ msgstr "Grabar firmware"
msgid "Flash image..."
msgstr "Grabar imagen..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "Grabar nueva imagen de firmware"
@@ -2005,12 +2012,6 @@ msgstr "Operaciones de grabado"
msgid "Flashing..."
msgstr "Grabando..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr "Acceso de escritura de memoria flash (%s)"
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Forzar"
@@ -2204,7 +2205,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr "Errores de código de error de encabezado (HEC)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr "Intervalo de ritmo (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2509,7 +2510,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2523,7 +2524,7 @@ msgstr "Si está desmarcado no se configurará una ruta por defecto"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2603,11 +2604,11 @@ msgstr "Información"
msgid "Initialization failure"
msgstr "Fallo de inicialización"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Nombre del script de inicio"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Scripts de inicio"
@@ -2978,7 +2979,7 @@ msgstr "Dirección local IPv6"
msgid "Local Service Only"
msgstr "Solo servicio local"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Arranque local"
@@ -3118,7 +3119,7 @@ msgstr ""
"siguientes comandos:"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3147,7 +3148,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "Tamaño máximo de paquetes EDNS.0 paquetes UDP"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "Segundos máximos de espera a que el módem esté activo"
@@ -3241,7 +3243,8 @@ msgid "Modem information query failed"
msgstr "Error en la consulta de información del módem"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "Espera de inicialización del modem"
@@ -3367,7 +3370,7 @@ msgstr "Máscara de red"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3416,7 +3419,7 @@ msgstr "No se han encontrado archivos"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "No hay información disponible"
@@ -3684,7 +3687,7 @@ msgstr "Opcional. Puerto UDP utilizado para paquetes salientes y entrantes."
msgid "Options"
msgstr "Opciones"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Otros:"
@@ -3764,7 +3767,7 @@ msgstr "Propietario"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "Contraseña PAP/CHAP"
@@ -3775,7 +3778,7 @@ msgstr "Contraseña PAP/CHAP"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "Nombre de usuario PAP/CHAP"
@@ -3906,9 +3909,9 @@ msgstr "Ruta a la clave privada interna"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3966,7 +3969,7 @@ msgstr "Ping"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Paq."
@@ -4065,7 +4068,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protocolo"
@@ -4224,7 +4227,7 @@ msgstr "¿Está seguro de restablecer todos los cambios?"
msgid "Really switch protocol?"
msgstr "¿Está seguro de querer cambiar el protocolo?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Conexiones en tiempo real"
@@ -4405,7 +4408,7 @@ msgstr "Archivo de resolución"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Reiniciar"
@@ -4771,7 +4774,7 @@ msgstr ""
"instalación específicas."
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Origen"
@@ -4827,11 +4830,11 @@ msgid "Specify the secret encryption key here."
msgstr "Especifique la clave de encriptación."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Iniciar"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Prioridad de inicio"
@@ -4890,7 +4893,7 @@ msgid "Status"
msgstr "Estado"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Detener"
@@ -4996,7 +4999,7 @@ msgstr "Propiedades del sistema"
msgid "System log buffer size"
msgstr "Tamaño del buffer de registro del sistema"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5328,7 +5331,7 @@ msgstr ""
"contraseña de la cuenta si no se ha configurado ninguna clave de "
"actualización"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5380,7 +5383,7 @@ msgid ""
"their status."
msgstr "Procesos del sistema que se están ejecutando actualmente y su estado."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "Conexiones de red activas."
@@ -5441,7 +5444,7 @@ msgstr "Traceroute"
msgid "Traffic"
msgstr "Tráfico"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Transferencia"
@@ -5496,7 +5499,7 @@ msgstr "Potencia-TX"
msgid "Type"
msgstr "Tipo"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5633,7 +5636,7 @@ msgstr "Usar puerta de enlace DHCP"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5685,7 +5688,7 @@ msgstr "Utilizar la gestión integrada de IPv6"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5699,7 +5702,7 @@ msgstr "Usar servidores DNS personalizados"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5719,7 +5722,7 @@ msgstr "Utilizar la puerta de enlace predeterminada"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -6000,7 +6003,7 @@ msgstr "Escribe el registro del sistema al archivo"
msgid "Yes"
msgstr "Si"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
@@ -6496,6 +6499,9 @@ msgstr "Si"
msgid "« Back"
msgstr "« Volver"
+#~ msgid "Flashmemory write access (%s)"
+#~ msgstr "Acceso de escritura de memoria flash (%s)"
+
#~ msgid ""
#~ "one of:\n"
#~ " - %s"
diff --git a/modules/luci-base/po/fr/base.po b/modules/luci-base/po/fr/base.po
index 39ce9b54d2..e03a5dd43e 100644
--- a/modules/luci-base/po/fr/base.po
+++ b/modules/luci-base/po/fr/base.po
@@ -61,7 +61,6 @@ msgstr "-- Champ Supplémentaire --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Choisir --"
@@ -335,7 +334,7 @@ msgstr "Routes <abbr title=\"Internet Protocol Version 4\">IPv4</abbr> actives"
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr "Routes <abbr title=\"Internet Protocol Version 6\">IPv6</abbr> actives"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Connexions actives"
@@ -676,7 +675,7 @@ msgstr ""
msgid "Authentication"
msgstr "Authentification"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -701,7 +700,7 @@ msgstr "Rafraîchissement automatique"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -739,9 +738,9 @@ msgstr "Disponible"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1062,12 +1061,13 @@ msgstr "Fermer la liste…"
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Récupération de données..."
@@ -1205,7 +1205,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1390,7 +1390,7 @@ msgid "Description"
msgstr "Description"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Destination"
@@ -1429,6 +1429,7 @@ msgid "Diagnostics"
msgstr "Diagnostics"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1461,9 +1462,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1665,7 +1666,7 @@ msgstr "Activer le protocole <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Activer la mise à jour dynamique de l'extrémité du tunnel chez HE.net"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1733,13 +1734,13 @@ msgstr ""
msgid "Enable this swap"
msgstr "Activer cette mémoire d'échange (swap)"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Activer/Désactiver"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Activé"
@@ -1957,6 +1958,12 @@ msgstr "Mise à jour du micrologiciel"
msgid "Flash image..."
msgstr "Écriture de l'image…"
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "Écrire l'image du nouveau micrologiciel"
@@ -1969,12 +1976,6 @@ msgstr "Opérations d'écriture"
msgid "Flashing..."
msgstr "Écriture…"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Forcer"
@@ -2165,7 +2166,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2470,7 +2471,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2484,7 +2485,7 @@ msgstr "Décoché, aucune route par défaut n'est configurée"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2558,11 +2559,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Script d'initialisation"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Scripts d'initialisation"
@@ -2926,7 +2927,7 @@ msgstr "Adresse IPv6 locale"
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Démarrage local"
@@ -3067,7 +3068,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3096,7 +3097,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "Taille maximum autorisée des paquets UDP EDNS.0"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "Délai d'attente maximum que le modem soit prêt"
@@ -3188,7 +3190,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "Délai max. d'initialisation du modem"
@@ -3314,7 +3317,7 @@ msgstr "Masque de réseau"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3363,7 +3366,7 @@ msgstr "Aucun fichier trouvé"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Information indisponible"
@@ -3615,7 +3618,7 @@ msgstr ""
msgid "Options"
msgstr "Options"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Autres :"
@@ -3695,7 +3698,7 @@ msgstr "Propriétaire"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "Mot de passe PAP/CHAP"
@@ -3706,7 +3709,7 @@ msgstr "Mot de passe PAP/CHAP"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "Identifiant PAP/CHAP"
@@ -3837,9 +3840,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3897,7 +3900,7 @@ msgstr "Ping"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Pqts."
@@ -3996,7 +3999,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protocole"
@@ -4140,7 +4143,7 @@ msgstr "Voulez-vous vraiment ré-initialiser toutes les modifications ?"
msgid "Really switch protocol?"
msgstr "Voulez-vous vraiment changer de protocole ?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Connexions temps-réel"
@@ -4314,7 +4317,7 @@ msgstr "Fichier de résolution des noms"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Redémarrer"
@@ -4677,7 +4680,7 @@ msgstr ""
"matériel."
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Source"
@@ -4726,11 +4729,11 @@ msgid "Specify the secret encryption key here."
msgstr "Spécifiez ici la clé secrète de chiffrage."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Démarrer"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Priorité de démarrage"
@@ -4789,7 +4792,7 @@ msgid "Status"
msgstr "Status"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Arrêter"
@@ -4893,7 +4896,7 @@ msgstr "Propriétés système"
msgid "System log buffer size"
msgstr "Taille du tampon du journal système"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP :"
@@ -5211,7 +5214,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5262,7 +5265,7 @@ msgstr ""
"Cette liste donne une vue d'ensemble des processus en exécution et leur "
"statut."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr ""
"Cette page donne une vue d'ensemble des connexions réseaux actuellement "
@@ -5325,7 +5328,7 @@ msgstr "Traceroute"
msgid "Traffic"
msgstr "Trafic"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Transfert"
@@ -5380,7 +5383,7 @@ msgstr "Puissance d'émission"
msgid "Type"
msgstr "Type"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP :"
@@ -5518,7 +5521,7 @@ msgstr "Utiliser la passerelle DHCP"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5570,7 +5573,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5584,7 +5587,7 @@ msgstr "Utiliser des serveurs DNS spécifiques"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5604,7 +5607,7 @@ msgstr "Utiliser la passerelle par défaut"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5880,7 +5883,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/he/base.po b/modules/luci-base/po/he/base.po
index 8fbc29f323..0f2dde1d24 100644
--- a/modules/luci-base/po/he/base.po
+++ b/modules/luci-base/po/he/base.po
@@ -59,7 +59,6 @@ msgstr "-- שדה נוסף --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- × × ×œ×‘×—×•×¨ --"
@@ -323,7 +322,7 @@ msgstr ""
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "×—×™×‘×•×¨×™× ×¤×¢×™×œ×™×"
@@ -665,7 +664,7 @@ msgstr ""
msgid "Authentication"
msgstr "×ימות"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -690,7 +689,7 @@ msgstr "רענון ×וטומטי"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -728,9 +727,9 @@ msgstr "זמין"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1041,12 +1040,13 @@ msgstr "סגור רשימה..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "×וסף מידע..."
@@ -1184,7 +1184,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1368,7 +1368,7 @@ msgid "Description"
msgstr "תי×ור"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "יעד"
@@ -1407,6 +1407,7 @@ msgid "Diagnostics"
msgstr "×בחון"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1437,9 +1438,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1627,7 +1628,7 @@ msgstr "×פשר <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1695,13 +1696,13 @@ msgstr ""
msgid "Enable this swap"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "×פשר"
@@ -1914,6 +1915,12 @@ msgstr ""
msgid "Flash image..."
msgstr ""
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr ""
@@ -1926,12 +1933,6 @@ msgstr ""
msgid "Flashing..."
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr ""
@@ -2120,7 +2121,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2419,7 +2420,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2433,7 +2434,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2503,11 +2504,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr ""
@@ -2861,7 +2862,7 @@ msgstr "כתובת IPv6 מקומית"
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr ""
@@ -2993,7 +2994,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3022,7 +3023,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr ""
@@ -3114,7 +3116,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr ""
@@ -3238,7 +3241,7 @@ msgstr ""
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3287,7 +3290,7 @@ msgstr ""
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr ""
@@ -3535,7 +3538,7 @@ msgstr ""
msgid "Options"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr ""
@@ -3613,7 +3616,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr ""
@@ -3624,7 +3627,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr ""
@@ -3755,9 +3758,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3815,7 +3818,7 @@ msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr ""
@@ -3912,7 +3915,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr ""
@@ -4052,7 +4055,7 @@ msgstr ""
msgid "Really switch protocol?"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr ""
@@ -4226,7 +4229,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr ""
@@ -4582,7 +4585,7 @@ msgstr ""
"×ל ×”-wiki של OpenWrt עבור הור×ות ספציפיות למכשיר שלך."
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "מקור"
@@ -4629,11 +4632,11 @@ msgid "Specify the secret encryption key here."
msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr ""
@@ -4691,7 +4694,7 @@ msgid "Status"
msgstr "מצב"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "עצור"
@@ -4795,7 +4798,7 @@ msgstr ""
msgid "System log buffer size"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5065,7 +5068,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5107,7 +5110,7 @@ msgid ""
"their status."
msgstr "רשימה זו מציגה סקירה של תהליכי המערכת ×”×¨×¦×™× ×›×¨×’×¢ ו×ת מצב×."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "דף ×–×” מציג סקירה של חיבורי הרשת ×”×¤×¢×™×œ×™× ×›×¨×’×¢."
@@ -5165,7 +5168,7 @@ msgstr ""
msgid "Traffic"
msgstr "תעבורה"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "העברה"
@@ -5220,7 +5223,7 @@ msgstr "עוצמת שידור"
msgid "Type"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5354,7 +5357,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5406,7 +5409,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5420,7 +5423,7 @@ msgstr "השתמש בשרתי DNS מות××ž×™× ×ישית"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5440,7 +5443,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5710,7 +5713,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/hu/base.po b/modules/luci-base/po/hu/base.po
index 83e5f83097..3eedb5e656 100644
--- a/modules/luci-base/po/hu/base.po
+++ b/modules/luci-base/po/hu/base.po
@@ -59,7 +59,6 @@ msgstr "-- További mező --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Kérem válasszon --"
@@ -330,7 +329,7 @@ msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr ""
"Aktív <abbr title=\"Internet Protocol Version 6\">IPv6</abbr> útvonalak"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Aktív kapcsolatok"
@@ -669,7 +668,7 @@ msgstr ""
msgid "Authentication"
msgstr "Hitelesítés"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -694,7 +693,7 @@ msgstr "Automatikus frissítés"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -732,9 +731,9 @@ msgstr "Elérhető"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1057,12 +1056,13 @@ msgstr "Lista bezárása..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Adatok összegyűjtése..."
@@ -1200,7 +1200,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1384,7 +1384,7 @@ msgid "Description"
msgstr "Leírás"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Cél"
@@ -1423,6 +1423,7 @@ msgid "Diagnostics"
msgstr "Diagnosztika"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1455,9 +1456,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1658,7 +1659,7 @@ msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> engedélyezése"
msgid "Enable HE.net dynamic endpoint update"
msgstr "HE.net dinamikus végpont frissítésének engedélyezése"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1726,13 +1727,13 @@ msgstr ""
msgid "Enable this swap"
msgstr "A lapozó terület engedélyezése"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Engedélyezés/Letiltás"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Engedélyezve"
@@ -1946,6 +1947,12 @@ msgstr "Firmware flash-elés"
msgid "Flash image..."
msgstr "Flash image..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "Új firmware image flash-elése"
@@ -1958,12 +1965,6 @@ msgstr "Flash műveletek"
msgid "Flashing..."
msgstr "Flash-elés..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Kényszerítés"
@@ -2154,7 +2155,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2457,7 +2458,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2471,7 +2472,7 @@ msgstr "Ha nincs kiválasztva, akkor nincs alapértelmezett útvonal beállítva
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2548,11 +2549,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Indítási állomány"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Indítási állományok"
@@ -2916,7 +2917,7 @@ msgstr "Helyi IPv6 cím"
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Helyi indítóscript"
@@ -3056,7 +3057,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3085,7 +3086,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "EDNS.0 UDP csomagok maximális mérete"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "Maximális várakozási idő a modem kész állapotára (másodpercben)"
@@ -3177,7 +3179,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "Modem inicializálás időtúllépés"
@@ -3303,7 +3306,7 @@ msgstr "Hálózati maszk"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3352,7 +3355,7 @@ msgstr "Nem találhatók fájlok"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Nincs elérhető információ"
@@ -3605,7 +3608,7 @@ msgstr ""
msgid "Options"
msgstr "Lehetőségek"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Egyéb:"
@@ -3685,7 +3688,7 @@ msgstr "Tulajdonos"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "PAP/CHAP jelszó"
@@ -3696,7 +3699,7 @@ msgstr "PAP/CHAP jelszó"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "PAP/CHAP felhasználói név"
@@ -3827,9 +3830,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3887,7 +3890,7 @@ msgstr "Ping"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "csom."
@@ -3986,7 +3989,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protokoll"
@@ -4131,7 +4134,7 @@ msgstr "Biztos, hogy visszavonja az összes módosítást?"
msgid "Really switch protocol?"
msgstr "Biztos, hogy cserélni szeretné a protokollt?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Valósidejű kapcsolatok"
@@ -4306,7 +4309,7 @@ msgstr "Resolv fájl"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Újraindítás"
@@ -4667,7 +4670,7 @@ msgstr ""
"utasításokért keresse fel az wiki-t."
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Forrás"
@@ -4717,11 +4720,11 @@ msgid "Specify the secret encryption key here."
msgstr "Itt adja meg a titkosító kulcsot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Indítás"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Indítás prioritása"
@@ -4780,7 +4783,7 @@ msgid "Status"
msgstr "Ãllapot"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Leállítás"
@@ -4884,7 +4887,7 @@ msgstr "Rendszer tulajdonságok"
msgid "System log buffer size"
msgstr "Rendszer napló puffer méret"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5199,7 +5202,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5251,7 +5254,7 @@ msgstr ""
"Ez a lista a rendszerben jelenleg futó folyamatokról és azok állapotáról ad "
"áttekintést."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr ""
"Ez a lap a rendszerben jelenleg aktív hálózati kapcsolatokról ad áttekintést."
@@ -5313,7 +5316,7 @@ msgstr "Traceroute"
msgid "Traffic"
msgstr "Forgalom"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Ãtvitel"
@@ -5368,7 +5371,7 @@ msgstr "Adóteljesítmény"
msgid "Type"
msgstr "Típus"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5505,7 +5508,7 @@ msgstr "DHCP kiszolgáló használata"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5557,7 +5560,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5571,7 +5574,7 @@ msgstr "Egyedi DNS szerverek használata"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5591,7 +5594,7 @@ msgstr "Alapértelmezett átjáró használata"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5867,7 +5870,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/it/base.po b/modules/luci-base/po/it/base.po
index 73c63ebeb7..9f68ae2c6c 100644
--- a/modules/luci-base/po/it/base.po
+++ b/modules/luci-base/po/it/base.po
@@ -61,7 +61,6 @@ msgstr "-- Campo aggiuntivo --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Per favore scegli --"
@@ -339,7 +338,7 @@ msgstr ""
"Instradamento <abbr title=\"Protocollo Internet Versione 6\">IPv6</abbr> "
"attivo"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Connessioni attive"
@@ -678,7 +677,7 @@ msgstr ""
msgid "Authentication"
msgstr "Autenticazione PEAP"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -703,7 +702,7 @@ msgstr "Aggiornamento Automatico"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -741,9 +740,9 @@ msgstr "Disponibile"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1063,12 +1062,13 @@ msgstr "Scegliere dall'elenco..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Raccolgo i dati..."
@@ -1206,7 +1206,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1391,7 +1391,7 @@ msgid "Description"
msgstr "Descrizione"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Destinazione"
@@ -1430,6 +1430,7 @@ msgid "Diagnostics"
msgstr "Diagnostica"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1462,9 +1463,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1662,7 +1663,7 @@ msgstr "Abilita <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Abilitazione aggiornamento endpoint dinamico HE.net"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr "Abilita negoziazione IPv6"
@@ -1730,13 +1731,13 @@ msgstr ""
msgid "Enable this swap"
msgstr "Abilita questo swap"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Abilita/Disabilita"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Abilitato"
@@ -1951,6 +1952,12 @@ msgstr "Flash Firmware"
msgid "Flash image..."
msgstr "Flash immagine..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "Flash immagine nuovo firmware"
@@ -1963,12 +1970,6 @@ msgstr "Operazioni Flash"
msgid "Flashing..."
msgstr "Flashing..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Forza"
@@ -2159,7 +2160,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2465,7 +2466,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2479,7 +2480,7 @@ msgstr "Se deselezionata, alcun percorso predefinito è configurato"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2556,11 +2557,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Script di avvio"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Scripts di avvio"
@@ -2919,7 +2920,7 @@ msgstr "Indirizzo IPv6 locale"
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Avvio Locale"
@@ -3057,7 +3058,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3086,7 +3087,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr ""
@@ -3178,7 +3180,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr ""
@@ -3304,7 +3307,7 @@ msgstr "Maschera di rete"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3353,7 +3356,7 @@ msgstr "Nessun file trovato"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Nessuna informazione disponibile"
@@ -3606,7 +3609,7 @@ msgstr ""
msgid "Options"
msgstr "Opzioni"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Altro:"
@@ -3686,7 +3689,7 @@ msgstr "Proprietario"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr ""
@@ -3697,7 +3700,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr ""
@@ -3828,9 +3831,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3888,7 +3891,7 @@ msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr ""
@@ -3985,7 +3988,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protocollo"
@@ -4130,7 +4133,7 @@ msgstr "Azzerare veramente tutte le modifiche?"
msgid "Really switch protocol?"
msgstr "Cambiare veramente il protocollo?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Connessioni in Tempo Reale"
@@ -4304,7 +4307,7 @@ msgstr "File Resolve"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Riavvia"
@@ -4663,7 +4666,7 @@ msgstr ""
"specifici."
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Origine"
@@ -4714,11 +4717,11 @@ msgid "Specify the secret encryption key here."
msgstr "Specificare la chiave di cifratura qui."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Inizio"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Priorità di avvio"
@@ -4777,7 +4780,7 @@ msgid "Status"
msgstr "Stato"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Ferma"
@@ -4881,7 +4884,7 @@ msgstr "Proprietà di Sistema"
msgid "System log buffer size"
msgstr "Dimensione Buffer Log di Sistema"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5172,7 +5175,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5220,7 +5223,7 @@ msgstr ""
"Questa lista da un riassunto dei processi correntemente attivi e del loro "
"stato."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "Questa pagina ti da una riassunto delle connessioni al momento attive."
@@ -5280,7 +5283,7 @@ msgstr ""
msgid "Traffic"
msgstr "Traffico"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr ""
@@ -5335,7 +5338,7 @@ msgstr ""
msgid "Type"
msgstr "Tipo"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr ""
@@ -5472,7 +5475,7 @@ msgstr "Usa il DHCP del gateway"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5524,7 +5527,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5538,7 +5541,7 @@ msgstr "Usa server DNS personalizzati"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5558,7 +5561,7 @@ msgstr "Usa il gateway predefinito"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5836,7 +5839,7 @@ msgstr "Scrivi registro di sistema su file"
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/ja/base.po b/modules/luci-base/po/ja/base.po
index cddf5c38c2..7518db81fc 100644
--- a/modules/luci-base/po/ja/base.po
+++ b/modules/luci-base/po/ja/base.po
@@ -61,7 +61,6 @@ msgstr "-- 追加項目 --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- é¸æŠžã—ã¦ãã ã•ã„ --"
@@ -332,7 +331,7 @@ msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr ""
"稼åƒä¸­ã® <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-経路情報"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "アクティブ コãƒã‚¯ã‚·ãƒ§ãƒ³"
@@ -672,7 +671,7 @@ msgstr "èªè¨¼ã‚°ãƒ«ãƒ¼ãƒ—"
msgid "Authentication"
msgstr "èªè¨¼"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -697,7 +696,7 @@ msgstr "自動更新"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -735,9 +734,9 @@ msgstr "使用å¯"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1064,12 +1063,13 @@ msgstr "リストを閉ã˜ã‚‹"
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "データåŽé›†ä¸­ã§ã™..."
@@ -1216,7 +1216,7 @@ msgstr ""
"防ãã«ã¯ã€ã¾ãšæœ€åˆã« factory-reset ã‚’è¡Œã„ã¾ã™ã€‚"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr "カスタムãªç‚¹æ»…é–“éš” (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1400,7 +1400,7 @@ msgid "Description"
msgstr "詳細"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "宛先"
@@ -1439,6 +1439,7 @@ msgid "Diagnostics"
msgstr "診断機能"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1471,9 +1472,9 @@ msgstr "éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–状態ãƒãƒ¼ãƒªãƒ³ã‚°ã‚’無効化"
msgid "Disable this network"
msgstr "ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’無効ã«ã—ã¾ã™"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1675,7 +1676,7 @@ msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr>を有効ã«ã™ã‚‹"
msgid "Enable HE.net dynamic endpoint update"
msgstr "HE.netã®å‹•çš„endpoint更新を有効ã«ã—ã¾ã™"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr "IPv6 ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã®æœ‰åŠ¹åŒ–"
@@ -1743,13 +1744,13 @@ msgstr "ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’有効ã«ã—ã¾ã™"
msgid "Enable this swap"
msgstr "スワップ設定を有効ã«ã™ã‚‹"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "有効 / 無効"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "有効"
@@ -1968,6 +1969,12 @@ msgstr "ファームウェアã®æ›´æ–°"
msgid "Flash image..."
msgstr "æ›´æ–°"
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "ファームウェアã®æ›´æ–°"
@@ -1980,12 +1987,6 @@ msgstr "更新機能"
msgid "Flashing..."
msgstr "更新中..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr "フラッシュメモリー 書込アクセス (%s)"
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "強制"
@@ -2177,7 +2178,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr "ãƒãƒ¼ãƒˆãƒ“ート (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2481,7 +2482,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2495,7 +2496,7 @@ msgstr "ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ãªã„å ´åˆã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ ルートã¯æ§‹æˆ
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2572,11 +2573,11 @@ msgstr "情報"
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "起動スクリプト"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "起動スクリプト"
@@ -2941,7 +2942,7 @@ msgstr "ローカル IPv6 アドレス"
msgid "Local Service Only"
msgstr "ローカルサービスã®ã¿"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "ローカル スタートアップ"
@@ -3081,7 +3082,7 @@ msgstr ""
"以下ã®ã‚ˆã†ãªã‚³ãƒžãƒ³ãƒ‰ã‚’使用ã—ã¦ã€ãƒ«ãƒ¼ãƒˆ ファイルシステムを複製ã—ã¦ãã ã•ã„:"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3110,7 +3111,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "EDNS.0 UDP パケットサイズã®è¨±å¯ã•ã‚Œã‚‹æœ€å¤§æ•°"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "モデムãŒæº–備完了状態ã«ãªã‚‹ã¾ã§ã®æœ€å¤§å¾…ã¡æ™‚é–“"
@@ -3204,7 +3206,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "モデムåˆæœŸåŒ–タイムアウト"
@@ -3330,7 +3333,7 @@ msgstr "ãƒãƒƒãƒˆãƒžã‚¹ã‚¯"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3379,7 +3382,7 @@ msgstr "ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "情報ãŒã‚ã‚Šã¾ã›ã‚“"
@@ -3639,7 +3642,7 @@ msgstr "発信パケットã¨å—信パケットã«ä½¿ç”¨ã•ã‚Œã‚‹UDPãƒãƒ¼ãƒˆï¼ˆ
msgid "Options"
msgstr "オプション"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "ãã®ä»–:"
@@ -3719,7 +3722,7 @@ msgstr "所有者"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "PAP/CHAP パスワード"
@@ -3730,7 +3733,7 @@ msgstr "PAP/CHAP パスワード"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "PAP/CHAP ユーザーå"
@@ -3861,9 +3864,9 @@ msgstr "秘密éµã®ãƒ‘ス"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3921,7 +3924,7 @@ msgstr "Ping"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "パケット"
@@ -4020,7 +4023,7 @@ msgstr "プロトコル"
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "プロトコル"
@@ -4175,7 +4178,7 @@ msgstr "本当ã«å…¨ã¦ã®å¤‰æ›´ã‚’リセットã—ã¾ã™ã‹?"
msgid "Really switch protocol?"
msgstr "本当ã«ãƒ—ロトコルを切り替ãˆã¾ã™ã‹?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "リアルタイム・コãƒã‚¯ã‚·ãƒ§ãƒ³"
@@ -4351,7 +4354,7 @@ msgstr "リゾルãƒãƒ•ã‚¡ã‚¤ãƒ«"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "å†èµ·å‹•"
@@ -4714,7 +4717,7 @@ msgstr ""
"デãƒã‚¤ã‚¹ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ‰‹é †ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "é€ä¿¡å…ƒ"
@@ -4765,11 +4768,11 @@ msgid "Specify the secret encryption key here."
msgstr "æš—å·éµã‚’設定ã—ã¾ã™ã€‚"
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "開始"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "優先順ä½"
@@ -4827,7 +4830,7 @@ msgid "Status"
msgstr "ステータス"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "åœæ­¢"
@@ -4933,7 +4936,7 @@ msgstr "システム プロパティ"
msgid "System log buffer size"
msgstr "システムログ ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚º"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5254,7 +5257,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5306,7 +5309,7 @@ msgstr ""
"ã“ã®ãƒªã‚¹ãƒˆã¯ç¾åœ¨ã‚·ã‚¹ãƒ†ãƒ ã§å‹•ä½œã—ã¦ã„るプロセスã¨ãã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’表示ã—ã¦ã„ã¾"
"ã™ã€‚"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€ç¾åœ¨ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’表示ã—ã¾ã™ã€‚"
@@ -5366,7 +5369,7 @@ msgstr "Traceroute"
msgid "Traffic"
msgstr "トラフィック"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "転é€"
@@ -5421,7 +5424,7 @@ msgstr "é€ä¿¡é›»åŠ›"
msgid "Type"
msgstr "タイプ"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5559,7 +5562,7 @@ msgstr "DHCPゲートウェイを使用ã™ã‚‹"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5611,7 +5614,7 @@ msgstr "ビルトインã®IPv6-マãƒã‚¸ãƒ¡ãƒ³ãƒˆã‚’使用ã™ã‚‹"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5625,7 +5628,7 @@ msgstr "DNSサーãƒãƒ¼ã‚’手動ã§è¨­å®š"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5645,7 +5648,7 @@ msgstr "デフォルト ゲートウェイを使用ã™ã‚‹"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5925,7 +5928,7 @@ msgstr "システムログをファイルã«æ›¸ã込む"
msgid "Yes"
msgstr "ã¯ã„"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
@@ -6420,6 +6423,9 @@ msgstr "ã¯ã„"
msgid "« Back"
msgstr "« 戻る"
+#~ msgid "Flashmemory write access (%s)"
+#~ msgstr "フラッシュメモリー 書込アクセス (%s)"
+
#~ msgid ""
#~ "one of:\n"
#~ " - %s"
diff --git a/modules/luci-base/po/ko/base.po b/modules/luci-base/po/ko/base.po
index 8f0efb9897..ae96f4e2db 100644
--- a/modules/luci-base/po/ko/base.po
+++ b/modules/luci-base/po/ko/base.po
@@ -61,7 +61,6 @@ msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr ""
@@ -325,7 +324,7 @@ msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr ""
"Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Route 경로"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Active 연결수"
@@ -658,7 +657,7 @@ msgstr ""
msgid "Authentication"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -683,7 +682,7 @@ msgstr "ìžë™ Refresh"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -721,9 +720,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1041,12 +1040,13 @@ msgstr "ëª©ë¡ ë‹«ê¸°..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Data 를 수집중입니다..."
@@ -1184,7 +1184,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1369,7 +1369,7 @@ msgid "Description"
msgstr "설명"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr ""
@@ -1408,6 +1408,7 @@ msgid "Diagnostics"
msgstr "진단"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1440,9 +1441,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1635,7 +1636,7 @@ msgstr "<abbr title=\"Spanning Tree Protocol\">STP</abbr> 활성화"
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1703,13 +1704,13 @@ msgstr ""
msgid "Enable this swap"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "활성/비활성"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "활성화ë¨"
@@ -1922,6 +1923,12 @@ msgstr ""
msgid "Flash image..."
msgstr "ì´ë¯¸ì§€ë¡œ Flash..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "새로운 firmware ì´ë¯¸ì§€ë¡œ flash"
@@ -1934,12 +1941,6 @@ msgstr "Flash ìž‘ì—…"
msgid "Flashing..."
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "강제하기"
@@ -2128,7 +2129,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2428,7 +2429,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2442,7 +2443,7 @@ msgstr "ì²´í¬í•˜ì§€ ì•Šì„ ê²½ìš°, 기본 route ê°€ 설정ë˜ì§€ 않습니다"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2512,11 +2513,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Initscript 들"
@@ -2872,7 +2873,7 @@ msgstr ""
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Local 시작 프로그램"
@@ -3004,7 +3005,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3033,7 +3034,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "í—ˆìš©ëœ ìµœëŒ€ EDNS.0 UDP 패킷 í¬ê¸°"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr ""
@@ -3125,7 +3127,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr ""
@@ -3249,7 +3252,7 @@ msgstr ""
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3298,7 +3301,7 @@ msgstr ""
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "ì´ìš© 가능한 ì •ë³´ê°€ 없습니다"
@@ -3552,7 +3555,7 @@ msgstr ""
msgid "Options"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr ""
@@ -3632,7 +3635,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr ""
@@ -3643,7 +3646,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr ""
@@ -3774,9 +3777,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3834,7 +3837,7 @@ msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Pkts."
@@ -3931,7 +3934,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "프로토콜"
@@ -4073,7 +4076,7 @@ msgstr ""
msgid "Really switch protocol?"
msgstr "ì •ë§ í”„ë¡œí† ì½œ ë³€ê²½ì„ ì›í•˜ì„¸ìš”?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "실시간 연결수"
@@ -4247,7 +4250,7 @@ msgstr "Resolve 파ì¼"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "재시작"
@@ -4602,7 +4605,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr ""
@@ -4649,11 +4652,11 @@ msgid "Specify the secret encryption key here."
msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "시작"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "시작 우선순위"
@@ -4711,7 +4714,7 @@ msgid "Status"
msgstr "ìƒíƒœ"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "정지"
@@ -4815,7 +4818,7 @@ msgstr "시스템 ë“±ë¡ ì •ë³´"
msgid "System log buffer size"
msgstr "System log ë²„í¼ í¬ê¸°"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr ""
@@ -5099,7 +5102,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5144,7 +5147,7 @@ msgid ""
msgstr ""
"ì´ ëª©ë¡ì€ 현재 ì‹¤í–‰ì¤‘ì¸ ì‹œìŠ¤í…œ 프로세스와 해당 ìƒíƒœì— 대한 개요를 ë³´ì—¬ì¤ë‹ˆë‹¤."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "ì´ íŽ˜ì´ì§€ëŠ” 현재 active ìƒíƒœì¸ ë„¤íŠ¸ì›Œí¬ ì—°ê²°ì„ ë³´ì—¬ì¤ë‹ˆë‹¤."
@@ -5204,7 +5207,7 @@ msgstr ""
msgid "Traffic"
msgstr "트래픽"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "전송량"
@@ -5259,7 +5262,7 @@ msgstr ""
msgid "Type"
msgstr "유형"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr ""
@@ -5396,7 +5399,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5448,7 +5451,7 @@ msgstr "ìžì²´ 내장 IPv6-관리 기능 사용"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5462,7 +5465,7 @@ msgstr "ìž„ì˜ì˜ DNS 서버 사용"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5482,7 +5485,7 @@ msgstr "Default gateway 사용"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5757,7 +5760,7 @@ msgstr "System log 출력 íŒŒì¼ ê²½ë¡œ"
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/ms/base.po b/modules/luci-base/po/ms/base.po
index ee09ed1535..6203dbadeb 100644
--- a/modules/luci-base/po/ms/base.po
+++ b/modules/luci-base/po/ms/base.po
@@ -61,7 +61,6 @@ msgstr "-- Gelanggang Tambahan --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Sila pilih --"
@@ -320,7 +319,7 @@ msgstr "Aktive IPv4-Routen"
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr "Aktif IPv6-Laluan"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Sambungan Aktif"
@@ -653,7 +652,7 @@ msgstr ""
msgid "Authentication"
msgstr "Authentifizierung"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -678,7 +677,7 @@ msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -716,9 +715,9 @@ msgstr "Boleh didapati"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1026,12 +1025,13 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr ""
@@ -1169,7 +1169,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1349,7 +1349,7 @@ msgid "Description"
msgstr "Keterangan"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Tempat tujuan"
@@ -1388,6 +1388,7 @@ msgid "Diagnostics"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1418,9 +1419,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1612,7 +1613,7 @@ msgstr "Mengaktifkan <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1680,13 +1681,13 @@ msgstr ""
msgid "Enable this swap"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr ""
@@ -1899,6 +1900,12 @@ msgstr "Firmware Flash"
msgid "Flash image..."
msgstr ""
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr ""
@@ -1911,12 +1918,6 @@ msgstr ""
msgid "Flashing..."
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Paksa"
@@ -2105,7 +2106,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2406,7 +2407,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2420,7 +2421,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2495,11 +2496,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr ""
@@ -2857,7 +2858,7 @@ msgstr ""
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr ""
@@ -2989,7 +2990,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3018,7 +3019,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr ""
@@ -3110,7 +3112,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr ""
@@ -3236,7 +3239,7 @@ msgstr ""
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3285,7 +3288,7 @@ msgstr ""
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr ""
@@ -3538,7 +3541,7 @@ msgstr ""
msgid "Options"
msgstr "Pilihan"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr ""
@@ -3616,7 +3619,7 @@ msgstr "Pemilik"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr ""
@@ -3627,7 +3630,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr ""
@@ -3758,9 +3761,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3818,7 +3821,7 @@ msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Pkts."
@@ -3915,7 +3918,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protokol"
@@ -4056,7 +4059,7 @@ msgstr ""
msgid "Really switch protocol?"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr ""
@@ -4230,7 +4233,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr ""
@@ -4585,7 +4588,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Sumber"
@@ -4632,11 +4635,11 @@ msgid "Specify the secret encryption key here."
msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Mula"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr ""
@@ -4691,7 +4694,7 @@ msgid "Status"
msgstr "Status"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr ""
@@ -4795,7 +4798,7 @@ msgstr ""
msgid "System log buffer size"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr ""
@@ -5078,7 +5081,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5124,7 +5127,7 @@ msgstr ""
"Senarai ini memberikan gambaran lebih pada proses sistem yang sedang "
"berjalan dan statusnya."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr ""
"Laman ini memberikan gambaran lebih dari saat ini sambungan rangkaian yang "
@@ -5183,7 +5186,7 @@ msgstr ""
msgid "Traffic"
msgstr "Lalu lintas"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Pemindahan"
@@ -5238,7 +5241,7 @@ msgstr ""
msgid "Type"
msgstr "Jenis"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr ""
@@ -5372,7 +5375,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5424,7 +5427,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5438,7 +5441,7 @@ msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5458,7 +5461,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5730,7 +5733,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/no/base.po b/modules/luci-base/po/no/base.po
index ad06b299c3..fca2c9e0cb 100644
--- a/modules/luci-base/po/no/base.po
+++ b/modules/luci-base/po/no/base.po
@@ -56,7 +56,6 @@ msgstr "-- Tilleggs Felt --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Vennligst velg --"
@@ -329,7 +328,7 @@ msgstr "Aktive <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Ruter"
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr "Aktive <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Ruter"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Aktive Tilkoblinger"
@@ -662,7 +661,7 @@ msgstr ""
msgid "Authentication"
msgstr "Godkjenning"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -687,7 +686,7 @@ msgstr "Automatisk oppdatering"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -725,9 +724,9 @@ msgstr "Tilgjengelig"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1047,12 +1046,13 @@ msgstr "Lukk liste..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Henter data..."
@@ -1190,7 +1190,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1374,7 +1374,7 @@ msgid "Description"
msgstr "Beskrivelse"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Destinasjon"
@@ -1413,6 +1413,7 @@ msgid "Diagnostics"
msgstr "Nettverksdiagnostikk"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1445,9 +1446,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1646,7 +1647,7 @@ msgstr "Aktiver <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Aktiver HE,net dynamisk endepunkt oppdatering"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1714,13 +1715,13 @@ msgstr ""
msgid "Enable this swap"
msgstr "Aktiver denne swapenhet"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Aktiver/Deaktiver"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Aktivert"
@@ -1934,6 +1935,12 @@ msgstr "Firmware Oppradering"
msgid "Flash image..."
msgstr "Flash firmware..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "Flash nytt firmware image"
@@ -1946,12 +1953,6 @@ msgstr "Flash operasjoner"
msgid "Flashing..."
msgstr "Flasher..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Bruk"
@@ -2141,7 +2142,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2443,7 +2444,7 @@ msgstr "Hvis oppgitt vil denne enheten bli montert utfra dens Volumnavn"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2457,7 +2458,7 @@ msgstr "Dersom ikke avmerket blir ingen standard rute konfigurert"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2531,11 +2532,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Oppstartskript"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Oppstartsskript"
@@ -2895,7 +2896,7 @@ msgstr "Lokal IPv6 adresse"
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Lokal Oppstart"
@@ -3032,7 +3033,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3061,7 +3062,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "Maksimal tillatt størrelse på EDNS.0 UDP-pakker"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "Maksimalt antall sekunder å vente på at modemet skal bli klart"
@@ -3153,7 +3155,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "Modem initiering tidsavbrudd"
@@ -3279,7 +3282,7 @@ msgstr "Nettmaske"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3328,7 +3331,7 @@ msgstr "Ingen filer funnet"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Ingen informasjon tilgjengelig"
@@ -3582,7 +3585,7 @@ msgstr ""
msgid "Options"
msgstr "Alternativer"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Andre:"
@@ -3662,7 +3665,7 @@ msgstr "Eier"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "PAP/CHAP passord"
@@ -3673,7 +3676,7 @@ msgstr "PAP/CHAP passord"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "PAP/CHAP brukernavn"
@@ -3804,9 +3807,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3864,7 +3867,7 @@ msgstr "Ping"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Pakker."
@@ -3963,7 +3966,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protokoll"
@@ -4107,7 +4110,7 @@ msgstr "Vil du nullstille alle endringer?"
msgid "Really switch protocol?"
msgstr "Vil du endre protokoll?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Tilkoblinger Sanntid"
@@ -4281,7 +4284,7 @@ msgstr "<abbr title=\"Resolvefile\">Oppslagsfil</abbr>"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Omstart"
@@ -4642,7 +4645,7 @@ msgstr ""
"enheter."
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Kilde"
@@ -4690,11 +4693,11 @@ msgid "Specify the secret encryption key here."
msgstr "Angi krypteringsnøkkelen her."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Start"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Start prioritet"
@@ -4752,7 +4755,7 @@ msgid "Status"
msgstr "Status"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Stop"
@@ -4856,7 +4859,7 @@ msgstr "System Egenskaper"
msgid "System log buffer size"
msgstr "System logg buffer størrelse"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5169,7 +5172,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5218,7 +5221,7 @@ msgid ""
"their status."
msgstr "Denne listen gir en oversikt over kjørende prosesser og deres status."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr ""
"Denne siden gir en oversikt over gjeldende aktive nettverkstilkoblinger."
@@ -5280,7 +5283,7 @@ msgstr "Traceroute"
msgid "Traffic"
msgstr "Trafikk"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Overføring"
@@ -5335,7 +5338,7 @@ msgstr "Tx-Styrke"
msgid "Type"
msgstr "Type"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5472,7 +5475,7 @@ msgstr "Bruk DHCP gateway"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5524,7 +5527,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5538,7 +5541,7 @@ msgstr "Bruk egendefinerte DNS servere"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5558,7 +5561,7 @@ msgstr "Bruk standard gateway"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5834,7 +5837,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/pl/base.po b/modules/luci-base/po/pl/base.po
index d821840288..ba0350e5f5 100644
--- a/modules/luci-base/po/pl/base.po
+++ b/modules/luci-base/po/pl/base.po
@@ -62,7 +62,6 @@ msgstr "-- Dodatkowe pole --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Proszę wybrać --"
@@ -339,7 +338,7 @@ msgstr ""
"Aktywne trasy routingu <abbr title=\"Internet Protocol Version 6\">IPv6</"
"abbr>"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Aktywne połączenia"
@@ -684,7 +683,7 @@ msgstr ""
msgid "Authentication"
msgstr "Uwierzytelnianie"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -709,7 +708,7 @@ msgstr "Automatyczne odświeżanie"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -747,9 +746,9 @@ msgstr "Dostępne"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1071,12 +1070,13 @@ msgstr "Zamknij listÄ™..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Zbieranie danych..."
@@ -1222,7 +1222,7 @@ msgstr ""
"temu, wykonaj najpierw reset do ustawień fabrycznych"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr "Własny interwał flash (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1406,7 +1406,7 @@ msgid "Description"
msgstr "Opis"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Przeznaczenie"
@@ -1445,6 +1445,7 @@ msgid "Diagnostics"
msgstr "Diagnostyka"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1477,9 +1478,9 @@ msgstr ""
msgid "Disable this network"
msgstr "Wyłącz tą sieć"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1682,7 +1683,7 @@ msgstr "WÅ‚Ä…cz <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Włącz dynamiczną aktualizację punktu końcowego sieci HE.net"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr "WÅ‚Ä…cz negocjacjÄ™ IPv6"
@@ -1750,13 +1751,13 @@ msgstr ""
msgid "Enable this swap"
msgstr "WÅ‚Ä…cz ten swap"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Wlącz/Wyłącz"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "WÅ‚Ä…czony"
@@ -1975,6 +1976,12 @@ msgstr "Aktualizuj firmware"
msgid "Flash image..."
msgstr "Wgraj obraz..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "Wgraj nowy firmware"
@@ -1987,12 +1994,6 @@ msgstr "Operacje aktualizacji"
msgid "Flashing..."
msgstr "Flashowanie..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr "Dostęp do zapisu flashmemory (%s)"
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "WymuÅ›"
@@ -2184,7 +2185,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr "Błędy kodu nagłówka (HEC)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr "Interwał Heartbeata (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2492,7 +2493,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2506,7 +2507,7 @@ msgstr "Jeśli odznaczone, nie ma zdefiniowanej domyślnej ścieżki routingu"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2581,11 +2582,11 @@ msgstr ""
msgid "Initialization failure"
msgstr "BÅ‚Ä…d inicjalizacji"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Skrypt startowy"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Skrypty startowe"
@@ -2947,7 +2948,7 @@ msgstr "Lokalny adres IPv6"
msgid "Local Service Only"
msgstr "Tylko serwis lokalny"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Lokalny autostart"
@@ -3087,7 +3088,7 @@ msgstr ""
"poleceń poniżej:"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3116,7 +3117,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "Maksymalny dozwolony rozmiar pakietu EDNS.0 UDP"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "Maksymalny czas podany w sekundach do pełnej gotowości modemu"
@@ -3208,7 +3210,8 @@ msgid "Modem information query failed"
msgstr "Zapytanie dotyczące modemu nie powiodło się"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "Limit czasu inicjacji modemu"
@@ -3334,7 +3337,7 @@ msgstr "Maska sieci"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3383,7 +3386,7 @@ msgstr "Nie znaleziono plików"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Brak dostępnych informacji"
@@ -3642,7 +3645,7 @@ msgstr ""
msgid "Options"
msgstr "Opcje"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Inne:"
@@ -3722,7 +3725,7 @@ msgstr "Właściciel"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "Hasło PAP/CHAP"
@@ -3733,7 +3736,7 @@ msgstr "Hasło PAP/CHAP"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "Nazwa użytkownika PAP/CHAP"
@@ -3864,9 +3867,9 @@ msgstr "Ścieżka do wewnętrznego klucza prywatnego "
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3924,7 +3927,7 @@ msgstr "Ping"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Pktw."
@@ -4023,7 +4026,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protokół"
@@ -4176,7 +4179,7 @@ msgstr "Naprawdę usunąć wszelkie zmiany?"
msgid "Really switch protocol?"
msgstr "Naprawdę zmienić protokół?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Połączenia w czasie rzeczywistym"
@@ -4352,7 +4355,7 @@ msgstr "Plik Resolve"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Uruchom ponownie"
@@ -4719,7 +4722,7 @@ msgstr ""
"urzÄ…dzenia."
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Źródło"
@@ -4769,11 +4772,11 @@ msgid "Specify the secret encryption key here."
msgstr "Określ tajny klucz szyfrowania."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Uruchomienie"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Priorytet uruchomienia"
@@ -4832,7 +4835,7 @@ msgid "Status"
msgstr "Status"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Stop"
@@ -4937,7 +4940,7 @@ msgstr "Właściwości systemu"
msgid "System log buffer size"
msgstr "Rozmiar bufora loga systemu"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5265,7 +5268,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5318,7 +5321,7 @@ msgstr ""
"Poniższa lista przedstawia aktualnie uruchomione procesy systemowe i ich "
"status."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "Poniższa strona przedstawia aktualnie aktywne połączenia sieciowe."
@@ -5378,7 +5381,7 @@ msgstr "Trasa routowania"
msgid "Traffic"
msgstr "Ruch"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Transfer"
@@ -5433,7 +5436,7 @@ msgstr "Moc nadawania"
msgid "Type"
msgstr "Typ"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5571,7 +5574,7 @@ msgstr "Użyj bramy DHCP"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5623,7 +5626,7 @@ msgstr "Skorzystaj z wbudowanego zarządzania protokołem IPv6"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5637,7 +5640,7 @@ msgstr "Użyj własne serwery DNS"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5657,7 +5660,7 @@ msgstr "Użyj domyślnej bramy"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5936,7 +5939,7 @@ msgstr "Zapisz log systemowy do pliku"
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
@@ -6434,6 +6437,9 @@ msgstr "tak"
msgid "« Back"
msgstr "« Wróć"
+#~ msgid "Flashmemory write access (%s)"
+#~ msgstr "Dostęp do zapisu flashmemory (%s)"
+
#~ msgid ""
#~ "Your Internet Explorer is too old to display this page correctly. Please "
#~ "upgrade it to at least version 7 or use another browser like Firefox, "
diff --git a/modules/luci-base/po/pt-br/base.po b/modules/luci-base/po/pt-br/base.po
index 7a1702d9a3..c47595a886 100644
--- a/modules/luci-base/po/pt-br/base.po
+++ b/modules/luci-base/po/pt-br/base.po
@@ -61,7 +61,6 @@ msgstr "-- Campo Adicional --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Por favor, escolha --"
@@ -353,7 +352,7 @@ msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr ""
"Rotas <abbr title=\"Protocolo de Internet Versão 6\">IPv6</abbr> ativas"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Conexões Ativas"
@@ -704,7 +703,7 @@ msgstr "Grupo de Autenticação"
msgid "Authentication"
msgstr "Autenticação"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr "Tipo de Autenticação"
@@ -729,7 +728,7 @@ msgstr "Atualização Automática"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -771,9 +770,9 @@ msgstr "Disponível"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1100,12 +1099,13 @@ msgstr "Fechar a lista..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Coletando dados..."
@@ -1254,7 +1254,7 @@ msgstr ""
"Para evitar isso, restaure antes as configurações inicias."
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1441,7 +1441,7 @@ msgid "Description"
msgstr "Descrição"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Destino"
@@ -1481,6 +1481,7 @@ msgid "Diagnostics"
msgstr "Diagnóstico"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr "Número de discagem"
@@ -1513,9 +1514,9 @@ msgstr ""
msgid "Disable this network"
msgstr "Desabilitar esta rede"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1727,7 +1728,7 @@ msgstr "Ativar <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Ativar a atualização de ponto final dinâmico HE.net"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr "Ativar a negociação de IPv6"
@@ -1796,13 +1797,13 @@ msgstr "Habilitar esta rede"
msgid "Enable this swap"
msgstr "Ativar este espaço de troca (swap)"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Ativar/Desativar"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Ativado"
@@ -2030,6 +2031,12 @@ msgstr "Gravar Firmware"
msgid "Flash image..."
msgstr "Gravar imagem..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "Gravar nova imagem do firmware"
@@ -2042,12 +2049,6 @@ msgstr "Operações na memória flash"
msgid "Flashing..."
msgstr "Gravando na flash..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Forçar"
@@ -2246,7 +2247,7 @@ msgstr ""
"abbr>)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2559,7 +2560,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2573,7 +2574,7 @@ msgstr "Se desmarcado, nenhuma rota padrão será configurada"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2653,11 +2654,11 @@ msgstr ""
msgid "Initialization failure"
msgstr "Falha na iniciação"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Script de iniciação"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Scripts de iniciação"
@@ -3036,7 +3037,7 @@ msgstr "Endereço IPv6 local"
msgid "Local Service Only"
msgstr "Somente Serviço Local"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Iniciação Local"
@@ -3181,7 +3182,7 @@ msgstr ""
"abaixo:"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3212,7 +3213,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "Tamanho máximo permitido dos pacotes UDP EDNS.0"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "Tempo máximo, em segundos, para esperar que o modem fique pronto"
@@ -3306,7 +3308,8 @@ msgid "Modem information query failed"
msgstr "A consulta das informações do modem falhou"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "Estouro de tempo da iniciação do modem"
@@ -3432,7 +3435,7 @@ msgstr "Máscara de rede"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3481,7 +3484,7 @@ msgstr "Nenhum arquivo encontrado"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Nenhuma informação disponível"
@@ -3753,7 +3756,7 @@ msgstr "Opcional. Porta UDP usada para pacotes saintes ou entrantes."
msgid "Options"
msgstr "Opções"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Outro:"
@@ -3836,7 +3839,7 @@ msgstr "Dono"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "Senha do PAP/CHAP"
@@ -3847,7 +3850,7 @@ msgstr "Senha do PAP/CHAP"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "Usuário do PAP/CHAP"
@@ -3978,9 +3981,9 @@ msgstr "Caminho para a Chave Privada interna"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -4038,7 +4041,7 @@ msgstr "Ping"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Pcts."
@@ -4138,7 +4141,7 @@ msgstr "Protocolo"
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protocolo"
@@ -4293,7 +4296,7 @@ msgstr "Realmente limpar todas as mudanças?"
msgid "Really switch protocol?"
msgstr "Realmente trocar o protocolo?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Conexões em Tempo Real"
@@ -4473,7 +4476,7 @@ msgstr "Arquivo Resolv"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Reiniciar"
@@ -4845,7 +4848,7 @@ msgstr ""
"instruções específicas da instalação deste dispositivo."
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Origem"
@@ -4900,11 +4903,11 @@ msgid "Specify the secret encryption key here."
msgstr "Especifique a chave de cifragem secreta aqui."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Iniciar"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Prioridade de iniciação"
@@ -4963,7 +4966,7 @@ msgid "Status"
msgstr "Estado"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Parar"
@@ -5069,7 +5072,7 @@ msgstr "Propriedades do Sistema"
msgid "System log buffer size"
msgstr "Tamanho do buffer de registro do sistema"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5400,7 +5403,7 @@ msgstr ""
"Isto é a \"Update Key\" configurada para o túnel ou a senha da cpnta se não "
"tem uma \"Update Keu\" configurada"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5453,7 +5456,7 @@ msgid ""
msgstr ""
"Esta lista fornece uma visão geral sobre os processos em execução no sistema."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "Esta página fornece informações sobre as conexões de rede ativas."
@@ -5514,7 +5517,7 @@ msgstr "Traceroute"
msgid "Traffic"
msgstr "Tráfego"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Transferências"
@@ -5569,7 +5572,7 @@ msgstr "Potência de transmissão"
msgid "Type"
msgstr "Tipo"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5710,7 +5713,7 @@ msgstr "Use o roteador do DHCP"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5764,7 +5767,7 @@ msgstr "Use o gerenciamento do IPv6 embarcado"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5778,7 +5781,7 @@ msgstr "Use servidores DNS personalizados"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5798,7 +5801,7 @@ msgstr "Use o roteador padrão"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -6077,7 +6080,7 @@ msgstr "Escrever registro do sistema (log) no arquivo"
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/pt/base.po b/modules/luci-base/po/pt/base.po
index e4310b04c0..1544bb23e3 100644
--- a/modules/luci-base/po/pt/base.po
+++ b/modules/luci-base/po/pt/base.po
@@ -61,7 +61,6 @@ msgstr "-- Campo Adicional --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Por favor escolha --"
@@ -337,7 +336,7 @@ msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr ""
"Rotas-<abbr title=\"Protocolo de Internet Versão 6\">IPv6</abbr> ativas"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Ligações Ativas"
@@ -675,7 +674,7 @@ msgstr ""
msgid "Authentication"
msgstr "Autenticação"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -700,7 +699,7 @@ msgstr "Actualização Automática"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -738,9 +737,9 @@ msgstr "Disponível"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1060,12 +1059,13 @@ msgstr "Fechar lista..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "A obter dados..."
@@ -1203,7 +1203,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1388,7 +1388,7 @@ msgid "Description"
msgstr "Descrição"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Destino"
@@ -1427,6 +1427,7 @@ msgid "Diagnostics"
msgstr "Diagnósticos"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1459,9 +1460,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1662,7 +1663,7 @@ msgstr "Ativar <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Ativar a atualização dinâmica de ponto final HE.net"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1730,13 +1731,13 @@ msgstr ""
msgid "Enable this swap"
msgstr "Ativar esta swap"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Ativar/Desativar"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Ativado"
@@ -1952,6 +1953,12 @@ msgstr "Gravar Firmware"
msgid "Flash image..."
msgstr "Flashar imagem..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "Flashar nova imagem do firmware"
@@ -1964,12 +1971,6 @@ msgstr ""
msgid "Flashing..."
msgstr "A programar...."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Forçar"
@@ -2159,7 +2160,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2463,7 +2464,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2477,7 +2478,7 @@ msgstr "Se desmarcado, não é configurada uma rota pré-definida"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2553,11 +2554,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Script de inicialização"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Scripts de Inicialização"
@@ -2918,7 +2919,7 @@ msgstr "Endereço IPv6 Local"
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Arranque Local"
@@ -3055,7 +3056,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3084,7 +3085,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "Número máximo de segundos a esperar pelo modem para ficar pronto"
@@ -3176,7 +3178,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr ""
@@ -3302,7 +3305,7 @@ msgstr "Mascara de rede"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3351,7 +3354,7 @@ msgstr "Não foram encontrados ficheiros"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Sem informação disponível"
@@ -3605,7 +3608,7 @@ msgstr ""
msgid "Options"
msgstr "Opções"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Outro:"
@@ -3683,7 +3686,7 @@ msgstr "Dono"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "Password PAP/CHAP"
@@ -3694,7 +3697,7 @@ msgstr "Password PAP/CHAP"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "Utilizador PAP/CHAP"
@@ -3825,9 +3828,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3885,7 +3888,7 @@ msgstr "Ping"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Pkts."
@@ -3982,7 +3985,7 @@ msgstr "Protocolo"
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protocolo"
@@ -4126,7 +4129,7 @@ msgstr "Deseja mesmo limpar todas as alterações?"
msgid "Really switch protocol?"
msgstr "Deseja mesmo trocar o protocolo?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Ligações em Tempo Real"
@@ -4300,7 +4303,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Reiniciar"
@@ -4657,7 +4660,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Origem"
@@ -4704,11 +4707,11 @@ msgid "Specify the secret encryption key here."
msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Iniciar"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Prioridade de inicialização"
@@ -4763,7 +4766,7 @@ msgid "Status"
msgstr "Status"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Parar"
@@ -4867,7 +4870,7 @@ msgstr "Propriedades do Sistema"
msgid "System log buffer size"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5173,7 +5176,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5220,7 +5223,7 @@ msgid ""
msgstr ""
"Esta lista fornece uma visão geral sobre os processos em execução no sistema."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "Esta página fornece informações sobre as ligações de rede ativas."
@@ -5280,7 +5283,7 @@ msgstr "Traceroute"
msgid "Traffic"
msgstr "Tráfego"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Transferências"
@@ -5335,7 +5338,7 @@ msgstr "Potência de Tx"
msgid "Type"
msgstr "Tipo"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5469,7 +5472,7 @@ msgstr "Usar a gateway do DHCP"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5521,7 +5524,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5535,7 +5538,7 @@ msgstr "Usar servidores DNS personalizados"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5555,7 +5558,7 @@ msgstr "Usar gateway pre-definida"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5827,7 +5830,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/ro/base.po b/modules/luci-base/po/ro/base.po
index 87ca8800e8..3cf2a745a5 100644
--- a/modules/luci-base/po/ro/base.po
+++ b/modules/luci-base/po/ro/base.po
@@ -60,7 +60,6 @@ msgstr "-- Camp suplimentar --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Te rog sa alegi --"
@@ -326,7 +325,7 @@ msgstr "Rute active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>"
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr "Rute active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Conexiuni active"
@@ -661,7 +660,7 @@ msgstr ""
msgid "Authentication"
msgstr "Autentificare"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -686,7 +685,7 @@ msgstr "Reimprospatare automata"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -724,9 +723,9 @@ msgstr "Disponibil"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1036,12 +1035,13 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Colectez datele.."
@@ -1179,7 +1179,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1359,7 +1359,7 @@ msgid "Description"
msgstr "Descriere"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Destinatie"
@@ -1398,6 +1398,7 @@ msgid "Diagnostics"
msgstr "Diagnosticuri"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1430,9 +1431,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1618,7 +1619,7 @@ msgstr "Activeaza <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1686,13 +1687,13 @@ msgstr ""
msgid "Enable this swap"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Activeaza/Dezactiveaza"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Activat"
@@ -1905,6 +1906,12 @@ msgstr "Rescrie firmware"
msgid "Flash image..."
msgstr ""
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr ""
@@ -1917,12 +1924,6 @@ msgstr ""
msgid "Flashing..."
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Forteaza"
@@ -2112,7 +2113,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2413,7 +2414,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2427,7 +2428,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2497,11 +2498,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Script de initializare"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Scripturi de initializare"
@@ -2858,7 +2859,7 @@ msgstr "Adresa IPv6 locala"
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr ""
@@ -2990,7 +2991,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3019,7 +3020,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr ""
@@ -3111,7 +3113,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr ""
@@ -3235,7 +3238,7 @@ msgstr "Netmask"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3284,7 +3287,7 @@ msgstr "Nici un fisier gasit"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Nici o informatie disponibila"
@@ -3532,7 +3535,7 @@ msgstr ""
msgid "Options"
msgstr "Optiuni"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Altele:"
@@ -3610,7 +3613,7 @@ msgstr "Proprietar"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr ""
@@ -3621,7 +3624,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr ""
@@ -3752,9 +3755,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3812,7 +3815,7 @@ msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Packete."
@@ -3909,7 +3912,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protocol"
@@ -4051,7 +4054,7 @@ msgstr ""
msgid "Really switch protocol?"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Conexiuni in timp real"
@@ -4225,7 +4228,7 @@ msgstr "Fisierul de rezolvare"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Restart"
@@ -4579,7 +4582,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Sursa"
@@ -4626,11 +4629,11 @@ msgid "Specify the secret encryption key here."
msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Start"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr ""
@@ -4685,7 +4688,7 @@ msgid "Status"
msgstr "Status"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Stop"
@@ -4789,7 +4792,7 @@ msgstr "Proprietati sistem"
msgid "System log buffer size"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr ""
@@ -5060,7 +5063,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5102,7 +5105,7 @@ msgid ""
"their status."
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr ""
@@ -5159,7 +5162,7 @@ msgstr ""
msgid "Traffic"
msgstr "Trafic"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Transfer"
@@ -5214,7 +5217,7 @@ msgstr "Puterea TX"
msgid "Type"
msgstr "Tip"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5348,7 +5351,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5400,7 +5403,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5414,7 +5417,7 @@ msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5434,7 +5437,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5706,7 +5709,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/ru/base.po b/modules/luci-base/po/ru/base.po
index e413bcda90..e2962a5920 100644
--- a/modules/luci-base/po/ru/base.po
+++ b/modules/luci-base/po/ru/base.po
@@ -63,7 +63,6 @@ msgstr "-- Дополнительно --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Сделайте выбор --"
@@ -338,7 +337,7 @@ msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr ""
"Ðктивные <abbr title=\"Интернет протокол верÑии 6\">IPv6</abbr>-маршруты"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Ðктивные ÑоединениÑ"
@@ -689,7 +688,7 @@ msgstr "Группа аутентификации"
msgid "Authentication"
msgstr "ÐутентификациÑ"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr "Тип аутентификации"
@@ -714,7 +713,7 @@ msgstr "Ðвтообновление"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -758,9 +757,9 @@ msgstr "ДоÑтупно"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1090,12 +1089,13 @@ msgstr "Закрыть ÑпиÑок..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Сбор данных..."
@@ -1242,7 +1242,7 @@ msgstr ""
"Чтобы Ñтого не произошло, выполните Ñначала ÑÐ±Ñ€Ð¾Ñ Ðº заводÑким наÑтройкам."
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr "Произвольный интервал Ð¼Ð¸Ð³Ð°Ð½Ð¸Ñ (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1427,7 +1427,7 @@ msgid "Description"
msgstr "ОпиÑание"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Ðаправление"
@@ -1466,6 +1466,7 @@ msgid "Diagnostics"
msgstr "ДиагноÑтика"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr "Dial номер"
@@ -1498,9 +1499,9 @@ msgstr "Отключить отÑлеживание неактивноÑти кÐ
msgid "Disable this network"
msgstr "Отключить данную Ñеть"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1703,7 +1704,7 @@ msgstr "Включить <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Включить динамичеÑкое обновление оконечной точки HE.net"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr "Включить IPv6 negotiation"
@@ -1771,13 +1772,13 @@ msgstr "Включить данную Ñеть"
msgid "Enable this swap"
msgstr "Включить Ñтот раздел подкачки"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Включить/выключить"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Включено"
@@ -1998,6 +1999,12 @@ msgstr "УÑтановить прошивку"
msgid "Flash image..."
msgstr "УÑтановить..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "УÑтановить новый образ прошивки"
@@ -2010,12 +2017,6 @@ msgstr "Операции Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¾Ð¹"
msgid "Flashing..."
msgstr "Прошивка..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr "ЗапиÑÑŒ во флешпамÑÑ‚ÑŒ (%s)"
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Ðазначить"
@@ -2206,7 +2207,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr "Ошибки ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº заголовка (HEC)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr "Интервал heartbeat (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2511,7 +2512,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2525,7 +2526,7 @@ msgstr "ЕÑли не выбрано, то маршрут по умолчаниÑ
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2604,11 +2605,11 @@ msgstr "ИнформациÑ"
msgid "Initialization failure"
msgstr "Ошибка инициализации"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Скрипт инициализации"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Скрипты инициализации"
@@ -2980,7 +2981,7 @@ msgstr "Локальный IPv6-адреÑ"
msgid "Local Service Only"
msgstr "Только локальный DNS"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "ЗапуÑк пакетов и Ñлужб пользователÑ, при включении уÑтройÑтва"
@@ -3121,7 +3122,7 @@ msgstr ""
"иÑпользуйте команды приведенные ниже:"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3150,7 +3151,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "МакÑимально допуÑтимый размер UDP пакетов EDNS.0"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "МакÑимальное Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð³Ð¾Ñ‚Ð¾Ð²Ð½Ð¾Ñти модема (Ñекунды)"
@@ -3244,7 +3246,8 @@ msgid "Modem information query failed"
msgstr "Ошибка запроÑа информации о модеме"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ модема"
@@ -3370,7 +3373,7 @@ msgstr "МаÑка Ñети"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3419,7 +3422,7 @@ msgstr "Файлы не найдены"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Ðет доÑтупной информации"
@@ -3689,7 +3692,7 @@ msgstr ""
msgid "Options"
msgstr "Опции"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Другие:"
@@ -3769,7 +3772,7 @@ msgstr "Пользователь"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "Пароль PAP/CHAP"
@@ -3780,7 +3783,7 @@ msgstr "Пароль PAP/CHAP"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PAP/CHAP"
@@ -3911,9 +3914,9 @@ msgstr "Путь к внутреннему Приватному ключу"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3971,7 +3974,7 @@ msgstr "Пинг-запроÑ"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Пакетов"
@@ -4070,7 +4073,7 @@ msgstr "Прот."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Протокол"
@@ -4228,7 +4231,7 @@ msgstr "ДейÑтвительно ÑброÑить вÑе изменениÑ?"
msgid "Really switch protocol?"
msgstr "Ð’Ñ‹ дейÑтвительно хотите изменить протокол?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Ð¡Ð¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² реальном времени"
@@ -4411,7 +4414,7 @@ msgstr "Файл resolv"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "ПерезапуÑтить"
@@ -4775,7 +4778,7 @@ msgstr ""
"инÑтрукций Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ уÑтройÑтва."
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "ИÑточник"
@@ -4829,11 +4832,11 @@ msgid "Specify the secret encryption key here."
msgstr "Укажите закрытый ключ."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Старт"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Приоритет"
@@ -4891,7 +4894,7 @@ msgid "Status"
msgstr "СоÑтоÑние"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "ОÑтановить"
@@ -4997,7 +5000,7 @@ msgstr "СвойÑтва ÑиÑтемы"
msgid "System log buffer size"
msgstr "Размер ÑиÑтемного журнала"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5321,7 +5324,7 @@ msgstr ""
"Это либо \"Update Key\", наÑтроенный Ð´Ð»Ñ Ñ‚ÑƒÐ½Ð½ÐµÐ»Ñ, либо пароль учетной "
"запиÑи, еÑли ключ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ был наÑтроен"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5372,7 +5375,7 @@ msgid ""
"their status."
msgstr "Страница Ñодержит работающие процеÑÑÑ‹ и их ÑоÑтоÑние."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr ""
"Страница Ñодержит ÑпиÑок вÑех активных на данный момент Ñетевых Ñоединений."
@@ -5434,7 +5437,7 @@ msgstr "ТраÑÑировка"
msgid "Traffic"
msgstr "Трафик"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Передача"
@@ -5489,7 +5492,7 @@ msgstr "МощноÑÑ‚ÑŒ передатчика"
msgid "Type"
msgstr "Тип"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5627,7 +5630,7 @@ msgstr "ИÑпользовать шлюз DHCP"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5679,7 +5682,7 @@ msgstr "ИÑпользовать вÑтроенный IPv6-менеджмент"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5693,7 +5696,7 @@ msgstr "ИÑпользовать ÑобÑтвенные DNS Ñервера"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5713,7 +5716,7 @@ msgstr "ИÑпользовать шлюз по умолчанию"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5999,7 +6002,7 @@ msgstr "ЗапиÑывать ÑиÑтемные ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð² файл"
msgid "Yes"
msgstr "Да"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
@@ -6496,6 +6499,9 @@ msgstr "да"
msgid "« Back"
msgstr "« Ðазад"
+#~ msgid "Flashmemory write access (%s)"
+#~ msgstr "ЗапиÑÑŒ во флешпамÑÑ‚ÑŒ (%s)"
+
#~ msgid ""
#~ "one of:\n"
#~ " - %s"
diff --git a/modules/luci-base/po/sk/base.po b/modules/luci-base/po/sk/base.po
index 37c1e66798..827483a258 100644
--- a/modules/luci-base/po/sk/base.po
+++ b/modules/luci-base/po/sk/base.po
@@ -57,7 +57,6 @@ msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr ""
@@ -315,7 +314,7 @@ msgstr ""
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr ""
@@ -648,7 +647,7 @@ msgstr ""
msgid "Authentication"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -673,7 +672,7 @@ msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -711,9 +710,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1020,12 +1019,13 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr ""
@@ -1163,7 +1163,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1343,7 +1343,7 @@ msgid "Description"
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr ""
@@ -1382,6 +1382,7 @@ msgid "Diagnostics"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1412,9 +1413,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1600,7 +1601,7 @@ msgstr ""
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1668,13 +1669,13 @@ msgstr ""
msgid "Enable this swap"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr ""
@@ -1887,6 +1888,12 @@ msgstr ""
msgid "Flash image..."
msgstr ""
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr ""
@@ -1899,12 +1906,6 @@ msgstr ""
msgid "Flashing..."
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr ""
@@ -2093,7 +2094,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2392,7 +2393,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2406,7 +2407,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2476,11 +2477,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr ""
@@ -2834,7 +2835,7 @@ msgstr ""
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr ""
@@ -2966,7 +2967,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -2995,7 +2996,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr ""
@@ -3087,7 +3089,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr ""
@@ -3211,7 +3214,7 @@ msgstr ""
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3260,7 +3263,7 @@ msgstr ""
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr ""
@@ -3508,7 +3511,7 @@ msgstr ""
msgid "Options"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr ""
@@ -3586,7 +3589,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr ""
@@ -3597,7 +3600,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr ""
@@ -3728,9 +3731,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3788,7 +3791,7 @@ msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr ""
@@ -3885,7 +3888,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr ""
@@ -4025,7 +4028,7 @@ msgstr ""
msgid "Really switch protocol?"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr ""
@@ -4199,7 +4202,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr ""
@@ -4552,7 +4555,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr ""
@@ -4599,11 +4602,11 @@ msgid "Specify the secret encryption key here."
msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr ""
@@ -4658,7 +4661,7 @@ msgid "Status"
msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr ""
@@ -4762,7 +4765,7 @@ msgstr ""
msgid "System log buffer size"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr ""
@@ -5031,7 +5034,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5073,7 +5076,7 @@ msgid ""
"their status."
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr ""
@@ -5130,7 +5133,7 @@ msgstr ""
msgid "Traffic"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr ""
@@ -5185,7 +5188,7 @@ msgstr ""
msgid "Type"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr ""
@@ -5319,7 +5322,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5371,7 +5374,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5385,7 +5388,7 @@ msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5405,7 +5408,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5675,7 +5678,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/sv/base.po b/modules/luci-base/po/sv/base.po
index 8192b58686..fa22ae97d6 100644
--- a/modules/luci-base/po/sv/base.po
+++ b/modules/luci-base/po/sv/base.po
@@ -59,7 +59,6 @@ msgstr "-- Ytterligare fält --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Vänligen välj --"
@@ -322,7 +321,7 @@ msgstr "Aktiva <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-rutter"
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr "Aktiva <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-rutter"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Aktiva anslutningar"
@@ -658,7 +657,7 @@ msgstr "Autentiseringsgrupp"
msgid "Authentication"
msgstr "Autentisering"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr "Typ av autentisering"
@@ -683,7 +682,7 @@ msgstr "Uppdatera automatiskt"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -721,9 +720,9 @@ msgstr "Tillgänglig"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1033,12 +1032,13 @@ msgstr "Stäng ner lista..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Samlar in data..."
@@ -1176,7 +1176,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1356,7 +1356,7 @@ msgid "Description"
msgstr "Beskrivning"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Plats"
@@ -1395,6 +1395,7 @@ msgid "Diagnostics"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr "Slå nummer"
@@ -1427,9 +1428,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1619,7 +1620,7 @@ msgstr "Aktivera <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1687,13 +1688,13 @@ msgstr ""
msgid "Enable this swap"
msgstr "Aktivera den här swap"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Aktivera/Inaktivera"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Aktiverad"
@@ -1906,6 +1907,12 @@ msgstr ""
msgid "Flash image..."
msgstr ""
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr ""
@@ -1918,12 +1925,6 @@ msgstr ""
msgid "Flashing..."
msgstr "Skriver..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Tvinga"
@@ -2112,7 +2113,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2411,7 +2412,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2425,7 +2426,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2495,11 +2496,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Initskript"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Initskripten"
@@ -2854,7 +2855,7 @@ msgstr "Lokal IPv6-adress"
msgid "Local Service Only"
msgstr "Enbart lokal tjänst"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Lokal uppstart"
@@ -2986,7 +2987,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3015,7 +3016,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr ""
@@ -3107,7 +3109,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr ""
@@ -3231,7 +3234,7 @@ msgstr "Nätmask"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3280,7 +3283,7 @@ msgstr "Inga filer hittades"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Ingen information tillgänglig"
@@ -3528,7 +3531,7 @@ msgstr ""
msgid "Options"
msgstr "Alternativ"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Andra:"
@@ -3606,7 +3609,7 @@ msgstr "Ägare"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "PAP/CHAP-lösenord"
@@ -3617,7 +3620,7 @@ msgstr "PAP/CHAP-lösenord"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "PAP/CHAP-användarnamn"
@@ -3748,9 +3751,9 @@ msgstr "Genväg till den inre privata nyckeln"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3808,7 +3811,7 @@ msgstr "Ping"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "Pkt."
@@ -3905,7 +3908,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protokoll"
@@ -4047,7 +4050,7 @@ msgstr "Verkligen återställa alla ändringar?"
msgid "Really switch protocol?"
msgstr "Verkligen byta protokoll?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "Anslutningar i realtid"
@@ -4221,7 +4224,7 @@ msgstr "Resolv-fil"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Starta om"
@@ -4574,7 +4577,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Källa"
@@ -4621,11 +4624,11 @@ msgid "Specify the secret encryption key here."
msgstr "Ange den hemliga krypteringsnyckeln här."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr ""
@@ -4680,7 +4683,7 @@ msgid "Status"
msgstr "Status"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr ""
@@ -4784,7 +4787,7 @@ msgstr "Systemets egenskaper"
msgid "System log buffer size"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5055,7 +5058,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5097,7 +5100,7 @@ msgid ""
"their status."
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr ""
@@ -5156,7 +5159,7 @@ msgstr "Traceroute"
msgid "Traffic"
msgstr "Trafik"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Överför"
@@ -5211,7 +5214,7 @@ msgstr ""
msgid "Type"
msgstr "Typ"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5345,7 +5348,7 @@ msgstr "Använd DHCP-gateway"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5397,7 +5400,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5411,7 +5414,7 @@ msgstr "Använd anpassade DNS-servrar"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5431,7 +5434,7 @@ msgstr "Använd standard-gateway"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5702,7 +5705,7 @@ msgstr "Skriv systemlogg till fil"
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/templates/base.pot b/modules/luci-base/po/templates/base.pot
index 570baddd26..42f494df59 100644
--- a/modules/luci-base/po/templates/base.pot
+++ b/modules/luci-base/po/templates/base.pot
@@ -49,7 +49,6 @@ msgstr ""
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr ""
@@ -307,7 +306,7 @@ msgstr ""
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr ""
@@ -640,7 +639,7 @@ msgstr ""
msgid "Authentication"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -665,7 +664,7 @@ msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -703,9 +702,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1012,12 +1011,13 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr ""
@@ -1155,7 +1155,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1335,7 +1335,7 @@ msgid "Description"
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr ""
@@ -1374,6 +1374,7 @@ msgid "Diagnostics"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1404,9 +1405,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1592,7 +1593,7 @@ msgstr ""
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1660,13 +1661,13 @@ msgstr ""
msgid "Enable this swap"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr ""
@@ -1879,6 +1880,12 @@ msgstr ""
msgid "Flash image..."
msgstr ""
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr ""
@@ -1891,12 +1898,6 @@ msgstr ""
msgid "Flashing..."
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr ""
@@ -2085,7 +2086,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2384,7 +2385,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2398,7 +2399,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2468,11 +2469,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr ""
@@ -2826,7 +2827,7 @@ msgstr ""
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr ""
@@ -2958,7 +2959,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -2987,7 +2988,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr ""
@@ -3079,7 +3081,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr ""
@@ -3203,7 +3206,7 @@ msgstr ""
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3252,7 +3255,7 @@ msgstr ""
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr ""
@@ -3500,7 +3503,7 @@ msgstr ""
msgid "Options"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr ""
@@ -3578,7 +3581,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr ""
@@ -3589,7 +3592,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr ""
@@ -3720,9 +3723,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3780,7 +3783,7 @@ msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr ""
@@ -3877,7 +3880,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr ""
@@ -4017,7 +4020,7 @@ msgstr ""
msgid "Really switch protocol?"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr ""
@@ -4191,7 +4194,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr ""
@@ -4544,7 +4547,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr ""
@@ -4591,11 +4594,11 @@ msgid "Specify the secret encryption key here."
msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr ""
@@ -4650,7 +4653,7 @@ msgid "Status"
msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr ""
@@ -4754,7 +4757,7 @@ msgstr ""
msgid "System log buffer size"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr ""
@@ -5023,7 +5026,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5065,7 +5068,7 @@ msgid ""
"their status."
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr ""
@@ -5122,7 +5125,7 @@ msgstr ""
msgid "Traffic"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr ""
@@ -5177,7 +5180,7 @@ msgstr ""
msgid "Type"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr ""
@@ -5311,7 +5314,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5363,7 +5366,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5377,7 +5380,7 @@ msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5397,7 +5400,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5667,7 +5670,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/tr/base.po b/modules/luci-base/po/tr/base.po
index f93879c630..aef1f20667 100644
--- a/modules/luci-base/po/tr/base.po
+++ b/modules/luci-base/po/tr/base.po
@@ -60,7 +60,6 @@ msgstr "-- Ek Alan--"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Lütfen seçiniz --"
@@ -326,7 +325,7 @@ msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr ""
"Aktif <abbr title=\"İnternet Protokolü Sürüm 4\">IPv6</abbr>-Yönlendiriciler"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Aktif Bağlantılar"
@@ -661,7 +660,7 @@ msgstr ""
msgid "Authentication"
msgstr "Kimlik DoÄŸrulama"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr "Kimlik doğrulama türü"
@@ -686,7 +685,7 @@ msgstr "Otomatik Yenileme"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -724,9 +723,9 @@ msgstr "Kullanılabilir"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1035,12 +1034,13 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr ""
@@ -1178,7 +1178,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1358,7 +1358,7 @@ msgid "Description"
msgstr "Açıklama"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Hedef"
@@ -1397,6 +1397,7 @@ msgid "Diagnostics"
msgstr "Tanı"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr "Arama numarası"
@@ -1429,9 +1430,9 @@ msgstr ""
msgid "Disable this network"
msgstr "Ağ devre dışı"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1617,7 +1618,7 @@ msgstr ""
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1685,13 +1686,13 @@ msgstr ""
msgid "Enable this swap"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr ""
@@ -1904,6 +1905,12 @@ msgstr "Firmware Güncelle"
msgid "Flash image..."
msgstr "Dosyayı yaz..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "Yeni firmware dosyasını yaz"
@@ -1916,12 +1923,6 @@ msgstr ""
msgid "Flashing..."
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr ""
@@ -2110,7 +2111,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2409,7 +2410,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2423,7 +2424,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2493,11 +2494,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr ""
@@ -2851,7 +2852,7 @@ msgstr ""
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr ""
@@ -2983,7 +2984,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3012,7 +3013,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr ""
@@ -3104,7 +3106,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr ""
@@ -3228,7 +3231,7 @@ msgstr "AÄŸ Maskesi"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3277,7 +3280,7 @@ msgstr ""
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr ""
@@ -3525,7 +3528,7 @@ msgstr ""
msgid "Options"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr ""
@@ -3603,7 +3606,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr ""
@@ -3614,7 +3617,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr ""
@@ -3745,9 +3748,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3805,7 +3808,7 @@ msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr ""
@@ -3902,7 +3905,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protokol"
@@ -4042,7 +4045,7 @@ msgstr ""
msgid "Really switch protocol?"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr ""
@@ -4216,7 +4219,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Tekrar baÅŸlat"
@@ -4569,7 +4572,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Kaynak"
@@ -4616,11 +4619,11 @@ msgid "Specify the secret encryption key here."
msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "BaÅŸlat"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr ""
@@ -4675,7 +4678,7 @@ msgid "Status"
msgstr "Durum"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Durdur"
@@ -4779,7 +4782,7 @@ msgstr ""
msgid "System log buffer size"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr ""
@@ -5048,7 +5051,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5090,7 +5093,7 @@ msgid ""
"their status."
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr ""
@@ -5147,7 +5150,7 @@ msgstr ""
msgid "Traffic"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr ""
@@ -5202,7 +5205,7 @@ msgstr ""
msgid "Type"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr ""
@@ -5336,7 +5339,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5388,7 +5391,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5402,7 +5405,7 @@ msgstr "Özel DNS sunucularını kullan"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5422,7 +5425,7 @@ msgstr "Varsayılan ağ geçidini kullan"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5692,7 +5695,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/uk/base.po b/modules/luci-base/po/uk/base.po
index 2c6c6723e9..b01d4fe690 100644
--- a/modules/luci-base/po/uk/base.po
+++ b/modules/luci-base/po/uk/base.po
@@ -57,7 +57,6 @@ msgstr "-- Додаткові Ð¿Ð¾Ð»Ñ --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- Оберіть --"
@@ -350,7 +349,7 @@ msgstr "<abbr title=\"Інтернет-протокол верÑÑ–Ñ— 4\">IPv4</a
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr "<abbr title=\"Інтернет-протокол верÑÑ–Ñ— 6\">IPv6</abbr>-маршрути"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "Ðктивні підключеннÑ"
@@ -701,7 +700,7 @@ msgstr "Група автентифікації"
msgid "Authentication"
msgstr "ÐвтентифікаціÑ"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr "Тип автентифікації"
@@ -726,7 +725,7 @@ msgstr "Ðвтоматичне оновленнÑ"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -765,9 +764,9 @@ msgstr "ДоÑтупно"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1094,12 +1093,13 @@ msgstr "Згорнути ÑпиÑок..."
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "Ð—Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…..."
@@ -1248,7 +1248,7 @@ msgstr ""
"початкового Ñтану."
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr "КориÑтувацький інтервал Ñпалаху (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1435,7 +1435,7 @@ msgid "Description"
msgstr "ОпиÑ"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "ПризначеннÑ"
@@ -1474,6 +1474,7 @@ msgid "Diagnostics"
msgstr "ДіагноÑтика"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr "Ðабір номера"
@@ -1506,9 +1507,9 @@ msgstr "Вимкнути Ð¾Ð¿Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ–"
msgid "Disable this network"
msgstr "Вимкнути цю мережу"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1716,7 +1717,7 @@ msgstr "Увімкнути <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr "Увімкнути динамічне Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÑ–Ð½Ñ†ÐµÐ²Ð¾Ñ— точки HE.net"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr "Увімкнути ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ IPv6"
@@ -1784,13 +1785,13 @@ msgstr "Увімкнути цю мережу"
msgid "Enable this swap"
msgstr "Увімкнути цей Ñвоп"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Увімкнено/Вимкнено"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "Увімкнено"
@@ -2008,6 +2009,12 @@ msgstr "Прошиваємо мікропрограму"
msgid "Flash image..."
msgstr "Прошити образ..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "Прошити новий образ мікропрограми"
@@ -2020,12 +2027,6 @@ msgstr "Операції прошиваннÑ"
msgid "Flashing..."
msgstr "Перепрошиваємо..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr "ДоÑтуп до запиÑу флеш-пам’ÑÑ‚Ñ– (%s)"
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "ПримуÑово"
@@ -2218,7 +2219,7 @@ msgstr ""
"abbr>)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr "Інтервал пульÑації (%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2527,7 +2528,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2541,7 +2542,7 @@ msgstr "Якщо не позначено, типовий маршрут не нÐ
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2620,11 +2621,11 @@ msgstr ""
msgid "Initialization failure"
msgstr "Помилка ініціалізації"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Скрипт ініціалізації"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Скрипти ініціалізації"
@@ -3005,7 +3006,7 @@ msgstr "Локальна адреÑа IPv6"
msgid "Local Service Only"
msgstr "Тільки локальна Ñлужба"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "Локальний запуÑк"
@@ -3148,7 +3149,7 @@ msgstr ""
"команди:"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3177,7 +3178,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "МакÑимально допуÑтимий розмір UDP-пакетів EDNS.0"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "МакÑимальний Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð¾Ñ‚Ð¾Ð²Ð½Ð¾ÑÑ‚Ñ– модему (Ñекунд)"
@@ -3271,7 +3273,8 @@ msgid "Modem information query failed"
msgstr "Помилка запиту інформації про модем"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "Тайм-аут ініціалізації модему"
@@ -3397,7 +3400,7 @@ msgstr "МаÑка мережі"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3446,7 +3449,7 @@ msgstr "Файли не знайдено"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´ÑутнÑ"
@@ -3715,7 +3718,7 @@ msgstr ""
msgid "Options"
msgstr "Опції"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "Інше:"
@@ -3796,7 +3799,7 @@ msgstr "ВлаÑник"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "Пароль PAP/CHAP"
@@ -3807,7 +3810,7 @@ msgstr "Пароль PAP/CHAP"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "Ð†Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача PAP/CHAP"
@@ -3940,9 +3943,9 @@ msgstr "ШлÑÑ… до внутрішнього закритого ключа"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -4000,7 +4003,7 @@ msgstr "Ехо-запит"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "пакетів"
@@ -4099,7 +4102,7 @@ msgstr "Прот."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Протокол"
@@ -4255,7 +4258,7 @@ msgstr "ДійÑно Ñкинути вÑÑ– зміни?"
msgid "Really switch protocol?"
msgstr "ДійÑно змінити протокол?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñƒ реальному чаÑÑ–"
@@ -4436,7 +4439,7 @@ msgstr "Файл resolv"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "Перезавантажити"
@@ -4803,7 +4806,7 @@ msgstr ""
"конкретного приÑтрою."
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Джерело"
@@ -4858,11 +4861,11 @@ msgid "Specify the secret encryption key here."
msgstr "Вкажіть тут Ñекретний ключ шифруваннÑ."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "ЗапуÑтити"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Стартовий пріоритет"
@@ -4921,7 +4924,7 @@ msgid "Status"
msgstr "Стан"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "Зупинити"
@@ -5027,7 +5030,7 @@ msgstr "ВлаÑтивоÑÑ‚Ñ– ÑиÑтеми"
msgid "System log buffer size"
msgstr "Розмір буфера ÑиÑтемного журналу"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5354,7 +5357,7 @@ msgstr ""
"Це або \"Update Key\", Ñконфігурований Ð´Ð»Ñ Ñ‚ÑƒÐ½ÐµÐ»ÑŽ, або пароль облікового "
"запиÑу, Ñкщо ключ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ налаштовано"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5408,7 +5411,7 @@ msgid ""
"their status."
msgstr "У цьому ÑпиÑку наведено працюючі наразі ÑиÑтемні процеÑи та Ñ—Ñ… Ñтан."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "Ð¦Ñ Ñторінка надає оглÑд поточних активних мережевих підключень."
@@ -5469,7 +5472,7 @@ msgstr "ТраÑуваннÑ"
msgid "Traffic"
msgstr "Трафік"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Передано"
@@ -5524,7 +5527,7 @@ msgstr "ПотужніÑÑ‚ÑŒ передавача"
msgid "Type"
msgstr "Тип"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5661,7 +5664,7 @@ msgstr "ВикориÑтовувати DHCP-шлюз"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5713,7 +5716,7 @@ msgstr "ВикориÑтовувати вбудоване ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ IPv
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5727,7 +5730,7 @@ msgstr "ВикориÑтовувати оÑобливі DNS-Ñервери"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5747,7 +5750,7 @@ msgstr "ВикориÑтовувати типовий шлюз"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -6030,7 +6033,7 @@ msgstr "ЗапиÑувати cиÑтемний журнал до файлу"
msgid "Yes"
msgstr "Так"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
@@ -6529,6 +6532,9 @@ msgstr "так"
msgid "« Back"
msgstr "« Ðазад"
+#~ msgid "Flashmemory write access (%s)"
+#~ msgstr "ДоÑтуп до запиÑу флеш-пам’ÑÑ‚Ñ– (%s)"
+
#~ msgid ""
#~ "one of:\n"
#~ " - %s"
diff --git a/modules/luci-base/po/vi/base.po b/modules/luci-base/po/vi/base.po
index 62b7a66ea3..2899c0d1f2 100644
--- a/modules/luci-base/po/vi/base.po
+++ b/modules/luci-base/po/vi/base.po
@@ -61,7 +61,6 @@ msgstr "---Mục bổ sung---"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "--Hãy chá»n--"
@@ -321,7 +320,7 @@ msgstr "Active <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Routes"
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "kết nối đang hoạt động"
@@ -654,7 +653,7 @@ msgstr ""
msgid "Authentication"
msgstr "Xác thực"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -679,7 +678,7 @@ msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -717,9 +716,9 @@ msgstr "Sẵn có"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1026,12 +1025,13 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr ""
@@ -1169,7 +1169,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1351,7 +1351,7 @@ msgid "Description"
msgstr "Mô tả"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "Äiểm đến"
@@ -1390,6 +1390,7 @@ msgid "Diagnostics"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1420,9 +1421,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1617,7 +1618,7 @@ msgstr "Kích hoạt <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr ""
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1685,13 +1686,13 @@ msgstr ""
msgid "Enable this swap"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "Cho kích hoạt/ Vô hiệu hóa"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr ""
@@ -1904,6 +1905,12 @@ msgstr "Phần cứng flash"
msgid "Flash image..."
msgstr ""
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr ""
@@ -1916,12 +1923,6 @@ msgstr ""
msgid "Flashing..."
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "Force"
@@ -2110,7 +2111,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2411,7 +2412,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2425,7 +2426,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2500,11 +2501,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "Initscript"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "Initscripts"
@@ -2861,7 +2862,7 @@ msgstr ""
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr ""
@@ -2993,7 +2994,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3022,7 +3023,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr ""
@@ -3114,7 +3116,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr ""
@@ -3240,7 +3243,7 @@ msgstr ""
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3289,7 +3292,7 @@ msgstr ""
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr ""
@@ -3543,7 +3546,7 @@ msgstr ""
msgid "Options"
msgstr "Lá»±a chá»n "
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr ""
@@ -3621,7 +3624,7 @@ msgstr "Owner"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr ""
@@ -3632,7 +3635,7 @@ msgstr ""
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr ""
@@ -3763,9 +3766,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3823,7 +3826,7 @@ msgstr ""
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr ""
@@ -3920,7 +3923,7 @@ msgstr "Prot."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "Protocol"
@@ -4062,7 +4065,7 @@ msgstr ""
msgid "Really switch protocol?"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr ""
@@ -4236,7 +4239,7 @@ msgstr ""
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr ""
@@ -4591,7 +4594,7 @@ msgid ""
msgstr ""
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "Nguồn"
@@ -4638,11 +4641,11 @@ msgid "Specify the secret encryption key here."
msgstr ""
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "Bắt đầu "
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "Bắt đầu ưu tiên"
@@ -4697,7 +4700,7 @@ msgid "Status"
msgstr "Tình trạng"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr ""
@@ -4801,7 +4804,7 @@ msgstr ""
msgid "System log buffer size"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr ""
@@ -5080,7 +5083,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5126,7 +5129,7 @@ msgstr ""
"List này đưa ra một tầm nhìn tổng quát vỠxử lý hệ thống đang chạy và tình "
"trạng của chúng."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr ""
"Trang này cung cấp một tổng quan vỠđang hoạt động kết nối mạng hiện tại."
@@ -5184,7 +5187,7 @@ msgstr ""
msgid "Traffic"
msgstr ""
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "Chuyển giao"
@@ -5239,7 +5242,7 @@ msgstr ""
msgid "Type"
msgstr "Loại "
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr ""
@@ -5373,7 +5376,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5425,7 +5428,7 @@ msgstr ""
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5439,7 +5442,7 @@ msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5459,7 +5462,7 @@ msgstr ""
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5729,7 +5732,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/po/zh-cn/base.po b/modules/luci-base/po/zh-cn/base.po
index c7a9e14d25..5240ce41af 100644
--- a/modules/luci-base/po/zh-cn/base.po
+++ b/modules/luci-base/po/zh-cn/base.po
@@ -61,7 +61,6 @@ msgstr "-- 更多选项 --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- 请选择 --"
@@ -329,7 +328,7 @@ msgstr "活动的 <abbr title=\"Internet Protocol Version 4\">IPv4</abbr> 路由
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr "活动的 <abbr title=\"Internet Protocol Version 6\">IPv6</abbr> 路由"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "活动连接"
@@ -663,7 +662,7 @@ msgstr "认è¯ç»„"
msgid "Authentication"
msgstr "认è¯"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr "认è¯ç±»åž‹"
@@ -688,7 +687,7 @@ msgstr "自动刷新"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -726,9 +725,9 @@ msgstr "å¯ç”¨"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1041,12 +1040,13 @@ msgstr "关闭列表…"
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "正在收集数æ®â€¦"
@@ -1190,7 +1190,7 @@ msgstr ""
"自定义文件(è¯ä¹¦ã€è„šæœ¬ï¼‰ä¼šä¿ç•™åœ¨ç³»ç»Ÿä¸Šã€‚若无需ä¿ç•™ï¼Œè¯·å…ˆæ‰§è¡Œæ¢å¤å‡ºåŽ‚设置。"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr "自定义闪çƒé—´éš”(%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1372,7 +1372,7 @@ msgid "Description"
msgstr "æè¿°"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "目标地å€"
@@ -1411,6 +1411,7 @@ msgid "Diagnostics"
msgstr "网络诊断"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr "拨å·å·ç "
@@ -1443,9 +1444,9 @@ msgstr "ç¦ç”¨ä¸æ´»åŠ¨è½®è¯¢"
msgid "Disable this network"
msgstr "ç¦ç”¨æ­¤ç½‘络"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1639,7 +1640,7 @@ msgstr "å¼€å¯ <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr "å¯ç”¨ HE.net 动æ€ç»ˆç«¯æ›´æ–°"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr "å¯ç”¨ IPv6 å商"
@@ -1707,13 +1708,13 @@ msgstr "å¯ç”¨æ­¤ç½‘络"
msgid "Enable this swap"
msgstr "å¯ç”¨æ­¤ swap 分区"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "å¯ç”¨/ç¦ç”¨"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "å·²å¯ç”¨"
@@ -1926,6 +1927,12 @@ msgstr "刷新固件"
msgid "Flash image..."
msgstr "刷写固件…"
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "刷写新的固件"
@@ -1938,12 +1945,6 @@ msgstr "刷新æ“作"
msgid "Flashing..."
msgstr "正在刷写…"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr "闪存写访问(%s)"
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "强制"
@@ -2134,7 +2135,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr "请求头错误代ç é”™è¯¯ï¼ˆHEC)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr "心跳间隔(%s)"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2433,7 +2434,7 @@ msgstr "如果指定,则通过分区å·æ ‡è€Œä¸æ˜¯å›ºå®šçš„设备文件æ¥æŒ‚
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2447,7 +2448,7 @@ msgstr "留空则ä¸é…置默认路由"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2523,11 +2524,11 @@ msgstr "ä¿¡æ¯"
msgid "Initialization failure"
msgstr "åˆå§‹åŒ–失败"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "å¯åŠ¨è„šæœ¬"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "å¯åŠ¨è„šæœ¬"
@@ -2889,7 +2890,7 @@ msgstr "本地 IPv6 地å€"
msgid "Local Service Only"
msgstr "仅本地æœåŠ¡"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "本地å¯åŠ¨è„šæœ¬"
@@ -3021,7 +3022,7 @@ msgid ""
msgstr "ç¡®ä¿ä½¿ç”¨ä»¥ä¸‹å‘½ä»¤æ¥å¤åˆ¶æ ¹æ–‡ä»¶ç³»ç»Ÿï¼š"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3050,7 +3051,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "å…许的最大 EDNS.0 UDP æ•°æ®åŒ…大å°"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "调制解调器就绪的最大等待时间(秒)"
@@ -3144,7 +3146,8 @@ msgid "Modem information query failed"
msgstr "调制解调器信æ¯æŸ¥è¯¢å¤±è´¥"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "调制解调器åˆå§‹åŒ–超时"
@@ -3268,7 +3271,7 @@ msgstr "å­ç½‘掩ç "
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3317,7 +3320,7 @@ msgstr "未找到文件"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "æ— å¯ç”¨ä¿¡æ¯"
@@ -3575,7 +3578,7 @@ msgstr "å¯é€‰ï¼Œç”¨äºŽä¼ å‡ºå’Œä¼ å…¥æ•°æ®åŒ…çš„ UDP 端å£ã€‚"
msgid "Options"
msgstr "选项"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "其余:"
@@ -3653,7 +3656,7 @@ msgstr "用户å"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "PAP/CHAP 密ç "
@@ -3664,7 +3667,7 @@ msgstr "PAP/CHAP 密ç "
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "PAP/CHAP 用户å"
@@ -3795,9 +3798,9 @@ msgstr "内部ç§é’¥çš„路径"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3855,7 +3858,7 @@ msgstr "Ping"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "æ•°æ®åŒ…"
@@ -3952,7 +3955,7 @@ msgstr "åè®®"
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "åè®®"
@@ -4100,7 +4103,7 @@ msgstr "确定è¦æ”¾å¼ƒæ‰€æœ‰æ›´æ”¹ï¼Ÿ"
msgid "Really switch protocol?"
msgstr "确定è¦åˆ‡æ¢å议?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "实时连接"
@@ -4278,7 +4281,7 @@ msgstr "解æžæ–‡ä»¶"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "é‡å¯"
@@ -4637,7 +4640,7 @@ msgstr ""
"设备的固件更新说明。"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "æºåœ°å€"
@@ -4684,11 +4687,11 @@ msgid "Specify the secret encryption key here."
msgstr "在此指定密钥。"
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "开始"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "å¯åŠ¨ä¼˜å…ˆçº§"
@@ -4745,7 +4748,7 @@ msgid "Status"
msgstr "状æ€"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "关闭"
@@ -4849,7 +4852,7 @@ msgstr "系统属性"
msgid "System log buffer size"
msgstr "系统日志缓冲区大å°"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -5140,7 +5143,7 @@ msgid ""
"password if no update key has been configured"
msgstr "如果更新密钥没有设置的è¯ï¼Œéš§é“的“更新密钥â€æˆ–者账户密ç å¿…须填写。"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5185,7 +5188,7 @@ msgid ""
"their status."
msgstr "系统中正在è¿è¡Œçš„进程概况和它们的状æ€ä¿¡æ¯ã€‚"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "活跃的网络连接概况。"
@@ -5244,7 +5247,7 @@ msgstr "Traceroute"
msgid "Traffic"
msgstr "æµé‡"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "传输"
@@ -5299,7 +5302,7 @@ msgstr "传输功率"
msgid "Type"
msgstr "类型"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5435,7 +5438,7 @@ msgstr "使用 DHCP 网关"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5487,7 +5490,7 @@ msgstr "使用内置的 IPv6 管ç†"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5501,7 +5504,7 @@ msgstr "使用自定义的 DNS æœåŠ¡å™¨"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5521,7 +5524,7 @@ msgstr "使用默认网关"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5800,7 +5803,7 @@ msgstr "将系统日志写入文件"
msgid "Yes"
msgstr "是"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
@@ -6293,6 +6296,9 @@ msgstr "是"
msgid "« Back"
msgstr "« åŽé€€"
+#~ msgid "Flashmemory write access (%s)"
+#~ msgstr "闪存写访问(%s)"
+
#~ msgid ""
#~ "one of:\n"
#~ " - %s"
diff --git a/modules/luci-base/po/zh-tw/base.po b/modules/luci-base/po/zh-tw/base.po
index 581cbdd2ae..5f73372813 100644
--- a/modules/luci-base/po/zh-tw/base.po
+++ b/modules/luci-base/po/zh-tw/base.po
@@ -59,7 +59,6 @@ msgstr "-- 更多é¸é … --"
#: modules/luci-base/htdocs/luci-static/resources/cbi.js:849
#: modules/luci-base/luasrc/view/cbi/header.htm:5
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:26
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:36
msgid "-- Please choose --"
msgstr "-- è«‹é¸æ“‡ --"
@@ -324,7 +323,7 @@ msgstr "啟用 <abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-路由"
msgid "Active <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Routes"
msgstr "啟用 <abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-路由"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:315
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:15
msgid "Active Connections"
msgstr "啟用連線"
@@ -657,7 +656,7 @@ msgstr ""
msgid "Authentication"
msgstr "èªè­‰"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:35
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
msgid "Authentication Type"
msgstr ""
@@ -682,7 +681,7 @@ msgstr "自動更新"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:53
#: protocols/luci-proto-hnet/luasrc/model/cbi/admin_network/proto_hnet.lua:7
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:17
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:63
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:67
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:36
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:42
@@ -720,9 +719,9 @@ msgstr "å¯ç”¨"
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:290
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:300
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:326
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:336
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:346
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:357
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:377
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:255
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:265
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:275
@@ -1035,12 +1034,13 @@ msgstr "關閉清單"
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_join.htm:40
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:30
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_status.htm:8
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:367
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:398
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:11
#: modules/luci-mod-status/luasrc/view/admin_status/index/50-dsl.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/index/60-wifi.htm:17
#: modules/luci-mod-status/luasrc/view/admin_status/iptables.htm:68
#: modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm:49
+#: themes/luci-theme-material/luasrc/view/themes/material/header.htm:222
msgid "Collecting data..."
msgstr "收集資料中..."
@@ -1175,10 +1175,12 @@ msgstr ""
msgid ""
"Custom files (certificates, scripts) may remain on the system. To prevent "
"this, perform a factory-reset first."
-msgstr "已修改的檔案(如憑證和腳本)å¯èƒ½æœƒæ®˜ç•™åœ¨ç³»çµ±ä¸­.如果è¦é¿å…這項å•é¡Œ,您å¯ä»¥å…ˆè¡Œé‡è¨­è£ç½®"
+msgstr ""
+"已修改的檔案(如憑證和腳本)å¯èƒ½æœƒæ®˜ç•™åœ¨ç³»çµ±ä¸­.如果è¦é¿å…這項å•é¡Œ,您å¯ä»¥å…ˆè¡Œé‡"
+"設è£ç½®"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:52
-msgid "Custom flash intervall (%s)"
+msgid "Custom flash interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:4
@@ -1362,7 +1364,7 @@ msgid "Description"
msgstr "æè¿°"
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:62
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:361
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:392
msgid "Destination"
msgstr "目的地"
@@ -1401,6 +1403,7 @@ msgid "Diagnostics"
msgstr "診斷"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:45
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:60
msgid "Dial number"
msgstr ""
@@ -1432,9 +1435,9 @@ msgstr ""
msgid "Disable this network"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:43
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:44
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:54
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:64
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:68
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:37
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:43
@@ -1627,7 +1630,7 @@ msgstr "啟用 <abbr title=\"Spanning Tree Protocol\">STP</abbr>"
msgid "Enable HE.net dynamic endpoint update"
msgstr "啟用HE.netæœå‹™ä»£ç®¡å‹•æ…‹æ›´æ–°"
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:51
msgid "Enable IPv6 negotiation"
msgstr ""
@@ -1695,13 +1698,13 @@ msgstr ""
msgid "Enable this swap"
msgstr "啟用swap功能"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:36
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:37
msgid "Enable/Disable"
msgstr "啟用/關閉"
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:152
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/fstab.lua:251
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:40
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:41
msgid "Enabled"
msgstr "啟用"
@@ -1915,6 +1918,12 @@ msgstr "韌體更新"
msgid "Flash image..."
msgstr "更新映åƒæª”中..."
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
+msgid "Flash memory activity (%s)"
+msgstr ""
+
#: modules/luci-mod-system/luasrc/view/admin_system/flashops.htm:99
msgid "Flash new firmware image"
msgstr "更新新版韌體映åƒæª”"
@@ -1927,12 +1936,6 @@ msgstr "執行更新"
msgid "Flashing..."
msgstr "更新中..."
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:58
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:60
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:62
-msgid "Flashmemory write access (%s)"
-msgstr ""
-
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:498
msgid "Force"
msgstr "強制"
@@ -2121,7 +2124,7 @@ msgid "Header Error Code Errors (HEC)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua:56
-msgid "Heartbeat intervall (%s)"
+msgid "Heartbeat interval (%s)"
msgstr ""
#: modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua:14
@@ -2420,7 +2423,7 @@ msgstr "å‡è‹¥æŒ‡å®šçš„話, 掛載設備的分割標籤å–代固定的設備節é
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:29
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:33
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:68
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:81
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:85
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:25
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:32
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:45
@@ -2434,7 +2437,7 @@ msgstr "如果沒打勾點é¸, å°‡ä¸æœƒè¨­ç½®é è¨­è·¯ç”±"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:34
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:86
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:35
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:95
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:99
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:47
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:60
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:66
@@ -2508,11 +2511,11 @@ msgstr ""
msgid "Initialization failure"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:34
msgid "Initscript"
msgstr "åˆå§‹åŒ–腳本"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid "Initscripts"
msgstr "åˆå§‹åŒ–腳本"
@@ -2867,7 +2870,7 @@ msgstr "本地IPv6ä½å€"
msgid "Local Service Only"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:77
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:81
msgid "Local Startup"
msgstr "本地啟動"
@@ -3000,7 +3003,7 @@ msgid ""
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:55
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:65
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:69
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:26
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:44
@@ -3029,7 +3032,8 @@ msgid "Maximum allowed size of EDNS.0 UDP packets"
msgstr "å…許EDNS.0 å”定的UDPå°åŒ…最大數é‡"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:63
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:73
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:77
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:57
msgid "Maximum amount of seconds to wait for the modem to become ready"
msgstr "等待數據機待命的最大秒數"
@@ -3121,7 +3125,8 @@ msgid "Modem information query failed"
msgstr ""
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:62
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:72
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:76
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:56
msgid "Modem init timeout"
msgstr "數據機åˆå§‹åŒ–終çµæ™‚é–“"
@@ -3245,7 +3250,7 @@ msgstr "網路é®ç½©"
#: modules/luci-base/luasrc/controller/admin/index.lua:62
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:108
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/wifi.lua:402
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:358
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:389
#: modules/luci-mod-status/luasrc/view/admin_status/index/30-network.htm:8
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:73
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:101
@@ -3294,7 +3299,7 @@ msgstr "尚未發ç¾ä»»ä½•æª”案"
#: modules/luci-base/luasrc/view/wifi_assoclist.htm:100
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:174
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:174
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:180
msgid "No information available"
msgstr "å°šç„¡å¯é‹ç”¨è³‡è¨Š"
@@ -3546,7 +3551,7 @@ msgstr ""
msgid "Options"
msgstr "é¸é …"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:374
msgid "Other:"
msgstr "其它:"
@@ -3624,7 +3629,7 @@ msgstr "æŒæœ‰è€…"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:34
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:14
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:18
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:32
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:43
msgid "PAP/CHAP password"
msgstr "PAP/CHAP驗證密碼"
@@ -3635,7 +3640,7 @@ msgstr "PAP/CHAP驗證密碼"
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua:11
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua:15
-#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:29
+#: protocols/luci-proto-qmi/luasrc/model/cbi/admin_network/proto_qmi.lua:37
msgid "PAP/CHAP username"
msgstr "PAP/CHAP驗證用戶å"
@@ -3766,9 +3771,9 @@ msgstr ""
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:293
#: modules/luci-mod-status/luasrc/view/admin_status/bandwidth.htm:303
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:329
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:339
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:349
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:370
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:380
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:258
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:268
#: modules/luci-mod-status/luasrc/view/admin_status/load.htm:278
@@ -3826,7 +3831,7 @@ msgstr "Ping"
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:87
#: modules/luci-mod-network/htdocs/luci-static/resources/view/network/network.js:88
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:55
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:170
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:176
msgid "Pkts."
msgstr "å°åŒ…數."
@@ -3923,7 +3928,7 @@ msgstr "å”定."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:216
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:54
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/index.js:79
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:359
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:390
msgid "Protocol"
msgstr "å”定"
@@ -4067,7 +4072,7 @@ msgstr "確定è¦å›žå¾©åŽŸå» è¨­å®š?"
msgid "Really switch protocol?"
msgstr "確定è¦æ›´æ›å”定?"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:310
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:341
msgid "Realtime Connections"
msgstr "å³æ™‚連線"
@@ -4241,7 +4246,7 @@ msgstr "解æžæª”"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:28
#: modules/luci-mod-network/luasrc/view/admin_network/wifi_overview.htm:14
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:67
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
msgid "Restart"
msgstr "é‡å•Ÿ"
@@ -4597,7 +4602,7 @@ msgstr ""
"設備安è£æŒ‡å¼•."
#: modules/luci-mod-status/htdocs/luci-static/resources/view/status/iptables.js:61
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:360
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:391
#: modules/luci-mod-status/luasrc/view/admin_status/routes.htm:103
msgid "Source"
msgstr "來æº"
@@ -4644,11 +4649,11 @@ msgid "Specify the secret encryption key here."
msgstr "指定加密金鑰在此."
#: modules/luci-mod-network/luasrc/model/cbi/admin_network/ifaces.lua:475
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:61
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:64
msgid "Start"
msgstr "啟用"
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:32
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:33
msgid "Start priority"
msgstr "啟用優先權順åº"
@@ -4705,7 +4710,7 @@ msgid "Status"
msgstr "狀態"
#: modules/luci-mod-network/luasrc/view/admin_network/iface_overview.htm:35
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:71
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:75
msgid "Stop"
msgstr "åœæ­¢"
@@ -4809,7 +4814,7 @@ msgstr "系統屬性"
msgid "System log buffer size"
msgstr "系統日誌緩è¡å¤§å°"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:333
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:364
msgid "TCP:"
msgstr "TCP:"
@@ -4943,8 +4948,8 @@ msgid ""
"compare them with the original file to ensure data integrity.<br /> Click "
"\"Proceed\" below to start the flash procedure."
msgstr ""
-"å³å°‡åˆ·å…¥çš„映åƒæª”已上傳.下é¢æ˜¯é€™å€‹æ ¡é©—碼和檔案大å°è©³ç´°è³‡è¨Š, 用原始檔比å°ä»–們以確ä¿è³‡æ–™"
-"完整性.<br />按下é¢çš„\"繼續\"便å¯ä»¥é–‹å§‹æ›´æ–°ç¨‹åº."
+"å³å°‡åˆ·å…¥çš„映åƒæª”已上傳.下é¢æ˜¯é€™å€‹æ ¡é©—碼和檔案大å°è©³ç´°è³‡è¨Š, 用原始檔比å°ä»–們以"
+"確ä¿è³‡æ–™å®Œæ•´æ€§.<br />按下é¢çš„\"繼續\"便å¯ä»¥é–‹å§‹æ›´æ–°ç¨‹åº."
#: modules/luci-base/luasrc/view/admin_uci/revert.htm:19
msgid "The following changes have been reverted"
@@ -5104,7 +5109,7 @@ msgid ""
"password if no update key has been configured"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:78
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:82
msgid ""
"This is the content of /etc/rc.local. Insert your own commands here (in "
"front of 'exit 0') to execute them at the end of the boot process."
@@ -5150,7 +5155,7 @@ msgid ""
"their status."
msgstr "這清單æ供目å‰æ­£åœ¨åŸ·è¡Œçš„系統的執行緒和狀態的é è¦½."
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:312
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:343
msgid "This page gives an overview over currently active network connections."
msgstr "這一é æ供目å‰æ­£åœ¨æ´»å‹•ä¸­ç¶²è·¯é€£ç·šçš„é è¦½."
@@ -5209,7 +5214,7 @@ msgstr "路由追蹤"
msgid "Traffic"
msgstr "æµé‡"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:362
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:393
msgid "Transfer"
msgstr "傳輸"
@@ -5264,7 +5269,7 @@ msgstr "傳é€-功率"
msgid "Type"
msgstr "åž‹æ…‹"
-#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:323
+#: modules/luci-mod-status/luasrc/view/admin_status/connections.htm:354
msgid "UDP:"
msgstr "UDP:"
@@ -5400,7 +5405,7 @@ msgstr "使用DHCPçš„é–˜é“"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua:33
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:85
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:34
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:94
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:98
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:46
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:59
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:65
@@ -5452,7 +5457,7 @@ msgstr "使用內建的IPv6管ç†åŠŸèƒ½"
#: modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua:109
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:92
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:45
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:101
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:105
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:53
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:66
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua:72
@@ -5466,7 +5471,7 @@ msgstr "使用自定的DNS伺æœå™¨"
#: protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua:70
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:16
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua:28
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:80
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:84
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:24
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:44
@@ -5486,7 +5491,7 @@ msgstr "使用é è¨­é–˜é“"
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua:23
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua:39
#: protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua:74
-#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:86
+#: protocols/luci-proto-ncm/luasrc/model/cbi/admin_network/proto_ncm.lua:90
#: protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua:31
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua:38
#: protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua:51
@@ -5761,7 +5766,7 @@ msgstr "將系統日誌寫入檔案"
msgid "Yes"
msgstr ""
-#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:25
+#: modules/luci-mod-system/luasrc/model/cbi/admin_system/startup.lua:26
msgid ""
"You can enable or disable installed init scripts here. Changes will applied "
"after a device reboot.<br /><strong>Warning: If you disable essential init "
diff --git a/modules/luci-base/root/usr/libexec/rpcd/luci b/modules/luci-base/root/usr/libexec/rpcd/luci
new file mode 100755
index 0000000000..dba6df0cb9
--- /dev/null
+++ b/modules/luci-base/root/usr/libexec/rpcd/luci
@@ -0,0 +1,338 @@
+#!/usr/bin/env lua
+
+local json = require "luci.jsonc"
+local fs = require "nixio.fs"
+
+local function readfile(path)
+ local s = fs.readfile(path)
+ return s and (s:gsub("^%s+", ""):gsub("%s+$", ""))
+end
+
+local methods = {
+ initList = {
+ args = { name = "name" },
+ call = function(args)
+ local sys = require "luci.sys"
+ local _, name, scripts = nil, nil, {}
+ for _, name in ipairs(args.name and { args.name } or sys.init.names()) do
+ local index = sys.init.index(name)
+ if index then
+ scripts[name] = { index = index, enabled = sys.init.enabled(name) }
+ else
+ return { error = "No such init script" }
+ end
+ end
+ return { result = scripts }
+ end
+ },
+
+ initCall = {
+ args = { name = "name", action = "action" },
+ call = function(args)
+ local sys = require "luci.sys"
+ if type(sys.init[args.action]) ~= "function" then
+ return { error = "Invalid action" }
+ end
+ return { result = sys.init[args.action](args.name) }
+ end
+ },
+
+ localtime = {
+ call = function(args)
+ return { localtime = os.time() }
+ end
+ },
+
+ timezone = {
+ args = { zonename = "UTC" },
+ call = function(args)
+ local util = require "luci.util"
+ local zones = require "luci.sys.zoneinfo"
+
+ local tz = readfile("/etc/TZ")
+ local res = util.ubus("uci", "get", {
+ config = "system",
+ section = "@system[0]",
+ option = "zonename"
+ })
+
+ local result = {}
+ local _, zone
+ for _, zone in ipairs(zones.TZ) do
+ result[zone[1]] = {
+ tzstring = zone[2],
+ active = (res and res.value == zone[1]) and true or nil
+ }
+ end
+ return { result = result }
+ end
+ },
+
+ leds = {
+ call = function()
+ local iter = fs.dir("/sys/class/leds")
+ local result = { }
+
+ if iter then
+ local led
+ for led in iter do
+ local m, s
+
+ result[led] = { triggers = {} }
+
+ s = readfile("/sys/class/leds/"..led.."/trigger")
+ for s in (s or ""):gmatch("%S+") do
+ m = s:match("^%[(.+)%]$")
+ result[led].triggers[#result[led].triggers+1] = m or s
+ result[led].active_trigger = m or result[led].active_trigger
+ end
+
+ s = readfile("/sys/class/leds/"..led.."/brightness")
+ if s then
+ result[led].brightness = tonumber(s)
+ end
+
+ s = readfile("/sys/class/leds/"..led.."/max_brightness")
+ if s then
+ result[led].max_brightness = tonumber(s)
+ end
+ end
+ end
+
+ return result
+ end
+ },
+
+ usb = {
+ call = function()
+ local fs = require "nixio.fs"
+ local iter = fs.glob("/sys/bus/usb/devices/[0-9]*/manufacturer")
+ local result = { }
+
+ if iter then
+ result.devices = {}
+
+ local p
+ for p in iter do
+ local id = p:match("%d+-%d+")
+
+ result.devices[#result.devices+1] = {
+ id = id,
+ vid = readfile("/sys/bus/usb/devices/"..id.."/idVendor"),
+ pid = readfile("/sys/bus/usb/devices/"..id.."/idProduct"),
+ vendor = readfile("/sys/bus/usb/devices/"..id.."/manufacturer"),
+ product = readfile("/sys/bus/usb/devices/"..id.."/product"),
+ speed = tonumber((readfile("/sys/bus/usb/devices/"..id.."/product")))
+ }
+ end
+ end
+
+ iter = fs.glob("/sys/bus/usb/devices/*/usb[0-9]*-port[0-9]*")
+
+ if iter then
+ result.ports = {}
+
+ local p
+ for p in iter do
+ local bus, port = p:match("usb(%d+)-port(%d+)")
+
+ result.ports[#result.ports+1] = {
+ hub = tonumber(bus),
+ port = tonumber(port)
+ }
+ end
+ end
+
+ return result
+ end
+ },
+
+ ifaddrs = {
+ call = function()
+ return { result = nixio.getifaddrs() }
+ end
+ },
+
+ host_hints = {
+ call = function()
+ local sys = require "luci.sys"
+ return sys.net.host_hints()
+ end
+ },
+
+ duid_hints = {
+ call = function()
+ local fp = io.open('/var/hosts/odhcpd')
+ local result = { }
+ if fp then
+ for line in fp:lines() do
+ local dev, duid, name = string.match(line, '# (%S+)%s+(%S+)%s+%d+%s+(%S+)')
+ if dev and duid and name then
+ result[duid] = {
+ name = (name ~= "-") and name or nil,
+ device = dev
+ }
+ end
+ end
+ fp:close()
+ end
+ return result
+ end
+ },
+
+ leases = {
+ args = { family = 0 },
+ call = function(args)
+ local s = require "luci.tools.status"
+
+ if args.family == 4 then
+ return { dhcp_leases = s.dhcp_leases() }
+ elseif args.family == 6 then
+ return { dhcp6_leases = s.dhcp6_leases() }
+ else
+ return {
+ dhcp_leases = s.dhcp_leases(),
+ dhcp6_leases = s.dhcp6_leases()
+ }
+ end
+ end
+ },
+
+ netdevs = {
+ call = function(args)
+ local dir = fs.dir("/sys/class/net")
+ local result = { }
+ if dir then
+ local dev
+ for dev in dir do
+ if not result[dev] then
+ result[dev] = { name = dev }
+ end
+
+ if fs.access("/sys/class/net/"..dev.."/master") then
+ local brname = fs.basename(fs.readlink("/sys/class/net/"..dev.."/master"))
+ if not result[brname] then
+ result[brname] = { name = brname }
+ end
+
+ if not result[brname].ports then
+ result[brname].ports = { }
+ end
+
+ result[brname].ports[#result[brname].ports+1] = dev
+ elseif fs.access("/sys/class/net/"..dev.."/bridge") then
+ if not result[dev].ports then
+ result[dev].ports = { }
+ end
+
+ result[dev].id = readfile("/sys/class/net/"..dev.."/bridge/bridge_id")
+ result[dev].stp = (readfile("/sys/class/net/"..dev.."/bridge/stp_state") ~= "0")
+ result[dev].bridge = true
+ end
+
+ local opr = readfile("/sys/class/net/"..dev.."/operstate")
+
+ result[dev].up = (opr == "up" or opr == "unknown")
+ result[dev].type = tonumber(readfile("/sys/class/net/"..dev.."/type"))
+ result[dev].name = dev
+
+ local mtu = tonumber(readfile("/sys/class/net/"..dev.."/mtu"))
+ if mtu and mtu > 0 then
+ result[dev].mtu = mtu
+ end
+
+ local qlen = tonumber(readfile("/sys/class/net/"..dev.."/tx_queue_len"))
+ if qlen and qlen > 0 then
+ result[dev].qlen = qlen
+ end
+
+ local master = fs.readlink("/sys/class/net/"..dev.."/master")
+ if master then
+ result[dev].master = fs.basename(master)
+ end
+
+ local mac = readfile("/sys/class/net/"..dev.."/address")
+ if mac and #mac == 17 then
+ result[dev].mac = mac
+ end
+ end
+ end
+ return result
+ end
+ },
+
+ boardjson = {
+ call = function(args)
+ local jsc = require "luci.jsonc"
+ return jsc.parse(fs.readfile("/etc/board.json") or "")
+ end
+ },
+
+ offload_support = {
+ call = function()
+ local fs = require "nixio.fs"
+ return { offload_support = not not fs.access("/sys/module/xt_FLOWOFFLOAD/refcnt") }
+ end
+ }
+}
+
+local function parseInput()
+ local parse = json.new()
+ local done, err
+
+ while true do
+ local chunk = io.read(4096)
+ if not chunk then
+ break
+ elseif not done and not err then
+ done, err = parse:parse(chunk)
+ end
+ end
+
+ if not done then
+ print(json.stringify({ error = err or "Incomplete input" }))
+ os.exit(1)
+ end
+
+ return parse:get()
+end
+
+local function validateArgs(func, uargs)
+ local method = methods[func]
+ if not method then
+ print(json.stringify({ error = "Method not found" }))
+ os.exit(1)
+ end
+
+ if type(uargs) ~= "table" then
+ print(json.stringify({ error = "Invalid arguments" }))
+ os.exit(1)
+ end
+
+ uargs.ubus_rpc_session = nil
+
+ local k, v
+ local margs = method.args or {}
+ for k, v in pairs(uargs) do
+ if margs[k] == nil or
+ (v ~= nil and type(v) ~= type(margs[k]))
+ then
+ print(json.stringify({ error = "Invalid arguments" }))
+ os.exit(1)
+ end
+ end
+
+ return method
+end
+
+if arg[1] == "list" then
+ local _, method, rv = nil, nil, {}
+ for _, method in pairs(methods) do rv[_] = method.args or {} end
+ print((json.stringify(rv):gsub(":%[%]", ":{}")))
+elseif arg[1] == "call" then
+ local args = parseInput()
+ local method = validateArgs(arg[2], args)
+ local result, code = method.call(args)
+ print((json.stringify(result):gsub("^%[%]$", "{}")))
+ os.exit(code or 0)
+end
diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js
new file mode 100644
index 0000000000..7035dc4769
--- /dev/null
+++ b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js
@@ -0,0 +1,410 @@
+'use strict';
+'require rpc';
+'require uci';
+'require form';
+
+var callHostHints, callDUIDHints, callDHCPLeases, CBILeaseStatus;
+
+callHostHints = rpc.declare({
+ object: 'luci',
+ method: 'host_hints'
+});
+
+callDUIDHints = rpc.declare({
+ object: 'luci',
+ method: 'duid_hints'
+});
+
+callDHCPLeases = rpc.declare({
+ object: 'luci',
+ method: 'leases',
+ params: [ 'family' ],
+ expect: { dhcp_leases: [] }
+});
+
+CBILeaseStatus = form.DummyValue.extend({
+ renderWidget: function(section_id, option_id, cfgvalue) {
+ return E([
+ E('h4', _('Active DHCP Leases')),
+ E('div', { 'id': 'lease_status_table', 'class': 'table' }, [
+ E('div', { 'class': 'tr table-titles' }, [
+ E('div', { 'class': 'th' }, _('Hostname')),
+ E('div', { 'class': 'th' }, _('IPv4-Address')),
+ E('div', { 'class': 'th' }, _('MAC-Address')),
+ E('div', { 'class': 'th' }, _('Leasetime remaining'))
+ ]),
+ E('div', { 'class': 'tr placeholder' }, [
+ E('div', { 'class': 'td' }, E('em', _('Collecting data...')))
+ ])
+ ])
+ ]);
+ }
+});
+
+return L.view.extend({
+
+
+ load: function() {
+ return Promise.all([
+ callHostHints(),
+ callDUIDHints()
+ ]);
+ },
+
+ render: function(hosts_duids) {
+ var hosts = hosts_duids[0],
+ duids = hosts_duids[1],
+ m, s, o, ss, so;
+
+ m = new form.Map('dhcp', _('DHCP and DNS'), _('Dnsmasq is a combined <abbr title="Dynamic Host Configuration Protocol">DHCP</abbr>-Server and <abbr title="Domain Name System">DNS</abbr>-Forwarder for <abbr title="Network Address Translation">NAT</abbr> firewalls'));
+ m.tabbed = true;
+
+ s = m.section(form.TypedSection, 'dnsmasq', _('Server Settings'));
+ s.anonymous = true;
+ s.addremove = false;
+
+ s.tab('general', _('General Settings'));
+ s.tab('files', _('Resolv and Hosts Files'));
+ s.tab('tftp', _('TFTP Settings'));
+ s.tab('advanced', _('Advanced Settings'));
+ s.tab('leases', _('Static Leases'));
+
+ s.taboption('general', form.Flag, 'domainneeded',
+ _('Domain required'),
+ _('Don\'t forward <abbr title="Domain Name System">DNS</abbr>-Requests without <abbr title="Domain Name System">DNS</abbr>-Name'));
+
+ s.taboption('general', form.Flag, 'authoritative',
+ _('Authoritative'),
+ _('This is the only <abbr title="Dynamic Host Configuration Protocol">DHCP</abbr> in the local network'));
+
+
+ s.taboption('files', form.Flag, 'readethers',
+ _('Use <code>/etc/ethers</code>'),
+ _('Read <code>/etc/ethers</code> to configure the <abbr title="Dynamic Host Configuration Protocol">DHCP</abbr>-Server'));
+
+ s.taboption('files', form.Value, 'leasefile',
+ _('Leasefile'),
+ _('file where given <abbr title="Dynamic Host Configuration Protocol">DHCP</abbr>-leases will be stored'));
+
+ s.taboption('files', form.Flag, 'noresolv',
+ _('Ignore resolve file')).optional = true;
+
+ o = s.taboption('files', form.Value, 'resolvfile',
+ _('Resolve file'),
+ _('local <abbr title="Domain Name System">DNS</abbr> file'));
+
+ o.depends('noresolv', '');
+ o.optional = true;
+
+
+ s.taboption('files', form.Flag, 'nohosts',
+ _('Ignore <code>/etc/hosts</code>')).optional = true;
+
+ s.taboption('files', form.DynamicList, 'addnhosts',
+ _('Additional Hosts files')).optional = true;
+
+ o = s.taboption('advanced', form.Flag, 'quietdhcp',
+ _('Suppress logging'),
+ _('Suppress logging of the routine operation of these protocols'));
+ o.optional = true;
+
+ o = s.taboption('advanced', form.Flag, 'sequential_ip',
+ _('Allocate IP sequentially'),
+ _('Allocate IP addresses sequentially, starting from the lowest available address'));
+ o.optional = true;
+
+ o = s.taboption('advanced', form.Flag, 'boguspriv',
+ _('Filter private'),
+ _('Do not forward reverse lookups for local networks'));
+ o.default = o.enabled;
+
+ s.taboption('advanced', form.Flag, 'filterwin2k',
+ _('Filter useless'),
+ _('Do not forward requests that cannot be answered by public name servers'));
+
+
+ s.taboption('advanced', form.Flag, 'localise_queries',
+ _('Localise queries'),
+ _('Localise hostname depending on the requesting subnet if multiple IPs are available'));
+
+ //local have_dnssec_support = luci.util.checklib('/usr/sbin/dnsmasq', 'libhogweed.so');
+ var have_dnssec_support = true;
+
+ if (have_dnssec_support) {
+ o = s.taboption('advanced', form.Flag, 'dnssec',
+ _('DNSSEC'));
+ o.optional = true;
+
+ o = s.taboption('advanced', form.Flag, 'dnsseccheckunsigned',
+ _('DNSSEC check unsigned'),
+ _('Requires upstream supports DNSSEC; verify unsigned domain responses really come from unsigned domains'));
+ o.optional = true;
+ }
+
+ s.taboption('general', form.Value, 'local',
+ _('Local server'),
+ _('Local domain specification. Names matching this domain are never forwarded and are resolved from DHCP or hosts files only'));
+
+ s.taboption('general', form.Value, 'domain',
+ _('Local domain'),
+ _('Local domain suffix appended to DHCP names and hosts file entries'));
+
+ s.taboption('advanced', form.Flag, 'expandhosts',
+ _('Expand hosts'),
+ _('Add local domain suffix to names served from hosts files'));
+
+ s.taboption('advanced', form.Flag, 'nonegcache',
+ _('No negative cache'),
+ _('Do not cache negative replies, e.g. for not existing domains'));
+
+ s.taboption('advanced', form.Value, 'serversfile',
+ _('Additional servers file'),
+ _('This file may contain lines like \'server=/domain/1.2.3.4\' or \'server=1.2.3.4\' for domain-specific or full upstream <abbr title="Domain Name System">DNS</abbr> servers.'));
+
+ s.taboption('advanced', form.Flag, 'strictorder',
+ _('Strict order'),
+ _('<abbr title="Domain Name System">DNS</abbr> servers will be queried in the order of the resolvfile')).optional = true;
+
+ s.taboption('advanced', form.Flag, 'allservers',
+ _('All Servers'),
+ _('Query all available upstream <abbr title="Domain Name System">DNS</abbr> servers')).optional = true;
+
+ o = s.taboption('advanced', form.DynamicList, 'bogusnxdomain', _('Bogus NX Domain Override'),
+ _('List of hosts that supply bogus NX domain results'));
+
+ o.optional = true;
+ o.placeholder = '67.215.65.132';
+
+
+ s.taboption('general', form.Flag, 'logqueries',
+ _('Log queries'),
+ _('Write received DNS requests to syslog')).optional = true;
+
+ o = s.taboption('general', form.DynamicList, 'server', _('DNS forwardings'),
+ _('List of <abbr title="Domain Name System">DNS</abbr> servers to forward requests to'));
+
+ o.optional = true;
+ o.placeholder = '/example.org/10.1.2.3';
+
+
+ o = s.taboption('general', form.Flag, 'rebind_protection',
+ _('Rebind protection'),
+ _('Discard upstream RFC1918 responses'));
+
+ o.rmempty = false;
+
+
+ o = s.taboption('general', form.Flag, 'rebind_localhost',
+ _('Allow localhost'),
+ _('Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services'));
+
+ o.depends('rebind_protection', '1');
+
+
+ o = s.taboption('general', form.DynamicList, 'rebind_domain',
+ _('Domain whitelist'),
+ _('List of domains to allow RFC1918 responses for'));
+ o.optional = true;
+
+ o.depends('rebind_protection', '1');
+ o.datatype = 'host(1)';
+ o.placeholder = 'ihost.netflix.com';
+
+
+ o = s.taboption('advanced', form.Value, 'port',
+ _('<abbr title="Domain Name System">DNS</abbr> server port'),
+ _('Listening port for inbound DNS queries'));
+
+ o.optional = true;
+ o.datatype = 'port';
+ o.placeholder = 53;
+
+
+ o = s.taboption('advanced', form.Value, 'queryport',
+ _('<abbr title="Domain Name System">DNS</abbr> query port'),
+ _('Fixed source port for outbound DNS queries'));
+
+ o.optional = true;
+ o.datatype = 'port';
+ o.placeholder = _('any');
+
+
+ o = s.taboption('advanced', form.Value, 'dhcpleasemax',
+ _('<abbr title="maximal">Max.</abbr> <abbr title="Dynamic Host Configuration Protocol">DHCP</abbr> leases'),
+ _('Maximum allowed number of active DHCP leases'));
+
+ o.optional = true;
+ o.datatype = 'uinteger';
+ o.placeholder = _('unlimited');
+
+
+ o = s.taboption('advanced', form.Value, 'ednspacket_max',
+ _('<abbr title="maximal">Max.</abbr> <abbr title="Extension Mechanisms for Domain Name System">EDNS0</abbr> packet size'),
+ _('Maximum allowed size of EDNS.0 UDP packets'));
+
+ o.optional = true;
+ o.datatype = 'uinteger';
+ o.placeholder = 1280;
+
+
+ o = s.taboption('advanced', form.Value, 'dnsforwardmax',
+ _('<abbr title="maximal">Max.</abbr> concurrent queries'),
+ _('Maximum allowed number of concurrent DNS queries'));
+
+ o.optional = true;
+ o.datatype = 'uinteger';
+ o.placeholder = 150;
+
+ o = s.taboption('advanced', form.Value, 'cachesize',
+ _('Size of DNS query cache'),
+ _('Number of cached DNS entries (max is 10000, 0 is no caching)'));
+ o.optional = true;
+ o.datatype = 'range(0,10000)';
+ o.placeholder = 150;
+
+ s.taboption('tftp', form.Flag, 'enable_tftp',
+ _('Enable TFTP server')).optional = true;
+
+ o = s.taboption('tftp', form.Value, 'tftp_root',
+ _('TFTP server root'),
+ _('Root directory for files served via TFTP'));
+
+ o.optional = true;
+ o.depends('enable_tftp', '1');
+ o.placeholder = '/';
+
+
+ o = s.taboption('tftp', form.Value, 'dhcp_boot',
+ _('Network boot image'),
+ _('Filename of the boot image advertised to clients'));
+
+ o.optional = true;
+ o.depends('enable_tftp', '1');
+ o.placeholder = 'pxelinux.0';
+
+ o = s.taboption('general', form.Flag, 'localservice',
+ _('Local Service Only'),
+ _('Limit DNS service to subnets interfaces on which we are serving DNS.'));
+ o.optional = false;
+ o.rmempty = false;
+
+ o = s.taboption('general', form.Flag, 'nonwildcard',
+ _('Non-wildcard'),
+ _('Bind dynamically to interfaces rather than wildcard address (recommended as linux default)'));
+ o.optional = false;
+ o.rmempty = true;
+
+ o = s.taboption('general', form.DynamicList, 'interface',
+ _('Listen Interfaces'),
+ _('Limit listening to these interfaces, and loopback.'));
+ o.optional = true;
+
+ o = s.taboption('general', form.DynamicList, 'notinterface',
+ _('Exclude interfaces'),
+ _('Prevent listening on these interfaces.'));
+ o.optional = true;
+
+ o = s.taboption('leases', form.SectionValue, '__leases__', form.GridSection, 'host', null,
+ _('Static leases are used to assign fixed IP addresses and symbolic hostnames to DHCP clients. They are also required for non-dynamic interface configurations where only hosts with a corresponding lease are served.') + '<br />' +
+ _('Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</em> identifies the host, the <em>IPv4-Address</em> specifies the fixed address to use, and the <em>Hostname</em> is assigned as a symbolic name to the requesting host. The optional <em>Lease time</em> can be used to set non-standard host-specific lease time, e.g. 12h, 3d or infinite.'));
+
+ ss = o.subsection;
+
+ ss.addremove = true;
+ ss.anonymous = true;
+
+ so = ss.option(form.Value, 'name', _('Hostname'));
+ so.datatype = 'hostname("strict")';
+ so.rmempty = true;
+ so.write = function(section, value) {
+ uci.set('dhcp', section, 'name', value);
+ uci.set('dhcp', section, 'dns', '1');
+ };
+ so.remove = function(section) {
+ uci.unset('dhcp', section, 'name');
+ uci.unset('dhcp', section, 'dns');
+ };
+
+ so = ss.option(form.Value, 'mac', _('<abbr title="Media Access Control">MAC</abbr>-Address'));
+ so.datatype = 'list(unique(macaddr))';
+ so.rmempty = true;
+ so.cfgvalue = function(section) {
+ var macs = uci.get('dhcp', section, 'mac'),
+ result = [];
+
+ if (!Array.isArray(macs))
+ macs = (macs != null && macs != '') ? macs.split(/\ss+/) : [];
+
+ for (var i = 0, mac; (mac = macs[i]) != null; i++)
+ if (/^([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2})$/.test(mac))
+ result.push('%02X:%02X:%02X:%02X:%02X:%02X'.format(
+ parseInt(RegExp.$1, 16), parseInt(RegExp.$2, 16),
+ parseInt(RegExp.$3, 16), parseInt(RegExp.$4, 16),
+ parseInt(RegExp.$5, 16), parseInt(RegExp.$6, 16)));
+
+ return result.length ? result.join(' ') : null;
+ };
+ Object.keys(hosts).forEach(function(mac) {
+ so.value(mac);
+ });
+
+ so = ss.option(form.Value, 'ip', _('<abbr title="Internet Protocol Version 4">IPv4</abbr>-Address'));
+ so.datatype = 'or(ip4addr,"ignore")';
+ so.validate = function(section, value) {
+ var mac = this.map.lookupOption('mac', section),
+ name = this.map.lookupOption('name', section),
+ m = mac ? mac[0].formvalue(section) : null,
+ n = name ? name[0].formvalue(section) : null;
+
+ if ((m == null || m == '') && (n == null || n == ''))
+ return _('One of hostname or mac address must be specified!');
+
+ return true;
+ };
+ Object.keys(hosts).forEach(function(mac) {
+ if (hosts[mac].ipv4)
+ so.value(hosts[mac].ipv4);
+ });
+
+ so = ss.option(form.Value, 'leasetime', _('Lease time'));
+ so.rmempty = true;
+
+ so = ss.option(form.Value, 'duid', _('<abbr title="The DHCP Unique Identifier">DUID</abbr>'));
+ so.datatype = 'and(rangelength(20,36),hexstring)';
+ Object.keys(duids).forEach(function(duid) {
+ so.value(duid, '%s (%s)'.format(duid, duids[duid].name || '?'));
+ });
+
+ so = ss.option(form.Value, 'hostid', _('<abbr title="Internet Protocol Version 6">IPv6</abbr>-Suffix (hex)'));
+
+ o = s.taboption('leases', CBILeaseStatus, '__status__');
+
+ return m.render().then(function(mapEl) {
+ L.Poll.add(function() {
+ return callDHCPLeases(4).then(function(leases) {
+ cbi_update_table(mapEl.querySelector('#lease_status_table'),
+ leases.map(function(lease) {
+ var exp;
+
+ if (lease.expires === false)
+ exp = E('em', _('unlimited'));
+ else if (lease.expires <= 0)
+ exp = E('em', _('expired'));
+ else
+ exp = '%t'.format(lease.expires);
+
+ return [
+ lease.hostname || '?',
+ lease.ipaddr,
+ lease.macaddr,
+ exp
+ ];
+ }),
+ E('em', _('There are no active leases')));
+ });
+ });
+
+ return mapEl;
+ });
+ }
+});
diff --git a/modules/luci-mod-network/luasrc/controller/admin/network.lua b/modules/luci-mod-network/luasrc/controller/admin/network.lua
index 2312dcf6e0..5c580b4ef9 100644
--- a/modules/luci-mod-network/luasrc/controller/admin/network.lua
+++ b/modules/luci-mod-network/luasrc/controller/admin/network.lua
@@ -103,7 +103,7 @@ function index()
if nixio.fs.access("/etc/config/dhcp") then
page = node("admin", "network", "dhcp")
- page.target = cbi("admin_network/dhcp")
+ page.target = view("network/dhcp")
page.title = _("DHCP and DNS")
page.order = 30
diff --git a/modules/luci-mod-network/luasrc/model/cbi/admin_network/dhcp.lua b/modules/luci-mod-network/luasrc/model/cbi/admin_network/dhcp.lua
deleted file mode 100644
index 0be1b3fb58..0000000000
--- a/modules/luci-mod-network/luasrc/model/cbi/admin_network/dhcp.lua
+++ /dev/null
@@ -1,344 +0,0 @@
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Licensed to the public under the Apache License 2.0.
-
-local ipc = require "luci.ip"
-local sys = require "luci.sys"
-local o
-require "luci.util"
-
-m = Map("dhcp", translate("DHCP and DNS"),
- translate("Dnsmasq is a combined <abbr title=\"Dynamic Host Configuration Protocol" ..
- "\">DHCP</abbr>-Server and <abbr title=\"Domain Name System\">DNS</abbr>-" ..
- "Forwarder for <abbr title=\"Network Address Translation\">NAT</abbr> " ..
- "firewalls"))
-
-s = m:section(TypedSection, "dnsmasq", translate("Server Settings"))
-s.anonymous = true
-s.addremove = false
-
-s:tab("general", translate("General Settings"))
-s:tab("files", translate("Resolv and Hosts Files"))
-s:tab("tftp", translate("TFTP Settings"))
-s:tab("advanced", translate("Advanced Settings"))
-
-s:taboption("general", Flag, "domainneeded",
- translate("Domain required"),
- translate("Don't forward <abbr title=\"Domain Name System\">DNS</abbr>-Requests without " ..
- "<abbr title=\"Domain Name System\">DNS</abbr>-Name"))
-
-s:taboption("general", Flag, "authoritative",
- translate("Authoritative"),
- translate("This is the only <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</" ..
- "abbr> in the local network"))
-
-
-s:taboption("files", Flag, "readethers",
- translate("Use <code>/etc/ethers</code>"),
- translate("Read <code>/etc/ethers</code> to configure the <abbr title=\"Dynamic Host " ..
- "Configuration Protocol\">DHCP</abbr>-Server"))
-
-s:taboption("files", Value, "leasefile",
- translate("Leasefile"),
- translate("file where given <abbr title=\"Dynamic Host Configuration Protocol\">DHCP</" ..
- "abbr>-leases will be stored"))
-
-s:taboption("files", Flag, "noresolv",
- translate("Ignore resolve file")).optional = true
-
-rf = s:taboption("files", Value, "resolvfile",
- translate("Resolve file"),
- translate("local <abbr title=\"Domain Name System\">DNS</abbr> file"))
-
-rf:depends("noresolv", "")
-rf.optional = true
-
-
-s:taboption("files", Flag, "nohosts",
- translate("Ignore <code>/etc/hosts</code>")).optional = true
-
-s:taboption("files", DynamicList, "addnhosts",
- translate("Additional Hosts files")).optional = true
-
-qu = s:taboption("advanced", Flag, "quietdhcp",
- translate("Suppress logging"),
- translate("Suppress logging of the routine operation of these protocols"))
-qu.optional = true
-
-se = s:taboption("advanced", Flag, "sequential_ip",
- translate("Allocate IP sequentially"),
- translate("Allocate IP addresses sequentially, starting from the lowest available address"))
-se.optional = true
-
-bp = s:taboption("advanced", Flag, "boguspriv",
- translate("Filter private"),
- translate("Do not forward reverse lookups for local networks"))
-bp.default = bp.enabled
-
-s:taboption("advanced", Flag, "filterwin2k",
- translate("Filter useless"),
- translate("Do not forward requests that cannot be answered by public name servers"))
-
-
-s:taboption("advanced", Flag, "localise_queries",
- translate("Localise queries"),
- translate("Localise hostname depending on the requesting subnet if multiple IPs are available"))
-
-local have_dnssec_support = luci.util.checklib("/usr/sbin/dnsmasq", "libhogweed.so")
-
-if have_dnssec_support then
- o = s:taboption("advanced", Flag, "dnssec",
- translate("DNSSEC"))
- o.optional = true
-
- o = s:taboption("advanced", Flag, "dnsseccheckunsigned",
- translate("DNSSEC check unsigned"),
- translate("Requires upstream supports DNSSEC; verify unsigned domain responses really come from unsigned domains"))
- o.optional = true
-end
-
-s:taboption("general", Value, "local",
- translate("Local server"),
- translate("Local domain specification. Names matching this domain are never forwarded and are resolved from DHCP or hosts files only"))
-
-s:taboption("general", Value, "domain",
- translate("Local domain"),
- translate("Local domain suffix appended to DHCP names and hosts file entries"))
-
-s:taboption("advanced", Flag, "expandhosts",
- translate("Expand hosts"),
- translate("Add local domain suffix to names served from hosts files"))
-
-s:taboption("advanced", Flag, "nonegcache",
- translate("No negative cache"),
- translate("Do not cache negative replies, e.g. for not existing domains"))
-
-s:taboption("advanced", Value, "serversfile",
- translate("Additional servers file"),
- translate("This file may contain lines like 'server=/domain/1.2.3.4' or 'server=1.2.3.4' for"..
- "domain-specific or full upstream <abbr title=\"Domain Name System\">DNS</abbr> servers."))
-
-s:taboption("advanced", Flag, "strictorder",
- translate("Strict order"),
- translate("<abbr title=\"Domain Name System\">DNS</abbr> servers will be queried in the " ..
- "order of the resolvfile")).optional = true
-
-s:taboption("advanced", Flag, "allservers",
- translate("All Servers"),
- translate("Query all available upstream <abbr title=\"Domain Name System\">DNS</abbr> servers")).optional = true
-
-bn = s:taboption("advanced", DynamicList, "bogusnxdomain", translate("Bogus NX Domain Override"),
- translate("List of hosts that supply bogus NX domain results"))
-
-bn.optional = true
-bn.placeholder = "67.215.65.132"
-
-
-s:taboption("general", Flag, "logqueries",
- translate("Log queries"),
- translate("Write received DNS requests to syslog")).optional = true
-
-df = s:taboption("general", DynamicList, "server", translate("DNS forwardings"),
- translate("List of <abbr title=\"Domain Name System\">DNS</abbr> " ..
- "servers to forward requests to"))
-
-df.optional = true
-df.placeholder = "/example.org/10.1.2.3"
-
-
-rp = s:taboption("general", Flag, "rebind_protection",
- translate("Rebind protection"),
- translate("Discard upstream RFC1918 responses"))
-
-rp.rmempty = false
-
-
-rl = s:taboption("general", Flag, "rebind_localhost",
- translate("Allow localhost"),
- translate("Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services"))
-
-rl:depends("rebind_protection", "1")
-
-
-rd = s:taboption("general", DynamicList, "rebind_domain",
- translate("Domain whitelist"),
- translate("List of domains to allow RFC1918 responses for"))
-rd.optional = true
-
-rd:depends("rebind_protection", "1")
-rd.datatype = "host(1)"
-rd.placeholder = "ihost.netflix.com"
-
-
-pt = s:taboption("advanced", Value, "port",
- translate("<abbr title=\"Domain Name System\">DNS</abbr> server port"),
- translate("Listening port for inbound DNS queries"))
-
-pt.optional = true
-pt.datatype = "port"
-pt.placeholder = 53
-
-
-qp = s:taboption("advanced", Value, "queryport",
- translate("<abbr title=\"Domain Name System\">DNS</abbr> query port"),
- translate("Fixed source port for outbound DNS queries"))
-
-qp.optional = true
-qp.datatype = "port"
-qp.placeholder = translate("any")
-
-
-lm = s:taboption("advanced", Value, "dhcpleasemax",
- translate("<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Dynamic Host Configuration " ..
- "Protocol\">DHCP</abbr> leases"),
- translate("Maximum allowed number of active DHCP leases"))
-
-lm.optional = true
-lm.datatype = "uinteger"
-lm.placeholder = translate("unlimited")
-
-
-em = s:taboption("advanced", Value, "ednspacket_max",
- translate("<abbr title=\"maximal\">Max.</abbr> <abbr title=\"Extension Mechanisms for " ..
- "Domain Name System\">EDNS0</abbr> packet size"),
- translate("Maximum allowed size of EDNS.0 UDP packets"))
-
-em.optional = true
-em.datatype = "uinteger"
-em.placeholder = 1280
-
-
-cq = s:taboption("advanced", Value, "dnsforwardmax",
- translate("<abbr title=\"maximal\">Max.</abbr> concurrent queries"),
- translate("Maximum allowed number of concurrent DNS queries"))
-
-cq.optional = true
-cq.datatype = "uinteger"
-cq.placeholder = 150
-
-cs = s:taboption("advanced", Value, "cachesize",
- translate("Size of DNS query cache"),
- translate("Number of cached DNS entries (max is 10000, 0 is no caching)"))
-cs.optional = true
-cs.datatype = "range(0,10000)"
-cs.placeholder = 150
-
-s:taboption("tftp", Flag, "enable_tftp",
- translate("Enable TFTP server")).optional = true
-
-tr = s:taboption("tftp", Value, "tftp_root",
- translate("TFTP server root"),
- translate("Root directory for files served via TFTP"))
-
-tr.optional = true
-tr:depends("enable_tftp", "1")
-tr.placeholder = "/"
-
-
-db = s:taboption("tftp", Value, "dhcp_boot",
- translate("Network boot image"),
- translate("Filename of the boot image advertised to clients"))
-
-db.optional = true
-db:depends("enable_tftp", "1")
-db.placeholder = "pxelinux.0"
-
-o = s:taboption("general", Flag, "localservice",
- translate("Local Service Only"),
- translate("Limit DNS service to subnets interfaces on which we are serving DNS."))
-o.optional = false
-o.rmempty = false
-
-o = s:taboption("general", Flag, "nonwildcard",
- translate("Non-wildcard"),
- translate("Bind dynamically to interfaces rather than wildcard address (recommended as linux default)"))
-o.optional = false
-o.rmempty = true
-
-o = s:taboption("general", DynamicList, "interface",
- translate("Listen Interfaces"),
- translate("Limit listening to these interfaces, and loopback."))
-o.optional = true
-
-o = s:taboption("general", DynamicList, "notinterface",
- translate("Exclude interfaces"),
- translate("Prevent listening on these interfaces."))
-o.optional = true
-
-m:section(SimpleSection).template = "lease_status"
-
-s = m:section(TypedSection, "host", translate("Static Leases"),
- translate("Static leases are used to assign fixed IP addresses and symbolic hostnames to " ..
- "DHCP clients. They are also required for non-dynamic interface configurations where " ..
- "only hosts with a corresponding lease are served.") .. "<br />" ..
- translate("Use the <em>Add</em> Button to add a new lease entry. The <em>MAC-Address</em> " ..
- "identifies the host, the <em>IPv4-Address</em> specifies the fixed address to " ..
- "use, and the <em>Hostname</em> is assigned as a symbolic name to the requesting host. " ..
- "The optional <em>Lease time</em> can be used to set non-standard host-specific " ..
- "lease time, e.g. 12h, 3d or infinite."))
-
-s.addremove = true
-s.anonymous = true
-s.template = "cbi/tblsection"
-
-name = s:option(Value, "name", translate("Hostname"))
-name.datatype = "hostname('strict')"
-name.rmempty = true
-
-function name.write(self, section, value)
- Value.write(self, section, value)
- m:set(section, "dns", "1")
-end
-
-function name.remove(self, section)
- Value.remove(self, section)
- m:del(section, "dns")
-end
-
-mac = s:option(Value, "mac", translate("<abbr title=\"Media Access Control\">MAC</abbr>-Address"))
-mac.datatype = "list(unique(macaddr))"
-mac.rmempty = true
-
-function mac.cfgvalue(self, section)
- local val = Value.cfgvalue(self, section)
- return ipc.checkmac(val) or val
-end
-
-ip = s:option(Value, "ip", translate("<abbr title=\"Internet Protocol Version 4\">IPv4</abbr>-Address"))
-ip.datatype = "or(ip4addr,'ignore')"
-
-time = s:option(Value, "leasetime", translate("Lease time"))
-time.rmempty = true
-
-duid = s:option(Value, "duid", translate("<abbr title=\"The DHCP Unique Identifier\">DUID</abbr>"))
-duid.datatype = "and(rangelength(20,36),hexstring)"
-fp = io.open("/var/hosts/odhcpd")
-if fp then
- for line in fp:lines() do
- local net_val, duid_val = string.match(line, "# (%S+)%s+(%S+)")
- if duid_val then
- duid:value(duid_val, duid_val)
- end
- end
- fp:close()
-end
-
-hostid = s:option(Value, "hostid", translate("<abbr title=\"Internet Protocol Version 6\">IPv6</abbr>-Suffix (hex)"))
-
-sys.net.host_hints(function(m, v4, v6, name)
- if m and v4 then
- ip:value(v4)
- mac:value(m, "%s (%s)" %{ m, name or v4 })
- end
-end)
-
-function ip.validate(self, value, section)
- local m = mac:formvalue(section) or ""
- local n = name:formvalue(section) or ""
- if value and #n == 0 and #m == 0 then
- return nil, translate("One of hostname or mac address must be specified!")
- end
- return Value.validate(self, value, section)
-end
-
-
-return m
diff --git a/modules/luci-mod-network/root/etc/uci-defaults/50_luci-mod-admin-full b/modules/luci-mod-network/root/etc/uci-defaults/50_luci-mod-admin-full
index 372eb15122..140c832997 100755
--- a/modules/luci-mod-network/root/etc/uci-defaults/50_luci-mod-admin-full
+++ b/modules/luci-mod-network/root/etc/uci-defaults/50_luci-mod-admin-full
@@ -5,7 +5,7 @@ if [ "$(uci -q get luci.diag)" != "internal" ]; then
if [ -s /etc/os-release ]; then
. /etc/os-release
- host="${HOME_URL:-${BUG_URL:-$LEDE_DEVICE_MANUFACTURER_URL}}"
+ host="${HOME_URL:-${BUG_URL:-$OPENWRT_DEVICE_MANUFACTURER_URL}}"
host="${host#*://}"
host="${host%%/*}"
fi
diff --git a/modules/luci-mod-status/luasrc/view/admin_status/connections.htm b/modules/luci-mod-status/luasrc/view/admin_status/connections.htm
index e3dd39d607..37debcde66 100644
--- a/modules/luci-mod-status/luasrc/view/admin_status/connections.htm
+++ b/modules/luci-mod-status/luasrc/view/admin_status/connections.htm
@@ -131,15 +131,21 @@
}
label_scale.innerHTML = String.format('<%:(%d minute window, %d second interval)%>', data_wanted / 60, 3);
+
+ var recheck_lookup_queue = {};
/* render datasets, start update interval */
XHR.poll(3, '<%=build_url("admin/status/realtime/connections_status")%>', null,
function(x, json)
{
- var rows = [];
+
+ if (!json.connections)
+ return;
+
var conn = json.connections;
var lookup_queue = [ ];
+ var rows = [];
conn.sort(function(a, b) {
return b.bytes - a.bytes;
@@ -150,13 +156,13 @@
var c = conn[i];
if ((c.src == '127.0.0.1' && c.dst == '127.0.0.1') ||
- (c.src == '::1' && c.dst == '::1'))
+ (c.src == '::1' && c.dst == '::1'))
continue;
- if (!dns_cache[c.src])
+ if (!dns_cache[c.src] && lookup_queue.indexOf(c.src) == -1)
lookup_queue.push(c.src);
- if (!dns_cache[c.dst])
+ if (!dns_cache[c.dst] && lookup_queue.indexOf(c.dst) == -1)
lookup_queue.push(c.dst);
var src = dns_cache[c.src] || (c.layer3 == 'ipv6' ? '[' + c.src + ']' : c.src);
@@ -173,14 +179,39 @@
cbi_update_table(conn_table, rows, '<em><%:No information available%></em>');
- if (lookup_queue.length > 0)
- XHR.get('<%=build_url("admin/status/nameinfo")%>/' + lookup_queue.slice(0, 100).join('/'), null,
- function(x, json)
- {
- for (var addr in json)
- dns_cache[addr] = json[addr];
+ if (lookup_queue.length > 0) {
+ var reduced_lookup_queue = lookup_queue;
+
+ if (lookup_queue.length > 100)
+ reduced_lookup_queue = lookup_queue.slice(0, 100);
+
+ XHR.get('<%=build_url("admin/status/nameinfo")%>/' + reduced_lookup_queue.join('/'), null,
+ function(x, json) {
+ if (!json)
+ return;
+
+ for (var index in reduced_lookup_queue) {
+ var address = reduced_lookup_queue[index];
+
+ if (!address)
+ continue;
+
+ if (json[address]) {
+ dns_cache[address] = json[address];
+ lookup_queue.splice(reduced_lookup_queue.indexOf(address),1);
+ continue;
+ }
+
+ if(recheck_lookup_queue[address] > 2) {
+ dns_cache[address] = (address.match(/:/)) ? '[' + address + ']' : address;
+ lookup_queue.splice(index,1);
+ } else {
+ recheck_lookup_queue[address] != null ? recheck_lookup_queue[address]++ : recheck_lookup_queue[address] = 0;
+ }
+ }
}
);
+ }
var data = json.statistics;
diff --git a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js
new file mode 100644
index 0000000000..adcf4a4f8b
--- /dev/null
+++ b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/leds.js
@@ -0,0 +1,146 @@
+'use strict';
+'require uci';
+'require rpc';
+'require form';
+
+var callInitAction, callLeds, callUSB, callNetdevs;
+
+callInitAction = rpc.declare({
+ object: 'luci',
+ method: 'initCall',
+ params: [ 'name', 'action' ],
+ expect: { result: false }
+});
+
+callLeds = rpc.declare({
+ object: 'luci',
+ method: 'leds'
+});
+
+callUSB = rpc.declare({
+ object: 'luci',
+ method: 'usb'
+});
+
+callNetdevs = rpc.declare({
+ object: 'luci',
+ method: 'ifaddrs',
+ expect: { result: [] },
+ filter: function(res) {
+ var devs = {};
+ for (var i = 0; i < res.length; i++)
+ devs[res[i].name] = true;
+ return Object.keys(devs).sort();
+ }
+});
+
+return L.view.extend({
+ load: function() {
+ return Promise.all([
+ callLeds(),
+ callUSB(),
+ callNetdevs()
+ ]);
+ },
+
+ render: function(results) {
+ var leds = results[0],
+ usb = results[1],
+ netdevs = results[2],
+ triggers = {},
+ trigger, m, s, o;
+
+ for (var k in leds)
+ for (var i = 0; i < leds[k].triggers.length; i++)
+ triggers[leds[k].triggers[i]] = true;
+
+ m = new form.Map('system',
+ _('<abbr title="Light Emitting Diode">LED</abbr> Configuration'),
+ _('Customizes the behaviour of the device <abbr title="Light Emitting Diode">LED</abbr>s if possible.'));
+
+ s = m.section(form.TypedSection, 'led', '');
+ s.anonymous = true;
+ s.addremove = true;
+
+ s.option(form.Value, 'name', _('Name'));
+
+ o = s.option(form.ListValue, 'sysfs', _('<abbr title="Light Emitting Diode">LED</abbr> Name'));
+ Object.keys(leds).sort().forEach(function(name) { o.value(name) });
+
+ o = s.option(form.Flag, 'default', _('Default state'));
+ o.rmempty = false;
+
+ trigger = s.option(form.ListValue, 'trigger', _('Trigger'));
+ Object.keys(triggers).sort().forEach(function(t) { trigger.value(t, t.replace(/-/g, '')) });
+ trigger.value('usbdev');
+ trigger.value('usbport');
+
+ o = s.option(form.Value, 'delayon', _('On-State Delay'));
+ o.depends('trigger', 'timer');
+
+ o = s.option(form.Value, 'delayoff', _('Off-State Delay'));
+ o.depends('trigger', 'timer');
+
+ o = s.option(form.ListValue, '_net_dev', _('Device'));
+ o.rmempty = true;
+ o.ucioption = 'dev';
+ o.depends('trigger', 'netdev');
+ o.remove = function(section_id) {
+ var t = trigger.formvalue(section_id);
+ if (t != 'netdev' && t != 'usbdev')
+ uci.unset('system', section_id, 'dev');
+ };
+ o.value('');
+ netdevs.sort().forEach(function(dev) { o.value(dev) });
+
+ o = s.option(form.MultiValue, 'mode', _('Trigger Mode'));
+ o.rmempty = true;
+ o.depends('trigger', 'netdev');
+ o.value('link', _('Link On'));
+ o.value('tx', _('Transmit'));
+ o.value('rx', _('Receive'));
+
+ o = s.option(form.ListValue, '_usb_dev', _('USB Device'));
+ o.depends('trigger', 'usbdev');
+ o.rmempty = true;
+ o.ucioption = 'dev';
+ o.remove = function(section_id) {
+ var t = trigger.formvalue(section_id);
+ if (t != 'netdev' && t != 'usbdev')
+ uci.unset('system', section_id, 'dev');
+ }
+ o.value('');
+ (usb.devices || []).forEach(function(usbdev) {
+ o.value(usbdev.id, '%s (%s - %s)'.format(usbdev.id, usbdev.vendor || '?', usbdev.product || '?'));
+ });
+
+ o = s.option(form.MultiValue, 'port', _('USB Ports'));
+ o.depends('trigger', 'usbport');
+ o.rmempty = true;
+ o.cfgvalue = function(section_id) {
+ var ports = [],
+ value = uci.get('system', section_id, 'port');
+
+ if (!Array.isArray(value))
+ value = String(value || '').split(/\s+/);
+
+ for (var i = 0; i < value.length; i++)
+ if (value[i].match(/^usb(\d+)-port(\d+)$/))
+ ports.push(value[i]);
+ else if (value[i].match(/^(\d+)-(\d+)$/))
+ ports.push('usb%d-port%d'.format(Regexp.$1, Regexp.$2));
+
+ return ports;
+ };
+ (usb.ports || []).forEach(function(usbport) {
+ o.value('usb%d-port%d'.format(usbport.hub, usbport.port),
+ 'Hub %d, Port %d'.format(usbport.hub, usbport.port));
+ });
+
+ o = s.option(form.Value, 'port_mask', _('Switch Port Mask'));
+ o.depends('trigger', 'switch0');
+ o.depends('trigger', 'switch1');
+
+ return m.render();
+ }
+});
diff --git a/modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js
new file mode 100644
index 0000000000..4b833a3f83
--- /dev/null
+++ b/modules/luci-mod-system/htdocs/luci-static/resources/view/system/system.js
@@ -0,0 +1,287 @@
+'use strict';
+'require uci';
+'require rpc';
+'require form';
+
+var callInitList, callInitAction, callLocaltime, callTimezone, CBILocalTime;
+
+callInitList = rpc.declare({
+ object: 'luci',
+ method: 'initList',
+ params: [ 'name' ],
+ expect: { result: {} },
+ filter: function(res) {
+ for (var k in res)
+ return +res[k].enabled;
+ return null;
+ }
+});
+
+callInitAction = rpc.declare({
+ object: 'luci',
+ method: 'initCall',
+ params: [ 'name', 'action' ],
+ expect: { result: false }
+});
+
+callLocaltime = rpc.declare({
+ object: 'luci',
+ method: 'localtime',
+ expect: { localtime: 0 }
+});
+
+callTimezone = rpc.declare({
+ object: 'luci',
+ method: 'timezone',
+ expect: { result: {} }
+});
+
+CBILocalTime = form.DummyValue.extend({
+ renderWidget: function(section_id, option_id, cfgvalue) {
+ return E([], [
+ E('span', { 'id': 'localtime' },
+ new Date(cfgvalue * 1000).toLocaleString()),
+ ' ',
+ E('button', {
+ 'class': 'cbi-button cbi-button-apply',
+ 'click': function() {
+ this.blur();
+ this.classList.add('spinning');
+ this.disabled = true;
+ callLocaltime(Math.floor(Date.now() / 1000)).then(L.bind(function() {
+ this.classList.remove('spinning');
+ this.disabled = false;
+ }, this));
+ }
+ }, _('Sync with browser')),
+ ' ',
+ this.ntpd_support ? E('button', {
+ 'class': 'cbi-button cbi-button-apply',
+ 'click': function() {
+ this.blur();
+ this.classList.add('spinning');
+ this.disabled = true;
+ callInitAction('sysntpd', 'restart').then(L.bind(function() {
+ this.classList.remove('spinning');
+ this.disabled = false;
+ }, this));
+ }
+ }, _('Sync with NTP-Server')) : ''
+ ]);
+ },
+});
+
+return L.view.extend({
+ load: function() {
+ return Promise.all([
+ callInitList('sysntpd'),
+ callInitList('zram'),
+ callTimezone(),
+ callLocaltime(),
+ uci.load('luci'),
+ uci.load('system')
+ ]);
+ },
+
+ render: function(rpc_replies) {
+ var ntpd_support = rpc_replies[0],
+ zram_support = rpc_replies[1],
+ timezones = rpc_replies[2],
+ localtime = rpc_replies[3],
+ ntp_setup, ntp_enabled, m, s, o;
+
+ m = new form.Map('system',
+ _('System'),
+ _('Here you can configure the basic aspects of your device like its hostname or the timezone.'));
+
+ m.chain('luci');
+ m.tabbed = true;
+
+ s = m.section(form.TypedSection, 'system', _('System Properties'));
+ s.anonymous = true;
+ s.addremove = false;
+
+ s.tab('general', _('General Settings'));
+ s.tab('logging', _('Logging'));
+ s.tab('timesync', _('Time Synchronization'));
+ s.tab('language', _('Language and Style'));
+
+ /*
+ * System Properties
+ */
+
+ o = s.taboption('general', CBILocalTime, '_systime', _('Local Time'));
+ o.cfgvalue = function() { return localtime };
+ o.ntpd_support = ntpd_support;
+
+ o = s.taboption('general', form.Value, 'hostname', _('Hostname'));
+ o.datatype = 'hostname';
+
+ o = s.taboption('general', form.ListValue, 'zonename', _('Timezone'));
+ o.value('UTC');
+
+ var zones = Object.keys(timezones || {}).sort();
+ for (var i = 0; i < zones.length; i++)
+ o.value(zones[i]);
+
+ o.write = function(section_id, formvalue) {
+ var tz = timezones[formvalue] ? timezones[formvalue].tzstring : null;
+ uci.set('system', section_id, 'zonename', formvalue);
+ uci.set('system', section_id, 'timezone', tz);
+ };
+
+ /*
+ * Logging
+ */
+
+ o = s.taboption('logging', form.Value, 'log_size', _('System log buffer size'), "kiB")
+ o.optional = true
+ o.placeholder = 16
+ o.datatype = 'uinteger'
+
+ o = s.taboption('logging', form.Value, 'log_ip', _('External system log server'))
+ o.optional = true
+ o.placeholder = '0.0.0.0'
+ o.datatype = 'ip4addr'
+
+ o = s.taboption('logging', form.Value, 'log_port', _('External system log server port'))
+ o.optional = true
+ o.placeholder = 514
+ o.datatype = 'port'
+
+ o = s.taboption('logging', form.ListValue, 'log_proto', _('External system log server protocol'))
+ o.value('udp', 'UDP')
+ o.value('tcp', 'TCP')
+
+ o = s.taboption('logging', form.Value, 'log_file', _('Write system log to file'))
+ o.optional = true
+ o.placeholder = '/tmp/system.log'
+
+ o = s.taboption('logging', form.ListValue, 'conloglevel', _('Log output level'))
+ o.value(8, _('Debug'))
+ o.value(7, _('Info'))
+ o.value(6, _('Notice'))
+ o.value(5, _('Warning'))
+ o.value(4, _('Error'))
+ o.value(3, _('Critical'))
+ o.value(2, _('Alert'))
+ o.value(1, _('Emergency'))
+
+ o = s.taboption('logging', form.ListValue, 'cronloglevel', _('Cron Log Level'))
+ o.default = 8
+ o.value(5, _('Debug'))
+ o.value(8, _('Normal'))
+ o.value(9, _('Warning'))
+
+ /*
+ * Zram Properties
+ */
+
+ if (zram_support != null) {
+ s.tab('zram', _('ZRam Settings'));
+
+ o = s.taboption('zram', form.Value, 'zram_size_mb', _('ZRam Size'), _('Size of the ZRam device in megabytes'));
+ o.optional = true;
+ o.placeholder = 16;
+ o.datatype = 'uinteger';
+
+ o = s.taboption('zram', form.ListValue, 'zram_comp_algo', _('ZRam Compression Algorithm'));
+ o.optional = true;
+ o.placeholder = 'lzo';
+ o.value('lzo', 'lzo');
+ o.value('lz4', 'lz4');
+ o.value('deflate', 'deflate');
+
+ o = s.taboption('zram', form.Value, 'zram_comp_streams', _('ZRam Compression Streams'), _('Number of parallel threads used for compression'));
+ o.optional = true;
+ o.placeholder = 1;
+ o.datatype = 'uinteger';
+ }
+
+ /*
+ * Language & Style
+ */
+
+ o = s.taboption('language', form.ListValue, '_lang', _('Language'))
+ o.uciconfig = 'luci';
+ o.ucisection = 'main';
+ o.ucioption = 'lang';
+ o.value('auto');
+
+ var k = Object.keys(uci.get('luci', 'languages') || {}).sort();
+ for (var i = 0; i < k.length; i++)
+ if (k[i].charAt(0) != '.')
+ o.value(k[i], uci.get('luci', 'languages', k[i]));
+
+ o = s.taboption('language', form.ListValue, '_mediaurlbase', _('Design'))
+ o.uciconfig = 'luci';
+ o.ucisection = 'main';
+ o.ucioption = 'mediaurlbase';
+
+ var k = Object.keys(uci.get('luci', 'themes') || {}).sort();
+ for (var i = 0; i < k.length; i++)
+ if (k[i].charAt(0) != '.')
+ o.value(uci.get('luci', 'themes', k[i]), k[i]);
+
+ /*
+ * NTP
+ */
+
+ if (ntpd_support != null) {
+ var default_servers = [
+ '0.openwrt.pool.ntp.org', '1.openwrt.pool.ntp.org',
+ '2.openwrt.pool.ntp.org', '3.openwrt.pool.ntp.org'
+ ];
+
+ o = s.taboption('timesync', form.Flag, 'enabled', _('Enable NTP client'));
+ o.rmempty = false;
+ o.ucisection = 'ntp';
+ o.default = o.disabled;
+ o.write = function(section_id, value) {
+ ntpd_support = +value;
+
+ if (ntpd_support && !uci.get('system', 'ntp')) {
+ uci.add('system', 'timeserver', 'ntp');
+ uci.set('system', 'ntp', 'server', default_servers);
+ }
+
+ if (!ntpd_support)
+ uci.set('system', 'ntp', 'enabled', 0);
+ else
+ uci.unset('system', 'ntp', 'enabled');
+
+ return callInitAction('sysntpd', 'enable');
+ };
+ o.load = function(section_id) {
+ return (ntpd_support == 1 &&
+ uci.get('system', 'ntp') != null &&
+ uci.get('system', 'ntp', 'enabled') != 0) ? '1' : '0';
+ };
+
+ o = s.taboption('timesync', form.Flag, 'enable_server', _('Provide NTP server'));
+ o.ucisection = 'ntp';
+ o.depends('enabled', '1');
+
+ o = s.taboption('timesync', form.DynamicList, 'server', _('NTP server candidates'));
+ o.datatype = 'host(0)';
+ o.ucisection = 'ntp';
+ o.depends('enabled', '1');
+ o.remove = function() {}; // retain server list even if disabled
+ o.load = function(section_id) {
+ return uci.get('system', 'ntp')
+ ? uci.get('system', 'ntp', 'server')
+ : default_servers;
+ };
+ }
+
+ return m.render().then(function(mapEl) {
+ L.Poll.add(function() {
+ return callLocaltime().then(function(t) {
+ mapEl.querySelector('#localtime').innerHTML = new Date(t * 1000).toLocaleString();
+ });
+ });
+
+ return mapEl;
+ });
+ }
+});
diff --git a/modules/luci-mod-system/luasrc/controller/admin/system.lua b/modules/luci-mod-system/luasrc/controller/admin/system.lua
index 49d4476c4e..d73a1cbdb4 100644
--- a/modules/luci-mod-system/luasrc/controller/admin/system.lua
+++ b/modules/luci-mod-system/luasrc/controller/admin/system.lua
@@ -7,7 +7,7 @@ module("luci.controller.admin.system", package.seeall)
function index()
local fs = require "nixio.fs"
- entry({"admin", "system", "system"}, cbi("admin_system/system"), _("System"), 1)
+ entry({"admin", "system", "system"}, view("system/system"), _("System"), 1)
entry({"admin", "system", "clock_status"}, post_on({ set = true }, "action_clock_status"))
entry({"admin", "system", "ntp_restart"}, call("action_ntp_restart"), nil).leaf = true
@@ -32,7 +32,7 @@ function index()
local nodes, number = fs.glob("/sys/class/leds/*")
if number > 0 then
- entry({"admin", "system", "leds"}, cbi("admin_system/leds"), _("<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"), 60)
+ entry({"admin", "system", "leds"}, view("system/leds"), _("<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"), 60)
end
entry({"admin", "system", "flashops"}, call("action_flashops"), _("Backup / Flash Firmware"), 70)
diff --git a/modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua b/modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua
deleted file mode 100644
index 312e74249a..0000000000
--- a/modules/luci-mod-system/luasrc/model/cbi/admin_system/leds.lua
+++ /dev/null
@@ -1,188 +0,0 @@
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Licensed to the public under the Apache License 2.0.
-
-m = Map("system", translate("<abbr title=\"Light Emitting Diode\">LED</abbr> Configuration"), translate("Customizes the behaviour of the device <abbr title=\"Light Emitting Diode\">LED</abbr>s if possible."))
-
-local sysfs_path = "/sys/class/leds/"
-local leds = {}
-
-local fs = require "nixio.fs"
-local nu = require "nixio.util"
-local util = require "luci.util"
-
-if fs.access(sysfs_path) then
- leds = nu.consume((fs.dir(sysfs_path)))
-end
-
-if #leds == 0 then
- return m
-end
-
-
-s = m:section(TypedSection, "led", "")
-s.anonymous = true
-s.addremove = true
-
-function s.parse(self, ...)
- TypedSection.parse(self, ...)
- os.execute("/etc/init.d/led enable")
-end
-
-
-s:option(Value, "name", translate("Name"))
-
-
-sysfs = s:option(ListValue, "sysfs", translate("<abbr title=\"Light Emitting Diode\">LED</abbr> Name"))
-for k, v in ipairs(leds) do
- sysfs:value(v)
-end
-
-s:option(Flag, "default", translate("Default state")).rmempty = false
-
-
-trigger = s:option(ListValue, "trigger", translate("Trigger"))
-
-local triggers = fs.readfile(sysfs_path .. leds[1] .. "/trigger")
-for t in triggers:gmatch("[%w-]+") do
- if t == "default-on" then
- trigger:value(t, translatef("Always on (%s)", t))
- elseif t == "none" then
- trigger:value(t, translatef("Always off (%s)", t))
- elseif t == "timer" then
- trigger:value(t, translatef("Custom flash intervall (%s)", t))
- elseif t == "netdev" then
- trigger:value(t, translatef("Network device activity (%s)", t))
- elseif t == "heartbeat" then
- trigger:value(t, translatef("Heartbeat intervall (%s)", t))
- elseif t == "nand-disk" then
- trigger:value(t, translatef("Flashmemory write access (%s)", t))
- elseif t == "mtd" then
- trigger:value(t, translatef("Flashmemory write access (%s)", t))
- elseif t:match("mmc[0-9]") then
- trigger:value(t, translatef("Flashmemory write access (%s)", t))
- elseif t:match("switch[0-9]") then
- trigger:value(t, translatef("Switchport activity (%s)", t))
- elseif t:match("phy[0-9]rx") then
- trigger:value(t, translatef("Wi-Fi data reception (%s)", t))
- elseif t:match("phy[0-9]tx") then
- trigger:value(t, translatef("Wi-Fi data transmission (%s)", t))
- elseif t:match("phy[0-9]assoc") then
- trigger:value(t, translatef("Wi-Fi client association (%s)", t))
- elseif t:match("phy[0-9]radio") then
- trigger:value(t, translatef("Wi-Fi on (%s)", t))
- elseif t:match("phy[0-9]tpt") then
- trigger:value(t, translatef("Wi-Fi activity (%s)", t))
- else
- trigger:value(t, translate(t:gsub("-", "")))
- end
-end
-
-
-delayon = s:option(Value, "delayon", translate ("On-State Delay"))
-delayon:depends("trigger", "timer")
-
-delayoff = s:option(Value, "delayoff", translate ("Off-State Delay"))
-delayoff:depends("trigger", "timer")
-
-
-dev = s:option(Value, "_net_dev", translate("Device"))
-dev.rmempty = true
-dev:value("")
-dev:depends("trigger", "netdev")
-
-function dev.cfgvalue(self, section)
- return m.uci:get("system", section, "dev")
-end
-
-function dev.write(self, section, value)
- m.uci:set("system", section, "dev", value)
-end
-
-function dev.remove(self, section)
- local t = trigger:formvalue(section)
- if t ~= "netdev" and t ~= "usbdev" then
- m.uci:delete("system", section, "dev")
- end
-end
-
-for k, v in pairs(luci.sys.net.devices()) do
- if v ~= "lo" then
- dev:value(v)
- end
-end
-
-
-mode = s:option(MultiValue, "mode", translate("Trigger Mode"))
-mode.rmempty = true
-mode:depends("trigger", "netdev")
-mode:value("link", translate("Link On"))
-mode:value("tx", translate("Transmit"))
-mode:value("rx", translate("Receive"))
-
-
-usbdev = s:option(ListValue, "_usb_dev", translate("USB Device"))
-usbdev:depends("trigger", "usbdev")
-usbdev.rmempty = true
-usbdev:value("")
-
-function usbdev.cfgvalue(self, section)
- return m.uci:get("system", section, "dev")
-end
-
-function usbdev.write(self, section, value)
- m.uci:set("system", section, "dev", value)
-end
-
-function usbdev.remove(self, section)
- local t = trigger:formvalue(section)
- if t ~= "netdev" and t ~= "usbdev" then
- m.uci:delete("system", section, "dev")
- end
-end
-
-
-usbport = s:option(MultiValue, "port", translate("USB Ports"))
-usbport:depends("trigger", "usbport")
-usbport.rmempty = true
-usbport.widget = "checkbox"
-usbport.cast = "table"
-usbport.size = 1
-
-function usbport.valuelist(self, section)
- local port, ports = nil, {}
- for port in util.imatch(m.uci:get("system", section, "port")) do
- local b, n = port:match("^usb(%d+)-port(%d+)$")
- if not (b and n) then
- b, n = port:match("^(%d+)-(%d+)$")
- end
- if b and n then
- ports[#ports+1] = "usb%u-port%u" %{ tonumber(b), tonumber(n) }
- end
- end
- return ports
-end
-
-function usbport.validate(self, value)
- return type(value) == "string" and { value } or value
-end
-
-
-for p in nixio.fs.glob("/sys/bus/usb/devices/[0-9]*/manufacturer") do
- local id = p:match("%d+-%d+")
- local mf = nixio.fs.readfile("/sys/bus/usb/devices/" .. id .. "/manufacturer") or "?"
- local pr = nixio.fs.readfile("/sys/bus/usb/devices/" .. id .. "/product") or "?"
- usbdev:value(id, "%s (%s - %s)" %{ id, mf, pr })
-end
-
-for p in nixio.fs.glob("/sys/bus/usb/devices/*/usb[0-9]*-port[0-9]*") do
- local bus, port = p:match("usb(%d+)-port(%d+)")
- if bus and port then
- usbport:value("usb%u-port%u" %{ tonumber(bus), tonumber(port) },
- "Hub %u, Port %u" %{ tonumber(bus), tonumber(port) })
- end
-end
-
-port_mask = s:option(Value, "port_mask", translate ("Switch Port Mask"))
-port_mask:depends("trigger", "switch0")
-
-return m
diff --git a/modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua b/modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua
deleted file mode 100644
index 33ec027e0d..0000000000
--- a/modules/luci-mod-system/luasrc/model/cbi/admin_system/system.lua
+++ /dev/null
@@ -1,271 +0,0 @@
--- Copyright 2008 Steven Barth <steven@midlink.org>
--- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
--- Licensed to the public under the Apache License 2.0.
-
-local sys = require "luci.sys"
-local zones = require "luci.sys.zoneinfo"
-local fs = require "nixio.fs"
-local conf = require "luci.config"
-
-local m, s, o
-local has_ntpd = fs.access("/usr/sbin/ntpd")
-local has_zram = fs.access("/etc/init.d/zram")
-
-m = Map("system", translate("System"), translate("Here you can configure the basic aspects of your device like its hostname or the timezone."))
-m:chain("luci")
-
-
-s = m:section(TypedSection, "system", translate("System Properties"))
-s.anonymous = true
-s.addremove = false
-
-s:tab("general", translate("General Settings"))
-s:tab("logging", translate("Logging"))
-s:tab("language", translate("Language and Style"))
-s:tab("advanced", translate("Advanced"))
-if has_zram then s:tab("zram", translate("ZRam Settings")) end
-
---
--- System Properties
---
-
-o = s:taboption("general", DummyValue, "_systime", translate("Local Time"))
-o.template = "admin_system/clock_status"
-
-
-o = s:taboption("general", Value, "hostname", translate("Hostname"))
-o.datatype = "hostname"
-
-function o.write(self, section, value)
- Value.write(self, section, value)
- sys.hostname(value)
-end
-
-
-o = s:taboption("general", ListValue, "zonename", translate("Timezone"))
-o:value("UTC")
-
-for i, zone in ipairs(zones.TZ) do
- o:value(zone[1])
-end
-
-function o.write(self, section, value)
- local function lookup_zone(title)
- for _, zone in ipairs(zones.TZ) do
- if zone[1] == title then return zone[2] end
- end
- end
-
- AbstractValue.write(self, section, value)
- local timezone = lookup_zone(value) or "GMT0"
- self.map.uci:set("system", section, "timezone", timezone)
- fs.writefile("/etc/TZ", timezone .. "\n")
-end
-
-
---
--- Logging
---
-
-o = s:taboption("logging", Value, "log_size", translate("System log buffer size"), translate("KiB"))
-o.optional = true
-o.placeholder = 16
-o.datatype = "uinteger"
-
-o = s:taboption("logging", Value, "log_ip", translate("External system log server"))
-o.optional = true
-o.placeholder = "0.0.0.0"
-o.datatype = "ip4addr"
-
-o = s:taboption("logging", Value, "log_port", translate("External system log server port"))
-o.optional = true
-o.placeholder = 514
-o.datatype = "port"
-
-o = s:taboption("logging", ListValue, "log_proto", translate("External system log server protocol"))
-o:value("udp", "UDP")
-o:value("tcp", "TCP")
-
-o = s:taboption("logging", Value, "log_file", translate("Write system log to file"))
-o.optional = true
-o.placeholder = "/tmp/system.log"
-
-o = s:taboption("logging", ListValue, "conloglevel", translate("Log output level"))
-o:value(8, translate("Debug"))
-o:value(7, translate("Info"))
-o:value(6, translate("Notice"))
-o:value(5, translate("Warning"))
-o:value(4, translate("Error"))
-o:value(3, translate("Critical"))
-o:value(2, translate("Alert"))
-o:value(1, translate("Emergency"))
-
-o = s:taboption("logging", ListValue, "cronloglevel", translate("Cron Log Level"))
-o.default = 8
-o:value(5, translate("Debug"))
-o:value(8, translate("Normal"))
-o:value(9, translate("Warning"))
-
-
---
--- Zram Properties
---
-if has_zram then
- o = s:taboption("zram", Value, "zram_size_mb", translate("ZRam Size"), translate("Size of the ZRam device in megabytes"))
- o.optional = true
- o.placeholder = 16
- o.datatype = "uinteger"
-
- o = s:taboption("zram", ListValue, "zram_comp_algo", translate("ZRam Compression Algorithm"))
- o.optional = true
- o.placeholder = lzo
- o:value("lzo", "lzo")
- o:value("lz4", "lz4")
- o:value("deflate", "deflate")
-
- o = s:taboption("zram", Value, "zram_comp_streams", translate("ZRam Compression Streams"), translate("Number of parallel threads used for compression"))
- o.optional = true
- o.placeholder = 1
- o.datatype = "uinteger"
-end
-
-
---
--- Language & Style
---
-
-o = s:taboption("language", ListValue, "_lang", translate("Language"))
-o:value("auto")
-
-local i18ndir = luci.i18n.i18ndir .. "base."
-for k, v in luci.util.kspairs(conf.languages) do
- local file = i18ndir .. k:gsub("_", "-")
- if k:sub(1, 1) ~= "." and fs.access(file .. ".lmo") then
- o:value(k, v)
- end
-end
-
-function o.cfgvalue(...)
- return m.uci:get("luci", "main", "lang")
-end
-
-function o.write(self, section, value)
- m.uci:set("luci", "main", "lang", value)
-end
-
-
-o = s:taboption("language", ListValue, "_mediaurlbase", translate("Theme"))
-for k, v in pairs(conf.themes) do
- if k:sub(1, 1) ~= "." then
- o:value(v, k)
- end
-end
-
-function o.cfgvalue(...)
- return m.uci:get("luci", "main", "mediaurlbase")
-end
-
-function o.write(self, section, value)
- m.uci:set("luci", "main", "mediaurlbase", value)
-end
-
-
---
--- Advanced
---
-
-o = s:taboption("advanced", Value, "_pollinterval",
- translate("Polling interval"),
- translate("Polling interval for status queries in seconds"))
-o.datatype = "range(3, 20)"
-o.default = 5
-o:value("3")
-o:value("5")
-o:value("10")
-
-function o.cfgvalue(...)
- return m.uci:get("luci", "main", "pollinterval")
-end
-
-function o.write(self, section, value)
- m.uci:set("luci", "main", "pollinterval", value)
-end
-
-
---
--- NTP
---
-
-if has_ntpd then
-
- -- timeserver setup was requested, create section and reload page
- if m:formvalue("cbid.system._timeserver._enable") then
- m.uci:section("system", "timeserver", "ntp",
- {
- server = { "0.openwrt.pool.ntp.org", "1.openwrt.pool.ntp.org", "2.openwrt.pool.ntp.org", "3.openwrt.pool.ntp.org" }
- }
- )
-
- m.uci:save("system")
- luci.http.redirect(luci.dispatcher.build_url("admin/system", arg[1]))
- return
- end
-
- local has_section = false
- m.uci:foreach("system", "timeserver",
- function(s)
- has_section = true
- return false
- end)
-
- if not has_section then
-
- s = m:section(TypedSection, "timeserver", translate("Time Synchronization"))
- s.anonymous = true
- s.cfgsections = function() return { "_timeserver" } end
-
- x = s:option(Button, "_enable")
- x.title = translate("Time Synchronization is not configured yet.")
- x.inputtitle = translate("Set up Time Synchronization")
- x.inputstyle = "apply"
-
- else
-
- s = m:section(TypedSection, "timeserver", translate("Time Synchronization"))
- s.anonymous = true
- s.addremove = false
-
- o = s:option(Flag, "enable", translate("Enable NTP client"))
- o.rmempty = false
-
- function o.cfgvalue(self)
- return sys.init.enabled("sysntpd")
- and self.enabled or self.disabled
- end
-
- function o.write(self, section, value)
- if value == self.enabled then
- sys.init.enable("sysntpd")
- sys.call("env -i /etc/init.d/sysntpd start >/dev/null")
- else
- sys.call("env -i /etc/init.d/sysntpd stop >/dev/null")
- sys.init.disable("sysntpd")
- end
- end
-
-
- o = s:option(Flag, "enable_server", translate("Provide NTP server"))
- o:depends("enable", "1")
-
-
- o = s:option(DynamicList, "server", translate("NTP server candidates"))
- o.datatype = "host(0)"
- o:depends("enable", "1")
-
- -- retain server list even if disabled
- function o.remove() end
-
- end
-end
-
-return m
diff --git a/modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm b/modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm
deleted file mode 100644
index 796aa695c6..0000000000
--- a/modules/luci-mod-system/luasrc/view/admin_system/clock_status.htm
+++ /dev/null
@@ -1,56 +0,0 @@
-<%+cbi/valueheader%>
-
-<script type="text/javascript">//<![CDATA[
- XHR.poll(-1, '<%=url('admin/system/clock_status')%>', null,
- function(x, rv)
- {
- var s = document.getElementById('<%=self.option%>-clock-status');
- if (s)
- {
- s.innerHTML = rv.timestring || '?';
- }
- }
- );
-
- function sync_clock(btn)
- {
- btn.disabled = true;
- btn.value = '<%:Synchronizing...%>';
-
- (new XHR()).post('<%=url('admin/system/clock_status')%>',
- { token: '<%=token%>', set: Math.floor((new Date()).getTime() / 1000) },
- function()
- {
- btn.disabled = false;
- btn.value = '<%:Sync with browser%>';
- }
- );
-
- return false;
- }
-
- function btn_action(action)
- {
- if (action.name === "do_ntp_restart")
- {
- new XHR.get('<%=luci.dispatcher.build_url("admin", "system", "ntp_restart")%>', null,
- function(x)
- {
- if (!x)
- {
- return;
- }
- });
- }
- }
-
-//]]></script>
-
-<span id="<%=self.option%>-clock-status"><em><%:Collecting data...%></em></span>
-<input type="button" class="cbi-button cbi-button-apply" value="<%:Sync with browser%>" onclick="return sync_clock(this)" />
-
-<% if require("nixio.fs").access("/etc/init.d/sysntpd") then %>
-<input type="button" class="cbi-button cbi-button-apply" name="do_ntp_restart" value="<%:Sync with NTP-Server%>" onclick="btn_action(this)" />
-<% end %>
-
-<%+cbi/valuefooter%>