From f7e54dd3d450d8a1209219c43b7a15051efd3602 Mon Sep 17 00:00:00 2001 From: kenzok8 Date: Fri, 25 Apr 2025 00:28:39 +0800 Subject: [PATCH] update 2025-04-25 00:28:39 --- luci-app-tailscale/Makefile | 2 +- luci-app-tailscale/README.md | 10 +- .../resources/view/tailscale/interface.js | 127 ++++++------- .../resources/view/tailscale/setting.js | 66 ++----- luci-app-tailscale/po/templates/tailscale.pot | 172 +++++++++--------- luci-app-tailscale/po/zh_Hans/tailscale.po | 172 +++++++++--------- luci-app-tailscale/po/zh_Hant/tailscale.po | 172 +++++++++--------- .../share/rpcd/acl.d/luci-app-tailscale.json | 6 +- 8 files changed, 354 insertions(+), 373 deletions(-) diff --git a/luci-app-tailscale/Makefile b/luci-app-tailscale/Makefile index aadec0b8d..b9bba2ebd 100644 --- a/luci-app-tailscale/Makefile +++ b/luci-app-tailscale/Makefile @@ -8,7 +8,7 @@ LUCI_TITLE:=LuCI for Tailscale LUCI_DEPENDS:=+tailscale LUCI_PKGARCH:=all -PKG_VERSION:=1.2.3 +PKG_VERSION:=1.2.4 include $(TOPDIR)/feeds/luci/luci.mk diff --git a/luci-app-tailscale/README.md b/luci-app-tailscale/README.md index 82816338d..0e1f58884 100644 --- a/luci-app-tailscale/README.md +++ b/luci-app-tailscale/README.md @@ -30,15 +30,21 @@ Tailscale is a zero config VPN for building secure networks. ## How to install prebuilt packages -- Upload the prebuilt ipk package to the /tmp directory of OpenWrt - +- Upload the prebuilt ipk or apk package to the /tmp directory of OpenWrt - Login OpenWrt terminal (SSH) +### opkg package manager ```shell opkg update opkg install --force-overwrite /tmp/luci-*-tailscale*.ipk ``` +### apk package manager + ```shell + apk update + apk add —allow-untrusted /tmp/luci-*-tailscale*.apk + ``` + -------------- ## Thanks diff --git a/luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js b/luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js index 8eb9b3138..b9273744a 100644 --- a/luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js +++ b/luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js @@ -11,62 +11,51 @@ 'require ui'; 'require view'; +function formatBytes(bytes, decimals = 2) { + if (bytes === 0) return '0 Bytes'; + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; +} + return view.extend({ load: function() { - return fs.exec('/sbin/ifconfig').then(function(res) { + return fs.exec('/sbin/ip', ['-s', '-j', 'ad']).then(function(res) { if (res.code !== 0 || !res.stdout || res.stdout.trim() === '') { ui.addNotification(null, E('p', {}, _('Unable to get interface info: %s.').format(res.message))); - return ''; + return []; } - var interfaces = res.stdout.match(/tailscale[0-9]+/g); - if (!interfaces || interfaces.length === 0) - return 'No interface online.'; + try { + const interfaces = JSON.parse(res.stdout); + const tailscaleInterfaces = interfaces.filter(iface => iface.ifname.match(/tailscale[0-9]+/)); - var promises = interfaces.map(function(name) { - return fs.exec('/sbin/ifconfig', [name]); - }); - - return Promise.all(promises).then(function(results) { - var data = results.map(function(res, index) { - if (res.code !== 0 || !res.stdout || res.stdout.trim() === '') { - ui.addNotification(null, E('p', {}, _('Unable to get interface %s info: %s.').format(interfaces[index], res.message))); - return null; - } - return { - name: interfaces[index], - stdout: res.stdout.trim() - }; - }).filter(Boolean); - - return data.map(function(info) { - var lines = info.stdout.split('\n'); - var parsedInfo = { - name: info.name + return tailscaleInterfaces.map(iface => { + const parsedInfo = { + name: iface.ifname }; - lines.forEach(function(line) { - if (line.includes('inet addr:')) { - parsedInfo.ipv4 = line.split('inet addr:')[1].trim().split(' ')[0]; - } else if (line.includes('inet6 addr:')) { - parsedInfo.ipv6 = line.split('inet6 addr:')[1].trim().split('/')[0]; - } else if (line.includes('MTU:')) { - parsedInfo.mtu = line.split('MTU:')[1].trim().split(' ')[0]; - } else if (line.includes('RX bytes:')) { - var rxMatch = line.match(/RX bytes:\d+ \(([\d.]+\s*[a-zA-Z]+)\)/); - if (rxMatch && rxMatch[1]) { - parsedInfo.rxBytes = rxMatch[1]; - } - var txMatch = line.match(/TX bytes:\d+ \(([\d.]+\s*[a-zA-Z]+)\)/); - if (txMatch && txMatch[1]) { - parsedInfo.txBytes = txMatch[1]; - } + const addr_info = iface.addr_info || []; + addr_info.forEach(addr => { + if (addr.family === 'inet') { + parsedInfo.ipv4 = addr.local; + } else if (addr.family === 'inet6') { + parsedInfo.ipv6 = addr.local; } }); + parsedInfo.mtu = iface.mtu; + parsedInfo.rxBytes = formatBytes(iface.stats64.rx.bytes); + parsedInfo.txBytes = formatBytes(iface.stats64.tx.bytes); + return parsedInfo; }); - }); + } catch (e) { + ui.addNotification(null, E('p', {}, _('Error parsing interface info: %s.').format(e.message))); + return []; + } }); }, @@ -82,46 +71,48 @@ return view.extend({ if (!Array.isArray(data)) { return E('div', {}, _('No interface online.')); } - var rows = data.flatMap(function(interfaceData) { - return [ - E('th', {class: 'th', colspan: '2'}, _('Network Interface Information')), - E('tr', {class: 'tr'}, [ - E('td', {class: 'td left', width: '25%'}, _('Interface Name')), - E('td', {class: 'td left', width: '25%'}, interfaceData.name) + const rows = [ + E('th', { class: 'th', colspan: '2' }, _('Network Interface Information')) + ]; + data.forEach(interfaceData => { + rows.push( + E('tr', { class: 'tr' }, [ + E('td', { class: 'td left', width: '25%' }, _('Interface Name')), + E('td', { class: 'td left', width: '25%' }, interfaceData.name) ]), - E('tr', {class: 'tr'}, [ - E('td', {class: 'td left', width: '25%'}, _('IPv4 Address')), - E('td', {class: 'td left', width: '25%'}, interfaceData.ipv4) + E('tr', { class: 'tr' }, [ + E('td', { class: 'td left', width: '25%' }, _('IPv4 Address')), + E('td', { class: 'td left', width: '25%' }, interfaceData.ipv4) ]), - E('tr', {class: 'tr'}, [ - E('td', {class: 'td left', width: '25%'}, _('IPv6 Address')), - E('td', {class: 'td left', width: '25%'}, interfaceData.ipv6) + E('tr', { class: 'tr' }, [ + E('td', { class: 'td left', width: '25%' }, _('IPv6 Address')), + E('td', { class: 'td left', width: '25%' }, interfaceData.ipv6) ]), - E('tr', {class: 'tr'}, [ - E('td', {class: 'td left', width: '25%'}, _('MTU')), - E('td', {class: 'td left', width: '25%'}, interfaceData.mtu) + E('tr', { class: 'tr' }, [ + E('td', { class: 'td left', width: '25%' }, _('MTU')), + E('td', { class: 'td left', width: '25%' }, interfaceData.mtu) ]), - E('tr', {class: 'tr'}, [ - E('td', {class: 'td left', width: '25%'}, _('Total Download')), - E('td', {class: 'td left', width: '25%'}, interfaceData.rxBytes) + E('tr', { class: 'tr' }, [ + E('td', { class: 'td left', width: '25%' }, _('Total Download')), + E('td', { class: 'td left', width: '25%' }, interfaceData.rxBytes) ]), - E('tr', {class: 'tr'}, [ - E('td', {class: 'td left', width: '25%'}, _('Total Upload')), - E('td', {class: 'td left', width: '25%'}, interfaceData.txBytes) + E('tr', { class: 'tr' }, [ + E('td', { class: 'td left', width: '25%' }, _('Total Upload')), + E('td', { class: 'td left', width: '25%' }, interfaceData.txBytes) ]) - ]; + ); }); return E('table', { 'class': 'table' }, rows); }, render: function(data) { - var content = E([], [ - E('h2', {class: 'content'}, _('Tailscale')), - E('div', {class: 'cbi-map-descr'}, _('Tailscale is a cross-platform and easy to use virtual LAN.')), + const content = E([], [ + E('h2', { class: 'content' }, _('Tailscale')), + E('div', { class: 'cbi-map-descr' }, _('Tailscale is a cross-platform and easy to use virtual LAN.')), E('div') ]); - var container = content.lastElementChild; + const container = content.lastElementChild; dom.content(container, this.renderContent(data)); this.pollData(container); diff --git a/luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js b/luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js index 1ebad2738..918f092b8 100644 --- a/luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js +++ b/luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js @@ -6,6 +6,7 @@ 'use strict'; 'require form'; 'require fs'; +'require network'; 'require poll'; 'require rpc'; 'require uci'; @@ -18,49 +19,22 @@ var callServiceList = rpc.declare({ expect: { '': {} } }); -function callInterfaceStatus(interfaceName) { - return rpc.declare({ - object: `network.interface.${interfaceName}`, - method: 'status', - params: ['name'], - expect: { '': {} } - }); -} - function getInterfaceSubnets(interfaces = ['lan', 'wan']) { - const calculateSubnetAndCIDR = (ip, cidr) => { - const cidrInt = parseInt(cidr, 10); - const maskBinary = '1'.repeat(cidrInt).padEnd(32, '0'); - const ipBinary = (ip) => - ip.split('.').map(octet => parseInt(octet, 10).toString(2).padStart(8, '0')) - .join(''); - const subnetBinary = ipBinary(ip).split('').map((bit, index) => - (bit === '1' && maskBinary[index] === '1') ? '1' : '0' - ).join(''); - const subnet = [ - parseInt(subnetBinary.slice(0, 8), 2), - parseInt(subnetBinary.slice(8, 16), 2), - parseInt(subnetBinary.slice(16, 24), 2), - parseInt(subnetBinary.slice(24, 32), 2) - ].join('.'); - return `${subnet}/${cidrInt}`; - }; - - const rpcCalls = interfaces.map(interfaceName => { - const callStatus = callInterfaceStatus(interfaceName); - return callStatus('ipv4-address').catch(() => ({ 'ipv4-address': [] })); - }); - - return Promise.all(rpcCalls) - .then(res => { - const interfaceSubnets = res.flatMap(status => - (status['ipv4-address'] || []).map(addr => { - return calculateSubnetAndCIDR(addr.address, addr.mask) - }) - ); - return [...new Set(interfaceSubnets)]; - }) - .catch(() => []); + return network.getNetworks().then(networks => { + return [...new Set( + networks + .filter(ifc => interfaces.includes(ifc.getName())) + .flatMap(ifc => ifc.getIPAddrs()) + .filter(addr => addr.includes('/')) + .map(addr => { + const [ip, cidr] = addr.split('/'); + const ipParts = ip.split('.').map(Number); + const mask = ~((1 << (32 - parseInt(cidr))) - 1); + const subnetParts = ipParts.map((part, i) => (part & (mask >> (24 - i * 8))) & 255); + return `${subnetParts.join('.')}/${cidr}`; + }) + )]; + }); } function getStatus() { @@ -111,10 +85,10 @@ function renderLogin(loginStatus, authURL, displayName) { var spanTemp = '%s'; var renderHTML; if (loginStatus == "NeedsLogin") { - renderHTML = String.format('%s', authURL, _('Needs Login')); + renderHTML = String.format('%s', authURL, _('Need to log in')); } else if (loginStatus == "Running") { renderHTML = String.format('%s', 'https://login.tailscale.com/admin/machines', displayName); - renderHTML += String.format('
%s', _('Logout and Unbind')); + renderHTML += String.format('
%s', _('Log out and Unbind')); } else { renderHTML = String.format(spanTemp, 'orange', _('NOT RUNNING')); } @@ -152,7 +126,7 @@ return view.extend({ var logoutButton = document.getElementById('logout_button'); if (logoutButton) { logoutButton.onclick = function() { - if (confirm(_('Are you sure you want to logout and unbind the current device?'))) { + if (confirm(_('Are you sure you want to log out and unbind the current device?'))) { fs.exec("/usr/sbin/tailscale", ["logout"]); } } @@ -221,7 +195,7 @@ return view.extend({ o = s.taboption('advance', form.ListValue, 'exitNode', _('Online Exit Nodes'), _('Select an online machine name to use as an exit node.')); if (onlineExitNodes.length > 0) { - o.value('', _('-- Please choose --')); + o.optional = false; onlineExitNodes.forEach(function(node) { o.value(node, node); }); diff --git a/luci-app-tailscale/po/templates/tailscale.pot b/luci-app-tailscale/po/templates/tailscale.pot index 37bbcb479..3478f6c3f 100644 --- a/luci-app-tailscale/po/templates/tailscale.pot +++ b/luci-app-tailscale/po/templates/tailscale.pot @@ -1,88 +1,89 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:224 -msgid "-- Please choose --" -msgstr "" - -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:214 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:188 msgid "Accept DNS" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:214 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:188 msgid "Accept DNS configuration from the Tailscale admin console." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:206 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:180 msgid "Accept Routes" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:206 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:180 msgid "Accept subnet routes that other nodes advertise." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:263 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:237 msgid "Access Control" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:273 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:247 msgid "Additional Flags" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:204 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:178 msgid "Advanced Settings" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:155 -msgid "Are you sure you want to logout and unbind the current device?" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:129 +msgid "Are you sure you want to log out and unbind the current device?" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:285 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:259 msgid "Auth Key" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:273 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:247 msgid "Available flags" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:169 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:143 msgid "Basic Settings" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:164 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:178 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:138 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:152 msgid "Collecting data ..." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:278 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:252 msgid "Custom Server Settings" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:184 msgid "Device Name" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:171 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:145 msgid "Enable" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:218 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:47 +msgid "Error parsing interface info: %s." +msgstr "" + +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:192 msgid "Exit Node" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:236 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210 msgid "Expose Subnets" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:236 -msgid "Expose physical network routes into Tailscale, e.g. 10.0.0.0/24." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210 +msgid "" +"Expose physical network routes into Tailscale, e.g. 10.0.0.0/24." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:271 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:245 msgid "Extra Settings" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:190 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:164 msgid "Firewall Mode" msgstr "" @@ -94,11 +95,11 @@ msgstr "" msgid "Grant access to Tailscale configuration" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:93 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:75 msgid "IPv4 Address" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:97 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:79 msgid "IPv6 Address" msgstr "" @@ -106,84 +107,88 @@ msgstr "" msgid "Interface Info" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:89 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:71 msgid "Interface Name" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:266 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:240 msgid "LAN access Tailscale" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:184 msgid "Leave blank to use the device's hostname." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:273 -msgid "List of extra flags. Format: --flags=value, e.g. --exit-node=10.0.0.1.
%s for enabling settings upon the initiation of Tailscale." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:247 +msgid "" +"List of extra flags. Format: --flags=value, e.g. --exit-node=10.0.0.1.
%s for enabling settings upon the initiation of Tailscale." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:91 +msgid "Log out and Unbind" +msgstr "" + +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:170 msgid "Logging program activities." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:200 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:174 msgid "Logging program errors and exceptions." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:175 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:149 msgid "Login Status" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:117 -msgid "Logout and Unbind" -msgstr "" - #: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:30 msgid "Logs" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:101 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:83 msgid "MTU" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:104 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:119 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:78 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:93 msgid "NOT RUNNING" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:114 -msgid "Needs Login" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:88 +msgid "Need to log in" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:87 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:66 msgid "Network Interface Information" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:229 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:203 msgid "No Available Exit Nodes" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:256 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:230 msgid "No Available Subnet Routes" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:83 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:63 msgid "No interface online." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:218 -msgid "Offer to be an exit node for outbound internet traffic from the Tailscale network." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:192 +msgid "" +"Offer to be an exit node for outbound internet traffic from the Tailscale " +"network." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:222 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196 msgid "Online Exit Nodes" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:181 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:155 msgid "Port" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:102 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:76 msgid "RUNNING" msgstr "" @@ -197,75 +202,72 @@ msgctxt "scroll to bottom (the tail) of the log file" msgid "Scroll to tail" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:222 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196 msgid "Select an online machine name to use as an exit node." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:250 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:224 msgid "Select subnet routes advertised by other nodes in Tailscale network." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:281 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:255 msgid "Server Address" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:181 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:155 msgid "Set the Tailscale port number." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:245 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:219 msgid "Site To Site" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:200 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:174 msgid "StdErr Log" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:170 msgid "StdOut Log" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:250 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:224 msgid "Subnet Routes" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:120 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:102 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:104 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:102 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:76 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:78 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:115 #: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:3 msgid "Tailscale" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:264 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:238 msgid "Tailscale access LAN" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:265 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:239 msgid "Tailscale access WAN" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:121 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:103 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:115 msgid "Tailscale is a cross-platform and easy to use virtual LAN." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:186 -msgid "The working directory contains config files, audit logs, and runtime info." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:160 +msgid "" +"The working directory contains config files, audit logs, and runtime info." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:105 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:87 msgid "Total Download" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:109 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:91 msgid "Total Upload" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:33 -msgid "Unable to get interface %s info: %s." -msgstr "" - #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:18 msgid "Unable to get interface info: %s." msgstr "" @@ -274,18 +276,20 @@ msgstr "" msgid "Unable to load log data:" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:279 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:253 msgid "Use %s to deploy a private server." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:245 -msgid "Use site-to-site layer 3 networking to connect subnets on the Tailscale network." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:219 +msgid "" +"Use site-to-site layer 3 networking to connect subnets on the Tailscale " +"network." msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:267 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:241 msgid "WAN access Tailscale" msgstr "" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:186 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:160 msgid "Workdir" msgstr "" diff --git a/luci-app-tailscale/po/zh_Hans/tailscale.po b/luci-app-tailscale/po/zh_Hans/tailscale.po index 2d8cef481..8575fcd12 100644 --- a/luci-app-tailscale/po/zh_Hans/tailscale.po +++ b/luci-app-tailscale/po/zh_Hans/tailscale.po @@ -7,88 +7,89 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:224 -msgid "-- Please choose --" -msgstr "-- 请选择 --" - -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:214 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:188 msgid "Accept DNS" msgstr "允许DNS" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:214 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:188 msgid "Accept DNS configuration from the Tailscale admin console." msgstr "使用 Tailscale 管理控制台的 DNS 配置。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:206 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:180 msgid "Accept Routes" msgstr "启用路由" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:206 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:180 msgid "Accept subnet routes that other nodes advertise." msgstr "接受其他节点广播的子网路由。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:263 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:237 msgid "Access Control" msgstr "访问控制" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:273 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:247 msgid "Additional Flags" msgstr "参数列表" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:204 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:178 msgid "Advanced Settings" msgstr "高级设置" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:155 -msgid "Are you sure you want to logout and unbind the current device?" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:129 +msgid "Are you sure you want to log out and unbind the current device?" msgstr "是否注销当前登录并且解绑当前设备?" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:285 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:259 msgid "Auth Key" msgstr "认证密钥" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:273 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:247 msgid "Available flags" msgstr "可用参数" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:169 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:143 msgid "Basic Settings" msgstr "基础设置" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:164 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:178 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:138 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:152 msgid "Collecting data ..." msgstr "正在收集数据..." -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:278 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:252 msgid "Custom Server Settings" msgstr "自定义服务器" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:184 msgid "Device Name" msgstr "设备名称" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:171 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:145 msgid "Enable" msgstr "启用" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:218 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:47 +msgid "Error parsing interface info: %s." +msgstr "接口信息解析错误:%s。" + +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:192 msgid "Exit Node" msgstr "出口节点" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:236 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210 msgid "Expose Subnets" msgstr "公开网段" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:236 -msgid "Expose physical network routes into Tailscale, e.g. 10.0.0.0/24." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210 +msgid "" +"Expose physical network routes into Tailscale, e.g. 10.0.0.0/24." msgstr "广播子网路由至 Tailscale,例如:10.0.0.0/24。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:271 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:245 msgid "Extra Settings" msgstr "附加设置" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:190 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:164 msgid "Firewall Mode" msgstr "防火墙模式" @@ -100,11 +101,11 @@ msgstr "全局设置" msgid "Grant access to Tailscale configuration" msgstr "授予访问 Tailscale 配置的权限" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:93 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:75 msgid "IPv4 Address" msgstr "IPv4地址" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:97 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:79 msgid "IPv6 Address" msgstr "IPv6地址" @@ -112,84 +113,88 @@ msgstr "IPv6地址" msgid "Interface Info" msgstr "接口信息" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:89 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:71 msgid "Interface Name" msgstr "接口名称" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:266 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:240 msgid "LAN access Tailscale" msgstr "本地局域网访问虚拟局域网" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:184 msgid "Leave blank to use the device's hostname." msgstr "留空以使用设备的主机名。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:273 -msgid "List of extra flags. Format: --flags=value, e.g. --exit-node=10.0.0.1.
%s for enabling settings upon the initiation of Tailscale." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:247 +msgid "" +"List of extra flags. Format: --flags=value, e.g. --exit-node=10.0.0.1.
%s for enabling settings upon the initiation of Tailscale." msgstr "额外参数的列表。格式:--flags=value,例如 --exit-node=10.0.0.1
在 Tailscale 启动时的%s。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:91 +msgid "Log out and Unbind" +msgstr "注销登录并解除绑定" + +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:170 msgid "Logging program activities." msgstr "记录程序运行信息。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:200 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:174 msgid "Logging program errors and exceptions." msgstr "记录程序错误和警告信息。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:175 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:149 msgid "Login Status" msgstr "已绑定用户" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:117 -msgid "Logout and Unbind" -msgstr "注销登录并解除绑定" - #: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:30 msgid "Logs" msgstr "日志" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:101 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:83 msgid "MTU" msgstr "MTU" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:104 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:119 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:78 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:93 msgid "NOT RUNNING" msgstr "未运行" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:114 -msgid "Needs Login" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:88 +msgid "Need to log in" msgstr "未登录" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:87 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:66 msgid "Network Interface Information" msgstr "网络接口信息" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:229 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:203 msgid "No Available Exit Nodes" msgstr "没有可用的出口节点" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:256 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:230 msgid "No Available Subnet Routes" msgstr "没有可用的子网路由" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:83 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:63 msgid "No interface online." msgstr "无在线接口。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:218 -msgid "Offer to be an exit node for outbound internet traffic from the Tailscale network." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:192 +msgid "" +"Offer to be an exit node for outbound internet traffic from the Tailscale " +"network." msgstr "作为 Tailscale 广域网出口节点。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:222 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196 msgid "Online Exit Nodes" msgstr "可用出口节点" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:181 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:155 msgid "Port" msgstr "端口" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:102 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:76 msgid "RUNNING" msgstr "运行中" @@ -203,75 +208,72 @@ msgctxt "scroll to bottom (the tail) of the log file" msgid "Scroll to tail" msgstr "滚动到底部" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:222 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196 msgid "Select an online machine name to use as an exit node." msgstr "选择一个可用的节点名称作为出口节点使用。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:250 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:224 msgid "Select subnet routes advertised by other nodes in Tailscale network." msgstr "选择非本设备广播的子网路由。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:281 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:255 msgid "Server Address" msgstr "服务器地址" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:181 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:155 msgid "Set the Tailscale port number." msgstr "设置 Tailscale 端口号。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:245 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:219 msgid "Site To Site" msgstr "子网互通" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:200 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:174 msgid "StdErr Log" msgstr "错误日志" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:170 msgid "StdOut Log" msgstr "运行日志" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:250 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:224 msgid "Subnet Routes" msgstr "子网路由" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:120 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:102 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:104 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:102 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:76 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:78 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:115 #: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:3 msgid "Tailscale" msgstr "Tailscale" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:264 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:238 msgid "Tailscale access LAN" msgstr "虚拟局域网访问本地局域网" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:265 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:239 msgid "Tailscale access WAN" msgstr "虚拟局域网访问本地广域网" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:121 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:103 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:115 msgid "Tailscale is a cross-platform and easy to use virtual LAN." msgstr "Tailscale 是一个跨平台且易于使用的虚拟局域网 VPN。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:186 -msgid "The working directory contains config files, audit logs, and runtime info." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:160 +msgid "" +"The working directory contains config files, audit logs, and runtime info." msgstr "工作目录包含配置文件、审计日志和运行时信息。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:105 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:87 msgid "Total Download" msgstr "总下载量" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:109 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:91 msgid "Total Upload" msgstr "总上传量" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:33 -msgid "Unable to get interface %s info: %s." -msgstr "无法获取接口 %s 的信息:%s。" - #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:18 msgid "Unable to get interface info: %s." msgstr "无法获取接口信息:%s。" @@ -280,18 +282,20 @@ msgstr "无法获取接口信息:%s。" msgid "Unable to load log data:" msgstr "无法读取日志数据:" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:279 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:253 msgid "Use %s to deploy a private server." msgstr "使用 %s 部署私有服务器" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:245 -msgid "Use site-to-site layer 3 networking to connect subnets on the Tailscale network." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:219 +msgid "" +"Use site-to-site layer 3 networking to connect subnets on the Tailscale " +"network." msgstr "使用站点到站点的三层网络连接 Tailscale 中的子网。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:267 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:241 msgid "WAN access Tailscale" msgstr "本地广域网访问虚拟局域网" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:186 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:160 msgid "Workdir" msgstr "工作目录" diff --git a/luci-app-tailscale/po/zh_Hant/tailscale.po b/luci-app-tailscale/po/zh_Hant/tailscale.po index d412baae4..76725362f 100644 --- a/luci-app-tailscale/po/zh_Hant/tailscale.po +++ b/luci-app-tailscale/po/zh_Hant/tailscale.po @@ -7,88 +7,89 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:224 -msgid "-- Please choose --" -msgstr "-- 請選擇 --" - -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:214 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:188 msgid "Accept DNS" msgstr "允許DNS" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:214 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:188 msgid "Accept DNS configuration from the Tailscale admin console." msgstr "使用 Tailscale 管理控制台的 DNS 設定。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:206 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:180 msgid "Accept Routes" msgstr "啟用路由" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:206 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:180 msgid "Accept subnet routes that other nodes advertise." msgstr "接受其他節點廣播的子網路由。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:263 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:237 msgid "Access Control" msgstr "訪問控制" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:273 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:247 msgid "Additional Flags" msgstr "參數列表" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:204 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:178 msgid "Advanced Settings" msgstr "高級設置" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:155 -msgid "Are you sure you want to logout and unbind the current device?" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:129 +msgid "Are you sure you want to log out and unbind the current device?" msgstr "是否註銷當前登錄並且解綁當前設備?" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:285 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:259 msgid "Auth Key" msgstr "認證密鑰" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:273 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:247 msgid "Available flags" msgstr "可用參數" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:169 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:143 msgid "Basic Settings" msgstr "基礎設置" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:164 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:178 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:138 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:152 msgid "Collecting data ..." msgstr "正在收集數據..." -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:278 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:252 msgid "Custom Server Settings" msgstr "自定義伺服器" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:184 msgid "Device Name" msgstr "設備名稱" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:171 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:145 msgid "Enable" msgstr "啟用" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:218 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:47 +msgid "Error parsing interface info: %s." +msgstr "接口信息解析錯誤:%s。" + +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:192 msgid "Exit Node" msgstr "出口節點" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:236 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210 msgid "Expose Subnets" msgstr "公開網段" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:236 -msgid "Expose physical network routes into Tailscale, e.g. 10.0.0.0/24." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210 +msgid "" +"Expose physical network routes into Tailscale, e.g. 10.0.0.0/24." msgstr "廣播子網路由至 Tailscale,例如:10.0.0.0/24。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:271 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:245 msgid "Extra Settings" msgstr "附加設置" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:190 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:164 msgid "Firewall Mode" msgstr "防火牆模式" @@ -100,11 +101,11 @@ msgstr "全局設置" msgid "Grant access to Tailscale configuration" msgstr "授予訪問 Tailscale 配置的權限" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:93 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:75 msgid "IPv4 Address" msgstr "IPv4地址" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:97 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:79 msgid "IPv6 Address" msgstr "IPv6地址" @@ -112,84 +113,88 @@ msgstr "IPv6地址" msgid "Interface Info" msgstr "接口信息" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:89 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:71 msgid "Interface Name" msgstr "接口名稱" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:266 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:240 msgid "LAN access Tailscale" msgstr "本地局域網訪問虛擬局域網" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:210 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:184 msgid "Leave blank to use the device's hostname." msgstr "留空以使用設備的主機名。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:273 -msgid "List of extra flags. Format: --flags=value, e.g. --exit-node=10.0.0.1.
%s for enabling settings upon the initiation of Tailscale." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:247 +msgid "" +"List of extra flags. Format: --flags=value, e.g. --exit-node=10.0.0.1.
%s for enabling settings upon the initiation of Tailscale." msgstr "額外參數的列表。格式:--flags=value,例如 --exit-node=10.0.0.1
在 Tailscale 啟動時的%s。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:91 +msgid "Log out and Unbind" +msgstr "註銷登錄並解除綁定" + +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:170 msgid "Logging program activities." msgstr "記錄程式運行信息。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:200 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:174 msgid "Logging program errors and exceptions." msgstr "記錄程式錯誤和警告信息。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:175 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:149 msgid "Login Status" msgstr "已綁定用戶" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:117 -msgid "Logout and Unbind" -msgstr "註銷登錄並解除綁定" - #: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:30 msgid "Logs" msgstr "日誌" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:101 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:83 msgid "MTU" msgstr "MTU" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:104 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:119 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:78 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:93 msgid "NOT RUNNING" msgstr "未運行" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:114 -msgid "Needs Login" +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:88 +msgid "Need to log in" msgstr "未登錄" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:87 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:66 msgid "Network Interface Information" msgstr "網絡接口信息" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:229 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:203 msgid "No Available Exit Nodes" msgstr "没有可用的出口節點" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:256 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:230 msgid "No Available Subnet Routes" msgstr "沒有可用的子網路由" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:83 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:63 msgid "No interface online." msgstr "無在線接口。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:218 -msgid "Offer to be an exit node for outbound internet traffic from the Tailscale network." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:192 +msgid "" +"Offer to be an exit node for outbound internet traffic from the Tailscale " +"network." msgstr "作為 Tailscale 廣域網出口節點。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:222 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196 msgid "Online Exit Nodes" msgstr "可用出口節點" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:181 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:155 msgid "Port" msgstr "端口" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:102 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:76 msgid "RUNNING" msgstr "運行中" @@ -203,75 +208,72 @@ msgctxt "scroll to bottom (the tail) of the log file" msgid "Scroll to tail" msgstr "捲動到尾部" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:222 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196 msgid "Select an online machine name to use as an exit node." msgstr "選擇一個可用的節點名稱作為出口節點使用。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:250 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:224 msgid "Select subnet routes advertised by other nodes in Tailscale network." msgstr "選擇非本設備廣播的子網路由。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:281 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:255 msgid "Server Address" msgstr "伺服器地址" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:181 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:155 msgid "Set the Tailscale port number." msgstr "設置 Tailscale 端口號。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:245 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:219 msgid "Site To Site" msgstr "子網互通" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:200 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:174 msgid "StdErr Log" msgstr "錯誤日誌" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:196 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:170 msgid "StdOut Log" msgstr "運行日誌" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:250 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:224 msgid "Subnet Routes" msgstr "子網路由" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:120 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:102 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:104 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:102 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:76 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:78 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:115 #: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:3 msgid "Tailscale" msgstr "Tailscale" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:264 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:238 msgid "Tailscale access LAN" msgstr "虛擬局域網訪問本地局域網" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:265 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:239 msgid "Tailscale access WAN" msgstr "虛擬局域網訪問本地廣域網" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:121 -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:103 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:115 msgid "Tailscale is a cross-platform and easy to use virtual LAN." msgstr "Tailscale 是一個跨平台且易於使用的虛擬局域網 VPN。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:186 -msgid "The working directory contains config files, audit logs, and runtime info." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:160 +msgid "" +"The working directory contains config files, audit logs, and runtime info." msgstr "工作目錄包含配置文件、審計日誌和運行時信息。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:105 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:87 msgid "Total Download" msgstr "總下載量" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:109 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:91 msgid "Total Upload" msgstr "總上傳量" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:33 -msgid "Unable to get interface %s info: %s." -msgstr "無法獲取接口 %s 的信息:%s。" - #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:18 msgid "Unable to get interface info: %s." msgstr "無法獲取接口信息:%s。" @@ -280,18 +282,20 @@ msgstr "無法獲取接口信息:%s。" msgid "Unable to load log data:" msgstr "無法載入日誌檔:" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:279 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:253 msgid "Use %s to deploy a private server." msgstr "使用 %s 部署私有伺服器" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:245 -msgid "Use site-to-site layer 3 networking to connect subnets on the Tailscale network." +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:219 +msgid "" +"Use site-to-site layer 3 networking to connect subnets on the Tailscale " +"network." msgstr "使用站點到站點的三層網路連線 Tailscale 中的子網。" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:267 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:241 msgid "WAN access Tailscale" msgstr "本地廣域網訪問虛擬局域網" -#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:186 +#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:160 msgid "Workdir" msgstr "工作目錄" diff --git a/luci-app-tailscale/root/usr/share/rpcd/acl.d/luci-app-tailscale.json b/luci-app-tailscale/root/usr/share/rpcd/acl.d/luci-app-tailscale.json index 6fc186080..344febf5f 100644 --- a/luci-app-tailscale/root/usr/share/rpcd/acl.d/luci-app-tailscale.json +++ b/luci-app-tailscale/root/usr/share/rpcd/acl.d/luci-app-tailscale.json @@ -3,14 +3,12 @@ "description": "Grant access to Tailscale configuration", "read": { "file": { - "/sbin/ifconfig": [ "exec" ], + "/sbin/ip": [ "exec" ], "/sbin/logread": [ "exec" ], "/usr/sbin/tailscale": [ "exec" ] }, "ubus": { - "service": [ "list" ], - "network.interface.lan": [ "status" ], - "network.interface.wan": [ "status" ] + "service": [ "list" ] }, "uci": [ "tailscale" ] },