🐶 Sync 2026-09-17 00:01:35

This commit is contained in:
github-actions[bot] committed 2026-09-17 00:01:35 +08:00
1 parent d0c748add2
commit 6c6ea07309
106 files changed
+7551 -5770

No files matched your search

+2 -2
View File
@@ -5,8 +5,8 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=hysteria PKG_NAME:=hysteria
PKG_VERSION:=2.12.2 PKG_VERSION:=2.12.3
PKG_RELEASE:=16 PKG_RELEASE:=17
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/apernet/hysteria/tar.gz/app/v$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/apernet/hysteria/tar.gz/app/v$(PKG_VERSION)?
@@ -208,6 +208,7 @@ const outbound_type = [
['wireguard', _('WireGuard') + ' - ' + _('UDP')], // Endpoint ['wireguard', _('WireGuard') + ' - ' + _('UDP')], // Endpoint
['tailscale', _('Tailscale') + ' - ' + _('UDP')], // Endpoint ['tailscale', _('Tailscale') + ' - ' + _('UDP')], // Endpoint
['masque', _('Masque') + ' - ' + _('UDP')], // Endpoint // https://blog.cloudflare.com/post-quantum-warp/ ['masque', _('Masque') + ' - ' + _('UDP')], // Endpoint // https://blog.cloudflare.com/post-quantum-warp/
['easytier', _('EasyTier') + ' - ' + _('TCP/UDP')], // Endpoint
['ssh', _('SSH') + ' - ' + _('TCP')] ['ssh', _('SSH') + ' - ' + _('TCP')]
]; ];
@@ -1634,6 +1635,28 @@ function renderResDownload(section_id) {
return El; return El;
} }
function renderResLink(section_id) {
const section_type = this.section.sectiontype;
const type = uci.get(this.config, section_id, 'type');
let El = E([
E('span', {
title: this.readonly ? this.readonly : null
}, [
E('button', {
class: 'cbi-button cbi-button-apply',
disabled: (this.readonly !== false || type === 'inline') || null,
click: ui.createHandlerFn(this, (section_type, section_id) => {
let path = encodeURIComponent(`${HM_DIR.replace(/^\//, '')}/${section_type}`);
return window.open(`${window.location.origin}/tinyfilemanager/index.php?p=${path}&view=${section_id}`, '_blank', 'noopener');
}, section_type, section_id)
}, [ _('🔗') ])
])
]);
return El;
}
function handleGenKey(option) { function handleGenKey(option) {
const section_id = this.section.section; const section_id = this.section.section;
const type = this.section.getOption('type')?.formvalue(section_id); const type = this.section.getOption('type')?.formvalue(section_id);
@@ -2181,6 +2204,7 @@ return baseclass.extend({
updateStatus, updateStatus,
getDashURL, getDashURL,
renderResDownload, renderResDownload,
renderResLink,
handleGenKey, handleGenKey,
handleReload, handleReload,
handleRemoveIdles, handleRemoveIdles,
@@ -517,6 +517,7 @@ return view.extend({
so.value('gvisor', _('gVisor'), _('Based on google/gvisor.')); so.value('gvisor', _('gVisor'), _('Based on google/gvisor.'));
so.value('mixed', _('Mixed'), _('Mixed <code>system</code> TCP stack and <code>gVisor</code> UDP stack.')); so.value('mixed', _('Mixed'), _('Mixed <code>system</code> TCP stack and <code>gVisor</code> UDP stack.'));
} }
so.value('mips', _('mihomo IP stack (MIPS)'));
so.default = 'system'; so.default = 'system';
so.rmempty = false; so.rmempty = false;
@@ -207,11 +207,14 @@ class VlessEncryptionClient {
return view.extend({ return view.extend({
load() { load() {
return Promise.all([ return Promise.all([
uci.load('fchomo') uci.load('fchomo'),
hm.getFeatures()
]); ]);
}, },
render(data) { render(data) {
const features = data[1];
let m, s, o, ss, so; let m, s, o, ss, so;
m = new form.Map('fchomo', _('Edit outbound')); m = new form.Map('fchomo', _('Edit outbound'));
@@ -274,12 +277,12 @@ return view.extend({
so = ss.taboption('field_general', form.Value, 'server', _('Server address')); so = ss.taboption('field_general', form.Value, 'server', _('Server address'));
so.datatype = 'host'; so.datatype = 'host';
so.rmempty = false; so.rmempty = false;
so.depends({type: /^(rematch|direct|zerotier|tailscale)$/, '!reverse': true}); so.depends({type: /^(rematch|direct|zerotier|tailscale|easytier)$/, '!reverse': true});
so = ss.taboption('field_general', form.Value, 'port', _('Port')); so = ss.taboption('field_general', form.Value, 'port', _('Port'));
so.datatype = 'port'; so.datatype = 'port';
so.rmempty = false; so.rmempty = false;
so.depends({type: /^(rematch|direct|mieru|zerotier|tailscale)$/, '!reverse': true}); so.depends({type: /^(rematch|direct|mieru|zerotier|tailscale|easytier)$/, '!reverse': true});
/* Rematch fields */ /* Rematch fields */
// https://github.com/MetaCubeX/mihomo/pull/2862 // https://github.com/MetaCubeX/mihomo/pull/2862
@@ -856,6 +859,12 @@ return view.extend({
so.depends('type', 'zerotier'); so.depends('type', 'zerotier');
so.modalonly = true; so.modalonly = true;
so = ss.taboption('field_general', form.TextValue, 'zerotier_identity_secret', 'identity.secret',
_('Used to replace the contents of default %s.').format('<code>identity.secret</code> file'));
so.placeholder = '0123456789:0:public-key:private-key';
so.depends('type', 'zerotier');
so.modalonly = true;
so = ss.taboption('field_general', form.TextValue, 'zerotier_planet_file', 'Planet file', so = ss.taboption('field_general', form.TextValue, 'zerotier_planet_file', 'Planet file',
_('Used to replace the built-in official %s.').format('<code>Earth</code> Planet file')); _('Used to replace the built-in official %s.').format('<code>Earth</code> Planet file'));
so.placeholder = _('Add the base64 text of the planet file here.'); so.placeholder = _('Add the base64 text of the planet file here.');
@@ -1024,6 +1033,149 @@ return view.extend({
so.depends('type', 'masque'); so.depends('type', 'masque');
so.modalonly = true; so.modalonly = true;
/* EasyTier fields */
so = ss.taboption('field_general', form.DummyValue, '_easytier_doc', null);
so.load = function() {
return '<a target="_blank" href="%s" rel="noreferrer noopener">%s</a>'
.format('https://easytier.cn/guide/introduction.html', _('Configuration Document'));
}
so.rawhtml = true;
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.Value, 'easytier_network_name', _('Network name'));
so.rmempty = false;
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.Value, 'easytier_network_secret', _('Network secret'));
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.Flag, 'easytier_private_mode', _('Private network'),
_('Only nodes using the same %s and %s as this network are permitted to perform a handshake or relay traffic through this node.')
.format(_('Network name'), _('Network secret')));
so.default = so.disabled;
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.Value, 'easytier_hostname', _('Hostname'));
so.datatype = 'hostname';
so.placeholder = 'mihomo';
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.DynamicList, 'easytier_peers', _('Peers'));
so.placeholder = 'tcp://192.0.2.10:11010';
so.validate = hm.validateUrl;
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.Flag, 'easytier_secure_mode', _('Secure Mode'));
so.default = so.disabled;
so.validate = function(section_id, value) {
const secure_mode = this.getUIElement(section_id).node.querySelector('input');
const peers = this.section.getOption('easytier_peers').formvalue(section_id);
const local_private_key = this.section.getOption('easytier_local_private_key').formvalue(section_id);
const local_public_key = this.section.getOption('easytier_local_public_key').formvalue(section_id);
// Force enabled
if ((local_private_key && local_public_key) || peers.filter(e => new URL(e).searchParams.get('peer-public-key')).length > 0) {
secure_mode.checked = true;
secure_mode.disabled = true;
} else
secure_mode.removeAttribute('disabled');
return true;
}
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', hm.GenValue, 'easytier_local_private_key', _('Client private key'),
_('Base64 encoded X25519 private key.'));
so.hm_options = {
type: 'wg-keypair',
callback: function(result) {
return [
[this.option, result.private_key],
['easytier_local_public_key', result.public_key]
]
}
}
so.password = true;
so.validate = L.bind(hm.validateBase64Key, so, 44);
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', hm.CopyValue, 'easytier_local_public_key', _('Client public key'),
_('Base64 encoded X25519 public key.'));
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.DynamicList, 'easytier_exit_nodes', _('Exit nodes'),
_('List of exit nodes to use (%s of peer nodes).').format(_('Virtual IPv4 address')) + '</br>' +
_('Used to forward traffic to the specified nodes for external access.'));
so.datatype = 'ip4addr(1)';
so.placeholder = '10.144.0.1';
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.DynamicList, 'easytier_proxy_networks', _('Subnet proxy'),
_('List of local subnets (CIDR) to be open to other peers in the EasyTier network.'));
so.datatype = 'cidr4';
so.placeholder = '10.0.0.0/24';
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.Flag, 'easytier_enable_encryption', _('Enable encryption'));
so.default = so.enabled;
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.ListValue, 'easytier_encryption_algorithm', _('Encryption algorithm'));
so.value('', _('Keep default'));
so.value('xor', _('xor'));
so.value('chacha20', _('chacha20'));
so.value('aes-gcm', _('aes-gcm'));
so.value('aes-gcm-256', _('aes-gcm-256'));
so.value('openssl-aes128-gcm', _('openssl-aes128-gcm'));
so.value('openssl-aes256-gcm', _('openssl-aes256-gcm'));
so.value('openssl-chacha20', _('openssl-chacha20'));
so.depends('easytier_enable_encryption', '1');
so.modalonly = true;
so = ss.taboption('field_general', form.Flag, 'easytier_enable_exit_node', _('As exit node'),
_('Allow this node to be an exit node.'));
so.default = so.disabled;
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.Flag, 'easytier_latency_first', _('Latency first'),
_('Ignore the number of intermediate hops and select the path with the lowest total latency.'));
so.default = so.disabled;
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.Flag, 'easytier_disable_p2p', _('Disable P2P'),
_('After disabling, communication will only be possible via relay.'));
so.default = so.disabled;
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.Flag, 'easytier_accept_dns', _('Enable MagicDNS'),
_('Whether to accept DNS configurations distributed by the network.'));
so.default = so.disabled;
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_general', form.Value, 'easytier_tld_dns_zone', _('TLD DNS zone'),
_('TLD DNS zone used by MagicDNS, default is %s.').format('<code>et.net.</code>') + '</br>' +
_('You can add %s in the %s to resolve A/PTR records within the virtual network.').format('<code>et://proxy-name</code>', _('DNS server')) + '</br>' +
_('Using this in conjunction with %s is recommended.').format(_('DNS policy')));
so.placeholder = 'et.net.';
so.depends('easytier_accept_dns', '1');
so.modalonly = true;
/* SSH fields */ /* SSH fields */
so = ss.taboption('field_general', form.TextValue, 'ssh_priv_key', _('Priv-key')); so = ss.taboption('field_general', form.TextValue, 'ssh_priv_key', _('Priv-key'));
so.depends('type', 'ssh'); so.depends('type', 'ssh');
@@ -1094,9 +1246,9 @@ return view.extend({
so.depends({type: /^(hysteria2|openvpn|masque)$/}); so.depends({type: /^(hysteria2|openvpn|masque)$/});
so.modalonly = true; so.modalonly = true;
so = ss.taboption('field_general', form.Flag, 'udp', _('UDP')); so = ss.taboption('field_general', form.Flag, 'udp', _('Force UDP'));
so.default = so.disabled; so.default = so.disabled;
so.depends({type: /^(rematch|direct|socks5|ss|mieru|vmess|vless|trojan|anytls|trusttunnel|zerotier|wireguard|tailscale|masque)$/}); so.depends({type: /^(rematch|direct|socks5|ss|mieru|vmess|vless|trojan|anytls|trusttunnel|zerotier|wireguard|tailscale|masque|easytier)$/});
so.depends({type: 'snell', snell_version: /^(3|4|5)$/}); so.depends({type: 'snell', snell_version: /^(3|4|5)$/});
so.modalonly = true; so.modalonly = true;
@@ -1501,49 +1653,77 @@ return view.extend({
_('Auto configure firewall')); _('Auto configure firewall'));
so.default = so.enabled; so.default = so.enabled;
so.validate = function(section_id, value) { so.validate = function(section_id, value) {
const primary_port = this.section.getOption('zerotier_primary_port').formvalue(section_id); const type = this.section.getOption('type').formvalue(section_id);
const secondary_port = this.section.getOption('zerotier_secondary_port').formvalue(section_id);
const auto_firewall = this.getUIElement(section_id).node.querySelector('input'); const auto_firewall = this.getUIElement(section_id).node.querySelector('input');
// Force disabled switch (type) {
if ((!primary_port || primary_port <= 0) && (!secondary_port || secondary_port <= 0)) { case 'zerotier':
auto_firewall.checked = false; const primary_port = this.section.getOption('zerotier_primary_port').formvalue(section_id);
auto_firewall.disabled = true; const secondary_port = this.section.getOption('zerotier_secondary_port').formvalue(section_id);
} else
auto_firewall.removeAttribute('disabled'); // Force disabled
if ((!primary_port || primary_port <= 0) && (!secondary_port || secondary_port <= 0)) {
auto_firewall.checked = false;
auto_firewall.disabled = true;
} else
auto_firewall.removeAttribute('disabled');
break;
case 'easytier':
const no_listeners = this.section.getOption('endpoint_no_listener').formvalue(section_id);
const listeners = this.section.getOption('endpoint_listeners').formvalue(section_id);
// Force disabled
if (no_listeners === '1' || listeners.filter(Boolean).length == 0) {
auto_firewall.checked = false;
auto_firewall.disabled = true;
} else
auto_firewall.removeAttribute('disabled');
break;
}
return true; return true;
} }
so.depends('type', 'zerotier'); so.depends({type: /^(zerotier|easytier)$/});
so.modalonly = true; so.modalonly = true;
const zerotier_listen_port = {
load(section_id) {
const listen_port = this.map.data.get(this.section.config, section_id, 'zerotier_listen_port') || '';
const value = [
this.map.data.get(this.section.config, section_id, 'zerotier_primary_port'),
this.map.data.get(this.section.config, section_id, 'zerotier_secondary_port')
].filter(Boolean).join(',');
if (listen_port != value) {
uci.set(this.section.config, section_id, 'zerotier_listen_port', value);
return uci.save()
.then(L.bind(this.map.load, this.map))
.then(L.bind(this.map.reset, this.map))
.catch(() => {});
}
return form.Value.prototype.load.apply(this, arguments);
},
write(section_id, formvalue) {
const value = [
this.section.getOption('zerotier_primary_port').formvalue(section_id),
this.section.getOption('zerotier_secondary_port').formvalue(section_id)
].filter(Boolean).join(',');
uci.set(this.section.config, section_id, 'zerotier_listen_port', value);
return form.Value.prototype[formvalue ? 'write' : 'remove'].apply(this, arguments);
}
};
so = ss.taboption('field_vpn', form.Value, 'zerotier_primary_port', _('Listen port') + ' (%s)'.format(_('Primary')), so = ss.taboption('field_vpn', form.Value, 'zerotier_primary_port', _('Listen port') + ' (%s)'.format(_('Primary')),
_('%s UDP port. <code>0</code> selects an available port.').format(_('Primary'))); _('%s UDP port. <code>0</code> selects an available port.').format(_('Primary')));
so.datatype = 'port'; so.datatype = 'port';
so.placeholder = '9993'; so.placeholder = '9993';
so.load = function(section_id) { so.load = zerotier_listen_port.load;
const listen_port = this.map.data.get(this.section.config, section_id, 'zerotier_listen_port'); so.write = zerotier_listen_port.write;
const value = [ so.remove = zerotier_listen_port.write;
this.map.data.get(this.section.config, section_id, 'zerotier_primary_port'),
this.map.data.get(this.section.config, section_id, 'zerotier_secondary_port')
].filter(Boolean).join(',');
if (listen_port !== value) {
uci.set(this.section.config, section_id, 'zerotier_listen_port', value);
uci.save();
}
return form.Value.prototype.load.apply(this, arguments);
}
so.write = function(section_id, formvalue) {
uci.set(this.section.config, section_id, 'zerotier_listen_port', [
this.section.getOption('zerotier_primary_port').formvalue(section_id),
this.section.getOption('zerotier_secondary_port').formvalue(section_id)
].filter(Boolean).join(','));
return form.Value.prototype[formvalue ? 'write' : 'remove'].apply(this, arguments);
}
so.remove = so.write;
so.depends('type', 'zerotier'); so.depends('type', 'zerotier');
so.modalonly = true; so.modalonly = true;
@@ -1552,32 +1732,62 @@ return view.extend({
_('<code>-1</code> disables it.')); _('<code>-1</code> disables it.'));
so.datatype = 'or(port, -1)'; so.datatype = 'or(port, -1)';
so.placeholder = '0'; so.placeholder = '0';
so.load = function(section_id) { so.load = zerotier_listen_port.load;
const listen_port = this.map.data.get(this.section.config, section_id, 'zerotier_listen_port'); so.write = zerotier_listen_port.write;
const value = [ so.remove = zerotier_listen_port.write;
this.map.data.get(this.section.config, section_id, 'zerotier_primary_port'),
this.map.data.get(this.section.config, section_id, 'zerotier_secondary_port')
].filter(Boolean).join(',');
if (listen_port !== value) {
uci.set(this.section.config, section_id, 'zerotier_listen_port', value);
uci.save();
}
return form.Value.prototype.load.apply(this, arguments);
}
so.write = function(section_id, formvalue) {
uci.set(this.section.config, section_id, 'zerotier_listen_port', [
this.section.getOption('zerotier_primary_port').formvalue(section_id),
this.section.getOption('zerotier_secondary_port').formvalue(section_id)
].filter(Boolean).join(','));
return form.Value.prototype[formvalue ? 'write' : 'remove'].apply(this, arguments);
}
so.remove = so.write;
so.depends('type', 'zerotier'); so.depends('type', 'zerotier');
so.modalonly = true; so.modalonly = true;
const easytier_listen_port = {
load(section_id) {
const listen_port = this.map.data.get(this.section.config, section_id, 'easytier_listen_port') || '';
const value = [...new Set(this.map.data.get(this.section.config, section_id, 'endpoint_listeners')?.map(uri => new URL(uri).port) || [])]
.filter(Boolean).join(',');
if (listen_port != value) {
uci.set(this.section.config, section_id, 'easytier_listen_port', value);
return uci.save()
.then(L.bind(this.map.load, this.map))
.then(L.bind(this.map.reset, this.map))
.catch(() => {});
}
return form.Value.prototype.load.apply(this, arguments);
},
write(section_id, formvalue) {
const value = [...new Set(formvalue?.map(uri => new URL(uri).port) || [])]
.filter(Boolean).join(',');
uci.set(this.section.config, section_id, 'easytier_listen_port', value);
return form.Value.prototype[formvalue ? 'write' : 'remove'].apply(this, arguments);
}
};
so = ss.taboption('field_vpn', form.DynamicList, 'endpoint_listeners', _('Listeners'),
_('Only the address %s is valid.').format('0.0.0.0'));
so.placeholder = 'tcp://0.0.0.0:11010';
so.default = ['tcp://0.0.0.0:11010', 'udp://0.0.0.0:11010'];
so.load = easytier_listen_port.load;
so.write = easytier_listen_port.write;
so.remove = easytier_listen_port.write;
so.validate = hm.validateUrl;
so.depends({type: 'easytier', endpoint_no_listener: '0'});
so.modalonly = true;
//so = ss.taboption('field_vpn', form.DynamicList, 'endpoint_mapped_listeners', _('Mapped listeners'),
// _('list of public IP address of the listeners.'));
//so.placeholder = 'tcp://203.0.113.10:11010';
//so.validate = hm.validateUrl;
//so.depends({type: 'easytier', endpoint_no_listener: '0'});
//so.modalonly = true;
so = ss.taboption('field_vpn', form.Flag, 'endpoint_no_listener', _('NO Listener'));
so.default = so.enabled;
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_vpn', form.Value, 'endpoint_ip', _('Virtual address'), so = ss.taboption('field_vpn', form.Value, 'endpoint_ip', _('Virtual address'),
_('The %s address used by local machine in the %s network.').format(_('IPv4'), _('VPN'))); _('The %s address used by local machine in the %s network.').format(_('IPv4'), _('VPN')));
so.datatype = 'or(ip4addr(1), cidr4)'; so.datatype = 'or(ip4addr(1), cidr4)';
@@ -1604,6 +1814,13 @@ return view.extend({
so.depends({type: 'masque', masque_network: /^(|h2)$/}); so.depends({type: 'masque', masque_network: /^(|h2)$/});
so.modalonly = true; so.modalonly = true;
so = ss.taboption('field_vpn', form.Value, 'endpoint_ipv4', _('Virtual IPv4 address'),
_('The %s address used by local machine in the %s network.').format(_('IPv4'), _('VPN')));
so.datatype = 'or(ip4addr(1), cidr4)';
so.placeholder = '10.144.0.1/24';
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_vpn', form.Value, 'endpoint_ipv6', _('Virtual IPv6 address'), so = ss.taboption('field_vpn', form.Value, 'endpoint_ipv6', _('Virtual IPv6 address'),
_('The %s address used by local machine in the %s network.').format(_('IPv6'), _('VPN'))); _('The %s address used by local machine in the %s network.').format(_('IPv6'), _('VPN')));
so.datatype = 'or(ip6addr(1), cidr6)'; so.datatype = 'or(ip6addr(1), cidr6)';
@@ -1628,6 +1845,26 @@ return view.extend({
so.depends({type: 'masque', masque_network: /^(|h2)$/}); so.depends({type: 'masque', masque_network: /^(|h2)$/});
so.modalonly = true; so.modalonly = true;
so = ss.taboption('field_vpn', form.Flag, 'endpoint_dhcp', _('Use DHCP'),
_('Use DHCP to obtain IP address.') + '</br>' +
_('Auto Enable when %s is empty.').format(_('Virtual IPv4 address')));
so.default = so.disabled;
so.validate = function(section_id, value) {
const ipv4 = this.section.getOption('endpoint_ipv4').formvalue(section_id);
const dhcp = this.getUIElement(section_id).node.querySelector('input');
// Force enabled
if (!ipv4) {
dhcp.checked = true;
dhcp.disabled = true;
} else
dhcp.removeAttribute('disabled');
return true;
}
so.depends('type', 'easytier');
so.modalonly = true;
so = ss.taboption('field_vpn', form.Value, 'endpoint_mtu', _('MTU')); so = ss.taboption('field_vpn', form.Value, 'endpoint_mtu', _('MTU'));
so.datatype = 'range(0,9000)'; so.datatype = 'range(0,9000)';
so.placeholder = '1400'; so.placeholder = '1400';
@@ -1646,12 +1883,15 @@ return view.extend({
case 'masque': case 'masque':
def_mtu = '1280'; def_mtu = '1280';
break; break;
case 'easytier':
def_mtu = '1380';
break;
} }
UIEl.node.querySelector('input').placeholder = def_mtu; UIEl.node.querySelector('input').placeholder = def_mtu;
return true; return true;
} }
so.depends({type: /^(zerotier|wireguard)$/}); so.depends({type: /^(zerotier|wireguard|easytier)$/});
so.depends({type: 'masque', masque_network: /^(|h2)$/}); so.depends({type: 'masque', masque_network: /^(|h2)$/});
so.modalonly = true; so.modalonly = true;
@@ -2464,6 +2704,12 @@ return view.extend({
so.cfgvalue = hm.renderResDownload; so.cfgvalue = hm.renderResDownload;
so.editable = true; so.editable = true;
so.modalonly = false; so.modalonly = false;
so = ss.option(form.DummyValue, '_link');
so.cfgvalue = hm.renderResLink;
so.readonly = features.has_luci_app_tinyfilemanager ? false : _('luci-app-tinyfilemanager is not installed, please install it first.');
so.editable = true;
so.modalonly = false;
/* Provider END */ /* Provider END */
/* Proxy chain START */ /* Proxy chain START */
@@ -126,12 +126,14 @@ return view.extend({
load() { load() {
return Promise.all([ return Promise.all([
uci.load('fchomo'), uci.load('fchomo'),
hm.getFeatures(),
hm.decompressGzip(hm.rulesetdoc[1], true).then((res) => { return hm.rulesetdoc[0] + hm.encodeBase64(res); }) hm.decompressGzip(hm.rulesetdoc[1], true).then((res) => { return hm.rulesetdoc[0] + hm.encodeBase64(res); })
]); ]);
}, },
render(data) { render(data) {
const rulesetdoc = data[1]; const features = data[1];
const rulesetdoc = data[2];
let m, s, o; let m, s, o;
@@ -427,6 +429,12 @@ return view.extend({
o.cfgvalue = hm.renderResDownload; o.cfgvalue = hm.renderResDownload;
o.editable = true; o.editable = true;
o.modalonly = false; o.modalonly = false;
o = s.option(form.DummyValue, '_link');
o.cfgvalue = hm.renderResLink;
o.readonly = features.has_luci_app_tinyfilemanager ? false : _('luci-app-tinyfilemanager is not installed, please install it first.');
o.editable = true;
o.modalonly = false;
/* Rule set END */ /* Rule set END */
return m.render(); return m.render();
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -516,14 +516,15 @@ uci.foreach(uciconf, ucinode, (cfg) => {
"target-rematch-name": cfg.target_rematch_name, "target-rematch-name": cfg.target_rematch_name,
"target-sub-rule": cfg.target_sub_rule, "target-sub-rule": cfg.target_sub_rule,
/* HTTP / SOCKS / Shadowsocks / VMess / VLESS / Trojan / TUIC / hysteria2 / ZeroTier / Tailscale / Masque */ /* HTTP / SOCKS / Shadowsocks / VMess / VLESS / Trojan / TUIC / hysteria2 / ZeroTier / Tailscale / Masque / EasyTier */
username: cfg.username, username: cfg.username,
uuid: cfg.vmess_uuid || cfg.uuid, uuid: cfg.vmess_uuid || cfg.uuid,
cipher: cfg.vmess_chipher || cfg.shadowsocks_chipher, cipher: cfg.vmess_chipher || cfg.shadowsocks_chipher,
password: cfg.shadowsocks_password || cfg.password, password: cfg.shadowsocks_password || cfg.password,
hostname: cfg.tailscale_hostname || cfg.easytier_hostname,
headers: cfg.headers ? json(cfg.headers) : null, headers: cfg.headers ? json(cfg.headers) : null,
network: cfg.zerotier_network_id || cfg.masque_network || null, network: cfg.zerotier_network_id || cfg.masque_network || null,
"state-dir": `${HM_DIR}/${ucinode}/${cfg['.name']}`, "state-dir": (cfg.type in ['zerotier', 'tailscale', 'easytier']) ? `${HM_DIR}/${ucinode}/${cfg['.name']}` : null,
/* Shadowsocks */ /* Shadowsocks */
@@ -642,6 +643,7 @@ uci.foreach(uciconf, ucinode, (cfg) => {
"remote-trace-level": strToInt(cfg.zerotier_trace_level), "remote-trace-level": strToInt(cfg.zerotier_trace_level),
"low-bandwidth": strToBool(cfg.zerotier_low_bandwidth), "low-bandwidth": strToBool(cfg.zerotier_low_bandwidth),
"encrypted-hello": strToBool(cfg.zerotier_encrypted_hello), "encrypted-hello": strToBool(cfg.zerotier_encrypted_hello),
"identity-secret": cfg.zerotier_identity_secret,
//planet: `${HM_DIR}/${ucinode}/${cfg['.name']}/planet`, //planet: `${HM_DIR}/${ucinode}/${cfg['.name']}/planet`,
...(isEmpty(cfg.zerotier_orbit) ? {} : { ...(isEmpty(cfg.zerotier_orbit) ? {} : {
orbit: map([0], () => { orbit: map([0], () => {
@@ -663,7 +665,6 @@ uci.foreach(uciconf, ucinode, (cfg) => {
"persistent-keepalive": strToInt(cfg.wireguard_persistent_keepalive), "persistent-keepalive": strToInt(cfg.wireguard_persistent_keepalive),
/* Tailscale */ /* Tailscale */
hostname: cfg.tailscale_hostname,
"auth-key": cfg.tailscale_auth_key, "auth-key": cfg.tailscale_auth_key,
"control-url": cfg.tailscale_control_url, "control-url": cfg.tailscale_control_url,
ephemeral: strToBool(cfg.tailscale_ephemeral), ephemeral: strToBool(cfg.tailscale_ephemeral),
@@ -673,6 +674,25 @@ uci.foreach(uciconf, ucinode, (cfg) => {
/* Masque */ /* Masque */
/* EasyTier */
"instance-name": cfg.type === 'easytier' ? cfg['.name'] : null,
"network-name": cfg.easytier_network_name,
"network-secret": cfg.easytier_network_secret,
"private-mode": strToBool(cfg.easytier_private_mode),
peers: cfg.easytier_peers, // Array
"secure-mode": strToBool(cfg.easytier_secure_mode),
"local-private-key": cfg.easytier_local_private_key,
"local-public-key": cfg.easytier_local_public_key,
"exit-nodes": cfg.easytier_exit_nodes, // Array
"proxy-networks": cfg.easytier_proxy_networks, // Array
"enable-encryption": cfg.easytier_enable_encryption === '0' ? false : null,
"encryption-algorithm": cfg.easytier_encryption_algorithm,
"enable-exit-node": strToBool(cfg.easytier_enable_exit_node),
"latency-first": strToBool(cfg.easytier_latency_first),
"disable-p2p": strToBool(cfg.easytier_disable_p2p),
"accept-dns": strToBool(cfg.easytier_accept_dns),
"tld-dns-zone": cfg.easytier_tld_dns_zone,
/* SSH */ /* SSH */
"private-key-passphrase": cfg.ssh_priv_key_passphrase, "private-key-passphrase": cfg.ssh_priv_key_passphrase,
"host-key-algorithms": cfg.ssh_host_key_algorithms, "host-key-algorithms": cfg.ssh_host_key_algorithms,
@@ -759,8 +779,13 @@ uci.foreach(uciconf, ucinode, (cfg) => {
} : null, } : null,
/* VPN fields */ /* VPN fields */
listeners: cfg.endpoint_listeners, // Array
//"mapped-listeners": cfg.endpoint_mapped_listeners, // Array
"no-listener": cfg.endpoint_no_listener === '0' ? false : cfg.type === 'easytier' ? true : null,
ip: cfg.endpoint_ip, ip: cfg.endpoint_ip,
ipv4: cfg.endpoint_ipv4,
ipv6: cfg.endpoint_ipv6, ipv6: cfg.endpoint_ipv6,
dhcp: strToBool(cfg.endpoint_dhcp),
mtu: strToInt(cfg.endpoint_mtu) || null, mtu: strToInt(cfg.endpoint_mtu) || null,
"remote-dns-resolve": strToBool(cfg.endpoint_remote_dns_resolve), "remote-dns-resolve": strToBool(cfg.endpoint_remote_dns_resolve),
dns: cfg.endpoint_dns, // Array dns: cfg.endpoint_dns, // Array
@@ -197,6 +197,7 @@ const methods = {
features.app_version = trim(popen(`${use_apk ? 'apk list -I --manifest' : 'opkg list-installed'} luci-app-fchomo | ` + features.app_version = trim(popen(`${use_apk ? 'apk list -I --manifest' : 'opkg list-installed'} luci-app-fchomo | ` +
`awk '{print $NF}'`).read('all')) || null; // @less_25_12 `awk '{print $NF}'`).read('all')) || null; // @less_25_12
features.has_luci_app_tinyfilemanager = system(`[ -n "$(${use_apk ? 'apk list -qI' : 'opkg list-installed'} luci-app-tinyfilemanager)" ]`) == 0 || null; // @less_25_12
features.has_dnsmasq_full = system(`[ -n "$(${use_apk ? 'apk list -qI' : 'opkg list-installed'} dnsmasq-full)" ]`) == 0 || null; // @less_25_12 features.has_dnsmasq_full = system(`[ -n "$(${use_apk ? 'apk list -qI' : 'opkg list-installed'} dnsmasq-full)" ]`) == 0 || null; // @less_25_12
features.has_ip_full = access('/usr/libexec/ip-full'); features.has_ip_full = access('/usr/libexec/ip-full');
features.has_stunclient = access('/usr/bin/stunclient'); features.has_stunclient = access('/usr/bin/stunclient');
+1 -1
View File
@@ -12,7 +12,7 @@ LUCI_DEPENDS:=+luci-base +logd +jsonfilter
LUCI_PKGARCH:=all LUCI_PKGARCH:=all
PKG_VERSION:=0.1.41 PKG_VERSION:=0.1.41
PKG_RELEASE:=18 PKG_RELEASE:=19
# Reproducible build: honor SOURCE_DATE_EPOCH from the build environment (set by docker-sdk.sh / CI). # Reproducible build: honor SOURCE_DATE_EPOCH from the build environment (set by docker-sdk.sh / CI).
ifdef SOURCE_DATE_EPOCH ifdef SOURCE_DATE_EPOCH
@@ -2236,6 +2236,21 @@ return view.extend({
'Display options on the bar set Limit, row tint, palette, and hostnames.' 'Display options on the bar set Limit, row tint, palette, and hostnames.'
) )
]), ]),
E('li', {}, [
_(
'For a responsive table on a weak device, keep Limit at 250 rows or below. The weak-device cap affects rendered rows; the buffer can still retain more.'
)
]),
E('li', {}, [
_(
'Switching tabs pauses polling; returning performs one catch-up poll. Hostnames are off by default because lookups add work.'
)
]),
E('li', {}, [
_(
'The router log ring may evict older events before fwlive reads them. fwlive cannot recover evicted entries or change forwarding behavior.'
)
]),
E('li', {}, [ E('li', {}, [
_( _(
'The rate shown for WAN logging is the firewall zone log_limit. OpenWrt defaults to 10/minute when no explicit limit is configured; fwlive does not impose this cap.' 'The rate shown for WAN logging is the firewall zone log_limit. OpenWrt defaults to 10/minute when no explicit limit is configured; fwlive does not impose this cap.'
+12
View File
@@ -185,6 +185,18 @@ msgstr ""
"Anzeigeoptionen in der Leiste setzen Limit, Zeilenfärbung, Palette und " "Anzeigeoptionen in der Leiste setzen Limit, Zeilenfärbung, Palette und "
"Hostnamen." "Hostnamen."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2240
msgid "For a responsive table on a weak device, keep Limit at 250 rows or below. The weak-device cap affects rendered rows; the buffer can still retain more."
msgstr "Für eine responsive Tabelle auf einem schwachen Gerät sollte Limit auf höchstens 250 Zeilen stehen. Die Schwachgerätebegrenzung betrifft die angezeigten Zeilen; der Puffer kann weiterhin mehr Zeilen behalten."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2245
msgid "Switching tabs pauses polling; returning performs one catch-up poll. Hostnames are off by default because lookups add work."
msgstr "Beim Wechseln des Tabs wird das Polling pausiert; bei der Rückkehr erfolgt eine einmalige Aufholabfrage. Hostnamen sind standardmäßig deaktiviert, da Auflösungen zusätzliche Arbeit verursachen."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2250
msgid "The router log ring may evict older events before fwlive reads them. fwlive cannot recover evicted entries or change forwarding behavior."
msgstr "Der Protokollring des Routers kann ältere Ereignisse verdrängen, bevor fwlive sie liest. fwlive kann verdrängte Einträge nicht wiederherstellen und ändert das Weiterleitungsverhalten nicht."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121 #: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
msgid "Does not change:" msgid "Does not change:"
msgstr "Does not change:" msgstr "Does not change:"
+12
View File
@@ -187,6 +187,18 @@ msgstr ""
"Параметры отображения на панели задают лимит, окраску строк, палитру и имена " "Параметры отображения на панели задают лимит, окраску строк, палитру и имена "
"узлов." "узлов."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2240
msgid "For a responsive table on a weak device, keep Limit at 250 rows or below. The weak-device cap affects rendered rows; the buffer can still retain more."
msgstr "Для отзывчивой таблицы на слабом устройстве установите Limit не выше 250 строк. Ограничение слабого устройства влияет на отображаемые строки; буфер всё ещё может хранить больше."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2245
msgid "Switching tabs pauses polling; returning performs one catch-up poll. Hostnames are off by default because lookups add work."
msgstr "При переключении вкладки опрос приостанавливается; при возврате выполняется один догоняющий опрос. Имена хостов по умолчанию отключены, поскольку их разрешение создаёт дополнительную нагрузку."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2250
msgid "The router log ring may evict older events before fwlive reads them. fwlive cannot recover evicted entries or change forwarding behavior."
msgstr "Кольцевой журнал маршрутизатора может вытеснить старые события до того, как fwlive их прочитает. fwlive не может восстановить вытесненные записи и не изменяет пересылку."
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121 #: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
msgid "Does not change:" msgid "Does not change:"
msgstr "Does not change:" msgstr "Does not change:"
@@ -156,6 +156,18 @@ msgstr ""
msgid "Display options on the bar set Limit, row tint, palette, and hostnames." msgid "Display options on the bar set Limit, row tint, palette, and hostnames."
msgstr "" msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2240
msgid "For a responsive table on a weak device, keep Limit at 250 rows or below. The weak-device cap affects rendered rows; the buffer can still retain more."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2245
msgid "Switching tabs pauses polling; returning performs one catch-up poll. Hostnames are off by default because lookups add work."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2250
msgid "The router log ring may evict older events before fwlive reads them. fwlive cannot recover evicted entries or change forwarding behavior."
msgstr ""
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121 #: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
msgid "Does not change:" msgid "Does not change:"
msgstr "" msgstr ""
@@ -171,6 +171,18 @@ msgstr "显示选项"
msgid "Display options on the bar set Limit, row tint, palette, and hostnames." msgid "Display options on the bar set Limit, row tint, palette, and hostnames."
msgstr "栏上的显示选项可设置行数限制、行着色、调色板和主机名。" msgstr "栏上的显示选项可设置行数限制、行着色、调色板和主机名。"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2240
msgid "For a responsive table on a weak device, keep Limit at 250 rows or below. The weak-device cap affects rendered rows; the buffer can still retain more."
msgstr "要让弱设备上的表格保持响应,请将 Limit 保持在 250 行或更少。弱设备限制影响渲染的行数;缓冲区仍可保留更多行。"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2245
msgid "Switching tabs pauses polling; returning performs one catch-up poll. Hostnames are off by default because lookups add work."
msgstr "切换到其他标签页会暂停轮询;返回时执行一次追赶轮询。主机名默认关闭,因为解析会增加工作量。"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/view/status/fwlive.js:2250
msgid "The router log ring may evict older events before fwlive reads them. fwlive cannot recover evicted entries or change forwarding behavior."
msgstr "路由器日志环形缓冲区可能在 fwlive 读取前淘汰较旧事件。fwlive 无法恢复已淘汰的条目,也不会改变转发行为。"
#: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121 #: openwrt-feed/luci-app-fwlive/htdocs/luci-static/resources/fwlive/logging.js:121
msgid "Does not change:" msgid "Does not change:"
msgstr "Does not change:" msgstr "Does not change:"
@@ -148,6 +148,10 @@ return view.extend({
o.default = o.disabled; o.default = o.disabled;
o.rmempty = false; o.rmempty = false;
o = s.option(form.Value, 'boot_delay', _('Boot delay'),
_('Delay in seconds before starting the service.'));
o.datatype = 'uinteger';
o = s.option(form.Value, 'def_tcp_stun', _('Default ') + _('TCP STUN ') + _('Server'), o = s.option(form.Value, 'def_tcp_stun', _('Default ') + _('TCP STUN ') + _('Server'),
_('Available server <a href="%s" target="_blank">references</a>') _('Available server <a href="%s" target="_blank">references</a>')
.format(_('https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780_tcp.txt'))); .format(_('https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780_tcp.txt')));
+136 -128
View File
@@ -4,20 +4,20 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -25,138 +25,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -164,27 +172,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -197,23 +205,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -226,24 +234,24 @@ msgstr ""
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -255,44 +263,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -301,74 +309,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -376,7 +384,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -384,83 +392,83 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -10,20 +10,20 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.15.1-dev\n" "X-Generator: Weblate 4.15.1-dev\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -31,138 +31,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "Bind port" msgstr "Bind port"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "Aktiver" msgstr "Aktiver"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "Ekstern IP" msgstr "Ekstern IP"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "Ekstern port" msgstr "Ekstern port"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "For TCP-tilstand" msgstr "For TCP-tilstand"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "Videresendelsestilstand" msgstr "Videresendelsestilstand"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "Videresendelses mål" msgstr "Videresendelses mål"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "Videresendelses målport" msgstr "Videresendelses målport"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -170,27 +178,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "Giv adgang til LuCI-appen natmap" msgstr "Giv adgang til LuCI-appen natmap"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "HTTP server" msgstr "HTTP server"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -203,23 +211,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "Interface" msgstr "Interface"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "Hold i live interval" msgstr "Hold i live interval"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -232,24 +240,24 @@ msgstr "NATMap"
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -261,44 +269,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "Protokol" msgstr "Protokol"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -307,74 +315,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "Begræns til adresse familie" msgstr "Begræns til adresse familie"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "STUN server" msgstr "STUN server"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -382,7 +390,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -390,84 +398,84 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -10,20 +10,20 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.17-dev\n" "X-Generator: Weblate 4.17-dev\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -31,138 +31,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "Bindungsport" msgstr "Bindungsport"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "aktivieren" msgstr "aktivieren"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "Externe IP" msgstr "Externe IP"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "Externer Port" msgstr "Externer Port"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "Für den TCP-Modus" msgstr "Für den TCP-Modus"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "Forward-Modus" msgstr "Forward-Modus"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "Ziel für Forwards" msgstr "Ziel für Forwards"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "Zielport für Forwards" msgstr "Zielport für Forwards"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -170,27 +178,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "Gewähre zugang zu LuCI app natmap" msgstr "Gewähre zugang zu LuCI app natmap"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "HTTP Server" msgstr "HTTP Server"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -203,23 +211,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "Schnittstelle" msgstr "Schnittstelle"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "Keep-Alive-Intervall" msgstr "Keep-Alive-Intervall"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -232,24 +240,24 @@ msgstr "NATMap"
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -261,44 +269,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "Protokoll" msgstr "Protokoll"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -307,74 +315,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "Auf Adressfamilie beschränken" msgstr "Auf Adressfamilie beschränken"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "STUN-Server" msgstr "STUN-Server"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -382,7 +390,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -390,84 +398,84 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -10,20 +10,20 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.16-dev\n" "X-Generator: Weblate 4.16-dev\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -31,138 +31,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "Vincular puerto" msgstr "Vincular puerto"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "Activar" msgstr "Activar"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "IP externa" msgstr "IP externa"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "Puerto externo" msgstr "Puerto externo"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "Para el modo TCP" msgstr "Para el modo TCP"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "Modo de reenvío" msgstr "Modo de reenvío"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "Reenviar objetivo" msgstr "Reenviar objetivo"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "Puerto de destino de reenvío" msgstr "Puerto de destino de reenvío"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -170,27 +178,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "Otorgar acceso a la aplicación LuCI natmap" msgstr "Otorgar acceso a la aplicación LuCI natmap"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "Servidor HTTP" msgstr "Servidor HTTP"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -203,23 +211,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "Interfaz" msgstr "Interfaz"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "Intervalo de mantenimiento" msgstr "Intervalo de mantenimiento"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -232,24 +240,24 @@ msgstr "NATMap"
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -261,44 +269,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "Protocolo" msgstr "Protocolo"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -307,74 +315,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "Restringir para dirigirse a la familia" msgstr "Restringir para dirigirse a la familia"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "Servidor STUN" msgstr "Servidor STUN"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -382,7 +390,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -390,84 +398,84 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -10,20 +10,20 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.18-dev\n" "X-Generator: Weblate 4.18-dev\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -31,138 +31,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "Port de liaison" msgstr "Port de liaison"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "Active" msgstr "Active"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "IP externe" msgstr "IP externe"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "Port externe" msgstr "Port externe"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "Pour mode TCP" msgstr "Pour mode TCP"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "Transmission mode" msgstr "Transmission mode"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "Transfert Cible" msgstr "Transfert Cible"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "Transférer le port cible" msgstr "Transférer le port cible"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -170,27 +178,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "Accorder l’accès à l’application LuCI natmap" msgstr "Accorder l’accès à l’application LuCI natmap"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "Serveur HTTP" msgstr "Serveur HTTP"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -203,23 +211,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "Interface" msgstr "Interface"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "Intervalle Keep-alive" msgstr "Intervalle Keep-alive"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -232,24 +240,24 @@ msgstr "Carte NAT"
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -261,44 +269,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "Protocole" msgstr "Protocole"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -307,74 +315,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "Restreindre à la famille d’adresses" msgstr "Restreindre à la famille d’adresses"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "Serveur STUN" msgstr "Serveur STUN"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -382,7 +390,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -390,84 +398,84 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -10,20 +10,20 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.0-dev\n" "X-Generator: Weblate 5.0-dev\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -31,138 +31,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "collega porta" msgstr "collega porta"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "Attiva" msgstr "Attiva"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "Ip Esterno" msgstr "Ip Esterno"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "Porta Esterna" msgstr "Porta Esterna"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "Per la modalità TCP" msgstr "Per la modalità TCP"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "Modalità forward" msgstr "Modalità forward"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "Obiettivo della modalità forward" msgstr "Obiettivo della modalità forward"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -170,27 +178,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -203,23 +211,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -232,24 +240,24 @@ msgstr ""
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -261,44 +269,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -307,74 +315,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -382,7 +390,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -390,83 +398,83 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -12,20 +12,20 @@ msgstr ""
"1 : 2);\n" "1 : 2);\n"
"X-Generator: Weblate 5.0-dev\n" "X-Generator: Weblate 5.0-dev\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -33,138 +33,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "Priskirti prievadą" msgstr "Priskirti prievadą"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "Įjungti" msgstr "Įjungti"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "Išorinis „IP“" msgstr "Išorinis „IP“"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "Išorinis prievadas" msgstr "Išorinis prievadas"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "Dėl „TCP“ režimo" msgstr "Dėl „TCP“ režimo"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "Pravedimo režimas" msgstr "Pravedimo režimas"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "Pravedimo numatymas (taikinys)" msgstr "Pravedimo numatymas (taikinys)"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "Pravedimo numatymo (taikinio) prievadas" msgstr "Pravedimo numatymo (taikinio) prievadas"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -172,27 +180,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "Duoti prieigą „LuCI app natmap“" msgstr "Duoti prieigą „LuCI app natmap“"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "„HTTP“ serveris" msgstr "„HTTP“ serveris"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -205,23 +213,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "Išvaizda" msgstr "Išvaizda"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "„Laikyti-gyvą“ intervalas" msgstr "„Laikyti-gyvą“ intervalas"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -234,24 +242,24 @@ msgstr "„NATMap“"
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -263,44 +271,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "Protokolas" msgstr "Protokolas"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -309,74 +317,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "Riboti tik adresų šeimai" msgstr "Riboti tik adresų šeimai"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "„STUN“ serveris" msgstr "„STUN“ serveris"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -384,7 +392,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -392,84 +400,84 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -10,20 +10,20 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.18-dev\n" "X-Generator: Weblate 4.18-dev\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -31,138 +31,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "Bind poort" msgstr "Bind poort"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "Activeren" msgstr "Activeren"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "Externe IP" msgstr "Externe IP"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "Externe poort" msgstr "Externe poort"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "Voor TCP-modus" msgstr "Voor TCP-modus"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "Forward Mode" msgstr "Forward Mode"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "Forward doel" msgstr "Forward doel"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "Forward doelpoort" msgstr "Forward doelpoort"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -170,27 +178,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "Toegang verlenen tot LuCI app natmap" msgstr "Toegang verlenen tot LuCI app natmap"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "HTTP-server" msgstr "HTTP-server"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -203,23 +211,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "Interface" msgstr "Interface"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "Keep-alive interval" msgstr "Keep-alive interval"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -232,24 +240,24 @@ msgstr "NATMap"
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -261,44 +269,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "Protocol" msgstr "Protocol"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -307,74 +315,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "Beperken tot adres familie" msgstr "Beperken tot adres familie"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "STUN-server" msgstr "STUN-server"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -382,7 +390,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -390,84 +398,84 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -11,20 +11,20 @@ msgstr ""
"|| n%100>=20) ? 1 : 2;\n" "|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.15.1-dev\n" "X-Generator: Weblate 4.15.1-dev\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -32,138 +32,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "Zwiąż port" msgstr "Zwiąż port"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "Włącz" msgstr "Włącz"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "Zewnętrzny adres IP" msgstr "Zewnętrzny adres IP"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "Port zewnętrzny" msgstr "Port zewnętrzny"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "Dla trybu TCP" msgstr "Dla trybu TCP"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "Tryb przekazywania" msgstr "Tryb przekazywania"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "Cel przekazywania" msgstr "Cel przekazywania"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "Port celu przekazywania" msgstr "Port celu przekazywania"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -171,27 +179,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "Przyznaj dostęp do aplikacji LuCI natmap" msgstr "Przyznaj dostęp do aplikacji LuCI natmap"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "Serwer HTTP" msgstr "Serwer HTTP"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -204,23 +212,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "Interfejs" msgstr "Interfejs"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "Interwał utrzymywania aktywności" msgstr "Interwał utrzymywania aktywności"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -233,24 +241,24 @@ msgstr "NATMap"
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -262,44 +270,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "Protokół" msgstr "Protokół"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -308,74 +316,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "Ogranicz do rodziny adresów" msgstr "Ogranicz do rodziny adresów"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "Serwer STUN" msgstr "Serwer STUN"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -383,7 +391,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -391,84 +399,84 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -10,20 +10,20 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.18.1\n" "X-Generator: Weblate 4.18.1\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -31,138 +31,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "Porta do bind" msgstr "Porta do bind"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "Ativar" msgstr "Ativar"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "IP externo" msgstr "IP externo"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "Porta externa" msgstr "Porta externa"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "Para o modo TCP" msgstr "Para o modo TCP"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "Modo de encaminhamento" msgstr "Modo de encaminhamento"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "Alvo de encaminhamento" msgstr "Alvo de encaminhamento"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "Porta de destino do encaminhamento" msgstr "Porta de destino do encaminhamento"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -170,27 +178,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "Conceda acesso LuCi à app natmap" msgstr "Conceda acesso LuCi à app natmap"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "Servidor HTTP" msgstr "Servidor HTTP"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -203,23 +211,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "Interface" msgstr "Interface"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "Intervalo do keep-alive interno" msgstr "Intervalo do keep-alive interno"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -232,24 +240,24 @@ msgstr "NATMap"
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -261,44 +269,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "Protocolo" msgstr "Protocolo"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -307,74 +315,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "Restringe à uma família de endereços" msgstr "Restringe à uma família de endereços"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "Servidor STUN" msgstr "Servidor STUN"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -382,7 +390,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -390,84 +398,84 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -10,20 +10,20 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.15.1-dev\n" "X-Generator: Weblate 4.15.1-dev\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -31,138 +31,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "Porta do bind" msgstr "Porta do bind"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "Ativar" msgstr "Ativar"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "IP externo" msgstr "IP externo"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "Porta externa" msgstr "Porta externa"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "Para o modo TCP" msgstr "Para o modo TCP"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "Modo de encaminhamento" msgstr "Modo de encaminhamento"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "Alvo de encaminhamento" msgstr "Alvo de encaminhamento"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "Porta de destino do encaminhamento" msgstr "Porta de destino do encaminhamento"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -170,27 +178,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "Conceda acesso LuCi ao aplicativo natmap" msgstr "Conceda acesso LuCi ao aplicativo natmap"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "Servidor HTTP" msgstr "Servidor HTTP"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -203,23 +211,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "Interface" msgstr "Interface"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "Intervalo do keep-alive interno" msgstr "Intervalo do keep-alive interno"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -232,24 +240,24 @@ msgstr "NATMap"
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -261,44 +269,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "Protocolo" msgstr "Protocolo"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -307,74 +315,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "Restringe à uma família de endereços" msgstr "Restringe à uma família de endereços"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "Servidor STUN" msgstr "Servidor STUN"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -382,7 +390,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -390,84 +398,84 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -11,20 +11,20 @@ msgstr ""
"20)) ? 1 : 2;\n" "20)) ? 1 : 2;\n"
"X-Generator: Weblate 4.18-dev\n" "X-Generator: Weblate 4.18-dev\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -32,138 +32,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "Legați portul" msgstr "Legați portul"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "Activează" msgstr "Activează"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "IP extern" msgstr "IP extern"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "Port extern" msgstr "Port extern"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "Pentru modul TCP" msgstr "Pentru modul TCP"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "Mod de redirecționare" msgstr "Mod de redirecționare"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "redirectionare tinta" msgstr "redirectionare tinta"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "Redirecționarea portului țintă" msgstr "Redirecționarea portului țintă"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -171,27 +179,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "Acordarea accesului la aplicația LuCI natmap" msgstr "Acordarea accesului la aplicația LuCI natmap"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "Server HTTP" msgstr "Server HTTP"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -204,23 +212,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "Interfață" msgstr "Interfață"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "Interval de păstrare în viață" msgstr "Interval de păstrare în viață"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -233,24 +241,24 @@ msgstr "NATMap"
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -262,44 +270,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "Protocol" msgstr "Protocol"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -308,74 +316,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "Restricționarea la adresa familiei" msgstr "Restricționarea la adresa familiei"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "Server STUN" msgstr "Server STUN"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -383,7 +391,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -391,84 +399,84 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -11,20 +11,20 @@ msgstr ""
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.17-dev\n" "X-Generator: Weblate 4.17-dev\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -32,138 +32,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "Порт сервера" msgstr "Порт сервера"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "Включить" msgstr "Включить"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "Внешний IP" msgstr "Внешний IP"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "Внешний порт" msgstr "Внешний порт"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "Для режима TCP" msgstr "Для режима TCP"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "Режим перенаправления" msgstr "Режим перенаправления"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "Цель перенаправления" msgstr "Цель перенаправления"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "Порт переадресованной цели" msgstr "Порт переадресованной цели"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -171,27 +179,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "Предоставить доступ LuCI к приложению natmap" msgstr "Предоставить доступ LuCI к приложению natmap"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "HTTP-сервер" msgstr "HTTP-сервер"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -204,23 +212,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "Интерфейс" msgstr "Интерфейс"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "Keep-alive интервал" msgstr "Keep-alive интервал"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -233,24 +241,24 @@ msgstr "NATMap"
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -262,44 +270,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "Протокол" msgstr "Протокол"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -308,74 +316,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "Использовать протокол" msgstr "Использовать протокол"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "Сервер STUN" msgstr "Сервер STUN"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -383,7 +391,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -391,84 +399,84 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -4,20 +4,20 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -25,138 +25,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -164,27 +172,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -197,23 +205,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -226,24 +234,24 @@ msgstr ""
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -255,44 +263,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -301,74 +309,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -376,7 +384,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -384,83 +392,83 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -1,20 +1,20 @@
msgid "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8" msgstr "Content-Type: text/plain; charset=UTF-8"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -22,138 +22,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -161,27 +169,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -194,23 +202,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -223,24 +231,24 @@ msgstr ""
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -252,44 +260,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -298,74 +306,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -373,7 +381,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -381,83 +389,83 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -4,20 +4,20 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -25,138 +25,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -164,27 +172,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -197,23 +205,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -226,24 +234,24 @@ msgstr ""
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -255,44 +263,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -301,74 +309,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -376,7 +384,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -384,83 +392,83 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -10,20 +10,20 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.18.1\n" "X-Generator: Weblate 4.18.1\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "" msgstr ""
@@ -31,138 +31,146 @@ msgstr ""
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "Cổng Bind" msgstr "Cổng Bind"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "Bật lên" msgstr "Bật lên"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "IP bên ngoài" msgstr "IP bên ngoài"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "Cổng bên ngoài" msgstr "Cổng bên ngoài"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "Cho chế độ TCP" msgstr "Cho chế độ TCP"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "Chế độ Forward" msgstr "Chế độ Forward"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "Điểm đến Forward" msgstr "Điểm đến Forward"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "Cổng Forward target" msgstr "Cổng Forward target"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "" msgstr ""
@@ -170,27 +178,27 @@ msgstr ""
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "Cấp quyền truy cập vào natmap LuCI" msgstr "Cấp quyền truy cập vào natmap LuCI"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "HTTP server" msgstr "HTTP server"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "" msgstr ""
@@ -203,23 +211,23 @@ msgstr ""
msgid "Inner Port" msgid "Inner Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "Giao diện" msgstr "Giao diện"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "Vòng lặp keep-alive" msgstr "Vòng lặp keep-alive"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "" msgstr ""
@@ -232,24 +240,24 @@ msgstr "NATmap"
msgid "Name" msgid "Name"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "" msgstr ""
@@ -261,44 +269,44 @@ msgstr ""
msgid "Outer Port" msgid "Outer Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "Giao thức" msgstr "Giao thức"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "" msgstr ""
@@ -307,74 +315,74 @@ msgstr ""
msgid "Reload" msgid "Reload"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "Giới hạn địa chỉ gia đình" msgstr "Giới hạn địa chỉ gia đình"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "Máy chủ STUN" msgstr "Máy chủ STUN"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -382,7 +390,7 @@ msgid ""
"KEY variables." "KEY variables."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "" msgstr ""
@@ -390,84 +398,84 @@ msgstr ""
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -10,20 +10,20 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.18-dev\n" "X-Generator: Weblate 4.18-dev\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "%s 设为 0 将重写客户端监听端口" msgstr "%s 设为 0 将重写客户端监听端口"
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "<code># All external tokens required</code> 字段" msgstr "<code># All external tokens required</code> 字段"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "A 记录" msgstr "A 记录"
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "AAAA 记录" msgstr "AAAA 记录"
@@ -31,138 +31,146 @@ msgstr "AAAA 记录"
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "活动的 NATMap 端口映射" msgstr "活动的 NATMap 端口映射"
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "随机分配端口,而不是按顺序分配。" msgstr "随机分配端口,而不是按顺序分配。"
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "可用的服务器<a href=\"%s\" target=\"_blank\">参考</a>" msgstr "可用的服务器<a href=\"%s\" target=\"_blank\">参考</a>"
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "绑定端口" msgstr "绑定端口"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr "启动延迟"
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "可以参考 RFC8552" msgstr "可以参考 RFC8552"
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "检测" msgstr "检测"
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "检测 NAT 行为" msgstr "检测 NAT 行为"
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "备注" msgstr "备注"
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "自定义脚本" msgstr "自定义脚本"
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "DDNS 脚本" msgstr "DDNS 脚本"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "默认" msgstr "默认"
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr "启动服务前的延迟时间(秒)。"
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "启用DDNS" msgstr "启用DDNS"
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "启用通知" msgstr "启用通知"
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "启用" msgstr "启用"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "展开/收起 结果" msgstr "展开/收起 结果"
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "外部 IP" msgstr "外部 IP"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "外部端口" msgstr "外部端口"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "防火墙 DNAT" msgstr "防火墙 DNAT"
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "用于 TCP 模式" msgstr "用于 TCP 模式"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "用于 UDP 模式" msgstr "用于 UDP 模式"
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "转发设置" msgstr "转发设置"
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "转发方法" msgstr "转发方法"
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "转发模式" msgstr "转发模式"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "转发目标" msgstr "转发目标"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "转发目标端口" msgstr "转发目标端口"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "转发超时" msgstr "转发超时"
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr " Fwmark 值" msgstr " Fwmark 值"
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "常规设置" msgstr "常规设置"
@@ -170,27 +178,27 @@ msgstr "常规设置"
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "授予访问 LuCI 应用 natmap 的权限" msgstr "授予访问 LuCI 应用 natmap 的权限"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "HTTP 服务器" msgstr "HTTP 服务器"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "HTTPS 记录" msgstr "HTTPS 记录"
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "IPv4" msgstr "IPv4"
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "IPv6" msgstr "IPv6"
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "如果您开启了<b>通知脚本</b>, 将被大量消息轰炸" msgstr "如果您开启了<b>通知脚本</b>, 将被大量消息轰炸"
@@ -203,23 +211,23 @@ msgstr "内部地址"
msgid "Inner Port" msgid "Inner Port"
msgstr "内部端口" msgstr "内部端口"
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "接口" msgstr "接口"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "Keep-alive 间隔" msgstr "Keep-alive 间隔"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "为 STUN/HTTP 出站流量标记 fwmark" msgstr "为 STUN/HTTP 出站流量标记 fwmark"
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "NAT 环回" msgstr "NAT 环回"
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "NATBehavior-Test 端口打开于" msgstr "NATBehavior-Test 端口打开于"
@@ -232,24 +240,24 @@ msgstr "NATMap"
msgid "Name" msgid "Name"
msgstr "名称" msgstr "名称"
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "非 0 端口" msgstr "非 0 端口"
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "注意: 使用 <code>portrange</code> 后, 会轮换打开公网端口</br>" msgstr "注意: 使用 <code>portrange</code> 后, 会轮换打开公网端口</br>"
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "通知脚本" msgstr "通知脚本"
@@ -261,44 +269,44 @@ msgstr "外部地址"
msgid "Outer Port" msgid "Outer Port"
msgstr "外部端口" msgstr "外部端口"
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "密码" msgstr "密码"
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "请检查<a href=\"%s\"><b>防火墙规则</b></a>以避免端口冲突</br>" msgstr "请检查<a href=\"%s\"><b>防火墙规则</b></a>以避免端口冲突</br>"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "端口转发会话空闲超时 (以秒为单位)" msgstr "端口转发会话空闲超时 (以秒为单位)"
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "优先权" msgstr "优先权"
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "私有 API 域名" msgstr "私有 API 域名"
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "协议" msgstr "协议"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "随机分配端口" msgstr "随机分配端口"
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "客户端刷新脚本" msgstr "客户端刷新脚本"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "刷新客户端" msgstr "刷新客户端"
@@ -307,74 +315,74 @@ msgstr "刷新客户端"
msgid "Reload" msgid "Reload"
msgstr "重新载入" msgstr "重新载入"
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "地址族限制" msgstr "地址族限制"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "SRV 记录" msgstr "SRV 记录"
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "STUN 检查周期 (每 n 个间隔一次)" msgstr "STUN 检查周期 (每 n 个间隔一次)"
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "STUN 服务器" msgstr "STUN 服务器"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "服务器" msgstr "服务器"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "服务" msgstr "服务"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "设为 0 将跟随公共端口" msgstr "设为 0 将跟随公共端口"
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "服务参数" msgstr "服务参数"
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "TCP 拥塞控制" msgstr "TCP 拥塞控制"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "目标" msgstr "目标"
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "文本内容" msgstr "文本内容"
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "DNAT 方法不支持在 IPv6 下使用" msgstr "DNAT 方法不支持在 IPv6 下使用"
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -384,7 +392,7 @@ msgstr ""
"上面脚本所需的 KEY。请查看 <a href=\"%s\" target=\"_blank\">%s</a> 以获得对应" "上面脚本所需的 KEY。请查看 <a href=\"%s\" target=\"_blank\">%s</a> 以获得对应"
"脚本所需的 KEY 列表。请输入格式为 KEY=VAL 的多个 KEY 条目" "脚本所需的 KEY 列表。请输入格式为 KEY=VAL 的多个 KEY 条目"
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "DNAT 模式下不支持主机名" msgstr "DNAT 模式下不支持主机名"
@@ -392,84 +400,84 @@ msgstr "DNAT 模式下不支持主机名"
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "没有活动的端口映射" msgstr "没有活动的端口映射"
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "此装置默认 LAN" msgstr "此装置默认 LAN"
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "此装置默认 WAN" msgstr "此装置默认 WAN"
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "该端口已被使用" msgstr "该端口已被使用"
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "检测 NAT 行为需要先安装 <a href=\"%s\"><b>stuntman-client</b></a>" msgstr "检测 NAT 行为需要先安装 <a href=\"%s\"><b>stuntman-client</b></a>"
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "用户名" msgstr "用户名"
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "经由 natmap" msgstr "经由 natmap"
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "Web UI 端口" msgstr "Web UI 端口"
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "权重" msgstr "权重"
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "keep-alive 间隔 (秒)" msgstr "keep-alive 间隔 (秒)"
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "luci 检查可能无法检测到所有冲突" msgstr "luci 检查可能无法检测到所有冲突"
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+136 -128
View File
@@ -10,20 +10,20 @@ msgstr ""
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.15.1-dev\n" "X-Generator: Weblate 4.15.1-dev\n"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "%s set 0 will rewrite client listen port" msgid "%s set 0 will rewrite client listen port"
msgstr "%s 設為 0 將重寫用戶端監聽埠" msgstr "%s 設為 0 將重寫用戶端監聽埠"
#: htdocs/luci-static/resources/view/natmap.js:598 #: htdocs/luci-static/resources/view/natmap.js:602
#: htdocs/luci-static/resources/view/natmap.js:634 #: htdocs/luci-static/resources/view/natmap.js:638
msgid "<code># All external tokens required</code> Field" msgid "<code># All external tokens required</code> Field"
msgstr "<code># All external tokens required</code> 字段" msgstr "<code># All external tokens required</code> 字段"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
msgid "A Record" msgid "A Record"
msgstr "A 記錄" msgstr "A 記錄"
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
msgid "AAAA Record" msgid "AAAA Record"
msgstr "AAAA 記錄" msgstr "AAAA 記錄"
@@ -31,138 +31,146 @@ msgstr "AAAA 記錄"
msgid "Active NATMap Portmap" msgid "Active NATMap Portmap"
msgstr "活動的 NATMap 埠映射" msgstr "活動的 NATMap 埠映射"
#: htdocs/luci-static/resources/view/natmap.js:396 #: htdocs/luci-static/resources/view/natmap.js:400
msgid "Allocation ports randomly instead of sequentially." msgid "Allocation ports randomly instead of sequentially."
msgstr "隨機分配端口,而不是按順序分配。" msgstr "隨機分配端口,而不是按順序分配。"
#: htdocs/luci-static/resources/view/natmap.js:152 #: htdocs/luci-static/resources/view/natmap.js:156
#: htdocs/luci-static/resources/view/natmap.js:158 #: htdocs/luci-static/resources/view/natmap.js:162
msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>" msgid "Available server <a href=\"%s\" target=\"_blank\">references</a>"
msgstr "可用的伺服器<a href=\"%s\" target=\"_blank\">參考</a>" msgstr "可用的伺服器<a href=\"%s\" target=\"_blank\">參考</a>"
#: htdocs/luci-static/resources/view/natmap.js:381 #: htdocs/luci-static/resources/view/natmap.js:385
msgid "Bind port" msgid "Bind port"
msgstr "綁定埠" msgstr "綁定埠"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:151
#: htdocs/luci-static/resources/view/natmap.js:684 msgid "Boot delay"
msgstr "啟動延遲"
#: htdocs/luci-static/resources/view/natmap.js:679
#: htdocs/luci-static/resources/view/natmap.js:688
msgid "Can refer to RFC8552" msgid "Can refer to RFC8552"
msgstr "可以參考 RFC8552" msgstr "可以參考 RFC8552"
#: htdocs/luci-static/resources/view/natmap.js:267 #: htdocs/luci-static/resources/view/natmap.js:271
msgid "Check" msgid "Check"
msgstr "檢查" msgstr "檢查"
#: htdocs/luci-static/resources/view/natmap.js:266 #: htdocs/luci-static/resources/view/natmap.js:270
msgid "Check NAT Behavior" msgid "Check NAT Behavior"
msgstr "檢查 NAT 行為" msgstr "檢查 NAT 行為"
#: htdocs/luci-static/resources/view/natmap.js:334 #: htdocs/luci-static/resources/view/natmap.js:338
msgid "Comment" msgid "Comment"
msgstr "備註" msgstr "備註"
#: htdocs/luci-static/resources/view/natmap.js:302 #: htdocs/luci-static/resources/view/natmap.js:306
#: htdocs/luci-static/resources/view/natmap.js:755 #: htdocs/luci-static/resources/view/natmap.js:759
msgid "Custom Script" msgid "Custom Script"
msgstr "自定義腳本" msgstr "自定義腳本"
#: htdocs/luci-static/resources/view/natmap.js:301 #: htdocs/luci-static/resources/view/natmap.js:305
#: htdocs/luci-static/resources/view/natmap.js:620 #: htdocs/luci-static/resources/view/natmap.js:624
msgid "DDNS Scripts" msgid "DDNS Scripts"
msgstr "DDNS 腳本" msgstr "DDNS 腳本"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:167
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:447 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:451
msgid "Default" msgid "Default"
msgstr "默認" msgstr "默認"
#: htdocs/luci-static/resources/view/natmap.js:615 #: htdocs/luci-static/resources/view/natmap.js:152
msgid "Delay in seconds before starting the service."
msgstr "啟動服務前的延遲時間(秒)。"
#: htdocs/luci-static/resources/view/natmap.js:619
msgid "EnDDNS" msgid "EnDDNS"
msgstr "啟用DDNS" msgstr "啟用DDNS"
#: htdocs/luci-static/resources/view/natmap.js:579 #: htdocs/luci-static/resources/view/natmap.js:583
msgid "EnNotify" msgid "EnNotify"
msgstr "啟用通知" msgstr "啟用通知"
#: htdocs/luci-static/resources/view/natmap.js:147 #: htdocs/luci-static/resources/view/natmap.js:147
#: htdocs/luci-static/resources/view/natmap.js:304 #: htdocs/luci-static/resources/view/natmap.js:308
msgid "Enable" msgid "Enable"
msgstr "啟用" msgstr "啟用"
#: htdocs/luci-static/resources/view/natmap.js:288 #: htdocs/luci-static/resources/view/natmap.js:292
msgid "Expand/Collapse result" msgid "Expand/Collapse result"
msgstr "展開/折疊 結果" msgstr "展開/折疊 結果"
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "Expecting: %s" msgid "Expecting: %s"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:565 #: htdocs/luci-static/resources/view/natmap.js:569
msgid "External IP" msgid "External IP"
msgstr "外部 IP" msgstr "外部 IP"
#: htdocs/luci-static/resources/view/natmap.js:572 #: htdocs/luci-static/resources/view/natmap.js:576
msgid "External Port" msgid "External Port"
msgstr "外部通訊埠" msgstr "外部通訊埠"
#: htdocs/luci-static/resources/view/natmap.js:640 #: htdocs/luci-static/resources/view/natmap.js:644
#: htdocs/luci-static/resources/view/natmap.js:647 #: htdocs/luci-static/resources/view/natmap.js:651
#: htdocs/luci-static/resources/view/natmap.js:669 #: htdocs/luci-static/resources/view/natmap.js:673
#: htdocs/luci-static/resources/view/natmap.js:727 #: htdocs/luci-static/resources/view/natmap.js:731
msgid "FQDN" msgid "FQDN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:419 #: htdocs/luci-static/resources/view/natmap.js:423
msgid "Firewall DNAT" msgid "Firewall DNAT"
msgstr "防火牆 DNAT" msgstr "防火牆 DNAT"
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "For TCP mode" msgid "For TCP mode"
msgstr "用於 TCP 模式" msgstr "用於 TCP 模式"
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "For UDP mode" msgid "For UDP mode"
msgstr "用於 UDP 模式" msgstr "用於 UDP 模式"
#: htdocs/luci-static/resources/view/natmap.js:299 #: htdocs/luci-static/resources/view/natmap.js:303
msgid "Forward Settings" msgid "Forward Settings"
msgstr "轉發設定" msgstr "轉發設定"
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
msgid "Forward method" msgid "Forward method"
msgstr "轉發方法" msgstr "轉發方法"
#: htdocs/luci-static/resources/view/natmap.js:401 #: htdocs/luci-static/resources/view/natmap.js:405
msgid "Forward mode" msgid "Forward mode"
msgstr "轉發模式" msgstr "轉發模式"
#: htdocs/luci-static/resources/view/natmap.js:462 #: htdocs/luci-static/resources/view/natmap.js:466
msgid "Forward target" msgid "Forward target"
msgstr "轉發目標" msgstr "轉發目標"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Forward target port" msgid "Forward target port"
msgstr "轉發目標埠" msgstr "轉發目標埠"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Forward timeout" msgid "Forward timeout"
msgstr "轉發逾時" msgstr "轉發逾時"
#: htdocs/luci-static/resources/view/natmap.js:167 #: htdocs/luci-static/resources/view/natmap.js:171
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Fwmark value" msgid "Fwmark value"
msgstr " Fwmark 值" msgstr " Fwmark 值"
#: htdocs/luci-static/resources/view/natmap.js:298 #: htdocs/luci-static/resources/view/natmap.js:302
msgid "General Settings" msgid "General Settings"
msgstr "一般設定" msgstr "一般設定"
@@ -170,27 +178,27 @@ msgstr "一般設定"
msgid "Grant access to LuCI app natmap" msgid "Grant access to LuCI app natmap"
msgstr "授予訪問 LuCI 應用 natmap 的權限" msgstr "授予訪問 LuCI 應用 natmap 的權限"
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "HTTP keep-alive" msgid "HTTP keep-alive"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:325 #: htdocs/luci-static/resources/view/natmap.js:329
msgid "HTTP server" msgid "HTTP server"
msgstr "HTTP 伺服器" msgstr "HTTP 伺服器"
#: htdocs/luci-static/resources/view/natmap.js:714 #: htdocs/luci-static/resources/view/natmap.js:718
msgid "HTTPS Record" msgid "HTTPS Record"
msgstr "HTTPS 記錄" msgstr "HTTPS 記錄"
#: htdocs/luci-static/resources/view/natmap.js:349 #: htdocs/luci-static/resources/view/natmap.js:353
msgid "IPv4" msgid "IPv4"
msgstr "IPv4" msgstr "IPv4"
#: htdocs/luci-static/resources/view/natmap.js:350 #: htdocs/luci-static/resources/view/natmap.js:354
msgid "IPv6" msgid "IPv6"
msgstr "IPv6" msgstr "IPv6"
#: htdocs/luci-static/resources/view/natmap.js:383 #: htdocs/luci-static/resources/view/natmap.js:387
msgid "" msgid ""
"If you enable <b>Notify Scripts</b>, you will be bombarded with messages" "If you enable <b>Notify Scripts</b>, you will be bombarded with messages"
msgstr "如果您開啟了<b>通知腳本</b>, 將被大量訊息轟炸" msgstr "如果您開啟了<b>通知腳本</b>, 將被大量訊息轟炸"
@@ -203,23 +211,23 @@ msgstr "內部位址"
msgid "Inner Port" msgid "Inner Port"
msgstr "內部埠" msgstr "內部埠"
#: htdocs/luci-static/resources/view/natmap.js:374 #: htdocs/luci-static/resources/view/natmap.js:378
msgid "Interface" msgid "Interface"
msgstr "介面" msgstr "介面"
#: htdocs/luci-static/resources/view/natmap.js:310 #: htdocs/luci-static/resources/view/natmap.js:314
msgid "Keep-alive interval" msgid "Keep-alive interval"
msgstr "Keep-alive 間隔" msgstr "Keep-alive 間隔"
#: htdocs/luci-static/resources/view/natmap.js:330 #: htdocs/luci-static/resources/view/natmap.js:334
msgid "Mark fwmark for STUN/HTTP outbound traffic" msgid "Mark fwmark for STUN/HTTP outbound traffic"
msgstr "為 STUN/HTTP 出站流量標記 fwmark" msgstr "為 STUN/HTTP 出站流量標記 fwmark"
#: htdocs/luci-static/resources/view/natmap.js:439 #: htdocs/luci-static/resources/view/natmap.js:443
msgid "NAT loopback" msgid "NAT loopback"
msgstr "NAT 環回" msgstr "NAT 環回"
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "NATBehavior-Test port open on" msgid "NATBehavior-Test port open on"
msgstr "NATBehavior-Test 通訊埠打開於" msgstr "NATBehavior-Test 通訊埠打開於"
@@ -232,24 +240,24 @@ msgstr "NATMap"
msgid "Name" msgid "Name"
msgstr "名称" msgstr "名称"
#: htdocs/luci-static/resources/view/natmap.js:415 #: htdocs/luci-static/resources/view/natmap.js:419
#: htdocs/luci-static/resources/view/natmap.js:491 #: htdocs/luci-static/resources/view/natmap.js:495
#: htdocs/luci-static/resources/view/natmap.js:514 #: htdocs/luci-static/resources/view/natmap.js:518
msgid "No" msgid "No"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:390 #: htdocs/luci-static/resources/view/natmap.js:394
msgid "Non-0 port" msgid "Non-0 port"
msgstr "非 0 埠" msgstr "非 0 埠"
#: htdocs/luci-static/resources/view/natmap.js:382 #: htdocs/luci-static/resources/view/natmap.js:386
msgid "" msgid ""
"Note: After using <code>portrange</code>, the public ports will be opened in " "Note: After using <code>portrange</code>, the public ports will be opened in "
"rotation</br>" "rotation</br>"
msgstr "注意: 使用 <code>portrange</code> 後, 會輪換打開公網埠</br>" msgstr "注意: 使用 <code>portrange</code> 後, 會輪換打開公網埠</br>"
#: htdocs/luci-static/resources/view/natmap.js:300 #: htdocs/luci-static/resources/view/natmap.js:304
#: htdocs/luci-static/resources/view/natmap.js:584 #: htdocs/luci-static/resources/view/natmap.js:588
msgid "Notify Scripts" msgid "Notify Scripts"
msgstr "通知腳本" msgstr "通知腳本"
@@ -261,44 +269,44 @@ msgstr "外部位址"
msgid "Outer Port" msgid "Outer Port"
msgstr "外部通訊埠" msgstr "外部通訊埠"
#: htdocs/luci-static/resources/view/natmap.js:559 #: htdocs/luci-static/resources/view/natmap.js:563
msgid "Password" msgid "Password"
msgstr "密碼" msgstr "密碼"
#: htdocs/luci-static/resources/view/natmap.js:185 #: htdocs/luci-static/resources/view/natmap.js:189
msgid "" msgid ""
"Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port " "Please check <a href=\"%s\"><b>Firewall Rules</b></a> to avoid port "
"conflicts.</br>" "conflicts.</br>"
msgstr "請檢查<a href=\"%s\"><b>防火牆規則</b></a>以避免埠衝突</br>" msgstr "請檢查<a href=\"%s\"><b>防火牆規則</b></a>以避免埠衝突</br>"
#: htdocs/luci-static/resources/view/natmap.js:455 #: htdocs/luci-static/resources/view/natmap.js:459
msgid "Port forwarding session idle timeout in seconds" msgid "Port forwarding session idle timeout in seconds"
msgstr "連接埠轉發會話空閒逾時 (以秒為單位)" msgstr "連接埠轉發會話空閒逾時 (以秒為單位)"
#: htdocs/luci-static/resources/view/natmap.js:700 #: htdocs/luci-static/resources/view/natmap.js:704
#: htdocs/luci-static/resources/view/natmap.js:748 #: htdocs/luci-static/resources/view/natmap.js:752
msgid "Priority" msgid "Priority"
msgstr "優先權" msgstr "優先權"
#: htdocs/luci-static/resources/view/natmap.js:604 #: htdocs/luci-static/resources/view/natmap.js:608
msgid "Private API Domain" msgid "Private API Domain"
msgstr "私有 API 域名" msgstr "私有 API 域名"
#: htdocs/luci-static/resources/view/natmap.js:337 #: htdocs/luci-static/resources/view/natmap.js:341
#: htdocs/luci-static/resources/view/natmap.js:684 #: htdocs/luci-static/resources/view/natmap.js:688
#: htdocs/luci-static/resources/view/status/include/72_natmap.js:60 #: htdocs/luci-static/resources/view/status/include/72_natmap.js:60
msgid "Protocol" msgid "Protocol"
msgstr "協議" msgstr "協議"
#: htdocs/luci-static/resources/view/natmap.js:395 #: htdocs/luci-static/resources/view/natmap.js:399
msgid "Randomly allocation ports" msgid "Randomly allocation ports"
msgstr "隨機分配端口" msgstr "隨機分配端口"
#: htdocs/luci-static/resources/view/natmap.js:524 #: htdocs/luci-static/resources/view/natmap.js:528
msgid "Refresh Scripts" msgid "Refresh Scripts"
msgstr "用戶端更新腳本" msgstr "用戶端更新腳本"
#: htdocs/luci-static/resources/view/natmap.js:517 #: htdocs/luci-static/resources/view/natmap.js:521
msgid "Refresh client" msgid "Refresh client"
msgstr "更新用戶端" msgstr "更新用戶端"
@@ -307,74 +315,74 @@ msgstr "更新用戶端"
msgid "Reload" msgid "Reload"
msgstr "重新載入" msgstr "重新載入"
#: htdocs/luci-static/resources/view/natmap.js:347 #: htdocs/luci-static/resources/view/natmap.js:351
msgid "Restrict to address family" msgid "Restrict to address family"
msgstr "限制到位址群" msgstr "限制到位址群"
#: htdocs/luci-static/resources/view/natmap.js:654 #: htdocs/luci-static/resources/view/natmap.js:658
msgid "SRV Record" msgid "SRV Record"
msgstr "SRV 記錄" msgstr "SRV 記錄"
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:315 #: htdocs/luci-static/resources/view/natmap.js:319
msgid "STUN check cycle (once every n intervals)" msgid "STUN check cycle (once every n intervals)"
msgstr "STUN 檢查週期 (每 n 個間隔一次)" msgstr "STUN 檢查週期 (每 n 個間隔一次)"
#: htdocs/luci-static/resources/view/natmap.js:320 #: htdocs/luci-static/resources/view/natmap.js:324
msgid "STUN server" msgid "STUN server"
msgstr "STUN 伺服器" msgstr "STUN 伺服器"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
#: htdocs/luci-static/resources/view/natmap.js:163 #: htdocs/luci-static/resources/view/natmap.js:167
msgid "Server" msgid "Server"
msgstr "伺服器" msgstr "伺服器"
#: htdocs/luci-static/resources/view/natmap.js:675 #: htdocs/luci-static/resources/view/natmap.js:679
msgid "Service" msgid "Service"
msgstr "服務" msgstr "服務"
#: htdocs/luci-static/resources/view/natmap.js:494 #: htdocs/luci-static/resources/view/natmap.js:498
msgid "Set 0 will follow Public port" msgid "Set 0 will follow Public port"
msgstr "設為 0 將遵循公共埠" msgstr "設為 0 將遵循公共埠"
#: htdocs/luci-static/resources/view/natmap.js:741 #: htdocs/luci-static/resources/view/natmap.js:745
msgid "SvcParams" msgid "SvcParams"
msgstr "服務參數" msgstr "服務參數"
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:685 #: htdocs/luci-static/resources/view/natmap.js:689
msgid "TCP" msgid "TCP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:446 #: htdocs/luci-static/resources/view/natmap.js:450
msgid "TCP Congestion control" msgid "TCP Congestion control"
msgstr "TCP 擁塞控制" msgstr "TCP 擁塞控制"
#: htdocs/luci-static/resources/view/natmap.js:151 #: htdocs/luci-static/resources/view/natmap.js:155
msgid "TCP STUN" msgid "TCP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:687 #: htdocs/luci-static/resources/view/natmap.js:691
msgid "TLS" msgid "TLS"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:693 #: htdocs/luci-static/resources/view/natmap.js:697
#: htdocs/luci-static/resources/view/natmap.js:733 #: htdocs/luci-static/resources/view/natmap.js:737
msgid "Target" msgid "Target"
msgstr "目標" msgstr "目標"
#: htdocs/luci-static/resources/view/natmap.js:610 #: htdocs/luci-static/resources/view/natmap.js:614
msgid "Text content" msgid "Text content"
msgstr "文本內容" msgstr "文本內容"
#: htdocs/luci-static/resources/view/natmap.js:418 #: htdocs/luci-static/resources/view/natmap.js:422
#: htdocs/luci-static/resources/view/natmap.js:434 #: htdocs/luci-static/resources/view/natmap.js:438
msgid "The DNAT method not support under IPv6" msgid "The DNAT method not support under IPv6"
msgstr "DNAT 方法不支援在 IPv6 下使用" msgstr "DNAT 方法不支援在 IPv6 下使用"
#: htdocs/luci-static/resources/view/natmap.js:595 #: htdocs/luci-static/resources/view/natmap.js:599
#: htdocs/luci-static/resources/view/natmap.js:631 #: htdocs/luci-static/resources/view/natmap.js:635
msgid "" msgid ""
"The KEY required by the script above. See <a href=\"%s\" " "The KEY required by the script above. See <a href=\"%s\" "
"target=\"_blank\">%s</a> for the format of KEY required by each script. Add " "target=\"_blank\">%s</a> for the format of KEY required by each script. Add "
@@ -384,7 +392,7 @@ msgstr ""
"上面腳本所需的 KEY。請參閱 <a href=\"%s\" target=\"_blank\">%s</a> 以獲得對應" "上面腳本所需的 KEY。請參閱 <a href=\"%s\" target=\"_blank\">%s</a> 以獲得對應"
"腳本所需的 KEY 清單。請輸入格式為 KEY=VAL 的多個 KEY 條目" "腳本所需的 KEY 清單。請輸入格式為 KEY=VAL 的多個 KEY 條目"
#: htdocs/luci-static/resources/view/natmap.js:471 #: htdocs/luci-static/resources/view/natmap.js:475
msgid "The hostname not support under DNAT mode" msgid "The hostname not support under DNAT mode"
msgstr "DNAT 模式下不支援主機名" msgstr "DNAT 模式下不支援主機名"
@@ -392,84 +400,84 @@ msgstr "DNAT 模式下不支援主機名"
msgid "There are no active portmap" msgid "There are no active portmap"
msgstr "沒有活動的通訊埠映射" msgstr "沒有活動的通訊埠映射"
#: htdocs/luci-static/resources/view/natmap.js:366 #: htdocs/luci-static/resources/view/natmap.js:370
#: htdocs/luci-static/resources/view/natmap.js:464 #: htdocs/luci-static/resources/view/natmap.js:468
msgid "This device default Lan" msgid "This device default Lan"
msgstr "本裝置默認 LAN" msgstr "本裝置默認 LAN"
#: htdocs/luci-static/resources/view/natmap.js:367 #: htdocs/luci-static/resources/view/natmap.js:371
#: htdocs/luci-static/resources/view/natmap.js:465 #: htdocs/luci-static/resources/view/natmap.js:469
msgid "This device default Wan" msgid "This device default Wan"
msgstr "本裝置默認 WAN" msgstr "本裝置默認 WAN"
#: htdocs/luci-static/resources/view/natmap.js:199 #: htdocs/luci-static/resources/view/natmap.js:203
#: htdocs/luci-static/resources/view/natmap.js:208 #: htdocs/luci-static/resources/view/natmap.js:212
msgid "This port is already used" msgid "This port is already used"
msgstr "該埠已被使用" msgstr "該埠已被使用"
#: htdocs/luci-static/resources/view/natmap.js:270 #: htdocs/luci-static/resources/view/natmap.js:274
msgid "" msgid ""
"To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</" "To check NAT Behavior you need to install <a href=\"%s\"><b>stuntman-client</"
"b></a> first" "b></a> first"
msgstr "檢查 NAT 行為需要先安裝 <a href=\"%s\"><b>stuntman-client</b></a>" msgstr "檢查 NAT 行為需要先安裝 <a href=\"%s\"><b>stuntman-client</b></a>"
#: htdocs/luci-static/resources/view/natmap.js:594 #: htdocs/luci-static/resources/view/natmap.js:598
#: htdocs/luci-static/resources/view/natmap.js:630 #: htdocs/luci-static/resources/view/natmap.js:634
msgid "Tokens" msgid "Tokens"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
#: htdocs/luci-static/resources/view/natmap.js:180 #: htdocs/luci-static/resources/view/natmap.js:184
#: htdocs/luci-static/resources/view/natmap.js:686 #: htdocs/luci-static/resources/view/natmap.js:690
msgid "UDP" msgid "UDP"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:157 #: htdocs/luci-static/resources/view/natmap.js:161
msgid "UDP STUN" msgid "UDP STUN"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:536 #: htdocs/luci-static/resources/view/natmap.js:540
msgid "URI Scheme" msgid "URI Scheme"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:553 #: htdocs/luci-static/resources/view/natmap.js:557
msgid "Username" msgid "Username"
msgstr "用戶名" msgstr "用戶名"
#: htdocs/luci-static/resources/view/natmap.js:420 #: htdocs/luci-static/resources/view/natmap.js:424
msgid "Via natmap" msgid "Via natmap"
msgstr "經由 natmap" msgstr "經由 natmap"
#: htdocs/luci-static/resources/view/natmap.js:545 #: htdocs/luci-static/resources/view/natmap.js:549
msgid "Web UI Port" msgid "Web UI Port"
msgstr "Web UI 通訊埠" msgstr "Web UI 通訊埠"
#: htdocs/luci-static/resources/view/natmap.js:707 #: htdocs/luci-static/resources/view/natmap.js:711
msgid "Weight" msgid "Weight"
msgstr "權重" msgstr "權重"
#: htdocs/luci-static/resources/view/natmap.js:159 #: htdocs/luci-static/resources/view/natmap.js:163
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780." "https://github.com/muink/rfc5780-stun-server/blob/master/valid_hosts_rfc5780."
"txt" "txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:153 #: htdocs/luci-static/resources/view/natmap.js:157
msgid "" msgid ""
"https://github.com/muink/rfc5780-stun-server/blob/master/" "https://github.com/muink/rfc5780-stun-server/blob/master/"
"valid_hosts_rfc5780_tcp.txt" "valid_hosts_rfc5780_tcp.txt"
msgstr "" msgstr ""
#: htdocs/luci-static/resources/view/natmap.js:170 #: htdocs/luci-static/resources/view/natmap.js:174
#: htdocs/luci-static/resources/view/natmap.js:175 #: htdocs/luci-static/resources/view/natmap.js:179
msgid "keep-alive interval (seconds)" msgid "keep-alive interval (seconds)"
msgstr "keep-alive 間隔 (秒)" msgstr "keep-alive 間隔 (秒)"
#: htdocs/luci-static/resources/view/natmap.js:187 #: htdocs/luci-static/resources/view/natmap.js:191
msgid "luci check may not detect all conflicts." msgid "luci check may not detect all conflicts."
msgstr "luci 檢查可能無法檢測到所有衝突" msgstr "luci 檢查可能無法檢測到所有衝突"
#: htdocs/luci-static/resources/view/natmap.js:760 #: htdocs/luci-static/resources/view/natmap.js:764
msgid "⭮" msgid "⭮"
msgstr "" msgstr ""
+2 -2
View File
@@ -7,8 +7,8 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall PKG_NAME:=luci-app-passwall
PKG_VERSION:=26.9.9 PKG_VERSION:=26.9.16
PKG_RELEASE:=275 PKG_RELEASE:=276
PKG_PO_VERSION:=$(PKG_VERSION) PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \ PKG_CONFIG_DEPENDS:= \
@@ -707,16 +707,6 @@ o = s:option(Value, "ws_path", translate("WebSocket Path"))
o.placeholder = "/" o.placeholder = "/"
o:depends({ transport = "ws" }) o:depends({ transport = "ws" })
o = s:option(Flag, "ws_enableEarlyData", translate("Enable early data"))
o:depends({ transport = "ws" })
o = s:option(Value, "ws_maxEarlyData", translate("Early data length"))
o.default = "1024"
o:depends({ ws_enableEarlyData = true })
o = s:option(Value, "ws_earlyDataHeaderName", translate("Early data header name"), translate("Recommended value: Sec-WebSocket-Protocol"))
o:depends({ ws_enableEarlyData = true })
-- [[ HTTPUpgrade部分 ]]-- -- [[ HTTPUpgrade部分 ]]--
o = s:option(Value, "httpupgrade_host", translate("HTTPUpgrade Host")) o = s:option(Value, "httpupgrade_host", translate("HTTPUpgrade Host"))
o:depends({ transport = "httpupgrade" }) o:depends({ transport = "httpupgrade" })
@@ -399,6 +399,10 @@ o:depends({ transport = "ws" })
o = s:option(Value, "ws_path", translate("WebSocket Path")) o = s:option(Value, "ws_path", translate("WebSocket Path"))
o:depends({ transport = "ws" }) o:depends({ transport = "ws" })
o = s:option(Value, "ws_earlyDataHeaderName", translate("Early data header name"), translate("Recommended value: Sec-WebSocket-Protocol"))
o.placeholder = "Sec-WebSocket-Protocol"
o:depends({ transport = "ws" })
-- [[ HTTPUpgrade部分 ]]-- -- [[ HTTPUpgrade部分 ]]--
o = s:option(Value, "httpupgrade_host", translate("HTTPUpgrade Host")) o = s:option(Value, "httpupgrade_host", translate("HTTPUpgrade Host"))
@@ -347,9 +347,20 @@ function gen_outbound(flag, node, tag, proxy_table)
Host = node.ws_host, Host = node.ws_host,
["User-Agent"] = node.user_agent ["User-Agent"] = node.user_agent
} or nil, } or nil,
max_early_data = tonumber(node.ws_maxEarlyData) or nil,
early_data_header_name = (node.ws_earlyDataHeaderName) and node.ws_earlyDataHeaderName or nil --要与 Xray-core 兼容,请将其设置为 Sec-WebSocket-Protocol。它需要与服务器保持一致。
} }
local path = api.UrlDecode(node.ws_path)
local path_dat = api.split(path, "?")
local params = {}
for _, v in pairs(api.split(path_dat[2], '&')) do
local t = api.split(v, '=')
params[t[1]] = t[2]
end
local ed = tonumber(params.ed)
if ed then
v2ray_transport.path = path_dat[1]
v2ray_transport.max_early_data = ed
end
v2ray_transport.early_data_header_name = params.eh or "Sec-WebSocket-Protocol"
end end
if node.transport == "httpupgrade" then if node.transport == "httpupgrade" then
@@ -762,7 +773,7 @@ function gen_config_server(node)
type = "ws", type = "ws",
path = node.ws_path or "/", path = node.ws_path or "/",
headers = (node.ws_host ~= nil) and { Host = node.ws_host } or nil, headers = (node.ws_host ~= nil) and { Host = node.ws_host } or nil,
early_data_header_name = (node.ws_earlyDataHeaderName) and node.ws_earlyDataHeaderName or nil --要与 Xray-core 兼容,请将其设置为 Sec-WebSocket-Protocol。它需要与服务器保持一致。 early_data_header_name = (node.ws_earlyDataHeaderName) and node.ws_earlyDataHeaderName or "Sec-WebSocket-Protocol"
} }
end end
@@ -249,10 +249,6 @@ local current_node = map:get(section)
if (v_transport === "ws") { if (v_transport === "ws") {
params += opt.query("host", dom_prefix + "ws_host"); params += opt.query("host", dom_prefix + "ws_host");
params += opt.query("path", dom_prefix + "ws_path"); params += opt.query("path", dom_prefix + "ws_path");
if (v_type == "sing-box" && opt.get(dom_prefix + "ws_enableEarlyData").checked) {
var ws_maxEarlyData = opt.get(dom_prefix + "ws_maxEarlyData").value;
params += "?ed=" + ws_maxEarlyData;
}
} else if (v_transport === "http") { } else if (v_transport === "http") {
params += opt.query("host", dom_prefix + "http_host"); params += opt.query("host", dom_prefix + "http_host");
params += opt.query("path", dom_prefix + "http_path"); params += opt.query("path", dom_prefix + "http_path");
@@ -371,10 +367,6 @@ local current_node = map:get(section)
if (v_transport === "ws") { if (v_transport === "ws") {
info.host = opt.get(dom_prefix + "ws_host").value; info.host = opt.get(dom_prefix + "ws_host").value;
info.path = opt.get(dom_prefix + "ws_path").value; info.path = opt.get(dom_prefix + "ws_path").value;
if (v_type == "sing-box" && opt.get(dom_prefix + "ws_enableEarlyData").checked) {
var ws_maxEarlyData = opt.get(dom_prefix + "ws_maxEarlyData").value;
info.path = info.path + "?ed=" + ws_maxEarlyData;
}
} else if (v_transport === "http") { } else if (v_transport === "http") {
info.host = opt.get(dom_prefix + "http_host").value; info.host = opt.get(dom_prefix + "http_host").value;
info.path = opt.get(dom_prefix + "http_path").value; info.path = opt.get(dom_prefix + "http_path").value;
@@ -431,10 +423,6 @@ local current_node = map:get(section)
if (v_transport === "ws") { if (v_transport === "ws") {
params += opt.query("host", dom_prefix + "ws_host"); params += opt.query("host", dom_prefix + "ws_host");
params += opt.query("path", dom_prefix + "ws_path"); params += opt.query("path", dom_prefix + "ws_path");
if (v_type == "sing-box" && opt.get(dom_prefix + "ws_enableEarlyData").checked) {
var ws_maxEarlyData = opt.get(dom_prefix + "ws_maxEarlyData").value;
params += encodeURIComponent("?ed=" + ws_maxEarlyData);
}
} else if (v_transport === "http") { } else if (v_transport === "http") {
params += opt.query("host", dom_prefix + "http_host"); params += opt.query("host", dom_prefix + "http_host");
params += opt.query("path", dom_prefix + "http_path"); params += opt.query("path", dom_prefix + "http_path");
@@ -523,10 +511,6 @@ local current_node = map:get(section)
if (v_transport === "ws") { if (v_transport === "ws") {
params += opt.query("host", dom_prefix + "ws_host"); params += opt.query("host", dom_prefix + "ws_host");
params += opt.query("path", dom_prefix + "ws_path"); params += opt.query("path", dom_prefix + "ws_path");
if (v_type == "sing-box" && opt.get(dom_prefix + "ws_enableEarlyData").checked) {
var ws_maxEarlyData = opt.get(dom_prefix + "ws_maxEarlyData").value;
params += "?ed=" + ws_maxEarlyData;
}
} else if (v_transport === "http") { } else if (v_transport === "http") {
params += opt.query("host", dom_prefix + "http_host"); params += opt.query("host", dom_prefix + "http_host");
params += opt.query("path", dom_prefix + "http_path"); params += opt.query("path", dom_prefix + "http_path");
@@ -1085,24 +1069,6 @@ local current_node = map:get(section)
} else if (queryParam.type === "ws") { } else if (queryParam.type === "ws") {
opt.set(dom_prefix + 'ws_host', queryParam.host || ""); opt.set(dom_prefix + 'ws_host', queryParam.host || "");
opt.set(dom_prefix + 'ws_path', queryParam.path || ""); opt.set(dom_prefix + 'ws_path', queryParam.path || "");
if (dom_prefix == "singbox_" && queryParam.path && queryParam.path.length > 1) {
var ws_path_params = {};
var ws_path_dat = queryParam.path.split('?');
var ws_path = ws_path_dat[0];
var ws_path_params = {};
var ws_path_params_array = (ws_path_dat[1] || '').split('&');
for (i = 0; i < ws_path_params_array.length; i++) {
var kv = ws_path_params_array[i].split('=');
ws_path_params[decodeURIComponent(kv[0]).toLowerCase()] = decodeURIComponent(kv[1] || '');
}
if (ws_path_params.ed) {
opt.set(dom_prefix + 'ws_path', ws_path);
opt.set(dom_prefix + 'ws_enableEarlyData', true);
opt.set(dom_prefix + 'ws_maxEarlyData', ws_path_params.ed);
opt.set(dom_prefix + 'ws_earlyDataHeaderName', 'Sec-WebSocket-Protocol');
}
}
} else if (queryParam.type === "http") { } else if (queryParam.type === "http") {
if (dom_prefix == "xray_") { if (dom_prefix == "xray_") {
opt.set(dom_prefix + 'xhttp_mode', "stream-one"); opt.set(dom_prefix + 'xhttp_mode', "stream-one");
@@ -1232,24 +1198,6 @@ local current_node = map:get(section)
} else if (queryParam.type === "ws") { } else if (queryParam.type === "ws") {
opt.set(dom_prefix + 'ws_host', queryParam.host || ""); opt.set(dom_prefix + 'ws_host', queryParam.host || "");
opt.set(dom_prefix + 'ws_path', queryParam.path || ""); opt.set(dom_prefix + 'ws_path', queryParam.path || "");
if (dom_prefix == "singbox_" && queryParam.path && queryParam.path.length > 1) {
var ws_path_params = {};
var ws_path_dat = queryParam.path.split('?');
var ws_path = ws_path_dat[0];
var ws_path_params = {};
var ws_path_params_array = (ws_path_dat[1] || '').split('&');
for (i = 0; i < ws_path_params_array.length; i++) {
var kv = ws_path_params_array[i].split('=');
ws_path_params[decodeURIComponent(kv[0]).toLowerCase()] = decodeURIComponent(kv[1] || '');
}
if (ws_path_params.ed) {
opt.set(dom_prefix + 'ws_path', ws_path);
opt.set(dom_prefix + 'ws_enableEarlyData', true);
opt.set(dom_prefix + 'ws_maxEarlyData', ws_path_params.ed);
opt.set(dom_prefix + 'ws_earlyDataHeaderName', 'Sec-WebSocket-Protocol');
}
}
} else if (queryParam.type === "http") { } else if (queryParam.type === "http") {
if (dom_prefix == "xray_") { if (dom_prefix == "xray_") {
opt.set(dom_prefix + 'xhttp_mode', "stream-one"); opt.set(dom_prefix + 'xhttp_mode', "stream-one");
@@ -1374,24 +1322,6 @@ local current_node = map:get(section)
} else if (ssm.net === "ws") { } else if (ssm.net === "ws") {
opt.set(dom_prefix + 'ws_host', ssm.host); opt.set(dom_prefix + 'ws_host', ssm.host);
opt.set(dom_prefix + 'ws_path', ssm.path); opt.set(dom_prefix + 'ws_path', ssm.path);
if (dom_prefix == "singbox_" && ssm.path && ssm.path.length > 1) {
var ws_path_params = {};
var ws_path_dat = ssm.path.split('?');
var ws_path = ws_path_dat[0];
var ws_path_params = {};
var ws_path_params_array = (ws_path_dat[1] || '').split('&');
for (i = 0; i < ws_path_params_array.length; i++) {
var kv = ws_path_params_array[i].split('=');
ws_path_params[decodeURIComponent(kv[0]).toLowerCase()] = decodeURIComponent(kv[1] || '');
}
if (ws_path_params.ed) {
opt.set(dom_prefix + 'ws_path', ws_path);
opt.set(dom_prefix + 'ws_enableEarlyData', true);
opt.set(dom_prefix + 'ws_maxEarlyData', ws_path_params.ed);
opt.set(dom_prefix + 'ws_earlyDataHeaderName', 'Sec-WebSocket-Protocol');
}
}
} else if (ssm.net === "http") { } else if (ssm.net === "http") {
if (dom_prefix == "xray_") { if (dom_prefix == "xray_") {
opt.set(dom_prefix + 'xhttp_mode', "stream-one"); opt.set(dom_prefix + 'xhttp_mode', "stream-one");
@@ -1517,24 +1447,6 @@ local current_node = map:get(section)
} else if (queryParam.type === "ws") { } else if (queryParam.type === "ws") {
opt.set(dom_prefix + 'ws_host', queryParam.host || ""); opt.set(dom_prefix + 'ws_host', queryParam.host || "");
opt.set(dom_prefix + 'ws_path', queryParam.path || ""); opt.set(dom_prefix + 'ws_path', queryParam.path || "");
if (dom_prefix == "singbox_" && queryParam.path && queryParam.path.length > 1) {
var ws_path_params = {};
var ws_path_dat = queryParam.path.split('?');
var ws_path = ws_path_dat[0];
var ws_path_params = {};
var ws_path_params_array = (ws_path_dat[1] || '').split('&');
for (i = 0; i < ws_path_params_array.length; i++) {
var kv = ws_path_params_array[i].split('=');
ws_path_params[decodeURIComponent(kv[0]).toLowerCase()] = decodeURIComponent(kv[1] || '');
}
if (ws_path_params.ed) {
opt.set(dom_prefix + 'ws_path', ws_path);
opt.set(dom_prefix + 'ws_enableEarlyData', true);
opt.set(dom_prefix + 'ws_maxEarlyData', ws_path_params.ed);
opt.set(dom_prefix + 'ws_earlyDataHeaderName', 'Sec-WebSocket-Protocol');
}
}
} else if (queryParam.type === "h2" || queryParam.type === "http") { } else if (queryParam.type === "h2" || queryParam.type === "http") {
if (dom_prefix == "xray_") { if (dom_prefix == "xray_") {
opt.set(dom_prefix + 'xhttp_mode', "stream-one"); opt.set(dom_prefix + 'xhttp_mode', "stream-one");
-6
View File
@@ -1757,12 +1757,6 @@ msgstr "XUDP 最大并发连接数"
msgid "Padding" msgid "Padding"
msgstr "填充" msgstr "填充"
msgid "Enable early data"
msgstr "启用前置数据"
msgid "Early data length"
msgstr "前置数据最大长度"
msgid "Early data header name" msgid "Early data header name"
msgstr "前置数据 HTTP 头名" msgstr "前置数据 HTTP 头名"
@@ -88,7 +88,16 @@ local function build_common(node)
if net == "ws" then if net == "ws" then
local opts = node["ws-opts"] local opts = node["ws-opts"]
if opts then if opts then
o.transport.path = opts.path local path = opts.path or "/"
local ed = opts["max-early-data"]
local eh = opts["early-data-header-name"]
if ed then
path = path .. "?ed=" .. ed
end
if eh then
path = path .. (path:find("?", 1, true) and "&eh=" or "?eh=") .. eh
end
o.transport.path = path
o.transport.host = opts.headers and opts.headers.Host o.transport.host = opts.headers and opts.headers.Host
end end
@@ -641,21 +641,6 @@ local function processData(szType, content, add_mode, group, sub_cfg)
if info.net == 'ws' then if info.net == 'ws' then
result.ws_host = info.host result.ws_host = info.host
result.ws_path = info.path result.ws_path = info.path
if result.type == "sing-box" and info.path then
local ws_path_dat = split(info.path, "?")
local ws_path = ws_path_dat[1]
local ws_path_params = {}
for _, v in pairs(split(ws_path_dat[2], '&')) do
local t = split(v, '=')
ws_path_params[t[1]] = t[2]
end
if ws_path_params.ed and tonumber(ws_path_params.ed) then
result.ws_path = ws_path
result.ws_enableEarlyData = "1"
result.ws_maxEarlyData = tonumber(ws_path_params.ed)
result.ws_earlyDataHeaderName = "Sec-WebSocket-Protocol"
end
end
end end
if info.net == "http" then if info.net == "http" then
if result.type == "Xray" then if result.type == "Xray" then
@@ -897,21 +882,6 @@ local function processData(szType, content, add_mode, group, sub_cfg)
if params.type == 'ws' then if params.type == 'ws' then
result.ws_host = params.host result.ws_host = params.host
result.ws_path = params.path result.ws_path = params.path
if result.type == "sing-box" and params.path then
local ws_path_dat = split(params.path, "%?")
local ws_path = ws_path_dat[1]
local ws_path_params = {}
for _, v in pairs(split(ws_path_dat[2], '&')) do
local t = split(v, '=')
ws_path_params[t[1]] = t[2]
end
if ws_path_params.ed and tonumber(ws_path_params.ed) then
result.ws_path = ws_path
result.ws_enableEarlyData = "1"
result.ws_maxEarlyData = tonumber(ws_path_params.ed)
result.ws_earlyDataHeaderName = "Sec-WebSocket-Protocol"
end
end
end end
if params.type == "http" then if params.type == "http" then
if result.type == "sing-box" then if result.type == "sing-box" then
@@ -1124,21 +1094,6 @@ local function processData(szType, content, add_mode, group, sub_cfg)
if params.type == 'ws' then if params.type == 'ws' then
result.ws_host = params.host result.ws_host = params.host
result.ws_path = params.path result.ws_path = params.path
if result.type == "sing-box" and params.path then
local ws_path_dat = split(params.path, "%?")
local ws_path = ws_path_dat[1]
local ws_path_params = {}
for _, v in pairs(split(ws_path_dat[2], '&')) do
local t = split(v, '=')
ws_path_params[t[1]] = t[2]
end
if ws_path_params.ed and tonumber(ws_path_params.ed) then
result.ws_path = ws_path
result.ws_enableEarlyData = "1"
result.ws_maxEarlyData = tonumber(ws_path_params.ed)
result.ws_earlyDataHeaderName = "Sec-WebSocket-Protocol"
end
end
end end
if params.type == "http" then if params.type == "http" then
if result.type == "sing-box" then if result.type == "sing-box" then
@@ -1266,21 +1221,6 @@ local function processData(szType, content, add_mode, group, sub_cfg)
if params.type == 'ws' then if params.type == 'ws' then
result.ws_host = params.host result.ws_host = params.host
result.ws_path = params.path result.ws_path = params.path
if result.type == "sing-box" and params.path then
local ws_path_dat = split(params.path, "%?")
local ws_path = ws_path_dat[1]
local ws_path_params = {}
for _, v in pairs(split(ws_path_dat[2], '&')) do
local t = split(v, '=')
ws_path_params[t[1]] = t[2]
end
if ws_path_params.ed and tonumber(ws_path_params.ed) then
result.ws_path = ws_path
result.ws_enableEarlyData = "1"
result.ws_maxEarlyData = tonumber(ws_path_params.ed)
result.ws_earlyDataHeaderName = "Sec-WebSocket-Protocol"
end
end
end end
if params.type == "http" then if params.type == "http" then
if result.type == "sing-box" then if result.type == "sing-box" then
+2 -2
View File
@@ -6,8 +6,8 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall2 PKG_NAME:=luci-app-passwall2
PKG_VERSION:=26.9.12 PKG_VERSION:=26.9.16
PKG_RELEASE:=124 PKG_RELEASE:=125
PKG_PO_VERSION:=$(PKG_VERSION) PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \ PKG_CONFIG_DEPENDS:= \
+1 -1
View File
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-temp-status PKG_NAME:=luci-app-temp-status
PKG_VERSION:=0.8.1 PKG_VERSION:=0.8.1
PKG_RELEASE:=3 PKG_RELEASE:=4
LUCI_TITLE:=Temperature sensors data for the LuCI status page LUCI_TITLE:=Temperature sensors data for the LuCI status page
LUCI_DEPENDS:=+ucode +ucode-mod-fs LUCI_DEPENDS:=+ucode +ucode-mod-fs
LUCI_PKGARCH:=all LUCI_PKGARCH:=all
+52
View File
@@ -0,0 +1,52 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: egemen <95934830+projectaccc@users.noreply.github.com>\n"
"Language-Team: \n"
"Language: tr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.9\n"
msgid "(%d minute window, %d second interval)"
msgstr "(%d dakikalık aralık, %d saniyelik sıklık)"
msgid "Average:"
msgstr "Ortalama:"
msgid "Hide"
msgstr "Gizle"
msgid "Hot:"
msgstr "Sıcak:"
msgid "Minimum:"
msgstr "En Düşük:"
msgid "No temperature sensors available"
msgstr "Kullanılabilir sıcaklık sensörü yok"
msgid "Overheat:"
msgstr "Aşırı Isınma:"
msgid "Peak:"
msgstr "En Yüksek:"
msgid "Sensor"
msgstr "Sensör"
msgid "Show hidden sensors"
msgstr "Gizlenmiş sensörleri göster"
msgid "Switch view"
msgstr "Görünümü değiştir"
msgid "Temperature"
msgstr "Sıcaklık"
msgid "This page displays the temperature sensors data."
msgstr "Bu sayfada sıcaklık sensörü verileri görüntülenir."
@@ -0,0 +1,116 @@
---
name: aurora-motion
description: Use when a change adds, removes or adjusts motion in the Aurora theme (transition, animation, View Transition, hover/press/focus feedback, menu or drawer timing, 动效/动画/过渡/丝滑) or when a request asks "what should this state look like when it changes". Maps each LuCI UI state to one effect (CSS animates, JS only decides when and how far), keeps main.css and the theme JS from growing, and rejects motion that janks a phone or replays on poll.
---
# Aurora motion: which state gets which effect
## First principles
1. **The device is small.** The router has little RAM and flash, and it serves every byte uncompressed. Motion must not grow the theme. Decorative motion must be net ≤ 0 bytes across main.css and the theme JS. Only a functional fix (§Traps) may add bytes, and each must stay under ~100 B.
2. **CSS does the moving; JS decides, in moderation.** Transitions and keyframes animate. JS may decide *when* and *how far* (see §JS). No animation library: `motion/mini` alone is 9,751 B raw (measured 2026-09-16). At HEAD, main.css had 1,270 B left under its 193 KB budget and menu-aurora.js had 306 B left under 22 KB.
3. **Motion explains a state change, nothing else.** If a state is not in the table below, the answer is "no motion". Plain and quiet beats impressive.
4. **Never cause jank.** The client is usually a phone on the router's WiFi. See §Jank.
## State → effect
These timings are the only ones allowed: 150 ms for controls, 250 ms for surfaces, 300–320 ms only for large panels. Curves: `ease-out` for entering elements, `ease-in-out` for symmetric changes. `cubic-bezier(0.34,1.25,0.5,1)` is the float-button's overshoot and nothing else. "Today" describes HEAD.
| State | Hook | Effect | Today |
|---|---|---|---|
| Hover 悬停 (desktop only) | `:hover` | Colour change, instant. Icon-size controls may use `scale-105`. | top nav pills instant; some links still `transition-colors` |
| Focus 键盘聚焦 | `:focus-visible` | A ring appears. No movement. | `ring-2 ring-focus-ring` |
| Press 按下 | `:active` | `scale-95`, only on icon-size controls. | header toggles, switcher, card icons |
| Toggle 开关 | class flip | The thumb slides or the icon morphs. | `.theme-switcher`, hamburger → X |
| Expand / collapse 展开收起 | theme classes | Fade. Grid rows only where they already animate. | mobile submenu |
| Menu / drawer 菜单抽屉 | theme classes | Slide (translate) plus fade. A page scrim only dims; it is never blurred. The desktop sidebar pushes: its grid column eases with the panel's slide, same curve and length. | mega-menu (unblurred curtain), mobile nav, sidebar (push) |
| Tooltip 提示 | hover / focus | Fade plus `scale-95` → 100, after the intent delay. | `_tooltip.css`, `delay-300` |
| Dropdown open 下拉打开 | `.cbi-dropdown[open]` | Opacity .99 → 1 over 120 ms. This is functional: it fires luci-base's focus hand-off. | **missing** (Trap 2) |
| Modal open 弹窗打开 | `body.modal-overlay-active` | Fade in, reusing `aurora-fade-in`. The overlay goes from `display:none` to shown, so the keyframe restarts by itself. | none |
| Modal close 弹窗关闭 | class removed | None. luci-base provides no exit hook. | — |
| Notification in 通知出现 | `.alert-message.fade-in` | Fade in. | `_utilities.css` |
| Notification out 通知消失 | `.fade-out` (dismiss or timer) | Fade out. It must be a *running* transition. | **broken** (Trap 1) |
| View loading 页面加载中 | `#view > .spinning` | Spinner only. It keeps spinning under reduced motion. | `.spinning` |
| Page ready 内容就绪 | direct children of `#view` | At most one fade in, reusing `aurora-fade-in`. No stagger, no rise, and nothing deeper than the direct children. | none |
| Route leave 离开页面 | `#view.view-leaving` | Dim to 60 %. | `_layout.css` |
| Route enter 进入页面 | router swap | Same as "Page ready". Use one mechanism only: the View Transition or the fade, never both stacked. | router root crossfade |
| Tab switch 切换标签 | `[data-tab-active="true"]` | Fade in the incoming pane. Its height snaps. | none |
| Busy action 操作进行中 | `.spinning` on a button | Spinner. | `.spinning` |
| Progress 进度 | `.cbi-progressbar > div` | Width. This is an existing exception; don't copy it. | `_progress.css` |
| Drag 拖拽 | `.dragging` | A static state style, no motion. | `_form.css` |
| Invalid / success / error 校验与结果 | `.cbi-input-invalid`, `.alert-message.*` | Colour plus text. No shake, no bounce. | — |
| Poll refresh 数据刷新 | `LuCI.poll`, every 5 s | **None, ever.** | — |
| Theme switch 主题切换 | header.ut | View Transition crossfade. | header.ut |
| Disabled 禁用 | `:disabled` | None. | — |
The source lines for every hook are in references/luci-hooks.md.
### Never
Blur or mask reveal, parallax, scroll-linked or scroll-triggered motion, stagger on rows, cards or sections, text reveal, tilt, magnetic or cursor-follow effects, hover lift or shadow on `.cbi-section` or `#view`, skeleton screens, layout (FLIP) animation, crossfading tab panes, shake, loops other than `.spinning`, autoplay, and any motion on polled content.
## Bytes
Measured on main.css (raw, Tailwind 4.3.2 plus lightningcss, 2026-09-16). What you write matters more than what the effect is:
| Written as | Cost |
|---|---|
| Add a selector to an existing motion rule's selector list | **+17 B** |
| One shorthand on a new selector: `@apply [transition:opacity_150ms_ease-out]` | +50 B |
| Reuse the keyframe: `@apply animate-[aurora-fade-in_250ms_ease_backwards]` | +59 B |
| New keyframe plus its use (e.g. opacity + scale pop-in) | +141 B |
| Press as shorthand: `[transition:scale_150ms] active:[scale:.95]` | +99 B |
| Split utilities: `transition-opacity duration-150 ease-out` | **+316 B** |
| Split utilities for press: `transition-transform duration-150 active:scale-95` | +415 B |
| `starting:` entry with split utilities (modal) | +508 B |
Tailwind v4's split utilities expand into `--tw-*` fallback chains. So:
- Write motion as **one shorthand declaration**, or reuse `aurora-fade-in`.
- Prefer adding a selector to an existing rule over writing a new one.
- Don't add `@starting-style`: an element that comes back from `display:none` restarts its keyframe anyway.
Check every change. Run `pnpm build`, then compare `wc -c < htdocs/luci-static/aurora/main.css` with `git show HEAD:htdocs/luci-static/aurora/main.css | wc -c`. Put the delta in the commit body. If decorative motion comes out positive, remove bytes elsewhere or drop it.
## Jank
- Animate only `opacity`, `translate`, `scale` and `transform`. Never width, height, margins, `box-shadow`, `filter`, `backdrop-filter` or background. The only existing exceptions are the progress-bar width, the mobile-submenu grid rows, and the desktop sidebar column (user's call, 2026-09-16: a content column that snaps and then slides reads as broken; at 4× CPU the 250 ms push cost ~3 ms layout + style per frame on the overview page).
- Never animate an element that carries `backdrop-blur`, because the blur is re-rasterised every frame. Animate an unblurred child instead. Under software compositing, the blurred mega-menu curtain dropped 3–5 frames per open; without the blur it dropped none (2026-09-16).
- Keep `visibility` out of the tween. Write `[transition:opacity_220ms_…,visibility_0s_220ms]` and put `[transition-delay:0s]` on the shown state. A tweened `visibility` runs on the main thread, and on show it also keeps the paired `opacity` fade off the compositor.
- A `color` or `background-color` transition repaints on the main thread every frame. Swap state colours instantly. Dropping the transition on the nav pills cut repaints by 61 %.
- Always name the transitioned properties. Never use `transition-all`, and never use `will-change`.
- Allow one motion per state change per region, lasting no more than 320 ms. Click, save and error feedback get no delay.
- Under reduced motion, show the end state at once, but keep durations at 1 ms rather than `none` (Trap 1).
- Verify on the Layout track at 4× CPU throttling: aurora-performance runtime.md R1–R3.
## JS
JS is worth its bytes where CSS cannot decide. The mega-menu in `menu-aurora.js` is the reference:
- **Hover intent and aim.** Delay the first open. Hold the open category while the pointer heads into its panel. Every timer is cleared on leave.
- **Measure once, then cache.** Measure after `document.fonts.ready`, in `requestIdleCallback`. Write the result to a custom property (`--mega-menu-height`) and let CSS use it. Invalidate on resize only.
- **Distance-adaptive duration.** Write the computed duration to a custom property as well (`--mega-menu-duration`).
- **Sequencing and cleanup.** Toggle classes (`.active` → `.closing` → removed). A `transitionend` wait always has a fallback timer that reads the real duration back.
- **Reduced motion.** Check `prefers-reduced-motion` before any JS-timed motion, and jump straight to the end state.
Not allowed:
- a `requestAnimationFrame` loop that writes styles every frame;
- scroll or pointer listeners whose only job is an effect;
- layout reads (`offsetHeight`, `getBoundingClientRect`) on every event of a hot handler;
- `el.animate()`, except for a one-off sequence CSS cannot express, cancelled on `luci-navigate`.
## Traps (reproduced on a device, 2026-09-16)
luci-base acts on `transitionend`, which only fires if a transition actually runs.
1. **A dismissed notification never leaves the DOM.** The fill of `.fade-in` (`both`) holds `opacity`, so the `.fade-out` transition never starts. Every Dismiss and every expired notification leaves an invisible 84 px gap. Fix: `both` → `backwards` (+5 B). In `_reduced-motion.css`, replace `transition-none!` with `delay-0! duration-1!` (+57 B).
2. **Arrow keys cannot enter a dropdown.** There is no transition on `.cbi-dropdown > ul`, so focus never moves into the list. Fix: `opacity-99 [transition:opacity_120ms_ease-out]`, with `&.dropdown { opacity-100 }` (+98 B).
Any change touching `.fade-in`/`.fade-out`, dropdowns or `_reduced-motion.css` must pass this, run after `pnpm build`:
```
MAIN_CSS=htdocs/luci-static/aurora/main.css node .claude/skills/aurora-motion/scripts/transitionend-probe.mjs
```
The edit itself goes through /luci-change.
@@ -0,0 +1,56 @@
# Evidence for the state table
luci-base line numbers are from openwrt/luci master (d19bf1358f, 2026-09-14),
through `$LUCI_SRC` (see luci-knowledge). Router line numbers are from
`@eamonxg/luci-theme-devkit` 0.3.1, `runtime/router.js`. Re-check them after
a version bump.
## Hooks luci-base emits
| State | Source | What happens |
|---|---|---|
| Modal open / close | `ui.js:4224`, `ui.js:4242` | `showModal` adds `body.modal-overlay-active`. `hideModal` only removes that class, so there is no exit hook. `#modal_overlay` is `hidden` until the class is present (`_modal.css`). |
| Notification | `ui.js:4359–4390`, `ui.js:4440` | `addNotification` creates `.alert-message.fade-in`. Dismiss adds `.fade-out`, and the node is removed on its `transitionend` (`ui.js:4364`). The time-limited variant adds `.fade-out` on a timer. |
| Dropdown | `ui.js:1300–1306`, `1390–1395`, `1416–1423` | Opening sets `[open]`, and the focus layer gets `.cbi-dropdown-open`. Focus moves into the list only on `transitionend` of the `ul`. |
| Dropdown keys | `ui.js:1881–1930` | ArrowUp/ArrowDown act only when a `li` or the `ul` already has focus. |
| Tabs | `ui.js:4728`, `4882–4887` | Panes get `data-tab-active="true"/"false"`, and the pane fires the `cbi-tab-active` event. In this theme, inactive panes are `invisible h-0` (`_segmented.css`), not `display:none`. |
| Busy button | `ui.js:5683` | Adds `.spinning` while a handler's promise is pending. |
| Drag | `ui.js:2442–2449` | Adds `.dragging` on `dragstart` and removes it on `dragend` (`.cbi-dynlist`). |
| Invalid input | `ui.js:2011` and the validators | `.cbi-input-invalid`. |
| Header indicator | `ui.js:4492` | `#indicators span[data-indicator][data-style=active\|inactive]`. |
| First render | `luci.js:2771` | `luci-loaded` fires after `initDOM()` and `Poll.start()`. |
| Poll | `luci.js:1093`, `luci.js:1165` | Ticks once a second and runs each callback every `pollinterval` seconds: 5 by default (`/etc/config/luci`; luci-base `header.ut:20`). Clicking the `poll-status` indicator pauses it (`luci.js:2742–2750`). |
For reference, bootstrap animates `max-height` over 125 ms on the dropdown
`ul` (`themes/luci-theme-bootstrap/.../cascade.css:1738`). That transition
is what makes the focus hand-off work there.
## Hooks the router emits
| Hook | Source | What happens |
|---|---|---|
| `.view-staging`, `#view.view-leaving` | `router.js:832–848` (`stage()`) | The incoming view renders off-screen, and the outgoing one is marked. |
| `document.startViewTransition(swap)` | `router.js:872` (`commit()`) | Skipped when the API is missing or reduced motion is set. |
| `luci-navigate` / `luci-navigated` | `router.js:733` / `router.js:756` | Document events; `detail` is the route. Neither fires on MPA browsers, so any motion must also work after a full page load. |
| Departed view | `router.js:852–861` | The old view is cleared through `dom.content()` and removed synchronously, so it has no exit animation. |
## Traps: how they were reproduced
`scripts/transitionend-probe.mjs` logs in, renders a stock `ui.Dropdown` and
calls `ui.addNotification` on a real page. It runs with and without
`prefers-reduced-motion` and can serve any build as main.css (`MAIN_CSS`).
| main.css | Dropdown after ArrowDown ×2 | Notification after Dismiss |
|---|---|---|
| HEAD (2026-09-16) | focus stays on the dropdown | still in the DOM, 84 px tall |
| HEAD + reduced motion | same | same |
| + `.fade-in` fill `backwards` + dropdown `ul` opacity transition | focus moves `li a` → `li b` | removed |
| + the above + reduced motion at `duration 1ms` instead of `transition: none` | `li a` → `li b` | removed |
The cause of Trap 1: Chrome does not start a transition on a property that
a filling CSS animation still holds (`.fade-in` uses `… both`). Removing
`.fade-in` before dismissing also made the removal work.
Upstream direction (decision doc only, through /upstream-rfc): luci-base
should not depend on `transitionend` alone, and should fall back when the
computed transition duration is `0s`.
@@ -0,0 +1,121 @@
#!/usr/bin/env node
/**
* transitionend-probe.mjs — luci-base removes a dismissed notification and
* moves dropdown focus into the list only on `transitionend`, so both break
* silently when the theme has no running transition there. Checks both on a
* real device, with and without prefers-reduced-motion. Writes nothing on
* the device. Raw CDP, no npm deps, node >= 22. Exit 1 if a contract fails.
*
* env:
* HOST http://192.168.1.1 (default: VITE_OPENWRT_HOST from .dev/.env)
* PAGE path after /cgi-bin/luci/ (default admin/system/system)
* MAIN_CSS file served as the theme's main.css (default: the device's own),
* e.g. htdocs/luci-static/aurora/main.css after `pnpm build`
* USER_NAME/PASS login (default root / empty)
* CHROME_BIN
*/
import { spawn } from "node:child_process";
import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join, resolve } from "node:path";
import { setTimeout as sleep } from "node:timers/promises";
const root = resolve(import.meta.dirname, "../../../..");
const envFile = join(root, ".dev/.env");
const dotenv = existsSync(envFile)
? Object.fromEntries(readFileSync(envFile, "utf8").split("\n").filter((l) => /^[A-Z_]+=/.test(l)).map((l) => l.split("=", 2)))
: {};
const HOST = (process.env.HOST ?? (dotenv.VITE_OPENWRT_HOST ? `http://${dotenv.VITE_OPENWRT_HOST}` : "http://192.168.1.1")).replace(/\/+$/, "");
const PAGE = process.env.PAGE ?? "admin/system/system";
const MAIN_CSS = process.env.MAIN_CSS ? readFileSync(resolve(process.env.MAIN_CSS)) : null;
const CHROME = process.env.CHROME_BIN ?? (process.platform === "darwin" ? "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" : "google-chrome");
const login = await fetch(`${HOST}/cgi-bin/luci/`, {
method: "POST",
body: new URLSearchParams({ luci_username: process.env.USER_NAME ?? "root", luci_password: process.env.PASS ?? "" }),
redirect: "manual",
});
const cookie = (login.headers.get("set-cookie") ?? "").match(/(sysauth[^=]*)=([^;]+)/);
if (!cookie) throw new Error(`login failed (${login.status})`);
const profile = mkdtempSync(join(tmpdir(), "cdp-transitionend-"));
const chrome = spawn(CHROME, ["--headless=new", "--remote-debugging-port=0", `--user-data-dir=${profile}`, "--no-first-run", "--no-default-browser-check", "about:blank"], { stdio: "ignore" });
let port = null;
for (let i = 0; i < 100 && !port; i++) {
await sleep(100);
const f = join(profile, "DevToolsActivePort");
if (existsSync(f)) port = +readFileSync(f, "utf8").split("\n")[0];
}
if (!port) throw new Error("chrome: no DevToolsActivePort");
const ws = new WebSocket((await (await fetch(`http://127.0.0.1:${port}/json/version`)).json()).webSocketDebuggerUrl);
await new Promise((res, rej) => { ws.addEventListener("open", res, { once: true }); ws.addEventListener("error", () => rej(new Error("CDP connect failed")), { once: true }); });
let mid = 0; const pending = new Map(); const handlers = new Set();
ws.addEventListener("message", (ev) => {
const m = JSON.parse(ev.data);
if (m.id && pending.has(m.id)) { const { res, rej } = pending.get(m.id); pending.delete(m.id); m.error ? rej(new Error(m.error.message)) : res(m.result); }
else for (const h of handlers) h(m);
});
const send = (method, params = {}, sessionId) => new Promise((res, rej) => { const id = ++mid; pending.set(id, { res, rej }); ws.send(JSON.stringify({ id, method, params, sessionId })); });
async function probe(reduce) {
const { targetId } = await send("Target.createTarget", { url: "about:blank" });
const { sessionId: s } = await send("Target.attachToTarget", { targetId, flatten: true });
const ev = async (expression) => (await send("Runtime.evaluate", { expression, awaitPromise: true, returnByValue: true }, s)).result.value;
await send("Page.enable", {}, s);
await send("Network.setCookie", { name: cookie[1], value: cookie[2], domain: new URL(HOST).hostname, path: "/" }, s);
await send("Emulation.setDeviceMetricsOverride", { width: 1280, height: 900, deviceScaleFactor: 1, mobile: false }, s);
await send("Emulation.setEmulatedMedia", { features: [{ name: "prefers-reduced-motion", value: reduce ? "reduce" : "no-preference" }] }, s);
if (MAIN_CSS) {
await send("Fetch.enable", { patterns: [{ urlPattern: "*/luci-static/aurora/main.css*", requestStage: "Request" }] }, s);
handlers.add((m) => {
if (m.sessionId !== s || m.method !== "Fetch.requestPaused") return;
send("Fetch.fulfillRequest", { requestId: m.params.requestId, responseCode: 200, responseHeaders: [{ name: "Content-Type", value: "text/css" }, { name: "Cache-Control", value: "no-store" }], body: MAIN_CSS.toString("base64") }, s);
});
}
await send("Page.navigate", { url: `${HOST}/cgi-bin/luci/${PAGE}` }, s);
for (let i = 0; i < 80; i++) {
await sleep(250);
if (await ev(`!!(window.L?.loaded && document.querySelector('#view') && !document.querySelector('#view > .spinning'))`)) break;
}
// A stock single-select ui.Dropdown: open with ArrowDown, then ArrowDown again.
await ev(`L.require('ui').then(ui => {
const el = new ui.Dropdown('a', { a: 'A', b: 'B', c: 'C' }, {}).render();
el.id = 'probe-dd';
document.querySelector('#view').prepend(el);
el.focus();
})`);
const key = async () => {
for (const type of ["rawKeyDown", "keyUp"]) await send("Input.dispatchKeyEvent", { type, key: "ArrowDown", code: "ArrowDown", windowsVirtualKeyCode: 40, nativeVirtualKeyCode: 40 }, s);
await sleep(500);
};
const focused = `(document.activeElement.closest('#probe-dd li')?.dataset.value ?? 'none')`;
await key(); const first = await ev(focused);
await key(); const second = await ev(focused);
await ev(`document.querySelector('#probe-dd').remove()`);
// ui.addNotification, dismissed after its entrance has finished.
const note = await ev(`L.require('ui').then(ui => new Promise(res => {
const n = ui.addNotification(null, E('p', 'probe'), 'info');
setTimeout(() => {
n.querySelector('button.btn').click();
setTimeout(() => res({ removed: !n.isConnected, gapPx: n.isConnected ? n.offsetHeight : 0 }), 800);
}, 400);
}))`);
await send("Target.closeTarget", { targetId });
const dropdownOk = first === "a" && second === "b";
console.log(JSON.stringify({ reducedMotion: reduce, dropdownFocus: `${first} -> ${second}`, dropdownOk, notification: note, notificationOk: note.removed }));
return dropdownOk && note.removed;
}
let ok = true;
try {
for (const reduce of [false, true]) ok = (await probe(reduce)) && ok;
} finally {
chrome.kill();
ws.close();
await sleep(500);
rmSync(profile, { recursive: true, force: true, maxRetries: 5 });
}
process.exit(ok ? 0 : 1);
@@ -11,13 +11,14 @@ address, so they stay local).
| Metric | Budget | Track | Source | | Metric | Budget | Track | Source |
|---|---|---|---| |---|---|---|---|
| main.css (identity/raw) | ≤ 193 KB | size | production build, 2026-08 (191,899 B; +~2 KB custom-background mode, +~0.5 KB router progress bar / live region; the bar is now Turbo-shaped — width/opacity only, inserted per navigation) | | main.css (identity/raw) | ≤ 193 KB | size | production build, 2026-09-16 (189,650 B; −0.77 KB sidebar push as two transitions instead of run keyframes; +42 B replayed nav skips the fade; +~2 KB custom-background mode, +~0.5 KB router progress bar / live region; the bar is now Turbo-shaped — width/opacity only, inserted per navigation; −1.24 KB unblurred mega-menu curtain, delayed visibility, instant nav-pill colours) |
| login.css (identity/raw) | ≤ 12 KB | size | production build, 2026-07 (10,935 B, token-pruned) | | login.css (identity/raw) | ≤ 12 KB | size | production build, 2026-07 (10,935 B, token-pruned) |
| menu-aurora.js (identity/raw) | ≤ 22 KB | size | production build, 2026-08 (21,809 B; +0.8 KB palette recents: record on pick, pure-LRU browse order, storage validation; +0.2 KB ">" logout command) | | menu-aurora.js (identity/raw) | ≤ 22 KB | size | production build, 2026-09-16 (21,362 B; −0.24 KB sidebar toggle is a class flip; −0.09 KB pre-paint nav cache, its crumb renderer moved into header.ut (the replay itself is per-response HTML, see below); +0.8 KB palette recents: record on pick, pure-LRU browse order, storage validation; +0.2 KB ">" logout command) |
| router-aurora.js (identity/raw, Navigation-API browsers only) | ≤ 15 KB | size | production build, 2026-08 (14,844 B: template shells fetched, per-render listener teardown, timeout-as-failure, expiry gate, readonly folding, node css, wildcard actions, trickling progress bar, same-URL reload rule, visibility gate, contract check) | | router-aurora.js (identity/raw, Navigation-API browsers only) | ≤ 15 KB | size | production build, 2026-08 (14,844 B: template shells fetched, per-render listener teardown, timeout-as-failure, expiry gate, readonly folding, node css, wildcard actions, trickling progress bar, same-URL reload rule, visibility gate, contract check) |
| Default logo (identity/raw) | ≤ 16 KB | size | production build, 2026-07 (15,057 B) | | Default logo (identity/raw) | ≤ 16 KB | size | production build, 2026-07 (15,057 B) |
| Core admin cold theme assets (identity/raw) | ≤ 267.5 KB | size | main CSS + menu JS + router JS + default font + logo, 2026-08 (≈267.2 KB; the router is a one-time cost that removes per-click dispatcher work; +1.0 KB palette recents and logout command) | | Core admin cold theme assets (identity/raw) | ≤ 267.5 KB | size | main CSS + menu JS + router JS + default font + logo, 2026-09-16 (265,420 B; −1.1 KB sidebar push and nav cache; the router is a one-time cost that removes per-click dispatcher work; +1.0 KB palette recents and logout command; −1.24 KB mega-menu curtain) |
| Login cold theme assets, excluding configured background (identity/raw) | ≤ 55 KB | size | login CSS + default font + logo, 2026-07 (49,572 B) | | Login cold theme assets, excluding configured background (identity/raw) | ≤ 55 KB | size | login CSS + default font + logo, 2026-07 (49,572 B) |
| Admin HTML inline scripts added per full load (identity, never cached) | — | size | header.ut, 2026-09-16: pre-paint nav replay ≈ +0.5 KB (mega-menu/dropdown) / ≈ +1.9 KB (sidebar, with the shared crumb renderer); login page +0.07 KB. Template shells the router fetches carry it too. |
| Blocking requests before first paint | ≤ 4 | count | current waterfall | | Blocking requests before first paint | ≤ 4 | count | current waterfall |
| Repeat-visit asset requests | ≈ 0 | count | target state; package-built CSS/JS URLs are versioned, but long-lived cache headers still need live verification | | Repeat-visit asset requests | ≈ 0 | count | target state; package-built CSS/JS URLs are versioned, but long-lived cache headers still need live verification |
| TTFB, login page (device) | proposed: ≤ 130 ms | latency | local device baseline, 2026-07 | | TTFB, login page (device) | proposed: ≤ 130 ms | latency | local device baseline, 2026-07 |
@@ -42,6 +43,10 @@ Budget revisions require a new baseline entry under `../baselines/`.
- Package-root `.DS_Store` metadata removed and covered by a regression test. - Package-root `.DS_Store` metadata removed and covered by a regression test.
- login.css pruned to its reachable custom properties at build time (the - login.css pruned to its reachable custom properties at build time (the
shared token sheet is admin-sized; the login page consumes a fraction). shared token sheet is admin-sized; the login page consumes a fraction).
- Mega-menu curtain (2026-09-16): no backdrop blur, `visibility` delayed
instead of tweened, instant nav-pill colours; main.css −1,244 B. Device
trace, 4× CPU, median of 3: repaints 287 → 112, main-thread animations
33 → 8. With `--disable-gpu`, dropped frames per open went 3–5 → 0.
- Client-side router (`router-aurora.js`, `.dev/docs/router.md`, - Client-side router (`router-aurora.js`, `.dev/docs/router.md`,
2026-08-16): view/alias/firstchild/overview navigations become 2026-08-16): view/alias/firstchild/overview navigations become
@@ -20,7 +20,10 @@ workflow. No edit to a shipped or source path happens before gate 1, and the
cover them. If the request names a page, a package, a DOM element or cover them. If the request names a page, a package, a DOM element or
shows a page screenshot, load `luci-dom-compat` and complete its steps shows a page screenshot, load `luci-dom-compat` and complete its steps
1–2 (locate the page, read `.dev/compat/pages/` for the files and 1–2 (locate the page, read `.dev/compat/pages/` for the files and
selectors about to change) before planning. selectors about to change) before planning. If the request adds or
changes motion (transition, animation, View Transition), load
`aurora-motion`; the plan names the state, its effect from the table
and the measured main.css byte delta.
2. **Plan.** Call `EnterPlanMode`. The plan states: files to change; the 2. **Plan.** Call `EnterPlanMode`. The plan states: files to change; the
approach in ≤ 10 lines; budget impact (bytes per `tests/build-performance.test.js`, approach in ≤ 10 lines; budget impact (bytes per `tests/build-performance.test.js`,
per-request ubus/uci/fs calls, dispatches per navigation); floor it per-request ubus/uci/fs calls, dispatches per navigation); floor it
@@ -23,11 +23,21 @@ strings render untranslated (see `.dev/decisions/translations-catalog-caching.md
## DOM hooks shared by templates, CSS and JS ## DOM hooks shared by templates, CSS and JS
`body[data-page]` (request segments joined by `-`), `body[data-nav-type]` `body[data-page]` (request segments joined by `-`), `body[data-nav-type]`
(`mega-menu|dropdown|sidebar`), `body[data-asset-version]`, `body[data-patches]`, (`mega-menu|dropdown|sidebar`), `body[data-asset-version]`, `body[data-patches]`,
`body[data-bg]`; `#maincontent[tabindex=-1]`, `#tabmenu`, `#topmenu`, `#sidebar-list`, `body[data-bg]`, `body[data-nav-stamp]`; `#maincontent[tabindex=-1]`, `#tabmenu`, `#topmenu`, `#sidebar-list`,
`#sidebar-footer`, `#header-crumb`, `#mobile-nav-list`, `#mobile-nav-footer-action`, `#sidebar-footer`, `#header-crumb`, `#mobile-nav-list`, `#mobile-nav-footer-action`,
`#indicators`, `#modemenu`, `#cmdk-trigger`, `.desktop-menu-container > .desktop-menu-sheet `#indicators`, `#modemenu`, `#cmdk-trigger`, `.desktop-menu-container > .desktop-menu-sheet
> .desktop-menu-canvas`, `.desktop-menu-board` (template cloned per panel), > .desktop-menu-canvas`, `.desktop-menu-board` (template cloned per panel),
`.theme-switcher .theme-option[data-theme]`. Renaming any of these is a `.theme-switcher .theme-option[data-theme]`, `#sidebar-list[data-active-path]`
(dispatch segments 1–2), `[data-restored]` on replayed nav surfaces.
Pre-paint nav: `menu-aurora.js` `cacheNav()` writes `sessionStorage["aurora.nav"]`
= `[body[data-nav-stamp], {id: innerHTML}]` after render (stamp: nav type, lang,
user, version); header.ut replays it after the nav markup, inert, only while the
stamp matches and luci-base's `luci-session-store` still holds `menu` (sidebar:
recomputes active marks, then the global `auroraCrumb()`, which `menu-aurora.js`
also calls); `menu-aurora.js` lifts `inert` once `ui.menu.load()` settles; the
login page clears the cache. A collapsed sidebar is restored first in `<body>`: its column
transitions, so the class must land before any style resolution.
Renaming any of these is a
cross-file change (grep all three layers + tests). cross-file change (grep all three layers + tests).
## Router invariants (`router-aurora.js`, spec in `.dev/docs/router.md`) ## Router invariants (`router-aurora.js`, spec in `.dev/docs/router.md`)
@@ -18,6 +18,9 @@
vertical-align: middle; vertical-align: middle;
opacity: 0.85; opacity: 0.85;
} }
/* The 1153px below was measured without a scrollbar; the theme's stable
gutter would take 11px of it (see the ledger's scrollbar-gutter entry). */
html { scrollbar-gutter: auto; }
</style> </style>
<script type="application/json" id="compat"> <script type="application/json" id="compat">
{ {
@@ -11,3 +11,15 @@
- verified: device 192.168.8.1, CDP before/after in one page load — cells 16 → 12px; wrapped cells 5 → 1 at 1280 (the remaining `0BOOTCONFIG1` wraps under bootstrap at that width too), 5 → 0 at 1920, 0 → 0 at 390; eleven stock pages (overview, routes, processes, interfaces, firewall zones/rules, DHCP, wireless, mounts, startup, SSH keys) showed zero font-size/line-height changes on any text-bearing table element at 1280 and 390 - verified: device 192.168.8.1, CDP before/after in one page load — cells 16 → 12px; wrapped cells 5 → 1 at 1280 (the remaining `0BOOTCONFIG1` wraps under bootstrap at that width too), 5 → 0 at 1920, 0 → 0 at 390; eleven stock pages (overview, routes, processes, interfaces, firewall zones/rules, DHCP, wireless, mounts, startup, SSH keys) showed zero font-size/line-height changes on any text-bearing table element at 1280 and 390
- fixture: fixtures/admin-services-mini-diskmanager-minidiskmanager--partition-table.html - fixture: fixtures/admin-services-mini-diskmanager-minidiskmanager--partition-table.html
- issue: #65 · mirror: shadcn 4f1c7f4 · status: active - issue: #65 · mirror: shadcn 4f1c7f4 · status: active
## partition-table-gutter — the stable scrollbar gutter leaves the type cell 0.9px short at 1280
- page: admin-services-mini-diskmanager-minidiskmanager · Services → Disk Manager
- package: luci-app-mini-diskmanager (4IceG/luci-app-mini-diskmanager)
- dom: `table#partition-table-<dev>` (inline `table-layout:fixed; width:100%`); type cell `<span class="partition-color-indicator"> 0BOOTCONFIG`
- symptom: with classic scrollbars at a 1280px viewport the swatch and `0BOOTCONFIG` split onto two lines; overlay scrollbars are unaffected
- cause: `_elements.css` `html` `[scrollbar-gutter:stable]` (added so short pages and open modals stop shifting the layout) reserves the 11px thin scrollbar on every page, which is what a scrolling page already paid; the #65 fit had 0.6px to spare
- fix: none on the page; the fixture pins `html { scrollbar-gutter: auto }` because its 1153px width was measured without a scrollbar, so it keeps guarding #65's inherited 12px
- verified: headless Chrome, fixture at 1280 — table 1152.7 → 1142.1px, cell content 114.9 → 113.4px against a 114.3px line (fits → wraps); `pnpm test` compat fails without the pin and passes with it
- fixture: fixtures/admin-services-mini-diskmanager-minidiskmanager--partition-table.html
- issue: — · mirror: shadcn 50c53a9 · status: active
@@ -3,7 +3,9 @@
} }
html { html {
@apply [scrollbar-color:var(--text-muted)_var(--surface)] [scrollbar-width:thin]; /* Stable gutter: short pages and open modals (body overflow hidden) would
otherwise drop the classic scrollbar and shift the whole layout. */
@apply [scrollbar-color:var(--text-muted)_var(--surface)] [scrollbar-gutter:stable] [scrollbar-width:thin];
body { body {
@apply text-text relative flex min-h-dvh flex-col text-sm leading-relaxed font-normal; @apply text-text relative flex min-h-dvh flex-col text-sm leading-relaxed font-normal;
+25 -61
View File
@@ -217,7 +217,7 @@ header {
@apply relative; @apply relative;
.menu { .menu {
@apply text-text hover:bg-hover-faint block rounded-xl px-3.5 py-1.5 font-medium no-underline transition-colors duration-150; @apply text-text hover:bg-hover-faint block rounded-xl px-3.5 py-1.5 font-medium no-underline;
/* Unified pill for both dropdown modes — the open/active category is a /* Unified pill for both dropdown modes — the open/active category is a
filled brand pill, matching the submenu links and the sidebar. */ filled brand pill, matching the submenu links and the sidebar. */
@@ -325,7 +325,7 @@ header {
} }
#indicators { #indicators {
@apply flex shrink-0 flex-row-reverse gap-5 md:gap-8; @apply mr-4 ml-auto flex shrink-0 flex-row-reverse gap-5 md:gap-8;
/* Same hover language as .navigation-toggle and .cmdk-trigger: a scale /* Same hover language as .navigation-toggle and .cmdk-trigger: a scale
nudge, never a background plate. */ nudge, never a background plate. */
@@ -369,12 +369,14 @@ body[data-nav-type="sidebar"] {
/* Single source of truth for the sidebar column, so collapsing only has to /* Single source of truth for the sidebar column, so collapsing only has to
zero this one value instead of restating the grid template. zero this one value instead of restating the grid template.
--sidebar-w-full stays constant: the inner panel width and the slide --sidebar-w-full stays constant: the inner panel width reads it, and
keyframes read it, and must not see the zeroed collapsed value. */ must not see the zeroed collapsed value. */
--sidebar-w-full: 17rem; --sidebar-w-full: 17rem;
--sidebar-w: var(--sidebar-w-full); --sidebar-w: var(--sidebar-w-full);
@apply md:grid md:grid-cols-[var(--sidebar-w)_minmax(0,1fr)] md:grid-rows-[auto_minmax(0,1fr)] md:overflow-x-clip; /* The column eases with the panel's slide below (same curve and length),
so the content edge follows the sidebar edge frame by frame. */
@apply md:grid md:grid-cols-[var(--sidebar-w)_minmax(0,1fr)] md:grid-rows-[auto_minmax(0,1fr)] md:overflow-x-clip md:[transition:grid-template-columns_250ms_var(--ease-in-out)];
&.sidebar-collapsed { &.sidebar-collapsed {
@apply md:[--sidebar-w:0rem]; @apply md:[--sidebar-w:0rem];
@@ -428,50 +430,20 @@ body[data-nav-type="sidebar"] {
@apply sticky top-0 hidden h-dvh w-full overflow-hidden rounded-none md:block; @apply sticky top-0 hidden h-dvh w-full overflow-hidden rounded-none md:block;
} }
/* The grid column still snaps (one reflow, never a per-frame layout /* Hidden (out of the tab order) only once the slide-out has run. The
animation); visibility removes collapsed controls from the tab order. hairline lives on the inner panel so it tracks the sliding edge. */
The hairline lives on the inner panel, not the frame, so it tracks the
sliding edge during the run animations below. */
&.sidebar-collapsed .sidebar-panel { &.sidebar-collapsed .sidebar-panel {
@apply invisible; @apply invisible [transition:visibility_0s_250ms];
} }
& .sidebar-panel-inner { & .sidebar-panel-inner {
@apply bg-bg border-hairline flex h-full w-(--sidebar-w-full) flex-col overflow-hidden border-r; @apply bg-bg border-hairline flex h-full w-(--sidebar-w-full) flex-col overflow-hidden border-r [transition:translate_250ms_var(--ease-in-out)];
} }
&.sidebar-collapsed .sidebar-panel-inner { &.sidebar-collapsed .sidebar-panel-inner {
@apply -translate-x-full; @apply -translate-x-full;
} }
/* Coupled slide: the column width snaps in the same frame the
sidebar-anim-* class lands, then the sidebar and the whole content
column (header + #maincontent) slide the same 17rem with the same
curve — compositor-only, so the seam moves as one wall with zero
per-frame reflow. menu-aurora.js swaps the class per direction
(distinct animation-names restart cleanly on rapid toggles) and
clears it after the run. */
&.sidebar-anim-open > header,
&.sidebar-anim-open > #maincontent,
&.sidebar-anim-open .sidebar-panel-inner {
@apply md:animate-[sidebar-run-in_250ms_var(--ease-in-out)_both];
}
&.sidebar-anim-close > header,
&.sidebar-anim-close > #maincontent {
@apply md:animate-[sidebar-run-back_250ms_var(--ease-in-out)_both];
}
/* Closing: the column is already zero, so the panel holds its old spot
as a fixed overlay for one run while its content slides off. */
&.sidebar-anim-close .sidebar-panel {
@apply md:visible md:fixed md:top-0 md:left-0 md:w-(--sidebar-w-full);
}
&.sidebar-anim-close .sidebar-panel-inner {
@apply md:animate-[sidebar-run-out_250ms_var(--ease-in-out)_both];
}
/* Sidebar head: logo + hostname. h-14 matches the header row so its /* Sidebar head: logo + hostname. h-14 matches the header row so its
bottom hairline continues the header's border in one unbroken line bottom hairline continues the header's border in one unbroken line
across the viewport. box-content: the header is auto-height (56px across the viewport. box-content: the header is auto-height (56px
@@ -529,33 +501,13 @@ body[data-nav-type="sidebar"] {
} }
} }
/* Shared travel distance for the coupled sidebar slide: content column and
panel move the same 17rem, so the seam between them never separates. */
@keyframes sidebar-run-in {
from {
translate: calc(-1 * var(--sidebar-w-full)) 0;
}
}
@keyframes sidebar-run-back {
from {
translate: var(--sidebar-w-full) 0;
}
}
@keyframes sidebar-run-out {
to {
translate: calc(-1 * var(--sidebar-w-full)) 0;
}
}
/* Router progress (router.md) — Turbo Drive's bar: inserted by the router /* Router progress (router.md) — Turbo Drive's bar: inserted by the router
once a navigation outlives its silent 150 ms, width driven inline and once a navigation outlives its silent 150 ms, width driven inline and
trickling until commit (so a slow render keeps visibly moving), then trickling until commit (so a slow render keeps visibly moving), then
filled, faded and removed from the DOM. Only width and opacity move. filled, faded and removed from the DOM. Only width and opacity move.
Reduced motion drops the transitions, not the bar. */ Reduced motion drops the transitions, not the bar. */
#luci-nav-progress { #luci-nav-progress {
@apply from-progress-start to-progress-end pointer-events-none fixed top-0 left-0 z-80 h-0.5 w-0 bg-linear-to-r transition-[width] duration-300 ease-out; @apply from-progress-start to-progress-end pointer-events-none fixed top-0 left-0 z-80 h-0.5 w-0 bg-linear-to-r [transition:width_.3s_var(--ease-out)];
&[data-state="done"] { &[data-state="done"] {
@apply opacity-0 [transition:width_.3s_ease-out,opacity_.15s_ease-in_.15s]; @apply opacity-0 [transition:width_.3s_ease-out,opacity_.15s_ease-in_.15s];
@@ -589,7 +541,7 @@ body[data-nav-type="sidebar"] {
/* Outgoing page while the router renders the next one (router.md). */ /* Outgoing page while the router renders the next one (router.md). */
&.view-leaving { &.view-leaving {
@apply cursor-progress opacity-60 transition-opacity duration-150; @apply cursor-progress opacity-60 [transition:opacity_150ms_ease-out];
} }
.cbi-title-section { .cbi-title-section {
@@ -639,6 +591,18 @@ body[data-nav-type="sidebar"] {
@apply flex flex-1 flex-col gap-1.5; @apply flex flex-1 flex-col gap-1.5;
} }
} }
/* Hidden while the view is leaving or loading so its jump to the new page
height is never seen; animate-none restarts its fade-in once it returns. */
&:has(> #view.view-leaving, > #view > .spinning) > footer {
@apply invisible animate-none;
}
}
/* Only the theme toggle captures the page: a router swap would crossfade
two page layouts on top of the content's own fade-in. */
:root:not(:active-view-transition-type(theme)) {
@apply [view-transition-name:none];
} }
footer { footer {
@@ -61,6 +61,19 @@
@apply animate-[aurora-fade-in_250ms_ease_both]; @apply animate-[aurora-fade-in_250ms_ease_both];
} }
/* Content that lands after first paint fades in once; none of it is
re-inserted by poll (the dashboard's polled tabs sit under .Dashboard).
A nav header.ut replayed before first paint (data-restored) never fades.
backwards: a filling animation stays a stacking context over dropdowns. */
#view > :not(.spinning),
#view > .cbi-map > .cbi-map-tabbed > [data-tab-active="true"],
.cbi-section-node-tabbed > [data-tab-active="true"],
#topmenu:not([data-restored]),
#sidebar-list:not([data-restored]) > *,
footer {
@apply animate-[aurora-fade-in_250ms_ease_backwards];
}
.fade-out { .fade-out {
@apply pointer-events-none opacity-0 transition-opacity duration-[250ms]; @apply pointer-events-none opacity-0 transition-opacity duration-[250ms];
} }
@@ -84,29 +84,13 @@ body.mobile-navigation-open > header {
} }
[data-nav-type="mega-menu"] { [data-nav-type="mega-menu"] {
/* Apple's curtain: the frost is DECLARED here permanently and never /* Dim only: a blurred full-screen fade drops frames on weak GPUs. Visibility
toggled — it fades in and out WITH the dim, so the page blurs flips on a delay instead of tweening, so the opacity fade stays composited. */
progressively as the sheet descends (apple.com's globalnav curtain runs
its blur exactly like this while the flyout animates). Gating the blur
on a post-transition "settled" state was tried and rejected: the frost
popped in only after the menu landed, visibly off-design.
The cost is per-frame blur re-compositing for the 300ms of fade — but it
is now the ONLY per-frame work: the reveal itself runs entirely on the
compositor (see _layout.css). What janked low-end devices was the old
overlap of main-thread height layout + live blur, not the blur alone.
If the fade still janks a device, reduce the radius or rely on
_reduced-transparency.css, which strips the filter outright.
Closing starts immediately and uses the same 220ms exit as the menu
surface. Delaying the opacity transition left the page frosted after the
sheet had already collapsed into the header, which read as a flash. Once
hidden, visibility:hidden makes the invisible filter cost nothing. */
& .desktop-menu-overlay { & .desktop-menu-overlay {
@apply bg-mega-menu-scrim pointer-events-none invisible fixed inset-0 z-60 opacity-0 backdrop-blur-lg backdrop-saturate-150 transition-[opacity,visibility] duration-[220ms] ease-[cubic-bezier(0.4,0,0.6,1)] max-md:hidden; @apply bg-mega-menu-scrim pointer-events-none invisible fixed inset-0 z-60 opacity-0 [transition:opacity_220ms_cubic-bezier(0.4,0,0.6,1),visibility_0s_220ms] max-md:hidden;
&.active { &.active {
@apply pointer-events-auto visible opacity-100; @apply pointer-events-auto visible opacity-100 [transition-delay:0s];
} }
} }
} }
@@ -15,15 +15,10 @@
.cmdk-trigger { .cmdk-trigger {
/* Hover is a scale nudge with no plate behind it — the header's own /* Hover is a scale nudge with no plate behind it — the header's own
language, set by .navigation-toggle and shared with #indicators. The language, set by .navigation-toggle and shared with #indicators. The
size-8 box stays as the touch target; it just never paints. */ size-8 box stays as the touch target; it just never paints.
@apply text-text relative mr-4 grid size-8 shrink-0 cursor-pointer place-items-center rounded-lg border-0 bg-transparent p-0 shadow-none transition-transform duration-150; order-last pins it to the bar's right edge: #indicators sits before it
and grows leftward, so a late indicator never shifts the trigger. */
/* Non-sidebar headers have no mr-auto crumb absorbing the slack — pull the @apply text-text relative order-last grid size-8 shrink-0 cursor-pointer place-items-center rounded-lg border-0 bg-transparent p-0 shadow-none transition-transform duration-150;
toggle right so it docks next to #indicators instead of landing in the
middle of the justify-between row. */
body:not([data-nav-type="sidebar"]) & {
@apply ml-auto;
}
/* size-5 (not the button's own size): the same box #indicators gives its /* size-5 (not the button's own size): the same box #indicators gives its
glyphs, so the shared 24×24 Tabler canvas scales identically and the glyphs, so the shared 24×24 Tabler canvas scales identically and the
@@ -6,7 +6,15 @@ const PALETTE_RECENTS_KEY = "aurora.paletteRecents";
return baseclass.extend({ return baseclass.extend({
__init__() { __init__() {
ui.menu.load().then((tree) => this.render(tree)); ui.menu
.load()
.then((tree) => this.render(tree))
.finally(() => {
// header.ut's replay stays inert until the live nav has replaced it
// or failed to; either way it must not stay a dead copy.
for (const el of document.querySelectorAll("[data-restored]"))
el.inert = false;
});
this.initNavigationControls(); this.initNavigationControls();
this.initUciIndicator(); this.initUciIndicator();
}, },
@@ -32,7 +40,6 @@ return baseclass.extend({
const mobileList = overlay.querySelector("#mobile-nav-list"); const mobileList = overlay.querySelector("#mobile-nav-list");
const desktop = window.matchMedia("(min-width: 768px)"); const desktop = window.matchMedia("(min-width: 768px)");
const SIDEBAR_COLLAPSED_KEY = "aurora.sidebarCollapsed"; const SIDEBAR_COLLAPSED_KEY = "aurora.sidebarCollapsed";
let sidebarAnimTimer;
const isDesktopSidebar = () => const isDesktopSidebar = () =>
desktop.matches && document.body.dataset.navType === "sidebar"; desktop.matches && document.body.dataset.navType === "sidebar";
@@ -85,23 +92,9 @@ return baseclass.extend({
closeMobileNavigation(); closeMobileNavigation();
const collapsed = !expanded; const collapsed = !expanded;
const body = document.body;
// Coupled slide (_layout.css): the class must land in the same // The column and the panel transition together (_layout.css).
// frame as the column snap. Open/close carry distinct document.body.classList.toggle("sidebar-collapsed", collapsed);
// animation-names, so alternating toggles restart the run without
// a forced reflow; the timer (not animationend — three elements
// animate) clears the class once the 250ms run is over.
body.classList.remove("sidebar-anim-open", "sidebar-anim-close");
body.classList.add(
collapsed ? "sidebar-anim-close" : "sidebar-anim-open",
);
clearTimeout(sidebarAnimTimer);
sidebarAnimTimer = setTimeout(() => {
body.classList.remove("sidebar-anim-open", "sidebar-anim-close");
}, 300);
body.classList.toggle("sidebar-collapsed", collapsed);
localStorage.setItem(SIDEBAR_COLLAPSED_KEY, collapsed); localStorage.setItem(SIDEBAR_COLLAPSED_KEY, collapsed);
updateToggleState(expanded); updateToggleState(expanded);
return; return;
@@ -203,6 +196,25 @@ return baseclass.extend({
this.tree = tree; this.tree = tree;
this.renderModeMenu(tree); this.renderModeMenu(tree);
this.renderTabs(tree); this.renderTabs(tree);
this.cacheNav();
},
// Snapshot for header.ut's pre-paint replay, under the stamp it renders on
// body; it recomputes the active marks, so one copy serves every page.
cacheNav() {
const html = {};
for (const el of document.querySelectorAll(
"#topmenu, #sidebar-list, #sidebar-footer",
))
if (el.firstChild) html[el.id] = el.innerHTML;
try {
sessionStorage.setItem(
"aurora.nav",
JSON.stringify([document.body.dataset.navStamp, html]),
);
} catch {
// No storage: the next load renders after the module, as before.
}
}, },
renderTabs(tree) { renderTabs(tree) {
@@ -258,7 +270,8 @@ return baseclass.extend({
this.expandActiveNavigationGroup(surface); this.expandActiveNavigationGroup(surface);
} }
this.renderCrumb(); // header.ut's, shared with its pre-paint replay (sidebar mode only).
window.auroraCrumb?.();
const tabs = document.querySelector("#tabmenu"); const tabs = document.querySelector("#tabmenu");
if (tabs) { if (tabs) {
@@ -324,6 +337,8 @@ return baseclass.extend({
return ul || E([]); return ul || E([]);
} }
// Drops header.ut's replayed copy, which carries no listeners.
if (ul) ul.innerHTML = "";
if (!ul || !children.length) return E([]); if (!ul || !children.length) return E([]);
if (navType === "mega-menu") { if (navType === "mega-menu") {
@@ -561,30 +576,7 @@ return baseclass.extend({
}); });
this.bindNavigationAccordion(list); this.bindNavigationAccordion(list);
this.renderCrumb(); window.auroraCrumb?.();
},
renderCrumb() {
const crumbEl = document.querySelector("#header-crumb");
const list = document.querySelector("#sidebar-list");
if (!crumbEl || !list) return;
const crumb = [];
const group = list.querySelector(".is-active-group");
const page = list.querySelector(".is-active-page");
if (group)
crumb.push(group.querySelector(".nav-category-label")?.textContent);
// Same-named group/page pairs ("System › System") collapse to one
// level — the duplicate adds no information.
if (page && page.textContent !== crumb[0]) crumb.push(page.textContent);
crumbEl.innerHTML = "";
crumb.forEach((title, i) => {
if (i) crumbEl.appendChild(E("li", { class: "crumb-sep" }, ["/"]));
crumbEl.appendChild(
E("li", { class: i === crumb.length - 1 ? "current" : "" }, [title]),
);
});
}, },
// Command palette (all nav types): a Spotlight-style panel on ⌘K / Ctrl+K // Command palette (all nav types): a Spotlight-style panel on ⌘K / Ctrl+K
@@ -0,0 +1,242 @@
import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import { resolve } from "node:path";
import test from "node:test";
const header = readFileSync(
resolve(import.meta.dirname, "../../ucode/template/themes/aurora/header.ut"),
"utf8",
);
// Just enough ucode for these scripts: comments and the nav-type branches.
const renderFor = (source, navType) =>
source
.replace(/\{#[\s\S]*?#\}/g, "")
.replace(
/\{% if \(nav_type == 'sidebar'\): %\}([\s\S]*?)\{% endif %\}/g,
(_, body) => (navType === "sidebar" ? body : ""),
);
const replaySource = header.match(
/<script>\s*(\{% if \(nav_type == 'sidebar'\): %\}\s*\{#[^#]*#\}\s*function auroraCrumb[\s\S]*?)<\/script>/,
)?.[1];
const loginSource = header.match(
/\{% if \(blank_page\): %\}\s*<script>([\s\S]*?)<\/script>/,
)?.[1];
const classes = (...initial) => {
const set = new Set(initial);
return {
set,
contains: (name) => set.has(name),
toggle: (name, on) => (on ? set.add(name) : set.delete(name), on),
};
};
const surface = (extra = {}) => {
const el = { style: { display: "none" }, dataset: {}, html: null, ...extra };
Object.defineProperty(el, "innerHTML", {
set(value) {
el.html = value;
},
});
return el;
};
// A sidebar as the snapshot left it: System was the active group then.
const sidebarFixture = (activePath) => {
const group = (name, label, links) => {
const item = { classList: classes(), lastChild: {} };
if (name === "system")
item.classList.set.add("is-active-group").add("is-expanded");
item.toggle = {
tagName: "BUTTON",
dataset: { section: name },
parentNode: item,
};
item.label = { textContent: label };
item.links = links.map(([page, text]) => ({
pathname: `/cgi-bin/luci/admin/${name}/${page}`,
textContent: text,
classList: classes(
...(name === "system" && page === "system" ? ["is-active-page"] : []),
),
}));
item.querySelector = (sel) =>
sel === ".nav-category-label" ? item.label : null;
return item;
};
const direct = {
tagName: "A",
dataset: { section: "status" },
textContent: "Status",
classList: classes(),
};
const groups = [
group("network", "Network", [
["wireless", "Wireless"],
["network", "Interfaces"],
]),
group("system", "System", [
["system", "System"],
["admin", "Administration"],
]),
];
const links = [direct, ...groups.flatMap((g) => g.links)];
const list = surface({
dataset: { activePath },
querySelectorAll: (sel) =>
sel === "[data-section]"
? [direct, ...groups.map((g) => g.toggle)]
: sel === ".navigation-sublink"
? groups.flatMap((g) => g.links)
: [],
querySelector: (sel) =>
sel === ".is-active-group"
? (groups.find((g) => g.classList.contains("is-active-group")) ?? null)
: sel === ".is-active-page"
? (links.find((l) => l.classList.contains("is-active-page")) ?? null)
: null,
});
return { list, direct, groups };
};
const run = ({
navType,
stamp = "s",
cached = "s",
luciMenu = true,
elements,
}) => {
const store = {
"aurora.nav": JSON.stringify([
cached,
Object.fromEntries(
Object.keys(elements)
.filter((id) => id !== "header-crumb")
.map((id) => [id, `<${id}>`]),
),
]),
"luci-session-store": JSON.stringify({ sid: luciMenu ? { menu: {} } : {} }),
};
const document = {
body: { dataset: { navStamp: stamp } },
getElementById: (id) => elements[id] ?? null,
createElement: () => ({}),
};
new Function("document", "sessionStorage", renderFor(replaySource, navType))(
document,
{
getItem: (key) => store[key] ?? null,
},
);
};
test("header.ut carries the replay and the login-page clear", () => {
assert.ok(replaySource, "replay script not found");
assert.ok(loginSource, "login-page script not found");
});
test("a sidebar replay paints inert and re-marks the current page", () => {
const { list, direct, groups } = sidebarFixture("network/wireless");
const footer = surface();
const crumb = { replaceChildren: (...items) => (crumb.items = items) };
run({
navType: "sidebar",
elements: {
"sidebar-list": list,
"sidebar-footer": footer,
"header-crumb": crumb,
},
});
for (const el of [list, footer]) {
assert.equal(
el.html,
`<${el === list ? "sidebar-list" : "sidebar-footer"}>`,
);
assert.equal(el.inert, true);
assert.equal(el.dataset.restored, "");
}
const [network, system] = groups;
assert.deepEqual(
[...network.classList.set],
["is-active-group", "is-expanded"],
);
assert.deepEqual([...system.classList.set], []);
assert.equal(direct.classList.contains("is-active-page"), false);
assert.deepEqual(
groups
.flatMap((g) => g.links)
.filter((l) => l.classList.contains("is-active-page"))
.map((l) => l.textContent),
["Wireless"],
);
assert.deepEqual(
crumb.items.map((li) => [li.className, li.textContent]),
[
["", "Network"],
["crumb-sep", "/"],
["current", "Wireless"],
],
);
});
test("a direct row is marked on its own section, with no sublink", () => {
const { list, direct, groups } = sidebarFixture("status");
const crumb = { replaceChildren: (...items) => (crumb.items = items) };
run({
navType: "sidebar",
elements: { "sidebar-list": list, "header-crumb": crumb },
});
assert.equal(direct.classList.contains("is-active-page"), true);
assert.ok(groups.every((g) => g.classList.set.size === 0));
assert.ok(
groups
.flatMap((g) => g.links)
.every((l) => !l.classList.contains("is-active-page")),
);
assert.deepEqual(
crumb.items.map((li) => [li.className, li.textContent]),
[["current", "Status"]],
);
});
test("a top menu replay only paints, inert", () => {
const topmenu = surface();
run({ navType: "mega-menu", elements: { topmenu } });
assert.equal(topmenu.html, "<topmenu>");
assert.equal(topmenu.style.display, "");
assert.equal(topmenu.inert, true);
});
test("nothing is replayed for another stamp or after luci-base flushed its menu", () => {
for (const options of [{ cached: "other user" }, { luciMenu: false }]) {
const topmenu = surface();
run({ navType: "mega-menu", elements: { topmenu }, ...options });
assert.equal(topmenu.html, null, JSON.stringify(options));
assert.equal(topmenu.inert, undefined);
}
});
test("the login page drops the cached nav", () => {
const removed = [];
new Function(
"localStorage",
"sessionStorage",
"window",
"document",
renderFor(loginSource),
)(
{ getItem: () => null },
{ removeItem: (key) => removed.push(key) },
{ matchMedia: () => ({ matches: false }) },
{ documentElement: { setAttribute() {} } },
);
assert.deepEqual(removed, ["aurora.nav"]);
});
@@ -6,6 +6,10 @@ const source = await readFile(
new URL("../src/resource/menu-aurora.js", import.meta.url), new URL("../src/resource/menu-aurora.js", import.meta.url),
"utf8", "utf8",
); );
const header = await readFile(
new URL("../../ucode/template/themes/aurora/header.ut", import.meta.url),
"utf8",
);
const getMethodSource = (name) => { const getMethodSource = (name) => {
const start = source.indexOf(` ${name}(`); const start = source.indexOf(` ${name}(`);
@@ -196,6 +200,19 @@ class FakeElement {
} }
} }
replaceChildren(...children) {
this.children = [];
children.forEach((child) => this.appendChild(child));
}
set className(value) {
this.setAttribute("class", value);
}
set textContent(value) {
this.children = [String(value)];
}
set innerHTML(value) { set innerHTML(value) {
assert.equal(value, ""); assert.equal(value, "");
this.children = []; this.children = [];
@@ -238,6 +255,7 @@ const loadMenuModule = ({
requestpath = [], requestpath = [],
translate = (value) => value, translate = (value) => value,
window = {}, window = {},
sessionStorage = {},
} = {}) => { } = {}) => {
const baseclass = { const baseclass = {
extend(module) { extend(module) {
@@ -259,8 +277,21 @@ const loadMenuModule = ({
"document", "document",
"window", "window",
"localStorage", "localStorage",
"sessionStorage",
source, source,
)(baseclass, ui, E, L, translate, document, window, {}); )(baseclass, ui, E, L, translate, document, window, {}, sessionStorage);
};
// header.ut's crumb renderer (shared with menu-aurora.js), on a fake document.
const loadHeaderCrumb = (elements) => {
const fn = header.match(/function auroraCrumb\(\) \{[\s\S]*?\n\t\t\t\}/)?.[0];
assert.ok(fn, "header.ut must define auroraCrumb()");
return new Function("document", `${fn}; return auroraCrumb;`)({
getElementById: (id) => elements[id] ?? null,
createElement: (tagName) => new FakeElement(tagName),
});
}; };
const textContent = (element) => const textContent = (element) =>
@@ -688,22 +719,22 @@ test("renders mobile items and logout repeatedly without duplicate listeners", (
assert.equal(list.listenerCount("click"), 1); assert.equal(list.listenerCount("click"), 1);
}); });
test("renders sidebar items, logout, and translated crumbs without duplication", () => { test("renders sidebar items and logout without duplication, then the crumb", () => {
const list = new FakeElement("ul", {}, [new FakeElement("li")]); const list = new FakeElement("ul", {}, [new FakeElement("li")]);
const footer = new FakeElement("div", {}, [new FakeElement("a")]); const footer = new FakeElement("div", {}, [new FakeElement("a")]);
const crumb = new FakeElement("ol", {}, [new FakeElement("li")]);
const document = createFakeDocument({ const document = createFakeDocument({
elements: { elements: {
"#header-crumb": crumb,
"#sidebar-footer": footer, "#sidebar-footer": footer,
"#sidebar-list": list, "#sidebar-list": list,
}, },
navType: "sidebar", navType: "sidebar",
}); });
let crumbRenders = 0;
const menu = loadMenuModule({ const menu = loadMenuModule({
dispatchpath: ["admin", "network", "wireless"], dispatchpath: ["admin", "network", "wireless"],
document, document,
translate: (value) => `translated:${value}`, translate: (value) => `translated:${value}`,
window: { auroraCrumb: () => (crumbRenders += 1) },
}); });
const tree = { const tree = {
children: { children: {
@@ -735,28 +766,32 @@ test("renders sidebar items, logout, and translated crumbs without duplication",
assert.equal(footer.children[0].getAttribute("class"), "nav-link"); assert.equal(footer.children[0].getAttribute("class"), "nav-link");
assert.equal(footer.children[0].getAttribute("href"), "/admin/logout"); assert.equal(footer.children[0].getAttribute("href"), "/admin/logout");
assert.equal(textContent(footer.children[0]), "translated:Logout"); assert.equal(textContent(footer.children[0]), "translated:Logout");
assert.equal(crumb.children.length, 3); assert.equal(crumbRenders, 2);
assert.equal(list.dataset.accordionBound, "true");
assert.equal(list.listenerCount("click"), 1);
const crumb = new FakeElement("ol", {}, [new FakeElement("li")]);
loadHeaderCrumb({ "header-crumb": crumb, "sidebar-list": list })();
assert.deepEqual( assert.deepEqual(
crumb.children.map((child) => textContent(child)), crumb.children.map((child) => textContent(child)),
["translated:Network", "/", "translated:Wireless"], ["translated:Network", "/", "translated:Wireless"],
); );
assert.equal(crumb.children[2].getAttribute("class"), "current"); assert.deepEqual(
assert.equal(list.dataset.accordionBound, "true"); crumb.children.map((child) => child.getAttribute("class")),
assert.equal(list.listenerCount("click"), 1); ["", "crumb-sep", "current"],
);
}); });
test("collapses same-named group/page crumbs to a single level", () => { test("collapses same-named group/page crumbs to a single level", () => {
const list = new FakeElement("ul");
const crumb = new FakeElement("ol", {}, [new FakeElement("li")]); const crumb = new FakeElement("ol", {}, [new FakeElement("li")]);
const document = createFakeDocument({
elements: {
"#header-crumb": crumb,
"#sidebar-list": new FakeElement("ul"),
},
navType: "sidebar",
});
const menu = loadMenuModule({ const menu = loadMenuModule({
dispatchpath: ["admin", "system", "system"], dispatchpath: ["admin", "system", "system"],
document, document: createFakeDocument({
elements: { "#sidebar-list": list },
navType: "sidebar",
}),
translate: (value) => `translated:${value}`, translate: (value) => `translated:${value}`,
}); });
const tree = { const tree = {
@@ -771,6 +806,7 @@ test("collapses same-named group/page crumbs to a single level", () => {
}; };
menu.renderSidebar(menu.buildNavigationModel(getMenuChildren(tree), "admin")); menu.renderSidebar(menu.buildNavigationModel(getMenuChildren(tree), "admin"));
loadHeaderCrumb({ "header-crumb": crumb, "sidebar-list": list })();
assert.deepEqual( assert.deepEqual(
crumb.children.map((child) => textContent(child)), crumb.children.map((child) => textContent(child)),
@@ -779,6 +815,71 @@ test("collapses same-named group/page crumbs to a single level", () => {
assert.equal(crumb.children[0].getAttribute("class"), "current"); assert.equal(crumb.children[0].getAttribute("class"), "current");
}); });
test("caches the rendered nav under the stamp header.ut replays against", () => {
const stored = new Map();
const document = {
...createFakeDocument(),
body: { dataset: { navStamp: "sidebar:zh_Hans:root:1.3.0" } },
querySelectorAll: () => [
{ id: "sidebar-list", firstChild: {}, innerHTML: "<li>list</li>" },
{ id: "sidebar-footer", firstChild: null, innerHTML: "" },
],
};
const menu = loadMenuModule({
document,
sessionStorage: { setItem: (key, value) => stored.set(key, value) },
});
menu.cacheNav();
assert.deepEqual(JSON.parse(stored.get("aurora.nav")), [
"sidebar:zh_Hans:root:1.3.0",
{ "sidebar-list": "<li>list</li>" },
]);
// Both sides read the one server-rendered stamp (user included).
assert.match(header, /<body [^>]*data-nav-stamp="[^"]*ctx\?\.authuser/);
assert.match(header, /cache\?\.\[0\] !== body\.dataset\.navStamp\) return;/);
// Storage that throws (privacy modes, quota) leaves rendering untouched.
const sealed = loadMenuModule({
document,
sessionStorage: {
setItem() {
throw new Error("sealed");
},
},
});
assert.doesNotThrow(() => sealed.cacheNav());
});
test("releases the inert replay however the menu load settles", () => {
const init = getMethodSource("__init__");
// In finally: a failed load or a throwing render must not leave a dead copy.
assert.match(
init,
/\.finally\(\(\) => \{[\s\S]*querySelectorAll\("\[data-restored\]"\)[\s\S]*inert = false/,
);
});
test("drops the replayed top menu before building the live one", () => {
const ul = E("ul", { id: "topmenu" }, [E("li")]);
const menu = loadMenuModule({
document: createFakeDocument({ elements: { "#topmenu": ul } }),
});
let childrenAtInit = null;
menu.initMegaMenu = (children, url, list) => {
childrenAtInit = list.children.length;
};
menu.renderMainMenu(
{ children: { status: { title: "Status", children: { a: {} } } } },
"admin",
);
assert.equal(childrenAtInit, 0);
});
test("renders an active group expanded when an open mobile list was initially empty", () => { test("renders an active group expanded when an open mobile list was initially empty", () => {
const list = new FakeElement("ul"); const list = new FakeElement("ul");
const overlay = new FakeElement("div", { class: "mobile-menu-open" }, [list]); const overlay = new FakeElement("div", { class: "mobile-menu-open" }, [list]);
@@ -204,6 +204,28 @@ test("desktop sidebar styles only provide desktop navigation density", () => {
assert.doesNotMatch(sidebar, /bg-brand-subtle/); assert.doesNotMatch(sidebar, /bg-brand-subtle/);
}); });
test("desktop sidebar toggles move the column and the panel as one", () => {
const sidebar = getBlock(layoutStyles, 'body[data-nav-type="sidebar"]');
const easing = "250ms_var(--ease-in-out)";
// The column width and the panel's translate share one curve and length,
// so the content edge stays on the sidebar edge in every frame.
assert.ok(
sidebar.includes(`md:[transition:grid-template-columns_${easing}]`),
);
assert.ok(
getBlock(sidebar, "& .sidebar-panel-inner {").includes(
`[transition:translate_${easing}]`,
),
);
// Hidden only after the slide-out, shown at once on the way in.
assertIncludesUtilities(
getBlock(sidebar, "&.sidebar-collapsed .sidebar-panel {"),
["invisible", "[transition:visibility_0s_250ms]"],
);
assert.doesNotMatch(layoutStyles, /sidebar-anim|sidebar-run-/);
});
test("mobile drawer styles only provide mobile navigation density", () => { test("mobile drawer styles only provide mobile navigation density", () => {
const drawer = getBlock(overlayStyles, ".mobile-menu-overlay"); const drawer = getBlock(overlayStyles, ".mobile-menu-overlay");
const icon = getBlock(drawer, "& .nav-icon"); const icon = getBlock(drawer, "& .nav-icon");
@@ -0,0 +1,37 @@
import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import { resolve } from "node:path";
import test from "node:test";
const root = resolve(import.meta.dirname, "../..");
const css = readFileSync(resolve(root, "htdocs/luci-static/aurora/main.css"), "utf8");
const header = readFileSync(resolve(root, "ucode/template/themes/aurora/header.ut"), "utf8");
test("only the typed theme toggle captures the page in a view transition", () => {
assert.match(header, /ViewTransitionTypeSet \? \{ update: apply, types: \['theme'\] \} : apply/);
// Standalone rule: merged into a selector list, an engine without
// :active-view-transition-type() would drop its neighbours too.
assert.match(css, /\}:root:not\(:active-view-transition-type\(theme\)\)\{view-transition-name:none\}/);
});
test("late content fades in without a filling animation", () => {
const rule = css.match(/#view>:not\(\.spinning\)[^{]*\{([^}]*)\}/);
assert.ok(rule, "missing page-entry fade rule");
assert.match(rule[1], /\bbackwards\b/);
assert.doesNotMatch(rule[1], /\bboth\b/);
});
test("a collapsed sidebar is restored before anything resolves body's style", () => {
// The sidebar column transitions; a class landing after a style flush
// (the page-bg script's getComputedStyle) would ease it shut on load.
const restore = header.indexOf("aurora.sidebarCollapsed");
assert.ok(restore > header.indexOf("<body"), "restore runs inside body");
assert.ok(
restore < header.indexOf("getComputedStyle"),
"restore precedes the page-bg style read",
);
assert.ok(
restore < header.indexOf("<header>"),
"restore precedes the header markup",
);
});
+12 -7
View File
@@ -111,9 +111,8 @@ test("mega-menu reveal is compositor-only and the frost never overlaps it", () =
sheet?.includes("duration-(--mega-menu-duration,300ms)"), sheet?.includes("duration-(--mega-menu-duration,300ms)"),
`sheet must share the adaptive duration: ${sheet}`, `sheet must share the adaptive duration: ${sheet}`,
); );
// The curtain carries the blur permanently (Apple's globalnav-curtain) and // The curtain only dims: a blurred full-screen fade dropped frames on weak
// fades it with opacity/visibility. Close must start that fade immediately; // GPUs. Opacity fades out at once; visibility waits for it without tweening.
// delaying the curtain left blur visible after the sheet had collapsed.
assert.ok( assert.ok(
!overlay.includes("max-md:backdrop-blur-lg"), !overlay.includes("max-md:backdrop-blur-lg"),
"opaque mobile overlay must not blur hidden pixels", "opaque mobile overlay must not blur hidden pixels",
@@ -122,12 +121,18 @@ test("mega-menu reveal is compositor-only and the frost never overlaps it", () =
.split("\n") .split("\n")
.find((l) => l.includes("bg-mega-menu-scrim")); .find((l) => l.includes("bg-mega-menu-scrim"));
assert.ok( assert.ok(
curtain?.includes("backdrop-blur-lg"), !curtain?.includes("backdrop-"),
`desktop curtain blur: ${curtain}`, `desktop curtain must not blur: ${curtain}`,
); );
assert.ok( assert.ok(
curtain?.includes("duration-[220ms]") && !curtain.includes("delay-"), curtain?.includes("[transition:opacity_220ms_") &&
`desktop curtain exit must be immediate: ${curtain}`, curtain.includes(",visibility_0s_220ms]") &&
!curtain.includes("delay-"),
`desktop curtain: immediate opacity exit, delayed visibility: ${curtain}`,
);
assert.ok(
/&\.active\s*\{\s*@apply[^;]*\[transition-delay:0s\]/.test(overlay),
"desktop curtain must show without delay",
); );
assert.ok(!overlay.includes(".settled"), "settle-gated frost must stay gone"); assert.ok(!overlay.includes(".settled"), "settle-gated frost must stay gone");
}); });
+2 -2
View File
@@ -8,8 +8,8 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=Aurora Theme (A modern browser theme built with Vite and Tailwind CSS) LUCI_TITLE:=Aurora Theme (A modern browser theme built with Vite and Tailwind CSS)
LUCI_DEPENDS:=+luci-base LUCI_DEPENDS:=+luci-base
PKG_VERSION:=1.3.3 PKG_VERSION:=1.3.7
PKG_RELEASE:=80 PKG_RELEASE:=81
PKG_LICENSE:=Apache-2.0 PKG_LICENSE:=Apache-2.0
LUCI_MINIFY_CSS:= LUCI_MINIFY_CSS:=
@@ -1,2 +1,2 @@
/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */ /*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-content:"";--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-border-style:solid;--tw-duration:initial;--tw-ease:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-border-spacing-x:0;--tw-border-spacing-y:0}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-mono:var(--font-mono);--spacing:var(--spacing);--container-xs:20rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--blur-md:12px;--blur-lg:16px;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1Line truncated @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-content:"";--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-border-style:solid;--tw-duration:initial;--tw-ease:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-space-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-border-spacing-x:0;--tw-border-spacing-y:0}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-mono:var(--font-mono);--spacing:var(--spacing);--container-xs:20rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--blur-md:12px;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (notLine truncated
@@ -1 +1 @@
"use strict";"require baseclass";"require ui";const PALETTE_RECENTS_KEY="aurora.paletteRecents";return baseclass.extend({__init__(){ui.menu.load().then(e=>this.render(e)),this.initNavigationControls(),this.initUciIndicator()},initUciIndicator(){const e=ui.changes?.setIndicator;e&&(ui.changes.setIndicator=function(t){e.call(this,t),document.querySelector('[data-indicator="uci-changes"]')?.setAttribute("data-count",t||0)})},initNavigationControls(){const e=document.querySelector("#mobile-menu-overlay"),t=document.querySelector("#navigation-toggle");if(!t||!e)return;const a=e.querySelector("#mobile-nav-list"),n=window.matchMedia("(min-width: 768px)"),i="aurora.sidebarCollapsed";let s;const o=()=>n.matches&&"sidebar"===document.body.dataset.navType,r=e=>{const a=o();t.classList.toggle("is-expanded",e&&!n.matches),t.setAttribute("aria-expanded",e?"true":"false"),t.setAttribute("aria-controls",a?"sidebar-panel":"mobile-menu-overlay");const i=e&&!a?_("Close"):_("Navigation");t.setAttribute("title",i),t.setAttribute("aria-label",i)},l=()=>{e.classList.contains("mobile-menu-open")&&(e.classList.remove("mobile-menu-open"),document.body.classList.remove("mobile-navigation-open"),document.body.style.overflow="",this.resetNavigationGroups(a),r(!1))};this.closeMobileNavigation=l;const c=t=>{if(o()){l();const e=!t,a=document.body;return a.classList.remove("sidebar-anim-open","sidebar-anim-close"),a.classList.add(e?"sidebar-anim-close":"sidebar-anim-open"),clearTimeout(s),s=setTimeout(()=>{a.classList.remove("sidebar-anim-open","sidebar-anim-close")},300),a.classList.toggle("sidebar-collapsed",e),localStorage.setItem(i,e),void r(t)}if(n.matches)return l(),void r(!1);e.classList.toggle("mobile-menu-open",t),document.body.classList.toggle("mobile-navigation-open",t),document.body.style.overflow=t?"hidden":"",t?this.expandActiveNavigationGroup(a):this.resetNavigationGroups(a),r(t)},d=()=>{if(l(),o()){const e="true"===localStorage.getItem(i);return document.body.classList.toggle("sidebar-collapsed",e),void r(!e)}r(!1)};t.addEventListener("click",t=>{t.stopPropagation(),c(!(o()?!document.body.classList.contains("sidebar-collapsed"):!n.matches&&e.classList.contains("mobile-menu-open")))}),e.addEventListener("click",t=>{t.target===e&&c(!1)}),document.addEventListener("keydown",t=>{"Escape"===t.key&&e.classList.contains("mobile-menu-open")&&c(!1)}),n.addEventListener("change",d),d(),document.addEventListener("click",t=>{const a=t.target?.closest?.(".navigation-direct, .navigation-sublink, .mobile-nav-logout");a&&e.contains(a)&&c(!1)})},renderMobileMenu(e){const t=document.querySelector("#mobile-nav-list"),a=document.querySelector("#mobile-nav-footer-action");t&&(t.innerHTML=""),a&&(a.innerHTML=""),t&&(e.forEach(e=>{e.isLogout?a&&a.appendChild(E("a",{class:"mobile-nav-logout",href:e.href},[e.title])):t.appendChild(this.renderNavigationItem(e,"mobile"))}),this.bindNavigationAccordion(t))},render(e){this.tree=e,this.renderModeMenu(e),this.renderTabs(e)},renderTabs(e){if(L.env.dispatchpath.length<3)return;let t=e,a="";for(let e=0;e<3&&t;e++){const n=L.env.dispatchpath[e];t=t.children?.[n],a+=(a?"/":"")+n}t&&this.renderTabMenu(t,a)},syncRoute(){if(!this.tree)return;const e=new URL(L.url(...L.env.dispatchpath.slice(0,3)),location.href).pathname;document.querySelectorAll("#topmenu a, .desktop-menu-canvas a, #sidebar-list a, #mobile-nav-list a").forEach(t=>{const a=t.pathname===e&&!t.getAttribute("href").startsWith("#");t.classList.toggle("is-active-page",a),a?t.setAttribute("aria-current","page"):t.removeAttribute("aria-current")}),document.querySelectorAll(".navigation-group").forEach(e=>{const t=!!e.querySelector("a.is-active-page"),a=e.querySelector(".navigation-group-toggle");e.classList.toggle("is-active-group",t),t?a?.setAttribute("aria-current","location"):a?.removeAttribute("aria-current")});for(const e of[document.querySelector("#sidebar-list"),document.querySelector("#mobile-nav-list")])this.resetNavigationGroups(e),this.expandActiveNavigationGroup(e);this.renderCrumb();const t=document.querySelector("#tabmenu");t&&(t.innerHTML="",t.style.display="none"),this.renderTabs(this.tree)},closeSurfaces(){this.hideDesktopNav(),this.paletteList&&this.closePalette(),this.closeMobileNavigation?.()},renderTabMenu(e,t,a=0){const n=document.querySelector("#tabmenu"),i=E("ul",{class:"tabs"}),s=ui.menu.getChildren(e);let o=null;return s.forEach(e=>{const n=L.env.dispatchpath[3+a]===e.name;i.appendChild(E("li",{class:`tabmenu-item-${e.name}${n?" active":""}`},[E("a",{href:L.url(t,e.name)},[_(e.title)])])),n&&(o=e)}),i.children.length?(n.appendChild(i),n.style.display="",o&&this.renderTabMenu(o,`${t}/${o.name}`,a+1),i):E([])},renderMainMenu(e,t,a=0,n=null){const i=a?E("ul",{class:"desktop-nav-list"}):document.querySelector("#topmenu"),s=ui.menu.getChildren(e);if(a>1)return E([]);if(0===a){const e=document.body?.dataset?.navType||"mega-menu";if("sidebar"===e)return this.renderSidebar(n||[]),i||E([]);if(!i||!s.length)return E([]);"mega-menu"===e?Line truncated "use strict";"require baseclass";"require ui";const PALETTE_RECENTS_KEY="aurora.paletteRecents";return baseclass.extend({__init__(){ui.menu.load().then(e=>this.render(e)).finally(()=>{for(const e of document.querySelectorAll("[data-restored]"))e.inert=!1}),this.initNavigationControls(),this.initUciIndicator()},initUciIndicator(){const e=ui.changes?.setIndicator;e&&(ui.changes.setIndicator=function(t){e.call(this,t),document.querySelector('[data-indicator="uci-changes"]')?.setAttribute("data-count",t||0)})},initNavigationControls(){const e=document.querySelector("#mobile-menu-overlay"),t=document.querySelector("#navigation-toggle");if(!t||!e)return;const a=e.querySelector("#mobile-nav-list"),n=window.matchMedia("(min-width: 768px)"),i="aurora.sidebarCollapsed",s=()=>n.matches&&"sidebar"===document.body.dataset.navType,o=e=>{const a=s();t.classList.toggle("is-expanded",e&&!n.matches),t.setAttribute("aria-expanded",e?"true":"false"),t.setAttribute("aria-controls",a?"sidebar-panel":"mobile-menu-overlay");const i=e&&!a?_("Close"):_("Navigation");t.setAttribute("title",i),t.setAttribute("aria-label",i)},r=()=>{e.classList.contains("mobile-menu-open")&&(e.classList.remove("mobile-menu-open"),document.body.classList.remove("mobile-navigation-open"),document.body.style.overflow="",this.resetNavigationGroups(a),o(!1))};this.closeMobileNavigation=r;const l=t=>{if(s()){r();const e=!t;return document.body.classList.toggle("sidebar-collapsed",e),localStorage.setItem(i,e),void o(t)}if(n.matches)return r(),void o(!1);e.classList.toggle("mobile-menu-open",t),document.body.classList.toggle("mobile-navigation-open",t),document.body.style.overflow=t?"hidden":"",t?this.expandActiveNavigationGroup(a):this.resetNavigationGroups(a),o(t)},c=()=>{if(r(),s()){const e="true"===localStorage.getItem(i);return document.body.classList.toggle("sidebar-collapsed",e),void o(!e)}o(!1)};t.addEventListener("click",t=>{t.stopPropagation(),l(!(s()?!document.body.classList.contains("sidebar-collapsed"):!n.matches&&e.classList.contains("mobile-menu-open")))}),e.addEventListener("click",t=>{t.target===e&&l(!1)}),document.addEventListener("keydown",t=>{"Escape"===t.key&&e.classList.contains("mobile-menu-open")&&l(!1)}),n.addEventListener("change",c),c(),document.addEventListener("click",t=>{const a=t.target?.closest?.(".navigation-direct, .navigation-sublink, .mobile-nav-logout");a&&e.contains(a)&&l(!1)})},renderMobileMenu(e){const t=document.querySelector("#mobile-nav-list"),a=document.querySelector("#mobile-nav-footer-action");t&&(t.innerHTML=""),a&&(a.innerHTML=""),t&&(e.forEach(e=>{e.isLogout?a&&a.appendChild(E("a",{class:"mobile-nav-logout",href:e.href},[e.title])):t.appendChild(this.renderNavigationItem(e,"mobile"))}),this.bindNavigationAccordion(t))},render(e){this.tree=e,this.renderModeMenu(e),this.renderTabs(e),this.cacheNav()},cacheNav(){const e={};for(const t of document.querySelectorAll("#topmenu, #sidebar-list, #sidebar-footer"))t.firstChild&&(e[t.id]=t.innerHTML);try{sessionStorage.setItem("aurora.nav",JSON.stringify([document.body.dataset.navStamp,e]))}catch{}},renderTabs(e){if(L.env.dispatchpath.length<3)return;let t=e,a="";for(let e=0;e<3&&t;e++){const n=L.env.dispatchpath[e];t=t.children?.[n],a+=(a?"/":"")+n}t&&this.renderTabMenu(t,a)},syncRoute(){if(!this.tree)return;const e=new URL(L.url(...L.env.dispatchpath.slice(0,3)),location.href).pathname;document.querySelectorAll("#topmenu a, .desktop-menu-canvas a, #sidebar-list a, #mobile-nav-list a").forEach(t=>{const a=t.pathname===e&&!t.getAttribute("href").startsWith("#");t.classList.toggle("is-active-page",a),a?t.setAttribute("aria-current","page"):t.removeAttribute("aria-current")}),document.querySelectorAll(".navigation-group").forEach(e=>{const t=!!e.querySelector("a.is-active-page"),a=e.querySelector(".navigation-group-toggle");e.classList.toggle("is-active-group",t),t?a?.setAttribute("aria-current","location"):a?.removeAttribute("aria-current")});for(const e of[document.querySelector("#sidebar-list"),document.querySelector("#mobile-nav-list")])this.resetNavigationGroups(e),this.expandActiveNavigationGroup(e);window.auroraCrumb?.();const t=document.querySelector("#tabmenu");t&&(t.innerHTML="",t.style.display="none"),this.renderTabs(this.tree)},closeSurfaces(){this.hideDesktopNav(),this.paletteList&&this.closePalette(),this.closeMobileNavigation?.()},renderTabMenu(e,t,a=0){const n=document.querySelector("#tabmenu"),i=E("ul",{class:"tabs"}),s=ui.menu.getChildren(e);let o=null;return s.forEach(e=>{const n=L.env.dispatchpath[3+a]===e.name;i.appendChild(E("li",{class:`tabmenu-item-${e.name}${n?" active":""}`},[E("a",{href:L.url(t,e.name)},[_(e.title)])])),n&&(o=e)}),i.children.length?(n.appendChild(i),n.style.display="",o&&this.renderTabMenu(o,`${t}/${o.name}`,a+1),i):E([])},renderMainMenu(e,t,a=0,n=null){const i=a?E("ul",{class:"desktop-nav-list"}):document.querySelector("#topmenu"),s=ui.menu.getChildren(e);if(a>1)return E([]);if(0===a){const e=document.body?.dataset?.navType||"megaLine truncated
@@ -107,6 +107,8 @@
const theme = localStorage.getItem('aurora.theme') || 'device'; const theme = localStorage.getItem('aurora.theme') || 'device';
const isDark = theme === 'dark' || (theme === 'device' && window.matchMedia('(prefers-color-scheme: dark)').matches); const isDark = theme === 'dark' || (theme === 'device' && window.matchMedia('(prefers-color-scheme: dark)').matches);
document.documentElement.setAttribute('data-darkmode', isDark); document.documentElement.setAttribute('data-darkmode', isDark);
{# A new session may see a different menu: drop the replayed nav. #}
try { sessionStorage.removeItem('aurora.nav'); } catch (e) {}
})(); })();
</script> </script>
{% else %} {% else %}
@@ -122,7 +124,8 @@
if (prev !== null && prev !== next && document.startViewTransition && !navOpen && if (prev !== null && prev !== next && document.startViewTransition && !navOpen &&
!window.matchMedia('(prefers-reduced-motion: reduce)').matches) { !window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
document.startViewTransition(apply); // Typed: main.css leaves the page uncaptured for any other transition.
document.startViewTransition(window.ViewTransitionTypeSet ? { update: apply, types: ['theme'] } : apply);
} else { } else {
apply(); apply();
} }
@@ -224,8 +227,16 @@
{% endif %} {% endif %}
</head> </head>
<body class="lang_{{ dispatcher.lang }}" data-page="{{ entityencode(page, true) }}" data-nav-type="{{ nav_type }}" data-asset-version="{# PKG_VERSION #}"{% if (length(patch_all)): %} data-patches="{{ entityencode(join(' ', patch_all), true) }}"{% endif %}{% if (blank_page ? tokens.struct_login_bg : tokens.struct_main_bg): %} data-bg{% endif %}> <body class="lang_{{ dispatcher.lang }}" data-page="{{ entityencode(page, true) }}" data-nav-type="{{ nav_type }}" data-asset-version="{# PKG_VERSION #}"{% if (!blank_page): %} data-nav-stamp="{{ entityencode(join(':', [nav_type, dispatcher.lang, ctx?.authuser ?? '']), true) }}:{# PKG_VERSION #}"{% endif %}{% if (length(patch_all)): %} data-patches="{{ entityencode(join(' ', patch_all), true) }}"{% endif %}{% if (blank_page ? tokens.struct_login_bg : tokens.struct_main_bg): %} data-bg{% endif %}>
{% if (!blank_page): %} {% if (!blank_page): %}
{% if (nav_type == 'sidebar'): %}
{# First in body: once anything resolves body's style (the page-bg script does), the column would ease shut on load. #}
<script>
if (localStorage.getItem('aurora.sidebarCollapsed') === 'true') {
document.body.classList.add('sidebar-collapsed');
}
</script>
{% endif %}
{% if (tokens.struct_main_bg): %} {% if (tokens.struct_main_bg): %}
<div class="page-bg" aria-hidden="true"></div> <div class="page-bg" aria-hidden="true"></div>
<script> <script>
@@ -306,16 +317,58 @@
<img class="sidebar-logo" src="{{ media }}/images/{{ logo_svg }}?v={{ icon_cache_version }}" alt="" aria-hidden="true"> <img class="sidebar-logo" src="{{ media }}/images/{{ logo_svg }}?v={{ icon_cache_version }}" alt="" aria-hidden="true">
<a class="sidebar-brand" href="/">{{ hostname }}</a> <a class="sidebar-brand" href="/">{{ hostname }}</a>
</div> </div>
<ul class="sidebar-list" id="sidebar-list"></ul> <ul class="sidebar-list" id="sidebar-list" data-active-path="{{ entityencode(join('/', slice(ctx?.path ?? [], 1, 3)), true) }}"></ul>
<div class="sidebar-footer" id="sidebar-footer"></div> <div class="sidebar-footer" id="sidebar-footer"></div>
</nav> </nav>
</aside> </aside>
<script>
if (localStorage.getItem('aurora.sidebarCollapsed') === 'true') {
document.body.classList.add('sidebar-collapsed');
}
</script>
{% endif %} {% endif %}
<script>
{% if (nav_type == 'sidebar'): %}
{# Shared with menu-aurora.js, which calls it after every render and route change. #}
function auroraCrumb() {
const list = document.getElementById('sidebar-list');
const group = list.querySelector('.is-active-group')?.querySelector('.nav-category-label')?.textContent;
const page = list.querySelector('.is-active-page')?.textContent;
const titles = [group, page !== group && page].filter(Boolean);
const li = (className, textContent) => Object.assign(document.createElement('li'), { className, textContent });
document.getElementById('header-crumb').replaceChildren(...titles.flatMap((title, i) =>
i ? [li('crumb-sep', '/'), li('current', title)] : [li(titles[1] ? '' : 'current', title)]));
}
{% endif %}
{# Paints the nav menu-aurora.js cached on its last render before first paint, inert until the module renders over it. #}
(() => {
try {
const body = document.body, cache = JSON.parse(sessionStorage.getItem('aurora.nav'));
{# The stamp (nav type, language, user, version) is rendered on body; a different user sees a different menu. #}
{# luci-base's one-session store loses its menu on ui.menu.flushCache() (package changes): never replay past that. #}
const luci = Object.values(JSON.parse(sessionStorage.getItem('luci-session-store')) ?? {})[0];
if (!luci?.menu || cache?.[0] !== body.dataset.navStamp) return;
for (const id in cache[1]) {
const el = document.getElementById(id);
el.innerHTML = cache[1][id];
el.style.display = '';
el.dataset.restored = '';
el.inert = true;
}
{% if (nav_type == 'sidebar'): %}
{# The marks renderNavigationItem derives from L.env.dispatchpath. #}
const list = document.getElementById('sidebar-list'), [group, page] = list.dataset.activePath.split('/');
for (const row of list.querySelectorAll('[data-section]')) {
const on = row.dataset.section === group, item = row.parentNode;
if (row.tagName === 'A') {
row.classList.toggle('is-active-page', on);
continue;
}
item.classList.toggle('is-active-group', on);
item.classList.toggle('is-expanded', on);
}
for (const link of list.querySelectorAll('.navigation-sublink'))
link.classList.toggle('is-active-page', !!page && link.pathname.endsWith(`/${group}/${page}`));
auroraCrumb();
{% endif %}
} catch (e) {}
})();
</script>
<div class="mobile-menu-overlay" id="mobile-menu-overlay"> <div class="mobile-menu-overlay" id="mobile-menu-overlay">
<nav class="mobile-nav" aria-label="{{ _('Navigation') }}"> <nav class="mobile-nav" aria-label="{{ _('Navigation') }}">
+1 -1
View File
@@ -14,4 +14,4 @@ Restored HTML loses inline JS handlers (`innerHTML` serialization), so anything
**Bump `v` whenever the sidebar markup changes shape.** **Bump `v` whenever the sidebar markup changes shape.**
Cross-document `@view-transition` rules live in `components/_view-transitions.css` (only `#sidebar` gets its own snapshot group — the topbar must not, or its top-layer snapshot escapes `.content-card`'s rounded-corner clipping during transitions); they assume the cache keeps the sidebar's first frame populated. The theme captures no view transitions (`components/_view-transitions.css` sets `:root { view-transition-name: none }`); swapped and freshly loaded content fades in instead. On desktop, collapsing eases the rail's width (`_layout.css`) and `#main-wrapper`, a flex-1 sibling, follows it frame by frame: the content is pushed, never snapped and slid back. `sidebar-shadcn.js` sets `html[data-sidebar-anim]` on the first toggle so a page load never plays the transition.
+1 -1
View File
@@ -27,12 +27,12 @@
"@types/node": "^25.9.1", "@types/node": "^25.9.1",
"colorjs.io": "^0.6.1", "colorjs.io": "^0.6.1",
"husky": "^9.1.7", "husky": "^9.1.7",
"lightningcss": "^1.32.0",
"lint-staged": "^16.4.0", "lint-staged": "^16.4.0",
"prettier": "^3.8.3", "prettier": "^3.8.3",
"prettier-plugin-tailwindcss": "^0.8.0", "prettier-plugin-tailwindcss": "^0.8.0",
"tailwindcss": "^4.3.0", "tailwindcss": "^4.3.0",
"terser": "^5.47.1", "terser": "^5.47.1",
"tw-animate-css": "^1.4.0",
"vite": "^8.0.13" "vite": "^8.0.13"
}, },
"packageManager": "pnpm@12.4.1+sha512.2e81e399d73fe8390dab25e06aa788ab7a5908248d2f5a370f82b481147a6a7a367bf8048f9a6fdb6460f21a66f0542dedb8b94ca2c8723596741920b1656d4c" "packageManager": "pnpm@12.4.1+sha512.2e81e399d73fe8390dab25e06aa788ab7a5908248d2f5a370f82b481147a6a7a367bf8048f9a6fdb6460f21a66f0542dedb8b94ca2c8723596741920b1656d4c"
+3 -8
View File
@@ -187,6 +187,9 @@ importers:
husky: husky:
specifier: ^9.1.7 specifier: ^9.1.7
version: 9.1.7 version: 9.1.7
lightningcss:
specifier: ^1.32.0
version: 1.32.0
lint-staged: lint-staged:
specifier: ^16.4.0 specifier: ^16.4.0
version: 16.4.0 version: 16.4.0
@@ -202,9 +205,6 @@ importers:
terser: terser:
specifier: ^5.47.1 specifier: ^5.47.1
version: 5.47.1 version: 5.47.1
tw-animate-css:
specifier: ^1.4.0
version: 1.4.0
vite: vite:
specifier: ^8.0.13 specifier: ^8.0.13
version: 8.0.13(@types/node@25.9.1)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0) version: 8.0.13(@types/node@25.9.1)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0)
@@ -801,9 +801,6 @@ packages:
tslib@2.8.1: tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
tw-animate-css@1.4.0:
resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==}
undici-types@7.24.6: undici-types@7.24.6:
resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==}
@@ -1300,8 +1297,6 @@ snapshots:
tslib@2.8.1: tslib@2.8.1:
optional: true optional: true
tw-animate-css@1.4.0: {}
undici-types@7.24.6: {} undici-types@7.24.6: {}
vite@8.0.13(@types/node@25.9.1)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0): vite@8.0.13(@types/node@25.9.1)(jiti@2.7.0)(terser@5.47.1)(yaml@2.9.0):
+27 -17
View File
@@ -1,10 +1,10 @@
/* ── Sidebar ──────────────────────────────────────────────────────── */ /* ── Sidebar ──────────────────────────────────────────────────────── */
#sidebar { #sidebar {
/* Width only: `transition-all` would also ease background-color, making the /* Mobile drawer: translate only; `transition-all` would also ease
sidebar lag a beat behind the untransitioned content area on theme flips. */ background-color and lag the sidebar behind the content on theme flips. */
@apply bg-sidebar-bg flex h-full w-[220px] shrink-0 flex-col overflow-hidden transition-[width] duration-200; @apply bg-sidebar-bg flex h-full w-[220px] shrink-0 flex-col overflow-hidden;
@apply max-md:fixed max-md:top-0 max-md:left-0 max-md:z-40 max-md:w-[240px] max-md:-translate-x-full max-md:shadow-xl max-md:transition-transform; @apply max-md:fixed max-md:top-0 max-md:left-0 max-md:z-40 max-md:w-[240px] max-md:-translate-x-full max-md:shadow-xl max-md:[transition:translate_.2s];
/* Drawer height tracks the dynamic viewport so its bottom edge meets the /* Drawer height tracks the dynamic viewport so its bottom edge meets the
Safari toolbar smoothly instead of jumping when the toolbar shows/hides. */ Safari toolbar smoothly instead of jumping when the toolbar shows/hides. */
@apply max-md:h-dvh; @apply max-md:h-dvh;
@@ -54,7 +54,7 @@ html[data-sidebar-collapsed="true"] #sidebar {
} }
.sidebar-toggle { .sidebar-toggle {
@apply text-sidebar-muted flex h-7 w-7 shrink-0 cursor-pointer items-center justify-center rounded-md border-0 bg-transparent p-0 transition-colors; @apply text-sidebar-muted flex h-7 w-7 shrink-0 cursor-pointer items-center justify-center rounded-md border-0 bg-transparent p-0 [transition:color_.15s,background-color_.15s,border-color_.15s];
&:hover { &:hover {
@apply bg-sidebar-accent text-sidebar-accent-fg; @apply bg-sidebar-accent text-sidebar-accent-fg;
@@ -82,7 +82,7 @@ html[data-sidebar-collapsed="true"] #sidebar {
} }
.sidebar-nav-parent { .sidebar-nav-parent {
@apply text-sidebar-muted flex w-full cursor-pointer appearance-none items-center justify-start gap-2.5 rounded-md border-0 bg-transparent px-2 py-1.5 text-left text-sm font-medium transition-colors duration-150; @apply text-sidebar-muted flex w-full cursor-pointer appearance-none items-center justify-start gap-2.5 rounded-md border-0 bg-transparent px-2 py-1.5 text-left text-sm font-medium [transition:color_.15s,background-color_.15s,border-color_.15s];
&:hover { &:hover {
@apply bg-sidebar-accent text-sidebar-accent-fg; @apply bg-sidebar-accent text-sidebar-accent-fg;
@@ -101,7 +101,7 @@ html[data-sidebar-collapsed="true"] #sidebar {
} }
.sidebar-chevron { .sidebar-chevron {
@apply ml-auto shrink-0 transition-transform duration-200; @apply ml-auto shrink-0 [transition:rotate_.2s];
svg, svg,
img { img {
@apply h-3.5 w-3.5; @apply h-3.5 w-3.5;
@@ -132,7 +132,7 @@ html[data-sidebar-collapsed="true"] #sidebar {
opening bounces every row below them. visibility transitions too, so the opening bounces every row below them. visibility transitions too, so the
collapsed links leave the tab order only once the close has finished. */ collapsed links leave the tab order only once the close has finished. */
.sidebar-accordion-sub { .sidebar-accordion-sub {
@apply invisible grid grid-rows-[0fr] overflow-hidden opacity-0 transition-[grid-template-rows,opacity,visibility] duration-200 ease-out; @apply invisible grid grid-rows-[0fr] overflow-hidden opacity-0 [transition:grid-template-rows_.2s_var(--ease-out),opacity_.2s_var(--ease-out),visibility_.2s_var(--ease-out)];
> * { > * {
@apply min-h-0 self-start; @apply min-h-0 self-start;
@@ -156,7 +156,7 @@ html[data-sidebar-collapsed="true"] #sidebar {
} }
.sidebar-sub-link { .sidebar-sub-link {
@apply text-sidebar-muted block rounded-md px-2 py-1.5 text-sm no-underline transition-colors; @apply text-sidebar-muted block rounded-md px-2 py-1.5 text-sm no-underline [transition:color_.15s,background-color_.15s,border-color_.15s];
&:hover { &:hover {
@apply bg-sidebar-accent text-sidebar-accent-fg; @apply bg-sidebar-accent text-sidebar-accent-fg;
@@ -178,7 +178,7 @@ html[data-sidebar-collapsed="true"] #sidebar {
} }
.sidebar-collapsed-popover-link { .sidebar-collapsed-popover-link {
@apply text-sidebar-muted mx-1 block rounded-sm px-2 py-1.5 text-sm no-underline transition-colors; @apply text-sidebar-muted mx-1 block rounded-sm px-2 py-1.5 text-sm no-underline [transition:color_.15s,background-color_.15s,border-color_.15s];
&:hover { &:hover {
@apply bg-sidebar-accent text-sidebar-accent-fg; @apply bg-sidebar-accent text-sidebar-accent-fg;
@@ -197,7 +197,7 @@ html[data-sidebar-collapsed="true"] #sidebar {
} }
.sidebar-logout { .sidebar-logout {
@apply text-sidebar-muted flex w-full items-center gap-2.5 rounded-md px-2 py-1.5 text-sm no-underline transition-colors; @apply text-sidebar-muted flex w-full items-center gap-2.5 rounded-md px-2 py-1.5 text-sm no-underline [transition:color_.15s,background-color_.15s,border-color_.15s];
&:hover { &:hover {
@apply bg-sidebar-accent text-sidebar-accent-fg; @apply bg-sidebar-accent text-sidebar-accent-fg;
@@ -237,6 +237,12 @@ html[data-sidebar-collapsed="true"] #sidebar {
@apply border-panel-border bg-panel-bg flex flex-1 flex-col overflow-hidden rounded-xl border shadow-sm max-md:rounded-none max-md:border-none max-md:shadow-none; @apply border-panel-border bg-panel-bg flex flex-1 flex-col overflow-hidden rounded-xl border shadow-sm max-md:rounded-none max-md:border-none max-md:shadow-none;
} }
/* The rail width eases and #main-wrapper (flex-1) follows it frame by frame.
data-sidebar-anim is set on the first toggle, so a page load never plays it. */
html[data-sidebar-anim] #sidebar {
@apply md:[transition:width_200ms_var(--ease-out)];
}
/* ── Card header ─────────────────────────────────────────────────── */ /* ── Card header ─────────────────────────────────────────────────── */
.card-header { .card-header {
@@ -251,7 +257,7 @@ html[data-sidebar-collapsed="true"] #sidebar {
} }
.topbar-hamburger { .topbar-hamburger {
@apply text-muted-foreground hidden h-8 w-8 cursor-pointer items-center justify-center rounded-md border-0 bg-transparent p-0 transition-colors max-md:flex; @apply text-muted-foreground hidden h-8 w-8 cursor-pointer items-center justify-center rounded-md border-0 bg-transparent p-0 [transition:color_.15s,background-color_.15s,border-color_.15s] max-md:flex;
&:hover { &:hover {
@apply bg-muted; @apply bg-muted;
@@ -283,7 +289,7 @@ html[data-sidebar-collapsed="true"] #sidebar {
} }
button.topbar-icon-btn { button.topbar-icon-btn {
@apply text-muted-foreground inline-flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center rounded-md border-0 bg-transparent p-0 transition-colors; @apply text-muted-foreground inline-flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center rounded-md border-0 bg-transparent p-0 [transition:color_.15s,background-color_.15s,border-color_.15s];
&:hover { &:hover {
@apply bg-muted text-foreground; @apply bg-muted text-foreground;
@@ -295,16 +301,20 @@ button.topbar-icon-btn {
} }
.topbar-indicators { .topbar-indicators {
@apply flex items-center gap-2; @apply flex items-center;
/* LuCI-owned spans: icon via ::before mask only (no JS / no img) */ /* LuCI-owned spans: icon via ::before mask only (no JS / no img) */
span[data-indicator] { span[data-indicator] {
> img { > img {
@apply hidden; @apply hidden;
} }
@apply text-muted-foreground relative inline-flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center rounded-md text-[0px] transition-colors; @apply text-muted-foreground relative inline-flex h-8 w-8 shrink-0 cursor-pointer items-center justify-center rounded-md text-[0px] [transition:color_.15s,background-color_.15s,border-color_.15s,width_.15s_ease-out,opacity_.15s_ease-out,margin-left_.15s_ease-out] starting:w-0 starting:opacity-0;
@apply before:relative before:block before:size-4 before:shrink-0 before:bg-current before:[mask-size:cover] before:[mask-position:center] before:[mask-repeat:no-repeat]; @apply before:relative before:block before:size-4 before:shrink-0 before:bg-current before:[mask-size:cover] before:[mask-position:center] before:[mask-repeat:no-repeat];
& + span[data-indicator] {
@apply ml-2 starting:ml-0;
}
&:hover { &:hover {
@apply bg-muted text-foreground; @apply bg-muted text-foreground;
} }
@@ -335,7 +345,7 @@ button.topbar-icon-btn {
/* ── Maincontent ──────────────────────────────────────────────────── */ /* ── Maincontent ──────────────────────────────────────────────────── */
#maincontent { #maincontent {
@apply flex-1 overflow-y-auto p-6 max-md:p-4; @apply flex-1 [scrollbar-gutter:stable] overflow-y-auto p-6 max-md:p-4;
h1 { h1 {
@apply mb-4 border-0 pl-0 text-2xl font-semibold tracking-tight; @apply mb-4 border-0 pl-0 text-2xl font-semibold tracking-tight;
@@ -409,7 +419,7 @@ button.topbar-icon-btn {
#sidebar-overlay { #sidebar-overlay {
/* Absolute, not fixed: iOS Safari 26 tints its bars from edge-touching /* Absolute, not fixed: iOS Safari 26 tints its bars from edge-touching
fixed elements' background-color, opacity notwithstanding. */ fixed elements' background-color, opacity notwithstanding. */
@apply bg-overlay-base-a50 pointer-events-none absolute inset-0 z-30 opacity-0 transition-opacity duration-200 md:hidden; @apply bg-overlay-base-a50 pointer-events-none absolute inset-0 z-30 opacity-0 [transition:opacity_.2s] md:hidden;
&.active { &.active {
@apply pointer-events-auto opacity-100; @apply pointer-events-auto opacity-100;
@@ -0,0 +1,14 @@
/* Everything still transitions, for 1ms: luci-base acts on transitionend
(dropdown focus, notification removal), which transition: none never fires. */
@media (prefers-reduced-motion: reduce) {
*,
::before,
::after {
@apply [transition-delay:0s]! [transition-duration:1ms]! [animation-delay:0s]! [animation-duration:1ms]!;
}
/* A loading spinner is state, not decoration. */
.spinning::before {
@apply [animation-duration:1s]!;
}
}
@@ -48,12 +48,24 @@
@apply whitespace-nowrap; @apply whitespace-nowrap;
} }
.fade-in { @keyframes shadcn-fade-in {
@apply animate-in fade-in-0 fill-mode-backwards duration-400; from {
opacity: 0;
}
}
/* Also content that lands after first paint: the view's top-level blocks
(full load and router swap; poll never re-inserts them) and a switched-in
form tab pane (the dashboard's polled tabs sit under .Dashboard). */
.fade-in,
#view > :not(.spinning),
#view > .cbi-map > .cbi-map-tabbed > [data-tab-active="true"],
.cbi-section-node-tabbed > [data-tab-active="true"] {
@apply animate-[shadcn-fade-in_250ms_ease_backwards];
} }
.fade-out { .fade-out {
@apply pointer-events-none opacity-0 transition-opacity duration-400; @apply pointer-events-none opacity-0 [transition:opacity_.4s];
} }
.spinning { .spinning {
@@ -16,7 +16,7 @@
} }
.zonebadge { .zonebadge {
@apply border-secondary bg-secondary text-secondary-foreground inline-flex items-center gap-1.5 overflow-visible rounded-md border px-2 py-1 align-middle text-sm leading-normal font-semibold transition-colors duration-200; @apply border-secondary bg-secondary text-secondary-foreground inline-flex items-center gap-1.5 overflow-visible rounded-md border px-2 py-1 align-middle text-sm leading-normal font-semibold [transition:color_.2s,background-color_.2s,border-color_.2s];
&[style*="--zone-color-rgb"] { &[style*="--zone-color-rgb"] {
@apply border-transparent bg-[rgb(var(--zone-color-rgb),.6)]!; @apply border-transparent bg-[rgb(var(--zone-color-rgb),.6)]!;
@@ -40,7 +40,7 @@
} }
.ifacebadge { .ifacebadge {
@apply border-border bg-label-surface text-foreground inline-flex cursor-default flex-nowrap items-center gap-1.5 rounded-lg border px-2.5 py-1.5 text-sm font-normal transition-colors duration-200; @apply border-border bg-label-surface text-foreground inline-flex cursor-default flex-nowrap items-center gap-1.5 rounded-lg border px-2.5 py-1.5 text-sm font-normal [transition:color_.2s,background-color_.2s,border-color_.2s];
.zonebadge > & { .zonebadge > & {
@apply rounded-md px-1.5 py-0; @apply rounded-md px-1.5 py-0;
@@ -4,7 +4,7 @@ input[type="submit"],
input[type="reset"], input[type="reset"],
.btn, .btn,
.cbi-button { .cbi-button {
@apply inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors duration-200; @apply inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium [transition:color_.2s,background-color_.2s,border-color_.2s];
&[disabled] { &[disabled] {
@apply cursor-not-allowed opacity-40; @apply cursor-not-allowed opacity-40;
@@ -64,7 +64,7 @@
} }
.ifacebox-head { .ifacebox-head {
@apply border-border bg-label-surface text-foreground w-full rounded-t-lg border-b px-3 py-2 text-center text-sm font-semibold transition-colors duration-200; @apply border-border bg-label-surface text-foreground w-full rounded-t-lg border-b px-3 py-2 text-center text-sm font-semibold [transition:color_.2s,background-color_.2s,border-color_.2s];
&[style*="--zone-color-rgb"] { &[style*="--zone-color-rgb"] {
@apply bg-[rgb(var(--zone-color-rgb),.65)]!; @apply bg-[rgb(var(--zone-color-rgb),.65)]!;
@@ -1,5 +1,5 @@
.cbi-dropdown { .cbi-dropdown {
@apply relative inline-flex h-fit max-w-full min-w-fit shrink-0 items-center p-0 whitespace-nowrap transition-colors duration-200; @apply relative inline-flex h-fit max-w-full min-w-fit shrink-0 items-center p-0 whitespace-nowrap [transition:color_.2s,background-color_.2s,border-color_.2s];
&[disabled] { &[disabled] {
@apply pointer-events-none opacity-40; @apply pointer-events-none opacity-40;
@@ -13,8 +13,9 @@
} }
} }
/* luci-base moves focus into the list only on the ul's transitionend. */
> ul { > ul {
@apply m-0 flex flex-1 list-none flex-nowrap items-center gap-0.5 overflow-hidden; @apply m-0 flex flex-1 list-none flex-nowrap items-center gap-0.5 overflow-hidden opacity-99 [transition:opacity_120ms_ease-out];
> li { > li {
@apply m-0 hidden list-none items-center gap-1 overflow-hidden px-2 py-1.5; @apply m-0 hidden list-none items-center gap-1 overflow-hidden px-2 py-1.5;
@@ -48,7 +49,7 @@
} }
&.dropdown { &.dropdown {
@apply border-border bg-panel-bg absolute left-0 z-50 w-fit min-w-full overflow-y-auto rounded-lg border shadow-lg backdrop-blur-sm; @apply border-border bg-panel-bg absolute left-0 z-50 w-fit min-w-full overflow-y-auto rounded-lg border opacity-100 shadow-lg;
> li { > li {
@apply text-muted-foreground hover:bg-muted min-h-9 w-full cursor-pointer px-3 py-1.5 text-sm font-medium; @apply text-muted-foreground hover:bg-muted min-h-9 w-full cursor-pointer px-3 py-1.5 text-sm font-medium;
@@ -44,7 +44,7 @@
@apply inline-flex w-max max-w-96 flex-col items-start gap-3 max-md:max-w-full; @apply inline-flex w-max max-w-96 flex-col items-start gap-3 max-md:max-w-full;
.item { .item {
@apply border-border bg-panel-bg pointer-events-auto relative inline-flex cursor-move flex-col items-start gap-2 self-stretch overflow-hidden rounded-lg border py-3 pr-9 pl-4 break-all shadow-sm transition-all duration-200 select-text; @apply border-border bg-panel-bg pointer-events-auto relative inline-flex cursor-move flex-col items-start gap-2 self-stretch overflow-hidden rounded-lg border py-3 pr-9 pl-4 break-all shadow-sm select-text [transition:scale_.2s,opacity_.2s,box-shadow_.2s,border-color_.2s,background-color_.2s];
&::after { &::after {
content: "×"; content: "×";
@@ -69,7 +69,7 @@
} }
.add-item { .add-item {
@apply border-border hover:border-border-a80 hover:bg-muted-a30 inline-flex items-center gap-1.5 self-stretch rounded-lg border border-dashed bg-transparent px-1 py-1 transition-colors duration-200; @apply border-border hover:border-border-a80 hover:bg-muted-a30 inline-flex items-center gap-1.5 self-stretch rounded-lg border border-dashed bg-transparent px-1 py-1 [transition:color_.2s,background-color_.2s,border-color_.2s];
> input { > input {
@apply min-w-56 flex-1; @apply min-w-56 flex-1;
@@ -8,7 +8,7 @@ input[type="number"],
input[type="email"], input[type="email"],
.cbi-input-text, .cbi-input-text,
.cbi-input { .cbi-input {
@apply border-input bg-background text-foreground placeholder:text-muted-foreground-a70 focus:border-primary focus:ring-ring relative w-52.5 max-w-full rounded-lg border px-3 py-1.5 text-sm shadow-none transition-colors duration-200 focus:ring-2 focus:outline-none; @apply border-input bg-background text-foreground placeholder:text-muted-foreground-a70 focus:border-primary focus:ring-ring relative w-52.5 max-w-full rounded-lg border px-3 py-1.5 text-sm shadow-none [transition:color_.2s,background-color_.2s,border-color_.2s] focus:ring-2 focus:outline-none;
.table.cbi-section-table & { .table.cbi-section-table & {
@apply w-full; @apply w-full;
@@ -24,7 +24,7 @@ input[type="email"],
} }
textarea { textarea {
@apply border-input bg-background text-foreground placeholder:text-muted-foreground-a70 focus:border-primary focus:ring-ring min-h-24 w-full resize-y rounded-lg border px-3 py-2 text-sm transition-colors duration-200 focus:ring-2 focus:outline-none; @apply border-input bg-background text-foreground placeholder:text-muted-foreground-a70 focus:border-primary focus:ring-ring min-h-24 w-full resize-y rounded-lg border px-3 py-2 text-sm [transition:color_.2s,background-color_.2s,border-color_.2s] focus:ring-2 focus:outline-none;
&[disabled] { &[disabled] {
@apply cursor-not-allowed opacity-40; @apply cursor-not-allowed opacity-40;
@@ -34,8 +34,8 @@ textarea {
input[type="radio"], input[type="radio"],
input[type="checkbox"] { input[type="checkbox"] {
@apply relative mr-3 inline-block h-4 w-4 cursor-pointer appearance-none align-middle disabled:cursor-not-allowed; @apply relative mr-3 inline-block h-4 w-4 cursor-pointer appearance-none align-middle disabled:cursor-not-allowed;
@apply before:border-input before:bg-background before:absolute before:inset-0 before:rounded before:border before:transition-colors before:duration-200; @apply before:border-input before:bg-background before:absolute before:inset-0 before:rounded before:border before:[transition:background-color_.2s,border-color_.2s];
@apply after:bg-primary-foreground after:absolute after:inset-0 after:[mask-size:cover] after:[mask-position:center] after:[mask-repeat:no-repeat] after:opacity-0 after:transition-opacity after:duration-200; @apply after:bg-primary-foreground after:absolute after:inset-0 after:[mask-size:cover] after:[mask-position:center] after:[mask-repeat:no-repeat] after:opacity-0 after:[transition:opacity_.2s];
@apply checked:before:border-primary checked:before:bg-primary checked:after:opacity-100; @apply checked:before:border-primary checked:before:bg-primary checked:after:opacity-100;
@apply focus:before:ring-ring focus:before:ring-2 focus:before:outline-none; @apply focus:before:ring-ring focus:before:ring-2 focus:before:outline-none;
} }
@@ -6,7 +6,7 @@
} }
> .modal { > .modal {
@apply border-border bg-panel-bg flex w-full max-w-2xl flex-col gap-4 rounded-xl border p-6 break-words whitespace-normal shadow-2xl backdrop-blur-lg; @apply border-border bg-panel-bg flex w-full max-w-2xl flex-col gap-4 rounded-xl border p-6 break-words whitespace-normal shadow-2xl;
h4 { h4 {
@apply mb-0 text-center; @apply mb-0 text-center;
@@ -46,7 +46,7 @@ button.cmdk-trigger {
separates title from label — 460 read cramped once rows became separates title from label — 460 read cramped once rows became
two-anchored. */ two-anchored. */
@apply border-panel-border bg-panel-bg mt-[15vh] flex w-[min(560px,calc(100vw-32px))] flex-col overflow-hidden rounded-xl border shadow-2xl; @apply border-panel-border bg-panel-bg mt-[15vh] flex w-[min(560px,calc(100vw-32px))] flex-col overflow-hidden rounded-xl border shadow-2xl;
@apply transition-[opacity,translate] duration-150 ease-out starting:-translate-y-1.5 starting:opacity-0; @apply [transition:opacity_.15s_var(--ease-out),translate_.15s_var(--ease-out)] starting:-translate-y-1.5 starting:opacity-0;
@apply max-md:mt-0 max-md:h-dvh max-md:w-full max-md:rounded-none max-md:border-0 max-md:pt-[env(safe-area-inset-top)] max-md:shadow-none max-md:transition-none; @apply max-md:mt-0 max-md:h-dvh max-md:w-full max-md:rounded-none max-md:border-0 max-md:pt-[env(safe-area-inset-top)] max-md:shadow-none max-md:transition-none;
} }
@@ -3,6 +3,6 @@
@apply before:text-foreground before:absolute before:inset-x-0 before:top-1/2 before:-translate-y-1/2 before:text-center before:text-[10px] before:leading-none before:whitespace-nowrap before:content-[attr(title)]; @apply before:text-foreground before:absolute before:inset-x-0 before:top-1/2 before:-translate-y-1/2 before:text-center before:text-[10px] before:leading-none before:whitespace-nowrap before:content-[attr(title)];
> div { > div {
@apply from-progress-bar-start to-progress-bar-end h-full bg-gradient-to-r transition-all duration-300; @apply from-progress-bar-start to-progress-bar-end h-full bg-gradient-to-r [transition:width_.3s];
} }
} }
@@ -6,7 +6,7 @@
DOM. Only width and opacity move. Reduced motion drops the transitions, DOM. Only width and opacity move. Reduced motion drops the transitions,
not the bar. */ not the bar. */
#luci-nav-progress { #luci-nav-progress {
@apply from-progress-bar-start to-progress-bar-end pointer-events-none fixed top-0 left-0 z-80 h-0.5 w-0 bg-linear-to-r transition-[width] duration-300 ease-out; @apply from-progress-bar-start to-progress-bar-end pointer-events-none fixed top-0 left-0 z-80 h-0.5 w-0 bg-linear-to-r [transition:width_.3s_var(--ease-out)];
&[data-state="done"] { &[data-state="done"] {
@apply opacity-0 [transition:width_.3s_ease-out,opacity_.15s_ease-in_.15s]; @apply opacity-0 [transition:width_.3s_ease-out,opacity_.15s_ease-in_.15s];
@@ -32,6 +32,6 @@
/* Outgoing page while the router renders the next one. */ /* Outgoing page while the router renders the next one. */
#view.view-leaving { #view.view-leaving {
@apply cursor-progress opacity-60 transition-opacity duration-150; @apply cursor-progress opacity-60 [transition:opacity_.15s];
} }
} }
@@ -1,5 +1,5 @@
select { select {
@apply border-input bg-background text-foreground focus:border-primary focus:ring-ring max-w-full min-w-52.5 appearance-none rounded-lg border px-3 py-1.5 pr-9 text-sm transition-colors duration-200 focus:ring-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-40 md:max-w-100; @apply border-input bg-background text-foreground focus:border-primary focus:ring-ring max-w-full min-w-52.5 appearance-none rounded-lg border px-3 py-1.5 pr-9 text-sm [transition:color_.2s,background-color_.2s,border-color_.2s] focus:ring-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-40 md:max-w-100;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%238888a0' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%238888a0' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: right 0.6rem center; background-position: right 0.6rem center;
@@ -34,7 +34,7 @@ table.table,
tr, tr,
.tr { .tr {
@apply hover:bg-label-surface max-md:border-border transition-colors duration-200 max-md:flex max-md:flex-wrap max-md:border-b max-md:px-2 max-md:py-2; @apply hover:bg-label-surface max-md:border-border [transition:background-color_.2s] max-md:flex max-md:flex-wrap max-md:border-b max-md:px-2 max-md:py-2;
&:first-child { &:first-child {
&:not([data-title]) { &:not([data-title]) {
@@ -74,7 +74,7 @@ table.table,
th, th,
.th { .th {
@apply border-border bg-label-surface border-b px-3 py-2.5 text-left text-sm font-medium backdrop-blur-sm max-md:hidden; @apply border-border bg-label-surface border-b px-3 py-2.5 text-left text-sm font-medium max-md:hidden;
&[width="100%"] { &[width="100%"] {
@apply w-full; @apply w-full;
@@ -14,7 +14,7 @@
} }
> a { > a {
@apply text-muted-foreground hover:text-foreground focus-visible:ring-ring-a50 inline-flex items-center justify-center rounded-md border border-transparent px-3 py-1 text-sm font-medium whitespace-nowrap no-underline transition-all focus-visible:ring-[3px] focus-visible:outline-none; @apply text-muted-foreground hover:text-foreground focus-visible:ring-ring-a50 inline-flex items-center justify-center rounded-md border border-transparent px-3 py-1 text-sm font-medium whitespace-nowrap no-underline [transition:color_.15s,background-color_.15s,border-color_.15s,box-shadow_.15s] focus-visible:ring-[3px] focus-visible:outline-none;
} }
&.cbi-tab > a { &.cbi-tab > a {
@@ -39,7 +39,7 @@
@apply border-border relative flex items-center gap-0 overflow-x-auto border-b; @apply border-border relative flex items-center gap-0 overflow-x-auto border-b;
a { a {
@apply text-muted-foreground hover:text-foreground block px-6 py-3 text-center text-sm font-medium whitespace-nowrap transition-colors duration-200 hover:no-underline; @apply text-muted-foreground hover:text-foreground block px-6 py-3 text-center text-sm font-medium whitespace-nowrap [transition:color_.2s,background-color_.2s,border-color_.2s] hover:no-underline;
} }
> li.active { > li.active {
@@ -7,7 +7,7 @@
`transition-all` would animate the inset and make the bubble fly in from `transition-all` would animate the inset and make the bubble fly in from
off-screen. `w-max` sizes the bubble by its content instead of the narrow off-screen. `w-max` sizes the bubble by its content instead of the narrow
anchor's containing block (which squeezed it to one word per line). */ anchor's containing block (which squeezed it to one word per line). */
@apply border-border-a60 bg-panel-bg text-foreground absolute inset-s-[-10000px] z-50 w-max max-w-xs scale-95 rounded-lg border px-3 py-2 text-xs break-normal whitespace-normal opacity-0 shadow-lg backdrop-blur-sm transition-[visibility,opacity,scale] duration-200 ease-out; @apply border-border-a60 bg-panel-bg text-foreground absolute inset-s-[-10000px] z-50 w-max max-w-xs scale-95 rounded-lg border px-3 py-2 text-xs break-normal whitespace-normal opacity-0 shadow-lg [transition:visibility_.2s_var(--ease-out),opacity_.2s_var(--ease-out),scale_.2s_var(--ease-out)];
&.error { &.error {
@apply border-destructive-a40 bg-destructive text-destructive-fg; @apply border-destructive-a40 bg-destructive text-destructive-fg;
@@ -25,10 +25,10 @@
.cbi-tooltip-container, .cbi-tooltip-container,
[data-tooltip] { [data-tooltip] {
@apply relative inline-block cursor-help whitespace-nowrap underline decoration-current decoration-dotted underline-offset-2 transition-all duration-200; @apply relative inline-block cursor-help whitespace-nowrap underline decoration-current decoration-dotted underline-offset-2;
.cbi-tooltip { .cbi-tooltip {
@apply invisible scale-95 opacity-0 transition-[visibility,opacity,scale] duration-200 ease-out; @apply invisible scale-95 opacity-0 [transition:visibility_.2s_var(--ease-out),opacity_.2s_var(--ease-out),scale_.2s_var(--ease-out)];
} }
&:hover .cbi-tooltip { &:hover .cbi-tooltip {
@@ -1,23 +1,6 @@
/* Cross-document view transitions: same-origin full-page navigations /* No view transitions: swapped and freshly loaded content fades in instead
cross-fade instead of hard-flashing. Progressive enhancement — browsers (_utilities.css). A captured page would crossfade two layouts on top of
without support (e.g. Firefox) keep plain instant navigation. */ that fade, and a cross-document one would only fade to the spinner. */
:root {
@view-transition { view-transition-name: none;
navigation: auto;
}
/* The sidebar persists across pages, so it gets its own snapshot group and
stays visually static while only the rest of the page transitions. The
topbar deliberately has no group: its snapshot would render in the top
layer, unclipped by .content-card's rounded corners (squaring them for
the whole transition), and its pixels are identical across pages anyway
so the root cross-fade already keeps it visually static. */
#sidebar {
view-transition-name: shadcn-sidebar;
}
@media (prefers-reduced-motion: reduce) {
@view-transition {
navigation: none;
}
} }
+35 -9
View File
@@ -4,18 +4,44 @@
* Licensed to the public under the Apache License 2.0. * Licensed to the public under the Apache License 2.0.
*/ */
@import "tailwindcss"; /* Theme variables and @apply'd utilities only: no Preflight, no scanned
classes. The reset below covers what sysauth.ut renders. */
@layer theme, base, components, utilities;
@import "tailwindcss/theme.css" layer(theme);
@import "tailwindcss/utilities.css" layer(utilities) source(none);
@import "./inter.css"; @import "./inter.css";
@import "./_tokens.css"; @import "./_tokens.css";
@import "./_shared.css"; @import "./_shared.css";
/* See main.css: keep dev-only tooling out of Tailwind's source detection. */
@source not "../../vite.config.ts";
@source not "../../scripts/*.client.js";
@custom-variant dark (&:where([data-darkmode=true], [data-darkmode=true] *)); @custom-variant dark (&:where([data-darkmode=true], [data-darkmode=true] *));
@layer base {
*,
::before,
::after {
@apply box-border;
}
body,
p {
@apply m-0;
}
button,
input {
@apply m-0 border-0 bg-transparent p-0 [color:inherit] [font:inherit];
}
::placeholder {
@apply opacity-100;
}
[hidden] {
@apply hidden!;
}
}
html { html {
@apply bg-background text-foreground font-sans text-sm; @apply bg-background text-foreground font-sans text-sm;
} }
@@ -128,7 +154,7 @@ html {
/* Glass input wrapper — matches sign-in.tsx GlassInputWrapper */ /* Glass input wrapper — matches sign-in.tsx GlassInputWrapper */
.login-input-glass { .login-input-glass {
@apply border-border bg-foreground-a5 relative rounded-2xl border transition-colors; @apply border-border bg-foreground-a5 relative rounded-2xl border [transition:color_.15s,background-color_.15s,border-color_.15s];
backdrop-filter: blur(4px); backdrop-filter: blur(4px);
&:focus-within { &:focus-within {
@@ -152,7 +178,7 @@ html {
@apply absolute inset-y-0 right-0 flex cursor-pointer items-center border-0 bg-transparent px-3; @apply absolute inset-y-0 right-0 flex cursor-pointer items-center border-0 bg-transparent px-3;
img { img {
@apply h-4 w-4 opacity-40 transition-opacity; @apply h-4 w-4 opacity-40 [transition:opacity_.15s];
} }
&:hover img { &:hover img {
@@ -161,7 +187,7 @@ html {
} }
.login-submit { .login-submit {
@apply bg-primary text-primary-foreground hover:bg-primary-hover mt-4 w-full cursor-pointer rounded-2xl border-0 py-3.5 text-sm font-medium transition-colors; @apply bg-primary text-primary-foreground hover:bg-primary-hover mt-4 w-full cursor-pointer rounded-2xl border-0 py-3.5 text-sm font-medium [transition:color_.15s,background-color_.15s,border-color_.15s];
} }
/* ── Footer ── */ /* ── Footer ── */
@@ -170,7 +196,7 @@ html {
@apply text-muted-foreground absolute right-0 bottom-5 left-0 px-6 text-center text-xs; @apply text-muted-foreground absolute right-0 bottom-5 left-0 px-6 text-center text-xs;
a { a {
@apply text-muted-foreground hover:text-foreground underline underline-offset-2 transition-colors; @apply text-muted-foreground hover:text-foreground underline underline-offset-2 [transition:color_.15s,background-color_.15s,border-color_.15s];
} }
} }
+1 -1
View File
@@ -7,7 +7,6 @@
@import "tailwindcss"; @import "tailwindcss";
@import "./inter.css"; @import "./inter.css";
@import "./_tokens.css"; @import "./_tokens.css";
@import "tw-animate-css";
/* Dev-only tooling holds prose and plain CSS whose bare words (static, /* Dev-only tooling holds prose and plain CSS whose bare words (static,
transition, backdrop-filter, …) Tailwind's automatic source detection would transition, backdrop-filter, …) Tailwind's automatic source detection would
@@ -41,3 +40,4 @@
@import "./components/_router.css"; @import "./components/_router.css";
@import "./_utilities.css"; @import "./_utilities.css";
@import "./_shared.css"; @import "./_shared.css";
@import "./_reduced-motion.css";
@@ -522,11 +522,6 @@ return baseclass.extend({
]; ];
const isMac = /Mac|iP(ad|hone|od)/.test(navigator.platform); const isMac = /Mac|iP(ad|hone|od)/.test(navigator.platform);
const keyEl = trigger.querySelector(".cmdk-trigger-key");
if (keyEl) {
keyEl.textContent = isMac ? "⌘K" : "Ctrl+K";
keyEl.hidden = false;
}
trigger.setAttribute("aria-keyshortcuts", isMac ? "Meta+K" : "Control+K"); trigger.setAttribute("aria-keyshortcuts", isMac ? "Meta+K" : "Control+K");
trigger.addEventListener("click", () => this.openPalette()); trigger.addEventListener("click", () => this.openPalette());
@@ -116,6 +116,7 @@ return baseclass.extend({
"data-sidebar-collapsed", "data-sidebar-collapsed",
next ? "true" : "false", next ? "true" : "false",
); );
document.documentElement.setAttribute("data-sidebar-anim", "");
localStorage.setItem(SIDEBAR_KEY, next); localStorage.setItem(SIDEBAR_KEY, next);
this._hideCollapsedPopover(); this._hideCollapsedPopover();
@@ -0,0 +1,62 @@
import assert from "node:assert/strict";
import { readFileSync, statSync } from "node:fs";
import { resolve } from "node:path";
import test from "node:test";
const output = resolve(import.meta.dirname, "../../htdocs/luci-static");
const read = (path) => readFileSync(resolve(output, path), "utf8");
const bytes = (path) => statSync(resolve(output, path)).size;
test("pruned login.css keeps every consumed variable resolvable", () => {
const css = read("shadcn/login.css");
const declared = new Set(
[...css.matchAll(/[{;](--[\w-]+):/g)].map((m) => m[1]),
);
const registered = new Set(
[...css.matchAll(/@property\s+(--[\w-]+)/g)].map((m) => m[1]),
);
// sysauth.ut declares it inline at render time.
const injected = new Set(["--login-bg-image"]);
const unresolvable = [];
for (const [, name, delim] of css.matchAll(/var\(\s*(--[\w-]+)\s*([,)])/g))
if (
delim !== "," &&
!declared.has(name) &&
!registered.has(name) &&
!injected.has(name)
)
unresolvable.push(name);
assert.deepEqual([...new Set(unresolvable)], []);
for (const adminOnly of ["--sidebar-bg:", "--terminal-foreground:"])
assert.ok(!css.includes(adminOnly), `${adminOnly} should be pruned`);
assert.ok(
css.includes("-webkit-backdrop-filter"),
"prefixes must survive the prune",
);
});
// uhttpd serves identity bytes, so raw size is what every cold load pays.
// Set 2026-09 from main 129213, login 10521, menu 15859, router 15771,
// sidebar 6107, Inter latin 48256, logo 258.
test("production assets stay within raw-transfer budgets", () => {
const main = bytes("shadcn/main.css");
const login = bytes("shadcn/login.css");
const menu = bytes("resources/menu-shadcn.js");
const router = bytes("resources/router-shadcn.js");
const sidebar = bytes("resources/sidebar-shadcn.js");
const font = bytes("shadcn/inter-latin-wght-normal.woff2");
const logo = bytes("shadcn/images/logo.svg");
assert.ok(main <= 130_000, `main.css ${main} B exceeds 130 KB`);
assert.ok(login <= 11_000, `login.css ${login} B exceeds 11 KB`);
assert.ok(menu <= 16_000, `menu-shadcn.js ${menu} B exceeds 16 KB`);
assert.ok(router <= 16_000, `router-shadcn.js ${router} B exceeds 16 KB`);
assert.ok(sidebar <= 6_500, `sidebar-shadcn.js ${sidebar} B exceeds 6.5 KB`);
assert.ok(
main + menu + router + sidebar + font <= 216_000,
"admin assets exceed 216 KB",
);
assert.ok(login + font + logo <= 60_000, "login assets exceed 60 KB");
});
+64
View File
@@ -14,6 +14,7 @@ import { luciDev, injectMockBar } from "@eamonxg/luci-theme-devkit/vite/dev";
import { existsSync, readdirSync } from "fs"; import { existsSync, readdirSync } from "fs";
import { mkdir, readdir, readFile, writeFile } from "fs/promises"; import { mkdir, readdir, readFile, writeFile } from "fs/promises";
import { dirname, join, resolve } from "path"; import { dirname, join, resolve } from "path";
import { transform as lightningcssTransform } from "lightningcss";
import { minify as terserMinify } from "terser"; import { minify as terserMinify } from "terser";
import { defineConfig, loadEnv, Plugin, ResolvedConfig } from "vite"; import { defineConfig, loadEnv, Plugin, ResolvedConfig } from "vite";
import config from "./luci-theme.config.js"; import config from "./luci-theme.config.js";
@@ -108,6 +109,68 @@ function createPatchAliasPlugin(): Plugin {
}; };
} }
/* login.css imports the full token sheet but the login page consumes a
fraction of it. Drop every custom property (and --tw-* @property) no var()
can reach, following --a: var(--b) chains; consumers are never touched, so
sysauth.ut's inline --login-bg-image keeps working. Same as aurora's. */
function createLoginCssPrunePlugin(): Plugin {
return {
name: "login-css-prune",
apply: "build",
enforce: "post",
async closeBundle() {
const path = resolve(BUILD_OUTPUT, "shadcn/login.css");
if (!existsSync(path)) return;
const css = await readFile(path, "utf-8");
const VALUE = `(?:"[^"]*"|'[^']*'|[^;{}"'])*`;
const roots = new Set<string>();
const edges = new Map<string, Set<string>>();
for (const [, name, value] of css.matchAll(
new RegExp(`(?<=[{;])(--[\\w-]+|[a-zA-Z-]+):(${VALUE})`, "g"),
)) {
const refs = [...value.matchAll(/var\(\s*(--[\w-]+)/g)].map(
(m) => m[1],
);
if (!name.startsWith("--")) refs.forEach((r) => roots.add(r));
else {
const deps = edges.get(name) ?? new Set<string>();
refs.forEach((r) => deps.add(r));
edges.set(name, deps);
}
}
const keep = new Set(roots);
const stack = [...roots];
while (stack.length) {
for (const dep of edges.get(stack.pop()!) ?? []) {
if (!keep.has(dep)) {
keep.add(dep);
stack.push(dep);
}
}
}
const pruned = css
.replace(
new RegExp(`(?<=[{;])(--[\\w-]+):${VALUE};?`, "g"),
(decl, name) => (keep.has(name) ? decl : ""),
)
.replace(/@property\s+(--[\w-]+)\{[^{}]*\}/g, (rule, name) =>
keep.has(name) ? rule : "",
)
.replace(/(?<=[{}])[^{}@]+\{\}/g, "");
// Parse only: a re-minify without Vite's targets would strip the
// -webkit- prefixes older Safari still needs.
lightningcssTransform({
filename: "login.css",
code: Buffer.from(pruned),
});
await writeFile(path, pruned);
},
};
}
export default defineConfig(({ mode, command }) => { export default defineConfig(({ mode, command }) => {
const env = loadEnv(mode, CURRENT_DIR); const env = loadEnv(mode, CURRENT_DIR);
// VITE_OPENWRT_HOST is just the router address — a bare IP/hostname like // VITE_OPENWRT_HOST is just the router address — a bare IP/hostname like
@@ -133,6 +196,7 @@ export default defineConfig(({ mode, command }) => {
...luciDev(config, { sshHost: OPENWRT_SSH_HOST }), ...luciDev(config, { sshHost: OPENWRT_SSH_HOST }),
createLuciJsCompressPlugin(), createLuciJsCompressPlugin(),
createPatchAliasPlugin(), createPatchAliasPlugin(),
createLoginCssPrunePlugin(),
], ],
build: { build: {
outDir: BUILD_OUTPUT, outDir: BUILD_OUTPUT,
+2 -2
View File
@@ -8,8 +8,8 @@ include $(TOPDIR)/rules.mk
LUCI_TITLE:=A modern sidebar LuCI theme for OpenWrt, built with shadcn/ui design language. LUCI_TITLE:=A modern sidebar LuCI theme for OpenWrt, built with shadcn/ui design language.
LUCI_DEPENDS:=+luci-base LUCI_DEPENDS:=+luci-base
PKG_VERSION:=0.5.4 PKG_VERSION:=0.5.10
PKG_RELEASE:=3 PKG_RELEASE:=4
PKG_LICENSE:=Apache-2.0 PKG_LICENSE:=Apache-2.0
LUCI_MINIFY_CSS:= LUCI_MINIFY_CSS:=
@@ -1 +1 @@
"use strict";"require baseclass";"require ui";const ICON_MAP={status:"activity",system:"settings",network:"network",services:"layers",nas:"hard-drive",control:"sliders-horizontal",vpn:"shield",docker:"container",statistics:"chart-bar",nlbw:"gauge",asterisk:"phone",logout:"log-out",default:"layout-dashboard"},CACHE_KEY="shadcn.sidebar.cache",RECENTS_KEY="shadcn.palette.recents";return baseclass.extend({__init__(){ui.menu.load().then(e=>{this.renderSidebarChrome(),this.render(e),this.initUciIndicator(),this.cacheSidebar(),window.addEventListener("pagehide",()=>this.cacheSidebar()),document.dispatchEvent(new Event("shadcn-sidebar-ready"))})},cacheSidebar(){if(window.shadcnSuppressSidebarCache)return;const e=document.getElementById("sidebar"),t=document.getElementById("sidebar-nav");if(e&&t)try{sessionStorage.setItem(CACHE_KEY,JSON.stringify({v:1,lang:document.documentElement.lang||"",html:e.innerHTML,scroll:t.scrollTop||0}))}catch(e){}},_mediaBase(){const e=document.documentElement.getAttribute("data-shadcn-media"),t=document.getElementById("sidebar"),a=t&&t.getAttribute("data-media");return String(e||a||"/luci-static/shadcn").replace(/\/$/,"")},_sectionIcon(e,t){const a=String(e||"").toLowerCase(),s=ICON_MAP[a]||ICON_MAP.default;return this._iconFile(s,t)},_isLogoutMenuItem(e){const t=String(e&&null!=e.name?e.name:"").toLowerCase();return"logout"===t||t.endsWith("/logout")},_iconFile(e,t){const a=this._mediaBase();return E("img",{src:`${a}/icons/${e}.svg`,width:String(t),height:String(t),alt:"",loading:"lazy",class:"shadcn-icon"})},_resolveMenuBranch(e){const t=L.env.dispatchpath||[],a=L.env.requestpath||[],s=ui.menu.getChildren(e);let n=a.length&&a[0]||t.length&&t[0]||"admin",i=null;for(let e=0;e<s.length;e++)if(s[e].name===n){i=s[e];break}return i||1!==s.length||(i=s[0],n=i.name),i||(i=e),{branch:i,branchUrl:i.name||n}},renderSidebarChrome(){const e=document.getElementById("sidebar");if(!e)return;if("1"===e.getAttribute("data-shadcn-built")){const t=e.querySelector(".sidebar-brand-text"),a=e.getAttribute("data-hostname");return void(t&&a&&t.textContent!==a&&(t.textContent=a))}e.setAttribute("data-shadcn-built","1");const t=this._mediaBase(),a=e.getAttribute("data-hostname")||"Shadcn";for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(E("div",{class:"sidebar-header"},[E("a",{class:"sidebar-brand",href:"/"},[E("img",{class:"sidebar-logo",src:`${t}/images/logo.svg`,alt:"Shadcn",width:"24",height:"24"}),E("span",{class:"sidebar-brand-text"},[a])]),E("button",{id:"sidebar-toggle-btn",class:"sidebar-toggle",type:"button","aria-label":_("Navigation")},[E("span",{class:"icon-collapse"},[this._iconFile("panel-left-close",16)]),E("span",{class:"icon-expand"},[this._iconFile("panel-left-open",16)])])])),e.appendChild(E("nav",{class:"sidebar-nav",id:"sidebar-nav"})),e.appendChild(E("div",{class:"sidebar-footer",id:"sidebar-footer",hidden:""}))},render(e){const{branch:t,branchUrl:a}=this._resolveMenuBranch(e);this.tree=e,this.branch=t,this.branchUrl=a,this.renderSidebarNav(t,a),this.renderBreadcrumb(t,a),this.initPalette(t,a),this.renderTabs(e)},renderTabs(e){const t=L.env.dispatchpath||[],a=document.getElementById("tabmenu");a&&(a.innerHTML="",a.style.display="none");let s=e,n="";if(t.length>=3){for(var i=0;i<3&&s;i++){const e=t[i];if(!s.children||!s.children[e])break;s=s.children[e],n=n+(n?"/":"")+e}s&&this.renderTabMenu(s,n)}},syncRoute(){if(!this.tree)return;const e=document.getElementById("sidebar");if(e){e.querySelectorAll(".active").forEach(e=>e.classList.remove("active"));const t=new URL(L.url(...(L.env.dispatchpath||[]).slice(0,3)),location.href).pathname;let a=null,s=-1;if(e.querySelectorAll("a.sidebar-sub-link, a.sidebar-nav-parent, a.sidebar-logout").forEach(e=>{const n=e.pathname;(t===n||t.startsWith(n+"/"))&&n.length>s&&(a=e,s=n.length)}),a){const t=a.closest(".sidebar-sub-item");if(t){t.classList.add("active");const s=a.closest(".sidebar-accordion-item");s&&(s.classList.add("active"),"true"!==e.getAttribute("data-collapsed")&&e.querySelectorAll(".sidebar-accordion-item").forEach(e=>e.setAttribute("data-open",e===s?"true":"false")))}else a.classList.contains("sidebar-logout")?a.classList.add("active"):a.closest(".sidebar-nav-item")?.classList.add("active")}}this.renderBreadcrumb(this.branch,this.branchUrl),this.renderTabs(this.tree)},closeSurfaces(){this.closePalette(),window.ShadcnSidebar?.closeDrawer?.(),window.ShadcnSidebar?._hideCollapsedPopover?.()},renderSidebarNav(e,t){const a=document.getElementById("sidebar-nav"),s=document.getElementById("sidebar-footer");if(!a)return;const n=ui.menu.getChildren(e),i=L.env.dispatchpath||[],r="1"===document.getElementById("sidebar")?.getAttribute("data-shadcn-restored"),l=r?Array.from(a.querySelectorAll('.sidebar-accordion-item[data-open="true"]'),e=>e.getAttribute("data-section")):null,c=r?a.scrollTop:0;a.innerHTML="",s&&(s.innerHTML="",s.hidden=!0),n.forEach(e=>{if(this._isLogoutMenuItem(e)&&s){const a=i[1]==e.name,n=this._sectionIcon(e.name,18);returLine truncated "use strict";"require baseclass";"require ui";const ICON_MAP={status:"activity",system:"settings",network:"network",services:"layers",nas:"hard-drive",control:"sliders-horizontal",vpn:"shield",docker:"container",statistics:"chart-bar",nlbw:"gauge",asterisk:"phone",logout:"log-out",default:"layout-dashboard"},CACHE_KEY="shadcn.sidebar.cache",RECENTS_KEY="shadcn.palette.recents";return baseclass.extend({__init__(){ui.menu.load().then(e=>{this.renderSidebarChrome(),this.render(e),this.initUciIndicator(),this.cacheSidebar(),window.addEventListener("pagehide",()=>this.cacheSidebar()),document.dispatchEvent(new Event("shadcn-sidebar-ready"))})},cacheSidebar(){if(window.shadcnSuppressSidebarCache)return;const e=document.getElementById("sidebar"),t=document.getElementById("sidebar-nav");if(e&&t)try{sessionStorage.setItem(CACHE_KEY,JSON.stringify({v:1,lang:document.documentElement.lang||"",html:e.innerHTML,scroll:t.scrollTop||0}))}catch(e){}},_mediaBase(){const e=document.documentElement.getAttribute("data-shadcn-media"),t=document.getElementById("sidebar"),a=t&&t.getAttribute("data-media");return String(e||a||"/luci-static/shadcn").replace(/\/$/,"")},_sectionIcon(e,t){const a=String(e||"").toLowerCase(),s=ICON_MAP[a]||ICON_MAP.default;return this._iconFile(s,t)},_isLogoutMenuItem(e){const t=String(e&&null!=e.name?e.name:"").toLowerCase();return"logout"===t||t.endsWith("/logout")},_iconFile(e,t){const a=this._mediaBase();return E("img",{src:`${a}/icons/${e}.svg`,width:String(t),height:String(t),alt:"",loading:"lazy",class:"shadcn-icon"})},_resolveMenuBranch(e){const t=L.env.dispatchpath||[],a=L.env.requestpath||[],s=ui.menu.getChildren(e);let n=a.length&&a[0]||t.length&&t[0]||"admin",i=null;for(let e=0;e<s.length;e++)if(s[e].name===n){i=s[e];break}return i||1!==s.length||(i=s[0],n=i.name),i||(i=e),{branch:i,branchUrl:i.name||n}},renderSidebarChrome(){const e=document.getElementById("sidebar");if(!e)return;if("1"===e.getAttribute("data-shadcn-built")){const t=e.querySelector(".sidebar-brand-text"),a=e.getAttribute("data-hostname");return void(t&&a&&t.textContent!==a&&(t.textContent=a))}e.setAttribute("data-shadcn-built","1");const t=this._mediaBase(),a=e.getAttribute("data-hostname")||"Shadcn";for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(E("div",{class:"sidebar-header"},[E("a",{class:"sidebar-brand",href:"/"},[E("img",{class:"sidebar-logo",src:`${t}/images/logo.svg`,alt:"Shadcn",width:"24",height:"24"}),E("span",{class:"sidebar-brand-text"},[a])]),E("button",{id:"sidebar-toggle-btn",class:"sidebar-toggle",type:"button","aria-label":_("Navigation")},[E("span",{class:"icon-collapse"},[this._iconFile("panel-left-close",16)]),E("span",{class:"icon-expand"},[this._iconFile("panel-left-open",16)])])])),e.appendChild(E("nav",{class:"sidebar-nav",id:"sidebar-nav"})),e.appendChild(E("div",{class:"sidebar-footer",id:"sidebar-footer",hidden:""}))},render(e){const{branch:t,branchUrl:a}=this._resolveMenuBranch(e);this.tree=e,this.branch=t,this.branchUrl=a,this.renderSidebarNav(t,a),this.renderBreadcrumb(t,a),this.initPalette(t,a),this.renderTabs(e)},renderTabs(e){const t=L.env.dispatchpath||[],a=document.getElementById("tabmenu");a&&(a.innerHTML="",a.style.display="none");let s=e,n="";if(t.length>=3){for(var i=0;i<3&&s;i++){const e=t[i];if(!s.children||!s.children[e])break;s=s.children[e],n=n+(n?"/":"")+e}s&&this.renderTabMenu(s,n)}},syncRoute(){if(!this.tree)return;const e=document.getElementById("sidebar");if(e){e.querySelectorAll(".active").forEach(e=>e.classList.remove("active"));const t=new URL(L.url(...(L.env.dispatchpath||[]).slice(0,3)),location.href).pathname;let a=null,s=-1;if(e.querySelectorAll("a.sidebar-sub-link, a.sidebar-nav-parent, a.sidebar-logout").forEach(e=>{const n=e.pathname;(t===n||t.startsWith(n+"/"))&&n.length>s&&(a=e,s=n.length)}),a){const t=a.closest(".sidebar-sub-item");if(t){t.classList.add("active");const s=a.closest(".sidebar-accordion-item");s&&(s.classList.add("active"),"true"!==e.getAttribute("data-collapsed")&&e.querySelectorAll(".sidebar-accordion-item").forEach(e=>e.setAttribute("data-open",e===s?"true":"false")))}else a.classList.contains("sidebar-logout")?a.classList.add("active"):a.closest(".sidebar-nav-item")?.classList.add("active")}}this.renderBreadcrumb(this.branch,this.branchUrl),this.renderTabs(this.tree)},closeSurfaces(){this.closePalette(),window.ShadcnSidebar?.closeDrawer?.(),window.ShadcnSidebar?._hideCollapsedPopover?.()},renderSidebarNav(e,t){const a=document.getElementById("sidebar-nav"),s=document.getElementById("sidebar-footer");if(!a)return;const n=ui.menu.getChildren(e),i=L.env.dispatchpath||[],r="1"===document.getElementById("sidebar")?.getAttribute("data-shadcn-restored"),l=r?Array.from(a.querySelectorAll('.sidebar-accordion-item[data-open="true"]'),e=>e.getAttribute("data-section")):null,c=r?a.scrollTop:0;a.innerHTML="",s&&(s.innerHTML="",s.hidden=!0),n.forEach(e=>{if(this._isLogoutMenuItem(e)&&s){const a=i[1]==e.name,n=this._sectionIcon(e.name,18);returLine truncated
@@ -1 +1 @@
"use strict";"require baseclass";const THEME_KEY="shadcn.theme",SIDEBAR_KEY="shadcn.sidebar";return baseclass.extend({__init__(){const e=document.getElementById("sidebar");"1"!==e?.getAttribute("data-shadcn-built")?document.addEventListener("shadcn-sidebar-ready",()=>this._start(),{once:!0}):this._start()},_start(){if(this._started)return;const e=document.getElementById("sidebar");"1"===e?.getAttribute("data-shadcn-built")&&(this._started=!0,this.initTheme(),this.initSidebar(),this.initMobileDrawer(),this.initThemeToggle())},initTheme(){const e=localStorage.getItem(THEME_KEY)||"device";this.applyTheme(e)},applyTheme(e){const t="dark"===e||"device"===e&&window.matchMedia("(prefers-color-scheme: dark)").matches;document.documentElement.setAttribute("data-darkmode",t),localStorage.setItem(THEME_KEY,e),this._updateThemeIcon(t)},_updateThemeIcon(e){const t=document.getElementById("theme-toggle-btn");if(!t)return;const o=t.querySelector("img");if(!o)return;const s=document.documentElement.getAttribute("data-shadcn-media")||"/luci-static/shadcn",d=String(s).replace(/\/$/,"");o.src=d+(e?"/icons/moon.svg":"/icons/sun.svg")},initThemeToggle(){const e=document.getElementById("theme-toggle-btn");e&&(e.addEventListener("click",()=>{const e="true"===document.documentElement.getAttribute("data-darkmode");this.applyTheme(e?"light":"dark")}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{"device"===(localStorage.getItem(THEME_KEY)||"device")&&this.applyTheme("device")}))},initSidebar(){const e=document.getElementById("sidebar");if(!e)return;const t=getComputedStyle(document.documentElement).getPropertyValue("--breakpoint-md").trim();this._mobileQuery=window.matchMedia(`(width < ${t})`),this._mobileQuery.addEventListener("change",e=>{e.matches||this._hideCollapsedPopover()});const o="true"===localStorage.getItem(SIDEBAR_KEY);e.setAttribute("data-collapsed",o);const s=document.getElementById("sidebar-toggle-btn");s&&s.addEventListener("click",()=>{this._mobileQuery.matches?this.closeDrawer():this.toggleCollapse()}),this._initAccordion(),this._initCollapsedPopover()},toggleCollapse(){const e=document.getElementById("sidebar");if(!e)return;const t="true"!==e.getAttribute("data-collapsed");e.setAttribute("data-collapsed",t),document.documentElement.setAttribute("data-sidebar-collapsed",t?"true":"false"),localStorage.setItem(SIDEBAR_KEY,t),this._hideCollapsedPopover(),t&&document.querySelectorAll(".sidebar-accordion-item[data-open='true']").forEach(e=>{this._closeAccordionItem(e)})},_initCollapsedPopover(){document.addEventListener("mouseover",e=>{const t=document.getElementById("sidebar");if("true"!==t?.getAttribute("data-collapsed"))return;if(e.target.closest("#sidebar-collapsed-popover"))return void clearTimeout(this._popoverTimer);const o=e.target.closest(".sidebar-accordion-item");o&&(clearTimeout(this._popoverTimer),this._showCollapsedPopover(o))}),document.addEventListener("mouseout",e=>{const t=document.getElementById("sidebar");if("true"!==t?.getAttribute("data-collapsed"))return;if(!e.target.closest(".sidebar-accordion-item")&&!e.target.closest("#sidebar-collapsed-popover"))return;const o=e.relatedTarget;o&&(o.closest(".sidebar-accordion-item")||o.closest("#sidebar-collapsed-popover"))||(this._popoverTimer=setTimeout(()=>this._hideCollapsedPopover(),100))})},_showCollapsedPopover(e){const t=e.getAttribute("data-section")||"",o=document.getElementById("sidebar-collapsed-popover");if(o&&o.getAttribute("data-section")===t)return;this._hideCollapsedPopover();const s=e.querySelectorAll(".sidebar-sub-link");if(!s.length)return;const d=e.querySelector(".sidebar-label"),i=d?d.textContent.trim():"",r=document.createElement("div");if(r.id="sidebar-collapsed-popover",r.className="sidebar-collapsed-popover",r.setAttribute("data-section",t),i){const e=document.createElement("div");e.className="sidebar-collapsed-popover-title",e.textContent=i,r.appendChild(e)}const a=document.createElement("ul");a.className="sidebar-collapsed-popover-list",s.forEach(e=>{const t=e.closest(".sidebar-sub-item")?.classList.contains("active"),o=document.createElement("li"),s=document.createElement("a");s.href=e.href,s.className="sidebar-collapsed-popover-link"+(t?" active":""),s.textContent=e.textContent,o.appendChild(s),a.appendChild(o)}),r.appendChild(a),document.body.appendChild(r);const n=document.getElementById("sidebar").getBoundingClientRect(),c=e.getBoundingClientRect();r.style.left=n.right+4+"px";const l=Math.min(c.top,window.innerHeight-r.offsetHeight-8);r.style.top=Math.max(8,l)+"px"},_hideCollapsedPopover(){clearTimeout(this._popoverTimer);const e=document.getElementById("sidebar-collapsed-popover");e&&e.remove()},_initAccordion(){document.addEventListener("click",e=>{const t=e.target.closest(".sidebar-nav-parent");if(!t)return;const o=document.getElementById("sidebar");if("true"===o?.getAttribute("data-collapsed"))return;const s=t.closest(".sidebar-accordion-item");if(!s)return;const d="true"===s.getAttributLine truncated "use strict";"require baseclass";const THEME_KEY="shadcn.theme",SIDEBAR_KEY="shadcn.sidebar";return baseclass.extend({__init__(){const e=document.getElementById("sidebar");"1"!==e?.getAttribute("data-shadcn-built")?document.addEventListener("shadcn-sidebar-ready",()=>this._start(),{once:!0}):this._start()},_start(){if(this._started)return;const e=document.getElementById("sidebar");"1"===e?.getAttribute("data-shadcn-built")&&(this._started=!0,this.initTheme(),this.initSidebar(),this.initMobileDrawer(),this.initThemeToggle())},initTheme(){const e=localStorage.getItem(THEME_KEY)||"device";this.applyTheme(e)},applyTheme(e){const t="dark"===e||"device"===e&&window.matchMedia("(prefers-color-scheme: dark)").matches;document.documentElement.setAttribute("data-darkmode",t),localStorage.setItem(THEME_KEY,e),this._updateThemeIcon(t)},_updateThemeIcon(e){const t=document.getElementById("theme-toggle-btn");if(!t)return;const o=t.querySelector("img");if(!o)return;const d=document.documentElement.getAttribute("data-shadcn-media")||"/luci-static/shadcn",s=String(d).replace(/\/$/,"");o.src=s+(e?"/icons/moon.svg":"/icons/sun.svg")},initThemeToggle(){const e=document.getElementById("theme-toggle-btn");e&&(e.addEventListener("click",()=>{const e="true"===document.documentElement.getAttribute("data-darkmode");this.applyTheme(e?"light":"dark")}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{"device"===(localStorage.getItem(THEME_KEY)||"device")&&this.applyTheme("device")}))},initSidebar(){const e=document.getElementById("sidebar");if(!e)return;const t=getComputedStyle(document.documentElement).getPropertyValue("--breakpoint-md").trim();this._mobileQuery=window.matchMedia(`(width < ${t})`),this._mobileQuery.addEventListener("change",e=>{e.matches||this._hideCollapsedPopover()});const o="true"===localStorage.getItem(SIDEBAR_KEY);e.setAttribute("data-collapsed",o);const d=document.getElementById("sidebar-toggle-btn");d&&d.addEventListener("click",()=>{this._mobileQuery.matches?this.closeDrawer():this.toggleCollapse()}),this._initAccordion(),this._initCollapsedPopover()},toggleCollapse(){const e=document.getElementById("sidebar");if(!e)return;const t="true"!==e.getAttribute("data-collapsed");e.setAttribute("data-collapsed",t),document.documentElement.setAttribute("data-sidebar-collapsed",t?"true":"false"),document.documentElement.setAttribute("data-sidebar-anim",""),localStorage.setItem(SIDEBAR_KEY,t),this._hideCollapsedPopover(),t&&document.querySelectorAll(".sidebar-accordion-item[data-open='true']").forEach(e=>{this._closeAccordionItem(e)})},_initCollapsedPopover(){document.addEventListener("mouseover",e=>{const t=document.getElementById("sidebar");if("true"!==t?.getAttribute("data-collapsed"))return;if(e.target.closest("#sidebar-collapsed-popover"))return void clearTimeout(this._popoverTimer);const o=e.target.closest(".sidebar-accordion-item");o&&(clearTimeout(this._popoverTimer),this._showCollapsedPopover(o))}),document.addEventListener("mouseout",e=>{const t=document.getElementById("sidebar");if("true"!==t?.getAttribute("data-collapsed"))return;if(!e.target.closest(".sidebar-accordion-item")&&!e.target.closest("#sidebar-collapsed-popover"))return;const o=e.relatedTarget;o&&(o.closest(".sidebar-accordion-item")||o.closest("#sidebar-collapsed-popover"))||(this._popoverTimer=setTimeout(()=>this._hideCollapsedPopover(),100))})},_showCollapsedPopover(e){const t=e.getAttribute("data-section")||"",o=document.getElementById("sidebar-collapsed-popover");if(o&&o.getAttribute("data-section")===t)return;this._hideCollapsedPopover();const d=e.querySelectorAll(".sidebar-sub-link");if(!d.length)return;const s=e.querySelector(".sidebar-label"),i=s?s.textContent.trim():"",r=document.createElement("div");if(r.id="sidebar-collapsed-popover",r.className="sidebar-collapsed-popover",r.setAttribute("data-section",t),i){const e=document.createElement("div");e.className="sidebar-collapsed-popover-title",e.textContent=i,r.appendChild(e)}const a=document.createElement("ul");a.className="sidebar-collapsed-popover-list",d.forEach(e=>{const t=e.closest(".sidebar-sub-item")?.classList.contains("active"),o=document.createElement("li"),d=document.createElement("a");d.href=e.href,d.className="sidebar-collapsed-popover-link"+(t?" active":""),d.textContent=e.textContent,o.appendChild(d),a.appendChild(o)}),r.appendChild(a),document.body.appendChild(r);const n=document.getElementById("sidebar").getBoundingClientRect(),c=e.getBoundingClientRect();r.style.left=n.right+4+"px";const l=Math.min(c.top,window.innerHeight-r.offsetHeight-8);r.style.top=Math.max(8,l)+"px"},_hideCollapsedPopover(){clearTimeout(this._popoverTimer);const e=document.getElementById("sidebar-collapsed-popover");e&&e.remove()},_initAccordion(){document.addEventListener("click",e=>{const t=e.target.closest(".sidebar-nav-parent");if(!t)return;const o=document.getElementById("sidebar");if("true"===o?.getAttribute("data-collapsed"))return;const d=t.closest(".sidebaLine truncated
Loaded 100 of 106 files, more files were not shown because too many files have changed in this diff. Show more