🏅 Sync 2026-10-30 20:56:14

This commit is contained in:
github-actions[bot] committed 2026-10-30 20:56:14 +08:00
1 parent f470897df5
commit 2d2368945f
32 files changed
+2793 -2828

No files matched your search

+2 -2
View File
@@ -5,8 +5,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=gately
PKG_VERSION:=0.6.1
PKG_RELEASE:=18
PKG_VERSION:=0.6.1.1
PKG_RELEASE:=19
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/wangwanjie/gately/tar.gz/v$(PKG_VERSION)?
+2 -2
View File
@@ -6,8 +6,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=headscale
PKG_VERSION:=0.29.6
PKG_RELEASE:=11
PKG_VERSION:=0.29.7
PKG_RELEASE:=12
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/juanfont/headscale/tar.gz/v$(PKG_VERSION)?
@@ -110,9 +110,30 @@ return dm2.dv.extend({
isLocal = true;
if (info_response?.code !== 200) {
return E('div', {}, [ info_response?.body?.message ]);
return E('div', { 'class': 'cbi-section' }, [
E('h3', {}, _('Docker Daemon Status')),
E('div', { 'class': 'alert-message warning', style: 'margin-bottom: 15px;' },
info_response?.body?.message || _('Failed to connect to Docker daemon.')
),
E('p', {}, _('The Docker daemon appears to be stopped. You can attempt to start it below:')),
E('div', { style: 'display: flex; gap: 5px; flex-wrap: wrap; margin-top: 10px;' }, [
E('button', {
'class': 'btn cbi-button-action positive',
'click': () => {
this.handleAction('dockerd', 'start').then((success) => {
if (success) {
setTimeout(() => location.reload(), 1500);
}
});
}
}, [_('Start')]),
E('button', {
'class': 'btn cbi-button-action neutral',
'click': () => location.reload()
}, [_('Refresh')])
])
]);
}
this.parseHeaders(version_response.headers, version_headers);
this.parseBody(version_response.body, version_body);
this.parseBody(info_response.body, info_body);
@@ -1420,6 +1420,84 @@ function getDashURL(isRunning) {
String.format(dashrepos_urlparams[repo] || '', host, port, secret)
}
function renderHy2Realm(s, uciconfig) {
let o;
o = s.taboption('field_general', form.Flag, 'hysteria2_realm', _('Realm'));
o.default = o.disabled;
o.depends('type', 'hysteria2');
o.modalonly = true;
o = s.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_server_url', _('Rendezvous server'));
o.placeholder = 'https://realm.hy2.io';
o.rmempty = false;
o.depends('hysteria2_realm', '1');
o.modalonly = true;
o = s.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_token', _('Pre-shared key of rendezvous server'));
o.placeholder = 'public';
o.depends('hysteria2_realm', '1');
o.modalonly = true;
o = s.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_id', _('Realm ID'));
o.placeholder = 'my-cabin-1f3a8c2e9b';
o.rmempty = false;
o.depends('hysteria2_realm', '1');
o.modalonly = true;
o = s.taboption('field_hysteria2_realm', form.DynamicList, 'hysteria2_realm_stun_servers', _('STUN servers'));
o.datatype = 'hostport';
o.default = ['stun.nextcloud.com:3478','stun.sip.us:3478','global.stun.twilio.com:3478'];
o.rmempty = false;
o.depends('hysteria2_realm', '1');
o.modalonly = true;
// @ 下面支持填写针对server-url的TLS配置(sni, skip-cert-verify, name-cert-verify, fingerprint, certificate, private-key, alpn)
o = s.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_sni', _('TLS SNI'),
_('Hostname that the client attempts to connect to at the start of the TLS handshake process.'));
o.depends('hysteria2_realm', '1');
o.modalonly = true;
o = s.taboption('field_hysteria2_realm', form.DynamicList, 'hysteria2_realm_alpn', _('TLS ALPN'),
_('List of supported application level protocols, in order of preference.'));
o.default = ['h2', 'http/1.1'];
o.depends('hysteria2_realm', '1');
o.modalonly = true;
o = s.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_fingerprint', _('Cert fingerprint'),
_('Certificate fingerprint. Used to implement SSL Pinning and prevent MitM.'));
o.validate = validateSha256Key || hm.validateSha256Key;
o.depends('hysteria2_realm', '1');
o.modalonly = true;
o = s.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_name_cert_verify', _('Override cert DNSName'),
_('Used to verify the hostname on the returned certificates.'));
o.datatype = 'hostname';
o.depends('hysteria2_realm', '1');
o.modalonly = true;
o = s.taboption('field_hysteria2_realm', form.Flag, 'hysteria2_realm_skip_cert_verify', _('Skip cert verify'),
_('Donot verifying server certificate.') +
'<br/>' +
_('This is <strong>DANGEROUS</strong>, your traffic is almost like <strong>PLAIN TEXT</strong>! Use at your own risk!'));
o.default = o.disabled;
o.depends('hysteria2_realm', '1');
o.modalonly = true;
o = s.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_cert_path', _('Certificate path') + _(' (mTLS)'),
_('The %s public key, in PEM format.').format(_('Client')));
o.value('/etc/fchomo/certs/client_publickey.pem');
o.depends('hysteria2_realm', '1');
o.modalonly = true;
o = s.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_key_path', _('Key path') + _(' (mTLS)'),
_('The %s private key, in PEM format.').format(_('Client')));
o.value('/etc/fchomo/certs/client_privatekey.pem');
o.depends({hysteria2_realm: '1', hysteria2_realm_cert_path: /.+/});
o.modalonly = true;
}
function renderResDownload(section_id) {
const section_type = this.section.sectiontype;
const type = uci.get(this.config, section_id, 'type');
@@ -1738,6 +1816,14 @@ function validateBase64Key(length, section_id, value) {
return true;
}
function validateSha256Key(section_id, value) {
if (!value)
return true;
if (!((value.length === 64) && (value.match(/^[0-9a-fA-F]+$/))))
return _('Expecting: %s').format(_('valid SHA256 string with %d characters').format(64));
return true;
}
function validateMTLSClientAuth(type_option, section_id, value) {
// If `client-auth-type` is set to "verify-if-given" or "require-and-verify", `client-auth-cert` must not be empty.
const auth_type = this.section.getOption(type_option).formvalue(section_id);
@@ -2021,6 +2107,7 @@ return baseclass.extend({
renderStatus,
updateStatus,
getDashURL,
renderHy2Realm,
renderResDownload,
renderResLink,
handleGenKey,
@@ -2037,9 +2124,9 @@ return baseclass.extend({
validateJson,
validateUUID,
validateUrl,
// validate with bind this
validateHexstr,
validateBase64Key,
validateSha256Key,
validateMTLSClientAuth,
validatePresetIDs,
validateShadowsocksPassword,
@@ -204,7 +204,7 @@ function renderListeners(s, uciconfig, isClient) {
o.modalonly = true;
o = s.taboption('field_general', form.Value, 'mieru_tcp_idle_timeout', _('TCP idle timeout'),
_('In seconds.'), _('Minimum value is $s.').format('60'));
_('In seconds.') + ' ' + _('Minimum value is $s.').format('60'));
o.placeholder = '1800';
o.validate = hm.validateTimeDuration;
o.depends('type', 'mieru');
@@ -1003,36 +1003,24 @@ function renderListeners(s, uciconfig, isClient) {
// @xhttp-config其他的配置
/* Hysteria2 Realm fields */
o = s.taboption('field_general', form.Flag, 'hysteria2_realm', _('Realm'));
o.default = o.disabled;
o.depends('type', 'hysteria2');
o.modalonly = true;
hm.renderHy2Realm(s, uciconfig);
o = s.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_server_url', _('Rendezvous server'));
o.placeholder = 'https://realm.hy2.io';
o.rmempty = false;
o.depends('hysteria2_realm', '1');
o.modalonly = true;
o = s.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_token', _('Pre-shared key of rendezvous server'));
o.placeholder = 'public';
o.depends('hysteria2_realm', '1');
o.modalonly = true;
o = s.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_id', _('Realm ID'));
o.placeholder = 'my-cabin-1f3a8c2e9b';
o.rmempty = false;
o.depends('hysteria2_realm', '1');
o.modalonly = true;
o = s.taboption('field_hysteria2_realm', form.DynamicList, 'hysteria2_realm_stun_servers', _('STUN servers'));
o.datatype = 'hostport';
o.default = ['stun.nextcloud.com:3478','stun.sip.us:3478','global.stun.twilio.com:3478'];
o.rmempty = false;
o.depends('hysteria2_realm', '1');
o.modalonly = true;
// @ 下面支持填写针对server-url的TLS配置(sni, skip-cert-verify, name-cert-verify, fingerprint, certificate, private-key, alpn)
if (isClient) {
o = s.taboption('field_hysteria2_realm', form.ListValue, 'hysteria2_realm_proxy', _('Proxy group'),
_('The proxy used to connect to the rendezvous server.'));
o.default = hm.preset_outbound.direct[0][0];
hm.preset_outbound.direct.forEach((res) => {
o.value.apply(o, res);
})
o.load = function(section_id) {
return hm.loadLabel.call(this, [
...hm.preset_outbound.direct,
...hm.loadLabelValues(this.config, 'proxy_group')
], section_id);
}
o.depends('hysteria2_realm', '1');
o.modalonly = true;
}
/* TLS fields */
o = s.taboption('field_general', form.Flag, 'tls', _('TLS'));
@@ -1423,36 +1423,7 @@ return view.extend({
// @ 下面支持填写针对download-settings的上下行分离配置
/* Hysteria2 Realm fields */
so = ss.taboption('field_general', form.Flag, 'hysteria2_realm', _('Realm'));
so.default = so.disabled;
so.depends('type', 'hysteria2');
so.modalonly = true;
so = ss.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_server_url', _('Rendezvous server'));
so.placeholder = 'https://realm.hy2.io';
so.rmempty = false;
so.depends('hysteria2_realm', '1');
so.modalonly = true;
so = ss.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_token', _('Pre-shared key of rendezvous server'));
so.placeholder = 'public';
so.depends('hysteria2_realm', '1');
so.modalonly = true;
so = ss.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_id', _('Realm ID'));
so.placeholder = 'my-cabin-1f3a8c2e9b';
so.rmempty = false;
so.depends('hysteria2_realm', '1');
so.modalonly = true;
so = ss.taboption('field_hysteria2_realm', form.DynamicList, 'hysteria2_realm_stun_servers', _('STUN servers'));
so.datatype = 'hostport';
so.default = ['stun.nextcloud.com:3478','stun.sip.us:3478','global.stun.twilio.com:3478'];
so.rmempty = false;
so.depends('hysteria2_realm', '1');
so.modalonly = true;
// @ 下面支持填写针对server-url的TLS配置(sni, skip-cert-verify, name-cert-verify, fingerprint, certificate, private-key, alpn)
hm.renderHy2Realm(ss, data[0]);
/* TLS fields */
so = ss.taboption('field_general', form.Flag, 'tls', _('TLS'));
@@ -1491,7 +1462,7 @@ return view.extend({
so.validate = function(section_id, value) {
const type = this.section.getOption('type').formvalue(section_id);
//const plugin_type = this.section.getOption('plugin_type').formvalue(section_id);
let tls_alpn = this.section.getUIElement(section_id, 'tls_alpn');
let tls_alpn = this.getUIElement(section_id);
// Default alpn
if (!`${tls_alpn.getValue()}`) {
@@ -1535,14 +1506,7 @@ return view.extend({
so = ss.taboption('field_tls', form.Value, 'tls_fingerprint', _('Cert fingerprint'),
_('Certificate fingerprint. Used to implement SSL Pinning and prevent MitM.'));
so.validate = function(section_id, value) {
if (!value)
return true;
if (!((value.length === 64) && (value.match(/^[0-9a-fA-F]+$/))))
return _('Expecting: %s').format(_('valid SHA256 string with %d characters').format(64));
return true;
}
so.validate = hm.validateSha256Key;
so.depends({tls: '1', type: /^(http|socks5|vmess|vless|trojan|hysteria|hysteria2)$/});
so.modalonly = true;
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
+2 -2
View File
@@ -169,7 +169,7 @@ start_service() {
# Set ENV variables for Client
export SAFE_PATHS="$RUN_DIR$(
yq 'with(.external-ui; select(. != null) | . = sub("(/?$)", "/placeholder"))
| [.external-ui, .tls.certificate, .tls.private-key, .tls.client-auth-cert] | unique | map(select(. != null))
| [.external-ui, .tls.certificate, .tls.private-key, .tls.client-auth-cert, .realm-opts.certificate, .realm-opts.private-key] | unique | map(select(. != null))
| .[] |= sub("(/[^/]+$)", "") | unique
| .[] | sub("(^)", ":")' \
"$RUN_DIR/mihomo-c.yaml" | tr -d '\n'
@@ -391,7 +391,7 @@ start_service() {
else
# Set ENV variables for Server
export SAFE_PATHS="$RUN_DIR$(
yq '.listeners | map([.certificate, .private-key, .client-auth-cert][]) | unique | map(select(. != null))
yq '.listeners | map([.certificate, .private-key, .client-auth-cert, .realm-opts.certificate, .realm-opts.private-key][]) | unique | map(select(. != null))
| .[] |= sub("(/[^/]+$)", "") | unique
| .[] | sub("(^)", ":")' \
"$RUN_DIR/mihomo-s.yaml" | tr -d '\n'
@@ -364,6 +364,8 @@ uci.foreach(uciconf, uciinbd, (cfg) => {
listener["jls-config"].proxy = get_proxy(listener["jls-config"].proxy);
if (listener["jls-upstream"])
listener["jls-upstream"].proxy = get_proxy(listener["jls-upstream"].proxy);
if (listener["realm-opts"])
listener["realm-opts"].proxy = get_proxy(listener["realm-opts"].proxy);
push(config.listeners, listener);
});
@@ -607,13 +609,14 @@ uci.foreach(uciconf, ucinode, (cfg) => {
token: cfg.hysteria2_realm_token,
"realm-id": cfg.hysteria2_realm_id,
"stun-servers": cfg.hysteria2_realm_stun_servers,
// @TLS of server-url
//sni,
//alpn,
//"skip-cert-verify",
//fingerprint,
//certificate,
//"private-key"
// TLS of server-url
sni: cfg.hysteria2_realm_sni,
alpn: cfg.hysteria2_realm_alpn,
fingerprint: cfg.hysteria2_realm_fingerprint,
"name-cert-verify": cfg.hysteria2_realm_name_cert_verify,
"skip-cert-verify": strToBool(cfg.hysteria2_realm_skip_cert_verify),
certificate: cfg.hysteria2_realm_cert_path, // mTLS
"private-key": cfg.hysteria2_realm_key_path // mTLS
} : null,
/* ShadowQUIC */
@@ -323,13 +323,15 @@ export function parseListener(cfg) {
token: cfg.hysteria2_realm_token,
"realm-id": cfg.hysteria2_realm_id,
"stun-servers": cfg.hysteria2_realm_stun_servers,
// @TLS of server-url
//sni,
//alpn,
//"skip-cert-verify",
//fingerprint,
//certificate,
//"private-key"
// TLS of server-url
sni: cfg.hysteria2_realm_sni,
alpn: cfg.hysteria2_realm_alpn,
fingerprint: cfg.hysteria2_realm_fingerprint,
"name-cert-verify": cfg.hysteria2_realm_name_cert_verify,
"skip-cert-verify": strToBool(cfg.hysteria2_realm_skip_cert_verify),
certificate: cfg.hysteria2_realm_cert_path, // mTLS
"private-key": cfg.hysteria2_realm_key_path, // mTLS
proxy: cfg.hysteria2_realm_proxy // raw data need post-processing
} : null,
/* Hysteria2 Realmserver */
+2 -2
View File
@@ -1,8 +1,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-open-box
PKG_VERSION:=0.1.374
PKG_RELEASE:=52
PKG_VERSION:=0.1.376
PKG_RELEASE:=53
PKG_MAINTAINER:=liandu2024
PKG_LICENSE:=GPL-3.0-or-later
+1 -1
View File
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-openvpn-plus
PKG_VERSION:=1.0.0
PKG_RELEASE:=9
PKG_RELEASE:=10
PKG_LICENSE:=Apache-2.0
PKG_MAINTAINER:=Manfred Jaider <info@masmbit.com>
@@ -836,11 +836,11 @@ symlink() {
# Remove RAM base directory if it has become completely empty
rmdir "${ram_link_dir}" 2>/dev/null
# Smart Web-Folder Cleanup: Check if files other than index.html exist
if [ -d "${www_link_dir}" ]; then
local has_profiles="0"
local check_link
local check_link
# If a real symlink or folder matching the pattern exists, has_profiles becomes 1
for check_link in "${www_link_dir}"/ovpn-tmp-*-*; do
if [ -e "${check_link}" ] || [ -L "${check_link}" ]; then
@@ -852,7 +852,7 @@ symlink() {
if [ "${has_profiles}" = "0" ]; then
rm -rf "${www_link_dir}"
fi
fi
fi
printf "%s\n" "SUCCESS: Link directory and static profile deleted from RAM."
else
@@ -1955,6 +1955,7 @@ cleanup() {
# no argument (no shift)
local conf_file
local instname
local raw_list=""
local active_list=""
local conf_dir="/etc/openvpn/luci"
local key_dir="/etc/openvpn/keys"
@@ -1962,24 +1963,19 @@ cleanup() {
local ram_link_dir="/tmp/luci-ovpn-plus"
local www_link_dir="/www/ovpn-downloads"
# Step 1: Build the list of ACTIVE instances from the instance*.conf files
for conf_file in "${conf_dir}"/instance*.conf; do
if [ -f "${conf_file}" ]; then
instname="${conf_file##*/}"
instname="${instname%.conf}"
# Step 1: Get all active OpenVPN instances directly from UCI config
raw_list=$(uci -q show openvpn | grep "=openvpn" | awk -F'[.=]' '{print $2}' 2>/dev/null)
if internal_checkname "${instname}"; then
# Enforce space separation to prevent partial substring matches later
active_list="${active_list} ${instname}"
fi
# Validate every instance name from UCI before adding it to the official list
for instname in ${raw_list}; do
if internal_checkname "${instname}"; then
active_list="${active_list} ${instname}"
fi
done
# Step 2: Remove orphan instance files
internal_cleaninst "${active_list}" "${conf_dir}/instance*.conf"
internal_cleaninst "${active_list}" "${conf_dir}/instance*.nft"
internal_cleaninst "${active_list}" "${conf_dir}/instance*.jmp.nft"
internal_cleaninst "${active_list}" "${conf_dir}/instance*.s2s.nft"
internal_cleaninst "${active_list}" "${conf_dir}/instance*.ovpn"
internal_cleaninst "${active_list}" "${key_dir}/ca_instance*.crt"
internal_cleaninst "${active_list}" "${key_dir}/dh_instance*.pem"
@@ -1987,8 +1983,6 @@ cleanup() {
internal_cleaninst "${active_list}" "${key_dir}/client_instance*.crt"
internal_cleaninst "${active_list}" "${key_dir}/server_instance*.key"
internal_cleaninst "${active_list}" "${key_dir}/client_instance*.key"
internal_cleaninst "${active_list}" "${key_dir}/server_instance*.tls2.key"
internal_cleaninst "${active_list}" "${key_dir}/client_instance*.tls2.key"
internal_cleaninst "${active_list}" "${run_dir}/openvpn-ddns-instance*.status"
# Step 3: Remove orphan symlink files
@@ -1997,22 +1991,17 @@ cleanup() {
# Remove the temporary RAM directory ONLY if it is completely empty
[ -d "${ram_link_dir}" ] && rmdir "${ram_link_dir}" 2>/dev/null
# Smart Web-Folder Cleanup: Check if files other than index.html exist
if [ -d "${www_link_dir}" ]; then
local has_profiles="0"
local check_link
# If a real symlink or folder matching the pattern exists, has_profiles becomes 1
for check_link in "${www_link_dir}"/ovpn-tmp-*-*; do
if [ -e "${check_link}" ] || [ -L "${check_link}" ]; then
has_profiles="1"
break
fi
done
# Remove the web folder if no active profile links are left
if [ "${has_profiles}" = "0" ]; then
local found_profiles
found_profiles="${www_link_dir}/ovpn-tmp-"*-*
# If the text still has a '*', no active profiles were found
if [ "${found_profiles}" = "${www_link_dir}/ovpn-tmp-*-*" ]; then
rm -rf "${www_link_dir}"
fi
fi
fi
return 0
}
@@ -18,6 +18,29 @@ const callGetFirewallStatus = rpc.declare({ object: 'tailscale', method: 'get_fi
let map;
let lastDevicesStatus;
// ui.addTimeLimitedNotification only exists since OpenWrt 24.10. Older
// releases, 23.05 included, only have addNotification and would throw on every
// call, so fade the notice out ourselves there.
function notifyTimed(title, children, timeout, ...classes) {
if (typeof ui.addTimeLimitedNotification == 'function')
return ui.addTimeLimitedNotification(title, children, timeout, ...classes);
const msg = ui.addNotification(title, children, ...classes);
if (typeof timeout == 'number' && timeout > 0 && msg) {
window.setTimeout(function() {
msg.classList.add('fade-out');
msg.classList.remove('fade-in');
window.setTimeout(function() {
if (msg.parentNode)
msg.parentNode.removeChild(msg);
}, 250);
}, timeout);
}
return msg;
}
// uci.changes() returns an object keyed by config name; count the entries so
// the firewall button can warn about unsaved work.
function countPending(changes) {
@@ -111,6 +134,43 @@ function getRunningStatus() {
});
}
// Map.save() re-renders the form after every save, so registering the status
// poller from s.render would add another 10 second get_status loop per save and
// never remove the previous ones. The poller is therefore module level and
// guarded by a flag; the flag is the only dedup mechanism on purpose, the
// poller function reference is never compared.
let statusPollerRegistered = false;
function pollRunningStatus() {
return getRunningStatus().then(function (res) {
const view = document.getElementById("service_status_display");
if (view) {
const content = renderStatus(res);
view.replaceChildren(content);
}
lastDevicesStatus = res;
const devicesTbody = document.getElementById("tailscale_devices_tbody");
if (devicesTbody) {
const filterInput = document.getElementById("tailscale_devices_filter");
const currentQuery = filterInput ? filterInput.value : '';
devicesTbody.replaceChildren(...renderPeerRows(res, currentQuery));
}
// login button only available when logged out
const login_btn=document.getElementsByClassName('cbi-button cbi-button-apply')[0];
if(login_btn) { login_btn.disabled=(res.status != 'logout'); }
});
}
function ensureStatusPoller() {
if (statusPollerRegistered)
return;
statusPollerRegistered = true;
L.Poll.add(function () { return pollRunningStatus(); }, 10);
}
// Poll the background firewall job until it finishes. A poll that fails
// (network reloading, the connection dropped for a moment) is expected and is
// simply retried on the next tick instead of being reported as an error.
@@ -156,7 +216,7 @@ function pollFirewallJob(runId, timeoutSec) {
if (state === 'done') {
if (stop())
ui.addTimeLimitedNotification(null, [ E('p', _('Firewall configuration applied.')) ], 5000, 'info');
notifyTimed(null, [ E('p', _('Firewall configuration applied.')) ], 5000, 'info');
resolve(res);
return;
}
@@ -174,7 +234,7 @@ function pollFirewallJob(runId, timeoutSec) {
if (state !== lastState) {
lastState = state;
if (state === 'running' && res?.step === 'firewall')
ui.addTimeLimitedNotification(null, [ E('p', _('Reloading firewall...')) ], 3000, 'info');
notifyTimed(null, [ E('p', _('Reloading firewall...')) ], 3000, 'info');
}
});
}
@@ -242,7 +302,7 @@ async function initializeRegionMap() {
}
}
} catch (e) {
ui.addTimeLimitedNotification(null, [ E('p', _('Error reading cached DERP region map: %s').format(e.message || _('Unknown error'))) ], 7000, 'error');
notifyTimed(null, [ E('p', _('Error reading cached DERP region map: %s').format(e.message || _('Unknown error'))) ], 7000, 'error');
}
// If no valid cache, fetch from the network
@@ -269,10 +329,10 @@ async function initializeRegionMap() {
};
localStorage.setItem(cacheKey, JSON.stringify(itemToCache));
} catch (e) {
ui.addTimeLimitedNotification(null, [ E('p', _('Error caching DERP region map: %s').format(e.message || _('Unknown error'))) ], 7000, 'error');
notifyTimed(null, [ E('p', _('Error caching DERP region map: %s').format(e.message || _('Unknown error'))) ], 7000, 'error');
}
} catch (error) {
ui.addTimeLimitedNotification(null, [ E('p', _('Error fetching DERP region map: %s').format(error.message || _('Unknown error'))) ], 7000, 'error');
notifyTimed(null, [ E('p', _('Error fetching DERP region map: %s').format(error.message || _('Unknown error'))) ], 7000, 'error');
}
}
@@ -564,28 +624,8 @@ return view.extend({
s = map.section(form.NamedSection, '_status');
s.anonymous = true;
s.render = function (section_id) {
L.Poll.add(
function () {
return getRunningStatus().then(function (res) {
const view = document.getElementById("service_status_display");
if (view) {
const content = renderStatus(res);
view.replaceChildren(content);
}
lastDevicesStatus = res;
const devicesTbody = document.getElementById("tailscale_devices_tbody");
if (devicesTbody) {
const filterInput = document.getElementById("tailscale_devices_filter");
const currentQuery = filterInput ? filterInput.value : '';
devicesTbody.replaceChildren(...renderPeerRows(res, currentQuery));
}
// login button only available when logged out
const login_btn=document.getElementsByClassName('cbi-button cbi-button-apply')[0];
if(login_btn) { login_btn.disabled=(res.status != 'logout'); }
});
}, 10);
// Registering is idempotent and must not affect what is rendered.
ensureStatusPoller();
return E('div', { 'id': 'service_status_display', 'class': 'cbi-value' },
_('Collecting data ...')
@@ -677,7 +717,7 @@ return view.extend({
return null;
}
ui.addTimeLimitedNotification(null, [ E('p', _('Configuration committed, reloading network and firewall. This can take a moment.')) ], 5000, 'info');
notifyTimed(null, [ E('p', _('Configuration committed, reloading network and firewall. This can take a moment.')) ], 5000, 'info');
return pollFirewallJob(res.run_id);
}).catch(function(err) {
ui.addNotification(null, E('p', {}, _('Failed to configure firewall: %s').format(err?.message || err?.error || err || _('Unknown error'))), 'error');
@@ -759,7 +799,7 @@ return view.extend({
const customServerAuth = customserverAuthInput ? customserverAuthInput.value : '';
const loginWindow = window.open('', '_blank');
if (!loginWindow) {
ui.addTimeLimitedNotification(null, [ E('p', _('Could not open a new tab. Please check if your browser or an extension blocked the pop-up.')) ], 10000, 'error');
notifyTimed(null, [ E('p', _('Could not open a new tab. Please check if your browser or an extension blocked the pop-up.')) ], 10000, 'error');
return;
}
// Display a prompt message in the new window
@@ -786,11 +826,11 @@ return view.extend({
doc.body.innerHTML =
'<h2>' + _('Error') + '</h2>' +
'<p>' + _('Failed to get login URL. You may close this tab.') + '</p>';
ui.addTimeLimitedNotification(null, [ E('p', _('Failed to get login URL: %s').format(res?.error || _('Invalid response from server.'))) ], 7000, 'error');
notifyTimed(null, [ E('p', _('Failed to get login URL: %s').format(res?.error || _('Invalid response from server.'))) ], 7000, 'error');
}
}).catch(function(err) {
ui.hideModal();
ui.addTimeLimitedNotification(null, [ E('p', _('Failed to get login URL: %s').format(err.message || _('Unknown error'))) ], 7000, 'error');
notifyTimed(null, [ E('p', _('Failed to get login URL: %s').format(err.message || _('Unknown error'))) ], 7000, 'error');
});
};
@@ -814,10 +854,10 @@ return view.extend({
return callDoLogout().then(function(res) {
unwrapRpc(res, _('Logout'));
ui.hideModal();
ui.addTimeLimitedNotification(null, [ E('p', _('Successfully logged out.')) ], 5000, 'info');
notifyTimed(null, [ E('p', _('Successfully logged out.')) ], 5000, 'info');
}).catch(function(err) {
ui.hideModal();
ui.addTimeLimitedNotification(null, [ E('p', _('Logout failed: %s').format(err.message || _('Unknown error'))) ], 7000, 'error');
notifyTimed(null, [ E('p', _('Logout failed: %s').format(err.message || _('Unknown error'))) ], 7000, 'error');
});
}
}, _('Logout'))
@@ -872,13 +912,16 @@ return view.extend({
// standard OpenWrt apply mechanism, which triggers /etc/init.d/tailscale-settings
// and provides automatic rollback protection if the device becomes unreachable.
handleSaveApply(ev, mode) {
// Read the submitted value before map.save() consumes the staged delta.
// uci.get() prefers the staged change over the saved value, and the
// staged delta is only populated once the form has been parsed, which
// map.save() guarantees here.
const wantEnabled = uci.get('tailscale', 'settings', 'service_enabled');
// The submitted value only reaches the uci model while map.save() parses
// the form, so reading it before map.save() returns the previously saved
// value: switching the service off then passed '1' and never armed the
// stop request. Read it in the save callback, which runs right after the
// form was parsed and before the staged changes are sent to the device.
let wantEnabled;
return map.save().then(function () {
return map.save(function () {
wantEnabled = uci.get('tailscale', 'settings', 'service_enabled');
}).then(function () {
// Only records the disable request; the reload handler performs
// the stop after the commit, so a LuCI rollback still finds a
// running daemon. One concurrency slot on purpose: an overlapping
@@ -886,7 +929,10 @@ return view.extend({
// Fail-open on purpose: an install whose rpcd ACL cache predates
// this method would otherwise be unable to apply anything. The
// worst case is that the stop is skipped for this apply.
return callSetServiceEnabled({ enabled: wantEnabled === '0' ? '0' : '1' })
// The declaration maps positional arguments to its params, so pass
// the value itself: { enabled: ... } reached ubus as the value of
// enabled and was rejected as an invalid argument.
return callSetServiceEnabled(wantEnabled === '0' ? '0' : '1')
.catch(function(err) {
console.warn('set_service_enabled failed: %s', err);
return null;
+168 -168
View File
@@ -1,23 +1,23 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:47
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
msgid "%s failed"
msgstr "Error de %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:71
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:94
msgid "(Experimental) Reduce Memory Usage"
msgstr "(Experimental) Reducir el uso de memoria"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:711
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:751
msgid "1. Enable \"Advertise Exit Node\"."
msgstr "1. Active \"Anunciar como nodo de salida\"."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:693
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:733
msgid "1. Select \"Accept Routes\" (to access remote devices)."
msgstr "1. Marque \"Aceptar rutas\" (para acceder a dispositivos remotos)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:712
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:752
msgid ""
"2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic "
"to WAN)."
@@ -25,7 +25,7 @@ msgstr ""
"2. Haga clic en \"Configurar el cortafuegos automáticamente\" "
"(reenvía el tráfico de Tailscale hacia la WAN)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:694
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:734
msgid ""
"2. In \"Advertise Routes\", select your local subnet (to allow remote "
"devices to access this LAN)."
@@ -33,13 +33,13 @@ msgstr ""
"2. En \"Anunciar rutas\", seleccione su subred local (para que los "
"dispositivos remotos puedan acceder a esta LAN)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:695
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:735
msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)."
msgstr ""
"3. Haga clic en \"Configurar el cortafuegos automáticamente\" (para "
"permitir el reenvío de tráfico)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:713
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:753
msgid ""
"3. In the Tailscale admin console, edit this device under the route "
"settings and approve it as an Exit Node."
@@ -47,27 +47,27 @@ msgstr ""
"3. En la consola de administración de Tailscale, edite este "
"dispositivo en los ajustes de rutas y apruébelo como nodo de salida."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:718
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:758
msgid "4. On the client, set this device as its exit node."
msgstr "4. En el cliente, configure este dispositivo como su nodo de salida."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:55
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:78
msgid "Accept Routes"
msgstr "Aceptar rutas"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:725
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:765
msgid "Account Settings"
msgstr "Ajustes de la cuenta"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:56
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:79
msgid "Advertise Exit Node"
msgstr "Anunciar como nodo de salida"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:636
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
msgid "Advertise Routes"
msgstr "Anunciar rutas"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:636
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
msgid ""
"Advertise subnet routes behind this device. Select from the detected "
"subnets below or enter custom routes (comma-separated)."
@@ -76,15 +76,15 @@ msgstr ""
"Seleccione una de las subredes detectadas a continuación o introduzca "
"rutas personalizadas separadas por comas."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:57
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:80
msgid "Allow LAN Access"
msgstr "Permitir acceso a la LAN"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:55
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:78
msgid "Allow accepting routes announced by other nodes."
msgstr "Permitir aceptar las rutas anunciadas por otros nodos."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:61
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:84
msgid "Allow connecting to this device through the SSH function of Tailscale."
msgstr ""
"Permitir conectarse a este dispositivo mediante la función SSH de "
@@ -94,40 +94,40 @@ msgstr ""
msgid "Allow user access to tailscale"
msgstr "Permitir el acceso de usuarios a Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:170
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:230
msgid "Another firewall reload is already running"
msgstr "Ya se está recargando el cortafuegos"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:799
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:839
msgid "Are you sure you want to log out?"
msgstr "¿Seguro que desea cerrar la sesión?"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:644
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:684
msgid "Auto Configure Firewall"
msgstr "Configurar el cortafuegos automáticamente"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:806
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:846
msgid "Cancel"
msgstr "Cancelar"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:750
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:790
msgid "Click to Log out account on this device."
msgstr "Haga clic para cerrar la sesión de la cuenta en este dispositivo."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:729
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:769
msgid "Click to get a login URL for this device."
msgstr ""
"Haga clic para obtener una URL de inicio de sesión para este "
"dispositivo."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:291
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:383
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:591
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:850
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:443
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:631
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:890
msgid "Collecting data ..."
msgstr "Recopilando datos..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:680
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:720
msgid ""
"Configuration committed, reloading network and firewall. This can "
"take a moment."
@@ -135,23 +135,23 @@ msgstr ""
"Configuración guardada, recargando la red y el cortafuegos. Esto "
"puede tardar un momento."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:673
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:713
msgid "Configuring firewall"
msgstr "Configurando el cortafuegos"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:826
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:866
msgid "Confirm Logout"
msgstr "Confirmar cierre de sesión"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:452
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:512
msgid "Connection Info"
msgstr "Información de conexión"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "Controls how Tailscale DNS is handled."
msgstr "Controla cómo se gestiona el DNS de Tailscale."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:762
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:802
msgid ""
"Could not open a new tab. Please check if your browser or an "
"extension blocked the pop-up."
@@ -159,43 +159,43 @@ msgstr ""
"No se pudo abrir una pestaña nueva. Compruebe si su navegador o "
"alguna extensión bloqueó la ventana emergente."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:734
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:774
msgid "Custom Login Server"
msgstr "Servidor de inicio de sesión personalizado"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:742
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:782
msgid "Custom Login Server Auth Key"
msgstr "Clave de autenticación del servidor de inicio de sesión personalizado"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "DNS Mode"
msgstr "Modo DNS"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:93
msgid "Daemon MTU"
msgstr "MTU del demonio"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:865
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:905
msgid "Daemon Settings"
msgstr "Ajustes del demonio"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:56
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:79
msgid "Declare this device as an Exit Node."
msgstr "Declarar este dispositivo como nodo de salida."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:869
msgid "Devices List"
msgstr "Lista de dispositivos"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:63
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:86
msgid "Disable Firewall Configuration"
msgstr "Desactivar la configuración del cortafuegos"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:59
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:82
msgid "Disable SNAT"
msgstr "Desactivar SNAT"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:59
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:82
msgid ""
"Disable Source NAT (SNAT) for traffic to advertised routes. Most "
"users should leave this unchecked."
@@ -204,46 +204,46 @@ msgstr ""
"tráfico hacia las rutas anunciadas. La mayoría de los usuarios deben "
"dejar esta opción desmarcada."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:63
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:86
msgid "Disable Tailscale netfilter auto-configuration (--netfilter-mode=off)."
msgstr ""
"Desactivar la autoconfiguración de netfilter de Tailscale "
"(--netfilter-mode=off)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "Disabled"
msgstr "Desactivado"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "Disabled: system DNS only."
msgstr "Desactivado: solo el DNS del sistema."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:751
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:791
msgid "Disconnect from Tailscale and expire current node key."
msgstr "Desconectar de Tailscale e invalidar la clave actual del nodo."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:41
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
msgid "Empty reply from server"
msgstr "Respuesta vacía del servidor"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:87
msgid "Enable Peer Relay"
msgstr "Activar Peer Relay"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:61
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:84
msgid "Enable Tailscale SSH"
msgstr "Activar Tailscale SSH"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:53
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:76
msgid "Enable Tailscale Service"
msgstr "Activar el servicio Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:58
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:81
msgid "Enable Web Interface"
msgstr "Activar la interfaz web"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:53
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:76
msgid ""
"Enable or disable the Tailscale service. When disabled, the service "
"will be stopped and the process will be killed."
@@ -251,7 +251,7 @@ msgstr ""
"Activa o desactiva el servicio Tailscale. Al desactivarlo, el "
"servicio se detendrá y el proceso se finalizará."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:87
msgid ""
"Enable this device as a Peer Relay server. Requires a public IP and "
"an UDP port open on the router."
@@ -259,11 +259,11 @@ msgstr ""
"Activa este dispositivo como servidor Peer Relay. Requiere una IP "
"pública y un puerto UDP abierto en el router."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "Enabled"
msgstr "Activado"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:71
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:94
msgid ""
"Enabling this option can reduce memory usage, but it may sacrifice "
"some performance (set GOGC=10)."
@@ -271,23 +271,23 @@ msgstr ""
"Activar esta opción puede reducir el uso de memoria, pero puede "
"mermar algo el rendimiento (establece GOGC=10)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:787
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:827
msgid "Error"
msgstr "Error"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
msgid "Error caching DERP region map: %s"
msgstr "Error al guardar en caché el mapa de regiones DERP: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
msgid "Error fetching DERP region map: %s"
msgstr "Error al obtener el mapa de regiones DERP: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:245
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:305
msgid "Error reading cached DERP region map: %s"
msgstr "Error al leer el mapa de regiones DERP en caché: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:645
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:685
msgid ""
"Essential configuration for Subnet Routing (Site-to-Site) and Exit "
"Node features."
@@ -295,12 +295,12 @@ msgstr ""
"Configuración esencial para las funciones de enrutamiento de subredes "
"(sitio a sitio) y de nodo de salida."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:612
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:652
msgid "Exit Node"
msgstr "Nodo de salida"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:58
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:81
msgid ""
"Expose a web interface on port 5252 for managing this node over "
"Tailscale."
@@ -308,66 +308,66 @@ msgstr ""
"Expone una interfaz web en el puerto 5252 para administrar este nodo "
"a través de Tailscale."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
msgid "Failed to configure firewall: %s"
msgstr "No se pudo configurar el cortafuegos: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:788
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:828
msgid "Failed to get login URL. You may close this tab."
msgstr ""
"No se pudo obtener la URL de inicio de sesión. Puede cerrar esta "
"pestaña."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
msgid "Failed to get login URL: %s"
msgstr "No se pudo obtener la URL de inicio de sesión: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:859
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:899
msgid "Failed to load logs: %s"
msgstr "No se pudieron cargar los registros: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:487
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:547
msgid "Filter peers by name, IP, or OS..."
msgstr "Filtrar pares por nombre, IP o sistema operativo..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:504
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:564
msgid "Filter:"
msgstr "Filtro:"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:54
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:77
msgid "Firewall Mode"
msgstr "Modo del cortafuegos"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:716
msgid "Firewall configuration already applied."
msgstr "La configuración del cortafuegos ya está aplicada."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:159
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:219
msgid "Firewall configuration applied."
msgstr "Configuración del cortafuegos aplicada."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:165
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:225
msgid "Firewall reload failed"
msgstr "Error al recargar el cortafuegos"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:600
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:640
msgid "General Settings"
msgstr "Ajustes generales"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:449
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:509
msgid "Hostname"
msgstr "Nombre de host"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:706
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:746
msgid "How to enable Exit Node?"
msgstr "¿Cómo activar el nodo de salida?"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:688
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:728
msgid "How to enable Site-to-Site?"
msgstr "¿Cómo activar la conexión sitio a sitio?"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:730
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:770
msgid ""
"If the timeout is displayed, you can refresh the page and click Login "
"again."
@@ -375,7 +375,7 @@ msgstr ""
"Si aparece un tiempo de espera agotado, puede actualizar la página y "
"volver a hacer clic en Iniciar sesión."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:744
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:784
msgid ""
"If you are using custom login server but not providing an Auth Key, "
"will redirect to the login page without pre-filling the key."
@@ -384,15 +384,15 @@ msgstr ""
"proporciona una clave de autenticación, se redirigirá a la página de "
"inicio de sesión sin rellenar la clave previamente."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:215
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
msgid "Invalid Date"
msgstr "Fecha no válida"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
msgid "Invalid response from server."
msgstr "Respuesta no válida del servidor."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:646
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:686
msgid ""
"It creates the tailscale interface, adds it to a firewall zone, and "
"sets up forwarding between LAN and Tailscale, plus Tailscale to WAN."
@@ -401,55 +401,55 @@ msgstr ""
"configura el reenvío entre la LAN y Tailscale, además de Tailscale "
"hacia la WAN."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:218
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:278
msgid "Just now"
msgstr "Ahora mismo"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:330
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:390
msgid "LOGGED OUT"
msgstr "SESIÓN CERRADA"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:455
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:515
msgid "Last Seen"
msgstr "Última conexión"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:736
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:776
msgid "Leave blank for default Tailscale control plane."
msgstr ""
"Déjelo en blanco para usar el plano de control predeterminado de "
"Tailscale."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:853
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:893
msgid "Loading logs"
msgstr "Cargando registros"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:852
msgid "Logging out..."
msgstr "Cerrando sesión..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:728
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:768
msgid "Login"
msgstr "Iniciar sesión"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:749
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:815
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:823
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:855
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:863
msgid "Logout"
msgstr "Cerrar sesión"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
msgid "Logout failed: %s"
msgstr "Error al cerrar sesión: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:836
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:876
msgid "Logs"
msgstr "Registros"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "MagicDNS: Tailscale overrides resolv.conf."
msgstr "MagicDNS: Tailscale sobrescribe resolv.conf."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:648
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:688
msgid ""
"Masquerading and MSS Clamping (MTU fix) are enabled to keep "
"connections stable."
@@ -457,62 +457,62 @@ msgstr ""
"Se activan el enmascaramiento y el MSS Clamping (corrección de MTU) "
"para mantener estables las conexiones."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:212
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
msgid "N/A"
msgstr "N/D"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:341
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:401
msgid "NOT RUNNING"
msgstr "NO EN EJECUCIÓN"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:439
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:499
msgid "No matching peer devices found."
msgstr "No se encontraron dispositivos pares que coincidan."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:460
msgid "No peer devices found."
msgstr "No se encontraron dispositivos pares."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:368
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:428
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:880
msgid "No tailscale-related logs found."
msgstr "No se encontraron registros relacionados con Tailscale."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:613
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:653
msgid "None"
msgstr "Ninguno"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:213
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:273
msgid "Now"
msgstr "Ahora"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:451
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:511
msgid "OS"
msgstr "SO"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
msgid "Offline"
msgstr "Sin conexión"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
msgid "Online"
msgstr "En línea"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "OpenWrt Forward"
msgstr "Reenvío OpenWrt"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "OpenWrt Forward: MagicDNS via dnsmasq forwarding.(Only support ts.net)"
msgstr ""
"Reenvío de OpenWrt: MagicDNS mediante el reenvío de dnsmasq. (Solo "
"admite ts.net)"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:39
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
msgid "Operation"
msgstr "Operación"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:735
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:775
msgid ""
"Optional: Specify a custom control server URL (e.g., a Headscale "
"instance, %s)."
@@ -520,7 +520,7 @@ msgstr ""
"Opcional: especifique la URL de un servidor de control personalizado "
"(por ejemplo, una instancia de Headscale, %s)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:743
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:783
msgid ""
"Optional: Specify an authentication key for the custom control "
"server. Leave blank if not required."
@@ -528,50 +528,50 @@ msgstr ""
"Opcional: especifique una clave de autenticación para el servidor de "
"control personalizado. Déjelo en blanco si no es necesaria."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:604
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:644
msgid "Peer Relay Port"
msgstr "Puerto de Peer Relay"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:392
msgid "Please use the login button in the settings below to authenticate."
msgstr ""
"Utilice el botón de inicio de sesión de los ajustes que aparecen a "
"continuación para autenticarse."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:772
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:852
msgid "Please wait."
msgstr "Espere, por favor."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:349
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:409
msgid "RUNNING"
msgstr "EN EJECUCIÓN"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:453
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:513
msgid "RX"
msgstr "RX"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:845
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:885
msgid "Refresh"
msgstr "Actualizar"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:177
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:237
msgid "Reloading firewall..."
msgstr "Recargando el cortafuegos..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:772
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
msgid "Requesting Login URL..."
msgstr "Solicitando la URL de inicio de sesión..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:769
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:809
msgid "Requesting Tailscale login URL... Please wait."
msgstr ""
"Solicitando la URL de inicio de sesión de Tailscale... Espere, por "
"favor."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:612
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:652
msgid ""
"Select an exit node from the list. If enabled, Allow LAN Access is "
"enabled implicitly."
@@ -579,7 +579,7 @@ msgstr ""
"Seleccione un nodo de salida de la lista. Si se activa, Permitir "
"acceso a la LAN se activa de forma implícita."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:54
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:77
msgid ""
"Select the firewall backend for Tailscale to use. Requires service "
"restart to take effect."
@@ -587,14 +587,14 @@ msgstr ""
"Seleccione el backend de cortafuegos que usará Tailscale. Requiere "
"reiniciar el servicio para aplicarse."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:320
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:328
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:340
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:349
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:380
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:388
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:409
msgid "Service Status"
msgstr "Estado del servicio"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:93
msgid ""
"Set a custom MTU for the Tailscale daemon. Leave blank to use the "
"default value."
@@ -602,60 +602,60 @@ msgstr ""
"Establezca un MTU personalizado para el demonio de Tailscale. Déjelo "
"en blanco para usar el valor predeterminado."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:60
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:83
msgid "Shields Up"
msgstr "Bloquear conexiones entrantes"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:448
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:508
msgid "Status"
msgstr "Estado"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:817
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:857
msgid "Successfully logged out."
msgstr "Sesión cerrada correctamente."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:321
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:381
msgid "TAILSCALE NOT FOUND"
msgstr "TAILSCALE NO ENCONTRADO"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "TUN Mode"
msgstr "Modo TUN"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:454
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:514
msgid "TX"
msgstr "TX"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:354
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:414
msgid "Tailnet Name"
msgstr "Nombre de la tailnet"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:562
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:622
#: luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:1
msgid "Tailscale"
msgstr "Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:297
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:357
msgid "Tailscale Health Check: %s"
msgstr "Comprobación de estado de Tailscale: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:450
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:510
msgid "Tailscale IP"
msgstr "IP de Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:352
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:412
msgid "Tailscale IPv4"
msgstr "IPv4 de Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:353
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:413
msgid "Tailscale IPv6"
msgstr "IPv6 de Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:768
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:808
msgid "Tailscale Login"
msgstr "Inicio de sesión en Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:562
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:622
msgid ""
"Tailscale is a mesh VPN solution that makes it easy to connect your "
"devices securely. This configuration page allows you to manage "
@@ -665,11 +665,11 @@ msgstr ""
"segura de sus dispositivos. Esta página de configuración le permite "
"gestionar los ajustes de Tailscale en su dispositivo OpenWrt."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:389
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:449
msgid "Tailscale status error"
msgstr "Error de estado de Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:647
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:687
msgid ""
"The Tailscale to WAN forwarding is what lets clients send their "
"internet traffic through this device as an Exit Node."
@@ -678,11 +678,11 @@ msgstr ""
"clientes envíen su tráfico de Internet a través de este dispositivo "
"como nodo de salida."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:770
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:810
msgid "This can take up to 30 seconds."
msgstr "Esto puede tardar hasta 30 segundos."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:800
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840
msgid ""
"This will disconnect this device from your Tailnet and require you to "
"re-authenticate."
@@ -690,12 +690,12 @@ msgstr ""
"Esto desconectará este dispositivo de su tailnet y requerirá que "
"vuelva a autenticarse."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:143
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:194
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:203
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:254
msgid "Timed out waiting for the firewall reload"
msgstr "Se agotó el tiempo de espera para la recarga del cortafuegos"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:605
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:645
msgid ""
"UDP port for the Peer Relay service. Open this port on your router "
"firewall/NAT."
@@ -703,21 +703,21 @@ msgstr ""
"Puerto UDP para el servicio Peer Relay. Abra este puerto en el "
"cortafuegos/NAT del router."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:245
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:859
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:305
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:899
msgid "Unknown error"
msgstr "Error desconocido"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:350
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:410
msgid "Version"
msgstr "Versión"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:60
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:83
msgid ""
"When enabled, blocks all inbound connections from the Tailscale "
"network."
@@ -725,11 +725,11 @@ msgstr ""
"Cuando está activado, bloquea todas las conexiones entrantes de la "
"red Tailscale."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:57
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:80
msgid "When using the exit node, access to the local LAN is allowed."
msgstr "Al usar el nodo de salida, se permite el acceso a la LAN local."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:660
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:700
msgid ""
"You have unapplied changes. Save & Apply them first so the firewall "
"matches the form."
@@ -737,7 +737,7 @@ msgstr ""
"Tiene cambios sin aplicar. Guárdelos y aplíquelos primero para que el "
"cortafuegos coincida con el formulario."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:696
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:736
msgid ""
"[Important] Log in to the Tailscale admin console and manually enable "
"\"Subnet Routes\" for this device."
@@ -746,7 +746,7 @@ msgstr ""
"Tailscale y habilite manualmente \"Subnet Routes\" para este "
"dispositivo."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:719
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:759
msgid ""
"[Important] Step 3 cannot be done here: it needs your Tailscale "
"account."
@@ -754,7 +754,7 @@ msgstr ""
"[Importante] El paso 3 no se puede realizar aquí: requiere su cuenta "
"de Tailscale."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:221
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:281
msgid "ago"
msgstr "atrás"
+168 -168
View File
@@ -1,25 +1,25 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:47
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
msgid "%s failed"
msgstr "Niepowodzenie operacji: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:71
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:94
msgid "(Experimental) Reduce Memory Usage"
msgstr "(Eksperymentalne) Zmniejsz użycie pamięci"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:711
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:751
msgid "1. Enable \"Advertise Exit Node\"."
msgstr "1. Włącz \"Ogłaszaj węzeł wyjścia\"."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:693
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:733
msgid "1. Select \"Accept Routes\" (to access remote devices)."
msgstr ""
"1. Wybierz \"Akceptuj trasy\" (aby uzyskać dostęp do zdalnych "
"urządzeń)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:712
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:752
msgid ""
"2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic "
"to WAN)."
@@ -27,7 +27,7 @@ msgstr ""
"2. Kliknij \"Automatycznie konfiguruj zaporę\" (przekazuje ruch "
"Tailscale do sieci WAN)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:694
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:734
msgid ""
"2. In \"Advertise Routes\", select your local subnet (to allow remote "
"devices to access this LAN)."
@@ -35,13 +35,13 @@ msgstr ""
"2. W \"Ogłaszaj trasy\" wybierz swoją lokalną podsieć (aby umożliwić "
"zdalnym urządzaniom dostęp do tej sieci LAN)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:695
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:735
msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)."
msgstr ""
"3. Kliknij \"Automatycznie konfiguruj zaporę\" (aby zezwolić na "
"przekazywanie ruchu)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:713
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:753
msgid ""
"3. In the Tailscale admin console, edit this device under the route "
"settings and approve it as an Exit Node."
@@ -49,27 +49,27 @@ msgstr ""
"3. W panelu administracyjnym Tailscale edytuj to urządzenie w "
"ustawieniach tras i zatwierdź je jako węzeł wyjścia."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:718
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:758
msgid "4. On the client, set this device as its exit node."
msgstr "4. W kliencie ustaw to urządzenie jako węzeł wyjścia."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:55
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:78
msgid "Accept Routes"
msgstr "Akceptuj trasy"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:725
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:765
msgid "Account Settings"
msgstr "Ustawienia konta"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:56
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:79
msgid "Advertise Exit Node"
msgstr "Ogłaszaj węzeł wyjścia"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:636
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
msgid "Advertise Routes"
msgstr "Ogłaszaj trasy"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:636
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
msgid ""
"Advertise subnet routes behind this device. Select from the detected "
"subnets below or enter custom routes (comma-separated)."
@@ -78,15 +78,15 @@ msgstr ""
"podsieci poniżej lub wprowadź niestandardowe trasy (oddzielone "
"przecinkami)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:57
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:80
msgid "Allow LAN Access"
msgstr "Zezwól na dostęp do LAN"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:55
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:78
msgid "Allow accepting routes announced by other nodes."
msgstr "Zezwól na akceptowanie tras ogłaszanych przez inne węzły."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:61
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:84
msgid "Allow connecting to this device through the SSH function of Tailscale."
msgstr "Zezwól na łączenie się z tym urządzeniem przez funkcję SSH Tailscale."
@@ -94,38 +94,38 @@ msgstr "Zezwól na łączenie się z tym urządzeniem przez funkcję SSH Tailsca
msgid "Allow user access to tailscale"
msgstr "Zezwól użytkownikowi na dostęp do Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:170
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:230
msgid "Another firewall reload is already running"
msgstr "Trwa już ponowne ładowanie zapory"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:799
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:839
msgid "Are you sure you want to log out?"
msgstr "Czy na pewno chcesz się wylogować?"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:644
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:684
msgid "Auto Configure Firewall"
msgstr "Automatycznie konfiguruj zaporę"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:806
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:846
msgid "Cancel"
msgstr "Anuluj"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:750
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:790
msgid "Click to Log out account on this device."
msgstr "Kliknij, aby wylogować konto z tego urządzenia."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:729
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:769
msgid "Click to get a login URL for this device."
msgstr "Kliknij, aby uzyskać URL logowania dla tego urządzenia."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:291
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:383
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:591
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:850
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:443
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:631
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:890
msgid "Collecting data ..."
msgstr "Zbieranie danych ..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:680
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:720
msgid ""
"Configuration committed, reloading network and firewall. This can "
"take a moment."
@@ -133,23 +133,23 @@ msgstr ""
"Konfiguracja została zatwierdzona, ponowne ładowanie sieci i zapory. "
"Może to chwilę potrwać."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:673
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:713
msgid "Configuring firewall"
msgstr "Konfigurowanie zapory"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:826
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:866
msgid "Confirm Logout"
msgstr "Potwierdź wylogowanie"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:452
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:512
msgid "Connection Info"
msgstr "Informacje o połączeniu"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "Controls how Tailscale DNS is handled."
msgstr "Kontroluje sposób obsługi DNS Tailscale."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:762
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:802
msgid ""
"Could not open a new tab. Please check if your browser or an "
"extension blocked the pop-up."
@@ -157,43 +157,43 @@ msgstr ""
"Nie można otworzyć nowej karty. Sprawdź, czy przeglądarka lub "
"rozszerzenie zablokowało wyskakujące okno."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:734
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:774
msgid "Custom Login Server"
msgstr "Niestandardowy serwer logowania"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:742
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:782
msgid "Custom Login Server Auth Key"
msgstr "Klucz autoryzacji niestandardowego serwera logowania"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "DNS Mode"
msgstr "Tryb DNS"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:93
msgid "Daemon MTU"
msgstr "MTU demona"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:865
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:905
msgid "Daemon Settings"
msgstr "Ustawienia demona"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:56
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:79
msgid "Declare this device as an Exit Node."
msgstr "Deklaruje to urządzenie jako węzeł wyjścia."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:869
msgid "Devices List"
msgstr "Lista urządzeń"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:63
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:86
msgid "Disable Firewall Configuration"
msgstr "Wyłącz konfigurację zapory"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:59
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:82
msgid "Disable SNAT"
msgstr "Wyłącz SNAT"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:59
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:82
msgid ""
"Disable Source NAT (SNAT) for traffic to advertised routes. Most "
"users should leave this unchecked."
@@ -201,46 +201,46 @@ msgstr ""
"Wyłącz NAT źródłowy (SNAT) dla ruchu do ogłaszanych tras. Większość "
"użytkowników powinna zostawić to pole niezaznaczone."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:63
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:86
msgid "Disable Tailscale netfilter auto-configuration (--netfilter-mode=off)."
msgstr ""
"Wyłącz automatyczną konfigurację netfilter Tailscale "
"(--netfilter-mode=off)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "Disabled"
msgstr "Wyłączone"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "Disabled: system DNS only."
msgstr "Wyłączone: tylko DNS systemowy."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:751
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:791
msgid "Disconnect from Tailscale and expire current node key."
msgstr "Rozłącz z Tailscale i wygaś bieżący klucz węzła."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:41
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
msgid "Empty reply from server"
msgstr "Pusta odpowiedź z serwera"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:87
msgid "Enable Peer Relay"
msgstr "Włącz przekazywanie między węzłami"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:61
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:84
msgid "Enable Tailscale SSH"
msgstr "Włącz SSH Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:53
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:76
msgid "Enable Tailscale Service"
msgstr "Włącz usługę Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:58
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:81
msgid "Enable Web Interface"
msgstr "Włącz interfejs webowy"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:53
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:76
msgid ""
"Enable or disable the Tailscale service. When disabled, the service "
"will be stopped and the process will be killed."
@@ -248,7 +248,7 @@ msgstr ""
"Włącz lub wyłącz usługę Tailscale. Po wyłączeniu usługa zostanie "
"zatrzymana, a proces zostanie zakończony."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:87
msgid ""
"Enable this device as a Peer Relay server. Requires a public IP and "
"an UDP port open on the router."
@@ -256,11 +256,11 @@ msgstr ""
"Włącz to urządzenie jako serwer przekazywania między węzłami. Wymaga "
"publicznego IP i otwartego portu UDP na routerze."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "Enabled"
msgstr "Włączone"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:71
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:94
msgid ""
"Enabling this option can reduce memory usage, but it may sacrifice "
"some performance (set GOGC=10)."
@@ -268,23 +268,23 @@ msgstr ""
"Włączenie tej opcji może zmniejszyć użycie pamięci, ale może to "
"wpłynąć na wydajność (ustawia GOGC=10)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:787
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:827
msgid "Error"
msgstr "Błąd"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
msgid "Error caching DERP region map: %s"
msgstr "Błąd buforowania mapy regionu DERP: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
msgid "Error fetching DERP region map: %s"
msgstr "Błąd pobierania mapy regionu DERP: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:245
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:305
msgid "Error reading cached DERP region map: %s"
msgstr "Błąd odczytywania buforowanej mapy regionu DERP: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:645
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:685
msgid ""
"Essential configuration for Subnet Routing (Site-to-Site) and Exit "
"Node features."
@@ -292,12 +292,12 @@ msgstr ""
"Podstawowa konfiguracja dla funkcji routingu podsieci (Site-to-Site) "
"i węzła wyjścia."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:612
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:652
msgid "Exit Node"
msgstr "Węzeł wyjścia"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:58
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:81
msgid ""
"Expose a web interface on port 5252 for managing this node over "
"Tailscale."
@@ -305,64 +305,64 @@ msgstr ""
"Udostępnij interfejs webowy na porcie 5252 do zarządzania tym węzłem "
"przez Tailscale."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
msgid "Failed to configure firewall: %s"
msgstr "Nie udało się skonfigurować zapory: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:788
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:828
msgid "Failed to get login URL. You may close this tab."
msgstr "Nie udało się uzyskać URL logowania. Możesz zamknąć tę kartę."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
msgid "Failed to get login URL: %s"
msgstr "Nie udało się uzyskać URL logowania: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:859
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:899
msgid "Failed to load logs: %s"
msgstr "Nie udało się załadować logów: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:487
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:547
msgid "Filter peers by name, IP, or OS..."
msgstr "Filtruj węzły po nazwie, IP lub systemie operacyjnym..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:504
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:564
msgid "Filter:"
msgstr "Filtruj:"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:54
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:77
msgid "Firewall Mode"
msgstr "Tryb zapory"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:716
msgid "Firewall configuration already applied."
msgstr "Konfiguracja zapory jest już zastosowana."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:159
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:219
msgid "Firewall configuration applied."
msgstr "Zastosowano konfigurację zapory."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:165
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:225
msgid "Firewall reload failed"
msgstr "Nie udało się ponownie załadować zapory"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:600
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:640
msgid "General Settings"
msgstr "Ustawienia ogólne"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:449
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:509
msgid "Hostname"
msgstr "Nazwa hosta"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:706
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:746
msgid "How to enable Exit Node?"
msgstr "Jak włączyć węzeł wyjścia?"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:688
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:728
msgid "How to enable Site-to-Site?"
msgstr "Jak włączyć Site-to-Site?"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:730
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:770
msgid ""
"If the timeout is displayed, you can refresh the page and click Login "
"again."
@@ -370,7 +370,7 @@ msgstr ""
"Jeśli wyświetlany jest komunikat o przekroczeniu limitu czasu, możesz "
"odświeżyć stronę i kliknąć Zaloguj ponownie."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:744
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:784
msgid ""
"If you are using custom login server but not providing an Auth Key, "
"will redirect to the login page without pre-filling the key."
@@ -379,15 +379,15 @@ msgstr ""
"podajesz klucza autoryzacji, nastąpi przekierowanie do strony "
"logowania bez wypełniania klucza."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:215
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
msgid "Invalid Date"
msgstr "Nieprawidłowa data"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
msgid "Invalid response from server."
msgstr "Nieprawidłowa odpowiedź z serwera."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:646
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:686
msgid ""
"It creates the tailscale interface, adds it to a firewall zone, and "
"sets up forwarding between LAN and Tailscale, plus Tailscale to WAN."
@@ -396,53 +396,53 @@ msgstr ""
"przekazywanie między sieciami LAN i Tailscale oraz z Tailscale do "
"sieci WAN."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:218
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:278
msgid "Just now"
msgstr "Przed chwilą"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:330
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:390
msgid "LOGGED OUT"
msgstr "WYLOGOWANO"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:455
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:515
msgid "Last Seen"
msgstr "Ostatnia aktywność"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:736
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:776
msgid "Leave blank for default Tailscale control plane."
msgstr "Pozostaw puste dla domyślnego panelu kontrolnego Tailscale."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:853
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:893
msgid "Loading logs"
msgstr "Ładowanie logów"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:852
msgid "Logging out..."
msgstr "Wylogowywanie..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:728
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:768
msgid "Login"
msgstr "Zaloguj"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:749
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:815
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:823
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:855
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:863
msgid "Logout"
msgstr "Wyloguj"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
msgid "Logout failed: %s"
msgstr "Wylogowanie nie powiodło się: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:836
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:876
msgid "Logs"
msgstr "Logi"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "MagicDNS: Tailscale overrides resolv.conf."
msgstr "MagicDNS: Tailscale nadpisuje resolv.conf."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:648
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:688
msgid ""
"Masquerading and MSS Clamping (MTU fix) are enabled to keep "
"connections stable."
@@ -450,62 +450,62 @@ msgstr ""
"Maskowanie i MSS Clamping (korekta MTU) są włączone, aby połączenia "
"pozostały stabilne."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:212
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
msgid "N/A"
msgstr "Niedostępne"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:341
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:401
msgid "NOT RUNNING"
msgstr "NIE DZIAŁA"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:439
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:499
msgid "No matching peer devices found."
msgstr "Nie znaleziono pasujących urządzeń partnerskich."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:460
msgid "No peer devices found."
msgstr "Nie znaleziono urządzeń partnerskich."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:368
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:428
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:880
msgid "No tailscale-related logs found."
msgstr "Nie znaleziono logów związanych z Tailscale."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:613
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:653
msgid "None"
msgstr "Brak"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:213
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:273
msgid "Now"
msgstr "Teraz"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:451
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:511
msgid "OS"
msgstr "System operacyjny"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
msgid "Offline"
msgstr "Offline"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
msgid "Online"
msgstr "Online"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "OpenWrt Forward"
msgstr "Przekazywanie OpenWrt"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "OpenWrt Forward: MagicDNS via dnsmasq forwarding.(Only support ts.net)"
msgstr ""
"Przekazywanie OpenWrt: MagicDNS przez przekazywanie dnsmasq. "
"(Obsługuje tylko ts.net)"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:39
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
msgid "Operation"
msgstr "Operacja"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:735
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:775
msgid ""
"Optional: Specify a custom control server URL (e.g., a Headscale "
"instance, %s)."
@@ -513,7 +513,7 @@ msgstr ""
"Opcjonalne: Podaj niestandardowy URL serwera kontrolnego (np. "
"instancja Headscale, %s)."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:743
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:783
msgid ""
"Optional: Specify an authentication key for the custom control "
"server. Leave blank if not required."
@@ -521,48 +521,48 @@ msgstr ""
"Opcjonalne: Podaj klucz autoryzacji dla niestandardowego serwera "
"kontrolnego. Pozostaw puste, jeśli nie jest wymagany."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:604
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:644
msgid "Peer Relay Port"
msgstr "Port przekazywania między węzłami"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:392
msgid "Please use the login button in the settings below to authenticate."
msgstr ""
"Użyj przycisku logowania w ustawieniach poniżej, aby się "
"uwierzytelnić."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:772
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:852
msgid "Please wait."
msgstr "Proszę czekać."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:349
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:409
msgid "RUNNING"
msgstr "DZIAŁA"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:453
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:513
msgid "RX"
msgstr "Odbieranie"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:845
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:885
msgid "Refresh"
msgstr "Odśwież"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:177
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:237
msgid "Reloading firewall..."
msgstr "Ponowne ładowanie zapory..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:772
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
msgid "Requesting Login URL..."
msgstr "Pobieranie URL logowania..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:769
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:809
msgid "Requesting Tailscale login URL... Please wait."
msgstr "Pobieranie URL logowania Tailscale... Proszę czekać."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:612
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:652
msgid ""
"Select an exit node from the list. If enabled, Allow LAN Access is "
"enabled implicitly."
@@ -570,7 +570,7 @@ msgstr ""
"Wybierz węzeł wyjścia z listy. Jeśli włączony, dostęp do LAN jest "
"automatycznie włączony."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:54
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:77
msgid ""
"Select the firewall backend for Tailscale to use. Requires service "
"restart to take effect."
@@ -578,14 +578,14 @@ msgstr ""
"Wybierz mechanizm zapory dla Tailscale. Wymaga restartu usługi, aby "
"zmiany zaczęły obowiązywać."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:320
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:328
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:340
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:349
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:380
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:388
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:409
msgid "Service Status"
msgstr "Status usługi"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:93
msgid ""
"Set a custom MTU for the Tailscale daemon. Leave blank to use the "
"default value."
@@ -593,60 +593,60 @@ msgstr ""
"Ustaw niestandardowe MTU dla demona Tailscale. Pozostaw puste, aby "
"użyć wartości domyślnej."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:60
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:83
msgid "Shields Up"
msgstr "Blokuj połączenia przychodzące"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:448
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:508
msgid "Status"
msgstr "Status"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:817
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:857
msgid "Successfully logged out."
msgstr "Pomyślnie wylogowano."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:321
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:381
msgid "TAILSCALE NOT FOUND"
msgstr "NIE ZNALEZIONO TAILSCALE"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "TUN Mode"
msgstr "Tryb TUN"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:454
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:514
msgid "TX"
msgstr "Wysyłanie"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:354
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:414
msgid "Tailnet Name"
msgstr "Nazwa Tailnet"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:562
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:622
#: luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:1
msgid "Tailscale"
msgstr "Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:297
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:357
msgid "Tailscale Health Check: %s"
msgstr "Kontrola stanu Tailscale: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:450
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:510
msgid "Tailscale IP"
msgstr "IP Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:352
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:412
msgid "Tailscale IPv4"
msgstr "IPv4 Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:353
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:413
msgid "Tailscale IPv6"
msgstr "IPv6 Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:768
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:808
msgid "Tailscale Login"
msgstr "Logowanie Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:562
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:622
msgid ""
"Tailscale is a mesh VPN solution that makes it easy to connect your "
"devices securely. This configuration page allows you to manage "
@@ -656,11 +656,11 @@ msgstr ""
"urządzeń. Ta strona konfiguracyjna pozwala zarządzać ustawieniami "
"Tailscale na urządzeniu OpenWrt."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:389
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:449
msgid "Tailscale status error"
msgstr "Błąd statusu Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:647
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:687
msgid ""
"The Tailscale to WAN forwarding is what lets clients send their "
"internet traffic through this device as an Exit Node."
@@ -668,11 +668,11 @@ msgstr ""
"Przekazywanie z Tailscale do sieci WAN pozwala klientom wysyłać ruch "
"internetowy przez to urządzenie jako węzeł wyjścia."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:770
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:810
msgid "This can take up to 30 seconds."
msgstr "Może to potrwać do 30 sekund."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:800
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840
msgid ""
"This will disconnect this device from your Tailnet and require you to "
"re-authenticate."
@@ -680,12 +680,12 @@ msgstr ""
"Spowoduje to rozłączenie tego urządzenia z Twojego Tailnet i wymaga "
"ponownego uwierzytelnienia."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:143
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:194
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:203
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:254
msgid "Timed out waiting for the firewall reload"
msgstr "Upłynął limit czasu oczekiwania na ponowne załadowanie zapory"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:605
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:645
msgid ""
"UDP port for the Peer Relay service. Open this port on your router "
"firewall/NAT."
@@ -693,21 +693,21 @@ msgstr ""
"Port UDP dla usługi przekazywania między węzłami. Otwórz ten port w "
"zaporze/NAT na routerze."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:245
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:859
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:305
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:899
msgid "Unknown error"
msgstr "Nieznany błąd"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:350
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:410
msgid "Version"
msgstr "Wersja"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:60
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:83
msgid ""
"When enabled, blocks all inbound connections from the Tailscale "
"network."
@@ -715,13 +715,13 @@ msgstr ""
"Po włączeniu blokuje wszystkie połączenia przychodzące z sieci "
"Tailscale."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:57
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:80
msgid "When using the exit node, access to the local LAN is allowed."
msgstr ""
"Podczas korzystania z węzła wyjścia dozwolony jest dostęp do "
"lokalnego LAN."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:660
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:700
msgid ""
"You have unapplied changes. Save & Apply them first so the firewall "
"matches the form."
@@ -729,7 +729,7 @@ msgstr ""
"Masz niezastosowane zmiany. Najpierw je zapisz i zastosuj, aby zapora "
"była zgodna z formularzem."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:696
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:736
msgid ""
"[Important] Log in to the Tailscale admin console and manually enable "
"\"Subnet Routes\" for this device."
@@ -737,7 +737,7 @@ msgstr ""
"[Ważne] Zaloguj się do panelu administracyjnego Tailscale i ręcznie "
"włącz \"Trasy podsieci\" dla tego urządzenia."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:719
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:759
msgid ""
"[Important] Step 3 cannot be done here: it needs your Tailscale "
"account."
@@ -745,7 +745,7 @@ msgstr ""
"[Ważne] Kroku 3 nie można wykonać tutaj: wymaga Twojego konta "
"Tailscale."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:221
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:281
msgid "ago"
msgstr "temu"
@@ -1,79 +1,79 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:47
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
msgid "%s failed"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:71
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:94
msgid "(Experimental) Reduce Memory Usage"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:711
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:751
msgid "1. Enable \"Advertise Exit Node\"."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:693
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:733
msgid "1. Select \"Accept Routes\" (to access remote devices)."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:712
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:752
msgid ""
"2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic "
"to WAN)."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:694
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:734
msgid ""
"2. In \"Advertise Routes\", select your local subnet (to allow remote "
"devices to access this LAN)."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:695
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:735
msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:713
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:753
msgid ""
"3. In the Tailscale admin console, edit this device under the route "
"settings and approve it as an Exit Node."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:718
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:758
msgid "4. On the client, set this device as its exit node."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:55
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:78
msgid "Accept Routes"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:725
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:765
msgid "Account Settings"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:56
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:79
msgid "Advertise Exit Node"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:636
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
msgid "Advertise Routes"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:636
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
msgid ""
"Advertise subnet routes behind this device. Select from the detected "
"subnets below or enter custom routes (comma-separated)."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:57
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:80
msgid "Allow LAN Access"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:55
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:78
msgid "Allow accepting routes announced by other nodes."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:61
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:84
msgid "Allow connecting to this device through the SSH function of Tailscale."
msgstr ""
@@ -81,596 +81,596 @@ msgstr ""
msgid "Allow user access to tailscale"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:170
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:230
msgid "Another firewall reload is already running"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:799
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:839
msgid "Are you sure you want to log out?"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:644
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:684
msgid "Auto Configure Firewall"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:806
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:846
msgid "Cancel"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:750
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:790
msgid "Click to Log out account on this device."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:729
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:769
msgid "Click to get a login URL for this device."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:291
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:383
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:591
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:850
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:443
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:631
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:890
msgid "Collecting data ..."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:680
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:720
msgid ""
"Configuration committed, reloading network and firewall. This can "
"take a moment."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:673
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:713
msgid "Configuring firewall"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:826
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:866
msgid "Confirm Logout"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:452
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:512
msgid "Connection Info"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "Controls how Tailscale DNS is handled."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:762
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:802
msgid ""
"Could not open a new tab. Please check if your browser or an "
"extension blocked the pop-up."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:734
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:774
msgid "Custom Login Server"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:742
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:782
msgid "Custom Login Server Auth Key"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "DNS Mode"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:93
msgid "Daemon MTU"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:865
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:905
msgid "Daemon Settings"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:56
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:79
msgid "Declare this device as an Exit Node."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:869
msgid "Devices List"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:63
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:86
msgid "Disable Firewall Configuration"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:59
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:82
msgid "Disable SNAT"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:59
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:82
msgid ""
"Disable Source NAT (SNAT) for traffic to advertised routes. Most "
"users should leave this unchecked."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:63
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:86
msgid "Disable Tailscale netfilter auto-configuration (--netfilter-mode=off)."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "Disabled"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "Disabled: system DNS only."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:751
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:791
msgid "Disconnect from Tailscale and expire current node key."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:41
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
msgid "Empty reply from server"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:87
msgid "Enable Peer Relay"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:61
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:84
msgid "Enable Tailscale SSH"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:53
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:76
msgid "Enable Tailscale Service"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:58
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:81
msgid "Enable Web Interface"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:53
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:76
msgid ""
"Enable or disable the Tailscale service. When disabled, the service "
"will be stopped and the process will be killed."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:87
msgid ""
"Enable this device as a Peer Relay server. Requires a public IP and "
"an UDP port open on the router."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "Enabled"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:71
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:94
msgid ""
"Enabling this option can reduce memory usage, but it may sacrifice "
"some performance (set GOGC=10)."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:787
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:827
msgid "Error"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
msgid "Error caching DERP region map: %s"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
msgid "Error fetching DERP region map: %s"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:245
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:305
msgid "Error reading cached DERP region map: %s"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:645
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:685
msgid ""
"Essential configuration for Subnet Routing (Site-to-Site) and Exit "
"Node features."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:612
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:652
msgid "Exit Node"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:58
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:81
msgid ""
"Expose a web interface on port 5252 for managing this node over "
"Tailscale."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
msgid "Failed to configure firewall: %s"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:788
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:828
msgid "Failed to get login URL. You may close this tab."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
msgid "Failed to get login URL: %s"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:859
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:899
msgid "Failed to load logs: %s"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:487
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:547
msgid "Filter peers by name, IP, or OS..."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:504
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:564
msgid "Filter:"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:54
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:77
msgid "Firewall Mode"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:716
msgid "Firewall configuration already applied."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:159
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:219
msgid "Firewall configuration applied."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:165
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:225
msgid "Firewall reload failed"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:600
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:640
msgid "General Settings"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:449
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:509
msgid "Hostname"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:706
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:746
msgid "How to enable Exit Node?"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:688
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:728
msgid "How to enable Site-to-Site?"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:730
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:770
msgid ""
"If the timeout is displayed, you can refresh the page and click Login "
"again."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:744
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:784
msgid ""
"If you are using custom login server but not providing an Auth Key, "
"will redirect to the login page without pre-filling the key."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:215
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
msgid "Invalid Date"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
msgid "Invalid response from server."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:646
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:686
msgid ""
"It creates the tailscale interface, adds it to a firewall zone, and "
"sets up forwarding between LAN and Tailscale, plus Tailscale to WAN."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:218
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:278
msgid "Just now"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:330
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:390
msgid "LOGGED OUT"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:455
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:515
msgid "Last Seen"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:736
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:776
msgid "Leave blank for default Tailscale control plane."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:853
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:893
msgid "Loading logs"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:852
msgid "Logging out..."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:728
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:768
msgid "Login"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:749
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:815
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:823
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:855
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:863
msgid "Logout"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
msgid "Logout failed: %s"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:836
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:876
msgid "Logs"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "MagicDNS: Tailscale overrides resolv.conf."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:648
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:688
msgid ""
"Masquerading and MSS Clamping (MTU fix) are enabled to keep "
"connections stable."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:212
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
msgid "N/A"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:341
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:401
msgid "NOT RUNNING"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:439
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:499
msgid "No matching peer devices found."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:460
msgid "No peer devices found."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:368
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:428
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:880
msgid "No tailscale-related logs found."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:613
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:653
msgid "None"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:213
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:273
msgid "Now"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:451
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:511
msgid "OS"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
msgid "Offline"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
msgid "Online"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "OpenWrt Forward"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "OpenWrt Forward: MagicDNS via dnsmasq forwarding.(Only support ts.net)"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:39
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
msgid "Operation"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:735
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:775
msgid ""
"Optional: Specify a custom control server URL (e.g., a Headscale "
"instance, %s)."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:743
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:783
msgid ""
"Optional: Specify an authentication key for the custom control "
"server. Leave blank if not required."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:604
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:644
msgid "Peer Relay Port"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:392
msgid "Please use the login button in the settings below to authenticate."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:772
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:852
msgid "Please wait."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:349
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:409
msgid "RUNNING"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:453
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:513
msgid "RX"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:845
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:885
msgid "Refresh"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:177
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:237
msgid "Reloading firewall..."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:772
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
msgid "Requesting Login URL..."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:769
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:809
msgid "Requesting Tailscale login URL... Please wait."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:612
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:652
msgid ""
"Select an exit node from the list. If enabled, Allow LAN Access is "
"enabled implicitly."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:54
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:77
msgid ""
"Select the firewall backend for Tailscale to use. Requires service "
"restart to take effect."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:320
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:328
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:340
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:349
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:380
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:388
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:409
msgid "Service Status"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:93
msgid ""
"Set a custom MTU for the Tailscale daemon. Leave blank to use the "
"default value."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:60
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:83
msgid "Shields Up"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:448
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:508
msgid "Status"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:817
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:857
msgid "Successfully logged out."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:321
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:381
msgid "TAILSCALE NOT FOUND"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "TUN Mode"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:454
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:514
msgid "TX"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:354
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:414
msgid "Tailnet Name"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:562
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:622
#: luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:1
msgid "Tailscale"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:297
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:357
msgid "Tailscale Health Check: %s"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:450
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:510
msgid "Tailscale IP"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:352
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:412
msgid "Tailscale IPv4"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:353
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:413
msgid "Tailscale IPv6"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:768
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:808
msgid "Tailscale Login"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:562
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:622
msgid ""
"Tailscale is a mesh VPN solution that makes it easy to connect your "
"devices securely. This configuration page allows you to manage "
"Tailscale settings on your OpenWrt device."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:389
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:449
msgid "Tailscale status error"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:647
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:687
msgid ""
"The Tailscale to WAN forwarding is what lets clients send their "
"internet traffic through this device as an Exit Node."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:770
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:810
msgid "This can take up to 30 seconds."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:800
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840
msgid ""
"This will disconnect this device from your Tailnet and require you to "
"re-authenticate."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:143
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:194
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:203
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:254
msgid "Timed out waiting for the firewall reload"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:605
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:645
msgid ""
"UDP port for the Peer Relay service. Open this port on your router "
"firewall/NAT."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:245
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:859
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:305
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:899
msgid "Unknown error"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:350
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:410
msgid "Version"
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:60
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:83
msgid ""
"When enabled, blocks all inbound connections from the Tailscale "
"network."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:57
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:80
msgid "When using the exit node, access to the local LAN is allowed."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:660
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:700
msgid ""
"You have unapplied changes. Save & Apply them first so the firewall "
"matches the form."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:696
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:736
msgid ""
"[Important] Log in to the Tailscale admin console and manually enable "
"\"Subnet Routes\" for this device."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:719
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:759
msgid ""
"[Important] Step 3 cannot be done here: it needs your Tailscale "
"account."
msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:221
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:281
msgid "ago"
msgstr ""
@@ -1,79 +1,79 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:47
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
msgid "%s failed"
msgstr "%s失败"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:71
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:94
msgid "(Experimental) Reduce Memory Usage"
msgstr "(实验性) 减少内存使用"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:711
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:751
msgid "1. Enable \"Advertise Exit Node\"."
msgstr "1. 勾选 \"通告出口节点\"。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:693
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:733
msgid "1. Select \"Accept Routes\" (to access remote devices)."
msgstr "1. 勾选 \"接受路由\" (以访问远程设备)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:712
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:752
msgid ""
"2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic "
"to WAN)."
msgstr "2. 点击 \"自动配置防火墙\" (它会将 Tailscale 流量转发到 WAN)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:694
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:734
msgid ""
"2. In \"Advertise Routes\", select your local subnet (to allow remote "
"devices to access this LAN)."
msgstr "2. 在 \"通告路由\" 中选择本地子网 (让远程设备能访问本局域网)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:695
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:735
msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)."
msgstr "3. 点击 \"自动配置防火墙\" (打通防火墙转发)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:713
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:753
msgid ""
"3. In the Tailscale admin console, edit this device under the route "
"settings and approve it as an Exit Node."
msgstr "3. 在 Tailscale 管理控制台的路由设置中编辑此设备,并批准其为出口节点。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:718
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:758
msgid "4. On the client, set this device as its exit node."
msgstr "4. 在客户端上,将此设备设为出口节点。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:55
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:78
msgid "Accept Routes"
msgstr "接受路由"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:725
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:765
msgid "Account Settings"
msgstr "账户设置"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:56
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:79
msgid "Advertise Exit Node"
msgstr "通告出口节点"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:636
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
msgid "Advertise Routes"
msgstr "通告路由"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:636
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
msgid ""
"Advertise subnet routes behind this device. Select from the detected "
"subnets below or enter custom routes (comma-separated)."
msgstr "通告此设备后的子网路由。从下面的子网中选择,或输入自定义路由 (逗号分隔)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:57
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:80
msgid "Allow LAN Access"
msgstr "允许访问局域网"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:55
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:78
msgid "Allow accepting routes announced by other nodes."
msgstr "允许接受由其他节点通告的路由。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:61
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:84
msgid "Allow connecting to this device through the SSH function of Tailscale."
msgstr "允许通过 Tailscale 的 SSH 功能连接到此设备。"
@@ -81,277 +81,277 @@ msgstr "允许通过 Tailscale 的 SSH 功能连接到此设备。"
msgid "Allow user access to tailscale"
msgstr "允许用户访问 Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:170
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:230
msgid "Another firewall reload is already running"
msgstr "另一个防火墙重新加载任务正在进行中"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:799
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:839
msgid "Are you sure you want to log out?"
msgstr "您确定要登出吗?"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:644
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:684
msgid "Auto Configure Firewall"
msgstr "自动配置防火墙"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:806
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:846
msgid "Cancel"
msgstr "取消"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:750
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:790
msgid "Click to Log out account on this device."
msgstr "点击以登出此设备上的账户。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:729
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:769
msgid "Click to get a login URL for this device."
msgstr "点击获取此设备的登录 URL。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:291
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:383
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:591
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:850
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:443
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:631
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:890
msgid "Collecting data ..."
msgstr "正在收集数据..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:680
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:720
msgid ""
"Configuration committed, reloading network and firewall. This can "
"take a moment."
msgstr "配置已提交,正在重新加载网络和防火墙。这可能需要一点时间。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:673
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:713
msgid "Configuring firewall"
msgstr "正在配置防火墙"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:826
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:866
msgid "Confirm Logout"
msgstr "确认登出"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:452
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:512
msgid "Connection Info"
msgstr "连接信息"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "Controls how Tailscale DNS is handled."
msgstr "控制 Tailscale DNS 的处理方式。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:762
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:802
msgid ""
"Could not open a new tab. Please check if your browser or an "
"extension blocked the pop-up."
msgstr "无法打开新标签页。请检查您的浏览器或扩展程序是否阻止了弹出窗口。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:734
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:774
msgid "Custom Login Server"
msgstr "自定义登录服务器"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:742
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:782
msgid "Custom Login Server Auth Key"
msgstr "自定义登录服务器认证密钥"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "DNS Mode"
msgstr "DNS 模式"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:93
msgid "Daemon MTU"
msgstr "守护进程 MTU"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:865
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:905
msgid "Daemon Settings"
msgstr "守护进程设置"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:56
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:79
msgid "Declare this device as an Exit Node."
msgstr "将此设备声明为出口节点。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:869
msgid "Devices List"
msgstr "设备列表"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:63
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:86
msgid "Disable Firewall Configuration"
msgstr "禁用防火墙配置"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:59
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:82
msgid "Disable SNAT"
msgstr "禁用 SNAT"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:59
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:82
msgid ""
"Disable Source NAT (SNAT) for traffic to advertised routes. Most "
"users should leave this unchecked."
msgstr "为通告路由的流量禁用源地址转换 (SNAT)。大多数用户应保持此项不勾选。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:63
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:86
msgid "Disable Tailscale netfilter auto-configuration (--netfilter-mode=off)."
msgstr "禁用 Tailscale netfilter 自动配置 (--netfilter-mode=off)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "Disabled"
msgstr "已禁用"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "Disabled: system DNS only."
msgstr "已禁用:仅使用系统 DNS。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:751
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:791
msgid "Disconnect from Tailscale and expire current node key."
msgstr "从 Tailscale 断开连接并使当前节点密钥过期。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:41
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
msgid "Empty reply from server"
msgstr "服务器返回空响应"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:87
msgid "Enable Peer Relay"
msgstr "启用节点中继"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:61
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:84
msgid "Enable Tailscale SSH"
msgstr "启用 Tailscale SSH"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:53
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:76
msgid "Enable Tailscale Service"
msgstr "启用 Tailscale 服务"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:58
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:81
msgid "Enable Web Interface"
msgstr "启用 Web 界面"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:53
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:76
msgid ""
"Enable or disable the Tailscale service. When disabled, the service "
"will be stopped and the process will be killed."
msgstr "启用或禁用Tailscale服务。禁用后,服务将被停止,当前进程将被终止。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:87
msgid ""
"Enable this device as a Peer Relay server. Requires a public IP and "
"an UDP port open on the router."
msgstr "将此设备设为节点中继服务器。需要此路由器具备公网 IP,并在路由器上开放一个 UDP 端口。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "Enabled"
msgstr "已启用"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:71
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:94
msgid ""
"Enabling this option can reduce memory usage, but it may sacrifice "
"some performance (set GOGC=10)."
msgstr "启用此选项可以减少内存使用,但可能会牺牲一些性能 (设置 GOGC=10)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:787
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:827
msgid "Error"
msgstr "错误"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
msgid "Error caching DERP region map: %s"
msgstr "缓存 DERP 区域地图时出错: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
msgid "Error fetching DERP region map: %s"
msgstr "获取 DERP 区域地图时出错: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:245
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:305
msgid "Error reading cached DERP region map: %s"
msgstr "读取缓存的 DERP 区域地图时出错: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:645
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:685
msgid ""
"Essential configuration for Subnet Routing (Site-to-Site) and Exit "
"Node features."
msgstr "子网路由(局域网间互通)和出口节点的基本配置。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:612
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:652
msgid "Exit Node"
msgstr "出口节点"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:58
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:81
msgid ""
"Expose a web interface on port 5252 for managing this node over "
"Tailscale."
msgstr "在端口 5252 上暴露一个 Web 界面,用于通过 Tailscale 管理此节点。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
msgid "Failed to configure firewall: %s"
msgstr "配置防火墙失败: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:788
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:828
msgid "Failed to get login URL. You may close this tab."
msgstr "获取登录 URL 失败。您可以关闭此标签页。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
msgid "Failed to get login URL: %s"
msgstr "获取登录 URL 失败: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:859
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:899
msgid "Failed to load logs: %s"
msgstr "加载日志失败: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:487
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:547
msgid "Filter peers by name, IP, or OS..."
msgstr "按名称、IP 或操作系统过滤..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:504
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:564
msgid "Filter:"
msgstr "过滤:"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:54
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:77
msgid "Firewall Mode"
msgstr "防火墙模式"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:716
msgid "Firewall configuration already applied."
msgstr "防火墙配置已应用。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:159
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:219
msgid "Firewall configuration applied."
msgstr "已应用防火墙配置"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:165
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:225
msgid "Firewall reload failed"
msgstr "重新加载防火墙失败"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:600
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:640
msgid "General Settings"
msgstr "常规设置"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:449
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:509
msgid "Hostname"
msgstr "主机名"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:706
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:746
msgid "How to enable Exit Node?"
msgstr "如何启用出口节点?"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:688
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:728
msgid "How to enable Site-to-Site?"
msgstr "如何实现站点到站点(即多局域网互通)?"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:730
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:770
msgid ""
"If the timeout is displayed, you can refresh the page and click Login "
"again."
msgstr "如果显示超时,您可以刷新页面并再次点击登录。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:744
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:784
msgid ""
"If you are using custom login server but not providing an Auth Key, "
"will redirect to the login page without pre-filling the key."
msgstr "如果您使用自定义登录服务器但未提供认证密钥,将重定向到登录页面而不会预先填充密钥。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:215
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
msgid "Invalid Date"
msgstr "无效日期"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
msgid "Invalid response from server."
msgstr "服务器响应无效。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:646
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:686
msgid ""
"It creates the tailscale interface, adds it to a firewall zone, and "
"sets up forwarding between LAN and Tailscale, plus Tailscale to WAN."
@@ -359,241 +359,241 @@ msgstr ""
"它会创建 tailscale 接口,将其加入防火墙区域,并设置 LAN 与 Tailscale 之间的转发,以及 Tailscale 到 "
"WAN 的转发。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:218
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:278
msgid "Just now"
msgstr "刚才"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:330
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:390
msgid "LOGGED OUT"
msgstr "已登出"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:455
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:515
msgid "Last Seen"
msgstr "上次在线"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:736
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:776
msgid "Leave blank for default Tailscale control plane."
msgstr "留空以使用默认的 Tailscale 控制平面。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:853
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:893
msgid "Loading logs"
msgstr "正在加载日志"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:852
msgid "Logging out..."
msgstr "正在登出..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:728
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:768
msgid "Login"
msgstr "登录"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:749
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:815
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:823
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:855
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:863
msgid "Logout"
msgstr "登出"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
msgid "Logout failed: %s"
msgstr "登出失败: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:836
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:876
msgid "Logs"
msgstr "日志"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "MagicDNS: Tailscale overrides resolv.conf."
msgstr "MagicDNS:Tailscale 会覆写 resolv.conf。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:648
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:688
msgid ""
"Masquerading and MSS Clamping (MTU fix) are enabled to keep "
"connections stable."
msgstr "会启用伪装和 MSS Clamping (MTU 修复),以保持连接稳定。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:212
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
msgid "N/A"
msgstr "不可用"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:341
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:401
msgid "NOT RUNNING"
msgstr "未运行"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:439
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:499
msgid "No matching peer devices found."
msgstr "未找到匹配的节点设备。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:460
msgid "No peer devices found."
msgstr "未找到节点设备。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:368
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:428
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:880
msgid "No tailscale-related logs found."
msgstr "没有找到Tailscale相关日志"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:613
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:653
msgid "None"
msgstr "无"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:213
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:273
msgid "Now"
msgstr "现在"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:451
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:511
msgid "OS"
msgstr "操作系统"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
msgid "Offline"
msgstr "离线"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
msgid "Online"
msgstr "在线"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "OpenWrt Forward"
msgstr "OpenWrt 转发"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "OpenWrt Forward: MagicDNS via dnsmasq forwarding.(Only support ts.net)"
msgstr "OpenWrt 转发:通过dnsmasq转发MagicDNS(仅支持 ts.net域名)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:39
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
msgid "Operation"
msgstr "操作"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:735
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:775
msgid ""
"Optional: Specify a custom control server URL (e.g., a Headscale "
"instance, %s)."
msgstr "可选:指定一个自定义控制服务器 URL (例如,一个 Headscale 实例, %s)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:743
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:783
msgid ""
"Optional: Specify an authentication key for the custom control "
"server. Leave blank if not required."
msgstr "可选:为自定义控制服务器指定一个认证密钥。如果不需要,请留空。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:604
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:644
msgid "Peer Relay Port"
msgstr "节点中继端口"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:392
msgid "Please use the login button in the settings below to authenticate."
msgstr "请使用下方设置中的登录按钮进行认证。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:772
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:852
msgid "Please wait."
msgstr "请稍候。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:349
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:409
msgid "RUNNING"
msgstr "正在运行"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:453
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:513
msgid "RX"
msgstr "接收"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:845
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:885
msgid "Refresh"
msgstr "刷新"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:177
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:237
msgid "Reloading firewall..."
msgstr "正在重新加载防火墙..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:772
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
msgid "Requesting Login URL..."
msgstr "正在请求登录 URL..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:769
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:809
msgid "Requesting Tailscale login URL... Please wait."
msgstr "正在请求 Tailscale 登录 URL... 请稍候。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:612
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:652
msgid ""
"Select an exit node from the list. If enabled, Allow LAN Access is "
"enabled implicitly."
msgstr "从列表中选择出口节点。启用后会同时开启允许局域网访问。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:54
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:77
msgid ""
"Select the firewall backend for Tailscale to use. Requires service "
"restart to take effect."
msgstr "选择 Tailscale 使用的防火墙后端。需要重启服务才能生效。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:320
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:328
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:340
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:349
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:380
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:388
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:409
msgid "Service Status"
msgstr "服务状态"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:93
msgid ""
"Set a custom MTU for the Tailscale daemon. Leave blank to use the "
"default value."
msgstr "为 Tailscale 守护进程设置自定义 MTU。留空则使用默认值。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:60
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:83
msgid "Shields Up"
msgstr "屏蔽入站连接"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:448
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:508
msgid "Status"
msgstr "状态"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:817
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:857
msgid "Successfully logged out."
msgstr "登出成功。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:321
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:381
msgid "TAILSCALE NOT FOUND"
msgstr "未找到 TAILSCALE 主程序"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "TUN Mode"
msgstr "TUN 模式"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:454
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:514
msgid "TX"
msgstr "发送"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:354
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:414
msgid "Tailnet Name"
msgstr "Tailnet 名称"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:562
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:622
#: luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:1
msgid "Tailscale"
msgstr "Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:297
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:357
msgid "Tailscale Health Check: %s"
msgstr "Tailscale 健康检查: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:450
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:510
msgid "Tailscale IP"
msgstr "Tailscale IP"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:352
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:412
msgid "Tailscale IPv4"
msgstr "Tailscale IPv4"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:353
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:413
msgid "Tailscale IPv6"
msgstr "Tailscale IPv6"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:768
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:808
msgid "Tailscale Login"
msgstr "Tailscale 登录"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:562
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:622
msgid ""
"Tailscale is a mesh VPN solution that makes it easy to connect your "
"devices securely. This configuration page allows you to manage "
@@ -602,80 +602,80 @@ msgstr ""
"Tailscale 是一个网状 VPN 解决方案,可以轻松地安全连接您的设备。此配置页面允许您在 OpenWrt 设备上管理 "
"Tailscale 设置。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:389
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:449
msgid "Tailscale status error"
msgstr "Tailscale 状态异常"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:647
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:687
msgid ""
"The Tailscale to WAN forwarding is what lets clients send their "
"internet traffic through this device as an Exit Node."
msgstr "正是 Tailscale 到 WAN 的转发,让客户端可以把上网流量经由此设备作为出口节点发出。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:770
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:810
msgid "This can take up to 30 seconds."
msgstr "此过程最多可能需要 30 秒。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:800
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840
msgid ""
"This will disconnect this device from your Tailnet and require you to "
"re-authenticate."
msgstr "这将使此设备从您的 Tailnet 断开连接,并需要您重新进行身份验证。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:143
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:194
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:203
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:254
msgid "Timed out waiting for the firewall reload"
msgstr "等待防火墙重新加载超时"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:605
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:645
msgid ""
"UDP port for the Peer Relay service. Open this port on your router "
"firewall/NAT."
msgstr "节点中继服务的 UDP 端口。需要在路由器的防火墙/NAT 上开放该端口。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:245
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:859
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:305
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:899
msgid "Unknown error"
msgstr "未知错误"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:350
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:410
msgid "Version"
msgstr "版本"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:60
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:83
msgid ""
"When enabled, blocks all inbound connections from the Tailscale "
"network."
msgstr "启用后,将阻止来自 Tailscale 网络的所有入站连接。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:57
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:80
msgid "When using the exit node, access to the local LAN is allowed."
msgstr "使用出口节点时,允许访问本地局域网。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:660
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:700
msgid ""
"You have unapplied changes. Save & Apply them first so the firewall "
"matches the form."
msgstr "您有未应用的更改。请先保存并应用,让防火墙配置与表单保持一致。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:696
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:736
msgid ""
"[Important] Log in to the Tailscale admin console and manually enable "
"\"Subnet Routes\" for this device."
msgstr "【重要】登录 Tailscale 管理控制台,手动为此设备启用“子网路由”。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:719
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:759
msgid ""
"[Important] Step 3 cannot be done here: it needs your Tailscale "
"account."
msgstr "【重要】第 3 步无法在此完成:需要您的 Tailscale 账户。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:221
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:281
msgid "ago"
msgstr "前"
@@ -1,79 +1,79 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:47
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
msgid "%s failed"
msgstr "%s 失敗"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:71
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:94
msgid "(Experimental) Reduce Memory Usage"
msgstr "(實驗性) 減少記憶體使用"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:711
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:751
msgid "1. Enable \"Advertise Exit Node\"."
msgstr "1. 啟用「宣告出口節點」。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:693
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:733
msgid "1. Select \"Accept Routes\" (to access remote devices)."
msgstr "1. 勾選「接受路由」(以存取遠端設備)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:712
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:752
msgid ""
"2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic "
"to WAN)."
msgstr "2. 點選「自動設定防火牆」(將 Tailscale 流量轉送到 WAN)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:694
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:734
msgid ""
"2. In \"Advertise Routes\", select your local subnet (to allow remote "
"devices to access this LAN)."
msgstr "2. 在「宣告路由」選擇本裝置的區域網段 (讓遠端能存取這個區網)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:695
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:735
msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)."
msgstr "3. 點選「自動設定防火牆」(允許流量轉送)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:713
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:753
msgid ""
"3. In the Tailscale admin console, edit this device under the route "
"settings and approve it as an Exit Node."
msgstr "3. 在 Tailscale 管理控制台的路由設定中編輯此裝置,並核准為出口節點。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:718
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:758
msgid "4. On the client, set this device as its exit node."
msgstr "4. 在用戶端上,將此裝置設為出口節點。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:55
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:78
msgid "Accept Routes"
msgstr "接受路由"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:725
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:765
msgid "Account Settings"
msgstr "帳號設定"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:56
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:79
msgid "Advertise Exit Node"
msgstr "宣告出口節點"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:636
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
msgid "Advertise Routes"
msgstr "宣告路由"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:636
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
msgid ""
"Advertise subnet routes behind this device. Select from the detected "
"subnets below or enter custom routes (comma-separated)."
msgstr "宣告此裝置後方的子網路路由。從下方偵測到的子網路中選擇,或輸入自訂路由 (以逗號分隔)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:57
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:80
msgid "Allow LAN Access"
msgstr "允許 LAN 存取"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:55
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:78
msgid "Allow accepting routes announced by other nodes."
msgstr "允許接受由其他節點宣告的路由。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:61
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:84
msgid "Allow connecting to this device through the SSH function of Tailscale."
msgstr "允許透過 Tailscale 的 SSH 功能連線到此裝置。"
@@ -81,277 +81,277 @@ msgstr "允許透過 Tailscale 的 SSH 功能連線到此裝置。"
msgid "Allow user access to tailscale"
msgstr "允許使用者存取 Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:170
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:230
msgid "Another firewall reload is already running"
msgstr "另一個防火牆重新載入作業正在執行中"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:799
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:839
msgid "Are you sure you want to log out?"
msgstr "您確定要登出嗎?"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:644
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:684
msgid "Auto Configure Firewall"
msgstr "自動設定防火牆"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:806
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:846
msgid "Cancel"
msgstr "取消"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:750
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:790
msgid "Click to Log out account on this device."
msgstr "點選以登出此裝置上的帳號。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:729
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:769
msgid "Click to get a login URL for this device."
msgstr "點選獲取此裝置的登入 URL。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:291
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:383
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:591
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:850
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:443
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:631
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:890
msgid "Collecting data ..."
msgstr "正在收集資料..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:680
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:720
msgid ""
"Configuration committed, reloading network and firewall. This can "
"take a moment."
msgstr "設定已提交,正在重新載入網路與防火牆。這可能需要一點時間。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:673
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:713
msgid "Configuring firewall"
msgstr "正在設定防火牆"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:826
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:866
msgid "Confirm Logout"
msgstr "確認登出"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:452
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:512
msgid "Connection Info"
msgstr "連線資訊"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "Controls how Tailscale DNS is handled."
msgstr "控制 Tailscale DNS 的處理方式。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:762
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:802
msgid ""
"Could not open a new tab. Please check if your browser or an "
"extension blocked the pop-up."
msgstr "無法開啟新分頁。請檢查您的瀏覽器或擴充套件程式是否阻止了彈出式視窗。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:734
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:774
msgid "Custom Login Server"
msgstr "自訂登入伺服器"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:742
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:782
msgid "Custom Login Server Auth Key"
msgstr "自訂登入伺服器認證金鑰"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "DNS Mode"
msgstr "DNS 模式"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:93
msgid "Daemon MTU"
msgstr "常駐程式 MTU"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:865
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:905
msgid "Daemon Settings"
msgstr "常駐程式設定"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:56
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:79
msgid "Declare this device as an Exit Node."
msgstr "將此裝置宣告為出口節點。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:869
msgid "Devices List"
msgstr "裝置清單"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:63
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:86
msgid "Disable Firewall Configuration"
msgstr "停用防火牆設定"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:59
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:82
msgid "Disable SNAT"
msgstr "停用 SNAT"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:59
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:82
msgid ""
"Disable Source NAT (SNAT) for traffic to advertised routes. Most "
"users should leave this unchecked."
msgstr "為宣告路由的流量停用來源位址轉換 (SNAT)。大多數使用者不應勾選此項。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:63
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:86
msgid "Disable Tailscale netfilter auto-configuration (--netfilter-mode=off)."
msgstr "停用 Tailscale netfilter 自動設定 (--netfilter-mode=off)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "Disabled"
msgstr "已停用"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "Disabled: system DNS only."
msgstr "已停用: 僅使用系統 DNS。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:751
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:791
msgid "Disconnect from Tailscale and expire current node key."
msgstr "中斷 Tailscale 連線並使目前節點金鑰過期。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:41
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
msgid "Empty reply from server"
msgstr "伺服器回應為空"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:87
msgid "Enable Peer Relay"
msgstr "啟用對等中繼"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:61
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:84
msgid "Enable Tailscale SSH"
msgstr "啟用 Tailscale SSH"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:53
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:76
msgid "Enable Tailscale Service"
msgstr "啟用 Tailscale 服務"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:58
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:81
msgid "Enable Web Interface"
msgstr "啟用 Web 介面"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:53
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:76
msgid ""
"Enable or disable the Tailscale service. When disabled, the service "
"will be stopped and the process will be killed."
msgstr "啟用或停用 Tailscale 服務。停用後,該服務將停止,處理程序將被終止。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:64
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:87
msgid ""
"Enable this device as a Peer Relay server. Requires a public IP and "
"an UDP port open on the router."
msgstr "將此設備做為對等中繼伺服器。需要公開 IP 位址,且路由器上需要開啟一個 UDP 連接埠。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "Enabled"
msgstr "已啟用"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:71
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:94
msgid ""
"Enabling this option can reduce memory usage, but it may sacrifice "
"some performance (set GOGC=10)."
msgstr "啟用此選項可以減少記憶體使用,但可能會犧牲一些效能 (設定 GOGC=10)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:787
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:827
msgid "Error"
msgstr "錯誤"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
msgid "Error caching DERP region map: %s"
msgstr "快取 DERP 區域對照表時出錯: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
msgid "Error fetching DERP region map: %s"
msgstr "獲取 DERP 區域對照表時出錯: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:245
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:305
msgid "Error reading cached DERP region map: %s"
msgstr "讀取快取的 DERP 區域對照表時出錯: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:645
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:685
msgid ""
"Essential configuration for Subnet Routing (Site-to-Site) and Exit "
"Node features."
msgstr "子網路由(站對站)和出口節點功能的基本設定"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:612
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:652
msgid "Exit Node"
msgstr "出口節點"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:58
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:81
msgid ""
"Expose a web interface on port 5252 for managing this node over "
"Tailscale."
msgstr "在埠 5252 上暴露一個 Web 介面,用於透過 Tailscale 管理此節點。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
msgid "Failed to configure firewall: %s"
msgstr "設定防火牆失敗: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:788
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:828
msgid "Failed to get login URL. You may close this tab."
msgstr "獲取登入 URL 失敗。您可以關閉此分頁。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
msgid "Failed to get login URL: %s"
msgstr "獲取登入 URL 失敗: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:859
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:899
msgid "Failed to load logs: %s"
msgstr "載入日誌失敗: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:487
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:547
msgid "Filter peers by name, IP, or OS..."
msgstr "依名稱、IP 或作業系統篩選..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:504
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:564
msgid "Filter:"
msgstr "篩選:"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:54
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:77
msgid "Firewall Mode"
msgstr "防火牆模式"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:676
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:716
msgid "Firewall configuration already applied."
msgstr "防火牆設定已套用。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:159
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:219
msgid "Firewall configuration applied."
msgstr "已套用防火牆設定"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:165
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:225
msgid "Firewall reload failed"
msgstr "防火牆重新載入失敗"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:600
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:640
msgid "General Settings"
msgstr "一般設定"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:449
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:509
msgid "Hostname"
msgstr "主機名"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:706
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:746
msgid "How to enable Exit Node?"
msgstr "如何啟用出口節點?"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:688
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:728
msgid "How to enable Site-to-Site?"
msgstr "如何啟用站對站通訊?"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:730
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:770
msgid ""
"If the timeout is displayed, you can refresh the page and click Login "
"again."
msgstr "如果顯示逾時,您可以重新整理頁面並再次點選登入。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:744
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:784
msgid ""
"If you are using custom login server but not providing an Auth Key, "
"will redirect to the login page without pre-filling the key."
msgstr "如果您使用自訂登入伺服器但未提供認證金鑰,將重新導向至登入頁面,且不會預先填入金鑰。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:215
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
msgid "Invalid Date"
msgstr "無效日期"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:829
msgid "Invalid response from server."
msgstr "伺服器回應無效。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:646
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:686
msgid ""
"It creates the tailscale interface, adds it to a firewall zone, and "
"sets up forwarding between LAN and Tailscale, plus Tailscale to WAN."
@@ -359,241 +359,241 @@ msgstr ""
"它會建立 tailscale 介面、加入防火牆區域,並設定 LAN 與 Tailscale 之間的轉送,以及 Tailscale 到 "
"WAN 的轉送。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:218
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:278
msgid "Just now"
msgstr "剛才"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:330
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:390
msgid "LOGGED OUT"
msgstr "已登出"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:455
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:515
msgid "Last Seen"
msgstr "上次連線"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:736
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:776
msgid "Leave blank for default Tailscale control plane."
msgstr "留白則使用預設的 Tailscale 控制台。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:853
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:893
msgid "Loading logs"
msgstr "正在載入日誌"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:852
msgid "Logging out..."
msgstr "正在登出..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:728
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:768
msgid "Login"
msgstr "登入"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:749
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:815
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:823
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:855
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:863
msgid "Logout"
msgstr "登出"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
msgid "Logout failed: %s"
msgstr "登出失敗: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:836
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:876
msgid "Logs"
msgstr "日誌"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "MagicDNS: Tailscale overrides resolv.conf."
msgstr "MagicDNS:Tailscale 將接管 resolv.conf。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:648
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:688
msgid ""
"Masquerading and MSS Clamping (MTU fix) are enabled to keep "
"connections stable."
msgstr "同時啟用偽裝與 MSS Clamping (MTU 修復),以維持連線穩定。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:212
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
msgid "N/A"
msgstr "N/A"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:341
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:401
msgid "NOT RUNNING"
msgstr "未執行"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:439
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:499
msgid "No matching peer devices found."
msgstr "找不到符合的對等裝置。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:460
msgid "No peer devices found."
msgstr "未找到對等裝置。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:368
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:428
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:880
msgid "No tailscale-related logs found."
msgstr "未找到與 tailscale 相關的日誌。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:613
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:653
msgid "None"
msgstr "無"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:213
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:273
msgid "Now"
msgstr "現在"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:451
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:511
msgid "OS"
msgstr "作業系統"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
msgid "Offline"
msgstr "離線"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:424
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:484
msgid "Online"
msgstr "上線"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "OpenWrt Forward"
msgstr "OpenWrt 轉送"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:85
msgid "OpenWrt Forward: MagicDNS via dnsmasq forwarding.(Only support ts.net)"
msgstr "OpenWrt 轉送:僅經由 dnsmasq 轉送至 MagicDNS。(僅支援tailxxxxxx.ts.net)"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:39
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:62
msgid "Operation"
msgstr "操作"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:735
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:775
msgid ""
"Optional: Specify a custom control server URL (e.g., a Headscale "
"instance, %s)."
msgstr "可選:指定自訂控制伺服器 URL(例如,Headscale 實例,「%s」)。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:743
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:783
msgid ""
"Optional: Specify an authentication key for the custom control "
"server. Leave blank if not required."
msgstr "可選:為自訂控制伺服器指定一個認證金鑰。如果不需要,請留白。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:604
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:644
msgid "Peer Relay Port"
msgstr "對等中繼連接埠"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:392
msgid "Please use the login button in the settings below to authenticate."
msgstr "請使用下方設定中的登入按鈕進行認證。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:772
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:852
msgid "Please wait."
msgstr "請稍候。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:349
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:409
msgid "RUNNING"
msgstr "正在執行"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:453
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:513
msgid "RX"
msgstr "接收"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:845
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:885
msgid "Refresh"
msgstr "重新整理"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:177
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:237
msgid "Reloading firewall..."
msgstr "正在重新載入防火牆..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:772
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
msgid "Requesting Login URL..."
msgstr "正在請求登入 URL..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:769
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:809
msgid "Requesting Tailscale login URL... Please wait."
msgstr "正在請求 Tailscale 登入 URL... 請稍候。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:612
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:652
msgid ""
"Select an exit node from the list. If enabled, Allow LAN Access is "
"enabled implicitly."
msgstr "從清單中選擇一個出口節點。啟用後會一併啟用「允許區網存取」。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:54
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:77
msgid ""
"Select the firewall backend for Tailscale to use. Requires service "
"restart to take effect."
msgstr "選擇 Tailscale 使用的防火牆後端。需要重新啟動服務才能生效。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:320
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:328
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:340
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:349
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:380
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:388
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:409
msgid "Service Status"
msgstr "服務狀態"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:70
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:93
msgid ""
"Set a custom MTU for the Tailscale daemon. Leave blank to use the "
"default value."
msgstr "為 Tailscale 常駐程式設定自訂 MTU。留白則使用預設值。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:60
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:83
msgid "Shields Up"
msgstr "封鎖入站連線"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:448
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:508
msgid "Status"
msgstr "狀態"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:817
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:857
msgid "Successfully logged out."
msgstr "登出成功。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:321
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:381
msgid "TAILSCALE NOT FOUND"
msgstr "找不到 TAILSCALE"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:411
msgid "TUN Mode"
msgstr "TUN 模式"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:454
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:514
msgid "TX"
msgstr "傳送"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:354
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:414
msgid "Tailnet Name"
msgstr "Tailnet 名稱"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:562
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:622
#: luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:1
msgid "Tailscale"
msgstr "Tailscale"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:297
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:357
msgid "Tailscale Health Check: %s"
msgstr "Tailscale 健康檢查: %s"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:450
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:510
msgid "Tailscale IP"
msgstr "Tailscale IP"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:352
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:412
msgid "Tailscale IPv4"
msgstr "Tailscale IPv4"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:353
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:413
msgid "Tailscale IPv6"
msgstr "Tailscale IPv6"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:768
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:808
msgid "Tailscale Login"
msgstr "Tailscale 登入"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:562
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:622
msgid ""
"Tailscale is a mesh VPN solution that makes it easy to connect your "
"devices securely. This configuration page allows you to manage "
@@ -602,80 +602,80 @@ msgstr ""
"Tailscale 是一個網狀 VPN 解決方案,可以輕鬆地安全連線您的裝置。此設定頁面允許您在 OpenWrt 裝置上管理 "
"Tailscale 設定。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:389
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:449
msgid "Tailscale status error"
msgstr "Tailscale 狀態錯誤"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:647
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:687
msgid ""
"The Tailscale to WAN forwarding is what lets clients send their "
"internet traffic through this device as an Exit Node."
msgstr "Tailscale 到 WAN 的轉送,讓用戶端能透過此裝置以出口節點傳送網際網路流量。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:770
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:810
msgid "This can take up to 30 seconds."
msgstr "此過程最多可能需要 30 秒。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:800
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840
msgid ""
"This will disconnect this device from your Tailnet and require you to "
"re-authenticate."
msgstr "這將使此裝置從您的 Tailnet 中斷連線,並需要您重新進行身份驗證。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:143
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:194
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:203
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:254
msgid "Timed out waiting for the firewall reload"
msgstr "等待防火牆重新載入逾時"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:605
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:645
msgid ""
"UDP port for the Peer Relay service. Open this port on your router "
"firewall/NAT."
msgstr "用於對等中繼服務的 UDP 連接埠。請在路由器的防火牆/NAT 上開放此連接埠。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:245
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:859
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:305
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:899
msgid "Unknown error"
msgstr "未知錯誤"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:350
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:410
msgid "Version"
msgstr "版本"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:60
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:83
msgid ""
"When enabled, blocks all inbound connections from the Tailscale "
"network."
msgstr "啟用後,將阻止來自 Tailscale 網路的所有入站連線。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:57
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:80
msgid "When using the exit node, access to the local LAN is allowed."
msgstr "使用出口節點時,允許存取區域網路。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:660
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:700
msgid ""
"You have unapplied changes. Save & Apply them first so the firewall "
"matches the form."
msgstr "您有尚未套用的變更。請先儲存並套用,防火牆才會與表單內容一致。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:696
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:736
msgid ""
"[Important] Log in to the Tailscale admin console and manually enable "
"\"Subnet Routes\" for this device."
msgstr "【重要】 登入 Tailscale 管理控制台,在裝置設定中手動授權子網路由。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:719
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:759
msgid ""
"[Important] Step 3 cannot be done here: it needs your Tailscale "
"account."
msgstr "[重要] 步驟 3 無法在此完成:需要您的 Tailscale 帳號。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:221
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:281
msgid "ago"
msgstr "前"
@@ -254,10 +254,18 @@ apply_settings() {
&& set -- "$@" --webclient=true \
|| set -- "$@" --webclient=false
# --snat-subnet-routes (inverse of nosnat)
[ "$nosnat" = "1" ] \
&& set -- "$@" --snat-subnet-routes=false \
|| set -- "$@" --snat-subnet-routes=true
# Everything below is handed to 'tailscale set' in one call, and 'set'
# aborts on an unknown flag. Gate the newer options on the first release
# that accepts them, so an older CLI still applies the rest.
local ts_ver
ts_ver=$("$ts_bin" version 2>/dev/null | head -n1)
# --snat-subnet-routes (requires tailscale >= 1.66.1)
if [ -n "$ts_ver" ] && version_gte "$ts_ver" "1.66.1"; then
[ "$nosnat" = "1" ] \
&& set -- "$@" --snat-subnet-routes=false \
|| set -- "$@" --snat-subnet-routes=true
fi
# --advertise-routes (comma-separated, empty clears routes)
set -- "$@" "--advertise-routes=$routes"
@@ -268,13 +276,11 @@ apply_settings() {
# when an exit node is configured, always allow LAN access
[ -n "$exit_node" ] && set -- "$@" --exit-node-allow-lan-access=true
# --hostname (only set if non-empty)
[ -n "$hostname" ] && set -- "$@" "--hostname=$hostname"
# --hostname (empty resets it to the OS hostname)
set -- "$@" "--hostname=$hostname"
# --relay-server-port (requires tailscale >= 1.90.5)
local ts_ver
ts_ver=$("$ts_bin" version 2>/dev/null | head -n1)
if [ -n "$ts_ver" ] && version_gte "$ts_ver" "1.90.5"; then
# --relay-server-port (requires tailscale >= 1.84.0)
if [ -n "$ts_ver" ] && version_gte "$ts_ver" "1.84.0"; then
if [ "$enable_relay" = "1" ]; then
set -- "$@" "--relay-server-port=${relay_server_port:-40000}"
else
@@ -282,9 +288,16 @@ apply_settings() {
fi
fi
# --netfilter-mode (only when disable_fw_config is enabled and tailscale init doesn't already handle it)
if [ "$disable_fw_config" = "1" ]; then
set -- "$@" --netfilter-mode=off
# --netfilter-mode (off when disable_fw_config is enabled, back to on
# otherwise; requires tailscale >= 1.66.1)
if [ -n "$ts_ver" ] && version_gte "$ts_ver" "1.66.1"; then
if [ "$disable_fw_config" = "1" ]; then
set -- "$@" --netfilter-mode=off
else
set -- "$@" --netfilter-mode=on
fi
elif [ "$disable_fw_config" = "1" ]; then
logger -t "$NAME" "tailscale ${ts_ver:-before 1.66.1} has no --netfilter-mode in 'set', ignoring disable_fw_config"
fi
logger -t "$NAME" "Applying settings"
@@ -319,8 +332,16 @@ sync_service_enabled() {
# the baseline instead of treating it as a transition: starting
# a daemon here would run start_service, which arms another UCI
# rollback window right after the one this apply is inside.
echo "$service_enabled" > "$ENABLED_FILE"
prev="$service_enabled"
#
# An armed disable request is the exception: the user just asked
# for the stop, so the baseline has to be "was running", not "was
# stopped", or the request would be dropped without stopping.
if [ -f "$DISABLE_REQUEST_FILE" ]; then
prev=1
else
echo "$service_enabled" > "$ENABLED_FILE"
prev="$service_enabled"
fi
;;
esac
@@ -36,25 +36,60 @@ write_state() {
# Only one worker at a time: a second click while a reload is running would
# queue another network reload on top of an unfinished one. mkdir is atomic and
# is the only portable primitive available here; a test-then-write pair lets
# two workers through at the same moment. Stale locks are recognised by age so
# a recycled pid or a killed worker cannot block forever.
# two workers through at the same moment. Stale locks are recognised by age and
# by a dead pid so a killed worker cannot block forever, but a lock that is
# merely young is never taken over.
LOCK_DIR="$LOCK_FILE.d"
lock_age() {
local ts now
ts=$(cat "$LOCK_DIR/ts" 2>/dev/null)
case "$ts" in ''|*[!0-9]*) echo 999999; return ;; esac
# A missing or unreadable timestamp means mkdir just won the race and the
# holder has not written pid/ts yet. Reporting that window as ancient let a
# late worker rip the lock away mid start up, so two reloads ran at once:
# the very thing this lock exists to prevent. It is a fresh lock instead.
#
# The directory mtime covers the other side of the same window: a worker
# killed between mkdir and the ts write would otherwise leave an ageless
# lock that nobody ever takes over.
case "$ts" in
''|*[!0-9]*)
ts=$(date -r "$LOCK_DIR" +%s 2>/dev/null)
case "$ts" in ''|*[!0-9]*) echo 0; return ;; esac
;;
esac
now=$(date +%s)
echo $((now - ts))
}
# kill -0 is the portable liveness probe available in busybox ash. No readable
# pid means the holder never got to write one, which is what a lock left behind
# by a crash looks like, so it counts as gone.
lock_holder_alive() {
local pid
pid=$(cat "$LOCK_DIR/pid" 2>/dev/null)
case "$pid" in ''|*[!0-9]*) return 1 ;; esac
kill -0 "$pid" 2>/dev/null
}
# Returns 0 when this process owns a freshly created lock directory. Deletes are
# not in place: rm -rf then mkdir leaves a window where two workers both think
# they won. Renaming the old directory is a single step that only one worker can
# win; the loser reports busy. mkdir can still lose to a third worker.
take_over_stale_lock() {
local aside
[ "$(lock_age)" -gt 300 ] || return 1
lock_holder_alive && return 1
aside="$LOCK_DIR.stale.$$"
mv "$LOCK_DIR" "$aside" 2>/dev/null || return 1
rm -rf "$aside"
mkdir "$LOCK_DIR" 2>/dev/null
}
if ! mkdir "$LOCK_DIR" 2>/dev/null; then
if [ "$(lock_age)" -gt 300 ]; then
# the holder is gone; take the lock over
rm -rf "$LOCK_DIR"
mkdir "$LOCK_DIR" 2>/dev/null || exit 0
else
# someone else is already reloading: say so instead of leaving the
# status file at "queued" and letting the UI time out
if ! take_over_stale_lock; then
# someone else is already reloading, or another worker won the takeover:
# say so instead of leaving the status file at "queued" and letting the
# UI time out
write_state busy locked "Another firewall reload is already running"
exit 0
fi
@@ -2,7 +2,7 @@
'use strict';
import { access, popen, readfile, writefile, unlink } from 'fs';
import { access, popen, readfile, writefile, rename, unlink } from 'fs';
import { cursor } from 'uci';
const uci = cursor();
@@ -361,13 +361,22 @@ methods.setup_firewall = {
// gets a chance to overwrite it. Without both, a poll arriving
// while the worker is still starting would read the previous
// run's "done" and report success for work that has not run.
run_id = time();
let st = writefile('/var/run/tailscale-fwsetup.status.tmp',
'queued\nstart\n\n' + run_id + '\n');
if (st == null || rename('/var/run/tailscale-fwsetup.status.tmp', '/var/run/tailscale-fwsetup.status') == null) {
// clock() returns [seconds, nanoseconds], not milliseconds, so
// fold it explicitly. Two clicks within the same second still
// get distinct ids; the temp file name carries the id as well,
// so concurrent writers cannot clobber each other's queued
// state through a shared fixed path.
let now = clock();
run_id = now[0] * 1000 + int(now[1] / 1000000);
let tmp = '/var/run/tailscale-fwsetup.status.tmp.' + run_id;
let st = writefile(tmp, 'queued\nstart\n\n' + run_id + '\n');
if (st == null || rename(tmp, '/var/run/tailscale-fwsetup.status') == null) {
// Without a writable status file the poll can never see a
// result, so say so instead of letting the UI wait it out.
return { error: 'Cannot write the firewall status file in /var/run. Configuration was not changed.' };
// Drop the temp file we may have created, so a failed run
// leaves no stray state behind for the next poll.
unlink(tmp);
return { error: 'Cannot write the firewall status file in /var/run. The configuration was committed but not applied.' };
}
// The background shell exits immediately, so its status only
@@ -467,7 +476,12 @@ methods.get_logs = {
args: { lines: 200 },
call: function(request) {
let lines = int(request?.args?.lines) || 200;
let cmd = 'logread -l ' + lines + ' 2>/dev/null | grep -i -E "tailscale" || true';
if (lines < 1) lines = 200;
if (lines > 1000) lines = 1000;
// Filter first, then take the tail: logread -l would only hand the last
// N lines of every daemon to grep, so a busy box hides the tailscale
// records entirely and the log page claims there is nothing to show.
let cmd = 'logread 2>/dev/null | grep -i -E "tailscale" | tail -n ' + lines;
let result = exec(cmd);
if (result.code == 0) {
return { success: true, logs: result.stdout };
+1 -1
View File
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=maxminddb-dump-country
PKG_VERSION:=2
PKG_RELEASE:=2
PKG_RELEASE:=3
PKG_MAINTAINER:=Konstantine Shevlakov <shevlakov@132lan.ru>
PKG_LICENSE:=LICENSE
@@ -1,7 +1,7 @@
From 8ea81c36bee0d4eefc023561a423cbfaac7acc41 Mon Sep 17 00:00:00 2001
From 2090af86fc5769d865bacb9446af046500f48914 Mon Sep 17 00:00:00 2001
From: koshev-msk <kosnt.shell@gmail.com>
Date: Thu, 29 Oct 2026 23:04:25 +0000
Subject: [PATCH] geoip: add DB-IP CSV input support
Date: Fri, 30 Oct 2026 10:55:20 +0000
Subject: [PATCH 1/2] geoip: add DB-IP CSV input support
Add a -d option to read DB-IP Country Lite CSV files and generate the
same per-country .iv4/.iv6 binary range files as the existing MMDB
@@ -16,11 +16,11 @@ unchanged.
Signed-off-by: OpenWrt Developer <builder@example.invalid>
---
xt_geoip_build_maxmind.c | 292 ++++++++++++++++++++++++++++++++++-----
1 file changed, 260 insertions(+), 32 deletions(-)
xt_geoip_build_maxmind.c | 295 ++++++++++++++++++++++++++++++++++-----
1 file changed, 262 insertions(+), 33 deletions(-)
diff --git a/xt_geoip_build_maxmind.c b/xt_geoip_build_maxmind.c
index 55e86d0..95d2c92 100644
index 55e86d0..eeb6bae 100644
--- a/xt_geoip_build_maxmind.c
+++ b/xt_geoip_build_maxmind.c
@@ -3,6 +3,7 @@
@@ -245,7 +245,17 @@ index 55e86d0..95d2c92 100644
static int skip_n96 = 0;
void tree_walk(int rn,int l, uint8_t *path) {
@@ -372,9 +573,10 @@ int main(int argc, char **argv)
@@ -358,7 +559,8 @@ void tree_walk(int rn,int l, uint8_t *path) {
}
void usage(void) {
- printf("%s [-4] [-6] [-v] [-c] [-N ASNUM|string ][-A all|asnum[,asnum...]] [-o outputdir] file.mmdb\n",progname);
+ printf("%s [-4] [-6] [-v] [-c] [-d dbip.csv] [-N ASNUM|string ][-A all|asnum[,asnum...]] [-o outputdir] [file.mmdb]\n",progname);
+ printf("\t -d: read DB-IP Country Lite CSV and write binary GeoIP files\n");
printf("\t asnum: number | number-number\n");
exit(1);
}
@@ -372,9 +574,10 @@ int main(int argc, char **argv)
progname = strdup(argv[0]);
@@ -257,7 +267,7 @@ index 55e86d0..95d2c92 100644
case '4': opt_6 = 0; break;
case '6': opt_4 = 0; break;
case 'v': opt_v++; break;
@@ -394,17 +596,29 @@ int main(int argc, char **argv)
@@ -394,17 +597,29 @@ int main(int argc, char **argv)
filename = strdup(argv[optind]);
} else {
filename = opt_asn ? asn_name:country_name;
@@ -289,7 +299,7 @@ index 55e86d0..95d2c92 100644
if(opt_asn && (opt_xtgeo || opt_csv)) {
fprintf(stderr,"%s: cant use -A with -o or -c\n",progname);
exit(1);
@@ -426,43 +640,55 @@ int main(int argc, char **argv)
@@ -426,43 +641,55 @@ int main(int argc, char **argv)
output_dir[l+2] = '\0';
}
@@ -374,7 +384,7 @@ index 55e86d0..95d2c92 100644
}
c_ipv4 += CCN4[fd];
c_ipv6 += CCN6[fd];
@@ -482,6 +708,8 @@ int main(int argc, char **argv)
@@ -482,6 +709,8 @@ int main(int argc, char **argv)
if(CSV_IPv6_fd) fclose(CSV_IPv6_fd);
if(CSV_EN_fd) fclose(CSV_EN_fd);
@@ -1,11 +0,0 @@
--- a/xt_geoip_build_maxmind.c
+++ b/xt_geoip_build_maxmind.c
@@ -559,7 +559,7 @@
}
void usage(void) {
- printf("%s [-4] [-6] [-v] [-c] [-N ASNUM|string ][-A all|asnum[,asnum...]] [-o outputdir] file.mmdb\n",progname);
+ printf("%s [-4] [-6] [-v] [-c] [-N ASNUM|string ][-A all|asnum[,asnum...]] [-o outputdir] file.mmdb|-d file.dbip.csv\n",progname);
printf("\t asnum: number | number-number\n");
exit(1);
}
@@ -0,0 +1,167 @@
From d77c01d155793a19d28828bbb1d659ec19089b18 Mon Sep 17 00:00:00 2001
From: koshev-msk <kosnt.shell@gmail.com>
Date: Fri, 30 Oct 2026 10:55:20 +0000
Subject: [PATCH 2/2] geoip: accept ip/prefix,country lines in -d CSV input
Besides the DB-IP start_ip,end_ip,country format, allow two-field
lines in the form ip/prefix,country so that own lists can be written
in CIDR notation. Both IPv4 and IPv6 are supported; the range is
computed by clearing host bits for the start address and setting them
for the end address. Prefix length is validated against the address
family (0..32 / 0..128).
Signed-off-by: OpenWrt Developer <builder@example.invalid>
---
xt_geoip_build_maxmind.c | 90 ++++++++++++++++++++++++++++++----------
1 file changed, 67 insertions(+), 23 deletions(-)
diff --git a/xt_geoip_build_maxmind.c b/xt_geoip_build_maxmind.c
index eeb6bae..0c81d58 100644
--- a/xt_geoip_build_maxmind.c
+++ b/xt_geoip_build_maxmind.c
@@ -332,6 +332,8 @@ void p_dump(int l, uint8_t *path, MMDB_entry_s *e) {
/*
* DB-IP Country Lite CSV format:
* start_ip,end_ip,country
+ * or, for own lists:
+ * ip/prefix,country
*
* The fields may optionally be quoted. The CSV has no embedded commas.
*/
@@ -351,6 +353,21 @@ static char *csv_trim(char *field)
return field;
}
+/* Convert addr/plen to first and last address of the network. */
+static void cidr_range(uint8_t *start, uint8_t *end, unsigned alen,
+ unsigned plen)
+{
+ unsigned i, bits;
+ uint8_t mask;
+
+ for(i = 0; i < alen; i++) {
+ bits = plen > i * 8 ? plen - i * 8 : 0;
+ mask = bits >= 8 ? 0xff : (uint8_t)(0xff00 >> bits);
+ start[i] &= mask;
+ end[i] = start[i] | (uint8_t)~mask;
+ }
+}
+
static int dbip_write_range(int family, const uint8_t *start,
const uint8_t *end, const char *country, int cind)
{
@@ -411,8 +428,10 @@ static int dbip_csv_dump(const char *path)
}
while(fgets(line, sizeof(line), input)) {
- char *field[3], *p, *comma;
+ char *field[3], *p, *comma, *slash, *endp;
char *country;
+ unsigned long plen;
+ int nfields;
uint8_t start[16], end[16];
char start_text[INET6_ADDRSTRLEN];
char end_text[INET6_ADDRSTRLEN];
@@ -438,17 +457,22 @@ static int dbip_csv_dump(const char *path)
field[1] = comma + 1;
comma = strchr(field[1], ',');
- if(!comma)
- goto malformed;
- *comma = '\0';
- field[2] = comma + 1;
- if(strchr(field[2], ','))
- goto malformed;
+ if(comma) {
+ *comma = '\0';
+ field[2] = comma + 1;
+ if(strchr(field[2], ','))
+ goto malformed;
+ nfields = 3;
+ } else {
+ field[2] = NULL;
+ nfields = 2;
+ }
field[0] = csv_trim(field[0]);
field[1] = csv_trim(field[1]);
- field[2] = csv_trim(field[2]);
- country = field[2];
+ if(field[2])
+ field[2] = csv_trim(field[2]);
+ country = field[nfields - 1];
if(first_line) {
first_line = 0;
@@ -474,6 +498,14 @@ static int dbip_csv_dump(const char *path)
if(cind < 0)
continue;
+ slash = NULL;
+ if(nfields == 2) {
+ slash = strchr(field[0], '/');
+ if(!slash)
+ goto malformed;
+ *slash++ = '\0';
+ }
+
if(inet_pton(AF_INET, field[0], start) == 1)
family = AF_INET;
else if(inet_pton(AF_INET6, field[0], start) == 1)
@@ -485,19 +517,31 @@ static int dbip_csv_dump(const char *path)
break;
}
- if(inet_pton(family, field[1], end) != 1) {
- fprintf(stderr, "Invalid or mismatched end IP on DB-IP CSV line %lu\n",
- lineno);
- result = -1;
- break;
- }
- end_family = family;
- if(end_family != family ||
- memcmp(start, end, family == AF_INET ? 4 : 16) > 0) {
- fprintf(stderr, "Invalid IP range on DB-IP CSV line %lu\n",
- lineno);
- result = -1;
- break;
+ if(slash) {
+ plen = strtoul(slash, &endp, 10);
+ if(!isdigit((unsigned char)*slash) || *endp ||
+ plen > (family == AF_INET ? 32 : 128)) {
+ fprintf(stderr, "Invalid prefix length on DB-IP CSV line %lu\n",
+ lineno);
+ result = -1;
+ break;
+ }
+ cidr_range(start, end, family == AF_INET ? 4 : 16, plen);
+ } else {
+ if(inet_pton(family, field[1], end) != 1) {
+ fprintf(stderr, "Invalid or mismatched end IP on DB-IP CSV line %lu\n",
+ lineno);
+ result = -1;
+ break;
+ }
+ end_family = family;
+ if(end_family != family ||
+ memcmp(start, end, family == AF_INET ? 4 : 16) > 0) {
+ fprintf(stderr, "Invalid IP range on DB-IP CSV line %lu\n",
+ lineno);
+ result = -1;
+ break;
+ }
}
if(dbip_write_range(family, start, end, country, cind)) {
@@ -560,7 +604,7 @@ void tree_walk(int rn,int l, uint8_t *path) {
void usage(void) {
printf("%s [-4] [-6] [-v] [-c] [-d dbip.csv] [-N ASNUM|string ][-A all|asnum[,asnum...]] [-o outputdir] [file.mmdb]\n",progname);
- printf("\t -d: read DB-IP Country Lite CSV and write binary GeoIP files\n");
+ printf("\t -d: read CSV (start_ip,end_ip,CC or ip/prefix,CC) and write binary GeoIP files\n");
printf("\t asnum: number | number-number\n");
exit(1);
}
--
2.43.0
+2 -2
View File
@@ -5,8 +5,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=meow
PKG_VERSION:=0.27.0
PKG_RELEASE:=17
PKG_VERSION:=0.28.0
PKG_RELEASE:=18
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/meow-rs/meow-rs/tar.gz/v$(PKG_VERSION)?
+1 -1
View File
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=microsocks
PKG_VERSION:=1.0.5
PKG_RELEASE:=2
PKG_RELEASE:=3
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/rofl0r/microsocks/tar.gz/v$(PKG_VERSION)?
@@ -1,428 +0,0 @@
--- a/sockssrv.c
+++ b/sockssrv.c
@@ -33,8 +33,10 @@
#include <arpa/inet.h>
#include <errno.h>
#include <limits.h>
+#include <sys/time.h>
#include "server.h"
#include "sblist.h"
+#define MICROSOCKS_VERSION "1.0.5-forward"
/* timeout in microseconds on resource exhaustion to prevent excessive
cpu usage. */
@@ -71,6 +73,7 @@
static pthread_rwlock_t auth_ips_lock = PTHREAD_RWLOCK_INITIALIZER;
static const struct server* server;
static union sockaddr_union bind_addr = {.v4.sin_family = AF_UNSPEC};
+static sblist *fwd_rules;
enum socksstate {
SS_1_CONNECTED,
@@ -97,6 +100,17 @@
EC_ADDRESSTYPE_NOT_SUPPORTED = 8,
};
+struct fwd_rule {
+ char *match_name;
+ short match_port;
+ char *auth_buf; /* Username/Password request buffer (RFC-1929) */
+ size_t auth_len;
+ char *upstream_name;
+ short upstream_port;
+ char *req_buf; /* Client Connection Request buffer to send to upstream */
+ size_t req_len;
+};
+
struct thread {
pthread_t pt;
struct client client;
@@ -116,6 +130,109 @@
static void dolog(const char* fmt, ...) { }
#endif
+static int upstream_handshake(const struct fwd_rule* rule, unsigned char *client_buf, size_t client_buf_len,
+ int client_fd, int upstream_fd, unsigned short client_port) {
+ unsigned char sbuf[512];
+ ssize_t r;
+
+ if(rule->auth_buf) {
+ unsigned char handshake[4] = {5, 2, 0, 2};
+ if (write(upstream_fd, handshake, 4) != 4) {
+ close(upstream_fd);
+ return -1;
+ }
+ } else {
+ unsigned char handshake[3] = {5, 1, 0};
+ if (write(upstream_fd, handshake, 3) != 3) {
+ close(upstream_fd);
+ return -1;
+ }
+ }
+
+ if (read(upstream_fd, sbuf, 2) != 2 || sbuf[0] != 5) {
+ close(upstream_fd);
+ return -1;
+ }
+
+ if (sbuf[1] == 2) {
+ if (!rule->auth_buf) {
+ close(upstream_fd);
+ return -1;
+ }
+ if (write(upstream_fd, rule->auth_buf, rule->auth_len) != (ssize_t)rule->auth_len) {
+ close(upstream_fd);
+ return -1;
+ }
+ if (read(upstream_fd, sbuf, 2) != 2 || sbuf[0] != 1 || sbuf[1] != 0) {
+ close(upstream_fd);
+ return -1;
+ }
+ } else if (sbuf[1] != 0) {
+ close(upstream_fd);
+ return -1;
+ }
+
+ if (write(upstream_fd, client_buf, client_buf_len) != (ssize_t)client_buf_len) {
+ close(upstream_fd);
+ return -1;
+ }
+
+ size_t total = 0;
+ size_t need = 4;
+
+ while (total < need) {
+ r = read(upstream_fd, sbuf + total, need - total);
+ if (r <= 0) {
+ close(upstream_fd);
+ return -1;
+ }
+ total += r;
+ }
+
+ if (sbuf[1] != 0) {
+ close(upstream_fd);
+ return -sbuf[1];
+ }
+
+ size_t need_more = 0;
+ switch (sbuf[3]) {
+ case 1:
+ need_more = 4 + 2;
+ break;
+ case 4:
+ need_more = 16 + 2;
+ break;
+ case 3:
+ r = read(upstream_fd, sbuf + total, 1);
+ if (r != 1) {
+ close(upstream_fd);
+ return -1;
+ }
+ total += r;
+ need_more = sbuf[4] + 2;
+ break;
+ default:
+ close(upstream_fd);
+ return -EC_ADDRESSTYPE_NOT_SUPPORTED;
+ }
+
+ while (total < need + need_more) {
+ r = read(upstream_fd, sbuf + total, (need + need_more) - total);
+ if (r <= 0) {
+ close(upstream_fd);
+ return -1;
+ }
+ total += r;
+ }
+
+ if (write(client_fd, sbuf, total) != (ssize_t)total) {
+ close(upstream_fd);
+ return -1;
+ }
+
+ return upstream_fd;
+}
+
static struct addrinfo* addr_choose(struct addrinfo* list, union sockaddr_union* bindaddr) {
int af = SOCKADDR_UNION_AF(bindaddr);
if(af == AF_UNSPEC) return list;
@@ -125,7 +242,9 @@
return list;
}
-static int connect_socks_target(unsigned char *buf, size_t n, struct client *client) {
+static int connect_socks_target(unsigned char *buf, size_t n, struct client *client, int *used_rule) {
+ *used_rule = 0;
+
if(n < 5) return -EC_GENERAL_FAILURE;
if(buf[0] != 5) return -EC_GENERAL_FAILURE;
if(buf[1] != 1) return -EC_COMMAND_NOT_SUPPORTED; /* we support only CONNECT method */
@@ -158,6 +277,29 @@
}
unsigned short port;
port = (buf[minlen-2] << 8) | buf[minlen-1];
+
+ size_t i;
+ struct fwd_rule *rule = NULL;
+ char original_name[256];
+ unsigned short original_port = port;
+ strncpy(original_name, namebuf, sizeof(original_name) - 1);
+ original_name[sizeof(original_name) - 1] = '\0';
+ if(fwd_rules) {
+ for(i=0;i<sblist_getsize(fwd_rules);++i) {
+ struct fwd_rule* r = (struct fwd_rule*)sblist_get(fwd_rules, i);
+ int name_match = (r->match_name[0]=='\0' || strcmp(r->match_name, namebuf) == 0);
+ int port_match = (r->match_port == 0 || r->match_port == port);
+ if(name_match && port_match) {
+ rule = r;
+ *used_rule = 1;
+ strncpy(namebuf, r->upstream_name, sizeof(namebuf)-1);
+ namebuf[sizeof(namebuf)-1] = '\0';
+ port = r->upstream_port;
+ break;
+ }
+ }
+ }
+
/* there's no suitable errorcode in rfc1928 for dns lookup failure */
if(resolve(namebuf, port, &remote)) return -EC_GENERAL_FAILURE;
struct addrinfo* raddr = addr_choose(remote, &bind_addr);
@@ -186,6 +328,11 @@
return -EC_GENERAL_FAILURE;
}
}
+
+ struct timeval tv = {5, 0};
+ setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof(tv));
+ setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (const char*)&tv, sizeof(tv));
+
if(SOCKADDR_UNION_AF(&bind_addr) == raddr->ai_family &&
bindtoip(fd, &bind_addr) == -1)
goto eval_errno;
@@ -198,9 +345,22 @@
af = SOCKADDR_UNION_AF(&client->addr);
void *ipdata = SOCKADDR_UNION_ADDRESS(&client->addr);
inet_ntop(af, ipdata, clientname, sizeof clientname);
- dolog("client[%d] %s: connected to %s:%d\n", client->fd, clientname, namebuf, port);
+ if (rule) {
+ dolog("client[%d] %s: %s:%d -> via %s:%d\n", client->fd, clientname, original_name, original_port, rule->upstream_name, rule->upstream_port);
+ } else {
+ dolog("client[%d] %s: connected to %s:%d\n", client->fd, clientname, namebuf, port);
+ }
}
- return fd;
+
+ if (rule) {
+ int result = upstream_handshake(rule, buf, n, client->fd, fd, original_port);
+ if (result < 0) {
+ close(fd);
+ return result;
+ }
+ return result;
+ }
+ return fd;
}
static int is_authed(union sockaddr_union *client, union sockaddr_union *authedip) {
@@ -322,6 +482,7 @@
ssize_t n;
int ret;
enum authmethod am;
+ int used_rule = 0;
t->state = SS_1_CONNECTED;
while((n = recv(t->client.fd, buf, sizeof buf, 0)) > 0) {
switch(t->state) {
@@ -345,12 +506,14 @@
}
break;
case SS_3_AUTHED:
- ret = connect_socks_target(buf, n, &t->client);
+ ret = connect_socks_target(buf, n, &t->client, &used_rule);
if(ret < 0) {
send_error(t->client.fd, ret*-1);
return -1;
}
- send_error(t->client.fd, EC_SUCCESS);
+ if (!used_rule) {
+ send_error(t->client.fd, EC_SUCCESS);
+ }
return ret;
}
}
@@ -382,11 +545,131 @@
}
}
+static short host_get_port(char *name) {
+ int p,n;
+ char *c;
+ if((c = strrchr(name, ':')) && sscanf(c+1,"%d%n",&p, &n)==1 && n == (int)(strlen(c + 1)) && p >= 0 && p < USHRT_MAX)
+ return (*c='\0'),(short)p;
+ else
+ return -1;
+}
+
+static int fwd_rules_add(char *str) {
+ char *match = NULL, *upstream = NULL, *remote = NULL;
+ unsigned short match_port, upstream_port, remote_port;
+ int ncred;
+
+ if(sscanf(str, "%m[^,],%n%m[^,],%ms\n", &match, &ncred, &upstream, &remote) != 3)
+ return 1;
+
+ match_port = host_get_port(match);
+ upstream_port = host_get_port(upstream);
+ remote_port = host_get_port(remote);
+
+ if(match_port < 0 || upstream_port <= 0 || remote_port < 0) {
+ free(match);
+ free(upstream);
+ free(remote);
+ return 1;
+ }
+
+ char *match_copy = strdup(match);
+ char *upstream_copy = strdup(upstream);
+ char *remote_copy = strdup(remote);
+
+ struct fwd_rule *rule = (struct fwd_rule*)malloc(sizeof(struct fwd_rule));
+ if (!rule) {
+ free(match_copy);
+ free(upstream_copy);
+ free(remote_copy);
+ free(match);
+ free(upstream);
+ free(remote);
+ return 1;
+ }
+
+ if(strcmp(match_copy, "0.0.0.0") == 0 || strcmp(match_copy, "*") == 0) {
+ free(match_copy);
+ rule->match_name = strdup("");
+ } else {
+ rule->match_name = match_copy;
+ }
+ rule->match_port = match_port;
+ rule->auth_buf = NULL;
+ rule->auth_len = 0;
+
+ char *at_sign = strchr(upstream_copy, '@');
+ if (at_sign) {
+ *at_sign = '\0';
+ char *auth_part = upstream_copy;
+ char *host_part = at_sign + 1;
+ char *colon = strchr(auth_part, ':');
+ if (!colon) {
+ free(rule);
+ free(upstream_copy);
+ free(remote_copy);
+ free(match);
+ free(upstream);
+ free(remote);
+ return 1;
+ }
+ *colon++ = '\0';
+ char *username = auth_part;
+ char *password = colon;
+ size_t ulen = strlen(username);
+ size_t plen = strlen(password);
+ if (ulen > 255 || plen > 255) {
+ free(rule);
+ free(upstream_copy);
+ free(remote_copy);
+ free(match);
+ free(upstream);
+ free(remote);
+ return 1;
+ }
+ rule->auth_len = 1 + 1 + ulen + 1 + plen;
+ rule->auth_buf = malloc(rule->auth_len);
+ rule->auth_buf[0] = 1;
+ rule->auth_buf[1] = ulen;
+ memcpy(&rule->auth_buf[2], username, ulen);
+ rule->auth_buf[2 + ulen] = plen;
+ memcpy(&rule->auth_buf[3 + ulen], password, plen);
+ rule->upstream_name = strdup(host_part);
+ rule->upstream_port = upstream_port;
+ /* hide from ps */
+ memset(str+ncred, '*', ulen+1+plen);
+ } else {
+ rule->upstream_name = strdup(upstream_copy);
+ rule->upstream_port = upstream_port;
+ }
+
+ free(upstream_copy);
+ short rlen = strlen(remote_copy);
+ rule->req_len = 3 + 1 + 1 + rlen + 2;
+ rule->req_buf = (char*)malloc(rule->req_len);
+ rule->req_buf[0] = 5;
+ rule->req_buf[1] = 1;
+ rule->req_buf[2] = 0;
+ rule->req_buf[3] = 3;
+ rule->req_buf[4] = rlen;
+ memcpy(&rule->req_buf[5], remote_copy, rlen);
+ unsigned short rport = remote_port ? remote_port : 0;
+ rule->req_buf[5 + rlen] = (rport >> 8) & 0xFF;
+ rule->req_buf[5 + rlen + 1] = (rport & 0xFF);
+ free(remote_copy);
+ sblist_add(fwd_rules, rule);
+ free(match);
+ free(upstream);
+ free(remote);
+
+ return 0;
+}
+
static int usage(void) {
dprintf(2,
"MicroSocks SOCKS5 Server\n"
"------------------------\n"
- "usage: microsocks -1 -q -i listenip -p port -u user -P pass -b bindaddr -w ips\n"
+ "usage: microsocks -1 -q -i listenip -p port -u user -P pass -b bindaddr -w ips -f fwdrule\n"
"all arguments are optional.\n"
"by default listenip is 0.0.0.0 and port 1080.\n\n"
"option -q disables logging.\n"
@@ -401,6 +684,12 @@
" this is handy for programs like firefox that don't support\n"
" user/pass auth. for it to work you'd basically make one connection\n"
" with another program that supports it, and then you can use firefox too.\n"
+ "option -f specifies a forwarding rule of the form\n"
+ " match_name:match_port,[user:password@]upstream_name:upstream_port,remote_name:remote_port\n"
+ " this will cause requests that /match/ to be renamed to /remote/\n"
+ " and sent to the /upstream/ SOCKS5 proxy server.\n"
+ " this option may be specified multiple times.\n"
+ "option -V prints version information and exits.\n"
);
return 1;
}
@@ -416,7 +705,7 @@
const char *listenip = "0.0.0.0";
char *p, *q;
unsigned port = 1080;
- while((ch = getopt(argc, argv, ":1qb:i:p:u:P:w:")) != -1) {
+ while((ch = getopt(argc, argv, ":1qb:i:p:u:P:w:f:V")) != -1) {
switch(ch) {
case 'w': /* fall-through */
case '1':
@@ -456,11 +745,20 @@
case 'p':
port = atoi(optarg);
break;
+ case 'f':
+ if(!fwd_rules)
+ fwd_rules = sblist_new(sizeof(struct fwd_rule), 16);
+ if(fwd_rules_add(optarg))
+ return dprintf(2, "error: could not parse forwarding rule %s\n", optarg), 1;
+ break;
case ':':
dprintf(2, "error: option -%c requires an operand\n", optopt);
/* fall through */
case '?':
return usage();
+ case 'V':
+ dprintf(1, "MicroSocks %s\n", MICROSOCKS_VERSION);
+ return 0;
}
}
if((auth_user && !auth_pass) || (!auth_user && auth_pass)) {
+2 -2
View File
@@ -14,8 +14,8 @@ MISE_HASH_x86_64:=3832f39c325e343f81fe3d92b2447c5d1a5eea1bc85092bb7b6c2580622264
MISE_HASH_aarch64:=06186cfbfe947049b21d58575fb0ea800cc26ed1375f20f4b678cb3a9d679437
PKG_NAME:=mise
PKG_VERSION:=2026.10.23
PKG_RELEASE:=46
PKG_VERSION:=2026.10.24
PKG_RELEASE:=47
PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION)-linux-$(MISE_ARCH)-musl.tar.gz
PKG_SOURCE_URL:=https://github.com/jdx/mise/releases/download/v$(PKG_VERSION)/
PKG_HASH:=skip