🏅 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 include $(TOPDIR)/rules.mk
PKG_NAME:=gately PKG_NAME:=gately
PKG_VERSION:=0.6.1 PKG_VERSION:=0.6.1.1
PKG_RELEASE:=18 PKG_RELEASE:=19
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/wangwanjie/gately/tar.gz/v$(PKG_VERSION)? 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 include $(TOPDIR)/rules.mk
PKG_NAME:=headscale PKG_NAME:=headscale
PKG_VERSION:=0.29.6 PKG_VERSION:=0.29.7
PKG_RELEASE:=11 PKG_RELEASE:=12
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/juanfont/headscale/tar.gz/v$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/juanfont/headscale/tar.gz/v$(PKG_VERSION)?
@@ -110,9 +110,30 @@ return dm2.dv.extend({
isLocal = true; isLocal = true;
if (info_response?.code !== 200) { 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.parseHeaders(version_response.headers, version_headers);
this.parseBody(version_response.body, version_body); this.parseBody(version_response.body, version_body);
this.parseBody(info_response.body, info_body); this.parseBody(info_response.body, info_body);
@@ -1420,6 +1420,84 @@ function getDashURL(isRunning) {
String.format(dashrepos_urlparams[repo] || '', host, port, secret) 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) { function renderResDownload(section_id) {
const section_type = this.section.sectiontype; const section_type = this.section.sectiontype;
const type = uci.get(this.config, section_id, 'type'); const type = uci.get(this.config, section_id, 'type');
@@ -1738,6 +1816,14 @@ function validateBase64Key(length, section_id, value) {
return true; 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) { 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. // 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); const auth_type = this.section.getOption(type_option).formvalue(section_id);
@@ -2021,6 +2107,7 @@ return baseclass.extend({
renderStatus, renderStatus,
updateStatus, updateStatus,
getDashURL, getDashURL,
renderHy2Realm,
renderResDownload, renderResDownload,
renderResLink, renderResLink,
handleGenKey, handleGenKey,
@@ -2037,9 +2124,9 @@ return baseclass.extend({
validateJson, validateJson,
validateUUID, validateUUID,
validateUrl, validateUrl,
// validate with bind this
validateHexstr, validateHexstr,
validateBase64Key, validateBase64Key,
validateSha256Key,
validateMTLSClientAuth, validateMTLSClientAuth,
validatePresetIDs, validatePresetIDs,
validateShadowsocksPassword, validateShadowsocksPassword,
@@ -204,7 +204,7 @@ function renderListeners(s, uciconfig, isClient) {
o.modalonly = true; o.modalonly = true;
o = s.taboption('field_general', form.Value, 'mieru_tcp_idle_timeout', _('TCP idle timeout'), 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.placeholder = '1800';
o.validate = hm.validateTimeDuration; o.validate = hm.validateTimeDuration;
o.depends('type', 'mieru'); o.depends('type', 'mieru');
@@ -1003,36 +1003,24 @@ function renderListeners(s, uciconfig, isClient) {
// @xhttp-config其他的配置 // @xhttp-config其他的配置
/* Hysteria2 Realm fields */ /* Hysteria2 Realm fields */
o = s.taboption('field_general', form.Flag, 'hysteria2_realm', _('Realm')); hm.renderHy2Realm(s, uciconfig);
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')); if (isClient) {
o.placeholder = 'https://realm.hy2.io'; o = s.taboption('field_hysteria2_realm', form.ListValue, 'hysteria2_realm_proxy', _('Proxy group'),
o.rmempty = false; _('The proxy used to connect to the rendezvous server.'));
o.depends('hysteria2_realm', '1'); o.default = hm.preset_outbound.direct[0][0];
o.modalonly = true; hm.preset_outbound.direct.forEach((res) => {
o.value.apply(o, res);
o = s.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_token', _('Pre-shared key of rendezvous server')); })
o.placeholder = 'public'; o.load = function(section_id) {
o.depends('hysteria2_realm', '1'); return hm.loadLabel.call(this, [
o.modalonly = true; ...hm.preset_outbound.direct,
...hm.loadLabelValues(this.config, 'proxy_group')
o = s.taboption('field_hysteria2_realm', form.Value, 'hysteria2_realm_id', _('Realm ID')); ], section_id);
o.placeholder = 'my-cabin-1f3a8c2e9b'; }
o.rmempty = false; o.depends('hysteria2_realm', '1');
o.depends('hysteria2_realm', '1'); o.modalonly = true;
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)
/* TLS fields */ /* TLS fields */
o = s.taboption('field_general', form.Flag, 'tls', _('TLS')); o = s.taboption('field_general', form.Flag, 'tls', _('TLS'));
@@ -1423,36 +1423,7 @@ return view.extend({
// @ 下面支持填写针对download-settings的上下行分离配置 // @ 下面支持填写针对download-settings的上下行分离配置
/* Hysteria2 Realm fields */ /* Hysteria2 Realm fields */
so = ss.taboption('field_general', form.Flag, 'hysteria2_realm', _('Realm')); hm.renderHy2Realm(ss, data[0]);
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)
/* TLS fields */ /* TLS fields */
so = ss.taboption('field_general', form.Flag, 'tls', _('TLS')); so = ss.taboption('field_general', form.Flag, 'tls', _('TLS'));
@@ -1491,7 +1462,7 @@ return view.extend({
so.validate = function(section_id, value) { so.validate = function(section_id, value) {
const type = this.section.getOption('type').formvalue(section_id); const type = this.section.getOption('type').formvalue(section_id);
//const plugin_type = this.section.getOption('plugin_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 // Default alpn
if (!`${tls_alpn.getValue()}`) { if (!`${tls_alpn.getValue()}`) {
@@ -1535,14 +1506,7 @@ return view.extend({
so = ss.taboption('field_tls', form.Value, 'tls_fingerprint', _('Cert fingerprint'), so = ss.taboption('field_tls', form.Value, 'tls_fingerprint', _('Cert fingerprint'),
_('Certificate fingerprint. Used to implement SSL Pinning and prevent MitM.')); _('Certificate fingerprint. Used to implement SSL Pinning and prevent MitM.'));
so.validate = function(section_id, value) { so.validate = hm.validateSha256Key;
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.depends({tls: '1', type: /^(http|socks5|vmess|vless|trojan|hysteria|hysteria2)$/}); so.depends({tls: '1', type: /^(http|socks5|vmess|vless|trojan|hysteria|hysteria2)$/});
so.modalonly = true; 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 # Set ENV variables for Client
export SAFE_PATHS="$RUN_DIR$( export SAFE_PATHS="$RUN_DIR$(
yq 'with(.external-ui; select(. != null) | . = sub("(/?$)", "/placeholder")) 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("(/[^/]+$)", "") | unique
| .[] | sub("(^)", ":")' \ | .[] | sub("(^)", ":")' \
"$RUN_DIR/mihomo-c.yaml" | tr -d '\n' "$RUN_DIR/mihomo-c.yaml" | tr -d '\n'
@@ -391,7 +391,7 @@ start_service() {
else else
# Set ENV variables for Server # Set ENV variables for Server
export SAFE_PATHS="$RUN_DIR$( 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("(/[^/]+$)", "") | unique
| .[] | sub("(^)", ":")' \ | .[] | sub("(^)", ":")' \
"$RUN_DIR/mihomo-s.yaml" | tr -d '\n' "$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); listener["jls-config"].proxy = get_proxy(listener["jls-config"].proxy);
if (listener["jls-upstream"]) if (listener["jls-upstream"])
listener["jls-upstream"].proxy = get_proxy(listener["jls-upstream"].proxy); 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); push(config.listeners, listener);
}); });
@@ -607,13 +609,14 @@ uci.foreach(uciconf, ucinode, (cfg) => {
token: cfg.hysteria2_realm_token, token: cfg.hysteria2_realm_token,
"realm-id": cfg.hysteria2_realm_id, "realm-id": cfg.hysteria2_realm_id,
"stun-servers": cfg.hysteria2_realm_stun_servers, "stun-servers": cfg.hysteria2_realm_stun_servers,
// @TLS of server-url // TLS of server-url
//sni, sni: cfg.hysteria2_realm_sni,
//alpn, alpn: cfg.hysteria2_realm_alpn,
//"skip-cert-verify", fingerprint: cfg.hysteria2_realm_fingerprint,
//fingerprint, "name-cert-verify": cfg.hysteria2_realm_name_cert_verify,
//certificate, "skip-cert-verify": strToBool(cfg.hysteria2_realm_skip_cert_verify),
//"private-key" certificate: cfg.hysteria2_realm_cert_path, // mTLS
"private-key": cfg.hysteria2_realm_key_path // mTLS
} : null, } : null,
/* ShadowQUIC */ /* ShadowQUIC */
@@ -323,13 +323,15 @@ export function parseListener(cfg) {
token: cfg.hysteria2_realm_token, token: cfg.hysteria2_realm_token,
"realm-id": cfg.hysteria2_realm_id, "realm-id": cfg.hysteria2_realm_id,
"stun-servers": cfg.hysteria2_realm_stun_servers, "stun-servers": cfg.hysteria2_realm_stun_servers,
// @TLS of server-url // TLS of server-url
//sni, sni: cfg.hysteria2_realm_sni,
//alpn, alpn: cfg.hysteria2_realm_alpn,
//"skip-cert-verify", fingerprint: cfg.hysteria2_realm_fingerprint,
//fingerprint, "name-cert-verify": cfg.hysteria2_realm_name_cert_verify,
//certificate, "skip-cert-verify": strToBool(cfg.hysteria2_realm_skip_cert_verify),
//"private-key" 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, } : null,
/* Hysteria2 Realmserver */ /* Hysteria2 Realmserver */
+2 -2
View File
@@ -1,8 +1,8 @@
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-open-box PKG_NAME:=luci-app-open-box
PKG_VERSION:=0.1.374 PKG_VERSION:=0.1.376
PKG_RELEASE:=52 PKG_RELEASE:=53
PKG_MAINTAINER:=liandu2024 PKG_MAINTAINER:=liandu2024
PKG_LICENSE:=GPL-3.0-or-later 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_NAME:=luci-app-openvpn-plus
PKG_VERSION:=1.0.0 PKG_VERSION:=1.0.0
PKG_RELEASE:=9 PKG_RELEASE:=10
PKG_LICENSE:=Apache-2.0 PKG_LICENSE:=Apache-2.0
PKG_MAINTAINER:=Manfred Jaider <info@masmbit.com> PKG_MAINTAINER:=Manfred Jaider <info@masmbit.com>
@@ -836,11 +836,11 @@ symlink() {
# Remove RAM base directory if it has become completely empty # Remove RAM base directory if it has become completely empty
rmdir "${ram_link_dir}" 2>/dev/null rmdir "${ram_link_dir}" 2>/dev/null
# Smart Web-Folder Cleanup: Check if files other than index.html exist # Smart Web-Folder Cleanup: Check if files other than index.html exist
if [ -d "${www_link_dir}" ]; then if [ -d "${www_link_dir}" ]; then
local has_profiles="0" local has_profiles="0"
local check_link local check_link
# If a real symlink or folder matching the pattern exists, has_profiles becomes 1 # If a real symlink or folder matching the pattern exists, has_profiles becomes 1
for check_link in "${www_link_dir}"/ovpn-tmp-*-*; do for check_link in "${www_link_dir}"/ovpn-tmp-*-*; do
if [ -e "${check_link}" ] || [ -L "${check_link}" ]; then if [ -e "${check_link}" ] || [ -L "${check_link}" ]; then
@@ -852,7 +852,7 @@ symlink() {
if [ "${has_profiles}" = "0" ]; then if [ "${has_profiles}" = "0" ]; then
rm -rf "${www_link_dir}" rm -rf "${www_link_dir}"
fi fi
fi fi
printf "%s\n" "SUCCESS: Link directory and static profile deleted from RAM." printf "%s\n" "SUCCESS: Link directory and static profile deleted from RAM."
else else
@@ -1955,6 +1955,7 @@ cleanup() {
# no argument (no shift) # no argument (no shift)
local conf_file local conf_file
local instname local instname
local raw_list=""
local active_list="" local active_list=""
local conf_dir="/etc/openvpn/luci" local conf_dir="/etc/openvpn/luci"
local key_dir="/etc/openvpn/keys" local key_dir="/etc/openvpn/keys"
@@ -1962,24 +1963,19 @@ cleanup() {
local ram_link_dir="/tmp/luci-ovpn-plus" local ram_link_dir="/tmp/luci-ovpn-plus"
local www_link_dir="/www/ovpn-downloads" local www_link_dir="/www/ovpn-downloads"
# Step 1: Build the list of ACTIVE instances from the instance*.conf files # Step 1: Get all active OpenVPN instances directly from UCI config
for conf_file in "${conf_dir}"/instance*.conf; do raw_list=$(uci -q show openvpn | grep "=openvpn" | awk -F'[.=]' '{print $2}' 2>/dev/null)
if [ -f "${conf_file}" ]; then
instname="${conf_file##*/}"
instname="${instname%.conf}"
if internal_checkname "${instname}"; then # Validate every instance name from UCI before adding it to the official list
# Enforce space separation to prevent partial substring matches later for instname in ${raw_list}; do
active_list="${active_list} ${instname}" if internal_checkname "${instname}"; then
fi active_list="${active_list} ${instname}"
fi fi
done done
# Step 2: Remove orphan instance files # Step 2: Remove orphan instance files
internal_cleaninst "${active_list}" "${conf_dir}/instance*.conf" internal_cleaninst "${active_list}" "${conf_dir}/instance*.conf"
internal_cleaninst "${active_list}" "${conf_dir}/instance*.nft" 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}" "${conf_dir}/instance*.ovpn"
internal_cleaninst "${active_list}" "${key_dir}/ca_instance*.crt" internal_cleaninst "${active_list}" "${key_dir}/ca_instance*.crt"
internal_cleaninst "${active_list}" "${key_dir}/dh_instance*.pem" 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}/client_instance*.crt"
internal_cleaninst "${active_list}" "${key_dir}/server_instance*.key" internal_cleaninst "${active_list}" "${key_dir}/server_instance*.key"
internal_cleaninst "${active_list}" "${key_dir}/client_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" internal_cleaninst "${active_list}" "${run_dir}/openvpn-ddns-instance*.status"
# Step 3: Remove orphan symlink files # Step 3: Remove orphan symlink files
@@ -1997,22 +1991,17 @@ cleanup() {
# Remove the temporary RAM directory ONLY if it is completely empty # Remove the temporary RAM directory ONLY if it is completely empty
[ -d "${ram_link_dir}" ] && rmdir "${ram_link_dir}" 2>/dev/null [ -d "${ram_link_dir}" ] && rmdir "${ram_link_dir}" 2>/dev/null
# Smart Web-Folder Cleanup: Check if files other than index.html exist # Smart Web-Folder Cleanup: Check if files other than index.html exist
if [ -d "${www_link_dir}" ]; then if [ -d "${www_link_dir}" ]; then
local has_profiles="0" local found_profiles
local check_link found_profiles="${www_link_dir}/ovpn-tmp-"*-*
# 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 the text still has a '*', no active profiles were found
if [ -e "${check_link}" ] || [ -L "${check_link}" ]; then if [ "${found_profiles}" = "${www_link_dir}/ovpn-tmp-*-*" ]; then
has_profiles="1"
break
fi
done
# Remove the web folder if no active profile links are left
if [ "${has_profiles}" = "0" ]; then
rm -rf "${www_link_dir}" rm -rf "${www_link_dir}"
fi fi
fi fi
return 0 return 0
} }
@@ -18,6 +18,29 @@ const callGetFirewallStatus = rpc.declare({ object: 'tailscale', method: 'get_fi
let map; let map;
let lastDevicesStatus; 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 // uci.changes() returns an object keyed by config name; count the entries so
// the firewall button can warn about unsaved work. // the firewall button can warn about unsaved work.
function countPending(changes) { 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 // Poll the background firewall job until it finishes. A poll that fails
// (network reloading, the connection dropped for a moment) is expected and is // (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. // 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 (state === 'done') {
if (stop()) if (stop())
ui.addTimeLimitedNotification(null, [ E('p', _('Firewall configuration applied.')) ], 5000, 'info'); notifyTimed(null, [ E('p', _('Firewall configuration applied.')) ], 5000, 'info');
resolve(res); resolve(res);
return; return;
} }
@@ -174,7 +234,7 @@ function pollFirewallJob(runId, timeoutSec) {
if (state !== lastState) { if (state !== lastState) {
lastState = state; lastState = state;
if (state === 'running' && res?.step === 'firewall') 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) { } 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 // If no valid cache, fetch from the network
@@ -269,10 +329,10 @@ async function initializeRegionMap() {
}; };
localStorage.setItem(cacheKey, JSON.stringify(itemToCache)); localStorage.setItem(cacheKey, JSON.stringify(itemToCache));
} catch (e) { } 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) { } 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 = map.section(form.NamedSection, '_status');
s.anonymous = true; s.anonymous = true;
s.render = function (section_id) { s.render = function (section_id) {
L.Poll.add( // Registering is idempotent and must not affect what is rendered.
function () { ensureStatusPoller();
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);
return E('div', { 'id': 'service_status_display', 'class': 'cbi-value' }, return E('div', { 'id': 'service_status_display', 'class': 'cbi-value' },
_('Collecting data ...') _('Collecting data ...')
@@ -677,7 +717,7 @@ return view.extend({
return null; 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); return pollFirewallJob(res.run_id);
}).catch(function(err) { }).catch(function(err) {
ui.addNotification(null, E('p', {}, _('Failed to configure firewall: %s').format(err?.message || err?.error || err || _('Unknown error'))), 'error'); 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 customServerAuth = customserverAuthInput ? customserverAuthInput.value : '';
const loginWindow = window.open('', '_blank'); const loginWindow = window.open('', '_blank');
if (!loginWindow) { 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; return;
} }
// Display a prompt message in the new window // Display a prompt message in the new window
@@ -786,11 +826,11 @@ return view.extend({
doc.body.innerHTML = doc.body.innerHTML =
'<h2>' + _('Error') + '</h2>' + '<h2>' + _('Error') + '</h2>' +
'<p>' + _('Failed to get login URL. You may close this tab.') + '</p>'; '<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) { }).catch(function(err) {
ui.hideModal(); 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) { return callDoLogout().then(function(res) {
unwrapRpc(res, _('Logout')); unwrapRpc(res, _('Logout'));
ui.hideModal(); ui.hideModal();
ui.addTimeLimitedNotification(null, [ E('p', _('Successfully logged out.')) ], 5000, 'info'); notifyTimed(null, [ E('p', _('Successfully logged out.')) ], 5000, 'info');
}).catch(function(err) { }).catch(function(err) {
ui.hideModal(); 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')) }, _('Logout'))
@@ -872,13 +912,16 @@ return view.extend({
// standard OpenWrt apply mechanism, which triggers /etc/init.d/tailscale-settings // standard OpenWrt apply mechanism, which triggers /etc/init.d/tailscale-settings
// and provides automatic rollback protection if the device becomes unreachable. // and provides automatic rollback protection if the device becomes unreachable.
handleSaveApply(ev, mode) { handleSaveApply(ev, mode) {
// Read the submitted value before map.save() consumes the staged delta. // The submitted value only reaches the uci model while map.save() parses
// uci.get() prefers the staged change over the saved value, and the // the form, so reading it before map.save() returns the previously saved
// staged delta is only populated once the form has been parsed, which // value: switching the service off then passed '1' and never armed the
// map.save() guarantees here. // stop request. Read it in the save callback, which runs right after the
const wantEnabled = uci.get('tailscale', 'settings', 'service_enabled'); // 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 // Only records the disable request; the reload handler performs
// the stop after the commit, so a LuCI rollback still finds a // the stop after the commit, so a LuCI rollback still finds a
// running daemon. One concurrency slot on purpose: an overlapping // 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 // Fail-open on purpose: an install whose rpcd ACL cache predates
// this method would otherwise be unable to apply anything. The // this method would otherwise be unable to apply anything. The
// worst case is that the stop is skipped for this apply. // 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) { .catch(function(err) {
console.warn('set_service_enabled failed: %s', err); console.warn('set_service_enabled failed: %s', err);
return null; return null;
+168 -168
View File
@@ -1,23 +1,23 @@
msgid "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n" 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" msgid "%s failed"
msgstr "Error de %s" 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" msgid "(Experimental) Reduce Memory Usage"
msgstr "(Experimental) Reducir el uso de memoria" 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\"." msgid "1. Enable \"Advertise Exit Node\"."
msgstr "1. Active \"Anunciar como nodo de salida\"." 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)." msgid "1. Select \"Accept Routes\" (to access remote devices)."
msgstr "1. Marque \"Aceptar rutas\" (para acceder a dispositivos remotos)." 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 "" msgid ""
"2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic " "2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic "
"to WAN)." "to WAN)."
@@ -25,7 +25,7 @@ msgstr ""
"2. Haga clic en \"Configurar el cortafuegos automáticamente\" " "2. Haga clic en \"Configurar el cortafuegos automáticamente\" "
"(reenvía el tráfico de Tailscale hacia la WAN)." "(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 "" msgid ""
"2. In \"Advertise Routes\", select your local subnet (to allow remote " "2. In \"Advertise Routes\", select your local subnet (to allow remote "
"devices to access this LAN)." "devices to access this LAN)."
@@ -33,13 +33,13 @@ msgstr ""
"2. En \"Anunciar rutas\", seleccione su subred local (para que los " "2. En \"Anunciar rutas\", seleccione su subred local (para que los "
"dispositivos remotos puedan acceder a esta LAN)." "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)." msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)."
msgstr "" msgstr ""
"3. Haga clic en \"Configurar el cortafuegos automáticamente\" (para " "3. Haga clic en \"Configurar el cortafuegos automáticamente\" (para "
"permitir el reenvío de tráfico)." "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 "" msgid ""
"3. In the Tailscale admin console, edit this device under the route " "3. In the Tailscale admin console, edit this device under the route "
"settings and approve it as an Exit Node." "settings and approve it as an Exit Node."
@@ -47,27 +47,27 @@ msgstr ""
"3. En la consola de administración de Tailscale, edite este " "3. En la consola de administración de Tailscale, edite este "
"dispositivo en los ajustes de rutas y apruébelo como nodo de salida." "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." 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." 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" msgid "Accept Routes"
msgstr "Aceptar rutas" 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" msgid "Account Settings"
msgstr "Ajustes de la cuenta" 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" msgid "Advertise Exit Node"
msgstr "Anunciar como nodo de salida" 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" msgid "Advertise Routes"
msgstr "Anunciar rutas" 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 "" msgid ""
"Advertise subnet routes behind this device. Select from the detected " "Advertise subnet routes behind this device. Select from the detected "
"subnets below or enter custom routes (comma-separated)." "subnets below or enter custom routes (comma-separated)."
@@ -76,15 +76,15 @@ msgstr ""
"Seleccione una de las subredes detectadas a continuación o introduzca " "Seleccione una de las subredes detectadas a continuación o introduzca "
"rutas personalizadas separadas por comas." "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" msgid "Allow LAN Access"
msgstr "Permitir acceso a la LAN" 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." msgid "Allow accepting routes announced by other nodes."
msgstr "Permitir aceptar las rutas anunciadas por otros nodos." 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." msgid "Allow connecting to this device through the SSH function of Tailscale."
msgstr "" msgstr ""
"Permitir conectarse a este dispositivo mediante la función SSH de " "Permitir conectarse a este dispositivo mediante la función SSH de "
@@ -94,40 +94,40 @@ msgstr ""
msgid "Allow user access to tailscale" msgid "Allow user access to tailscale"
msgstr "Permitir el acceso de usuarios a 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" msgid "Another firewall reload is already running"
msgstr "Ya se está recargando el cortafuegos" 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?" msgid "Are you sure you want to log out?"
msgstr "¿Seguro que desea cerrar la sesión?" 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" msgid "Auto Configure Firewall"
msgstr "Configurar el cortafuegos automáticamente" 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" msgid "Cancel"
msgstr "Cancelar" 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." msgid "Click to Log out account on this device."
msgstr "Haga clic para cerrar la sesión de la cuenta en este dispositivo." 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." msgid "Click to get a login URL for this device."
msgstr "" msgstr ""
"Haga clic para obtener una URL de inicio de sesión para este " "Haga clic para obtener una URL de inicio de sesión para este "
"dispositivo." "dispositivo."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:291 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:383 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:443
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:591 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:631
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:850 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:890
msgid "Collecting data ..." msgid "Collecting data ..."
msgstr "Recopilando datos..." 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 "" msgid ""
"Configuration committed, reloading network and firewall. This can " "Configuration committed, reloading network and firewall. This can "
"take a moment." "take a moment."
@@ -135,23 +135,23 @@ msgstr ""
"Configuración guardada, recargando la red y el cortafuegos. Esto " "Configuración guardada, recargando la red y el cortafuegos. Esto "
"puede tardar un momento." "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" msgid "Configuring firewall"
msgstr "Configurando el cortafuegos" 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" msgid "Confirm Logout"
msgstr "Confirmar cierre de sesión" 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" msgid "Connection Info"
msgstr "Información de conexión" 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." msgid "Controls how Tailscale DNS is handled."
msgstr "Controla cómo se gestiona el DNS de Tailscale." 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 "" msgid ""
"Could not open a new tab. Please check if your browser or an " "Could not open a new tab. Please check if your browser or an "
"extension blocked the pop-up." "extension blocked the pop-up."
@@ -159,43 +159,43 @@ msgstr ""
"No se pudo abrir una pestaña nueva. Compruebe si su navegador o " "No se pudo abrir una pestaña nueva. Compruebe si su navegador o "
"alguna extensión bloqueó la ventana emergente." "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" msgid "Custom Login Server"
msgstr "Servidor de inicio de sesión personalizado" 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" msgid "Custom Login Server Auth Key"
msgstr "Clave de autenticación del servidor de inicio de sesión personalizado" 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" msgid "DNS Mode"
msgstr "Modo DNS" 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" msgid "Daemon MTU"
msgstr "MTU del demonio" 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" msgid "Daemon Settings"
msgstr "Ajustes del demonio" 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." msgid "Declare this device as an Exit Node."
msgstr "Declarar este dispositivo como nodo de salida." 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" msgid "Devices List"
msgstr "Lista de dispositivos" 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" msgid "Disable Firewall Configuration"
msgstr "Desactivar la configuración del cortafuegos" 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" msgid "Disable SNAT"
msgstr "Desactivar 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 "" msgid ""
"Disable Source NAT (SNAT) for traffic to advertised routes. Most " "Disable Source NAT (SNAT) for traffic to advertised routes. Most "
"users should leave this unchecked." "users should leave this unchecked."
@@ -204,46 +204,46 @@ msgstr ""
"tráfico hacia las rutas anunciadas. La mayoría de los usuarios deben " "tráfico hacia las rutas anunciadas. La mayoría de los usuarios deben "
"dejar esta opción desmarcada." "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)." msgid "Disable Tailscale netfilter auto-configuration (--netfilter-mode=off)."
msgstr "" msgstr ""
"Desactivar la autoconfiguración de netfilter de Tailscale " "Desactivar la autoconfiguración de netfilter de Tailscale "
"(--netfilter-mode=off)." "(--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:85
#: 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 "Disabled" msgid "Disabled"
msgstr "Desactivado" 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." msgid "Disabled: system DNS only."
msgstr "Desactivado: solo el DNS del sistema." 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." msgid "Disconnect from Tailscale and expire current node key."
msgstr "Desconectar de Tailscale e invalidar la clave actual del nodo." 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" msgid "Empty reply from server"
msgstr "Respuesta vacía del servidor" 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" msgid "Enable Peer Relay"
msgstr "Activar 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" msgid "Enable Tailscale SSH"
msgstr "Activar 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" msgid "Enable Tailscale Service"
msgstr "Activar el servicio Tailscale" 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" msgid "Enable Web Interface"
msgstr "Activar la interfaz web" 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 "" msgid ""
"Enable or disable the Tailscale service. When disabled, the service " "Enable or disable the Tailscale service. When disabled, the service "
"will be stopped and the process will be killed." "will be stopped and the process will be killed."
@@ -251,7 +251,7 @@ msgstr ""
"Activa o desactiva el servicio Tailscale. Al desactivarlo, el " "Activa o desactiva el servicio Tailscale. Al desactivarlo, el "
"servicio se detendrá y el proceso se finalizará." "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 "" msgid ""
"Enable this device as a Peer Relay server. Requires a public IP and " "Enable this device as a Peer Relay server. Requires a public IP and "
"an UDP port open on the router." "an UDP port open on the router."
@@ -259,11 +259,11 @@ msgstr ""
"Activa este dispositivo como servidor Peer Relay. Requiere una IP " "Activa este dispositivo como servidor Peer Relay. Requiere una IP "
"pública y un puerto UDP abierto en el router." "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" msgid "Enabled"
msgstr "Activado" 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 "" msgid ""
"Enabling this option can reduce memory usage, but it may sacrifice " "Enabling this option can reduce memory usage, but it may sacrifice "
"some performance (set GOGC=10)." "some performance (set GOGC=10)."
@@ -271,23 +271,23 @@ msgstr ""
"Activar esta opción puede reducir el uso de memoria, pero puede " "Activar esta opción puede reducir el uso de memoria, pero puede "
"mermar algo el rendimiento (establece GOGC=10)." "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" msgid "Error"
msgstr "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" msgid "Error caching DERP region map: %s"
msgstr "Error al guardar en caché el mapa de regiones DERP: %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" msgid "Error fetching DERP region map: %s"
msgstr "Error al obtener el mapa de regiones DERP: %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" msgid "Error reading cached DERP region map: %s"
msgstr "Error al leer el mapa de regiones DERP en caché: %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 "" msgid ""
"Essential configuration for Subnet Routing (Site-to-Site) and Exit " "Essential configuration for Subnet Routing (Site-to-Site) and Exit "
"Node features." "Node features."
@@ -295,12 +295,12 @@ msgstr ""
"Configuración esencial para las funciones de enrutamiento de subredes " "Configuración esencial para las funciones de enrutamiento de subredes "
"(sitio a sitio) y de nodo de salida." "(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:484
#: 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 "Exit Node" msgid "Exit Node"
msgstr "Nodo de salida" 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 "" msgid ""
"Expose a web interface on port 5252 for managing this node over " "Expose a web interface on port 5252 for managing this node over "
"Tailscale." "Tailscale."
@@ -308,66 +308,66 @@ msgstr ""
"Expone una interfaz web en el puerto 5252 para administrar este nodo " "Expone una interfaz web en el puerto 5252 para administrar este nodo "
"a través de Tailscale." "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" msgid "Failed to configure firewall: %s"
msgstr "No se pudo configurar el cortafuegos: %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." msgid "Failed to get login URL. You may close this tab."
msgstr "" msgstr ""
"No se pudo obtener la URL de inicio de sesión. Puede cerrar esta " "No se pudo obtener la URL de inicio de sesión. Puede cerrar esta "
"pestaña." "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:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
msgid "Failed to get login URL: %s" msgid "Failed to get login URL: %s"
msgstr "No se pudo obtener la URL de inicio de sesión: %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" msgid "Failed to load logs: %s"
msgstr "No se pudieron cargar los registros: %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..." msgid "Filter peers by name, IP, or OS..."
msgstr "Filtrar pares por nombre, IP o sistema operativo..." 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:" msgid "Filter:"
msgstr "Filtro:" 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" msgid "Firewall Mode"
msgstr "Modo del cortafuegos" 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." msgid "Firewall configuration already applied."
msgstr "La configuración del cortafuegos ya está aplicada." 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." msgid "Firewall configuration applied."
msgstr "Configuración del cortafuegos aplicada." 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" msgid "Firewall reload failed"
msgstr "Error al recargar el cortafuegos" 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" msgid "General Settings"
msgstr "Ajustes generales" 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" msgid "Hostname"
msgstr "Nombre de host" 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?" msgid "How to enable Exit Node?"
msgstr "¿Cómo activar el nodo de salida?" 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?" msgid "How to enable Site-to-Site?"
msgstr "¿Cómo activar la conexión sitio a sitio?" 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 "" msgid ""
"If the timeout is displayed, you can refresh the page and click Login " "If the timeout is displayed, you can refresh the page and click Login "
"again." "again."
@@ -375,7 +375,7 @@ msgstr ""
"Si aparece un tiempo de espera agotado, puede actualizar la página y " "Si aparece un tiempo de espera agotado, puede actualizar la página y "
"volver a hacer clic en Iniciar sesión." "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 "" msgid ""
"If you are using custom login server but not providing an Auth Key, " "If you are using custom login server but not providing an Auth Key, "
"will redirect to the login page without pre-filling the 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 " "proporciona una clave de autenticación, se redirigirá a la página de "
"inicio de sesión sin rellenar la clave previamente." "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" msgid "Invalid Date"
msgstr "Fecha no válida" 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." msgid "Invalid response from server."
msgstr "Respuesta no válida del servidor." 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 "" msgid ""
"It creates the tailscale interface, adds it to a firewall zone, and " "It creates the tailscale interface, adds it to a firewall zone, and "
"sets up forwarding between LAN and Tailscale, plus Tailscale to WAN." "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 " "configura el reenvío entre la LAN y Tailscale, además de Tailscale "
"hacia la WAN." "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" msgid "Just now"
msgstr "Ahora mismo" 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" msgid "LOGGED OUT"
msgstr "SESIÓN CERRADA" 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" msgid "Last Seen"
msgstr "Última conexión" 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." msgid "Leave blank for default Tailscale control plane."
msgstr "" msgstr ""
"Déjelo en blanco para usar el plano de control predeterminado de " "Déjelo en blanco para usar el plano de control predeterminado de "
"Tailscale." "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" msgid "Loading logs"
msgstr "Cargando registros" 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..." msgid "Logging out..."
msgstr "Cerrando sesión..." 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" msgid "Login"
msgstr "Iniciar sesión" 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:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:815 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:855
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:823 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:863
msgid "Logout" msgid "Logout"
msgstr "Cerrar sesión" 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" msgid "Logout failed: %s"
msgstr "Error al cerrar sesión: %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" msgid "Logs"
msgstr "Registros" 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." msgid "MagicDNS: Tailscale overrides resolv.conf."
msgstr "MagicDNS: Tailscale sobrescribe 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 "" msgid ""
"Masquerading and MSS Clamping (MTU fix) are enabled to keep " "Masquerading and MSS Clamping (MTU fix) are enabled to keep "
"connections stable." "connections stable."
@@ -457,62 +457,62 @@ msgstr ""
"Se activan el enmascaramiento y el MSS Clamping (corrección de MTU) " "Se activan el enmascaramiento y el MSS Clamping (corrección de MTU) "
"para mantener estables las conexiones." "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" msgid "N/A"
msgstr "N/D" 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" msgid "NOT RUNNING"
msgstr "NO EN EJECUCIÓN" 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." msgid "No matching peer devices found."
msgstr "No se encontraron dispositivos pares que coincidan." 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." msgid "No peer devices found."
msgstr "No se encontraron dispositivos pares." 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:428
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:880
msgid "No tailscale-related logs found." msgid "No tailscale-related logs found."
msgstr "No se encontraron registros relacionados con Tailscale." 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" msgid "None"
msgstr "Ninguno" 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" msgid "Now"
msgstr "Ahora" 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" msgid "OS"
msgstr "SO" 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" msgid "Offline"
msgstr "Sin conexión" 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" msgid "Online"
msgstr "En línea" 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" msgid "OpenWrt Forward"
msgstr "Reenvío OpenWrt" 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)" msgid "OpenWrt Forward: MagicDNS via dnsmasq forwarding.(Only support ts.net)"
msgstr "" msgstr ""
"Reenvío de OpenWrt: MagicDNS mediante el reenvío de dnsmasq. (Solo " "Reenvío de OpenWrt: MagicDNS mediante el reenvío de dnsmasq. (Solo "
"admite ts.net)" "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" msgid "Operation"
msgstr "Operación" 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 "" msgid ""
"Optional: Specify a custom control server URL (e.g., a Headscale " "Optional: Specify a custom control server URL (e.g., a Headscale "
"instance, %s)." "instance, %s)."
@@ -520,7 +520,7 @@ msgstr ""
"Opcional: especifique la URL de un servidor de control personalizado " "Opcional: especifique la URL de un servidor de control personalizado "
"(por ejemplo, una instancia de Headscale, %s)." "(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 "" msgid ""
"Optional: Specify an authentication key for the custom control " "Optional: Specify an authentication key for the custom control "
"server. Leave blank if not required." "server. Leave blank if not required."
@@ -528,50 +528,50 @@ msgstr ""
"Opcional: especifique una clave de autenticación para el servidor de " "Opcional: especifique una clave de autenticación para el servidor de "
"control personalizado. Déjelo en blanco si no es necesaria." "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" msgid "Peer Relay Port"
msgstr "Puerto de Peer Relay" 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." msgid "Please use the login button in the settings below to authenticate."
msgstr "" msgstr ""
"Utilice el botón de inicio de sesión de los ajustes que aparecen a " "Utilice el botón de inicio de sesión de los ajustes que aparecen a "
"continuación para autenticarse." "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: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." msgid "Please wait."
msgstr "Espere, por favor." 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" msgid "RUNNING"
msgstr "EN EJECUCIÓN" 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" msgid "RX"
msgstr "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" msgid "Refresh"
msgstr "Actualizar" 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..." msgid "Reloading firewall..."
msgstr "Recargando el cortafuegos..." 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:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
msgid "Requesting Login URL..." msgid "Requesting Login URL..."
msgstr "Solicitando la URL de inicio de sesión..." 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." msgid "Requesting Tailscale login URL... Please wait."
msgstr "" msgstr ""
"Solicitando la URL de inicio de sesión de Tailscale... Espere, por " "Solicitando la URL de inicio de sesión de Tailscale... Espere, por "
"favor." "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 "" msgid ""
"Select an exit node from the list. If enabled, Allow LAN Access is " "Select an exit node from the list. If enabled, Allow LAN Access is "
"enabled implicitly." "enabled implicitly."
@@ -579,7 +579,7 @@ msgstr ""
"Seleccione un nodo de salida de la lista. Si se activa, Permitir " "Seleccione un nodo de salida de la lista. Si se activa, Permitir "
"acceso a la LAN se activa de forma implícita." "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 "" msgid ""
"Select the firewall backend for Tailscale to use. Requires service " "Select the firewall backend for Tailscale to use. Requires service "
"restart to take effect." "restart to take effect."
@@ -587,14 +587,14 @@ msgstr ""
"Seleccione el backend de cortafuegos que usará Tailscale. Requiere " "Seleccione el backend de cortafuegos que usará Tailscale. Requiere "
"reiniciar el servicio para aplicarse." "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:380
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:328 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:388
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:340 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: 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 "Service Status" msgid "Service Status"
msgstr "Estado del servicio" 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 "" msgid ""
"Set a custom MTU for the Tailscale daemon. Leave blank to use the " "Set a custom MTU for the Tailscale daemon. Leave blank to use the "
"default value." "default value."
@@ -602,60 +602,60 @@ msgstr ""
"Establezca un MTU personalizado para el demonio de Tailscale. Déjelo " "Establezca un MTU personalizado para el demonio de Tailscale. Déjelo "
"en blanco para usar el valor predeterminado." "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" msgid "Shields Up"
msgstr "Bloquear conexiones entrantes" 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" msgid "Status"
msgstr "Estado" 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." msgid "Successfully logged out."
msgstr "Sesión cerrada correctamente." 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" msgid "TAILSCALE NOT FOUND"
msgstr "TAILSCALE NO ENCONTRADO" 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" msgid "TUN Mode"
msgstr "Modo TUN" 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" msgid "TX"
msgstr "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" msgid "Tailnet Name"
msgstr "Nombre de la tailnet" 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 #: luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:1
msgid "Tailscale" msgid "Tailscale"
msgstr "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" msgid "Tailscale Health Check: %s"
msgstr "Comprobación de estado de Tailscale: %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" msgid "Tailscale IP"
msgstr "IP de Tailscale" 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" msgid "Tailscale IPv4"
msgstr "IPv4 de Tailscale" 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" msgid "Tailscale IPv6"
msgstr "IPv6 de Tailscale" 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" msgid "Tailscale Login"
msgstr "Inicio de sesión en Tailscale" 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 "" msgid ""
"Tailscale is a mesh VPN solution that makes it easy to connect your " "Tailscale is a mesh VPN solution that makes it easy to connect your "
"devices securely. This configuration page allows you to manage " "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 " "segura de sus dispositivos. Esta página de configuración le permite "
"gestionar los ajustes de Tailscale en su dispositivo OpenWrt." "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" msgid "Tailscale status error"
msgstr "Error de estado de Tailscale" 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 "" msgid ""
"The Tailscale to WAN forwarding is what lets clients send their " "The Tailscale to WAN forwarding is what lets clients send their "
"internet traffic through this device as an Exit Node." "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 " "clientes envíen su tráfico de Internet a través de este dispositivo "
"como nodo de salida." "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." msgid "This can take up to 30 seconds."
msgstr "Esto puede tardar hasta 30 segundos." 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 "" msgid ""
"This will disconnect this device from your Tailnet and require you to " "This will disconnect this device from your Tailnet and require you to "
"re-authenticate." "re-authenticate."
@@ -690,12 +690,12 @@ msgstr ""
"Esto desconectará este dispositivo de su tailnet y requerirá que " "Esto desconectará este dispositivo de su tailnet y requerirá que "
"vuelva a autenticarse." "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:203
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:194 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:254
msgid "Timed out waiting for the firewall reload" msgid "Timed out waiting for the firewall reload"
msgstr "Se agotó el tiempo de espera para la recarga del cortafuegos" 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 "" msgid ""
"UDP port for the Peer Relay service. Open this port on your router " "UDP port for the Peer Relay service. Open this port on your router "
"firewall/NAT." "firewall/NAT."
@@ -703,21 +703,21 @@ msgstr ""
"Puerto UDP para el servicio Peer Relay. Abra este puerto en el " "Puerto UDP para el servicio Peer Relay. Abra este puerto en el "
"cortafuegos/NAT del router." "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:305
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
#: 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 "Unknown error" msgid "Unknown error"
msgstr "Error desconocido" 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" msgid "Version"
msgstr "Versión" 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 "" msgid ""
"When enabled, blocks all inbound connections from the Tailscale " "When enabled, blocks all inbound connections from the Tailscale "
"network." "network."
@@ -725,11 +725,11 @@ msgstr ""
"Cuando está activado, bloquea todas las conexiones entrantes de la " "Cuando está activado, bloquea todas las conexiones entrantes de la "
"red Tailscale." "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." 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." 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 "" msgid ""
"You have unapplied changes. Save & Apply them first so the firewall " "You have unapplied changes. Save & Apply them first so the firewall "
"matches the form." "matches the form."
@@ -737,7 +737,7 @@ msgstr ""
"Tiene cambios sin aplicar. Guárdelos y aplíquelos primero para que el " "Tiene cambios sin aplicar. Guárdelos y aplíquelos primero para que el "
"cortafuegos coincida con el formulario." "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 "" msgid ""
"[Important] Log in to the Tailscale admin console and manually enable " "[Important] Log in to the Tailscale admin console and manually enable "
"\"Subnet Routes\" for this device." "\"Subnet Routes\" for this device."
@@ -746,7 +746,7 @@ msgstr ""
"Tailscale y habilite manualmente \"Subnet Routes\" para este " "Tailscale y habilite manualmente \"Subnet Routes\" para este "
"dispositivo." "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 "" msgid ""
"[Important] Step 3 cannot be done here: it needs your Tailscale " "[Important] Step 3 cannot be done here: it needs your Tailscale "
"account." "account."
@@ -754,7 +754,7 @@ msgstr ""
"[Importante] El paso 3 no se puede realizar aquí: requiere su cuenta " "[Importante] El paso 3 no se puede realizar aquí: requiere su cuenta "
"de Tailscale." "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" msgid "ago"
msgstr "atrás" msgstr "atrás"
+168 -168
View File
@@ -1,25 +1,25 @@
msgid "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n" 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" msgid "%s failed"
msgstr "Niepowodzenie operacji: %s" 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" msgid "(Experimental) Reduce Memory Usage"
msgstr "(Eksperymentalne) Zmniejsz użycie pamięci" 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\"." msgid "1. Enable \"Advertise Exit Node\"."
msgstr "1. Włącz \"Ogłaszaj węzeł wyjścia\"." 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)." msgid "1. Select \"Accept Routes\" (to access remote devices)."
msgstr "" msgstr ""
"1. Wybierz \"Akceptuj trasy\" (aby uzyskać dostęp do zdalnych " "1. Wybierz \"Akceptuj trasy\" (aby uzyskać dostęp do zdalnych "
"urządzeń)." "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 "" msgid ""
"2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic " "2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic "
"to WAN)." "to WAN)."
@@ -27,7 +27,7 @@ msgstr ""
"2. Kliknij \"Automatycznie konfiguruj zaporę\" (przekazuje ruch " "2. Kliknij \"Automatycznie konfiguruj zaporę\" (przekazuje ruch "
"Tailscale do sieci WAN)." "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 "" msgid ""
"2. In \"Advertise Routes\", select your local subnet (to allow remote " "2. In \"Advertise Routes\", select your local subnet (to allow remote "
"devices to access this LAN)." "devices to access this LAN)."
@@ -35,13 +35,13 @@ msgstr ""
"2. W \"Ogłaszaj trasy\" wybierz swoją lokalną podsieć (aby umożliwić " "2. W \"Ogłaszaj trasy\" wybierz swoją lokalną podsieć (aby umożliwić "
"zdalnym urządzaniom dostęp do tej sieci LAN)." "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)." msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)."
msgstr "" msgstr ""
"3. Kliknij \"Automatycznie konfiguruj zaporę\" (aby zezwolić na " "3. Kliknij \"Automatycznie konfiguruj zaporę\" (aby zezwolić na "
"przekazywanie ruchu)." "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 "" msgid ""
"3. In the Tailscale admin console, edit this device under the route " "3. In the Tailscale admin console, edit this device under the route "
"settings and approve it as an Exit Node." "settings and approve it as an Exit Node."
@@ -49,27 +49,27 @@ msgstr ""
"3. W panelu administracyjnym Tailscale edytuj to urządzenie w " "3. W panelu administracyjnym Tailscale edytuj to urządzenie w "
"ustawieniach tras i zatwierdź je jako węzeł wyjścia." "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." 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." 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" msgid "Accept Routes"
msgstr "Akceptuj trasy" 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" msgid "Account Settings"
msgstr "Ustawienia konta" 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" msgid "Advertise Exit Node"
msgstr "Ogłaszaj węzeł wyjścia" 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" msgid "Advertise Routes"
msgstr "Ogłaszaj trasy" 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 "" msgid ""
"Advertise subnet routes behind this device. Select from the detected " "Advertise subnet routes behind this device. Select from the detected "
"subnets below or enter custom routes (comma-separated)." "subnets below or enter custom routes (comma-separated)."
@@ -78,15 +78,15 @@ msgstr ""
"podsieci poniżej lub wprowadź niestandardowe trasy (oddzielone " "podsieci poniżej lub wprowadź niestandardowe trasy (oddzielone "
"przecinkami)." "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" msgid "Allow LAN Access"
msgstr "Zezwól na dostęp do LAN" 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." msgid "Allow accepting routes announced by other nodes."
msgstr "Zezwól na akceptowanie tras ogłaszanych przez inne węzły." 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." 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." 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" msgid "Allow user access to tailscale"
msgstr "Zezwól użytkownikowi na dostęp do 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" msgid "Another firewall reload is already running"
msgstr "Trwa już ponowne ładowanie zapory" 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?" msgid "Are you sure you want to log out?"
msgstr "Czy na pewno chcesz się wylogować?" 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" msgid "Auto Configure Firewall"
msgstr "Automatycznie konfiguruj zaporę" 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" msgid "Cancel"
msgstr "Anuluj" 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." msgid "Click to Log out account on this device."
msgstr "Kliknij, aby wylogować konto z tego urządzenia." 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." msgid "Click to get a login URL for this device."
msgstr "Kliknij, aby uzyskać URL logowania dla tego urządzenia." 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:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:383 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:443
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:591 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:631
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:850 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:890
msgid "Collecting data ..." msgid "Collecting data ..."
msgstr "Zbieranie danych ..." 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 "" msgid ""
"Configuration committed, reloading network and firewall. This can " "Configuration committed, reloading network and firewall. This can "
"take a moment." "take a moment."
@@ -133,23 +133,23 @@ msgstr ""
"Konfiguracja została zatwierdzona, ponowne ładowanie sieci i zapory. " "Konfiguracja została zatwierdzona, ponowne ładowanie sieci i zapory. "
"Może to chwilę potrwać." "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" msgid "Configuring firewall"
msgstr "Konfigurowanie zapory" 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" msgid "Confirm Logout"
msgstr "Potwierdź wylogowanie" 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" msgid "Connection Info"
msgstr "Informacje o połączeniu" 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." msgid "Controls how Tailscale DNS is handled."
msgstr "Kontroluje sposób obsługi DNS Tailscale." 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 "" msgid ""
"Could not open a new tab. Please check if your browser or an " "Could not open a new tab. Please check if your browser or an "
"extension blocked the pop-up." "extension blocked the pop-up."
@@ -157,43 +157,43 @@ msgstr ""
"Nie można otworzyć nowej karty. Sprawdź, czy przeglądarka lub " "Nie można otworzyć nowej karty. Sprawdź, czy przeglądarka lub "
"rozszerzenie zablokowało wyskakujące okno." "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" msgid "Custom Login Server"
msgstr "Niestandardowy serwer logowania" 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" msgid "Custom Login Server Auth Key"
msgstr "Klucz autoryzacji niestandardowego serwera logowania" 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" msgid "DNS Mode"
msgstr "Tryb DNS" 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" msgid "Daemon MTU"
msgstr "MTU demona" 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" msgid "Daemon Settings"
msgstr "Ustawienia demona" 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." msgid "Declare this device as an Exit Node."
msgstr "Deklaruje to urządzenie jako węzeł wyjścia." 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" msgid "Devices List"
msgstr "Lista urządzeń" 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" msgid "Disable Firewall Configuration"
msgstr "Wyłącz konfigurację zapory" 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" msgid "Disable SNAT"
msgstr "Wyłącz 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 "" msgid ""
"Disable Source NAT (SNAT) for traffic to advertised routes. Most " "Disable Source NAT (SNAT) for traffic to advertised routes. Most "
"users should leave this unchecked." "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ść " "Wyłącz NAT źródłowy (SNAT) dla ruchu do ogłaszanych tras. Większość "
"użytkowników powinna zostawić to pole niezaznaczone." "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)." msgid "Disable Tailscale netfilter auto-configuration (--netfilter-mode=off)."
msgstr "" msgstr ""
"Wyłącz automatyczną konfigurację netfilter Tailscale " "Wyłącz automatyczną konfigurację netfilter Tailscale "
"(--netfilter-mode=off)." "(--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:85
#: 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 "Disabled" msgid "Disabled"
msgstr "Wyłączone" 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." msgid "Disabled: system DNS only."
msgstr "Wyłączone: tylko DNS systemowy." 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." msgid "Disconnect from Tailscale and expire current node key."
msgstr "Rozłącz z Tailscale i wygaś bieżący klucz węzła." 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" msgid "Empty reply from server"
msgstr "Pusta odpowiedź z serwera" 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" msgid "Enable Peer Relay"
msgstr "Włącz przekazywanie między węzłami" 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" msgid "Enable Tailscale SSH"
msgstr "Włącz SSH Tailscale" 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" msgid "Enable Tailscale Service"
msgstr "Włącz usługę Tailscale" 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" msgid "Enable Web Interface"
msgstr "Włącz interfejs webowy" 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 "" msgid ""
"Enable or disable the Tailscale service. When disabled, the service " "Enable or disable the Tailscale service. When disabled, the service "
"will be stopped and the process will be killed." "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 " "Włącz lub wyłącz usługę Tailscale. Po wyłączeniu usługa zostanie "
"zatrzymana, a proces zostanie zakończony." "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 "" msgid ""
"Enable this device as a Peer Relay server. Requires a public IP and " "Enable this device as a Peer Relay server. Requires a public IP and "
"an UDP port open on the router." "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 " "Włącz to urządzenie jako serwer przekazywania między węzłami. Wymaga "
"publicznego IP i otwartego portu UDP na routerze." "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" msgid "Enabled"
msgstr "Włączone" 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 "" msgid ""
"Enabling this option can reduce memory usage, but it may sacrifice " "Enabling this option can reduce memory usage, but it may sacrifice "
"some performance (set GOGC=10)." "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 " "Włączenie tej opcji może zmniejszyć użycie pamięci, ale może to "
"wpłynąć na wydajność (ustawia GOGC=10)." "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" msgid "Error"
msgstr "Błąd" 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" msgid "Error caching DERP region map: %s"
msgstr "Błąd buforowania mapy regionu DERP: %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" msgid "Error fetching DERP region map: %s"
msgstr "Błąd pobierania mapy regionu DERP: %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" msgid "Error reading cached DERP region map: %s"
msgstr "Błąd odczytywania buforowanej mapy regionu DERP: %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 "" msgid ""
"Essential configuration for Subnet Routing (Site-to-Site) and Exit " "Essential configuration for Subnet Routing (Site-to-Site) and Exit "
"Node features." "Node features."
@@ -292,12 +292,12 @@ msgstr ""
"Podstawowa konfiguracja dla funkcji routingu podsieci (Site-to-Site) " "Podstawowa konfiguracja dla funkcji routingu podsieci (Site-to-Site) "
"i węzła wyjścia." "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:484
#: 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 "Exit Node" msgid "Exit Node"
msgstr "Węzeł wyjścia" 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 "" msgid ""
"Expose a web interface on port 5252 for managing this node over " "Expose a web interface on port 5252 for managing this node over "
"Tailscale." "Tailscale."
@@ -305,64 +305,64 @@ msgstr ""
"Udostępnij interfejs webowy na porcie 5252 do zarządzania tym węzłem " "Udostępnij interfejs webowy na porcie 5252 do zarządzania tym węzłem "
"przez Tailscale." "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" msgid "Failed to configure firewall: %s"
msgstr "Nie udało się skonfigurować zapory: %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." msgid "Failed to get login URL. You may close this tab."
msgstr "Nie udało się uzyskać URL logowania. Możesz zamknąć tę kartę." 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:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
msgid "Failed to get login URL: %s" msgid "Failed to get login URL: %s"
msgstr "Nie udało się uzyskać URL logowania: %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" msgid "Failed to load logs: %s"
msgstr "Nie udało się załadować logów: %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..." msgid "Filter peers by name, IP, or OS..."
msgstr "Filtruj węzły po nazwie, IP lub systemie operacyjnym..." 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:" msgid "Filter:"
msgstr "Filtruj:" 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" msgid "Firewall Mode"
msgstr "Tryb zapory" 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." msgid "Firewall configuration already applied."
msgstr "Konfiguracja zapory jest już zastosowana." 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." msgid "Firewall configuration applied."
msgstr "Zastosowano konfigurację zapory." 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" msgid "Firewall reload failed"
msgstr "Nie udało się ponownie załadować zapory" 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" msgid "General Settings"
msgstr "Ustawienia ogólne" 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" msgid "Hostname"
msgstr "Nazwa hosta" 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?" msgid "How to enable Exit Node?"
msgstr "Jak włączyć węzeł wyjścia?" 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?" msgid "How to enable Site-to-Site?"
msgstr "Jak włączyć 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 "" msgid ""
"If the timeout is displayed, you can refresh the page and click Login " "If the timeout is displayed, you can refresh the page and click Login "
"again." "again."
@@ -370,7 +370,7 @@ msgstr ""
"Jeśli wyświetlany jest komunikat o przekroczeniu limitu czasu, możesz " "Jeśli wyświetlany jest komunikat o przekroczeniu limitu czasu, możesz "
"odświeżyć stronę i kliknąć Zaloguj ponownie." "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 "" msgid ""
"If you are using custom login server but not providing an Auth Key, " "If you are using custom login server but not providing an Auth Key, "
"will redirect to the login page without pre-filling the 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 " "podajesz klucza autoryzacji, nastąpi przekierowanie do strony "
"logowania bez wypełniania klucza." "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" msgid "Invalid Date"
msgstr "Nieprawidłowa data" 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." msgid "Invalid response from server."
msgstr "Nieprawidłowa odpowiedź z serwera." 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 "" msgid ""
"It creates the tailscale interface, adds it to a firewall zone, and " "It creates the tailscale interface, adds it to a firewall zone, and "
"sets up forwarding between LAN and Tailscale, plus Tailscale to WAN." "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 " "przekazywanie między sieciami LAN i Tailscale oraz z Tailscale do "
"sieci WAN." "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" msgid "Just now"
msgstr "Przed chwilą" 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" msgid "LOGGED OUT"
msgstr "WYLOGOWANO" 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" msgid "Last Seen"
msgstr "Ostatnia aktywność" 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." msgid "Leave blank for default Tailscale control plane."
msgstr "Pozostaw puste dla domyślnego panelu kontrolnego Tailscale." 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" msgid "Loading logs"
msgstr "Ładowanie logów" 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..." msgid "Logging out..."
msgstr "Wylogowywanie..." 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" msgid "Login"
msgstr "Zaloguj" 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:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:815 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:855
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:823 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:863
msgid "Logout" msgid "Logout"
msgstr "Wyloguj" 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" msgid "Logout failed: %s"
msgstr "Wylogowanie nie powiodło się: %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" msgid "Logs"
msgstr "Logi" 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." msgid "MagicDNS: Tailscale overrides resolv.conf."
msgstr "MagicDNS: Tailscale nadpisuje 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 "" msgid ""
"Masquerading and MSS Clamping (MTU fix) are enabled to keep " "Masquerading and MSS Clamping (MTU fix) are enabled to keep "
"connections stable." "connections stable."
@@ -450,62 +450,62 @@ msgstr ""
"Maskowanie i MSS Clamping (korekta MTU) są włączone, aby połączenia " "Maskowanie i MSS Clamping (korekta MTU) są włączone, aby połączenia "
"pozostały stabilne." "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" msgid "N/A"
msgstr "Niedostępne" 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" msgid "NOT RUNNING"
msgstr "NIE DZIAŁA" 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." msgid "No matching peer devices found."
msgstr "Nie znaleziono pasujących urządzeń partnerskich." 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." msgid "No peer devices found."
msgstr "Nie znaleziono urządzeń partnerskich." 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:428
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:880
msgid "No tailscale-related logs found." msgid "No tailscale-related logs found."
msgstr "Nie znaleziono logów związanych z Tailscale." 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" msgid "None"
msgstr "Brak" 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" msgid "Now"
msgstr "Teraz" 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" msgid "OS"
msgstr "System operacyjny" 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" msgid "Offline"
msgstr "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" msgid "Online"
msgstr "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" msgid "OpenWrt Forward"
msgstr "Przekazywanie OpenWrt" 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)" msgid "OpenWrt Forward: MagicDNS via dnsmasq forwarding.(Only support ts.net)"
msgstr "" msgstr ""
"Przekazywanie OpenWrt: MagicDNS przez przekazywanie dnsmasq. " "Przekazywanie OpenWrt: MagicDNS przez przekazywanie dnsmasq. "
"(Obsługuje tylko ts.net)" "(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" msgid "Operation"
msgstr "Operacja" 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 "" msgid ""
"Optional: Specify a custom control server URL (e.g., a Headscale " "Optional: Specify a custom control server URL (e.g., a Headscale "
"instance, %s)." "instance, %s)."
@@ -513,7 +513,7 @@ msgstr ""
"Opcjonalne: Podaj niestandardowy URL serwera kontrolnego (np. " "Opcjonalne: Podaj niestandardowy URL serwera kontrolnego (np. "
"instancja Headscale, %s)." "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 "" msgid ""
"Optional: Specify an authentication key for the custom control " "Optional: Specify an authentication key for the custom control "
"server. Leave blank if not required." "server. Leave blank if not required."
@@ -521,48 +521,48 @@ msgstr ""
"Opcjonalne: Podaj klucz autoryzacji dla niestandardowego serwera " "Opcjonalne: Podaj klucz autoryzacji dla niestandardowego serwera "
"kontrolnego. Pozostaw puste, jeśli nie jest wymagany." "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" msgid "Peer Relay Port"
msgstr "Port przekazywania między węzłami" 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." msgid "Please use the login button in the settings below to authenticate."
msgstr "" msgstr ""
"Użyj przycisku logowania w ustawieniach poniżej, aby się " "Użyj przycisku logowania w ustawieniach poniżej, aby się "
"uwierzytelnić." "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: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." msgid "Please wait."
msgstr "Proszę czekać." 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" msgid "RUNNING"
msgstr "DZIAŁA" 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" msgid "RX"
msgstr "Odbieranie" 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" msgid "Refresh"
msgstr "Odśwież" 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..." msgid "Reloading firewall..."
msgstr "Ponowne ładowanie zapory..." 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:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
msgid "Requesting Login URL..." msgid "Requesting Login URL..."
msgstr "Pobieranie URL logowania..." 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." msgid "Requesting Tailscale login URL... Please wait."
msgstr "Pobieranie URL logowania Tailscale... Proszę czekać." 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 "" msgid ""
"Select an exit node from the list. If enabled, Allow LAN Access is " "Select an exit node from the list. If enabled, Allow LAN Access is "
"enabled implicitly." "enabled implicitly."
@@ -570,7 +570,7 @@ msgstr ""
"Wybierz węzeł wyjścia z listy. Jeśli włączony, dostęp do LAN jest " "Wybierz węzeł wyjścia z listy. Jeśli włączony, dostęp do LAN jest "
"automatycznie włączony." "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 "" msgid ""
"Select the firewall backend for Tailscale to use. Requires service " "Select the firewall backend for Tailscale to use. Requires service "
"restart to take effect." "restart to take effect."
@@ -578,14 +578,14 @@ msgstr ""
"Wybierz mechanizm zapory dla Tailscale. Wymaga restartu usługi, aby " "Wybierz mechanizm zapory dla Tailscale. Wymaga restartu usługi, aby "
"zmiany zaczęły obowiązywać." "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:380
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:328 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:388
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:340 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: 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 "Service Status" msgid "Service Status"
msgstr "Status usługi" 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 "" msgid ""
"Set a custom MTU for the Tailscale daemon. Leave blank to use the " "Set a custom MTU for the Tailscale daemon. Leave blank to use the "
"default value." "default value."
@@ -593,60 +593,60 @@ msgstr ""
"Ustaw niestandardowe MTU dla demona Tailscale. Pozostaw puste, aby " "Ustaw niestandardowe MTU dla demona Tailscale. Pozostaw puste, aby "
"użyć wartości domyślnej." "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" msgid "Shields Up"
msgstr "Blokuj połączenia przychodzące" 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" msgid "Status"
msgstr "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." msgid "Successfully logged out."
msgstr "Pomyślnie wylogowano." 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" msgid "TAILSCALE NOT FOUND"
msgstr "NIE ZNALEZIONO TAILSCALE" 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" msgid "TUN Mode"
msgstr "Tryb TUN" 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" msgid "TX"
msgstr "Wysyłanie" 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" msgid "Tailnet Name"
msgstr "Nazwa Tailnet" 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 #: luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:1
msgid "Tailscale" msgid "Tailscale"
msgstr "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" msgid "Tailscale Health Check: %s"
msgstr "Kontrola stanu Tailscale: %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" msgid "Tailscale IP"
msgstr "IP Tailscale" 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" msgid "Tailscale IPv4"
msgstr "IPv4 Tailscale" 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" msgid "Tailscale IPv6"
msgstr "IPv6 Tailscale" 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" msgid "Tailscale Login"
msgstr "Logowanie Tailscale" 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 "" msgid ""
"Tailscale is a mesh VPN solution that makes it easy to connect your " "Tailscale is a mesh VPN solution that makes it easy to connect your "
"devices securely. This configuration page allows you to manage " "devices securely. This configuration page allows you to manage "
@@ -656,11 +656,11 @@ msgstr ""
"urządzeń. Ta strona konfiguracyjna pozwala zarządzać ustawieniami " "urządzeń. Ta strona konfiguracyjna pozwala zarządzać ustawieniami "
"Tailscale na urządzeniu OpenWrt." "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" msgid "Tailscale status error"
msgstr "Błąd statusu Tailscale" 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 "" msgid ""
"The Tailscale to WAN forwarding is what lets clients send their " "The Tailscale to WAN forwarding is what lets clients send their "
"internet traffic through this device as an Exit Node." "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 " "Przekazywanie z Tailscale do sieci WAN pozwala klientom wysyłać ruch "
"internetowy przez to urządzenie jako węzeł wyjścia." "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." msgid "This can take up to 30 seconds."
msgstr "Może to potrwać do 30 sekund." 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 "" msgid ""
"This will disconnect this device from your Tailnet and require you to " "This will disconnect this device from your Tailnet and require you to "
"re-authenticate." "re-authenticate."
@@ -680,12 +680,12 @@ msgstr ""
"Spowoduje to rozłączenie tego urządzenia z Twojego Tailnet i wymaga " "Spowoduje to rozłączenie tego urządzenia z Twojego Tailnet i wymaga "
"ponownego uwierzytelnienia." "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:203
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:194 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:254
msgid "Timed out waiting for the firewall reload" msgid "Timed out waiting for the firewall reload"
msgstr "Upłynął limit czasu oczekiwania na ponowne załadowanie zapory" 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 "" msgid ""
"UDP port for the Peer Relay service. Open this port on your router " "UDP port for the Peer Relay service. Open this port on your router "
"firewall/NAT." "firewall/NAT."
@@ -693,21 +693,21 @@ msgstr ""
"Port UDP dla usługi przekazywania między węzłami. Otwórz ten port w " "Port UDP dla usługi przekazywania między węzłami. Otwórz ten port w "
"zaporze/NAT na routerze." "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:305
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
#: 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 "Unknown error" msgid "Unknown error"
msgstr "Nieznany błąd" 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" msgid "Version"
msgstr "Wersja" 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 "" msgid ""
"When enabled, blocks all inbound connections from the Tailscale " "When enabled, blocks all inbound connections from the Tailscale "
"network." "network."
@@ -715,13 +715,13 @@ msgstr ""
"Po włączeniu blokuje wszystkie połączenia przychodzące z sieci " "Po włączeniu blokuje wszystkie połączenia przychodzące z sieci "
"Tailscale." "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." msgid "When using the exit node, access to the local LAN is allowed."
msgstr "" msgstr ""
"Podczas korzystania z węzła wyjścia dozwolony jest dostęp do " "Podczas korzystania z węzła wyjścia dozwolony jest dostęp do "
"lokalnego LAN." "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 "" msgid ""
"You have unapplied changes. Save & Apply them first so the firewall " "You have unapplied changes. Save & Apply them first so the firewall "
"matches the form." "matches the form."
@@ -729,7 +729,7 @@ msgstr ""
"Masz niezastosowane zmiany. Najpierw je zapisz i zastosuj, aby zapora " "Masz niezastosowane zmiany. Najpierw je zapisz i zastosuj, aby zapora "
"była zgodna z formularzem." "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 "" msgid ""
"[Important] Log in to the Tailscale admin console and manually enable " "[Important] Log in to the Tailscale admin console and manually enable "
"\"Subnet Routes\" for this device." "\"Subnet Routes\" for this device."
@@ -737,7 +737,7 @@ msgstr ""
"[Ważne] Zaloguj się do panelu administracyjnego Tailscale i ręcznie " "[Ważne] Zaloguj się do panelu administracyjnego Tailscale i ręcznie "
"włącz \"Trasy podsieci\" dla tego urządzenia." "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 "" msgid ""
"[Important] Step 3 cannot be done here: it needs your Tailscale " "[Important] Step 3 cannot be done here: it needs your Tailscale "
"account." "account."
@@ -745,7 +745,7 @@ msgstr ""
"[Ważne] Kroku 3 nie można wykonać tutaj: wymaga Twojego konta " "[Ważne] Kroku 3 nie można wykonać tutaj: wymaga Twojego konta "
"Tailscale." "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" msgid "ago"
msgstr "temu" msgstr "temu"
@@ -1,79 +1,79 @@
msgid "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8" 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" msgid "%s failed"
msgstr "" 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" msgid "(Experimental) Reduce Memory Usage"
msgstr "" 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\"." msgid "1. Enable \"Advertise Exit Node\"."
msgstr "" 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)." msgid "1. Select \"Accept Routes\" (to access remote devices)."
msgstr "" 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 "" msgid ""
"2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic " "2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic "
"to WAN)." "to WAN)."
msgstr "" 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 "" msgid ""
"2. In \"Advertise Routes\", select your local subnet (to allow remote " "2. In \"Advertise Routes\", select your local subnet (to allow remote "
"devices to access this LAN)." "devices to access this LAN)."
msgstr "" 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)." msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)."
msgstr "" 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 "" msgid ""
"3. In the Tailscale admin console, edit this device under the route " "3. In the Tailscale admin console, edit this device under the route "
"settings and approve it as an Exit Node." "settings and approve it as an Exit Node."
msgstr "" 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." msgid "4. On the client, set this device as its exit node."
msgstr "" 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" msgid "Accept Routes"
msgstr "" 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" msgid "Account Settings"
msgstr "" 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" msgid "Advertise Exit Node"
msgstr "" 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" msgid "Advertise Routes"
msgstr "" 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 "" msgid ""
"Advertise subnet routes behind this device. Select from the detected " "Advertise subnet routes behind this device. Select from the detected "
"subnets below or enter custom routes (comma-separated)." "subnets below or enter custom routes (comma-separated)."
msgstr "" 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" msgid "Allow LAN Access"
msgstr "" 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." msgid "Allow accepting routes announced by other nodes."
msgstr "" 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." msgid "Allow connecting to this device through the SSH function of Tailscale."
msgstr "" msgstr ""
@@ -81,596 +81,596 @@ msgstr ""
msgid "Allow user access to tailscale" msgid "Allow user access to tailscale"
msgstr "" 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" msgid "Another firewall reload is already running"
msgstr "" 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?" msgid "Are you sure you want to log out?"
msgstr "" 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" msgid "Auto Configure Firewall"
msgstr "" 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" msgid "Cancel"
msgstr "" 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." msgid "Click to Log out account on this device."
msgstr "" 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." msgid "Click to get a login URL for this device."
msgstr "" msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:291 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:383 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:443
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:591 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:631
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:850 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:890
msgid "Collecting data ..." msgid "Collecting data ..."
msgstr "" 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 "" msgid ""
"Configuration committed, reloading network and firewall. This can " "Configuration committed, reloading network and firewall. This can "
"take a moment." "take a moment."
msgstr "" 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" msgid "Configuring firewall"
msgstr "" 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" msgid "Confirm Logout"
msgstr "" 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" msgid "Connection Info"
msgstr "" 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." msgid "Controls how Tailscale DNS is handled."
msgstr "" 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 "" msgid ""
"Could not open a new tab. Please check if your browser or an " "Could not open a new tab. Please check if your browser or an "
"extension blocked the pop-up." "extension blocked the pop-up."
msgstr "" 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" msgid "Custom Login Server"
msgstr "" 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" msgid "Custom Login Server Auth Key"
msgstr "" 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" msgid "DNS Mode"
msgstr "" 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" msgid "Daemon MTU"
msgstr "" 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" msgid "Daemon Settings"
msgstr "" 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." msgid "Declare this device as an Exit Node."
msgstr "" 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" msgid "Devices List"
msgstr "" 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" msgid "Disable Firewall Configuration"
msgstr "" 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" msgid "Disable SNAT"
msgstr "" 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 "" msgid ""
"Disable Source NAT (SNAT) for traffic to advertised routes. Most " "Disable Source NAT (SNAT) for traffic to advertised routes. Most "
"users should leave this unchecked." "users should leave this unchecked."
msgstr "" 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)." msgid "Disable Tailscale netfilter auto-configuration (--netfilter-mode=off)."
msgstr "" 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
#: 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 "Disabled" msgid "Disabled"
msgstr "" 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." msgid "Disabled: system DNS only."
msgstr "" 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." msgid "Disconnect from Tailscale and expire current node key."
msgstr "" 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" msgid "Empty reply from server"
msgstr "" 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" msgid "Enable Peer Relay"
msgstr "" 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" msgid "Enable Tailscale SSH"
msgstr "" 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" msgid "Enable Tailscale Service"
msgstr "" 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" msgid "Enable Web Interface"
msgstr "" 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 "" msgid ""
"Enable or disable the Tailscale service. When disabled, the service " "Enable or disable the Tailscale service. When disabled, the service "
"will be stopped and the process will be killed." "will be stopped and the process will be killed."
msgstr "" 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 "" msgid ""
"Enable this device as a Peer Relay server. Requires a public IP and " "Enable this device as a Peer Relay server. Requires a public IP and "
"an UDP port open on the router." "an UDP port open on the router."
msgstr "" 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" msgid "Enabled"
msgstr "" 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 "" msgid ""
"Enabling this option can reduce memory usage, but it may sacrifice " "Enabling this option can reduce memory usage, but it may sacrifice "
"some performance (set GOGC=10)." "some performance (set GOGC=10)."
msgstr "" 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" msgid "Error"
msgstr "" 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" msgid "Error caching DERP region map: %s"
msgstr "" 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" msgid "Error fetching DERP region map: %s"
msgstr "" 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" msgid "Error reading cached DERP region map: %s"
msgstr "" 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 "" msgid ""
"Essential configuration for Subnet Routing (Site-to-Site) and Exit " "Essential configuration for Subnet Routing (Site-to-Site) and Exit "
"Node features." "Node features."
msgstr "" 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
#: 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 "Exit Node" msgid "Exit Node"
msgstr "" 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 "" msgid ""
"Expose a web interface on port 5252 for managing this node over " "Expose a web interface on port 5252 for managing this node over "
"Tailscale." "Tailscale."
msgstr "" 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" msgid "Failed to configure firewall: %s"
msgstr "" 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." msgid "Failed to get login URL. You may close this tab."
msgstr "" 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
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
msgid "Failed to get login URL: %s" msgid "Failed to get login URL: %s"
msgstr "" 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" msgid "Failed to load logs: %s"
msgstr "" 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..." msgid "Filter peers by name, IP, or OS..."
msgstr "" 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:" msgid "Filter:"
msgstr "" 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" msgid "Firewall Mode"
msgstr "" 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." msgid "Firewall configuration already applied."
msgstr "" 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." msgid "Firewall configuration applied."
msgstr "" 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" msgid "Firewall reload failed"
msgstr "" 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" msgid "General Settings"
msgstr "" 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" msgid "Hostname"
msgstr "" 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?" msgid "How to enable Exit Node?"
msgstr "" 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?" msgid "How to enable Site-to-Site?"
msgstr "" 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 "" msgid ""
"If the timeout is displayed, you can refresh the page and click Login " "If the timeout is displayed, you can refresh the page and click Login "
"again." "again."
msgstr "" 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 "" msgid ""
"If you are using custom login server but not providing an Auth Key, " "If you are using custom login server but not providing an Auth Key, "
"will redirect to the login page without pre-filling the key." "will redirect to the login page without pre-filling the key."
msgstr "" 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" msgid "Invalid Date"
msgstr "" 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." msgid "Invalid response from server."
msgstr "" 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 "" msgid ""
"It creates the tailscale interface, adds it to a firewall zone, and " "It creates the tailscale interface, adds it to a firewall zone, and "
"sets up forwarding between LAN and Tailscale, plus Tailscale to WAN." "sets up forwarding between LAN and Tailscale, plus Tailscale to WAN."
msgstr "" 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" msgid "Just now"
msgstr "" 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" msgid "LOGGED OUT"
msgstr "" 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" msgid "Last Seen"
msgstr "" 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." msgid "Leave blank for default Tailscale control plane."
msgstr "" 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" msgid "Loading logs"
msgstr "" 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..." msgid "Logging out..."
msgstr "" 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" msgid "Login"
msgstr "" msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:749 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:815 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:855
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:823 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:863
msgid "Logout" msgid "Logout"
msgstr "" 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" msgid "Logout failed: %s"
msgstr "" 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" msgid "Logs"
msgstr "" 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." msgid "MagicDNS: Tailscale overrides resolv.conf."
msgstr "" 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 "" msgid ""
"Masquerading and MSS Clamping (MTU fix) are enabled to keep " "Masquerading and MSS Clamping (MTU fix) are enabled to keep "
"connections stable." "connections stable."
msgstr "" 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" msgid "N/A"
msgstr "" 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" msgid "NOT RUNNING"
msgstr "" 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." msgid "No matching peer devices found."
msgstr "" 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." msgid "No peer devices found."
msgstr "" msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:368 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:428
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:880
msgid "No tailscale-related logs found." msgid "No tailscale-related logs found."
msgstr "" 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" msgid "None"
msgstr "" 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" msgid "Now"
msgstr "" 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" msgid "OS"
msgstr "" 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" msgid "Offline"
msgstr "" 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" msgid "Online"
msgstr "" 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" msgid "OpenWrt Forward"
msgstr "" 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)" msgid "OpenWrt Forward: MagicDNS via dnsmasq forwarding.(Only support ts.net)"
msgstr "" 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" msgid "Operation"
msgstr "" 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 "" msgid ""
"Optional: Specify a custom control server URL (e.g., a Headscale " "Optional: Specify a custom control server URL (e.g., a Headscale "
"instance, %s)." "instance, %s)."
msgstr "" 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 "" msgid ""
"Optional: Specify an authentication key for the custom control " "Optional: Specify an authentication key for the custom control "
"server. Leave blank if not required." "server. Leave blank if not required."
msgstr "" 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" msgid "Peer Relay Port"
msgstr "" 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." msgid "Please use the login button in the settings below to authenticate."
msgstr "" 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: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." msgid "Please wait."
msgstr "" 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" msgid "RUNNING"
msgstr "" 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" msgid "RX"
msgstr "" 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" msgid "Refresh"
msgstr "" 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..." msgid "Reloading firewall..."
msgstr "" msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:772 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
msgid "Requesting Login URL..." msgid "Requesting Login URL..."
msgstr "" 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." msgid "Requesting Tailscale login URL... Please wait."
msgstr "" 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 "" msgid ""
"Select an exit node from the list. If enabled, Allow LAN Access is " "Select an exit node from the list. If enabled, Allow LAN Access is "
"enabled implicitly." "enabled implicitly."
msgstr "" 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 "" msgid ""
"Select the firewall backend for Tailscale to use. Requires service " "Select the firewall backend for Tailscale to use. Requires service "
"restart to take effect." "restart to take effect."
msgstr "" msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:320 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:380
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:328 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:388
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:340 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: 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 "Service Status" msgid "Service Status"
msgstr "" 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 "" msgid ""
"Set a custom MTU for the Tailscale daemon. Leave blank to use the " "Set a custom MTU for the Tailscale daemon. Leave blank to use the "
"default value." "default value."
msgstr "" 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" msgid "Shields Up"
msgstr "" 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" msgid "Status"
msgstr "" 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." msgid "Successfully logged out."
msgstr "" 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" msgid "TAILSCALE NOT FOUND"
msgstr "" 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" msgid "TUN Mode"
msgstr "" 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" msgid "TX"
msgstr "" 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" msgid "Tailnet Name"
msgstr "" 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 #: luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:1
msgid "Tailscale" msgid "Tailscale"
msgstr "" 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" msgid "Tailscale Health Check: %s"
msgstr "" 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" msgid "Tailscale IP"
msgstr "" 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" msgid "Tailscale IPv4"
msgstr "" 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" msgid "Tailscale IPv6"
msgstr "" 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" msgid "Tailscale Login"
msgstr "" 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 "" msgid ""
"Tailscale is a mesh VPN solution that makes it easy to connect your " "Tailscale is a mesh VPN solution that makes it easy to connect your "
"devices securely. This configuration page allows you to manage " "devices securely. This configuration page allows you to manage "
"Tailscale settings on your OpenWrt device." "Tailscale settings on your OpenWrt device."
msgstr "" 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" msgid "Tailscale status error"
msgstr "" 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 "" msgid ""
"The Tailscale to WAN forwarding is what lets clients send their " "The Tailscale to WAN forwarding is what lets clients send their "
"internet traffic through this device as an Exit Node." "internet traffic through this device as an Exit Node."
msgstr "" 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." msgid "This can take up to 30 seconds."
msgstr "" 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 "" msgid ""
"This will disconnect this device from your Tailnet and require you to " "This will disconnect this device from your Tailnet and require you to "
"re-authenticate." "re-authenticate."
msgstr "" msgstr ""
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:143 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:203
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:194 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:254
msgid "Timed out waiting for the firewall reload" msgid "Timed out waiting for the firewall reload"
msgstr "" 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 "" msgid ""
"UDP port for the Peer Relay service. Open this port on your router " "UDP port for the Peer Relay service. Open this port on your router "
"firewall/NAT." "firewall/NAT."
msgstr "" 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
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
#: 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 "Unknown error" msgid "Unknown error"
msgstr "" 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" msgid "Version"
msgstr "" 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 "" msgid ""
"When enabled, blocks all inbound connections from the Tailscale " "When enabled, blocks all inbound connections from the Tailscale "
"network." "network."
msgstr "" 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." msgid "When using the exit node, access to the local LAN is allowed."
msgstr "" 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 "" msgid ""
"You have unapplied changes. Save & Apply them first so the firewall " "You have unapplied changes. Save & Apply them first so the firewall "
"matches the form." "matches the form."
msgstr "" 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 "" msgid ""
"[Important] Log in to the Tailscale admin console and manually enable " "[Important] Log in to the Tailscale admin console and manually enable "
"\"Subnet Routes\" for this device." "\"Subnet Routes\" for this device."
msgstr "" 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 "" msgid ""
"[Important] Step 3 cannot be done here: it needs your Tailscale " "[Important] Step 3 cannot be done here: it needs your Tailscale "
"account." "account."
msgstr "" 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" msgid "ago"
msgstr "" msgstr ""
@@ -1,79 +1,79 @@
msgid "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n" 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" msgid "%s failed"
msgstr "%s失败" 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" msgid "(Experimental) Reduce Memory Usage"
msgstr "(实验性) 减少内存使用" 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\"." msgid "1. Enable \"Advertise Exit Node\"."
msgstr "1. 勾选 \"通告出口节点\"。" 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)." msgid "1. Select \"Accept Routes\" (to access remote devices)."
msgstr "1. 勾选 \"接受路由\" (以访问远程设备)。" 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 "" msgid ""
"2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic " "2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic "
"to WAN)." "to WAN)."
msgstr "2. 点击 \"自动配置防火墙\" (它会将 Tailscale 流量转发到 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 "" msgid ""
"2. In \"Advertise Routes\", select your local subnet (to allow remote " "2. In \"Advertise Routes\", select your local subnet (to allow remote "
"devices to access this LAN)." "devices to access this LAN)."
msgstr "2. 在 \"通告路由\" 中选择本地子网 (让远程设备能访问本局域网)。" 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)." msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)."
msgstr "3. 点击 \"自动配置防火墙\" (打通防火墙转发)。" 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 "" msgid ""
"3. In the Tailscale admin console, edit this device under the route " "3. In the Tailscale admin console, edit this device under the route "
"settings and approve it as an Exit Node." "settings and approve it as an Exit Node."
msgstr "3. 在 Tailscale 管理控制台的路由设置中编辑此设备,并批准其为出口节点。" 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." msgid "4. On the client, set this device as its exit node."
msgstr "4. 在客户端上,将此设备设为出口节点。" 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" msgid "Accept Routes"
msgstr "接受路由" 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" msgid "Account Settings"
msgstr "账户设置" 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" msgid "Advertise Exit Node"
msgstr "通告出口节点" 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" msgid "Advertise Routes"
msgstr "通告路由" 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 "" msgid ""
"Advertise subnet routes behind this device. Select from the detected " "Advertise subnet routes behind this device. Select from the detected "
"subnets below or enter custom routes (comma-separated)." "subnets below or enter custom routes (comma-separated)."
msgstr "通告此设备后的子网路由。从下面的子网中选择,或输入自定义路由 (逗号分隔)。" 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" msgid "Allow LAN Access"
msgstr "允许访问局域网" 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." msgid "Allow accepting routes announced by other nodes."
msgstr "允许接受由其他节点通告的路由。" 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." msgid "Allow connecting to this device through the SSH function of Tailscale."
msgstr "允许通过 Tailscale 的 SSH 功能连接到此设备。" msgstr "允许通过 Tailscale 的 SSH 功能连接到此设备。"
@@ -81,277 +81,277 @@ msgstr "允许通过 Tailscale 的 SSH 功能连接到此设备。"
msgid "Allow user access to tailscale" msgid "Allow user access to tailscale"
msgstr "允许用户访问 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" msgid "Another firewall reload is already running"
msgstr "另一个防火墙重新加载任务正在进行中" 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?" msgid "Are you sure you want to log out?"
msgstr "您确定要登出吗?" 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" msgid "Auto Configure Firewall"
msgstr "自动配置防火墙" 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" msgid "Cancel"
msgstr "取消" 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." msgid "Click to Log out account on this device."
msgstr "点击以登出此设备上的账户。" 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." msgid "Click to get a login URL for this device."
msgstr "点击获取此设备的登录 URL。" 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:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:383 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:443
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:591 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:631
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:850 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:890
msgid "Collecting data ..." msgid "Collecting data ..."
msgstr "正在收集数据..." 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 "" msgid ""
"Configuration committed, reloading network and firewall. This can " "Configuration committed, reloading network and firewall. This can "
"take a moment." "take a moment."
msgstr "配置已提交,正在重新加载网络和防火墙。这可能需要一点时间。" 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" msgid "Configuring firewall"
msgstr "正在配置防火墙" 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" msgid "Confirm Logout"
msgstr "确认登出" 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" msgid "Connection Info"
msgstr "连接信息" 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." msgid "Controls how Tailscale DNS is handled."
msgstr "控制 Tailscale DNS 的处理方式。" 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 "" msgid ""
"Could not open a new tab. Please check if your browser or an " "Could not open a new tab. Please check if your browser or an "
"extension blocked the pop-up." "extension blocked the pop-up."
msgstr "无法打开新标签页。请检查您的浏览器或扩展程序是否阻止了弹出窗口。" 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" msgid "Custom Login Server"
msgstr "自定义登录服务器" 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" msgid "Custom Login Server Auth Key"
msgstr "自定义登录服务器认证密钥" 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" msgid "DNS Mode"
msgstr "DNS 模式" 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" msgid "Daemon MTU"
msgstr "守护进程 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" msgid "Daemon Settings"
msgstr "守护进程设置" 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." msgid "Declare this device as an Exit Node."
msgstr "将此设备声明为出口节点。" 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" msgid "Devices List"
msgstr "设备列表" 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" msgid "Disable Firewall Configuration"
msgstr "禁用防火墙配置" 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" msgid "Disable SNAT"
msgstr "禁用 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 "" msgid ""
"Disable Source NAT (SNAT) for traffic to advertised routes. Most " "Disable Source NAT (SNAT) for traffic to advertised routes. Most "
"users should leave this unchecked." "users should leave this unchecked."
msgstr "为通告路由的流量禁用源地址转换 (SNAT)。大多数用户应保持此项不勾选。" 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)." msgid "Disable Tailscale netfilter auto-configuration (--netfilter-mode=off)."
msgstr "禁用 Tailscale netfilter 自动配置 (--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:85
#: 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 "Disabled" msgid "Disabled"
msgstr "已禁用" 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." msgid "Disabled: system DNS only."
msgstr "已禁用:仅使用系统 DNS。" 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." msgid "Disconnect from Tailscale and expire current node key."
msgstr "从 Tailscale 断开连接并使当前节点密钥过期。" 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" msgid "Empty reply from server"
msgstr "服务器返回空响应" 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" msgid "Enable Peer Relay"
msgstr "启用节点中继" 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" msgid "Enable Tailscale SSH"
msgstr "启用 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" msgid "Enable Tailscale Service"
msgstr "启用 Tailscale 服务" 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" msgid "Enable Web Interface"
msgstr "启用 Web 界面" 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 "" msgid ""
"Enable or disable the Tailscale service. When disabled, the service " "Enable or disable the Tailscale service. When disabled, the service "
"will be stopped and the process will be killed." "will be stopped and the process will be killed."
msgstr "启用或禁用Tailscale服务。禁用后,服务将被停止,当前进程将被终止。" 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 "" msgid ""
"Enable this device as a Peer Relay server. Requires a public IP and " "Enable this device as a Peer Relay server. Requires a public IP and "
"an UDP port open on the router." "an UDP port open on the router."
msgstr "将此设备设为节点中继服务器。需要此路由器具备公网 IP,并在路由器上开放一个 UDP 端口。" 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" msgid "Enabled"
msgstr "已启用" 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 "" msgid ""
"Enabling this option can reduce memory usage, but it may sacrifice " "Enabling this option can reduce memory usage, but it may sacrifice "
"some performance (set GOGC=10)." "some performance (set GOGC=10)."
msgstr "启用此选项可以减少内存使用,但可能会牺牲一些性能 (设置 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" msgid "Error"
msgstr "错误" 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" msgid "Error caching DERP region map: %s"
msgstr "缓存 DERP 区域地图时出错: %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" msgid "Error fetching DERP region map: %s"
msgstr "获取 DERP 区域地图时出错: %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" msgid "Error reading cached DERP region map: %s"
msgstr "读取缓存的 DERP 区域地图时出错: %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 "" msgid ""
"Essential configuration for Subnet Routing (Site-to-Site) and Exit " "Essential configuration for Subnet Routing (Site-to-Site) and Exit "
"Node features." "Node features."
msgstr "子网路由(局域网间互通)和出口节点的基本配置。" 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
#: 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 "Exit Node" msgid "Exit Node"
msgstr "出口节点" 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 "" msgid ""
"Expose a web interface on port 5252 for managing this node over " "Expose a web interface on port 5252 for managing this node over "
"Tailscale." "Tailscale."
msgstr "在端口 5252 上暴露一个 Web 界面,用于通过 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" msgid "Failed to configure firewall: %s"
msgstr "配置防火墙失败: %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." msgid "Failed to get login URL. You may close this tab."
msgstr "获取登录 URL 失败。您可以关闭此标签页。" 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:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
msgid "Failed to get login URL: %s" msgid "Failed to get login URL: %s"
msgstr "获取登录 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" msgid "Failed to load logs: %s"
msgstr "加载日志失败: %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..." msgid "Filter peers by name, IP, or OS..."
msgstr "按名称、IP 或操作系统过滤..." 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:" msgid "Filter:"
msgstr "过滤:" 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" msgid "Firewall Mode"
msgstr "防火墙模式" 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." msgid "Firewall configuration already applied."
msgstr "防火墙配置已应用。" 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." msgid "Firewall configuration applied."
msgstr "已应用防火墙配置" 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" msgid "Firewall reload failed"
msgstr "重新加载防火墙失败" 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" msgid "General Settings"
msgstr "常规设置" 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" msgid "Hostname"
msgstr "主机名" 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?" msgid "How to enable Exit Node?"
msgstr "如何启用出口节点?" 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?" msgid "How to enable Site-to-Site?"
msgstr "如何实现站点到站点(即多局域网互通)?" 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 "" msgid ""
"If the timeout is displayed, you can refresh the page and click Login " "If the timeout is displayed, you can refresh the page and click Login "
"again." "again."
msgstr "如果显示超时,您可以刷新页面并再次点击登录。" 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 "" msgid ""
"If you are using custom login server but not providing an Auth Key, " "If you are using custom login server but not providing an Auth Key, "
"will redirect to the login page without pre-filling the key." "will redirect to the login page without pre-filling the key."
msgstr "如果您使用自定义登录服务器但未提供认证密钥,将重定向到登录页面而不会预先填充密钥。" 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" msgid "Invalid Date"
msgstr "无效日期" 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." msgid "Invalid response from server."
msgstr "服务器响应无效。" 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 "" msgid ""
"It creates the tailscale interface, adds it to a firewall zone, and " "It creates the tailscale interface, adds it to a firewall zone, and "
"sets up forwarding between LAN and Tailscale, plus Tailscale to WAN." "sets up forwarding between LAN and Tailscale, plus Tailscale to WAN."
@@ -359,241 +359,241 @@ msgstr ""
"它会创建 tailscale 接口,将其加入防火墙区域,并设置 LAN 与 Tailscale 之间的转发,以及 Tailscale 到 " "它会创建 tailscale 接口,将其加入防火墙区域,并设置 LAN 与 Tailscale 之间的转发,以及 Tailscale 到 "
"WAN 的转发。" "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" msgid "Just now"
msgstr "刚才" 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" msgid "LOGGED OUT"
msgstr "已登出" 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" msgid "Last Seen"
msgstr "上次在线" 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." msgid "Leave blank for default Tailscale control plane."
msgstr "留空以使用默认的 Tailscale 控制平面。" 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" msgid "Loading logs"
msgstr "正在加载日志" 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..." msgid "Logging out..."
msgstr "正在登出..." 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" msgid "Login"
msgstr "登录" msgstr "登录"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:749 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:815 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:855
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:823 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:863
msgid "Logout" msgid "Logout"
msgstr "登出" 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" msgid "Logout failed: %s"
msgstr "登出失败: %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" msgid "Logs"
msgstr "日志" 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." msgid "MagicDNS: Tailscale overrides resolv.conf."
msgstr "MagicDNS:Tailscale 会覆写 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 "" msgid ""
"Masquerading and MSS Clamping (MTU fix) are enabled to keep " "Masquerading and MSS Clamping (MTU fix) are enabled to keep "
"connections stable." "connections stable."
msgstr "会启用伪装和 MSS Clamping (MTU 修复),以保持连接稳定。" 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" msgid "N/A"
msgstr "不可用" 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" msgid "NOT RUNNING"
msgstr "未运行" 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." msgid "No matching peer devices found."
msgstr "未找到匹配的节点设备。" 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." msgid "No peer devices found."
msgstr "未找到节点设备。" msgstr "未找到节点设备。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:368 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:428
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:880
msgid "No tailscale-related logs found." msgid "No tailscale-related logs found."
msgstr "没有找到Tailscale相关日志" 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" msgid "None"
msgstr "无" 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" msgid "Now"
msgstr "现在" 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" msgid "OS"
msgstr "操作系统" 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" msgid "Offline"
msgstr "离线" 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" msgid "Online"
msgstr "在线" 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" msgid "OpenWrt Forward"
msgstr "OpenWrt 转发" 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)" msgid "OpenWrt Forward: MagicDNS via dnsmasq forwarding.(Only support ts.net)"
msgstr "OpenWrt 转发:通过dnsmasq转发MagicDNS(仅支持 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" msgid "Operation"
msgstr "操作" 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 "" msgid ""
"Optional: Specify a custom control server URL (e.g., a Headscale " "Optional: Specify a custom control server URL (e.g., a Headscale "
"instance, %s)." "instance, %s)."
msgstr "可选:指定一个自定义控制服务器 URL (例如,一个 Headscale 实例, %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 "" msgid ""
"Optional: Specify an authentication key for the custom control " "Optional: Specify an authentication key for the custom control "
"server. Leave blank if not required." "server. Leave blank if not required."
msgstr "可选:为自定义控制服务器指定一个认证密钥。如果不需要,请留空。" 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" msgid "Peer Relay Port"
msgstr "节点中继端口" 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." msgid "Please use the login button in the settings below to authenticate."
msgstr "请使用下方设置中的登录按钮进行认证。" 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: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." msgid "Please wait."
msgstr "请稍候。" 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" msgid "RUNNING"
msgstr "正在运行" 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" msgid "RX"
msgstr "接收" 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" msgid "Refresh"
msgstr "刷新" 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..." msgid "Reloading firewall..."
msgstr "正在重新加载防火墙..." msgstr "正在重新加载防火墙..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:772 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
msgid "Requesting Login URL..." msgid "Requesting Login URL..."
msgstr "正在请求登录 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." msgid "Requesting Tailscale login URL... Please wait."
msgstr "正在请求 Tailscale 登录 URL... 请稍候。" 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 "" msgid ""
"Select an exit node from the list. If enabled, Allow LAN Access is " "Select an exit node from the list. If enabled, Allow LAN Access is "
"enabled implicitly." "enabled implicitly."
msgstr "从列表中选择出口节点。启用后会同时开启允许局域网访问。" 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 "" msgid ""
"Select the firewall backend for Tailscale to use. Requires service " "Select the firewall backend for Tailscale to use. Requires service "
"restart to take effect." "restart to take effect."
msgstr "选择 Tailscale 使用的防火墙后端。需要重启服务才能生效。" 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:380
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:328 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:388
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:340 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: 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 "Service Status" msgid "Service Status"
msgstr "服务状态" 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 "" msgid ""
"Set a custom MTU for the Tailscale daemon. Leave blank to use the " "Set a custom MTU for the Tailscale daemon. Leave blank to use the "
"default value." "default value."
msgstr "为 Tailscale 守护进程设置自定义 MTU。留空则使用默认值。" 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" msgid "Shields Up"
msgstr "屏蔽入站连接" 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" msgid "Status"
msgstr "状态" 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." msgid "Successfully logged out."
msgstr "登出成功。" 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" msgid "TAILSCALE NOT FOUND"
msgstr "未找到 TAILSCALE 主程序" 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" msgid "TUN Mode"
msgstr "TUN 模式" 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" msgid "TX"
msgstr "发送" 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" msgid "Tailnet Name"
msgstr "Tailnet 名称" 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 #: luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:1
msgid "Tailscale" msgid "Tailscale"
msgstr "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" msgid "Tailscale Health Check: %s"
msgstr "Tailscale 健康检查: %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" msgid "Tailscale IP"
msgstr "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" msgid "Tailscale IPv4"
msgstr "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" msgid "Tailscale IPv6"
msgstr "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" msgid "Tailscale Login"
msgstr "Tailscale 登录" 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 "" msgid ""
"Tailscale is a mesh VPN solution that makes it easy to connect your " "Tailscale is a mesh VPN solution that makes it easy to connect your "
"devices securely. This configuration page allows you to manage " "devices securely. This configuration page allows you to manage "
@@ -602,80 +602,80 @@ msgstr ""
"Tailscale 是一个网状 VPN 解决方案,可以轻松地安全连接您的设备。此配置页面允许您在 OpenWrt 设备上管理 " "Tailscale 是一个网状 VPN 解决方案,可以轻松地安全连接您的设备。此配置页面允许您在 OpenWrt 设备上管理 "
"Tailscale 设置。" "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" msgid "Tailscale status error"
msgstr "Tailscale 状态异常" 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 "" msgid ""
"The Tailscale to WAN forwarding is what lets clients send their " "The Tailscale to WAN forwarding is what lets clients send their "
"internet traffic through this device as an Exit Node." "internet traffic through this device as an Exit Node."
msgstr "正是 Tailscale 到 WAN 的转发,让客户端可以把上网流量经由此设备作为出口节点发出。" 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." msgid "This can take up to 30 seconds."
msgstr "此过程最多可能需要 30 秒。" 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 "" msgid ""
"This will disconnect this device from your Tailnet and require you to " "This will disconnect this device from your Tailnet and require you to "
"re-authenticate." "re-authenticate."
msgstr "这将使此设备从您的 Tailnet 断开连接,并需要您重新进行身份验证。" 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:203
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:194 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:254
msgid "Timed out waiting for the firewall reload" msgid "Timed out waiting for the firewall reload"
msgstr "等待防火墙重新加载超时" 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 "" msgid ""
"UDP port for the Peer Relay service. Open this port on your router " "UDP port for the Peer Relay service. Open this port on your router "
"firewall/NAT." "firewall/NAT."
msgstr "节点中继服务的 UDP 端口。需要在路由器的防火墙/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:305
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
#: 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 "Unknown error" msgid "Unknown error"
msgstr "未知错误" 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" msgid "Version"
msgstr "版本" 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 "" msgid ""
"When enabled, blocks all inbound connections from the Tailscale " "When enabled, blocks all inbound connections from the Tailscale "
"network." "network."
msgstr "启用后,将阻止来自 Tailscale 网络的所有入站连接。" 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." msgid "When using the exit node, access to the local LAN is allowed."
msgstr "使用出口节点时,允许访问本地局域网。" 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 "" msgid ""
"You have unapplied changes. Save & Apply them first so the firewall " "You have unapplied changes. Save & Apply them first so the firewall "
"matches the form." "matches the form."
msgstr "您有未应用的更改。请先保存并应用,让防火墙配置与表单保持一致。" 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 "" msgid ""
"[Important] Log in to the Tailscale admin console and manually enable " "[Important] Log in to the Tailscale admin console and manually enable "
"\"Subnet Routes\" for this device." "\"Subnet Routes\" for this device."
msgstr "【重要】登录 Tailscale 管理控制台,手动为此设备启用“子网路由”。" 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 "" msgid ""
"[Important] Step 3 cannot be done here: it needs your Tailscale " "[Important] Step 3 cannot be done here: it needs your Tailscale "
"account." "account."
msgstr "【重要】第 3 步无法在此完成:需要您的 Tailscale 账户。" 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" msgid "ago"
msgstr "前" msgstr "前"
@@ -1,79 +1,79 @@
msgid "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n" 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" msgid "%s failed"
msgstr "%s 失敗" 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" msgid "(Experimental) Reduce Memory Usage"
msgstr "(實驗性) 減少記憶體使用" 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\"." msgid "1. Enable \"Advertise Exit Node\"."
msgstr "1. 啟用「宣告出口節點」。" 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)." msgid "1. Select \"Accept Routes\" (to access remote devices)."
msgstr "1. 勾選「接受路由」(以存取遠端設備)。" 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 "" msgid ""
"2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic " "2. Click \"Auto Configure Firewall\" (it forwards Tailscale traffic "
"to WAN)." "to WAN)."
msgstr "2. 點選「自動設定防火牆」(將 Tailscale 流量轉送到 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 "" msgid ""
"2. In \"Advertise Routes\", select your local subnet (to allow remote " "2. In \"Advertise Routes\", select your local subnet (to allow remote "
"devices to access this LAN)." "devices to access this LAN)."
msgstr "2. 在「宣告路由」選擇本裝置的區域網段 (讓遠端能存取這個區網)。" 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)." msgid "3. Click \"Auto Configure Firewall\" (to allow traffic forwarding)."
msgstr "3. 點選「自動設定防火牆」(允許流量轉送)。" 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 "" msgid ""
"3. In the Tailscale admin console, edit this device under the route " "3. In the Tailscale admin console, edit this device under the route "
"settings and approve it as an Exit Node." "settings and approve it as an Exit Node."
msgstr "3. 在 Tailscale 管理控制台的路由設定中編輯此裝置,並核准為出口節點。" 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." msgid "4. On the client, set this device as its exit node."
msgstr "4. 在用戶端上,將此裝置設為出口節點。" 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" msgid "Accept Routes"
msgstr "接受路由" 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" msgid "Account Settings"
msgstr "帳號設定" 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" msgid "Advertise Exit Node"
msgstr "宣告出口節點" 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" msgid "Advertise Routes"
msgstr "宣告路由" 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 "" msgid ""
"Advertise subnet routes behind this device. Select from the detected " "Advertise subnet routes behind this device. Select from the detected "
"subnets below or enter custom routes (comma-separated)." "subnets below or enter custom routes (comma-separated)."
msgstr "宣告此裝置後方的子網路路由。從下方偵測到的子網路中選擇,或輸入自訂路由 (以逗號分隔)。" 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" msgid "Allow LAN Access"
msgstr "允許 LAN 存取" 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." msgid "Allow accepting routes announced by other nodes."
msgstr "允許接受由其他節點宣告的路由。" 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." msgid "Allow connecting to this device through the SSH function of Tailscale."
msgstr "允許透過 Tailscale 的 SSH 功能連線到此裝置。" msgstr "允許透過 Tailscale 的 SSH 功能連線到此裝置。"
@@ -81,277 +81,277 @@ msgstr "允許透過 Tailscale 的 SSH 功能連線到此裝置。"
msgid "Allow user access to tailscale" msgid "Allow user access to tailscale"
msgstr "允許使用者存取 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" msgid "Another firewall reload is already running"
msgstr "另一個防火牆重新載入作業正在執行中" 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?" msgid "Are you sure you want to log out?"
msgstr "您確定要登出嗎?" 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" msgid "Auto Configure Firewall"
msgstr "自動設定防火牆" 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" msgid "Cancel"
msgstr "取消" 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." msgid "Click to Log out account on this device."
msgstr "點選以登出此裝置上的帳號。" 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." msgid "Click to get a login URL for this device."
msgstr "點選獲取此裝置的登入 URL。" 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:351
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:383 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:443
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:591 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:631
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:850 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:890
msgid "Collecting data ..." msgid "Collecting data ..."
msgstr "正在收集資料..." 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 "" msgid ""
"Configuration committed, reloading network and firewall. This can " "Configuration committed, reloading network and firewall. This can "
"take a moment." "take a moment."
msgstr "設定已提交,正在重新載入網路與防火牆。這可能需要一點時間。" 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" msgid "Configuring firewall"
msgstr "正在設定防火牆" 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" msgid "Confirm Logout"
msgstr "確認登出" 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" msgid "Connection Info"
msgstr "連線資訊" 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." msgid "Controls how Tailscale DNS is handled."
msgstr "控制 Tailscale DNS 的處理方式。" 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 "" msgid ""
"Could not open a new tab. Please check if your browser or an " "Could not open a new tab. Please check if your browser or an "
"extension blocked the pop-up." "extension blocked the pop-up."
msgstr "無法開啟新分頁。請檢查您的瀏覽器或擴充套件程式是否阻止了彈出式視窗。" 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" msgid "Custom Login Server"
msgstr "自訂登入伺服器" 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" msgid "Custom Login Server Auth Key"
msgstr "自訂登入伺服器認證金鑰" 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" msgid "DNS Mode"
msgstr "DNS 模式" 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" msgid "Daemon MTU"
msgstr "常駐程式 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" msgid "Daemon Settings"
msgstr "常駐程式設定" 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." msgid "Declare this device as an Exit Node."
msgstr "將此裝置宣告為出口節點。" 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" msgid "Devices List"
msgstr "裝置清單" 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" msgid "Disable Firewall Configuration"
msgstr "停用防火牆設定" 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" msgid "Disable SNAT"
msgstr "停用 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 "" msgid ""
"Disable Source NAT (SNAT) for traffic to advertised routes. Most " "Disable Source NAT (SNAT) for traffic to advertised routes. Most "
"users should leave this unchecked." "users should leave this unchecked."
msgstr "為宣告路由的流量停用來源位址轉換 (SNAT)。大多數使用者不應勾選此項。" 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)." msgid "Disable Tailscale netfilter auto-configuration (--netfilter-mode=off)."
msgstr "停用 Tailscale netfilter 自動設定 (--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:85
#: 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 "Disabled" msgid "Disabled"
msgstr "已停用" 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." msgid "Disabled: system DNS only."
msgstr "已停用: 僅使用系統 DNS。" 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." msgid "Disconnect from Tailscale and expire current node key."
msgstr "中斷 Tailscale 連線並使目前節點金鑰過期。" 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" msgid "Empty reply from server"
msgstr "伺服器回應為空" 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" msgid "Enable Peer Relay"
msgstr "啟用對等中繼" 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" msgid "Enable Tailscale SSH"
msgstr "啟用 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" msgid "Enable Tailscale Service"
msgstr "啟用 Tailscale 服務" 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" msgid "Enable Web Interface"
msgstr "啟用 Web 介面" 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 "" msgid ""
"Enable or disable the Tailscale service. When disabled, the service " "Enable or disable the Tailscale service. When disabled, the service "
"will be stopped and the process will be killed." "will be stopped and the process will be killed."
msgstr "啟用或停用 Tailscale 服務。停用後,該服務將停止,處理程序將被終止。" 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 "" msgid ""
"Enable this device as a Peer Relay server. Requires a public IP and " "Enable this device as a Peer Relay server. Requires a public IP and "
"an UDP port open on the router." "an UDP port open on the router."
msgstr "將此設備做為對等中繼伺服器。需要公開 IP 位址,且路由器上需要開啟一個 UDP 連接埠。" 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" msgid "Enabled"
msgstr "已啟用" 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 "" msgid ""
"Enabling this option can reduce memory usage, but it may sacrifice " "Enabling this option can reduce memory usage, but it may sacrifice "
"some performance (set GOGC=10)." "some performance (set GOGC=10)."
msgstr "啟用此選項可以減少記憶體使用,但可能會犧牲一些效能 (設定 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" msgid "Error"
msgstr "錯誤" 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" msgid "Error caching DERP region map: %s"
msgstr "快取 DERP 區域對照表時出錯: %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" msgid "Error fetching DERP region map: %s"
msgstr "獲取 DERP 區域對照表時出錯: %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" msgid "Error reading cached DERP region map: %s"
msgstr "讀取快取的 DERP 區域對照表時出錯: %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 "" msgid ""
"Essential configuration for Subnet Routing (Site-to-Site) and Exit " "Essential configuration for Subnet Routing (Site-to-Site) and Exit "
"Node features." "Node features."
msgstr "子網路由(站對站)和出口節點功能的基本設定" 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
#: 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 "Exit Node" msgid "Exit Node"
msgstr "出口節點" 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 "" msgid ""
"Expose a web interface on port 5252 for managing this node over " "Expose a web interface on port 5252 for managing this node over "
"Tailscale." "Tailscale."
msgstr "在埠 5252 上暴露一個 Web 介面,用於透過 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" msgid "Failed to configure firewall: %s"
msgstr "設定防火牆失敗: %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." msgid "Failed to get login URL. You may close this tab."
msgstr "獲取登入 URL 失敗。您可以關閉此分頁。" 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:829
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
msgid "Failed to get login URL: %s" msgid "Failed to get login URL: %s"
msgstr "獲取登入 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" msgid "Failed to load logs: %s"
msgstr "載入日誌失敗: %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..." msgid "Filter peers by name, IP, or OS..."
msgstr "依名稱、IP 或作業系統篩選..." 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:" msgid "Filter:"
msgstr "篩選:" 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" msgid "Firewall Mode"
msgstr "防火牆模式" 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." msgid "Firewall configuration already applied."
msgstr "防火牆設定已套用。" 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." msgid "Firewall configuration applied."
msgstr "已套用防火牆設定" 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" msgid "Firewall reload failed"
msgstr "防火牆重新載入失敗" 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" msgid "General Settings"
msgstr "一般設定" 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" msgid "Hostname"
msgstr "主機名" 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?" msgid "How to enable Exit Node?"
msgstr "如何啟用出口節點?" 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?" msgid "How to enable Site-to-Site?"
msgstr "如何啟用站對站通訊?" 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 "" msgid ""
"If the timeout is displayed, you can refresh the page and click Login " "If the timeout is displayed, you can refresh the page and click Login "
"again." "again."
msgstr "如果顯示逾時,您可以重新整理頁面並再次點選登入。" 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 "" msgid ""
"If you are using custom login server but not providing an Auth Key, " "If you are using custom login server but not providing an Auth Key, "
"will redirect to the login page without pre-filling the key." "will redirect to the login page without pre-filling the key."
msgstr "如果您使用自訂登入伺服器但未提供認證金鑰,將重新導向至登入頁面,且不會預先填入金鑰。" 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" msgid "Invalid Date"
msgstr "無效日期" 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." msgid "Invalid response from server."
msgstr "伺服器回應無效。" 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 "" msgid ""
"It creates the tailscale interface, adds it to a firewall zone, and " "It creates the tailscale interface, adds it to a firewall zone, and "
"sets up forwarding between LAN and Tailscale, plus Tailscale to WAN." "sets up forwarding between LAN and Tailscale, plus Tailscale to WAN."
@@ -359,241 +359,241 @@ msgstr ""
"它會建立 tailscale 介面、加入防火牆區域,並設定 LAN 與 Tailscale 之間的轉送,以及 Tailscale 到 " "它會建立 tailscale 介面、加入防火牆區域,並設定 LAN 與 Tailscale 之間的轉送,以及 Tailscale 到 "
"WAN 的轉送。" "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" msgid "Just now"
msgstr "剛才" 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" msgid "LOGGED OUT"
msgstr "已登出" 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" msgid "Last Seen"
msgstr "上次連線" 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." msgid "Leave blank for default Tailscale control plane."
msgstr "留白則使用預設的 Tailscale 控制台。" 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" msgid "Loading logs"
msgstr "正在載入日誌" 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..." msgid "Logging out..."
msgstr "正在登出..." 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" msgid "Login"
msgstr "登入" msgstr "登入"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:749 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:789
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:815 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:855
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:823 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:863
msgid "Logout" msgid "Logout"
msgstr "登出" 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" msgid "Logout failed: %s"
msgstr "登出失敗: %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" msgid "Logs"
msgstr "日誌" 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." msgid "MagicDNS: Tailscale overrides resolv.conf."
msgstr "MagicDNS:Tailscale 將接管 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 "" msgid ""
"Masquerading and MSS Clamping (MTU fix) are enabled to keep " "Masquerading and MSS Clamping (MTU fix) are enabled to keep "
"connections stable." "connections stable."
msgstr "同時啟用偽裝與 MSS Clamping (MTU 修復),以維持連線穩定。" 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" msgid "N/A"
msgstr "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" msgid "NOT RUNNING"
msgstr "未執行" 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." msgid "No matching peer devices found."
msgstr "找不到符合的對等裝置。" 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." msgid "No peer devices found."
msgstr "未找到對等裝置。" msgstr "未找到對等裝置。"
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:368 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:428
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:840 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:880
msgid "No tailscale-related logs found." msgid "No tailscale-related logs found."
msgstr "未找到與 tailscale 相關的日誌。" 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" msgid "None"
msgstr "無" 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" msgid "Now"
msgstr "現在" 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" msgid "OS"
msgstr "作業系統" 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" msgid "Offline"
msgstr "離線" 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" msgid "Online"
msgstr "上線" 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" msgid "OpenWrt Forward"
msgstr "OpenWrt 轉送" 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)" msgid "OpenWrt Forward: MagicDNS via dnsmasq forwarding.(Only support ts.net)"
msgstr "OpenWrt 轉送:僅經由 dnsmasq 轉送至 MagicDNS。(僅支援tailxxxxxx.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" msgid "Operation"
msgstr "操作" 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 "" msgid ""
"Optional: Specify a custom control server URL (e.g., a Headscale " "Optional: Specify a custom control server URL (e.g., a Headscale "
"instance, %s)." "instance, %s)."
msgstr "可選:指定自訂控制伺服器 URL(例如,Headscale 實例,「%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 "" msgid ""
"Optional: Specify an authentication key for the custom control " "Optional: Specify an authentication key for the custom control "
"server. Leave blank if not required." "server. Leave blank if not required."
msgstr "可選:為自訂控制伺服器指定一個認證金鑰。如果不需要,請留白。" 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" msgid "Peer Relay Port"
msgstr "對等中繼連接埠" 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." msgid "Please use the login button in the settings below to authenticate."
msgstr "請使用下方設定中的登入按鈕進行認證。" 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: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." msgid "Please wait."
msgstr "請稍候。" 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" msgid "RUNNING"
msgstr "正在執行" 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" msgid "RX"
msgstr "接收" 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" msgid "Refresh"
msgstr "重新整理" 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..." msgid "Reloading firewall..."
msgstr "正在重新載入防火牆..." msgstr "正在重新載入防火牆..."
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:772 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:812
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:778 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:818
msgid "Requesting Login URL..." msgid "Requesting Login URL..."
msgstr "正在請求登入 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." msgid "Requesting Tailscale login URL... Please wait."
msgstr "正在請求 Tailscale 登入 URL... 請稍候。" 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 "" msgid ""
"Select an exit node from the list. If enabled, Allow LAN Access is " "Select an exit node from the list. If enabled, Allow LAN Access is "
"enabled implicitly." "enabled implicitly."
msgstr "從清單中選擇一個出口節點。啟用後會一併啟用「允許區網存取」。" 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 "" msgid ""
"Select the firewall backend for Tailscale to use. Requires service " "Select the firewall backend for Tailscale to use. Requires service "
"restart to take effect." "restart to take effect."
msgstr "選擇 Tailscale 使用的防火牆後端。需要重新啟動服務才能生效。" 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:380
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:328 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:388
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:340 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:400
#: 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 "Service Status" msgid "Service Status"
msgstr "服務狀態" 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 "" msgid ""
"Set a custom MTU for the Tailscale daemon. Leave blank to use the " "Set a custom MTU for the Tailscale daemon. Leave blank to use the "
"default value." "default value."
msgstr "為 Tailscale 常駐程式設定自訂 MTU。留白則使用預設值。" 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" msgid "Shields Up"
msgstr "封鎖入站連線" 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" msgid "Status"
msgstr "狀態" 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." msgid "Successfully logged out."
msgstr "登出成功。" 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" msgid "TAILSCALE NOT FOUND"
msgstr "找不到 TAILSCALE" 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" msgid "TUN Mode"
msgstr "TUN 模式" 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" msgid "TX"
msgstr "傳送" 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" msgid "Tailnet Name"
msgstr "Tailnet 名稱" 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 #: luci-app-tailscale-community/root/usr/share/luci/menu.d/luci-app-tailscale-community.json:1
msgid "Tailscale" msgid "Tailscale"
msgstr "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" msgid "Tailscale Health Check: %s"
msgstr "Tailscale 健康檢查: %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" msgid "Tailscale IP"
msgstr "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" msgid "Tailscale IPv4"
msgstr "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" msgid "Tailscale IPv6"
msgstr "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" msgid "Tailscale Login"
msgstr "Tailscale 登入" 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 "" msgid ""
"Tailscale is a mesh VPN solution that makes it easy to connect your " "Tailscale is a mesh VPN solution that makes it easy to connect your "
"devices securely. This configuration page allows you to manage " "devices securely. This configuration page allows you to manage "
@@ -602,80 +602,80 @@ msgstr ""
"Tailscale 是一個網狀 VPN 解決方案,可以輕鬆地安全連線您的裝置。此設定頁面允許您在 OpenWrt 裝置上管理 " "Tailscale 是一個網狀 VPN 解決方案,可以輕鬆地安全連線您的裝置。此設定頁面允許您在 OpenWrt 裝置上管理 "
"Tailscale 設定。" "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" msgid "Tailscale status error"
msgstr "Tailscale 狀態錯誤" 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 "" msgid ""
"The Tailscale to WAN forwarding is what lets clients send their " "The Tailscale to WAN forwarding is what lets clients send their "
"internet traffic through this device as an Exit Node." "internet traffic through this device as an Exit Node."
msgstr "Tailscale 到 WAN 的轉送,讓用戶端能透過此裝置以出口節點傳送網際網路流量。" 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." msgid "This can take up to 30 seconds."
msgstr "此過程最多可能需要 30 秒。" 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 "" msgid ""
"This will disconnect this device from your Tailnet and require you to " "This will disconnect this device from your Tailnet and require you to "
"re-authenticate." "re-authenticate."
msgstr "這將使此裝置從您的 Tailnet 中斷連線,並需要您重新進行身份驗證。" 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:203
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:194 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:254
msgid "Timed out waiting for the firewall reload" msgid "Timed out waiting for the firewall reload"
msgstr "等待防火牆重新載入逾時" 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 "" msgid ""
"UDP port for the Peer Relay service. Open this port on your router " "UDP port for the Peer Relay service. Open this port on your router "
"firewall/NAT." "firewall/NAT."
msgstr "用於對等中繼服務的 UDP 連接埠。請在路由器的防火牆/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:305
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:272 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:332
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:275 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:335
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:683 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:723
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:793 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:833
#: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:820 #: luci-app-tailscale-community/htdocs/luci-static/resources/view/tailscale.js:860
#: 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 "Unknown error" msgid "Unknown error"
msgstr "未知錯誤" 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" msgid "Version"
msgstr "版本" 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 "" msgid ""
"When enabled, blocks all inbound connections from the Tailscale " "When enabled, blocks all inbound connections from the Tailscale "
"network." "network."
msgstr "啟用後,將阻止來自 Tailscale 網路的所有入站連線。" 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." msgid "When using the exit node, access to the local LAN is allowed."
msgstr "使用出口節點時,允許存取區域網路。" 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 "" msgid ""
"You have unapplied changes. Save & Apply them first so the firewall " "You have unapplied changes. Save & Apply them first so the firewall "
"matches the form." "matches the form."
msgstr "您有尚未套用的變更。請先儲存並套用,防火牆才會與表單內容一致。" 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 "" msgid ""
"[Important] Log in to the Tailscale admin console and manually enable " "[Important] Log in to the Tailscale admin console and manually enable "
"\"Subnet Routes\" for this device." "\"Subnet Routes\" for this device."
msgstr "【重要】 登入 Tailscale 管理控制台,在裝置設定中手動授權子網路由。" 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 "" msgid ""
"[Important] Step 3 cannot be done here: it needs your Tailscale " "[Important] Step 3 cannot be done here: it needs your Tailscale "
"account." "account."
msgstr "[重要] 步驟 3 無法在此完成:需要您的 Tailscale 帳號。" 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" msgid "ago"
msgstr "前" msgstr "前"
@@ -254,10 +254,18 @@ apply_settings() {
&& set -- "$@" --webclient=true \ && set -- "$@" --webclient=true \
|| set -- "$@" --webclient=false || set -- "$@" --webclient=false
# --snat-subnet-routes (inverse of nosnat) # Everything below is handed to 'tailscale set' in one call, and 'set'
[ "$nosnat" = "1" ] \ # aborts on an unknown flag. Gate the newer options on the first release
&& set -- "$@" --snat-subnet-routes=false \ # that accepts them, so an older CLI still applies the rest.
|| set -- "$@" --snat-subnet-routes=true 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) # --advertise-routes (comma-separated, empty clears routes)
set -- "$@" "--advertise-routes=$routes" set -- "$@" "--advertise-routes=$routes"
@@ -268,13 +276,11 @@ apply_settings() {
# when an exit node is configured, always allow LAN access # when an exit node is configured, always allow LAN access
[ -n "$exit_node" ] && set -- "$@" --exit-node-allow-lan-access=true [ -n "$exit_node" ] && set -- "$@" --exit-node-allow-lan-access=true
# --hostname (only set if non-empty) # --hostname (empty resets it to the OS hostname)
[ -n "$hostname" ] && set -- "$@" "--hostname=$hostname" set -- "$@" "--hostname=$hostname"
# --relay-server-port (requires tailscale >= 1.90.5) # --relay-server-port (requires tailscale >= 1.84.0)
local ts_ver if [ -n "$ts_ver" ] && version_gte "$ts_ver" "1.84.0"; then
ts_ver=$("$ts_bin" version 2>/dev/null | head -n1)
if [ -n "$ts_ver" ] && version_gte "$ts_ver" "1.90.5"; then
if [ "$enable_relay" = "1" ]; then if [ "$enable_relay" = "1" ]; then
set -- "$@" "--relay-server-port=${relay_server_port:-40000}" set -- "$@" "--relay-server-port=${relay_server_port:-40000}"
else else
@@ -282,9 +288,16 @@ apply_settings() {
fi fi
fi fi
# --netfilter-mode (only when disable_fw_config is enabled and tailscale init doesn't already handle it) # --netfilter-mode (off when disable_fw_config is enabled, back to on
if [ "$disable_fw_config" = "1" ]; then # otherwise; requires tailscale >= 1.66.1)
set -- "$@" --netfilter-mode=off 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 fi
logger -t "$NAME" "Applying settings" logger -t "$NAME" "Applying settings"
@@ -319,8 +332,16 @@ sync_service_enabled() {
# the baseline instead of treating it as a transition: starting # the baseline instead of treating it as a transition: starting
# a daemon here would run start_service, which arms another UCI # a daemon here would run start_service, which arms another UCI
# rollback window right after the one this apply is inside. # 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 esac
@@ -36,25 +36,60 @@ write_state() {
# Only one worker at a time: a second click while a reload is running would # 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 # 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 # 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 # two workers through at the same moment. Stale locks are recognised by age and
# a recycled pid or a killed worker cannot block forever. # 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_DIR="$LOCK_FILE.d"
lock_age() { lock_age() {
local ts now local ts now
ts=$(cat "$LOCK_DIR/ts" 2>/dev/null) 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) now=$(date +%s)
echo $((now - ts)) 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 ! mkdir "$LOCK_DIR" 2>/dev/null; then
if [ "$(lock_age)" -gt 300 ]; then if ! take_over_stale_lock; then
# the holder is gone; take the lock over # someone else is already reloading, or another worker won the takeover:
rm -rf "$LOCK_DIR" # say so instead of leaving the status file at "queued" and letting the
mkdir "$LOCK_DIR" 2>/dev/null || exit 0 # UI time out
else
# someone else is already reloading: 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" write_state busy locked "Another firewall reload is already running"
exit 0 exit 0
fi fi
@@ -2,7 +2,7 @@
'use strict'; 'use strict';
import { access, popen, readfile, writefile, unlink } from 'fs'; import { access, popen, readfile, writefile, rename, unlink } from 'fs';
import { cursor } from 'uci'; import { cursor } from 'uci';
const uci = cursor(); const uci = cursor();
@@ -361,13 +361,22 @@ methods.setup_firewall = {
// gets a chance to overwrite it. Without both, a poll arriving // gets a chance to overwrite it. Without both, a poll arriving
// while the worker is still starting would read the previous // while the worker is still starting would read the previous
// run's "done" and report success for work that has not run. // run's "done" and report success for work that has not run.
run_id = time(); // clock() returns [seconds, nanoseconds], not milliseconds, so
let st = writefile('/var/run/tailscale-fwsetup.status.tmp', // fold it explicitly. Two clicks within the same second still
'queued\nstart\n\n' + run_id + '\n'); // get distinct ids; the temp file name carries the id as well,
if (st == null || rename('/var/run/tailscale-fwsetup.status.tmp', '/var/run/tailscale-fwsetup.status') == null) { // 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 // Without a writable status file the poll can never see a
// result, so say so instead of letting the UI wait it out. // 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 // The background shell exits immediately, so its status only
@@ -467,7 +476,12 @@ methods.get_logs = {
args: { lines: 200 }, args: { lines: 200 },
call: function(request) { call: function(request) {
let lines = int(request?.args?.lines) || 200; 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); let result = exec(cmd);
if (result.code == 0) { if (result.code == 0) {
return { success: true, logs: result.stdout }; return { success: true, logs: result.stdout };
+1 -1
View File
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=maxminddb-dump-country PKG_NAME:=maxminddb-dump-country
PKG_VERSION:=2 PKG_VERSION:=2
PKG_RELEASE:=2 PKG_RELEASE:=3
PKG_MAINTAINER:=Konstantine Shevlakov <shevlakov@132lan.ru> PKG_MAINTAINER:=Konstantine Shevlakov <shevlakov@132lan.ru>
PKG_LICENSE:=LICENSE 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> From: koshev-msk <kosnt.shell@gmail.com>
Date: Thu, 29 Oct 2026 23:04:25 +0000 Date: Fri, 30 Oct 2026 10:55:20 +0000
Subject: [PATCH] geoip: add DB-IP CSV input support 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 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 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> Signed-off-by: OpenWrt Developer <builder@example.invalid>
--- ---
xt_geoip_build_maxmind.c | 292 ++++++++++++++++++++++++++++++++++----- xt_geoip_build_maxmind.c | 295 ++++++++++++++++++++++++++++++++++-----
1 file changed, 260 insertions(+), 32 deletions(-) 1 file changed, 262 insertions(+), 33 deletions(-)
diff --git a/xt_geoip_build_maxmind.c b/xt_geoip_build_maxmind.c 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 --- a/xt_geoip_build_maxmind.c
+++ b/xt_geoip_build_maxmind.c +++ b/xt_geoip_build_maxmind.c
@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
@@ -245,7 +245,17 @@ index 55e86d0..95d2c92 100644
static int skip_n96 = 0; static int skip_n96 = 0;
void tree_walk(int rn,int l, uint8_t *path) { 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]); progname = strdup(argv[0]);
@@ -257,7 +267,7 @@ index 55e86d0..95d2c92 100644
case '4': opt_6 = 0; break; case '4': opt_6 = 0; break;
case '6': opt_4 = 0; break; case '6': opt_4 = 0; break;
case 'v': opt_v++; 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]); filename = strdup(argv[optind]);
} else { } else {
filename = opt_asn ? asn_name:country_name; filename = opt_asn ? asn_name:country_name;
@@ -289,7 +299,7 @@ index 55e86d0..95d2c92 100644
if(opt_asn && (opt_xtgeo || opt_csv)) { if(opt_asn && (opt_xtgeo || opt_csv)) {
fprintf(stderr,"%s: cant use -A with -o or -c\n",progname); fprintf(stderr,"%s: cant use -A with -o or -c\n",progname);
exit(1); 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'; output_dir[l+2] = '\0';
} }
@@ -374,7 +384,7 @@ index 55e86d0..95d2c92 100644
} }
c_ipv4 += CCN4[fd]; c_ipv4 += CCN4[fd];
c_ipv6 += CCN6[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_IPv6_fd) fclose(CSV_IPv6_fd);
if(CSV_EN_fd) fclose(CSV_EN_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 include $(TOPDIR)/rules.mk
PKG_NAME:=meow PKG_NAME:=meow
PKG_VERSION:=0.27.0 PKG_VERSION:=0.28.0
PKG_RELEASE:=17 PKG_RELEASE:=18
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/meow-rs/meow-rs/tar.gz/v$(PKG_VERSION)? 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_NAME:=microsocks
PKG_VERSION:=1.0.5 PKG_VERSION:=1.0.5
PKG_RELEASE:=2 PKG_RELEASE:=3
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/rofl0r/microsocks/tar.gz/v$(PKG_VERSION)? 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 MISE_HASH_aarch64:=06186cfbfe947049b21d58575fb0ea800cc26ed1375f20f4b678cb3a9d679437
PKG_NAME:=mise PKG_NAME:=mise
PKG_VERSION:=2026.10.23 PKG_VERSION:=2026.10.24
PKG_RELEASE:=46 PKG_RELEASE:=47
PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION)-linux-$(MISE_ARCH)-musl.tar.gz 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_SOURCE_URL:=https://github.com/jdx/mise/releases/download/v$(PKG_VERSION)/
PKG_HASH:=skip PKG_HASH:=skip