update 2025-04-25 00:28:39

This commit is contained in:
kenzok8 2025-04-25 00:28:39 +08:00
parent de224ff05d
commit f7e54dd3d4
8 changed files with 354 additions and 373 deletions

View File

@ -8,7 +8,7 @@ LUCI_TITLE:=LuCI for Tailscale
LUCI_DEPENDS:=+tailscale LUCI_DEPENDS:=+tailscale
LUCI_PKGARCH:=all LUCI_PKGARCH:=all
PKG_VERSION:=1.2.3 PKG_VERSION:=1.2.4
include $(TOPDIR)/feeds/luci/luci.mk include $(TOPDIR)/feeds/luci/luci.mk

View File

@ -30,15 +30,21 @@ Tailscale is a zero config VPN for building secure networks.
## How to install prebuilt packages ## 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) - Login OpenWrt terminal (SSH)
### opkg package manager
```shell ```shell
opkg update opkg update
opkg install --force-overwrite /tmp/luci-*-tailscale*.ipk opkg install --force-overwrite /tmp/luci-*-tailscale*.ipk
``` ```
### apk package manager
```shell
apk update
apk add —allow-untrusted /tmp/luci-*-tailscale*.apk
```
-------------- --------------
## Thanks ## Thanks

View File

@ -11,62 +11,51 @@
'require ui'; 'require ui';
'require view'; '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({ return view.extend({
load: function() { 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() === '') { if (res.code !== 0 || !res.stdout || res.stdout.trim() === '') {
ui.addNotification(null, E('p', {}, _('Unable to get interface info: %s.').format(res.message))); 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); try {
if (!interfaces || interfaces.length === 0) const interfaces = JSON.parse(res.stdout);
return 'No interface online.'; const tailscaleInterfaces = interfaces.filter(iface => iface.ifname.match(/tailscale[0-9]+/));
var promises = interfaces.map(function(name) { return tailscaleInterfaces.map(iface => {
return fs.exec('/sbin/ifconfig', [name]); const parsedInfo = {
}); name: iface.ifname
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
}; };
lines.forEach(function(line) { const addr_info = iface.addr_info || [];
if (line.includes('inet addr:')) { addr_info.forEach(addr => {
parsedInfo.ipv4 = line.split('inet addr:')[1].trim().split(' ')[0]; if (addr.family === 'inet') {
} else if (line.includes('inet6 addr:')) { parsedInfo.ipv4 = addr.local;
parsedInfo.ipv6 = line.split('inet6 addr:')[1].trim().split('/')[0]; } else if (addr.family === 'inet6') {
} else if (line.includes('MTU:')) { parsedInfo.ipv6 = addr.local;
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];
}
} }
}); });
parsedInfo.mtu = iface.mtu;
parsedInfo.rxBytes = formatBytes(iface.stats64.rx.bytes);
parsedInfo.txBytes = formatBytes(iface.stats64.tx.bytes);
return parsedInfo; return parsedInfo;
}); });
}); } catch (e) {
ui.addNotification(null, E('p', {}, _('Error parsing interface info: %s.').format(e.message)));
return [];
}
}); });
}, },
@ -82,9 +71,11 @@ return view.extend({
if (!Array.isArray(data)) { if (!Array.isArray(data)) {
return E('div', {}, _('No interface online.')); return E('div', {}, _('No interface online.'));
} }
var rows = data.flatMap(function(interfaceData) { const rows = [
return [ E('th', { class: 'th', colspan: '2' }, _('Network Interface Information'))
E('th', {class: 'th', colspan: '2'}, _('Network Interface Information')), ];
data.forEach(interfaceData => {
rows.push(
E('tr', { class: 'tr' }, [ E('tr', { class: 'tr' }, [
E('td', { class: 'td left', width: '25%' }, _('Interface Name')), E('td', { class: 'td left', width: '25%' }, _('Interface Name')),
E('td', { class: 'td left', width: '25%' }, interfaceData.name) E('td', { class: 'td left', width: '25%' }, interfaceData.name)
@ -109,19 +100,19 @@ return view.extend({
E('td', { class: 'td left', width: '25%' }, _('Total Upload')), E('td', { class: 'td left', width: '25%' }, _('Total Upload')),
E('td', { class: 'td left', width: '25%' }, interfaceData.txBytes) E('td', { class: 'td left', width: '25%' }, interfaceData.txBytes)
]) ])
]; );
}); });
return E('table', { 'class': 'table' }, rows); return E('table', { 'class': 'table' }, rows);
}, },
render: function(data) { render: function(data) {
var content = E([], [ const content = E([], [
E('h2', { class: 'content' }, _('Tailscale')), E('h2', { class: 'content' }, _('Tailscale')),
E('div', { class: 'cbi-map-descr' }, _('Tailscale is a cross-platform and easy to use virtual LAN.')), E('div', { class: 'cbi-map-descr' }, _('Tailscale is a cross-platform and easy to use virtual LAN.')),
E('div') E('div')
]); ]);
var container = content.lastElementChild; const container = content.lastElementChild;
dom.content(container, this.renderContent(data)); dom.content(container, this.renderContent(data));
this.pollData(container); this.pollData(container);

View File

@ -6,6 +6,7 @@
'use strict'; 'use strict';
'require form'; 'require form';
'require fs'; 'require fs';
'require network';
'require poll'; 'require poll';
'require rpc'; 'require rpc';
'require uci'; 'require uci';
@ -18,49 +19,22 @@ var callServiceList = rpc.declare({
expect: { '': {} } expect: { '': {} }
}); });
function callInterfaceStatus(interfaceName) {
return rpc.declare({
object: `network.interface.${interfaceName}`,
method: 'status',
params: ['name'],
expect: { '': {} }
});
}
function getInterfaceSubnets(interfaces = ['lan', 'wan']) { function getInterfaceSubnets(interfaces = ['lan', 'wan']) {
const calculateSubnetAndCIDR = (ip, cidr) => { return network.getNetworks().then(networks => {
const cidrInt = parseInt(cidr, 10); return [...new Set(
const maskBinary = '1'.repeat(cidrInt).padEnd(32, '0'); networks
const ipBinary = (ip) => .filter(ifc => interfaces.includes(ifc.getName()))
ip.split('.').map(octet => parseInt(octet, 10).toString(2).padStart(8, '0')) .flatMap(ifc => ifc.getIPAddrs())
.join(''); .filter(addr => addr.includes('/'))
const subnetBinary = ipBinary(ip).split('').map((bit, index) => .map(addr => {
(bit === '1' && maskBinary[index] === '1') ? '1' : '0' const [ip, cidr] = addr.split('/');
).join(''); const ipParts = ip.split('.').map(Number);
const subnet = [ const mask = ~((1 << (32 - parseInt(cidr))) - 1);
parseInt(subnetBinary.slice(0, 8), 2), const subnetParts = ipParts.map((part, i) => (part & (mask >> (24 - i * 8))) & 255);
parseInt(subnetBinary.slice(8, 16), 2), return `${subnetParts.join('.')}/${cidr}`;
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(() => []);
} }
function getStatus() { function getStatus() {
@ -111,7 +85,7 @@ function renderLogin(loginStatus, authURL, displayName) {
var spanTemp = '<span style="color:%s">%s</span>'; var spanTemp = '<span style="color:%s">%s</span>';
var renderHTML; var renderHTML;
if (loginStatus == "NeedsLogin") { if (loginStatus == "NeedsLogin") {
renderHTML = String.format('<a href="%s" target="_blank">%s</a>', authURL, _('Needs Login')); renderHTML = String.format('<a href="%s" target="_blank">%s</a>', authURL, _('Need to log in'));
} else if (loginStatus == "Running") { } else if (loginStatus == "Running") {
renderHTML = String.format('<a href="%s" target="_blank">%s</a>', 'https://login.tailscale.com/admin/machines', displayName); renderHTML = String.format('<a href="%s" target="_blank">%s</a>', 'https://login.tailscale.com/admin/machines', displayName);
renderHTML += String.format('<br><a style="color:green" id="logout_button">%s</a>', _('Log out and Unbind')); renderHTML += String.format('<br><a style="color:green" id="logout_button">%s</a>', _('Log out and Unbind'));
@ -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.')); 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) { if (onlineExitNodes.length > 0) {
o.value('', _('-- Please choose --')); o.optional = false;
onlineExitNodes.forEach(function(node) { onlineExitNodes.forEach(function(node) {
o.value(node, node); o.value(node, node);
}); });

View File

@ -1,88 +1,89 @@
msgid "" msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8" msgstr "Content-Type: text/plain; charset=UTF-8"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:224 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:188
msgid "-- Please choose --"
msgstr ""
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:214
msgid "Accept DNS" msgid "Accept DNS"
msgstr "" 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." msgid "Accept DNS configuration from the Tailscale admin console."
msgstr "" 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" msgid "Accept Routes"
msgstr "" 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." msgid "Accept subnet routes that other nodes advertise."
msgstr "" 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" msgid "Access Control"
msgstr "" 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" msgid "Additional Flags"
msgstr "" 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" msgid "Advanced Settings"
msgstr "" msgstr ""
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:155 #: 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?" msgid "Are you sure you want to log out and unbind the current device?"
msgstr "" 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" msgid "Auth Key"
msgstr "" 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" msgid "Available flags"
msgstr "" 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" msgid "Basic Settings"
msgstr "" msgstr ""
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:164 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:138
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:178 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:152
msgid "Collecting data ..." msgid "Collecting data ..."
msgstr "" 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" msgid "Custom Server Settings"
msgstr "" 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" msgid "Device Name"
msgstr "" 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" msgid "Enable"
msgstr "" 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" msgid "Exit Node"
msgstr "" 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" msgid "Expose Subnets"
msgstr "" 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 physical network routes into Tailscale, e.g. <code>10.0.0.0/24</code>." msgid ""
"Expose physical network routes into Tailscale, e.g. <code>10.0.0.0/24</code>."
msgstr "" 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" msgid "Extra Settings"
msgstr "" 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" msgid "Firewall Mode"
msgstr "" msgstr ""
@ -94,11 +95,11 @@ msgstr ""
msgid "Grant access to Tailscale configuration" msgid "Grant access to Tailscale configuration"
msgstr "" 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" msgid "IPv4 Address"
msgstr "" 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" msgid "IPv6 Address"
msgstr "" msgstr ""
@ -106,84 +107,88 @@ msgstr ""
msgid "Interface Info" msgid "Interface Info"
msgstr "" 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" msgid "Interface Name"
msgstr "" 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" msgid "LAN access Tailscale"
msgstr "" 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." msgid "Leave blank to use the device's hostname."
msgstr "" 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 "List of extra flags. Format: --flags=value, e.g. <code>--exit-node=10.0.0.1</code>. <br> %s for enabling settings upon the initiation of Tailscale." msgid ""
"List of extra flags. Format: --flags=value, e.g. <code>--exit-node=10.0.0.1</"
"code>. <br> %s for enabling settings upon the initiation of Tailscale."
msgstr "" 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." msgid "Logging program activities."
msgstr "" 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." msgid "Logging program errors and exceptions."
msgstr "" 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" msgid "Login Status"
msgstr "" 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 #: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:30
msgid "Logs" msgid "Logs"
msgstr "" 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" msgid "MTU"
msgstr "" msgstr ""
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:104 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:78
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:119 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:93
msgid "NOT RUNNING" msgid "NOT RUNNING"
msgstr "" msgstr ""
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:114 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:88
msgid "Needs Login" msgid "Need to log in"
msgstr "" 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" msgid "Network Interface Information"
msgstr "" 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" msgid "No Available Exit Nodes"
msgstr "" 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" msgid "No Available Subnet Routes"
msgstr "" 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." msgid "No interface online."
msgstr "" msgstr ""
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:218 #: 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." msgid ""
"Offer to be an exit node for outbound internet traffic from the Tailscale "
"network."
msgstr "" 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" msgid "Online Exit Nodes"
msgstr "" 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" msgid "Port"
msgstr "" 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" msgid "RUNNING"
msgstr "" msgstr ""
@ -197,75 +202,72 @@ msgctxt "scroll to bottom (the tail) of the log file"
msgid "Scroll to tail" msgid "Scroll to tail"
msgstr "" 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." msgid "Select an online machine name to use as an exit node."
msgstr "" 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." msgid "Select subnet routes advertised by other nodes in Tailscale network."
msgstr "" 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" msgid "Server Address"
msgstr "" 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." msgid "Set the Tailscale port number."
msgstr "" 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" msgid "Site To Site"
msgstr "" 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" msgid "StdErr Log"
msgstr "" 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" msgid "StdOut Log"
msgstr "" 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" msgid "Subnet Routes"
msgstr "" msgstr ""
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:120 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:102
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.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:104 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:78
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141 #: 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 #: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:3
msgid "Tailscale" msgid "Tailscale"
msgstr "" 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" msgid "Tailscale access LAN"
msgstr "" 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" msgid "Tailscale access WAN"
msgstr "" msgstr ""
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:121 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:103
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:115
msgid "Tailscale is a cross-platform and easy to use virtual LAN." msgid "Tailscale is a cross-platform and easy to use virtual LAN."
msgstr "" 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 "The working directory contains config files, audit logs, and runtime info." msgid ""
"The working directory contains config files, audit logs, and runtime info."
msgstr "" 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" msgid "Total Download"
msgstr "" 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" msgid "Total Upload"
msgstr "" 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 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:18
msgid "Unable to get interface info: %s." msgid "Unable to get interface info: %s."
msgstr "" msgstr ""
@ -274,18 +276,20 @@ msgstr ""
msgid "Unable to load log data:" msgid "Unable to load log data:"
msgstr "" 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." msgid "Use %s to deploy a private server."
msgstr "" 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 "Use site-to-site layer 3 networking to connect subnets on the Tailscale network." msgid ""
"Use site-to-site layer 3 networking to connect subnets on the Tailscale "
"network."
msgstr "" 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" msgid "WAN access Tailscale"
msgstr "" 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" msgid "Workdir"
msgstr "" msgstr ""

View File

@ -7,88 +7,89 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:224 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:188
msgid "-- Please choose --"
msgstr "-- 请选择 --"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:214
msgid "Accept DNS" msgid "Accept DNS"
msgstr "允许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." msgid "Accept DNS configuration from the Tailscale admin console."
msgstr "使用 Tailscale 管理控制台的 DNS 配置。" 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" msgid "Accept Routes"
msgstr "启用路由" 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." msgid "Accept subnet routes that other nodes advertise."
msgstr "接受其他节点广播的子网路由。" 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" msgid "Access Control"
msgstr "访问控制" 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" msgid "Additional Flags"
msgstr "参数列表" 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" msgid "Advanced Settings"
msgstr "高级设置" msgstr "高级设置"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:155 #: 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?" msgid "Are you sure you want to log out and unbind the current device?"
msgstr "是否注销当前登录并且解绑当前设备?" 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" msgid "Auth Key"
msgstr "认证密钥" 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" msgid "Available flags"
msgstr "可用参数" 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" msgid "Basic Settings"
msgstr "基础设置" msgstr "基础设置"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:164 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:138
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:178 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:152
msgid "Collecting data ..." msgid "Collecting data ..."
msgstr "正在收集数据..." 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" msgid "Custom Server Settings"
msgstr "自定义服务器" 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" msgid "Device Name"
msgstr "设备名称" 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" msgid "Enable"
msgstr "启用" 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" msgid "Exit Node"
msgstr "出口节点" 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" msgid "Expose Subnets"
msgstr "公开网段" 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 physical network routes into Tailscale, e.g. <code>10.0.0.0/24</code>." msgid ""
"Expose physical network routes into Tailscale, e.g. <code>10.0.0.0/24</code>."
msgstr "广播子网路由至 Tailscale例如<code>10.0.0.0/24</code>。" msgstr "广播子网路由至 Tailscale例如<code>10.0.0.0/24</code>。"
#: 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" msgid "Extra Settings"
msgstr "附加设置" 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" msgid "Firewall Mode"
msgstr "防火墙模式" msgstr "防火墙模式"
@ -100,11 +101,11 @@ msgstr "全局设置"
msgid "Grant access to Tailscale configuration" msgid "Grant access to Tailscale configuration"
msgstr "授予访问 Tailscale 配置的权限" 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" msgid "IPv4 Address"
msgstr "IPv4地址" 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" msgid "IPv6 Address"
msgstr "IPv6地址" msgstr "IPv6地址"
@ -112,84 +113,88 @@ msgstr "IPv6地址"
msgid "Interface Info" msgid "Interface Info"
msgstr "接口信息" 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" msgid "Interface Name"
msgstr "接口名称" 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" msgid "LAN access Tailscale"
msgstr "本地局域网访问虚拟局域网" 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." msgid "Leave blank to use the device's hostname."
msgstr "留空以使用设备的主机名。" 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 "List of extra flags. Format: --flags=value, e.g. <code>--exit-node=10.0.0.1</code>. <br> %s for enabling settings upon the initiation of Tailscale." msgid ""
"List of extra flags. Format: --flags=value, e.g. <code>--exit-node=10.0.0.1</"
"code>. <br> %s for enabling settings upon the initiation of Tailscale."
msgstr "额外参数的列表。格式:--flags=value例如 <code>--exit-node=10.0.0.1</code>。<br> 在 Tailscale 启动时的%s。" msgstr "额外参数的列表。格式:--flags=value例如 <code>--exit-node=10.0.0.1</code>。<br> 在 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." msgid "Logging program activities."
msgstr "记录程序运行信息。" 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." msgid "Logging program errors and exceptions."
msgstr "记录程序错误和警告信息。" 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" msgid "Login Status"
msgstr "已绑定用户" 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 #: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:30
msgid "Logs" msgid "Logs"
msgstr "日志" 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" msgid "MTU"
msgstr "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:78
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:119 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:93
msgid "NOT RUNNING" msgid "NOT RUNNING"
msgstr "未运行" msgstr "未运行"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:114 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:88
msgid "Needs Login" msgid "Need to log in"
msgstr "未登录" 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" msgid "Network Interface Information"
msgstr "网络接口信息" 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" msgid "No Available Exit Nodes"
msgstr "没有可用的出口节点" 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" msgid "No Available Subnet Routes"
msgstr "没有可用的子网路由" 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." msgid "No interface online."
msgstr "无在线接口。" msgstr "无在线接口。"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:218 #: 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." msgid ""
"Offer to be an exit node for outbound internet traffic from the Tailscale "
"network."
msgstr "作为 Tailscale 广域网出口节点。" 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" msgid "Online Exit Nodes"
msgstr "可用出口节点" 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" msgid "Port"
msgstr "端口" 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" msgid "RUNNING"
msgstr "运行中" msgstr "运行中"
@ -203,75 +208,72 @@ msgctxt "scroll to bottom (the tail) of the log file"
msgid "Scroll to tail" msgid "Scroll to tail"
msgstr "滚动到底部" 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." msgid "Select an online machine name to use as an exit node."
msgstr "选择一个可用的节点名称作为出口节点使用。" 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." msgid "Select subnet routes advertised by other nodes in Tailscale network."
msgstr "选择非本设备广播的子网路由。" 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" msgid "Server Address"
msgstr "服务器地址" 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." msgid "Set the Tailscale port number."
msgstr "设置 Tailscale 端口号。" 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" msgid "Site To Site"
msgstr "子网互通" 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" msgid "StdErr Log"
msgstr "错误日志" 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" msgid "StdOut Log"
msgstr "运行日志" 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" msgid "Subnet Routes"
msgstr "子网路由" msgstr "子网路由"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:120 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:102
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.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:104 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:78
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141 #: 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 #: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:3
msgid "Tailscale" msgid "Tailscale"
msgstr "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" msgid "Tailscale access LAN"
msgstr "虚拟局域网访问本地局域网" 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" msgid "Tailscale access WAN"
msgstr "虚拟局域网访问本地广域网" msgstr "虚拟局域网访问本地广域网"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:121 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:103
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:115
msgid "Tailscale is a cross-platform and easy to use virtual LAN." msgid "Tailscale is a cross-platform and easy to use virtual LAN."
msgstr "Tailscale 是一个跨平台且易于使用的虚拟局域网 VPN。" msgstr "Tailscale 是一个跨平台且易于使用的虚拟局域网 VPN。"
#: 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 "The working directory contains config files, audit logs, and runtime info." msgid ""
"The working directory contains config files, audit logs, and runtime info."
msgstr "工作目录包含配置文件、审计日志和运行时信息。" 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" msgid "Total Download"
msgstr "总下载量" 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" msgid "Total Upload"
msgstr "总上传量" 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 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:18
msgid "Unable to get interface info: %s." msgid "Unable to get interface info: %s."
msgstr "无法获取接口信息:%s。" msgstr "无法获取接口信息:%s。"
@ -280,18 +282,20 @@ msgstr "无法获取接口信息:%s。"
msgid "Unable to load log data:" msgid "Unable to load log data:"
msgstr "无法读取日志数据:" 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." msgid "Use %s to deploy a private server."
msgstr "使用 %s 部署私有服务器" msgstr "使用 %s 部署私有服务器"
#: 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 "Use site-to-site layer 3 networking to connect subnets on the Tailscale network." msgid ""
"Use site-to-site layer 3 networking to connect subnets on the Tailscale "
"network."
msgstr "使用站点到站点的三层网络连接 Tailscale 中的子网。" 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" msgid "WAN access Tailscale"
msgstr "本地广域网访问虚拟局域网" 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" msgid "Workdir"
msgstr "工作目录" msgstr "工作目录"

View File

@ -7,88 +7,89 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:224 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:188
msgid "-- Please choose --"
msgstr "-- 請選擇 --"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:214
msgid "Accept DNS" msgid "Accept DNS"
msgstr "允許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." msgid "Accept DNS configuration from the Tailscale admin console."
msgstr "使用 Tailscale 管理控制台的 DNS 設定。" 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" msgid "Accept Routes"
msgstr "啟用路由" 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." msgid "Accept subnet routes that other nodes advertise."
msgstr "接受其他節點廣播的子網路由。" 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" msgid "Access Control"
msgstr "訪問控制" 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" msgid "Additional Flags"
msgstr "參數列表" 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" msgid "Advanced Settings"
msgstr "高級設置" msgstr "高級設置"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:155 #: 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?" msgid "Are you sure you want to log out and unbind the current device?"
msgstr "是否註銷當前登錄並且解綁當前設備?" 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" msgid "Auth Key"
msgstr "認證密鑰" 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" msgid "Available flags"
msgstr "可用參數" 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" msgid "Basic Settings"
msgstr "基礎設置" msgstr "基礎設置"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:164 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:138
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:178 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:152
msgid "Collecting data ..." msgid "Collecting data ..."
msgstr "正在收集數據..." 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" msgid "Custom Server Settings"
msgstr "自定義伺服器" 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" msgid "Device Name"
msgstr "設備名稱" 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" msgid "Enable"
msgstr "啟用" 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" msgid "Exit Node"
msgstr "出口節點" 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" msgid "Expose Subnets"
msgstr "公開網段" 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 physical network routes into Tailscale, e.g. <code>10.0.0.0/24</code>." msgid ""
"Expose physical network routes into Tailscale, e.g. <code>10.0.0.0/24</code>."
msgstr "廣播子網路由至 Tailscale例如<code>10.0.0.0/24</code>。" msgstr "廣播子網路由至 Tailscale例如<code>10.0.0.0/24</code>。"
#: 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" msgid "Extra Settings"
msgstr "附加設置" 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" msgid "Firewall Mode"
msgstr "防火牆模式" msgstr "防火牆模式"
@ -100,11 +101,11 @@ msgstr "全局設置"
msgid "Grant access to Tailscale configuration" msgid "Grant access to Tailscale configuration"
msgstr "授予訪問 Tailscale 配置的權限" 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" msgid "IPv4 Address"
msgstr "IPv4地址" 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" msgid "IPv6 Address"
msgstr "IPv6地址" msgstr "IPv6地址"
@ -112,84 +113,88 @@ msgstr "IPv6地址"
msgid "Interface Info" msgid "Interface Info"
msgstr "接口信息" 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" msgid "Interface Name"
msgstr "接口名稱" 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" msgid "LAN access Tailscale"
msgstr "本地局域網訪問虛擬局域網" 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." msgid "Leave blank to use the device's hostname."
msgstr "留空以使用設備的主機名。" 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 "List of extra flags. Format: --flags=value, e.g. <code>--exit-node=10.0.0.1</code>. <br> %s for enabling settings upon the initiation of Tailscale." msgid ""
"List of extra flags. Format: --flags=value, e.g. <code>--exit-node=10.0.0.1</"
"code>. <br> %s for enabling settings upon the initiation of Tailscale."
msgstr "額外參數的列表。格式:--flags=value例如 <code>--exit-node=10.0.0.1</code>。<br> 在 Tailscale 啟動時的%s。" msgstr "額外參數的列表。格式:--flags=value例如 <code>--exit-node=10.0.0.1</code>。<br> 在 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." msgid "Logging program activities."
msgstr "記錄程式運行信息。" 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." msgid "Logging program errors and exceptions."
msgstr "記錄程式錯誤和警告信息。" 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" msgid "Login Status"
msgstr "已綁定用戶" 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 #: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:30
msgid "Logs" msgid "Logs"
msgstr "日誌" 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" msgid "MTU"
msgstr "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:78
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:119 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:93
msgid "NOT RUNNING" msgid "NOT RUNNING"
msgstr "未運行" msgstr "未運行"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:114 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:88
msgid "Needs Login" msgid "Need to log in"
msgstr "未登錄" 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" msgid "Network Interface Information"
msgstr "網絡接口信息" 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" msgid "No Available Exit Nodes"
msgstr "没有可用的出口節點" 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" msgid "No Available Subnet Routes"
msgstr "沒有可用的子網路由" 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." msgid "No interface online."
msgstr "無在線接口。" msgstr "無在線接口。"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:218 #: 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." msgid ""
"Offer to be an exit node for outbound internet traffic from the Tailscale "
"network."
msgstr "作為 Tailscale 廣域網出口節點。" 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" msgid "Online Exit Nodes"
msgstr "可用出口節點" 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" msgid "Port"
msgstr "端口" 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" msgid "RUNNING"
msgstr "運行中" msgstr "運行中"
@ -203,75 +208,72 @@ msgctxt "scroll to bottom (the tail) of the log file"
msgid "Scroll to tail" msgid "Scroll to tail"
msgstr "捲動到尾部" 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." msgid "Select an online machine name to use as an exit node."
msgstr "選擇一個可用的節點名稱作為出口節點使用。" 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." msgid "Select subnet routes advertised by other nodes in Tailscale network."
msgstr "選擇非本設備廣播的子網路由。" 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" msgid "Server Address"
msgstr "伺服器地址" 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." msgid "Set the Tailscale port number."
msgstr "設置 Tailscale 端口號。" 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" msgid "Site To Site"
msgstr "子網互通" 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" msgid "StdErr Log"
msgstr "錯誤日誌" 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" msgid "StdOut Log"
msgstr "運行日誌" 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" msgid "Subnet Routes"
msgstr "子網路由" msgstr "子網路由"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:120 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:102
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.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:104 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:78
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141 #: 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 #: luci-app-tailscale/root/usr/share/luci/menu.d/luci-app-tailscale.json:3
msgid "Tailscale" msgid "Tailscale"
msgstr "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" msgid "Tailscale access LAN"
msgstr "虛擬局域網訪問本地局域網" 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" msgid "Tailscale access WAN"
msgstr "虛擬局域網訪問本地廣域網" msgstr "虛擬局域網訪問本地廣域網"
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:121 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:103
#: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:141 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/setting.js:115
msgid "Tailscale is a cross-platform and easy to use virtual LAN." msgid "Tailscale is a cross-platform and easy to use virtual LAN."
msgstr "Tailscale 是一個跨平台且易於使用的虛擬局域網 VPN。" msgstr "Tailscale 是一個跨平台且易於使用的虛擬局域網 VPN。"
#: 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 "The working directory contains config files, audit logs, and runtime info." msgid ""
"The working directory contains config files, audit logs, and runtime info."
msgstr "工作目錄包含配置文件、審計日誌和運行時信息。" 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" msgid "Total Download"
msgstr "總下載量" 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" msgid "Total Upload"
msgstr "總上傳量" 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 #: luci-app-tailscale/htdocs/luci-static/resources/view/tailscale/interface.js:18
msgid "Unable to get interface info: %s." msgid "Unable to get interface info: %s."
msgstr "無法獲取接口信息:%s。" msgstr "無法獲取接口信息:%s。"
@ -280,18 +282,20 @@ msgstr "無法獲取接口信息:%s。"
msgid "Unable to load log data:" msgid "Unable to load log data:"
msgstr "無法載入日誌檔:" 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." msgid "Use %s to deploy a private server."
msgstr "使用 %s 部署私有伺服器" msgstr "使用 %s 部署私有伺服器"
#: 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 "Use site-to-site layer 3 networking to connect subnets on the Tailscale network." msgid ""
"Use site-to-site layer 3 networking to connect subnets on the Tailscale "
"network."
msgstr "使用站點到站點的三層網路連線 Tailscale 中的子網。" 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" msgid "WAN access Tailscale"
msgstr "本地廣域網訪問虛擬局域網" 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" msgid "Workdir"
msgstr "工作目錄" msgstr "工作目錄"

View File

@ -3,14 +3,12 @@
"description": "Grant access to Tailscale configuration", "description": "Grant access to Tailscale configuration",
"read": { "read": {
"file": { "file": {
"/sbin/ifconfig": [ "exec" ], "/sbin/ip": [ "exec" ],
"/sbin/logread": [ "exec" ], "/sbin/logread": [ "exec" ],
"/usr/sbin/tailscale": [ "exec" ] "/usr/sbin/tailscale": [ "exec" ]
}, },
"ubus": { "ubus": {
"service": [ "list" ], "service": [ "list" ]
"network.interface.lan": [ "status" ],
"network.interface.wan": [ "status" ]
}, },
"uci": [ "tailscale" ] "uci": [ "tailscale" ]
}, },