diff --git a/luci-app-fchomo/.prepare.sh b/luci-app-fchomo/.prepare.sh index f1f3595c8..0ed2a0e15 100755 --- a/luci-app-fchomo/.prepare.sh +++ b/luci-app-fchomo/.prepare.sh @@ -15,7 +15,7 @@ mkdir -p "$PKG_BUILD_BIN" curl -L "https://github.com/jqlang/jq/releases/download/jq-${JQVERSION}/jq-${OS}-${ARCH}" -o "$PKG_BUILD_BIN"/jq chmod +x "$PKG_BUILD_BIN"/jq latest="$(curl -L https://api.github.com/repos/kpym/gm/releases/latest | jq -rc '.tag_name' 2>/dev/null)" -curl -L "https://github.com/kpym/gm/releases/download/${latest}/gm_${latest#v}_Linux_64bit.tar.gz" -o- | tar -xz -C "$PKG_BUILD_BIN" +curl -L "https://github.com/kpym/gm/releases/download/${latest}/gm_${latest#v}_Linux_intel64.tar.gz" -o- | tar -xz -C "$PKG_BUILD_BIN" latest="$(curl -L https://api.github.com/repos/tdewolff/minify/releases/latest | jq -rc '.tag_name' 2>/dev/null)" curl -L "https://github.com/tdewolff/minify/releases/download/${latest}/minify_${OS}_${ARCH}.tar.gz" -o- | tar -xz -C "$PKG_BUILD_BIN" chmod -R +x "$PKG_BUILD_BIN" diff --git a/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js b/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js index 1785707d8..ad8df6f6f 100644 --- a/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js @@ -54,6 +54,17 @@ return baseclass.extend({ ['https://www.gstatic.com/generate_204'] ], + inbound_type: [ + ['http', _('HTTP')], + ['socks', _('SOCKS')], + ['mixed', _('Mixed')], + ['shadowsocks', _('Shadowsocks')], + ['vmess', _('VMess')], + ['tuic', _('TUIC')], + ['hysteria2', _('Hysteria2')], + //['tunnel', _('Tunnel')] + ], + ip_version: [ ['', _('Keep default')], ['dual', _('Dual stack')], @@ -163,6 +174,34 @@ return baseclass.extend({ //'SUB-RULE': 0, }, + shadowsocks_cipher_methods: [ + /* Stream */ + ['none', _('none')], + /* AEAD */ + ['aes-128-gcm', _('aes-128-gcm')], + ['aes-192-gcm', _('aes-192-gcm')], + ['aes-256-gcm', _('aes-256-gcm')], + ['chacha20-ietf-poly1305', _('chacha20-ietf-poly1305')], + ['xchacha20-ietf-poly1305', _('xchacha20-ietf-poly1305')], + /* AEAD 2022 */ + ['2022-blake3-aes-128-gcm', _('2022-blake3-aes-128-gcm')], + ['2022-blake3-aes-256-gcm', _('2022-blake3-aes-256-gcm')], + ['2022-blake3-chacha20-poly1305', _('2022-blake3-chacha20-poly1305')] + ], + + shadowsocks_cipher_length: { + /* AEAD */ + 'aes-128-gcm': 0, + 'aes-192-gcm': 0, + 'aes-256-gcm': 0, + 'chacha20-ietf-poly1305': 0, + 'xchacha20-ietf-poly1305': 0, + /* AEAD 2022 */ + '2022-blake3-aes-128-gcm': 16, + '2022-blake3-aes-256-gcm': 32, + '2022-blake3-chacha20-poly1305': 32 + }, + tls_client_fingerprints: [ ['chrome'], ['firefox'], @@ -264,7 +303,7 @@ return baseclass.extend({ /* Thanks to luci-app-ssr-plus */ str = str.replace(/-/g, '+').replace(/_/g, '/'); - var padding = (4 - str.length % 4) % 4; + var padding = (4 - (str.length % 4)) % 4; if (padding) str = str + Array(padding + 1).join('='); @@ -273,6 +312,29 @@ return baseclass.extend({ ).join('')); }, + generateRand: function(type, length) { + var byteArr; + if (['base64', 'hex'].includes(type)) + byteArr = crypto.getRandomValues(new Uint8Array(length)); + switch (type) { + case 'base64': + /* Thanks to https://stackoverflow.com/questions/9267899 */ + return btoa(String.fromCharCode.apply(null, byteArr)); + case 'hex': + return Array.from(byteArr, (byte) => + (byte & 255).toString(16).padStart(2, '0') + ).join(''); + case 'uuid': + /* Thanks to https://stackoverflow.com/a/2117523 */ + return (location.protocol === 'https:') ? crypto.randomUUID() : + ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, (c) => + (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) + ); + default: + return null; + }; + }, + getFeatures: function() { var callGetFeatures = rpc.declare({ object: 'luci.fchomo', @@ -554,6 +616,29 @@ return baseclass.extend({ return this.vallist[i]; }, + validateAuth: function(section_id, value) { + if (!value) + return true; + if (!value.match(/^[\w-]{3,}:[^:]+$/)) + return _('Expecting: %s').format('[A-Za-z0-9_-]{3,}:[^:]+'); + + return true; + }, + validateAuthUsername: function(section_id, value) { + if (!value) + return true; + if (!value.match(/^[\w-]{3,}$/)) + return _('Expecting: %s').format('[A-Za-z0-9_-]{3,}'); + + return true; + }, + validateAuthPassword: function(section_id, value) { + if (!value.match(/^[^:]+$/)) + return _('Expecting: %s').format('[^:]+'); + + return true; + }, + validateCommonPort: function(section_id, value) { // thanks to homeproxy var stubValidator = { @@ -617,7 +702,7 @@ return baseclass.extend({ uci.sections(this.config, this.section.sectiontype, (res) => { if (res['.name'] !== section_id) if (res[this.option] === value) - duplicate = true + duplicate = true; }); if (duplicate) return _('Expecting: %s').format(_('unique value')); @@ -641,6 +726,15 @@ return baseclass.extend({ return true; }, + validateUUID: function(section_id, value) { + if (!value) + return true; + else if (value.match('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$') === null) + return _('Expecting: %s').format(_('valid uuid')); + + return true; + }, + lsDir: function(type) { var callLsDir = rpc.declare({ object: 'luci.fchomo', @@ -719,5 +813,26 @@ return baseclass.extend({ } else throw res.error || 'unknown error'; }); + }, + + // thanks to homeproxy + uploadCertificate: function(type, filename, ev) { + var callWriteCertificate = rpc.declare({ + object: 'luci.fchomo', + method: 'certificate_write', + params: ['filename'], + expect: { '': {} } + }); + + return ui.uploadFile('/tmp/fchomo_certificate.tmp', ev.target) + .then(L.bind((btn, res) => { + return L.resolveDefault(callWriteCertificate(filename), {}).then((ret) => { + if (ret.result === true) + ui.addNotification(null, E('p', _('Your %s was successfully uploaded. Size: %sB.').format(type, res.size))); + else + ui.addNotification(null, E('p', _('Failed to upload %s, error: %s.').format(type, ret.error))); + }); + }, this, ev.target)) + .catch((e) => { ui.addNotification(null, E('p', e.message)) }); } }); diff --git a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js index 5e82ba114..cb4f60c04 100644 --- a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/client.js @@ -295,7 +295,7 @@ return view.extend({ ]); } - s = m.section(form.NamedSection, 'global', 'fchomo'); + s = m.section(form.NamedSection, 'routing', 'fchomo', null); /* Proxy Group START */ s.tab('group', _('Proxy Group')); @@ -307,7 +307,6 @@ return view.extend({ o.onclick = L.bind(hm.handleReload, o, 'mihomo-c'); o = s.taboption('group', form.ListValue, 'default_proxy', _('Default outbound')); - o.ucisection = 'routing'; o.load = L.bind(hm.loadProxyGroupLabel, o, hm.preset_outbound.direct); /* Proxy Group */ diff --git a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js index 5c573a1bc..a9cc046ab 100644 --- a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js +++ b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js @@ -34,7 +34,7 @@ function handleResUpdate(type, repo) { }); // Dynamic repo - var label + var label; if (repo) { var section_id = this.section.section; var weight = document.getElementById(this.cbid(section_id)); @@ -188,7 +188,7 @@ return view.extend({ }); }) }, [ _('Check') ]), - E('strong', { id: ElId}, [ + E('strong', { id: ElId }, [ E('span', { style: 'color:gray' }, ' ' + _('unchecked')) ]) ]); @@ -328,14 +328,7 @@ return view.extend({ so = ss.option(form.DynamicList, 'authentication', _('User Authentication')); so.datatype = 'list(string)'; so.placeholder = 'user1:pass1'; - so.validate = function(section_id, value) { - if (!value) - return true; - if (!value.match(/^[\w-]{3,}:[^:]+$/)) - return _('Expecting: %s').format('[A-Za-z0-9_-]{3,}:[^:]+'); - - return true; - } + so.validate = L.bind(hm.validateAuth, so); so = ss.option(form.DynamicList, 'skip_auth_prefixes', _('No Authentication IP ranges')); so.datatype = 'list(cidr)'; @@ -350,22 +343,22 @@ return view.extend({ ss = o.subsection; so = ss.option(form.Value, 'mixed_port', _('Mixed port')); - so.datatype = 'port' + so.datatype = 'port'; so.placeholder = '7890'; so.rmempty = false; so = ss.option(form.Value, 'redir_port', _('Redir port')); - so.datatype = 'port' + so.datatype = 'port'; so.placeholder = '7891'; so.rmempty = false; so = ss.option(form.Value, 'tproxy_port', _('Tproxy port')); - so.datatype = 'port' + so.datatype = 'port'; so.placeholder = '7892'; so.rmempty = false; so = ss.option(form.Value, 'tunnel_port', _('DNS port')); - so.datatype = 'port' + so.datatype = 'port'; so.placeholder = '7893'; so.rmempty = false; @@ -397,7 +390,7 @@ return view.extend({ so.onchange = function(ev, section_id, value) { var desc = ev.target.nextSibling; if (value === 'mixed') - desc.innerHTML = _('Mixed system TCP stack and gVisor UDP stack.') + desc.innerHTML = _('Mixed system TCP stack and gVisor UDP stack.'); else if (value === 'gvisor') desc.innerHTML = _('Based on google/gvisor.'); else if (value === 'system') @@ -588,20 +581,20 @@ return view.extend({ so = ss.taboption('interface', form.Value, 'route_table_id', _('Routing table ID')); so.ucisection = 'config'; - so.datatype = 'uinteger' + so.datatype = 'uinteger'; so.placeholder = '2022'; so.rmempty = false; so = ss.taboption('interface', form.Value, 'route_rule_pref', _('Routing rule priority')); so.ucisection = 'config'; - so.datatype = 'uinteger' + so.datatype = 'uinteger'; so.placeholder = '9000'; so.rmempty = false; so = ss.taboption('interface', form.Value, 'self_mark', _('Routing mark'), _('Priority: Proxy Node > Proxy Group > Global.')); so.ucisection = 'config'; - so.datatype = 'uinteger' + so.datatype = 'uinteger'; so.placeholder = '200'; so.rmempty = false; diff --git a/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/server.js b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/server.js new file mode 100644 index 000000000..cacdc9b7f --- /dev/null +++ b/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/server.js @@ -0,0 +1,390 @@ +'use strict'; +'require form'; +'require poll'; +'require uci'; +'require ui'; +'require view'; + +'require fchomo as hm'; + +function handleGenKey(option) { + var section_id = this.section.section; + var type = this.section.getOption('type').formvalue(section_id); + var widget = this.map.findElement('id', 'widget.cbid.fchomo.%s.%s'.format(section_id, option)); + var password, required_method; + + if (option === 'uuid' || option.match(/_uuid/)) + required_method = 'uuid'; + else if (type === 'shadowsocks') + required_method = this.section.getOption('shadowsocks_chipher')?.formvalue(section_id); + + switch (required_method) { + /* NONE */ + case 'none': + password = ''; + break; + /* UUID */ + case 'uuid': + password = hm.generateRand('uuid'); + break; + /* DEFAULT */ + default: + password = hm.generateRand('hex', 16); + break; + } + /* AEAD */ + (function(length) { + if (length && length > 0) + password = hm.generateRand('base64', length); + }(hm.shadowsocks_cipher_length[required_method])); + + return widget.value = password; +} + +return view.extend({ + load: function() { + return Promise.all([ + uci.load('fchomo'), + hm.getFeatures() + ]); + }, + + render: function(data) { + var dashboard_repo = uci.get(data[0], 'api', 'dashboard_repo'), + features = data[1]; + + var m, s, o; + + m = new form.Map('fchomo', _('Mihomo server'), + _('When used as a server, HomeProxy is a better choice.')); + + s = m.section(form.TypedSection); + s.render = function () { + poll.add(function () { + return hm.getServiceStatus('mihomo-s').then((isRunning) => { + hm.updateStatus(hm, document.getElementById('_server_bar'), isRunning ? { dashboard_repo: dashboard_repo } : false, 'mihomo-s', true); + }); + }); + + return E('div', { class: 'cbi-section' }, [ + E('p', [ + hm.renderStatus(hm, '_server_bar', false, 'mihomo-s', true) + ]) + ]); + } + + s = m.section(form.NamedSection, 'routing', 'fchomo', null); + + /* Server switch */ + o = s.option(form.Button, '_reload_server', _('Quick Reload')); + o.inputtitle = _('Reload'); + o.inputstyle = 'apply'; + o.onclick = L.bind(hm.handleReload, o, 'mihomo-s'); + + o = s.option(form.Flag, 'server_enabled', _('Enable')); + o.default = o.disabled; + + o = s.option(form.Flag, 'server_auto_firewall', _('Auto configure firewall')); + o.default = o.disabled; + + /* Server settings START */ + s = m.section(form.GridSection, 'server', null); + var prefmt = { 'prefix': 'server_', 'suffix': '' }; + s.addremove = true; + s.rowcolors = true; + s.sortable = true; + s.nodescriptions = true; + s.modaltitle = L.bind(hm.loadModalTitle, s, _('Server'), _('Add a server')); + s.sectiontitle = L.bind(hm.loadDefaultLabel, s); + s.renderSectionAdd = L.bind(hm.renderSectionAdd, s, prefmt, false); + s.handleAdd = L.bind(hm.handleAdd, s, prefmt); + + /* General fields */ + o = s.option(form.Value, 'label', _('Label')); + o.load = L.bind(hm.loadDefaultLabel, o); + o.validate = L.bind(hm.validateUniqueValue, o); + o.modalonly = true; + + o = s.option(form.Flag, 'enabled', _('Enable')); + o.default = o.enabled; + o.editable = true; + + o = s.option(form.ListValue, 'type', _('Type')); + o.default = hm.inbound_type[0][0]; + hm.inbound_type.forEach((res) => { + o.value.apply(o, res); + }) + + o = s.option(form.Value, 'listen', _('Listen address')); + o.datatype = 'ipaddr'; + o.placeholder = '::'; + o.modalonly = true; + + o = s.option(form.Value, 'port', _('Listen port')); + o.datatype = 'port'; + o.rmempty = false; + + // dev: Features under development + // rule + // proxy + + /* HTTP / SOCKS fields */ + /* hm.validateAuth */ + o = s.option(form.Value, 'username', _('Username')); + o.validate = L.bind(hm.validateAuthUsername, o); + o.depends({type: /^(http|socks|mixed|hysteria2)$/}); + o.modalonly = true; + + o = s.option(form.Value, 'password', _('Password')); + o.password = true; + o.renderWidget = function() { + var node = form.Value.prototype.renderWidget.apply(this, arguments); + + (node.querySelector('.control-group') || node).appendChild(E('button', { + 'class': 'cbi-button cbi-button-add', + 'title': _('Generate'), + 'click': ui.createHandlerFn(this, handleGenKey, this.option) + }, [ _('Generate') ])); + + return node; + } + o.validate = function(section_id, value) { + } + o.validate = L.bind(hm.validateAuthPassword, o); + o.rmempty = false; + o.depends({type: /^(http|socks|mixed|hysteria2)$/, username: /.+/}); + o.depends({type: /^(tuic)$/, uuid: /.+/}); + o.modalonly = true; + + /* Hysteria2 fields */ + o = s.option(form.Value, 'hysteria_up_mbps', _('Max upload speed'), + _('In Mbps.')); + o.datatype = 'uinteger'; + o.depends('type', 'hysteria2'); + o.modalonly = true; + + o = s.option(form.Value, 'hysteria_down_mbps', _('Max download speed'), + _('In Mbps.')); + o.datatype = 'uinteger'; + o.depends('type', 'hysteria2'); + o.modalonly = true; + + o = s.option(form.Flag, 'hysteria_ignore_client_bandwidth', _('Ignore client bandwidth'), + _('Tell the client to use the BBR flow control algorithm instead of Hysteria CC.')); + o.default = o.disabled; + o.depends({type: 'hysteria2', hysteria_up_mbps: '', hysteria_down_mbps: ''}); + o.modalonly = true; + + o = s.option(form.ListValue, 'hysteria_obfs_type', _('Obfuscate type')); + o.value('', _('Disable')); + o.value('salamander', _('Salamander')); + o.depends('type', 'hysteria2'); + o.modalonly = true; + + o = s.option(form.Value, 'hysteria_obfs_password', _('Obfuscate password'), + _('Enabling obfuscation will make the server incompatible with standard QUIC connections, losing the ability to masquerade with HTTP/3.')); + o.password = true; + o.renderWidget = function() { + var node = form.Value.prototype.renderWidget.apply(this, arguments); + + (node.querySelector('.control-group') || node).appendChild(E('button', { + 'class': 'cbi-button cbi-button-add', + 'title': _('Generate'), + 'click': ui.createHandlerFn(this, handleGenKey, this.option) + }, [ _('Generate') ])); + + return node; + } + o.rmempty = false; + o.depends('type', 'hysteria'); + o.depends({type: 'hysteria2', hysteria_obfs_type: /.+/}); + o.modalonly = true; + + o = s.option(form.Value, 'hysteria_masquerade', _('Masquerade'), + _('HTTP3 server behavior when authentication fails.
A 404 page will be returned if empty.')); + o.placeholder = 'file:///var/www or http://127.0.0.1:8080' + o.depends('type', 'hysteria2'); + o.modalonly = true; + + /* Shadowsocks fields */ + o = s.option(form.ListValue, 'shadowsocks_chipher', _('Chipher')); + o.default = hm.shadowsocks_cipher_methods[1][0]; + hm.shadowsocks_cipher_methods.forEach((res) => { + o.value.apply(o, res); + }) + o.depends('type', 'shadowsocks'); + o.modalonly = true; + + o = s.option(form.Value, 'shadowsocks_password', _('Password')); + o.password = true; + o.renderWidget = function() { + var node = form.Value.prototype.renderWidget.apply(this, arguments); + + (node.querySelector('.control-group') || node).appendChild(E('button', { + 'class': 'cbi-button cbi-button-add', + 'title': _('Generate'), + 'click': ui.createHandlerFn(this, handleGenKey, this.option) + }, [ _('Generate') ])); + + return node; + } + o.validate = function(section_id, value) { + var encmode = this.section.getOption('shadowsocks_chipher').formvalue(section_id); + var length = hm.shadowsocks_cipher_length[encmode]; + if (length) { + length = Math.ceil(length/3)*4; + if (encmode.match(/^2022-/)) { + if (value.length !== length || !value.match(/^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/) || value[length-1] !== '=') + return _('Expecting: %s').format(_('valid base64 key with %d characters').format(length)); + } else { + if (length !== 0 && value.length !== length) + return _('Expecting: %s').format(_('valid key length with %d characters').format(length)); + } + } else + return true; + + return true; + } + o.depends({type: 'shadowsocks', shadowsocks_chipher: /.+/}); + o.modalonly = true; + + /* Tuic fields */ + o = s.option(form.Value, 'uuid', _('UUID')); + o.renderWidget = function() { + var node = form.Value.prototype.renderWidget.apply(this, arguments); + + (node.querySelector('.control-group') || node).appendChild(E('button', { + 'class': 'cbi-button cbi-button-add', + 'title': _('Generate'), + 'click': ui.createHandlerFn(this, handleGenKey, this.option) + }, [ _('Generate') ])); + + return node; + } + o.rmempty = false; + o.validate = L.bind(hm.validateUUID, o); + o.depends('type', 'tuic'); + o.modalonly = true; + + o = s.option(form.ListValue, 'tuic_congestion_controller', _('Congestion controller'), + _('QUIC congestion controller.')); + o.default = 'cubic'; + o.value('cubic', _('cubic')); + o.value('new_reno', _('new_reno')); + o.value('bbr', _('bbr')); + o.depends('type', 'tuic'); + o.modalonly = true; + + o = s.option(form.Value, 'tuic_max_idle_time', _('Idle timeout'), + _('In seconds.')); + o.default = '15000'; + o.validate = L.bind(hm.validateTimeDuration, o); + o.depends('type', 'tuic'); + o.modalonly = true; + + o = s.option(form.Value, 'tuic_authentication_timeout', _('Auth timeout'), + _('In seconds.')); + o.default = '1000'; + o.validate = L.bind(hm.validateTimeDuration, o); + o.depends('type', 'tuic'); + o.modalonly = true; + + o = s.option(form.Value, 'tuic_max_udp_relay_packet_size', _('Max UDP relay packet size')); + o.datatype = 'uinteger'; + o.default = '1500'; + o.depends('type', 'tuic'); + o.modalonly = true; + + /* VMess fields */ + o = s.option(form.Value, 'vmess_uuid', _('UUID')); + o.renderWidget = function() { + var node = form.Value.prototype.renderWidget.apply(this, arguments); + + (node.querySelector('.control-group') || node).appendChild(E('button', { + 'class': 'cbi-button cbi-button-add', + 'title': _('Generate'), + 'click': ui.createHandlerFn(this, handleGenKey, this.option) + }, [ _('Generate') ])); + + return node; + } + o.rmempty = false; + o.validate = L.bind(hm.validateUUID, o); + o.depends('type', 'vmess'); + o.modalonly = true; + + o = s.option(form.Value, 'vmess_alterid', _('Alter ID'), + _('Legacy protocol support (VMess MD5 Authentication) is provided for compatibility purposes only, use of alterId > 1 is not recommended.')); + o.datatype = 'uinteger'; + o.placeholder = '0'; + o.depends('type', 'vmess'); + o.modalonly = true; + + /* TLS fields */ + o = s.option(form.Flag, 'tls', _('TLS')); + o.default = o.disabled; + o.validate = function(section_id, value) { + var type = this.section.getOption('type').formvalue(section_id); + var tls = this.section.getUIElement(section_id, 'tls').node.querySelector('input'); + var tls_alpn = this.section.getUIElement(section_id, 'tls_alpn'); + + // Force enabled + if (['tuic', 'hysteria2'].includes(type)) { + tls.checked = true; + tls.disabled = true; + if (!`${tls_alpn.getValue()}`) + tls_alpn.setValue('h3'); + } else { + tls.disabled = null; + } + + return true; + } + o.depends({type: /^(vmess|tuic|hysteria2)$/}); + o.modalonly = true; + + o = s.option(form.DynamicList, 'tls_alpn', _('TLS ALPN'), + _('List of supported application level protocols, in order of preference.')); + o.depends('tls', '1'); + o.modalonly = true; + + o = s.option(form.Value, 'tls_cert_path', _('Certificate path'), + _('The server public key, in PEM format.')); + o.value('/etc/fchomo/certs/server_publickey.pem'); + o.depends('tls', '1'); + o.rmempty = false; + o.modalonly = true; + + o = s.option(form.Button, '_upload_cert', _('Upload certificate'), + _('Save your configuration before uploading files!')); + o.inputstyle = 'action'; + o.inputtitle = _('Upload...'); + o.depends({tls: '1', tls_cert_path: '/etc/fchomo/certs/server_publickey.pem'}); + o.onclick = L.bind(hm.uploadCertificate, o, _('certificate'), 'server_publickey'); + o.modalonly = true; + + o = s.option(form.Value, 'tls_key_path', _('Key path'), + _('The server private key, in PEM format.')); + o.value('/etc/fchomo/certs/server_privatekey.pem'); + o.rmempty = false; + o.depends({tls: '1', tls_cert_path: /.+/}); + o.modalonly = true; + + o = s.option(form.Button, '_upload_key', _('Upload key'), + _('Save your configuration before uploading files!')); + o.inputstyle = 'action'; + o.inputtitle = _('Upload...'); + o.depends({tls: '1', tls_key_path: '/etc/fchomo/certs/server_privatekey.pem'}); + o.onclick = L.bind(hm.uploadCertificate, o, _('private key'), 'server_privatekey'); + o.modalonly = true; + + /* Extra fields */ + o = s.option(form.Flag, 'udp', _('UDP')); + o.default = o.disabled; + o.depends({type: /^(socks|mixed|shadowsocks)$/}); + o.modalonly = true; + /* Server settings END */ + + return m.render(); + } +}); diff --git a/luci-app-fchomo/po/templates/fchomo.pot b/luci-app-fchomo/po/templates/fchomo.pot index eb2a95267..c738dbaf8 100644 --- a/luci-app-fchomo/po/templates/fchomo.pot +++ b/luci-app-fchomo/po/templates/fchomo.pot @@ -5,18 +5,18 @@ msgstr "Content-Type: text/plain; charset=UTF-8" msgid "%s log" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:352 -#: htdocs/luci-static/resources/fchomo.js:365 -#: htdocs/luci-static/resources/fchomo.js:378 +#: htdocs/luci-static/resources/fchomo.js:414 +#: htdocs/luci-static/resources/fchomo.js:427 +#: htdocs/luci-static/resources/fchomo.js:440 #: htdocs/luci-static/resources/view/fchomo/client.js:256 -#: htdocs/luci-static/resources/view/fchomo/client.js:359 -#: htdocs/luci-static/resources/view/fchomo/client.js:373 -#: htdocs/luci-static/resources/view/fchomo/client.js:868 -#: htdocs/luci-static/resources/view/fchomo/global.js:463 +#: htdocs/luci-static/resources/view/fchomo/client.js:358 +#: htdocs/luci-static/resources/view/fchomo/client.js:372 +#: htdocs/luci-static/resources/view/fchomo/client.js:867 +#: htdocs/luci-static/resources/view/fchomo/global.js:456 msgid "-- Please choose --" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:607 +#: htdocs/luci-static/resources/fchomo.js:692 msgid "/^(\\d+)(s|m|h|d)?$/" msgstr "" @@ -24,44 +24,61 @@ msgstr "" msgid "163Music" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:451 +#: htdocs/luci-static/resources/fchomo.js:187 +msgid "2022-blake3-aes-128-gcm" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:188 +msgid "2022-blake3-aes-256-gcm" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:189 +msgid "2022-blake3-chacha20-poly1305" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:358 +#: htdocs/luci-static/resources/view/fchomo/server.js:373 +msgid "Save your configuration before uploading files!" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:444 msgid "API" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:492 +#: htdocs/luci-static/resources/view/fchomo/global.js:485 msgid "API DoH service" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:483 +#: htdocs/luci-static/resources/view/fchomo/global.js:476 msgid "API HTTP port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:487 +#: htdocs/luci-static/resources/view/fchomo/global.js:480 msgid "API HTTPS port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:441 +#: htdocs/luci-static/resources/view/fchomo/global.js:434 msgid "API TLS certificate path" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:445 +#: htdocs/luci-static/resources/view/fchomo/global.js:438 msgid "API TLS private key path" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:496 +#: htdocs/luci-static/resources/view/fchomo/global.js:489 msgid "API secret" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:569 -#: htdocs/luci-static/resources/view/fchomo/global.js:621 +#: htdocs/luci-static/resources/view/fchomo/global.js:562 +#: htdocs/luci-static/resources/view/fchomo/global.js:612 msgid "Access Control" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:836 +#: htdocs/luci-static/resources/view/fchomo/client.js:835 msgid "Add a DNS policy" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:695 +#: htdocs/luci-static/resources/view/fchomo/client.js:694 msgid "Add a DNS server" msgstr "" @@ -73,11 +90,11 @@ msgstr "" msgid "Add a provider" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:321 +#: htdocs/luci-static/resources/view/fchomo/client.js:320 msgid "Add a proxy group" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:511 +#: htdocs/luci-static/resources/view/fchomo/client.js:510 msgid "Add a routing rule" msgstr "" @@ -85,6 +102,10 @@ msgstr "" msgid "Add a rule set" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:96 +msgid "Add a server" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/node.js:179 msgid "Add prefix" msgstr "" @@ -93,22 +114,22 @@ msgstr "" msgid "Add suffix" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:709 -#: htdocs/luci-static/resources/view/fchomo/client.js:714 +#: htdocs/luci-static/resources/view/fchomo/client.js:708 +#: htdocs/luci-static/resources/view/fchomo/client.js:713 msgid "Address" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:624 -#: htdocs/luci-static/resources/view/fchomo/global.js:668 +#: htdocs/luci-static/resources/view/fchomo/global.js:615 +#: htdocs/luci-static/resources/view/fchomo/global.js:659 msgid "All allowed" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:654 -#: htdocs/luci-static/resources/view/fchomo/global.js:661 +#: htdocs/luci-static/resources/view/fchomo/global.js:645 +#: htdocs/luci-static/resources/view/fchomo/global.js:652 msgid "All ports" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:479 +#: htdocs/luci-static/resources/view/fchomo/global.js:472 msgid "" "Allow access from private network.
To access the API on a private " "network from a public website, it must be enabled." @@ -122,14 +143,26 @@ msgstr "" msgid "Already in updating." msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:315 +msgid "Alter ID" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:140 msgid "Application version" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:284 +msgid "Auth timeout" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:290 msgid "Auto" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:86 +msgid "Auto configure firewall" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:201 msgid "Auto update" msgstr "" @@ -142,7 +175,7 @@ msgstr "" msgid "Baidu" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:402 +#: htdocs/luci-static/resources/view/fchomo/global.js:395 msgid "Based on google/gvisor." msgstr "" @@ -159,23 +192,23 @@ msgstr "" msgid "Binary format only supports domain / ipcidr" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:406 -#: htdocs/luci-static/resources/view/fchomo/global.js:583 +#: htdocs/luci-static/resources/view/fchomo/client.js:405 +#: htdocs/luci-static/resources/view/fchomo/global.js:576 #: htdocs/luci-static/resources/view/fchomo/node.js:236 msgid "Bind interface" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:407 +#: htdocs/luci-static/resources/view/fchomo/client.js:406 #: htdocs/luci-static/resources/view/fchomo/node.js:237 msgid "Bind outbound interface.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:584 +#: htdocs/luci-static/resources/view/fchomo/global.js:577 msgid "" "Bind outbound traffic to specific interface. Leave empty to auto detect.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:626 +#: htdocs/luci-static/resources/view/fchomo/global.js:617 msgid "Black list" msgstr "" @@ -183,27 +216,27 @@ msgstr "" msgid "Block DNS queries" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:646 +#: htdocs/luci-static/resources/view/fchomo/client.js:645 msgid "Boot DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:653 +#: htdocs/luci-static/resources/view/fchomo/client.js:652 msgid "Boot DNS server (Node)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:669 +#: htdocs/luci-static/resources/view/fchomo/global.js:660 msgid "Bypass CN" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:474 +#: htdocs/luci-static/resources/view/fchomo/global.js:467 msgid "CORS Allow origins" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:478 +#: htdocs/luci-static/resources/view/fchomo/global.js:471 msgid "CORS Allow private network" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:475 +#: htdocs/luci-static/resources/view/fchomo/global.js:468 msgid "CORS allowed origins, * will be used if empty." msgstr "" @@ -211,6 +244,10 @@ msgstr "" msgid "Cancel" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:350 +msgid "Certificate path" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:190 msgid "Check" msgstr "" @@ -231,6 +268,10 @@ msgstr "" msgid "China list version" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:209 +msgid "Chipher" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/log.js:76 msgid "Clean log" msgstr "" @@ -247,17 +288,17 @@ msgstr "" msgid "Collecting data..." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:656 -#: htdocs/luci-static/resources/view/fchomo/global.js:663 +#: htdocs/luci-static/resources/view/fchomo/global.js:647 +#: htdocs/luci-static/resources/view/fchomo/global.js:654 msgid "Common and STUN ports" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:655 -#: htdocs/luci-static/resources/view/fchomo/global.js:662 +#: htdocs/luci-static/resources/view/fchomo/global.js:646 +#: htdocs/luci-static/resources/view/fchomo/global.js:653 msgid "Common ports only (bypass P2P traffic)" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:544 +#: htdocs/luci-static/resources/fchomo.js:606 msgid "Complete" msgstr "" @@ -265,6 +306,10 @@ msgstr "" msgid "Configuration Items" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:268 +msgid "Congestion controller" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:166 msgid "Connection check" msgstr "" @@ -291,7 +336,7 @@ msgstr "" msgid "Cron expression" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:685 +#: htdocs/luci-static/resources/view/fchomo/global.js:676 msgid "Custom Direct List" msgstr "" @@ -299,7 +344,7 @@ msgstr "" msgid "Custom HTTP header." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:710 +#: htdocs/luci-static/resources/view/fchomo/global.js:701 msgid "Custom Proxy List" msgstr "" @@ -308,22 +353,22 @@ msgid "" "Custom internal hosts. Support yaml or json format." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:826 -#: htdocs/luci-static/resources/view/fchomo/client.js:836 +#: htdocs/luci-static/resources/view/fchomo/client.js:825 +#: htdocs/luci-static/resources/view/fchomo/client.js:835 msgid "DNS policy" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:367 +#: htdocs/luci-static/resources/view/fchomo/global.js:360 msgid "DNS port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:685 -#: htdocs/luci-static/resources/view/fchomo/client.js:695 -#: htdocs/luci-static/resources/view/fchomo/client.js:881 +#: htdocs/luci-static/resources/view/fchomo/client.js:684 +#: htdocs/luci-static/resources/view/fchomo/client.js:694 +#: htdocs/luci-static/resources/view/fchomo/client.js:880 msgid "DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:632 +#: htdocs/luci-static/resources/view/fchomo/client.js:631 msgid "DNS settings" msgstr "" @@ -339,7 +384,7 @@ msgstr "" msgid "Default DNS (issued by WAN)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:660 +#: htdocs/luci-static/resources/view/fchomo/client.js:659 msgid "Default DNS server" msgstr "" @@ -351,51 +396,52 @@ msgstr "" msgid "Direct" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:628 +#: htdocs/luci-static/resources/view/fchomo/global.js:619 msgid "Direct IPv4 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:631 +#: htdocs/luci-static/resources/view/fchomo/global.js:622 msgid "Direct IPv6 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:634 +#: htdocs/luci-static/resources/view/fchomo/global.js:625 msgid "Direct MAC-s" msgstr "" #: htdocs/luci-static/resources/view/fchomo/global.js:291 +#: htdocs/luci-static/resources/view/fchomo/server.js:178 msgid "Disable" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:402 +#: htdocs/luci-static/resources/view/fchomo/client.js:401 msgid "Disable UDP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:851 -#: htdocs/luci-static/resources/view/fchomo/client.js:856 -#: htdocs/luci-static/resources/view/fchomo/client.js:921 -#: htdocs/luci-static/resources/view/fchomo/client.js:928 -#: htdocs/luci-static/resources/view/fchomo/client.js:930 +#: htdocs/luci-static/resources/view/fchomo/client.js:850 +#: htdocs/luci-static/resources/view/fchomo/client.js:855 +#: htdocs/luci-static/resources/view/fchomo/client.js:920 +#: htdocs/luci-static/resources/view/fchomo/client.js:927 +#: htdocs/luci-static/resources/view/fchomo/client.js:929 msgid "Domain" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:450 +#: htdocs/luci-static/resources/fchomo.js:512 msgid "Download failed: %s" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:448 +#: htdocs/luci-static/resources/fchomo.js:510 msgid "Download successful." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:59 +#: htdocs/luci-static/resources/fchomo.js:70 msgid "Dual stack" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:806 +#: htdocs/luci-static/resources/view/fchomo/client.js:805 msgid "ECS override" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:790 +#: htdocs/luci-static/resources/view/fchomo/client.js:789 msgid "EDNS Client Subnet" msgstr "" @@ -416,25 +462,33 @@ msgstr "" msgid "Editer" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:341 -#: htdocs/luci-static/resources/view/fchomo/client.js:521 -#: htdocs/luci-static/resources/view/fchomo/client.js:705 -#: htdocs/luci-static/resources/view/fchomo/client.js:846 +#: htdocs/luci-static/resources/view/fchomo/client.js:340 +#: htdocs/luci-static/resources/view/fchomo/client.js:520 +#: htdocs/luci-static/resources/view/fchomo/client.js:704 +#: htdocs/luci-static/resources/view/fchomo/client.js:845 #: htdocs/luci-static/resources/view/fchomo/global.js:289 -#: htdocs/luci-static/resources/view/fchomo/global.js:533 +#: htdocs/luci-static/resources/view/fchomo/global.js:526 #: htdocs/luci-static/resources/view/fchomo/node.js:45 #: htdocs/luci-static/resources/view/fchomo/node.js:94 #: htdocs/luci-static/resources/view/fchomo/node.js:256 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:181 +#: htdocs/luci-static/resources/view/fchomo/server.js:83 +#: htdocs/luci-static/resources/view/fchomo/server.js:107 msgid "Enable" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:423 +#: htdocs/luci-static/resources/view/fchomo/server.js:184 +msgid "" +"Enabling obfuscation will make the server incompatible with standard QUIC " +"connections, losing the ability to masquerade with HTTP/3." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:416 msgid "Endpoint-Independent NAT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:525 -#: htdocs/luci-static/resources/view/fchomo/client.js:873 +#: htdocs/luci-static/resources/view/fchomo/client.js:524 +#: htdocs/luci-static/resources/view/fchomo/client.js:872 msgid "Entry" msgstr "" @@ -442,53 +496,58 @@ msgstr "" msgid "Error" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:458 +#: htdocs/luci-static/resources/view/fchomo/client.js:457 msgid "" "Exceeding this triggers a forced health check. 5 will be used " "if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:495 +#: htdocs/luci-static/resources/view/fchomo/client.js:494 #: htdocs/luci-static/resources/view/fchomo/node.js:306 msgid "Exclude matched node types." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:490 +#: htdocs/luci-static/resources/view/fchomo/client.js:489 #: htdocs/luci-static/resources/view/fchomo/node.js:300 msgid "Exclude nodes that meet keywords or regexps." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:450 +#: htdocs/luci-static/resources/view/fchomo/client.js:449 #: htdocs/luci-static/resources/view/fchomo/node.js:287 msgid "Expected HTTP code. 204 will be used if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:452 +#: htdocs/luci-static/resources/view/fchomo/client.js:451 #: htdocs/luci-static/resources/view/fchomo/node.js:289 msgid "Expected status" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:474 -#: htdocs/luci-static/resources/fchomo.js:477 -#: htdocs/luci-static/resources/fchomo.js:480 -#: htdocs/luci-static/resources/fchomo.js:576 -#: htdocs/luci-static/resources/fchomo.js:593 -#: htdocs/luci-static/resources/fchomo.js:596 -#: htdocs/luci-static/resources/fchomo.js:607 -#: htdocs/luci-static/resources/fchomo.js:614 +#: htdocs/luci-static/resources/fchomo.js:536 +#: htdocs/luci-static/resources/fchomo.js:539 +#: htdocs/luci-static/resources/fchomo.js:542 #: htdocs/luci-static/resources/fchomo.js:623 -#: htdocs/luci-static/resources/fchomo.js:635 -#: htdocs/luci-static/resources/fchomo.js:638 +#: htdocs/luci-static/resources/fchomo.js:631 +#: htdocs/luci-static/resources/fchomo.js:637 +#: htdocs/luci-static/resources/fchomo.js:661 +#: htdocs/luci-static/resources/fchomo.js:678 +#: htdocs/luci-static/resources/fchomo.js:681 +#: htdocs/luci-static/resources/fchomo.js:692 +#: htdocs/luci-static/resources/fchomo.js:699 +#: htdocs/luci-static/resources/fchomo.js:708 +#: htdocs/luci-static/resources/fchomo.js:720 +#: htdocs/luci-static/resources/fchomo.js:723 +#: htdocs/luci-static/resources/fchomo.js:733 #: htdocs/luci-static/resources/view/fchomo/client.js:27 -#: htdocs/luci-static/resources/view/fchomo/client.js:335 -#: htdocs/luci-static/resources/view/fchomo/client.js:720 -#: htdocs/luci-static/resources/view/fchomo/global.js:335 +#: htdocs/luci-static/resources/view/fchomo/client.js:334 +#: htdocs/luci-static/resources/view/fchomo/client.js:719 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:199 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:213 +#: htdocs/luci-static/resources/view/fchomo/server.js:237 +#: htdocs/luci-static/resources/view/fchomo/server.js:240 msgid "Expecting: %s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:552 +#: htdocs/luci-static/resources/view/fchomo/global.js:545 msgid "Experimental" msgstr "" @@ -500,51 +559,55 @@ msgstr "" msgid "Factor" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:502 +#: htdocs/luci-static/resources/fchomo.js:564 msgid "Failed to execute \"/etc/init.d/fchomo %s %s\" reason: %s" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:108 +#: htdocs/luci-static/resources/fchomo.js:833 +msgid "Failed to upload %s, error: %s." +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:119 msgid "Fallback" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/client.js:666 #: htdocs/luci-static/resources/view/fchomo/client.js:667 -#: htdocs/luci-static/resources/view/fchomo/client.js:668 -#: htdocs/luci-static/resources/view/fchomo/client.js:679 +#: htdocs/luci-static/resources/view/fchomo/client.js:678 msgid "Fallback DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:900 +#: htdocs/luci-static/resources/view/fchomo/client.js:899 msgid "Fallback filter" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:485 +#: htdocs/luci-static/resources/view/fchomo/client.js:484 #: htdocs/luci-static/resources/view/fchomo/node.js:295 msgid "Filter nodes that meet keywords or regexps." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:661 -#: htdocs/luci-static/resources/view/fchomo/client.js:678 +#: htdocs/luci-static/resources/view/fchomo/client.js:660 +#: htdocs/luci-static/resources/view/fchomo/client.js:677 msgid "Final DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:661 -#: htdocs/luci-static/resources/view/fchomo/client.js:675 +#: htdocs/luci-static/resources/view/fchomo/client.js:660 +#: htdocs/luci-static/resources/view/fchomo/client.js:674 msgid "Final DNS server (Used to Domestic-IP response)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:668 -#: htdocs/luci-static/resources/view/fchomo/client.js:676 +#: htdocs/luci-static/resources/view/fchomo/client.js:667 +#: htdocs/luci-static/resources/view/fchomo/client.js:675 msgid "Final DNS server (Used to Overseas-IP response)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:474 +#: htdocs/luci-static/resources/view/fchomo/client.js:473 msgid "" "For details, see %s." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:451 +#: htdocs/luci-static/resources/view/fchomo/client.js:450 #: htdocs/luci-static/resources/view/fchomo/node.js:187 #: htdocs/luci-static/resources/view/fchomo/node.js:288 msgid "" @@ -552,7 +615,7 @@ msgid "" "noopener\">%s." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:512 +#: htdocs/luci-static/resources/view/fchomo/global.js:505 msgid "Forced sniffing domain" msgstr "" @@ -574,7 +637,7 @@ msgstr "" msgid "General" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:326 +#: htdocs/luci-static/resources/view/fchomo/client.js:325 #: htdocs/luci-static/resources/view/fchomo/node.js:84 msgid "General fields" msgstr "" @@ -583,7 +646,20 @@ msgstr "" msgid "General settings" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:411 +#: htdocs/luci-static/resources/view/fchomo/server.js:144 +#: htdocs/luci-static/resources/view/fchomo/server.js:146 +#: htdocs/luci-static/resources/view/fchomo/server.js:191 +#: htdocs/luci-static/resources/view/fchomo/server.js:193 +#: htdocs/luci-static/resources/view/fchomo/server.js:224 +#: htdocs/luci-static/resources/view/fchomo/server.js:226 +#: htdocs/luci-static/resources/view/fchomo/server.js:257 +#: htdocs/luci-static/resources/view/fchomo/server.js:259 +#: htdocs/luci-static/resources/view/fchomo/server.js:304 +#: htdocs/luci-static/resources/view/fchomo/server.js:306 +msgid "Generate" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:404 msgid "Generic segmentation offload" msgstr "" @@ -595,17 +671,17 @@ msgstr "" msgid "GeoSite version" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:910 +#: htdocs/luci-static/resources/view/fchomo/client.js:909 msgid "Geoip code" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:907 +#: htdocs/luci-static/resources/view/fchomo/client.js:906 msgid "Geoip enable" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:852 -#: htdocs/luci-static/resources/view/fchomo/client.js:861 -#: htdocs/luci-static/resources/view/fchomo/client.js:919 +#: htdocs/luci-static/resources/view/fchomo/client.js:851 +#: htdocs/luci-static/resources/view/fchomo/client.js:860 +#: htdocs/luci-static/resources/view/fchomo/client.js:918 msgid "Geosite" msgstr "" @@ -622,7 +698,7 @@ msgstr "" msgid "Global Authentication" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:435 +#: htdocs/luci-static/resources/view/fchomo/global.js:428 msgid "Global client fingerprint" msgstr "" @@ -634,11 +710,12 @@ msgstr "" msgid "Grant access to fchomo configuration" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:351 +#: htdocs/luci-static/resources/view/fchomo/client.js:350 msgid "Group" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:73 +#: htdocs/luci-static/resources/fchomo.js:58 +#: htdocs/luci-static/resources/fchomo.js:84 msgid "HTTP" msgstr "" @@ -646,35 +723,41 @@ msgstr "" msgid "HTTP header" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:774 +#: htdocs/luci-static/resources/view/fchomo/client.js:773 msgid "HTTP/3" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:672 +#: htdocs/luci-static/resources/view/fchomo/server.js:203 +msgid "" +"HTTP3 server behavior when authentication fails.
A 404 page will be " +"returned if empty." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:663 msgid "Handle domain" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:420 +#: htdocs/luci-static/resources/view/fchomo/client.js:419 #: htdocs/luci-static/resources/view/fchomo/node.js:260 msgid "Health check URL" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:449 +#: htdocs/luci-static/resources/view/fchomo/client.js:448 #: htdocs/luci-static/resources/view/fchomo/node.js:286 msgid "Health check expected status" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:429 +#: htdocs/luci-static/resources/view/fchomo/client.js:428 #: htdocs/luci-static/resources/view/fchomo/node.js:269 msgid "Health check interval" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:436 +#: htdocs/luci-static/resources/view/fchomo/client.js:435 #: htdocs/luci-static/resources/view/fchomo/node.js:275 msgid "Health check timeout" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:328 +#: htdocs/luci-static/resources/view/fchomo/client.js:327 #: htdocs/luci-static/resources/view/fchomo/node.js:86 msgid "Health fields" msgstr "" @@ -684,40 +767,49 @@ msgstr "" msgid "Hosts" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:81 +#: htdocs/luci-static/resources/fchomo.js:92 msgid "Hysteria" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:82 +#: htdocs/luci-static/resources/fchomo.js:64 +#: htdocs/luci-static/resources/fchomo.js:93 msgid "Hysteria2" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:912 -#: htdocs/luci-static/resources/view/fchomo/client.js:925 +#: htdocs/luci-static/resources/view/fchomo/client.js:911 +#: htdocs/luci-static/resources/view/fchomo/client.js:924 msgid "IP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:923 +#: htdocs/luci-static/resources/view/fchomo/client.js:922 msgid "IP CIDR" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:60 +#: htdocs/luci-static/resources/fchomo.js:71 msgid "IPv4 only" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:61 +#: htdocs/luci-static/resources/fchomo.js:72 msgid "IPv6 only" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:643 +#: htdocs/luci-static/resources/view/fchomo/client.js:642 #: htdocs/luci-static/resources/view/fchomo/global.js:305 msgid "IPv6 support" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:277 +msgid "Idle timeout" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/client.js:27 msgid "If Block is selected, uncheck others" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:171 +msgid "Ignore client bandwidth" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/ruleset.js:152 msgid "Import" msgstr "" @@ -730,50 +822,57 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/node.js:218 #: htdocs/luci-static/resources/view/fchomo/node.js:223 +#: htdocs/luci-static/resources/view/fchomo/server.js:160 +#: htdocs/luci-static/resources/view/fchomo/server.js:166 msgid "In Mbps." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:437 -#: htdocs/luci-static/resources/view/fchomo/client.js:466 +#: htdocs/luci-static/resources/view/fchomo/client.js:436 +#: htdocs/luci-static/resources/view/fchomo/client.js:465 #: htdocs/luci-static/resources/view/fchomo/node.js:276 msgid "In millisecond. %s will be used if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:430 +#: htdocs/luci-static/resources/view/fchomo/server.js:278 +#: htdocs/luci-static/resources/view/fchomo/server.js:285 +msgid "In seconds." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/client.js:429 #: htdocs/luci-static/resources/view/fchomo/global.js:315 #: htdocs/luci-static/resources/view/fchomo/global.js:320 -#: htdocs/luci-static/resources/view/fchomo/global.js:419 +#: htdocs/luci-static/resources/view/fchomo/global.js:412 #: htdocs/luci-static/resources/view/fchomo/node.js:146 #: htdocs/luci-static/resources/view/fchomo/node.js:270 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:261 msgid "In seconds. %s will be used if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:346 +#: htdocs/luci-static/resources/view/fchomo/global.js:339 msgid "Inbound" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:386 +#: htdocs/luci-static/resources/view/fchomo/client.js:385 msgid "Include all" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:391 +#: htdocs/luci-static/resources/view/fchomo/client.js:390 msgid "Include all node" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:396 +#: htdocs/luci-static/resources/view/fchomo/client.js:395 msgid "Include all provider" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:397 +#: htdocs/luci-static/resources/view/fchomo/client.js:396 msgid "Includes all Provider." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:387 +#: htdocs/luci-static/resources/view/fchomo/client.js:386 msgid "Includes all Proxy Node and Provider." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:392 +#: htdocs/luci-static/resources/view/fchomo/client.js:391 msgid "Includes all Proxy Node." msgstr "" @@ -781,46 +880,66 @@ msgstr "" msgid "Info" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:576 +#: htdocs/luci-static/resources/view/fchomo/global.js:569 msgid "Interface Control" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:58 +#: htdocs/luci-static/resources/fchomo.js:69 msgid "Keep default" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:331 -#: htdocs/luci-static/resources/view/fchomo/client.js:516 -#: htdocs/luci-static/resources/view/fchomo/client.js:700 -#: htdocs/luci-static/resources/view/fchomo/client.js:841 +#: htdocs/luci-static/resources/view/fchomo/server.js:365 +msgid "Key path" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/client.js:330 +#: htdocs/luci-static/resources/view/fchomo/client.js:515 +#: htdocs/luci-static/resources/view/fchomo/client.js:699 +#: htdocs/luci-static/resources/view/fchomo/client.js:840 #: htdocs/luci-static/resources/view/fchomo/node.js:40 #: htdocs/luci-static/resources/view/fchomo/node.js:89 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:176 +#: htdocs/luci-static/resources/view/fchomo/server.js:102 msgid "Label" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:443 +#: htdocs/luci-static/resources/view/fchomo/client.js:442 #: htdocs/luci-static/resources/view/fchomo/node.js:281 msgid "Lazy" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:404 +#: htdocs/luci-static/resources/view/fchomo/server.js:316 +msgid "" +"Legacy protocol support (VMess MD5 Authentication) is provided for " +"compatibility purposes only, use of alterId > 1 is not recommended." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:397 msgid "Less compatibility and sometimes better performance." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:578 +#: htdocs/luci-static/resources/view/fchomo/server.js:346 +msgid "List of supported application level protocols, in order of preference." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:117 +msgid "Listen address" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:571 msgid "Listen interfaces" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:638 +#: htdocs/luci-static/resources/view/fchomo/client.js:637 +#: htdocs/luci-static/resources/view/fchomo/server.js:122 msgid "Listen port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:349 +#: htdocs/luci-static/resources/view/fchomo/global.js:342 msgid "Listen ports" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:110 +#: htdocs/luci-static/resources/fchomo.js:121 msgid "Load balance" msgstr "" @@ -845,64 +964,82 @@ msgstr "" msgid "Log level" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:474 +#: htdocs/luci-static/resources/fchomo.js:536 msgid "Lowercase only" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:407 +#: htdocs/luci-static/resources/view/fchomo/global.js:400 msgid "MTU" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:857 +#: htdocs/luci-static/resources/view/fchomo/server.js:202 +msgid "Masquerade" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/client.js:856 msgid "Match domain. Support wildcards." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:929 +#: htdocs/luci-static/resources/view/fchomo/client.js:928 msgid "Match domain. Support wildcards.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:862 +#: htdocs/luci-static/resources/view/fchomo/client.js:861 msgid "Match geosite." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:920 +#: htdocs/luci-static/resources/view/fchomo/client.js:919 msgid "Match geosite.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:911 +#: htdocs/luci-static/resources/view/fchomo/client.js:910 msgid "Match response with geoip.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:924 +#: htdocs/luci-static/resources/view/fchomo/client.js:923 msgid "Match response with ipcidr.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:867 +#: htdocs/luci-static/resources/view/fchomo/client.js:866 msgid "Match rule set." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:457 +#: htdocs/luci-static/resources/view/fchomo/server.js:291 +msgid "Max UDP relay packet size" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/client.js:456 msgid "Max count of failures" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:165 +msgid "Max download speed" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:159 +msgid "Max upload speed" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/client.js:281 #: htdocs/luci-static/resources/view/fchomo/log.js:100 msgid "Mihomo client" msgstr "" #: htdocs/luci-static/resources/view/fchomo/log.js:103 +#: htdocs/luci-static/resources/view/fchomo/server.js:58 msgid "Mihomo server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:393 +#: htdocs/luci-static/resources/fchomo.js:60 +#: htdocs/luci-static/resources/view/fchomo/global.js:386 msgid "Mixed" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:400 +#: htdocs/luci-static/resources/view/fchomo/global.js:393 msgid "Mixed system TCP stack and gVisor UDP stack." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:352 +#: htdocs/luci-static/resources/view/fchomo/global.js:345 msgid "Mixed port" msgstr "" @@ -914,15 +1051,15 @@ msgstr "" msgid "Name of the Proxy group to download rule set." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:340 +#: htdocs/luci-static/resources/view/fchomo/global.js:333 msgid "No Authentication IP ranges" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:720 +#: htdocs/luci-static/resources/view/fchomo/client.js:719 msgid "No add'l params" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:444 +#: htdocs/luci-static/resources/view/fchomo/client.js:443 #: htdocs/luci-static/resources/view/fchomo/node.js:282 msgid "No testing is performed when this provider node is not in use." msgstr "" @@ -931,44 +1068,52 @@ msgstr "" msgid "No valid rule-set link found." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:358 +#: htdocs/luci-static/resources/view/fchomo/client.js:357 #: htdocs/luci-static/resources/view/fchomo/node.js:35 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:38 msgid "Node" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:489 +#: htdocs/luci-static/resources/view/fchomo/client.js:488 #: htdocs/luci-static/resources/view/fchomo/node.js:299 msgid "Node exclude filter" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:494 +#: htdocs/luci-static/resources/view/fchomo/client.js:493 #: htdocs/luci-static/resources/view/fchomo/node.js:305 msgid "Node exclude type" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:484 +#: htdocs/luci-static/resources/view/fchomo/client.js:483 #: htdocs/luci-static/resources/view/fchomo/node.js:294 msgid "Node filter" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:465 +#: htdocs/luci-static/resources/view/fchomo/client.js:464 msgid "Node switch tolerance" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:466 +#: htdocs/luci-static/resources/view/fchomo/global.js:459 msgid "Not Installed" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:408 +#: htdocs/luci-static/resources/fchomo.js:470 msgid "Not Running" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:579 +#: htdocs/luci-static/resources/view/fchomo/server.js:183 +msgid "Obfuscate password" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:177 +msgid "Obfuscate type" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:572 msgid "Only process traffic from specific interfaces. Leave empty for all." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:402 +#: htdocs/luci-static/resources/fchomo.js:464 msgid "Open Dashboard" msgstr "" @@ -976,25 +1121,25 @@ msgstr "" msgid "Operation mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:807 +#: htdocs/luci-static/resources/view/fchomo/client.js:806 msgid "Override ECS in original request." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:508 -#: htdocs/luci-static/resources/view/fchomo/global.js:546 +#: htdocs/luci-static/resources/view/fchomo/global.js:501 +#: htdocs/luci-static/resources/view/fchomo/global.js:539 msgid "Override destination" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:327 +#: htdocs/luci-static/resources/view/fchomo/client.js:326 #: htdocs/luci-static/resources/view/fchomo/node.js:85 msgid "Override fields" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:890 +#: htdocs/luci-static/resources/view/fchomo/client.js:889 msgid "Override the Proxy group of DNS server." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:509 +#: htdocs/luci-static/resources/view/fchomo/global.js:502 msgid "Override the connection destination address with the sniffed domain." msgstr "" @@ -1002,7 +1147,12 @@ msgstr "" msgid "Overview" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:424 +#: htdocs/luci-static/resources/view/fchomo/server.js:137 +#: htdocs/luci-static/resources/view/fchomo/server.js:217 +msgid "Password" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:417 msgid "" "Performance may degrade slightly, so it is not recommended to enable on when " "it is not needed." @@ -1025,26 +1175,26 @@ msgid "" "a>." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:578 +#: htdocs/luci-static/resources/fchomo.js:663 msgid "Port %s alrealy exists!" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:543 +#: htdocs/luci-static/resources/view/fchomo/global.js:536 msgid "Ports" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:62 +#: htdocs/luci-static/resources/fchomo.js:73 msgid "Prefer IPv4" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:63 +#: htdocs/luci-static/resources/fchomo.js:74 msgid "Prefer IPv6" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:408 -#: htdocs/luci-static/resources/view/fchomo/client.js:414 -#: htdocs/luci-static/resources/view/fchomo/global.js:585 -#: htdocs/luci-static/resources/view/fchomo/global.js:602 +#: htdocs/luci-static/resources/view/fchomo/client.js:407 +#: htdocs/luci-static/resources/view/fchomo/client.js:413 +#: htdocs/luci-static/resources/view/fchomo/global.js:578 +#: htdocs/luci-static/resources/view/fchomo/global.js:595 #: htdocs/luci-static/resources/view/fchomo/node.js:238 #: htdocs/luci-static/resources/view/fchomo/node.js:244 msgid "Priority: Proxy Node > Proxy Group > Global." @@ -1054,11 +1204,11 @@ msgstr "" msgid "Process matching mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:537 +#: htdocs/luci-static/resources/view/fchomo/global.js:530 msgid "Protocol" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:372 +#: htdocs/luci-static/resources/view/fchomo/client.js:371 #: htdocs/luci-static/resources/view/fchomo/node.js:57 #: htdocs/luci-static/resources/view/fchomo/node.js:67 msgid "Provider" @@ -1069,19 +1219,19 @@ msgid "Provider URL" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:301 -#: htdocs/luci-static/resources/view/fchomo/client.js:321 +#: htdocs/luci-static/resources/view/fchomo/client.js:320 msgid "Proxy Group" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:637 +#: htdocs/luci-static/resources/view/fchomo/global.js:628 msgid "Proxy IPv4 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:640 +#: htdocs/luci-static/resources/view/fchomo/global.js:631 msgid "Proxy IPv6 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:643 +#: htdocs/luci-static/resources/view/fchomo/global.js:634 msgid "Proxy MAC-s" msgstr "" @@ -1089,43 +1239,48 @@ msgstr "" msgid "Proxy Node" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:581 -#: htdocs/luci-static/resources/view/fchomo/client.js:757 -#: htdocs/luci-static/resources/view/fchomo/client.js:889 +#: htdocs/luci-static/resources/view/fchomo/client.js:580 +#: htdocs/luci-static/resources/view/fchomo/client.js:756 +#: htdocs/luci-static/resources/view/fchomo/client.js:888 #: htdocs/luci-static/resources/view/fchomo/node.js:151 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:266 msgid "Proxy group" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:372 +#: htdocs/luci-static/resources/view/fchomo/global.js:365 msgid "Proxy mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:646 +#: htdocs/luci-static/resources/view/fchomo/global.js:637 msgid "Proxy routerself" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:269 +msgid "QUIC congestion controller." +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/client.js:304 +#: htdocs/luci-static/resources/view/fchomo/server.js:78 msgid "Quick Reload" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:497 +#: htdocs/luci-static/resources/view/fchomo/global.js:490 msgid "Random will be used if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:357 +#: htdocs/luci-static/resources/view/fchomo/global.js:350 msgid "Redir port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:373 +#: htdocs/luci-static/resources/view/fchomo/global.js:366 msgid "Redirect TCP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:375 +#: htdocs/luci-static/resources/view/fchomo/global.js:368 msgid "Redirect TCP + TProxy UDP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:377 +#: htdocs/luci-static/resources/view/fchomo/global.js:370 msgid "Redirect TCP + Tun UDP" msgstr "" @@ -1133,9 +1288,10 @@ msgstr "" msgid "Refresh every %s seconds." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:395 +#: htdocs/luci-static/resources/fchomo.js:457 #: htdocs/luci-static/resources/view/fchomo/client.js:305 #: htdocs/luci-static/resources/view/fchomo/global.js:162 +#: htdocs/luci-static/resources/view/fchomo/server.js:79 msgid "Reload" msgstr "" @@ -1148,11 +1304,11 @@ msgstr "" msgid "Remote" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:533 +#: htdocs/luci-static/resources/fchomo.js:595 msgid "Remove" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:538 +#: htdocs/luci-static/resources/fchomo.js:600 #: htdocs/luci-static/resources/view/fchomo/node.js:75 #: htdocs/luci-static/resources/view/fchomo/node.js:77 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:167 @@ -1172,47 +1328,47 @@ msgstr "" msgid "Resources management" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:650 +#: htdocs/luci-static/resources/view/fchomo/global.js:641 msgid "Routing Control" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:670 +#: htdocs/luci-static/resources/view/fchomo/global.js:661 msgid "Routing GFW" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:413 -#: htdocs/luci-static/resources/view/fchomo/global.js:601 +#: htdocs/luci-static/resources/view/fchomo/client.js:412 +#: htdocs/luci-static/resources/view/fchomo/global.js:594 #: htdocs/luci-static/resources/view/fchomo/node.js:243 msgid "Routing mark" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:666 +#: htdocs/luci-static/resources/view/fchomo/global.js:657 msgid "Routing mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:667 +#: htdocs/luci-static/resources/view/fchomo/global.js:658 msgid "Routing mode of the traffic enters mihomo via firewall rules." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:673 +#: htdocs/luci-static/resources/view/fchomo/global.js:664 msgid "Routing mode will be handle domain." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:652 -#: htdocs/luci-static/resources/view/fchomo/global.js:659 +#: htdocs/luci-static/resources/view/fchomo/global.js:643 +#: htdocs/luci-static/resources/view/fchomo/global.js:650 msgid "Routing ports" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:501 -#: htdocs/luci-static/resources/view/fchomo/client.js:511 +#: htdocs/luci-static/resources/view/fchomo/client.js:500 +#: htdocs/luci-static/resources/view/fchomo/client.js:510 msgid "Routing rule" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:595 +#: htdocs/luci-static/resources/view/fchomo/global.js:588 msgid "Routing rule priority" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:589 +#: htdocs/luci-static/resources/view/fchomo/global.js:582 msgid "Routing table ID" msgstr "" @@ -1220,8 +1376,8 @@ msgstr "" msgid "Rule" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:853 -#: htdocs/luci-static/resources/view/fchomo/client.js:866 +#: htdocs/luci-static/resources/view/fchomo/client.js:852 +#: htdocs/luci-static/resources/view/fchomo/client.js:865 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:96 msgid "Rule set" msgstr "" @@ -1238,38 +1394,47 @@ msgstr "" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:408 +#: htdocs/luci-static/resources/fchomo.js:470 msgid "Running" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:74 -msgid "SOCKS5" +#: htdocs/luci-static/resources/fchomo.js:59 +msgid "SOCKS" msgstr "" #: htdocs/luci-static/resources/fchomo.js:85 +msgid "SOCKS5" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:96 msgid "SSH" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:68 +#: htdocs/luci-static/resources/view/fchomo/server.js:179 +msgid "Salamander" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:79 msgid "Same dstaddr requests. Same node" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:69 +#: htdocs/luci-static/resources/fchomo.js:80 msgid "Same srcaddr and dstaddr requests. Same node" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:414 +#: htdocs/luci-static/resources/view/fchomo/global.js:407 msgid "Segment maximum size" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:107 +#: htdocs/luci-static/resources/fchomo.js:118 msgid "Select" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:457 +#: htdocs/luci-static/resources/view/fchomo/global.js:450 msgid "Select Dashboard" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:96 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:54 msgid "Server" msgstr "" @@ -1282,7 +1447,8 @@ msgstr "" msgid "Service status" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:75 +#: htdocs/luci-static/resources/fchomo.js:61 +#: htdocs/luci-static/resources/fchomo.js:86 msgid "Shadowsocks" msgstr "" @@ -1290,51 +1456,51 @@ msgstr "" msgid "Silent" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:67 +#: htdocs/luci-static/resources/fchomo.js:78 msgid "Simple round-robin all nodes" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:515 +#: htdocs/luci-static/resources/view/fchomo/global.js:508 msgid "Skiped sniffing domain" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:521 +#: htdocs/luci-static/resources/view/fchomo/global.js:514 msgid "Skiped sniffing dst address" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:518 +#: htdocs/luci-static/resources/view/fchomo/global.js:511 msgid "Skiped sniffing src address" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:77 +#: htdocs/luci-static/resources/fchomo.js:88 msgid "Snell" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:525 +#: htdocs/luci-static/resources/view/fchomo/global.js:518 msgid "Sniff protocol" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:502 +#: htdocs/luci-static/resources/view/fchomo/global.js:495 msgid "Sniffer" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:505 +#: htdocs/luci-static/resources/view/fchomo/global.js:498 msgid "Sniffer settings" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:653 -#: htdocs/luci-static/resources/view/fchomo/global.js:660 +#: htdocs/luci-static/resources/view/fchomo/global.js:644 +#: htdocs/luci-static/resources/view/fchomo/global.js:651 msgid "" "Specify target ports to be proxied. Multiple ports must be separated by " "commas." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:388 +#: htdocs/luci-static/resources/view/fchomo/global.js:381 msgid "Stack" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:473 -#: htdocs/luci-static/resources/view/fchomo/client.js:475 +#: htdocs/luci-static/resources/view/fchomo/client.js:472 +#: htdocs/luci-static/resources/view/fchomo/client.js:474 msgid "Strategy" msgstr "" @@ -1352,7 +1518,7 @@ msgid "" "text, yaml, mrs.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:390 +#: htdocs/luci-static/resources/view/fchomo/global.js:383 msgid "System" msgstr "" @@ -1380,90 +1546,116 @@ msgstr "" msgid "TFO" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:429 +#: htdocs/luci-static/resources/view/fchomo/global.js:422 +#: htdocs/luci-static/resources/view/fchomo/server.js:323 msgid "TLS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:83 +#: htdocs/luci-static/resources/view/fchomo/server.js:345 +msgid "TLS ALPN" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:63 +#: htdocs/luci-static/resources/fchomo.js:94 msgid "TUIC" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:172 +msgid "" +"Tell the client to use the BBR flow control algorithm instead of Hysteria CC." +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:215 msgid "The default value is 2:00 every day." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:912 +#: htdocs/luci-static/resources/view/fchomo/client.js:911 msgid "The matching %s will be deemed as not-poisoned." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:921 -#: htdocs/luci-static/resources/view/fchomo/client.js:925 -#: htdocs/luci-static/resources/view/fchomo/client.js:930 +#: htdocs/luci-static/resources/view/fchomo/client.js:920 +#: htdocs/luci-static/resources/view/fchomo/client.js:924 +#: htdocs/luci-static/resources/view/fchomo/client.js:929 msgid "The matching %s will be deemed as poisoned." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:380 +#: htdocs/luci-static/resources/view/fchomo/server.js:366 +msgid "The server private key, in PEM format." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:351 +msgid "The server public key, in PEM format." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:373 msgid "" "To enable Tun support, you need to install ip-full and " "kmod-tun" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:676 +#: htdocs/luci-static/resources/view/fchomo/global.js:667 msgid "To enable, you need to install dnsmasq-full." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:608 +#: htdocs/luci-static/resources/view/fchomo/global.js:601 msgid "Tproxy Fwmark" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:362 +#: htdocs/luci-static/resources/view/fchomo/global.js:355 msgid "Tproxy port" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:80 +#: htdocs/luci-static/resources/fchomo.js:91 msgid "Trojan" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:614 +#: htdocs/luci-static/resources/view/fchomo/global.js:606 msgid "Tun Fwmark" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:378 +#: htdocs/luci-static/resources/view/fchomo/global.js:371 msgid "Tun TCP/UDP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:385 +#: htdocs/luci-static/resources/view/fchomo/global.js:378 msgid "Tun settings" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:389 +#: htdocs/luci-static/resources/view/fchomo/global.js:382 msgid "Tun stack." msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:202 -#: htdocs/luci-static/resources/view/fchomo/client.js:345 -#: htdocs/luci-static/resources/view/fchomo/client.js:533 -#: htdocs/luci-static/resources/view/fchomo/client.js:850 +#: htdocs/luci-static/resources/view/fchomo/client.js:344 +#: htdocs/luci-static/resources/view/fchomo/client.js:532 +#: htdocs/luci-static/resources/view/fchomo/client.js:849 #: htdocs/luci-static/resources/view/fchomo/node.js:49 #: htdocs/luci-static/resources/view/fchomo/node.js:98 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:185 +#: htdocs/luci-static/resources/view/fchomo/server.js:111 msgid "Type" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:248 #: htdocs/luci-static/resources/view/fchomo/node.js:209 +#: htdocs/luci-static/resources/view/fchomo/server.js:381 msgid "UDP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:418 +#: htdocs/luci-static/resources/view/fchomo/global.js:411 msgid "UDP NAT expiration time" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:109 +#: htdocs/luci-static/resources/fchomo.js:120 msgid "URL test" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:453 +#: htdocs/luci-static/resources/view/fchomo/server.js:251 +#: htdocs/luci-static/resources/view/fchomo/server.js:298 +msgid "UUID" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:515 msgid "Unable to download unsupported type: %s" msgstr "" @@ -1501,11 +1693,24 @@ msgstr "" msgid "Update interval" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:647 +#: htdocs/luci-static/resources/view/fchomo/server.js:357 +msgid "Upload certificate" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:372 +msgid "Upload key" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:360 +#: htdocs/luci-static/resources/view/fchomo/server.js:375 +msgid "Upload..." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/client.js:646 msgid "Used to resolve the domain of the DNS server. Must be IP." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:654 +#: htdocs/luci-static/resources/view/fchomo/client.js:653 msgid "Used to resolve the domain of the Proxy node." msgstr "" @@ -1513,15 +1718,20 @@ msgstr "" msgid "User Authentication" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:623 +#: htdocs/luci-static/resources/view/fchomo/server.js:132 +msgid "Username" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:614 msgid "Users filter mode" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:79 +#: htdocs/luci-static/resources/fchomo.js:90 msgid "VLESS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:78 +#: htdocs/luci-static/resources/fchomo.js:62 +#: htdocs/luci-static/resources/fchomo.js:89 msgid "VMess" msgstr "" @@ -1534,11 +1744,15 @@ msgstr "" msgid "Warning" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:625 +#: htdocs/luci-static/resources/view/fchomo/server.js:59 +msgid "When used as a server, HomeProxy is a better choice." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:616 msgid "White list" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:84 +#: htdocs/luci-static/resources/fchomo.js:95 msgid "WireGuard" msgstr "" @@ -1550,7 +1764,39 @@ msgstr "" msgid "YouTube" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:564 +#: htdocs/luci-static/resources/fchomo.js:831 +msgid "Your %s was successfully uploaded. Size: %sB." +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:181 +msgid "aes-128-gcm" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:182 +msgid "aes-192-gcm" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:183 +msgid "aes-256-gcm" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:273 +msgid "bbr" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:362 +msgid "certificate" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:184 +msgid "chacha20-ietf-poly1305" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:271 +msgid "cubic" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:557 msgid "dialer-ip4p-convert" msgstr "" @@ -1562,7 +1808,7 @@ msgstr "" msgid "down" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:392 +#: htdocs/luci-static/resources/view/fchomo/global.js:385 msgid "gVisor" msgstr "" @@ -1578,23 +1824,31 @@ msgstr "" msgid "mpTCP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:614 +#: htdocs/luci-static/resources/view/fchomo/server.js:272 +msgid "new_reno" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/client.js:613 msgid "no-resolve" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:614 +#: htdocs/luci-static/resources/fchomo.js:699 msgid "non-empty value" msgstr "" +#: htdocs/luci-static/resources/fchomo.js:179 +msgid "none" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:92 msgid "not found" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:335 +#: htdocs/luci-static/resources/view/fchomo/client.js:334 msgid "not included \",\"" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:97 +#: htdocs/luci-static/resources/fchomo.js:108 msgid "null" msgstr "" @@ -1602,11 +1856,15 @@ msgstr "" msgid "override.proxy-name" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:561 +#: htdocs/luci-static/resources/view/fchomo/server.js:377 +msgid "private key" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:554 msgid "quic-go-disable-ecn" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:558 +#: htdocs/luci-static/resources/view/fchomo/global.js:551 msgid "quic-go-disable-gso" msgstr "" @@ -1618,7 +1876,7 @@ msgstr "" msgid "skip-cert-verify" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:598 +#: htdocs/luci-static/resources/view/fchomo/client.js:597 msgid "src" msgstr "" @@ -1626,15 +1884,15 @@ msgstr "" msgid "unchecked" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:477 +#: htdocs/luci-static/resources/fchomo.js:539 msgid "unique UCI identifier" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:480 +#: htdocs/luci-static/resources/fchomo.js:542 msgid "unique identifier" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:623 +#: htdocs/luci-static/resources/fchomo.js:708 msgid "unique value" msgstr "" @@ -1642,24 +1900,40 @@ msgstr "" msgid "up" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:593 -#: htdocs/luci-static/resources/fchomo.js:596 +#: htdocs/luci-static/resources/fchomo.js:678 +#: htdocs/luci-static/resources/fchomo.js:681 msgid "valid JSON format" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:635 -#: htdocs/luci-static/resources/fchomo.js:638 +#: htdocs/luci-static/resources/fchomo.js:720 +#: htdocs/luci-static/resources/fchomo.js:723 msgid "valid URL" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:576 +#: htdocs/luci-static/resources/view/fchomo/server.js:237 +msgid "valid base64 key with %d characters" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:240 +msgid "valid key length with %d characters" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:661 msgid "valid port value" msgstr "" +#: htdocs/luci-static/resources/fchomo.js:733 +msgid "valid uuid" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:185 +msgid "xchacha20-ietf-poly1305" +msgstr "" + #: htdocs/luci-static/resources/fchomo.js:34 msgid "yacd-meta" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:455 +#: htdocs/luci-static/resources/fchomo.js:517 msgid "🡇" msgstr "" diff --git a/luci-app-fchomo/po/zh_Hans/fchomo.po b/luci-app-fchomo/po/zh_Hans/fchomo.po index 16097c0eb..3994e0d8e 100644 --- a/luci-app-fchomo/po/zh_Hans/fchomo.po +++ b/luci-app-fchomo/po/zh_Hans/fchomo.po @@ -12,18 +12,18 @@ msgstr "" msgid "%s log" msgstr "%s 日志" -#: htdocs/luci-static/resources/fchomo.js:352 -#: htdocs/luci-static/resources/fchomo.js:365 -#: htdocs/luci-static/resources/fchomo.js:378 +#: htdocs/luci-static/resources/fchomo.js:414 +#: htdocs/luci-static/resources/fchomo.js:427 +#: htdocs/luci-static/resources/fchomo.js:440 #: htdocs/luci-static/resources/view/fchomo/client.js:256 -#: htdocs/luci-static/resources/view/fchomo/client.js:359 -#: htdocs/luci-static/resources/view/fchomo/client.js:373 -#: htdocs/luci-static/resources/view/fchomo/client.js:868 -#: htdocs/luci-static/resources/view/fchomo/global.js:463 +#: htdocs/luci-static/resources/view/fchomo/client.js:358 +#: htdocs/luci-static/resources/view/fchomo/client.js:372 +#: htdocs/luci-static/resources/view/fchomo/client.js:867 +#: htdocs/luci-static/resources/view/fchomo/global.js:456 msgid "-- Please choose --" msgstr "-- 请选择 --" -#: htdocs/luci-static/resources/fchomo.js:607 +#: htdocs/luci-static/resources/fchomo.js:692 msgid "/^(\\d+)(s|m|h|d)?$/" msgstr "" @@ -31,44 +31,61 @@ msgstr "" msgid "163Music" msgstr "网抑云" -#: htdocs/luci-static/resources/view/fchomo/global.js:451 +#: htdocs/luci-static/resources/fchomo.js:187 +msgid "2022-blake3-aes-128-gcm" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:188 +msgid "2022-blake3-aes-256-gcm" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:189 +msgid "2022-blake3-chacha20-poly1305" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:358 +#: htdocs/luci-static/resources/view/fchomo/server.js:373 +msgid "Save your configuration before uploading files!" +msgstr "上传文件前请先保存配置!" + +#: htdocs/luci-static/resources/view/fchomo/global.js:444 msgid "API" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:492 +#: htdocs/luci-static/resources/view/fchomo/global.js:485 msgid "API DoH service" msgstr "API DoH 服务器" -#: htdocs/luci-static/resources/view/fchomo/global.js:483 +#: htdocs/luci-static/resources/view/fchomo/global.js:476 msgid "API HTTP port" msgstr "API HTTP 端口" -#: htdocs/luci-static/resources/view/fchomo/global.js:487 +#: htdocs/luci-static/resources/view/fchomo/global.js:480 msgid "API HTTPS port" msgstr "API HTTPS 端口" -#: htdocs/luci-static/resources/view/fchomo/global.js:441 +#: htdocs/luci-static/resources/view/fchomo/global.js:434 msgid "API TLS certificate path" msgstr "API TLS 证书路径" -#: htdocs/luci-static/resources/view/fchomo/global.js:445 +#: htdocs/luci-static/resources/view/fchomo/global.js:438 msgid "API TLS private key path" msgstr "API TLS 私钥" -#: htdocs/luci-static/resources/view/fchomo/global.js:496 +#: htdocs/luci-static/resources/view/fchomo/global.js:489 msgid "API secret" msgstr "API 令牌" -#: htdocs/luci-static/resources/view/fchomo/global.js:569 -#: htdocs/luci-static/resources/view/fchomo/global.js:621 +#: htdocs/luci-static/resources/view/fchomo/global.js:562 +#: htdocs/luci-static/resources/view/fchomo/global.js:612 msgid "Access Control" msgstr "访问控制" -#: htdocs/luci-static/resources/view/fchomo/client.js:836 +#: htdocs/luci-static/resources/view/fchomo/client.js:835 msgid "Add a DNS policy" msgstr "新增 DNS 策略" -#: htdocs/luci-static/resources/view/fchomo/client.js:695 +#: htdocs/luci-static/resources/view/fchomo/client.js:694 msgid "Add a DNS server" msgstr "新增 DNS 服务器" @@ -80,11 +97,11 @@ msgstr "新增 节点" msgid "Add a provider" msgstr "新增 供应商" -#: htdocs/luci-static/resources/view/fchomo/client.js:321 +#: htdocs/luci-static/resources/view/fchomo/client.js:320 msgid "Add a proxy group" msgstr "新增 策略组" -#: htdocs/luci-static/resources/view/fchomo/client.js:511 +#: htdocs/luci-static/resources/view/fchomo/client.js:510 msgid "Add a routing rule" msgstr "新增 路由规则" @@ -92,6 +109,10 @@ msgstr "新增 路由规则" msgid "Add a rule set" msgstr "新增 规则集" +#: htdocs/luci-static/resources/view/fchomo/server.js:96 +msgid "Add a server" +msgstr "新增 服务器" + #: htdocs/luci-static/resources/view/fchomo/node.js:179 msgid "Add prefix" msgstr "添加前缀" @@ -100,22 +121,22 @@ msgstr "添加前缀" msgid "Add suffix" msgstr "添加后缀" -#: htdocs/luci-static/resources/view/fchomo/client.js:709 -#: htdocs/luci-static/resources/view/fchomo/client.js:714 +#: htdocs/luci-static/resources/view/fchomo/client.js:708 +#: htdocs/luci-static/resources/view/fchomo/client.js:713 msgid "Address" msgstr "地址" -#: htdocs/luci-static/resources/view/fchomo/global.js:624 -#: htdocs/luci-static/resources/view/fchomo/global.js:668 +#: htdocs/luci-static/resources/view/fchomo/global.js:615 +#: htdocs/luci-static/resources/view/fchomo/global.js:659 msgid "All allowed" msgstr "允许所有" -#: htdocs/luci-static/resources/view/fchomo/global.js:654 -#: htdocs/luci-static/resources/view/fchomo/global.js:661 +#: htdocs/luci-static/resources/view/fchomo/global.js:645 +#: htdocs/luci-static/resources/view/fchomo/global.js:652 msgid "All ports" msgstr "所有端口" -#: htdocs/luci-static/resources/view/fchomo/global.js:479 +#: htdocs/luci-static/resources/view/fchomo/global.js:472 msgid "" "Allow access from private network.
To access the API on a private " "network from a public website, it must be enabled." @@ -130,14 +151,26 @@ msgstr "已是最新版本。" msgid "Already in updating." msgstr "已在更新中。" +#: htdocs/luci-static/resources/view/fchomo/server.js:315 +msgid "Alter ID" +msgstr "额外 ID" + #: htdocs/luci-static/resources/view/fchomo/global.js:140 msgid "Application version" msgstr "应用版本" +#: htdocs/luci-static/resources/view/fchomo/server.js:284 +msgid "Auth timeout" +msgstr "认证超时" + #: htdocs/luci-static/resources/view/fchomo/global.js:290 msgid "Auto" msgstr "自动" +#: htdocs/luci-static/resources/view/fchomo/server.js:86 +msgid "Auto configure firewall" +msgstr "自动配置防火墙" + #: htdocs/luci-static/resources/view/fchomo/global.js:201 msgid "Auto update" msgstr "自动更新" @@ -150,7 +183,7 @@ msgstr "自动更新资源文件。" msgid "Baidu" msgstr "百度" -#: htdocs/luci-static/resources/view/fchomo/global.js:402 +#: htdocs/luci-static/resources/view/fchomo/global.js:395 msgid "Based on google/gvisor." msgstr "基于 google/gvisor。" @@ -167,23 +200,23 @@ msgstr "二进制文件" msgid "Binary format only supports domain / ipcidr" msgstr "二进制格式仅支持 domain/ipcidr" -#: htdocs/luci-static/resources/view/fchomo/client.js:406 -#: htdocs/luci-static/resources/view/fchomo/global.js:583 +#: htdocs/luci-static/resources/view/fchomo/client.js:405 +#: htdocs/luci-static/resources/view/fchomo/global.js:576 #: htdocs/luci-static/resources/view/fchomo/node.js:236 msgid "Bind interface" msgstr "绑定接口" -#: htdocs/luci-static/resources/view/fchomo/client.js:407 +#: htdocs/luci-static/resources/view/fchomo/client.js:406 #: htdocs/luci-static/resources/view/fchomo/node.js:237 msgid "Bind outbound interface.
" msgstr "绑定出站接口。
" -#: htdocs/luci-static/resources/view/fchomo/global.js:584 +#: htdocs/luci-static/resources/view/fchomo/global.js:577 msgid "" "Bind outbound traffic to specific interface. Leave empty to auto detect.
" msgstr "绑定出站流量至指定接口。留空自动检测。
" -#: htdocs/luci-static/resources/view/fchomo/global.js:626 +#: htdocs/luci-static/resources/view/fchomo/global.js:617 msgid "Black list" msgstr "黑名单" @@ -191,27 +224,27 @@ msgstr "黑名单" msgid "Block DNS queries" msgstr "封锁 DNS 请求" -#: htdocs/luci-static/resources/view/fchomo/client.js:646 +#: htdocs/luci-static/resources/view/fchomo/client.js:645 msgid "Boot DNS server" msgstr "启动 DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:653 +#: htdocs/luci-static/resources/view/fchomo/client.js:652 msgid "Boot DNS server (Node)" msgstr "启动 DNS 服务器 (节点)" -#: htdocs/luci-static/resources/view/fchomo/global.js:669 +#: htdocs/luci-static/resources/view/fchomo/global.js:660 msgid "Bypass CN" msgstr "绕过 CN 流量" -#: htdocs/luci-static/resources/view/fchomo/global.js:474 +#: htdocs/luci-static/resources/view/fchomo/global.js:467 msgid "CORS Allow origins" msgstr "CORS 允许的来源" -#: htdocs/luci-static/resources/view/fchomo/global.js:478 +#: htdocs/luci-static/resources/view/fchomo/global.js:471 msgid "CORS Allow private network" msgstr "CORS 允许私有网络" -#: htdocs/luci-static/resources/view/fchomo/global.js:475 +#: htdocs/luci-static/resources/view/fchomo/global.js:468 msgid "CORS allowed origins, * will be used if empty." msgstr "CORS 允许的来源,留空则使用 *。" @@ -219,6 +252,10 @@ msgstr "CORS 允许的来源,留空则使用 *。" msgid "Cancel" msgstr "取消" +#: htdocs/luci-static/resources/view/fchomo/server.js:350 +msgid "Certificate path" +msgstr "证书路径" + #: htdocs/luci-static/resources/view/fchomo/global.js:190 msgid "Check" msgstr "检查" @@ -239,6 +276,10 @@ msgstr "大陆 IPv6 库版本" msgid "China list version" msgstr "大陆域名列表版本" +#: htdocs/luci-static/resources/view/fchomo/server.js:209 +msgid "Chipher" +msgstr "加密方法" + #: htdocs/luci-static/resources/view/fchomo/log.js:76 msgid "Clean log" msgstr "清空日志" @@ -255,17 +296,17 @@ msgstr "客户端状态" msgid "Collecting data..." msgstr "收集数据中..." -#: htdocs/luci-static/resources/view/fchomo/global.js:656 -#: htdocs/luci-static/resources/view/fchomo/global.js:663 +#: htdocs/luci-static/resources/view/fchomo/global.js:647 +#: htdocs/luci-static/resources/view/fchomo/global.js:654 msgid "Common and STUN ports" msgstr "常用端口和 STUN 端口" -#: htdocs/luci-static/resources/view/fchomo/global.js:655 -#: htdocs/luci-static/resources/view/fchomo/global.js:662 +#: htdocs/luci-static/resources/view/fchomo/global.js:646 +#: htdocs/luci-static/resources/view/fchomo/global.js:653 msgid "Common ports only (bypass P2P traffic)" msgstr "仅常用端口(绕过 P2P 流量)" -#: htdocs/luci-static/resources/fchomo.js:544 +#: htdocs/luci-static/resources/fchomo.js:606 msgid "Complete" msgstr "完成" @@ -273,6 +314,10 @@ msgstr "完成" msgid "Configuration Items" msgstr "配置项" +#: htdocs/luci-static/resources/view/fchomo/server.js:268 +msgid "Congestion controller" +msgstr "拥塞控制器" + #: htdocs/luci-static/resources/view/fchomo/global.js:166 msgid "Connection check" msgstr "连接检查" @@ -299,7 +344,7 @@ msgstr "核心版本" msgid "Cron expression" msgstr "Cron 表达式" -#: htdocs/luci-static/resources/view/fchomo/global.js:685 +#: htdocs/luci-static/resources/view/fchomo/global.js:676 msgid "Custom Direct List" msgstr "自定义直连列表" @@ -307,7 +352,7 @@ msgstr "自定义直连列表" msgid "Custom HTTP header." msgstr "自定义 HTTP header。" -#: htdocs/luci-static/resources/view/fchomo/global.js:710 +#: htdocs/luci-static/resources/view/fchomo/global.js:701 msgid "Custom Proxy List" msgstr "自定义代理列表" @@ -316,22 +361,22 @@ msgid "" "Custom internal hosts. Support yaml or json format." msgstr "自定义内部 hosts。支持 yamljson 格式。" -#: htdocs/luci-static/resources/view/fchomo/client.js:826 -#: htdocs/luci-static/resources/view/fchomo/client.js:836 +#: htdocs/luci-static/resources/view/fchomo/client.js:825 +#: htdocs/luci-static/resources/view/fchomo/client.js:835 msgid "DNS policy" msgstr "DNS 策略" -#: htdocs/luci-static/resources/view/fchomo/global.js:367 +#: htdocs/luci-static/resources/view/fchomo/global.js:360 msgid "DNS port" msgstr " DNS 端口" -#: htdocs/luci-static/resources/view/fchomo/client.js:685 -#: htdocs/luci-static/resources/view/fchomo/client.js:695 -#: htdocs/luci-static/resources/view/fchomo/client.js:881 +#: htdocs/luci-static/resources/view/fchomo/client.js:684 +#: htdocs/luci-static/resources/view/fchomo/client.js:694 +#: htdocs/luci-static/resources/view/fchomo/client.js:880 msgid "DNS server" msgstr "DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:632 +#: htdocs/luci-static/resources/view/fchomo/client.js:631 msgid "DNS settings" msgstr "DNS 设置" @@ -347,7 +392,7 @@ msgstr "调试" msgid "Default DNS (issued by WAN)" msgstr "默认 DNS(由 WAN 下发)" -#: htdocs/luci-static/resources/view/fchomo/client.js:660 +#: htdocs/luci-static/resources/view/fchomo/client.js:659 msgid "Default DNS server" msgstr "默认 DNS 服务器" @@ -359,51 +404,52 @@ msgstr "默认出站" msgid "Direct" msgstr "直连" -#: htdocs/luci-static/resources/view/fchomo/global.js:628 +#: htdocs/luci-static/resources/view/fchomo/global.js:619 msgid "Direct IPv4 IP-s" msgstr "直连 IPv4 地址" -#: htdocs/luci-static/resources/view/fchomo/global.js:631 +#: htdocs/luci-static/resources/view/fchomo/global.js:622 msgid "Direct IPv6 IP-s" msgstr "直连 IPv6 地址" -#: htdocs/luci-static/resources/view/fchomo/global.js:634 +#: htdocs/luci-static/resources/view/fchomo/global.js:625 msgid "Direct MAC-s" msgstr "直连 MAC 地址" #: htdocs/luci-static/resources/view/fchomo/global.js:291 +#: htdocs/luci-static/resources/view/fchomo/server.js:178 msgid "Disable" msgstr "禁用" -#: htdocs/luci-static/resources/view/fchomo/client.js:402 +#: htdocs/luci-static/resources/view/fchomo/client.js:401 msgid "Disable UDP" msgstr "禁用 UDP" -#: htdocs/luci-static/resources/view/fchomo/client.js:851 -#: htdocs/luci-static/resources/view/fchomo/client.js:856 -#: htdocs/luci-static/resources/view/fchomo/client.js:921 -#: htdocs/luci-static/resources/view/fchomo/client.js:928 -#: htdocs/luci-static/resources/view/fchomo/client.js:930 +#: htdocs/luci-static/resources/view/fchomo/client.js:850 +#: htdocs/luci-static/resources/view/fchomo/client.js:855 +#: htdocs/luci-static/resources/view/fchomo/client.js:920 +#: htdocs/luci-static/resources/view/fchomo/client.js:927 +#: htdocs/luci-static/resources/view/fchomo/client.js:929 msgid "Domain" msgstr "域名" -#: htdocs/luci-static/resources/fchomo.js:450 +#: htdocs/luci-static/resources/fchomo.js:512 msgid "Download failed: %s" msgstr "下载失败: %s" -#: htdocs/luci-static/resources/fchomo.js:448 +#: htdocs/luci-static/resources/fchomo.js:510 msgid "Download successful." msgstr "下载成功。" -#: htdocs/luci-static/resources/fchomo.js:59 +#: htdocs/luci-static/resources/fchomo.js:70 msgid "Dual stack" msgstr "双栈" -#: htdocs/luci-static/resources/view/fchomo/client.js:806 +#: htdocs/luci-static/resources/view/fchomo/client.js:805 msgid "ECS override" msgstr "强制覆盖 ECS" -#: htdocs/luci-static/resources/view/fchomo/client.js:790 +#: htdocs/luci-static/resources/view/fchomo/client.js:789 msgid "EDNS Client Subnet" msgstr "" @@ -424,25 +470,33 @@ msgstr "编辑规则集" msgid "Editer" msgstr "编辑器" -#: htdocs/luci-static/resources/view/fchomo/client.js:341 -#: htdocs/luci-static/resources/view/fchomo/client.js:521 -#: htdocs/luci-static/resources/view/fchomo/client.js:705 -#: htdocs/luci-static/resources/view/fchomo/client.js:846 +#: htdocs/luci-static/resources/view/fchomo/client.js:340 +#: htdocs/luci-static/resources/view/fchomo/client.js:520 +#: htdocs/luci-static/resources/view/fchomo/client.js:704 +#: htdocs/luci-static/resources/view/fchomo/client.js:845 #: htdocs/luci-static/resources/view/fchomo/global.js:289 -#: htdocs/luci-static/resources/view/fchomo/global.js:533 +#: htdocs/luci-static/resources/view/fchomo/global.js:526 #: htdocs/luci-static/resources/view/fchomo/node.js:45 #: htdocs/luci-static/resources/view/fchomo/node.js:94 #: htdocs/luci-static/resources/view/fchomo/node.js:256 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:181 +#: htdocs/luci-static/resources/view/fchomo/server.js:83 +#: htdocs/luci-static/resources/view/fchomo/server.js:107 msgid "Enable" msgstr "启用" -#: htdocs/luci-static/resources/view/fchomo/global.js:423 +#: htdocs/luci-static/resources/view/fchomo/server.js:184 +msgid "" +"Enabling obfuscation will make the server incompatible with standard QUIC " +"connections, losing the ability to masquerade with HTTP/3." +msgstr "启用混淆将使服务器与标准的 QUIC 连接不兼容,失去 HTTP/3 伪装的能力。" + +#: htdocs/luci-static/resources/view/fchomo/global.js:416 msgid "Endpoint-Independent NAT" msgstr "端点独立 NAT" -#: htdocs/luci-static/resources/view/fchomo/client.js:525 -#: htdocs/luci-static/resources/view/fchomo/client.js:873 +#: htdocs/luci-static/resources/view/fchomo/client.js:524 +#: htdocs/luci-static/resources/view/fchomo/client.js:872 msgid "Entry" msgstr "条目" @@ -450,53 +504,58 @@ msgstr "条目" msgid "Error" msgstr "错误" -#: htdocs/luci-static/resources/view/fchomo/client.js:458 +#: htdocs/luci-static/resources/view/fchomo/client.js:457 msgid "" "Exceeding this triggers a forced health check. 5 will be used " "if empty." msgstr "超过此限制将会触发强制健康检查。留空则使用 5。" -#: htdocs/luci-static/resources/view/fchomo/client.js:495 +#: htdocs/luci-static/resources/view/fchomo/client.js:494 #: htdocs/luci-static/resources/view/fchomo/node.js:306 msgid "Exclude matched node types." msgstr "排除匹配的节点类型。" -#: htdocs/luci-static/resources/view/fchomo/client.js:490 +#: htdocs/luci-static/resources/view/fchomo/client.js:489 #: htdocs/luci-static/resources/view/fchomo/node.js:300 msgid "Exclude nodes that meet keywords or regexps." msgstr "排除匹配关键词或表达式的节点。" -#: htdocs/luci-static/resources/view/fchomo/client.js:450 +#: htdocs/luci-static/resources/view/fchomo/client.js:449 #: htdocs/luci-static/resources/view/fchomo/node.js:287 msgid "Expected HTTP code. 204 will be used if empty." msgstr "预期的 HTTP code。留空则使用 204。" -#: htdocs/luci-static/resources/view/fchomo/client.js:452 +#: htdocs/luci-static/resources/view/fchomo/client.js:451 #: htdocs/luci-static/resources/view/fchomo/node.js:289 msgid "Expected status" msgstr "预期状态" -#: htdocs/luci-static/resources/fchomo.js:474 -#: htdocs/luci-static/resources/fchomo.js:477 -#: htdocs/luci-static/resources/fchomo.js:480 -#: htdocs/luci-static/resources/fchomo.js:576 -#: htdocs/luci-static/resources/fchomo.js:593 -#: htdocs/luci-static/resources/fchomo.js:596 -#: htdocs/luci-static/resources/fchomo.js:607 -#: htdocs/luci-static/resources/fchomo.js:614 +#: htdocs/luci-static/resources/fchomo.js:536 +#: htdocs/luci-static/resources/fchomo.js:539 +#: htdocs/luci-static/resources/fchomo.js:542 #: htdocs/luci-static/resources/fchomo.js:623 -#: htdocs/luci-static/resources/fchomo.js:635 -#: htdocs/luci-static/resources/fchomo.js:638 +#: htdocs/luci-static/resources/fchomo.js:631 +#: htdocs/luci-static/resources/fchomo.js:637 +#: htdocs/luci-static/resources/fchomo.js:661 +#: htdocs/luci-static/resources/fchomo.js:678 +#: htdocs/luci-static/resources/fchomo.js:681 +#: htdocs/luci-static/resources/fchomo.js:692 +#: htdocs/luci-static/resources/fchomo.js:699 +#: htdocs/luci-static/resources/fchomo.js:708 +#: htdocs/luci-static/resources/fchomo.js:720 +#: htdocs/luci-static/resources/fchomo.js:723 +#: htdocs/luci-static/resources/fchomo.js:733 #: htdocs/luci-static/resources/view/fchomo/client.js:27 -#: htdocs/luci-static/resources/view/fchomo/client.js:335 -#: htdocs/luci-static/resources/view/fchomo/client.js:720 -#: htdocs/luci-static/resources/view/fchomo/global.js:335 +#: htdocs/luci-static/resources/view/fchomo/client.js:334 +#: htdocs/luci-static/resources/view/fchomo/client.js:719 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:199 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:213 +#: htdocs/luci-static/resources/view/fchomo/server.js:237 +#: htdocs/luci-static/resources/view/fchomo/server.js:240 msgid "Expecting: %s" msgstr "请输入:%s" -#: htdocs/luci-static/resources/view/fchomo/global.js:552 +#: htdocs/luci-static/resources/view/fchomo/global.js:545 msgid "Experimental" msgstr "实验性" @@ -508,45 +567,49 @@ msgstr "实验性" msgid "Factor" msgstr "条件" -#: htdocs/luci-static/resources/fchomo.js:502 +#: htdocs/luci-static/resources/fchomo.js:564 msgid "Failed to execute \"/etc/init.d/fchomo %s %s\" reason: %s" msgstr "无法执行 \"/etc/init.d/fchomo %s %s\" 原因: %s" -#: htdocs/luci-static/resources/fchomo.js:108 +#: htdocs/luci-static/resources/fchomo.js:833 +msgid "Failed to upload %s, error: %s." +msgstr "上传 %s 失败,错误:%s。" + +#: htdocs/luci-static/resources/fchomo.js:119 msgid "Fallback" msgstr "自动回退" +#: htdocs/luci-static/resources/view/fchomo/client.js:666 #: htdocs/luci-static/resources/view/fchomo/client.js:667 -#: htdocs/luci-static/resources/view/fchomo/client.js:668 -#: htdocs/luci-static/resources/view/fchomo/client.js:679 +#: htdocs/luci-static/resources/view/fchomo/client.js:678 msgid "Fallback DNS server" msgstr "後備 DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:900 +#: htdocs/luci-static/resources/view/fchomo/client.js:899 msgid "Fallback filter" msgstr "後備过滤器" -#: htdocs/luci-static/resources/view/fchomo/client.js:485 +#: htdocs/luci-static/resources/view/fchomo/client.js:484 #: htdocs/luci-static/resources/view/fchomo/node.js:295 msgid "Filter nodes that meet keywords or regexps." msgstr "过滤匹配关键字或表达式的节点。" -#: htdocs/luci-static/resources/view/fchomo/client.js:661 -#: htdocs/luci-static/resources/view/fchomo/client.js:678 +#: htdocs/luci-static/resources/view/fchomo/client.js:660 +#: htdocs/luci-static/resources/view/fchomo/client.js:677 msgid "Final DNS server" msgstr "兜底 DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:661 -#: htdocs/luci-static/resources/view/fchomo/client.js:675 +#: htdocs/luci-static/resources/view/fchomo/client.js:660 +#: htdocs/luci-static/resources/view/fchomo/client.js:674 msgid "Final DNS server (Used to Domestic-IP response)" msgstr "兜底 DNS 服务器 (用于 境内-IP 响应)" -#: htdocs/luci-static/resources/view/fchomo/client.js:668 -#: htdocs/luci-static/resources/view/fchomo/client.js:676 +#: htdocs/luci-static/resources/view/fchomo/client.js:667 +#: htdocs/luci-static/resources/view/fchomo/client.js:675 msgid "Final DNS server (Used to Overseas-IP response)" msgstr "兜底 DNS 服务器 (用于 境外-IP 响应)" -#: htdocs/luci-static/resources/view/fchomo/client.js:474 +#: htdocs/luci-static/resources/view/fchomo/client.js:473 msgid "" "For details, see %s." @@ -554,7 +617,7 @@ msgstr "" "实现细节请参阅 %s." -#: htdocs/luci-static/resources/view/fchomo/client.js:451 +#: htdocs/luci-static/resources/view/fchomo/client.js:450 #: htdocs/luci-static/resources/view/fchomo/node.js:187 #: htdocs/luci-static/resources/view/fchomo/node.js:288 msgid "" @@ -564,7 +627,7 @@ msgstr "" "格式请参阅 %s." -#: htdocs/luci-static/resources/view/fchomo/global.js:512 +#: htdocs/luci-static/resources/view/fchomo/global.js:505 msgid "Forced sniffing domain" msgstr "强制嗅探域名" @@ -586,7 +649,7 @@ msgstr "GFW 域名列表版本" msgid "General" msgstr "常规" -#: htdocs/luci-static/resources/view/fchomo/client.js:326 +#: htdocs/luci-static/resources/view/fchomo/client.js:325 #: htdocs/luci-static/resources/view/fchomo/node.js:84 msgid "General fields" msgstr "常规字段" @@ -595,7 +658,20 @@ msgstr "常规字段" msgid "General settings" msgstr "常规设置" -#: htdocs/luci-static/resources/view/fchomo/global.js:411 +#: htdocs/luci-static/resources/view/fchomo/server.js:144 +#: htdocs/luci-static/resources/view/fchomo/server.js:146 +#: htdocs/luci-static/resources/view/fchomo/server.js:191 +#: htdocs/luci-static/resources/view/fchomo/server.js:193 +#: htdocs/luci-static/resources/view/fchomo/server.js:224 +#: htdocs/luci-static/resources/view/fchomo/server.js:226 +#: htdocs/luci-static/resources/view/fchomo/server.js:257 +#: htdocs/luci-static/resources/view/fchomo/server.js:259 +#: htdocs/luci-static/resources/view/fchomo/server.js:304 +#: htdocs/luci-static/resources/view/fchomo/server.js:306 +msgid "Generate" +msgstr "生成" + +#: htdocs/luci-static/resources/view/fchomo/global.js:404 msgid "Generic segmentation offload" msgstr "通用分段卸载(GSO)" @@ -607,17 +683,17 @@ msgstr "GeoIP 版本" msgid "GeoSite version" msgstr "GeoSite 版本" -#: htdocs/luci-static/resources/view/fchomo/client.js:910 +#: htdocs/luci-static/resources/view/fchomo/client.js:909 msgid "Geoip code" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:907 +#: htdocs/luci-static/resources/view/fchomo/client.js:906 msgid "Geoip enable" msgstr "Geoip 启用" -#: htdocs/luci-static/resources/view/fchomo/client.js:852 -#: htdocs/luci-static/resources/view/fchomo/client.js:861 -#: htdocs/luci-static/resources/view/fchomo/client.js:919 +#: htdocs/luci-static/resources/view/fchomo/client.js:851 +#: htdocs/luci-static/resources/view/fchomo/client.js:860 +#: htdocs/luci-static/resources/view/fchomo/client.js:918 msgid "Geosite" msgstr "" @@ -634,7 +710,7 @@ msgstr "全局" msgid "Global Authentication" msgstr "全局认证" -#: htdocs/luci-static/resources/view/fchomo/global.js:435 +#: htdocs/luci-static/resources/view/fchomo/global.js:428 msgid "Global client fingerprint" msgstr "全局客户端指纹" @@ -646,11 +722,12 @@ msgstr "谷歌" msgid "Grant access to fchomo configuration" msgstr "授予 fchomo 访问 UCI 配置的权限" -#: htdocs/luci-static/resources/view/fchomo/client.js:351 +#: htdocs/luci-static/resources/view/fchomo/client.js:350 msgid "Group" msgstr "组" -#: htdocs/luci-static/resources/fchomo.js:73 +#: htdocs/luci-static/resources/fchomo.js:58 +#: htdocs/luci-static/resources/fchomo.js:84 msgid "HTTP" msgstr "" @@ -658,35 +735,41 @@ msgstr "" msgid "HTTP header" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:774 +#: htdocs/luci-static/resources/view/fchomo/client.js:773 msgid "HTTP/3" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:672 +#: htdocs/luci-static/resources/view/fchomo/server.js:203 +msgid "" +"HTTP3 server behavior when authentication fails.
A 404 page will be " +"returned if empty." +msgstr "身份验证失败时的 HTTP3 服务器响应。默认返回 404 页面。" + +#: htdocs/luci-static/resources/view/fchomo/global.js:663 msgid "Handle domain" msgstr "处理域名" -#: htdocs/luci-static/resources/view/fchomo/client.js:420 +#: htdocs/luci-static/resources/view/fchomo/client.js:419 #: htdocs/luci-static/resources/view/fchomo/node.js:260 msgid "Health check URL" msgstr "健康检查 URL" -#: htdocs/luci-static/resources/view/fchomo/client.js:449 +#: htdocs/luci-static/resources/view/fchomo/client.js:448 #: htdocs/luci-static/resources/view/fchomo/node.js:286 msgid "Health check expected status" msgstr "健康检查预期状态" -#: htdocs/luci-static/resources/view/fchomo/client.js:429 +#: htdocs/luci-static/resources/view/fchomo/client.js:428 #: htdocs/luci-static/resources/view/fchomo/node.js:269 msgid "Health check interval" msgstr "健康检查间隔" -#: htdocs/luci-static/resources/view/fchomo/client.js:436 +#: htdocs/luci-static/resources/view/fchomo/client.js:435 #: htdocs/luci-static/resources/view/fchomo/node.js:275 msgid "Health check timeout" msgstr "健康检查超时" -#: htdocs/luci-static/resources/view/fchomo/client.js:328 +#: htdocs/luci-static/resources/view/fchomo/client.js:327 #: htdocs/luci-static/resources/view/fchomo/node.js:86 msgid "Health fields" msgstr "健康字段" @@ -696,40 +779,49 @@ msgstr "健康字段" msgid "Hosts" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:81 +#: htdocs/luci-static/resources/fchomo.js:92 msgid "Hysteria" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:82 +#: htdocs/luci-static/resources/fchomo.js:64 +#: htdocs/luci-static/resources/fchomo.js:93 msgid "Hysteria2" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:912 -#: htdocs/luci-static/resources/view/fchomo/client.js:925 +#: htdocs/luci-static/resources/view/fchomo/client.js:911 +#: htdocs/luci-static/resources/view/fchomo/client.js:924 msgid "IP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:923 +#: htdocs/luci-static/resources/view/fchomo/client.js:922 msgid "IP CIDR" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:60 +#: htdocs/luci-static/resources/fchomo.js:71 msgid "IPv4 only" msgstr "仅 IPv4" -#: htdocs/luci-static/resources/fchomo.js:61 +#: htdocs/luci-static/resources/fchomo.js:72 msgid "IPv6 only" msgstr "仅 IPv6" -#: htdocs/luci-static/resources/view/fchomo/client.js:643 +#: htdocs/luci-static/resources/view/fchomo/client.js:642 #: htdocs/luci-static/resources/view/fchomo/global.js:305 msgid "IPv6 support" msgstr "IPv6 支持" +#: htdocs/luci-static/resources/view/fchomo/server.js:277 +msgid "Idle timeout" +msgstr "空闲超时" + #: htdocs/luci-static/resources/view/fchomo/client.js:27 msgid "If Block is selected, uncheck others" msgstr "如果选择了“阻止”,则取消选中“其他”" +#: htdocs/luci-static/resources/view/fchomo/server.js:171 +msgid "Ignore client bandwidth" +msgstr "忽略客户端带宽" + #: htdocs/luci-static/resources/view/fchomo/ruleset.js:152 msgid "Import" msgstr "导入" @@ -742,50 +834,57 @@ msgstr "导入 rule-set 链接" #: htdocs/luci-static/resources/view/fchomo/node.js:218 #: htdocs/luci-static/resources/view/fchomo/node.js:223 +#: htdocs/luci-static/resources/view/fchomo/server.js:160 +#: htdocs/luci-static/resources/view/fchomo/server.js:166 msgid "In Mbps." msgstr "单位为 Mbps。" -#: htdocs/luci-static/resources/view/fchomo/client.js:437 -#: htdocs/luci-static/resources/view/fchomo/client.js:466 +#: htdocs/luci-static/resources/view/fchomo/client.js:436 +#: htdocs/luci-static/resources/view/fchomo/client.js:465 #: htdocs/luci-static/resources/view/fchomo/node.js:276 msgid "In millisecond. %s will be used if empty." msgstr "单位为毫秒。留空则使用 %s。" -#: htdocs/luci-static/resources/view/fchomo/client.js:430 +#: htdocs/luci-static/resources/view/fchomo/server.js:278 +#: htdocs/luci-static/resources/view/fchomo/server.js:285 +msgid "In seconds." +msgstr "单位为秒。" + +#: htdocs/luci-static/resources/view/fchomo/client.js:429 #: htdocs/luci-static/resources/view/fchomo/global.js:315 #: htdocs/luci-static/resources/view/fchomo/global.js:320 -#: htdocs/luci-static/resources/view/fchomo/global.js:419 +#: htdocs/luci-static/resources/view/fchomo/global.js:412 #: htdocs/luci-static/resources/view/fchomo/node.js:146 #: htdocs/luci-static/resources/view/fchomo/node.js:270 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:261 msgid "In seconds. %s will be used if empty." msgstr "单位为秒。留空则使用 %s。" -#: htdocs/luci-static/resources/view/fchomo/global.js:346 +#: htdocs/luci-static/resources/view/fchomo/global.js:339 msgid "Inbound" msgstr "入站" -#: htdocs/luci-static/resources/view/fchomo/client.js:386 +#: htdocs/luci-static/resources/view/fchomo/client.js:385 msgid "Include all" msgstr "引入所有" -#: htdocs/luci-static/resources/view/fchomo/client.js:391 +#: htdocs/luci-static/resources/view/fchomo/client.js:390 msgid "Include all node" msgstr "引入所有节点" -#: htdocs/luci-static/resources/view/fchomo/client.js:396 +#: htdocs/luci-static/resources/view/fchomo/client.js:395 msgid "Include all provider" msgstr "引入所有供应商" -#: htdocs/luci-static/resources/view/fchomo/client.js:397 +#: htdocs/luci-static/resources/view/fchomo/client.js:396 msgid "Includes all Provider." msgstr "引入所有供应商。" -#: htdocs/luci-static/resources/view/fchomo/client.js:387 +#: htdocs/luci-static/resources/view/fchomo/client.js:386 msgid "Includes all Proxy Node and Provider." msgstr "引入所有代理节点及供应商。" -#: htdocs/luci-static/resources/view/fchomo/client.js:392 +#: htdocs/luci-static/resources/view/fchomo/client.js:391 msgid "Includes all Proxy Node." msgstr "引入所有代理节点。" @@ -793,46 +892,68 @@ msgstr "引入所有代理节点。" msgid "Info" msgstr "信息" -#: htdocs/luci-static/resources/view/fchomo/global.js:576 +#: htdocs/luci-static/resources/view/fchomo/global.js:569 msgid "Interface Control" msgstr "接口控制" -#: htdocs/luci-static/resources/fchomo.js:58 +#: htdocs/luci-static/resources/fchomo.js:69 msgid "Keep default" msgstr "保持缺省" -#: htdocs/luci-static/resources/view/fchomo/client.js:331 -#: htdocs/luci-static/resources/view/fchomo/client.js:516 -#: htdocs/luci-static/resources/view/fchomo/client.js:700 -#: htdocs/luci-static/resources/view/fchomo/client.js:841 +#: htdocs/luci-static/resources/view/fchomo/server.js:365 +msgid "Key path" +msgstr "证书路径" + +#: htdocs/luci-static/resources/view/fchomo/client.js:330 +#: htdocs/luci-static/resources/view/fchomo/client.js:515 +#: htdocs/luci-static/resources/view/fchomo/client.js:699 +#: htdocs/luci-static/resources/view/fchomo/client.js:840 #: htdocs/luci-static/resources/view/fchomo/node.js:40 #: htdocs/luci-static/resources/view/fchomo/node.js:89 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:176 +#: htdocs/luci-static/resources/view/fchomo/server.js:102 msgid "Label" msgstr "标签" -#: htdocs/luci-static/resources/view/fchomo/client.js:443 +#: htdocs/luci-static/resources/view/fchomo/client.js:442 #: htdocs/luci-static/resources/view/fchomo/node.js:281 msgid "Lazy" msgstr "懒惰状态" -#: htdocs/luci-static/resources/view/fchomo/global.js:404 +#: htdocs/luci-static/resources/view/fchomo/server.js:316 +msgid "" +"Legacy protocol support (VMess MD5 Authentication) is provided for " +"compatibility purposes only, use of alterId > 1 is not recommended." +msgstr "" +"提供旧协议支持(VMess MD5 身份验证)仅出于兼容性目的,不建议使用 alterId > " +"1。" + +#: htdocs/luci-static/resources/view/fchomo/global.js:397 msgid "Less compatibility and sometimes better performance." msgstr "有时性能更好。" -#: htdocs/luci-static/resources/view/fchomo/global.js:578 +#: htdocs/luci-static/resources/view/fchomo/server.js:346 +msgid "List of supported application level protocols, in order of preference." +msgstr "支持的应用层协议协商列表,按顺序排列。" + +#: htdocs/luci-static/resources/view/fchomo/server.js:117 +msgid "Listen address" +msgstr "监听地址" + +#: htdocs/luci-static/resources/view/fchomo/global.js:571 msgid "Listen interfaces" msgstr "监听接口" -#: htdocs/luci-static/resources/view/fchomo/client.js:638 +#: htdocs/luci-static/resources/view/fchomo/client.js:637 +#: htdocs/luci-static/resources/view/fchomo/server.js:122 msgid "Listen port" msgstr "监听端口" -#: htdocs/luci-static/resources/view/fchomo/global.js:349 +#: htdocs/luci-static/resources/view/fchomo/global.js:342 msgid "Listen ports" msgstr "监听端口" -#: htdocs/luci-static/resources/fchomo.js:110 +#: htdocs/luci-static/resources/fchomo.js:121 msgid "Load balance" msgstr "负载均衡" @@ -857,64 +978,82 @@ msgstr "日志为空。" msgid "Log level" msgstr "日志等级" -#: htdocs/luci-static/resources/fchomo.js:474 +#: htdocs/luci-static/resources/fchomo.js:536 msgid "Lowercase only" msgstr "仅限小写" -#: htdocs/luci-static/resources/view/fchomo/global.js:407 +#: htdocs/luci-static/resources/view/fchomo/global.js:400 msgid "MTU" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:857 +#: htdocs/luci-static/resources/view/fchomo/server.js:202 +msgid "Masquerade" +msgstr "伪装" + +#: htdocs/luci-static/resources/view/fchomo/client.js:856 msgid "Match domain. Support wildcards." msgstr "匹配域名。支持通配符。" -#: htdocs/luci-static/resources/view/fchomo/client.js:929 +#: htdocs/luci-static/resources/view/fchomo/client.js:928 msgid "Match domain. Support wildcards.
" msgstr "匹配域名。支持通配符。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:862 +#: htdocs/luci-static/resources/view/fchomo/client.js:861 msgid "Match geosite." msgstr "匹配 geosite。" -#: htdocs/luci-static/resources/view/fchomo/client.js:920 +#: htdocs/luci-static/resources/view/fchomo/client.js:919 msgid "Match geosite.
" msgstr "匹配 geosite。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:911 +#: htdocs/luci-static/resources/view/fchomo/client.js:910 msgid "Match response with geoip.
" msgstr "匹配响应通过 geoip。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:924 +#: htdocs/luci-static/resources/view/fchomo/client.js:923 msgid "Match response with ipcidr.
" msgstr "匹配响应通过 ipcidr
" -#: htdocs/luci-static/resources/view/fchomo/client.js:867 +#: htdocs/luci-static/resources/view/fchomo/client.js:866 msgid "Match rule set." msgstr "匹配规则集。" -#: htdocs/luci-static/resources/view/fchomo/client.js:457 +#: htdocs/luci-static/resources/view/fchomo/server.js:291 +msgid "Max UDP relay packet size" +msgstr "UDP 中继数据包最大尺寸" + +#: htdocs/luci-static/resources/view/fchomo/client.js:456 msgid "Max count of failures" msgstr "最大失败次数" +#: htdocs/luci-static/resources/view/fchomo/server.js:165 +msgid "Max download speed" +msgstr "最大下载速度" + +#: htdocs/luci-static/resources/view/fchomo/server.js:159 +msgid "Max upload speed" +msgstr "最大上传速度" + #: htdocs/luci-static/resources/view/fchomo/client.js:281 #: htdocs/luci-static/resources/view/fchomo/log.js:100 msgid "Mihomo client" msgstr "Mihomo 客户端" #: htdocs/luci-static/resources/view/fchomo/log.js:103 +#: htdocs/luci-static/resources/view/fchomo/server.js:58 msgid "Mihomo server" msgstr "Mihomo 服务端" -#: htdocs/luci-static/resources/view/fchomo/global.js:393 +#: htdocs/luci-static/resources/fchomo.js:60 +#: htdocs/luci-static/resources/view/fchomo/global.js:386 msgid "Mixed" msgstr "混合" -#: htdocs/luci-static/resources/view/fchomo/global.js:400 +#: htdocs/luci-static/resources/view/fchomo/global.js:393 msgid "Mixed system TCP stack and gVisor UDP stack." msgstr "混合 系统 TCP 栈和 gVisor UDP 栈。" -#: htdocs/luci-static/resources/view/fchomo/global.js:352 +#: htdocs/luci-static/resources/view/fchomo/global.js:345 msgid "Mixed port" msgstr "混合端口" @@ -926,15 +1065,15 @@ msgstr "用于下载供应商订阅的策略组名称。" msgid "Name of the Proxy group to download rule set." msgstr "用于下载规则集订阅的策略组名称。" -#: htdocs/luci-static/resources/view/fchomo/global.js:340 +#: htdocs/luci-static/resources/view/fchomo/global.js:333 msgid "No Authentication IP ranges" msgstr "无需认证的 IP 范围" -#: htdocs/luci-static/resources/view/fchomo/client.js:720 +#: htdocs/luci-static/resources/view/fchomo/client.js:719 msgid "No add'l params" msgstr "无附加参数" -#: htdocs/luci-static/resources/view/fchomo/client.js:444 +#: htdocs/luci-static/resources/view/fchomo/client.js:443 #: htdocs/luci-static/resources/view/fchomo/node.js:282 msgid "No testing is performed when this provider node is not in use." msgstr "当此供应商的节点未使用时,不执行任何测试。" @@ -943,44 +1082,52 @@ msgstr "当此供应商的节点未使用时,不执行任何测试。" msgid "No valid rule-set link found." msgstr "未找到有效的规则集链接。" -#: htdocs/luci-static/resources/view/fchomo/client.js:358 +#: htdocs/luci-static/resources/view/fchomo/client.js:357 #: htdocs/luci-static/resources/view/fchomo/node.js:35 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:38 msgid "Node" msgstr "节点" -#: htdocs/luci-static/resources/view/fchomo/client.js:489 +#: htdocs/luci-static/resources/view/fchomo/client.js:488 #: htdocs/luci-static/resources/view/fchomo/node.js:299 msgid "Node exclude filter" msgstr "排除节点" -#: htdocs/luci-static/resources/view/fchomo/client.js:494 +#: htdocs/luci-static/resources/view/fchomo/client.js:493 #: htdocs/luci-static/resources/view/fchomo/node.js:305 msgid "Node exclude type" msgstr "排除节点类型" -#: htdocs/luci-static/resources/view/fchomo/client.js:484 +#: htdocs/luci-static/resources/view/fchomo/client.js:483 #: htdocs/luci-static/resources/view/fchomo/node.js:294 msgid "Node filter" msgstr "过滤节点" -#: htdocs/luci-static/resources/view/fchomo/client.js:465 +#: htdocs/luci-static/resources/view/fchomo/client.js:464 msgid "Node switch tolerance" msgstr "节点切换容差" -#: htdocs/luci-static/resources/view/fchomo/global.js:466 +#: htdocs/luci-static/resources/view/fchomo/global.js:459 msgid "Not Installed" msgstr "未安装" -#: htdocs/luci-static/resources/fchomo.js:408 +#: htdocs/luci-static/resources/fchomo.js:470 msgid "Not Running" msgstr "未在运行" -#: htdocs/luci-static/resources/view/fchomo/global.js:579 +#: htdocs/luci-static/resources/view/fchomo/server.js:183 +msgid "Obfuscate password" +msgstr "混淆密码" + +#: htdocs/luci-static/resources/view/fchomo/server.js:177 +msgid "Obfuscate type" +msgstr "混淆类型" + +#: htdocs/luci-static/resources/view/fchomo/global.js:572 msgid "Only process traffic from specific interfaces. Leave empty for all." msgstr "只处理来自指定接口的流量。留空表示全部。" -#: htdocs/luci-static/resources/fchomo.js:402 +#: htdocs/luci-static/resources/fchomo.js:464 msgid "Open Dashboard" msgstr "打开面板" @@ -988,25 +1135,25 @@ msgstr "打开面板" msgid "Operation mode" msgstr "运行模式" -#: htdocs/luci-static/resources/view/fchomo/client.js:807 +#: htdocs/luci-static/resources/view/fchomo/client.js:806 msgid "Override ECS in original request." msgstr "覆盖原始请求中的 ECS。" -#: htdocs/luci-static/resources/view/fchomo/global.js:508 -#: htdocs/luci-static/resources/view/fchomo/global.js:546 +#: htdocs/luci-static/resources/view/fchomo/global.js:501 +#: htdocs/luci-static/resources/view/fchomo/global.js:539 msgid "Override destination" msgstr "覆盖目标地址" -#: htdocs/luci-static/resources/view/fchomo/client.js:327 +#: htdocs/luci-static/resources/view/fchomo/client.js:326 #: htdocs/luci-static/resources/view/fchomo/node.js:85 msgid "Override fields" msgstr "覆盖字段" -#: htdocs/luci-static/resources/view/fchomo/client.js:890 +#: htdocs/luci-static/resources/view/fchomo/client.js:889 msgid "Override the Proxy group of DNS server." msgstr "覆盖 DNS 服务器所使用的策略组。" -#: htdocs/luci-static/resources/view/fchomo/global.js:509 +#: htdocs/luci-static/resources/view/fchomo/global.js:502 msgid "Override the connection destination address with the sniffed domain." msgstr "使用嗅探到的域名覆盖连接目标。" @@ -1014,7 +1161,12 @@ msgstr "使用嗅探到的域名覆盖连接目标。" msgid "Overview" msgstr "概览" -#: htdocs/luci-static/resources/view/fchomo/global.js:424 +#: htdocs/luci-static/resources/view/fchomo/server.js:137 +#: htdocs/luci-static/resources/view/fchomo/server.js:217 +msgid "Password" +msgstr "密码" + +#: htdocs/luci-static/resources/view/fchomo/global.js:417 msgid "" "Performance may degrade slightly, so it is not recommended to enable on when " "it is not needed." @@ -1038,26 +1190,26 @@ msgid "" msgstr "" "请输入
%s。" -#: htdocs/luci-static/resources/fchomo.js:578 +#: htdocs/luci-static/resources/fchomo.js:663 msgid "Port %s alrealy exists!" msgstr "端口 %s 已存在!" -#: htdocs/luci-static/resources/view/fchomo/global.js:543 +#: htdocs/luci-static/resources/view/fchomo/global.js:536 msgid "Ports" msgstr "端口" -#: htdocs/luci-static/resources/fchomo.js:62 +#: htdocs/luci-static/resources/fchomo.js:73 msgid "Prefer IPv4" msgstr "优先 IPv4" -#: htdocs/luci-static/resources/fchomo.js:63 +#: htdocs/luci-static/resources/fchomo.js:74 msgid "Prefer IPv6" msgstr "优先 IPv6" -#: htdocs/luci-static/resources/view/fchomo/client.js:408 -#: htdocs/luci-static/resources/view/fchomo/client.js:414 -#: htdocs/luci-static/resources/view/fchomo/global.js:585 -#: htdocs/luci-static/resources/view/fchomo/global.js:602 +#: htdocs/luci-static/resources/view/fchomo/client.js:407 +#: htdocs/luci-static/resources/view/fchomo/client.js:413 +#: htdocs/luci-static/resources/view/fchomo/global.js:578 +#: htdocs/luci-static/resources/view/fchomo/global.js:595 #: htdocs/luci-static/resources/view/fchomo/node.js:238 #: htdocs/luci-static/resources/view/fchomo/node.js:244 msgid "Priority: Proxy Node > Proxy Group > Global." @@ -1067,11 +1219,11 @@ msgstr "优先级: 代理节点 > 策略组 > 全局。" msgid "Process matching mode" msgstr "进程匹配模式" -#: htdocs/luci-static/resources/view/fchomo/global.js:537 +#: htdocs/luci-static/resources/view/fchomo/global.js:530 msgid "Protocol" msgstr "协议" -#: htdocs/luci-static/resources/view/fchomo/client.js:372 +#: htdocs/luci-static/resources/view/fchomo/client.js:371 #: htdocs/luci-static/resources/view/fchomo/node.js:57 #: htdocs/luci-static/resources/view/fchomo/node.js:67 msgid "Provider" @@ -1082,19 +1234,19 @@ msgid "Provider URL" msgstr "供应商订阅 URL" #: htdocs/luci-static/resources/view/fchomo/client.js:301 -#: htdocs/luci-static/resources/view/fchomo/client.js:321 +#: htdocs/luci-static/resources/view/fchomo/client.js:320 msgid "Proxy Group" msgstr "策略组" -#: htdocs/luci-static/resources/view/fchomo/global.js:637 +#: htdocs/luci-static/resources/view/fchomo/global.js:628 msgid "Proxy IPv4 IP-s" msgstr "代理 IPv4 地址" -#: htdocs/luci-static/resources/view/fchomo/global.js:640 +#: htdocs/luci-static/resources/view/fchomo/global.js:631 msgid "Proxy IPv6 IP-s" msgstr "代理 IPv6 地址" -#: htdocs/luci-static/resources/view/fchomo/global.js:643 +#: htdocs/luci-static/resources/view/fchomo/global.js:634 msgid "Proxy MAC-s" msgstr "代理 MAC 地址" @@ -1102,43 +1254,48 @@ msgstr "代理 MAC 地址" msgid "Proxy Node" msgstr "代理节点" -#: htdocs/luci-static/resources/view/fchomo/client.js:581 -#: htdocs/luci-static/resources/view/fchomo/client.js:757 -#: htdocs/luci-static/resources/view/fchomo/client.js:889 +#: htdocs/luci-static/resources/view/fchomo/client.js:580 +#: htdocs/luci-static/resources/view/fchomo/client.js:756 +#: htdocs/luci-static/resources/view/fchomo/client.js:888 #: htdocs/luci-static/resources/view/fchomo/node.js:151 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:266 msgid "Proxy group" msgstr "策略组" -#: htdocs/luci-static/resources/view/fchomo/global.js:372 +#: htdocs/luci-static/resources/view/fchomo/global.js:365 msgid "Proxy mode" msgstr "代理模式" -#: htdocs/luci-static/resources/view/fchomo/global.js:646 +#: htdocs/luci-static/resources/view/fchomo/global.js:637 msgid "Proxy routerself" msgstr "代理路由器自身" +#: htdocs/luci-static/resources/view/fchomo/server.js:269 +msgid "QUIC congestion controller." +msgstr "QUIC 拥塞控制器。" + #: htdocs/luci-static/resources/view/fchomo/client.js:304 +#: htdocs/luci-static/resources/view/fchomo/server.js:78 msgid "Quick Reload" msgstr "快速重载" -#: htdocs/luci-static/resources/view/fchomo/global.js:497 +#: htdocs/luci-static/resources/view/fchomo/global.js:490 msgid "Random will be used if empty." msgstr "留空将使用随机令牌。" -#: htdocs/luci-static/resources/view/fchomo/global.js:357 +#: htdocs/luci-static/resources/view/fchomo/global.js:350 msgid "Redir port" msgstr "Redir 端口" -#: htdocs/luci-static/resources/view/fchomo/global.js:373 +#: htdocs/luci-static/resources/view/fchomo/global.js:366 msgid "Redirect TCP" msgstr "Redirect TCP" -#: htdocs/luci-static/resources/view/fchomo/global.js:375 +#: htdocs/luci-static/resources/view/fchomo/global.js:368 msgid "Redirect TCP + TProxy UDP" msgstr "Redirect TCP + TProxy UDP" -#: htdocs/luci-static/resources/view/fchomo/global.js:377 +#: htdocs/luci-static/resources/view/fchomo/global.js:370 msgid "Redirect TCP + Tun UDP" msgstr "Redirect TCP + Tun UDP" @@ -1146,9 +1303,10 @@ msgstr "Redirect TCP + Tun UDP" msgid "Refresh every %s seconds." msgstr "每 %s 秒刷新。" -#: htdocs/luci-static/resources/fchomo.js:395 +#: htdocs/luci-static/resources/fchomo.js:457 #: htdocs/luci-static/resources/view/fchomo/client.js:305 #: htdocs/luci-static/resources/view/fchomo/global.js:162 +#: htdocs/luci-static/resources/view/fchomo/server.js:79 msgid "Reload" msgstr "重载" @@ -1161,11 +1319,11 @@ msgstr "重载所有" msgid "Remote" msgstr "远程" -#: htdocs/luci-static/resources/fchomo.js:533 +#: htdocs/luci-static/resources/fchomo.js:595 msgid "Remove" msgstr "移除" -#: htdocs/luci-static/resources/fchomo.js:538 +#: htdocs/luci-static/resources/fchomo.js:600 #: htdocs/luci-static/resources/view/fchomo/node.js:75 #: htdocs/luci-static/resources/view/fchomo/node.js:77 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:167 @@ -1185,47 +1343,47 @@ msgstr "替换节点名称" msgid "Resources management" msgstr "资源管理" -#: htdocs/luci-static/resources/view/fchomo/global.js:650 +#: htdocs/luci-static/resources/view/fchomo/global.js:641 msgid "Routing Control" msgstr "路由控制" -#: htdocs/luci-static/resources/view/fchomo/global.js:670 +#: htdocs/luci-static/resources/view/fchomo/global.js:661 msgid "Routing GFW" msgstr "路由 GFW 流量" -#: htdocs/luci-static/resources/view/fchomo/client.js:413 -#: htdocs/luci-static/resources/view/fchomo/global.js:601 +#: htdocs/luci-static/resources/view/fchomo/client.js:412 +#: htdocs/luci-static/resources/view/fchomo/global.js:594 #: htdocs/luci-static/resources/view/fchomo/node.js:243 msgid "Routing mark" msgstr "路由标记" -#: htdocs/luci-static/resources/view/fchomo/global.js:666 +#: htdocs/luci-static/resources/view/fchomo/global.js:657 msgid "Routing mode" msgstr "路由模式" -#: htdocs/luci-static/resources/view/fchomo/global.js:667 +#: htdocs/luci-static/resources/view/fchomo/global.js:658 msgid "Routing mode of the traffic enters mihomo via firewall rules." msgstr "流量通过防火墙规则进入 mihomo 的路由模式。" -#: htdocs/luci-static/resources/view/fchomo/global.js:673 +#: htdocs/luci-static/resources/view/fchomo/global.js:664 msgid "Routing mode will be handle domain." msgstr "路由模式将处理域名。" -#: htdocs/luci-static/resources/view/fchomo/global.js:652 -#: htdocs/luci-static/resources/view/fchomo/global.js:659 +#: htdocs/luci-static/resources/view/fchomo/global.js:643 +#: htdocs/luci-static/resources/view/fchomo/global.js:650 msgid "Routing ports" msgstr "路由端口" -#: htdocs/luci-static/resources/view/fchomo/client.js:501 -#: htdocs/luci-static/resources/view/fchomo/client.js:511 +#: htdocs/luci-static/resources/view/fchomo/client.js:500 +#: htdocs/luci-static/resources/view/fchomo/client.js:510 msgid "Routing rule" msgstr "路由规则" -#: htdocs/luci-static/resources/view/fchomo/global.js:595 +#: htdocs/luci-static/resources/view/fchomo/global.js:588 msgid "Routing rule priority" msgstr "路由规则优先权" -#: htdocs/luci-static/resources/view/fchomo/global.js:589 +#: htdocs/luci-static/resources/view/fchomo/global.js:582 msgid "Routing table ID" msgstr "路由表 ID" @@ -1233,8 +1391,8 @@ msgstr "路由表 ID" msgid "Rule" msgstr "规则" -#: htdocs/luci-static/resources/view/fchomo/client.js:853 -#: htdocs/luci-static/resources/view/fchomo/client.js:866 +#: htdocs/luci-static/resources/view/fchomo/client.js:852 +#: htdocs/luci-static/resources/view/fchomo/client.js:865 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:96 msgid "Rule set" msgstr "规则集" @@ -1251,38 +1409,47 @@ msgstr "规则集" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:408 +#: htdocs/luci-static/resources/fchomo.js:470 msgid "Running" msgstr "正在运行" -#: htdocs/luci-static/resources/fchomo.js:74 -msgid "SOCKS5" +#: htdocs/luci-static/resources/fchomo.js:59 +msgid "SOCKS" msgstr "" #: htdocs/luci-static/resources/fchomo.js:85 +msgid "SOCKS5" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:96 msgid "SSH" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:68 +#: htdocs/luci-static/resources/view/fchomo/server.js:179 +msgid "Salamander" +msgstr "Salamander" + +#: htdocs/luci-static/resources/fchomo.js:79 msgid "Same dstaddr requests. Same node" msgstr "相同 目标地址 请求。相同节点" -#: htdocs/luci-static/resources/fchomo.js:69 +#: htdocs/luci-static/resources/fchomo.js:80 msgid "Same srcaddr and dstaddr requests. Same node" msgstr "相同 来源地址 和 目标地址 请求。相同节点" -#: htdocs/luci-static/resources/view/fchomo/global.js:414 +#: htdocs/luci-static/resources/view/fchomo/global.js:407 msgid "Segment maximum size" msgstr "分段最大尺寸" -#: htdocs/luci-static/resources/fchomo.js:107 +#: htdocs/luci-static/resources/fchomo.js:118 msgid "Select" msgstr "手动选择" -#: htdocs/luci-static/resources/view/fchomo/global.js:457 +#: htdocs/luci-static/resources/view/fchomo/global.js:450 msgid "Select Dashboard" msgstr "选择面板" +#: htdocs/luci-static/resources/view/fchomo/server.js:96 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:54 msgid "Server" msgstr "服务端" @@ -1295,7 +1462,8 @@ msgstr "服务端状态" msgid "Service status" msgstr "服务状态" -#: htdocs/luci-static/resources/fchomo.js:75 +#: htdocs/luci-static/resources/fchomo.js:61 +#: htdocs/luci-static/resources/fchomo.js:86 msgid "Shadowsocks" msgstr "" @@ -1303,51 +1471,51 @@ msgstr "" msgid "Silent" msgstr "静音" -#: htdocs/luci-static/resources/fchomo.js:67 +#: htdocs/luci-static/resources/fchomo.js:78 msgid "Simple round-robin all nodes" msgstr "简单轮替所有节点" -#: htdocs/luci-static/resources/view/fchomo/global.js:515 +#: htdocs/luci-static/resources/view/fchomo/global.js:508 msgid "Skiped sniffing domain" msgstr "跳过嗅探域名" -#: htdocs/luci-static/resources/view/fchomo/global.js:521 +#: htdocs/luci-static/resources/view/fchomo/global.js:514 msgid "Skiped sniffing dst address" msgstr "跳过嗅探目标地址" -#: htdocs/luci-static/resources/view/fchomo/global.js:518 +#: htdocs/luci-static/resources/view/fchomo/global.js:511 msgid "Skiped sniffing src address" msgstr "跳过嗅探来源地址" -#: htdocs/luci-static/resources/fchomo.js:77 +#: htdocs/luci-static/resources/fchomo.js:88 msgid "Snell" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:525 +#: htdocs/luci-static/resources/view/fchomo/global.js:518 msgid "Sniff protocol" msgstr "嗅探协议" -#: htdocs/luci-static/resources/view/fchomo/global.js:502 +#: htdocs/luci-static/resources/view/fchomo/global.js:495 msgid "Sniffer" msgstr "嗅探器" -#: htdocs/luci-static/resources/view/fchomo/global.js:505 +#: htdocs/luci-static/resources/view/fchomo/global.js:498 msgid "Sniffer settings" msgstr "嗅探器设置" -#: htdocs/luci-static/resources/view/fchomo/global.js:653 -#: htdocs/luci-static/resources/view/fchomo/global.js:660 +#: htdocs/luci-static/resources/view/fchomo/global.js:644 +#: htdocs/luci-static/resources/view/fchomo/global.js:651 msgid "" "Specify target ports to be proxied. Multiple ports must be separated by " "commas." msgstr "指定需要被代理的目标端口。多个端口必须用逗号隔开。" -#: htdocs/luci-static/resources/view/fchomo/global.js:388 +#: htdocs/luci-static/resources/view/fchomo/global.js:381 msgid "Stack" msgstr "堆栈" -#: htdocs/luci-static/resources/view/fchomo/client.js:473 -#: htdocs/luci-static/resources/view/fchomo/client.js:475 +#: htdocs/luci-static/resources/view/fchomo/client.js:472 +#: htdocs/luci-static/resources/view/fchomo/client.js:474 msgid "Strategy" msgstr "策略" @@ -1367,7 +1535,7 @@ msgstr "" "支持规则集类型为: file, http 并且格式为: text, yaml, mrs 的规则集链接。
" -#: htdocs/luci-static/resources/view/fchomo/global.js:390 +#: htdocs/luci-static/resources/view/fchomo/global.js:383 msgid "System" msgstr "系统" @@ -1395,91 +1563,117 @@ msgstr "TCP-Keep-Alive 间隔" msgid "TFO" msgstr "TCP 快速打开 (TFO)" -#: htdocs/luci-static/resources/view/fchomo/global.js:429 +#: htdocs/luci-static/resources/view/fchomo/global.js:422 +#: htdocs/luci-static/resources/view/fchomo/server.js:323 msgid "TLS" msgstr "TLS" -#: htdocs/luci-static/resources/fchomo.js:83 +#: htdocs/luci-static/resources/view/fchomo/server.js:345 +msgid "TLS ALPN" +msgstr "TLS ALPN" + +#: htdocs/luci-static/resources/fchomo.js:63 +#: htdocs/luci-static/resources/fchomo.js:94 msgid "TUIC" msgstr "" +#: htdocs/luci-static/resources/view/fchomo/server.js:172 +msgid "" +"Tell the client to use the BBR flow control algorithm instead of Hysteria CC." +msgstr "让客户端使用 BBR 流控算法。" + #: htdocs/luci-static/resources/view/fchomo/global.js:215 msgid "The default value is 2:00 every day." msgstr "默认值为每天 2:00。" -#: htdocs/luci-static/resources/view/fchomo/client.js:912 +#: htdocs/luci-static/resources/view/fchomo/client.js:911 msgid "The matching %s will be deemed as not-poisoned." msgstr "匹配的 %s 将被视为未被污染。" -#: htdocs/luci-static/resources/view/fchomo/client.js:921 -#: htdocs/luci-static/resources/view/fchomo/client.js:925 -#: htdocs/luci-static/resources/view/fchomo/client.js:930 +#: htdocs/luci-static/resources/view/fchomo/client.js:920 +#: htdocs/luci-static/resources/view/fchomo/client.js:924 +#: htdocs/luci-static/resources/view/fchomo/client.js:929 msgid "The matching %s will be deemed as poisoned." msgstr "匹配的 %s 将被视为已被污染。" -#: htdocs/luci-static/resources/view/fchomo/global.js:380 +#: htdocs/luci-static/resources/view/fchomo/server.js:366 +msgid "The server private key, in PEM format." +msgstr "服务端私钥,需要 PEM 格式。" + +#: htdocs/luci-static/resources/view/fchomo/server.js:351 +msgid "The server public key, in PEM format." +msgstr "服务端公钥,需要 PEM 格式。" + +#: htdocs/luci-static/resources/view/fchomo/global.js:373 msgid "" "To enable Tun support, you need to install ip-full and " "kmod-tun" msgstr "" "要启用 Tun 支持,您需要安装 ip-fullkmod-tun。" -#: htdocs/luci-static/resources/view/fchomo/global.js:676 +#: htdocs/luci-static/resources/view/fchomo/global.js:667 msgid "To enable, you need to install dnsmasq-full." msgstr "要启用,您需要安装 dnsmasq-full。" -#: htdocs/luci-static/resources/view/fchomo/global.js:608 +#: htdocs/luci-static/resources/view/fchomo/global.js:601 msgid "Tproxy Fwmark" msgstr "Tproxy 标记" -#: htdocs/luci-static/resources/view/fchomo/global.js:362 +#: htdocs/luci-static/resources/view/fchomo/global.js:355 msgid "Tproxy port" msgstr "Tproxy 端口" -#: htdocs/luci-static/resources/fchomo.js:80 +#: htdocs/luci-static/resources/fchomo.js:91 msgid "Trojan" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:614 +#: htdocs/luci-static/resources/view/fchomo/global.js:606 msgid "Tun Fwmark" msgstr "Tun 标记" -#: htdocs/luci-static/resources/view/fchomo/global.js:378 +#: htdocs/luci-static/resources/view/fchomo/global.js:371 msgid "Tun TCP/UDP" msgstr "Tun TCP/UDP" -#: htdocs/luci-static/resources/view/fchomo/global.js:385 +#: htdocs/luci-static/resources/view/fchomo/global.js:378 msgid "Tun settings" msgstr "Tun 设置" -#: htdocs/luci-static/resources/view/fchomo/global.js:389 +#: htdocs/luci-static/resources/view/fchomo/global.js:382 msgid "Tun stack." msgstr "Tun 堆栈" #: htdocs/luci-static/resources/view/fchomo/client.js:202 -#: htdocs/luci-static/resources/view/fchomo/client.js:345 -#: htdocs/luci-static/resources/view/fchomo/client.js:533 -#: htdocs/luci-static/resources/view/fchomo/client.js:850 +#: htdocs/luci-static/resources/view/fchomo/client.js:344 +#: htdocs/luci-static/resources/view/fchomo/client.js:532 +#: htdocs/luci-static/resources/view/fchomo/client.js:849 #: htdocs/luci-static/resources/view/fchomo/node.js:49 #: htdocs/luci-static/resources/view/fchomo/node.js:98 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:185 +#: htdocs/luci-static/resources/view/fchomo/server.js:111 msgid "Type" msgstr "类型" #: htdocs/luci-static/resources/view/fchomo/client.js:248 #: htdocs/luci-static/resources/view/fchomo/node.js:209 +#: htdocs/luci-static/resources/view/fchomo/server.js:381 msgid "UDP" msgstr "UDP" -#: htdocs/luci-static/resources/view/fchomo/global.js:418 +#: htdocs/luci-static/resources/view/fchomo/global.js:411 msgid "UDP NAT expiration time" msgstr "UDP NAT 过期时间" -#: htdocs/luci-static/resources/fchomo.js:109 +#: htdocs/luci-static/resources/fchomo.js:120 msgid "URL test" msgstr "自动选择" -#: htdocs/luci-static/resources/fchomo.js:453 +#: htdocs/luci-static/resources/view/fchomo/server.js:251 +#: htdocs/luci-static/resources/view/fchomo/server.js:298 +msgid "UUID" +msgstr "UUID" + +#: htdocs/luci-static/resources/fchomo.js:515 msgid "Unable to download unsupported type: %s" msgstr "无法下载不支持的类型: %s" @@ -1517,11 +1711,24 @@ msgstr "更新失败。" msgid "Update interval" msgstr "更新间隔" -#: htdocs/luci-static/resources/view/fchomo/client.js:647 +#: htdocs/luci-static/resources/view/fchomo/server.js:357 +msgid "Upload certificate" +msgstr "上传证书" + +#: htdocs/luci-static/resources/view/fchomo/server.js:372 +msgid "Upload key" +msgstr "上传密钥" + +#: htdocs/luci-static/resources/view/fchomo/server.js:360 +#: htdocs/luci-static/resources/view/fchomo/server.js:375 +msgid "Upload..." +msgstr "上传..." + +#: htdocs/luci-static/resources/view/fchomo/client.js:646 msgid "Used to resolve the domain of the DNS server. Must be IP." msgstr "用于解析 DNS 服务器的域名。必须是 IP。" -#: htdocs/luci-static/resources/view/fchomo/client.js:654 +#: htdocs/luci-static/resources/view/fchomo/client.js:653 msgid "Used to resolve the domain of the Proxy node." msgstr "用于解析代理节点的域名。" @@ -1529,15 +1736,20 @@ msgstr "用于解析代理节点的域名。" msgid "User Authentication" msgstr "用户认证" -#: htdocs/luci-static/resources/view/fchomo/global.js:623 +#: htdocs/luci-static/resources/view/fchomo/server.js:132 +msgid "Username" +msgstr "用户名" + +#: htdocs/luci-static/resources/view/fchomo/global.js:614 msgid "Users filter mode" msgstr "使用者过滤模式" -#: htdocs/luci-static/resources/fchomo.js:79 +#: htdocs/luci-static/resources/fchomo.js:90 msgid "VLESS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:78 +#: htdocs/luci-static/resources/fchomo.js:62 +#: htdocs/luci-static/resources/fchomo.js:89 msgid "VMess" msgstr "" @@ -1550,11 +1762,15 @@ msgstr "可视化值" msgid "Warning" msgstr "警告" -#: htdocs/luci-static/resources/view/fchomo/global.js:625 +#: htdocs/luci-static/resources/view/fchomo/server.js:59 +msgid "When used as a server, HomeProxy is a better choice." +msgstr "用作服务端时,HomeProxy 是更好的选择。" + +#: htdocs/luci-static/resources/view/fchomo/global.js:616 msgid "White list" msgstr "白名单" -#: htdocs/luci-static/resources/fchomo.js:84 +#: htdocs/luci-static/resources/fchomo.js:95 msgid "WireGuard" msgstr "" @@ -1566,7 +1782,39 @@ msgstr "Yaml 格式文本" msgid "YouTube" msgstr "油管" -#: htdocs/luci-static/resources/view/fchomo/global.js:564 +#: htdocs/luci-static/resources/fchomo.js:831 +msgid "Your %s was successfully uploaded. Size: %sB." +msgstr "您的 %s 已成功上传。大小:%sB。" + +#: htdocs/luci-static/resources/fchomo.js:181 +msgid "aes-128-gcm" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:182 +msgid "aes-192-gcm" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:183 +msgid "aes-256-gcm" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:273 +msgid "bbr" +msgstr "bbr" + +#: htdocs/luci-static/resources/view/fchomo/server.js:362 +msgid "certificate" +msgstr "证书" + +#: htdocs/luci-static/resources/fchomo.js:184 +msgid "chacha20-ietf-poly1305" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:271 +msgid "cubic" +msgstr "cubic" + +#: htdocs/luci-static/resources/view/fchomo/global.js:557 msgid "dialer-ip4p-convert" msgstr "" @@ -1578,7 +1826,7 @@ msgstr "" msgid "down" msgstr "Hysteria 下载速率" -#: htdocs/luci-static/resources/view/fchomo/global.js:392 +#: htdocs/luci-static/resources/view/fchomo/global.js:385 msgid "gVisor" msgstr "gVisor" @@ -1594,23 +1842,31 @@ msgstr "metacubexd" msgid "mpTCP" msgstr "多路径 TCP (mpTCP)" -#: htdocs/luci-static/resources/view/fchomo/client.js:614 +#: htdocs/luci-static/resources/view/fchomo/server.js:272 +msgid "new_reno" +msgstr "new_reno" + +#: htdocs/luci-static/resources/view/fchomo/client.js:613 msgid "no-resolve" msgstr "no-resolve" -#: htdocs/luci-static/resources/fchomo.js:614 +#: htdocs/luci-static/resources/fchomo.js:699 msgid "non-empty value" msgstr "非空值" +#: htdocs/luci-static/resources/fchomo.js:179 +msgid "none" +msgstr "无" + #: htdocs/luci-static/resources/view/fchomo/global.js:92 msgid "not found" msgstr "未找到" -#: htdocs/luci-static/resources/view/fchomo/client.js:335 +#: htdocs/luci-static/resources/view/fchomo/client.js:334 msgid "not included \",\"" msgstr "不包含 \",\"" -#: htdocs/luci-static/resources/fchomo.js:97 +#: htdocs/luci-static/resources/fchomo.js:108 msgid "null" msgstr "" @@ -1618,11 +1874,15 @@ msgstr "" msgid "override.proxy-name" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:561 +#: htdocs/luci-static/resources/view/fchomo/server.js:377 +msgid "private key" +msgstr "私钥" + +#: htdocs/luci-static/resources/view/fchomo/global.js:554 msgid "quic-go-disable-ecn" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:558 +#: htdocs/luci-static/resources/view/fchomo/global.js:551 msgid "quic-go-disable-gso" msgstr "" @@ -1634,7 +1894,7 @@ msgstr "razord-meta" msgid "skip-cert-verify" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:598 +#: htdocs/luci-static/resources/view/fchomo/client.js:597 msgid "src" msgstr "src" @@ -1642,15 +1902,15 @@ msgstr "src" msgid "unchecked" msgstr "未检查" -#: htdocs/luci-static/resources/fchomo.js:477 +#: htdocs/luci-static/resources/fchomo.js:539 msgid "unique UCI identifier" msgstr "独立 UCI 标识" -#: htdocs/luci-static/resources/fchomo.js:480 +#: htdocs/luci-static/resources/fchomo.js:542 msgid "unique identifier" msgstr "独立标识" -#: htdocs/luci-static/resources/fchomo.js:623 +#: htdocs/luci-static/resources/fchomo.js:708 msgid "unique value" msgstr "独立值" @@ -1658,24 +1918,40 @@ msgstr "独立值" msgid "up" msgstr "Hysteria 上传速率" -#: htdocs/luci-static/resources/fchomo.js:593 -#: htdocs/luci-static/resources/fchomo.js:596 +#: htdocs/luci-static/resources/fchomo.js:678 +#: htdocs/luci-static/resources/fchomo.js:681 msgid "valid JSON format" msgstr "有效的 JSON 格式" -#: htdocs/luci-static/resources/fchomo.js:635 -#: htdocs/luci-static/resources/fchomo.js:638 +#: htdocs/luci-static/resources/fchomo.js:720 +#: htdocs/luci-static/resources/fchomo.js:723 msgid "valid URL" msgstr "有效网址" -#: htdocs/luci-static/resources/fchomo.js:576 +#: htdocs/luci-static/resources/view/fchomo/server.js:237 +msgid "valid base64 key with %d characters" +msgstr "包含 %d 个字符的有效 base64 密钥" + +#: htdocs/luci-static/resources/view/fchomo/server.js:240 +msgid "valid key length with %d characters" +msgstr "包含 %d 个字符的有效密钥" + +#: htdocs/luci-static/resources/fchomo.js:661 msgid "valid port value" msgstr "有效端口值" +#: htdocs/luci-static/resources/fchomo.js:733 +msgid "valid uuid" +msgstr "有效 uuid" + +#: htdocs/luci-static/resources/fchomo.js:185 +msgid "xchacha20-ietf-poly1305" +msgstr "" + #: htdocs/luci-static/resources/fchomo.js:34 msgid "yacd-meta" msgstr "yacd-meta" -#: htdocs/luci-static/resources/fchomo.js:455 +#: htdocs/luci-static/resources/fchomo.js:517 msgid "🡇" msgstr "" diff --git a/luci-app-fchomo/root/etc/fchomo/scripts/fchomo.uc b/luci-app-fchomo/root/etc/fchomo/scripts/fchomo.uc index ecc9582fa..8d5c97cc9 100755 --- a/luci-app-fchomo/root/etc/fchomo/scripts/fchomo.uc +++ b/luci-app-fchomo/root/etc/fchomo/scripts/fchomo.uc @@ -46,7 +46,46 @@ export function strToInt(str) { if (isEmpty(str)) return null; - return !match(str, /^\d+$/) ? str : int(str) || null; + return !match(str, /^\d+$/) ? str : int(str) ?? null; +}; + +export function durationToSecond(str) { + if (isEmpty(str)) + return null; + + let seconds = 0; + let arr = match(str, /^(\d+)(s|m|h|d)?$/); + if (arr) { + if (arr[2] === 's') { + seconds = strToInt(arr[1]); + } else if (arr[2] === 'm') { + seconds = strToInt(arr[1]) * 60; + } else if (arr[2] === 'h') { + seconds = strToInt(arr[1]) * 3600; + } else if (arr[2] === 'd') { + seconds = strToInt(arr[1]) * 86400; + } else + seconds = strToInt(arr[1]); + } + + return seconds; +}; + +export function arrToObj(res) { + if (isEmpty(res)) + return null; + + let object; + if (type(res) === 'array') { + object = {}; + map(res, (e) => { + if (type(e) === 'array') + object[e[0]] = e[1]; + }); + } else + return res; + + return object; }; export function removeBlankAttrs(res) { diff --git a/luci-app-fchomo/root/etc/fchomo/scripts/generate_client.uc b/luci-app-fchomo/root/etc/fchomo/scripts/generate_client.uc index 0704bcf76..2c1bae5b4 100755 --- a/luci-app-fchomo/root/etc/fchomo/scripts/generate_client.uc +++ b/luci-app-fchomo/root/etc/fchomo/scripts/generate_client.uc @@ -9,7 +9,7 @@ import { cursor } from 'uci'; import { urldecode, urlencode } from 'luci.http'; import { - isEmpty, strToBool, strToInt, + isEmpty, strToBool, strToInt, durationToSecond, removeBlankAttrs, HM_DIR, RUN_DIR, PRESET_OUTBOUND } from 'fchomo'; @@ -105,28 +105,6 @@ function parse_filter(cfg) { return cfg; } -function parse_time_duration(time) { - if (isEmpty(time)) - return null; - - let seconds = 0; - let arr = match(time, /^(\d+)(s|m|h|d)?$/); - if (arr) { - if (arr[2] === 's') { - seconds = strToInt(arr[1]); - } else if (arr[2] === 'm') { - seconds = strToInt(arr[1]) * 60; - } else if (arr[2] === 'h') { - seconds = strToInt(arr[1]) * 3600; - } else if (arr[2] === 'd') { - seconds = strToInt(arr[1]) * 86400; - } else - seconds = strToInt(arr[1]); - } - - return seconds; -} - function get_proxynode(cfg) { if (isEmpty(cfg)) return null; @@ -191,8 +169,8 @@ config["etag-support"] = (uci.get(uciconf, uciglobal, 'etag_support') === '0') ? config.ipv6 = (uci.get(uciconf, uciglobal, 'ipv6') === '0') ? false : true; config["unified-delay"] = strToBool(uci.get(uciconf, uciglobal, 'unified_delay')) || false; config["tcp-concurrent"] = strToBool(uci.get(uciconf, uciglobal, 'tcp_concurrent')) || false; -config["keep-alive-interval"] = parse_time_duration(uci.get(uciconf, uciglobal, 'keep_alive_interval')) || 30; -config["keep-alive-idle"] = parse_time_duration(uci.get(uciconf, uciglobal, 'keep_alive_idle')) || 600; +config["keep-alive-interval"] = durationToSecond(uci.get(uciconf, uciglobal, 'keep_alive_interval')) || 30; +config["keep-alive-idle"] = durationToSecond(uci.get(uciconf, uciglobal, 'keep_alive_idle')) || 600; /* ACL settings */ config["interface-name"] = bind_interface; config["routing-mark"] = self_mark; @@ -345,7 +323,7 @@ if (match(proxy_mode, /tun/)) "route-exclude-address-set": [], "include-interface": [], "exclude-interface": [], - "udp-timeout": parse_time_duration(uci.get(uciconf, uciinbound, 'tun_udp_timeout')) || 300, + "udp-timeout": durationToSecond(uci.get(uciconf, uciinbound, 'tun_udp_timeout')) || 300, "endpoint-independent-nat": strToBool(uci.get(uciconf, uciinbound, 'tun_endpoint_independent_nat')), "auto-detect-interface": true }); @@ -452,7 +430,7 @@ uci.foreach(uciconf, ucipgrp, (cfg) => { ["routing-mark"]: strToInt(cfg.routing_mark), // Health fields url: cfg.url, - interval: cfg.url ? parse_time_duration(cfg.interval) || 600 : null, + interval: cfg.url ? durationToSecond(cfg.interval) || 600 : null, timeout: cfg.url ? strToInt(cfg.timeout) || 5000 : null, lazy: (cfg.lazy === '0') ? false : null, "expected-status": cfg.url ? cfg.expected_status || '204' : null, @@ -476,7 +454,7 @@ uci.foreach(uciconf, uciprov, (cfg) => { type: cfg.type, path: HM_DIR + '/provider/' + cfg['.name'], url: cfg.url, - interval: (cfg.type === 'http') ? parse_time_duration(cfg.interval) || 86400 : null, + interval: (cfg.type === 'http') ? durationToSecond(cfg.interval) || 86400 : null, proxy: get_proxygroup(cfg.proxy), header: cfg.header ? json(cfg.header) : null, "health-check": {}, @@ -513,7 +491,7 @@ uci.foreach(uciconf, uciprov, (cfg) => { config["proxy-providers"][cfg['.name']]["health-check"] = { enable: true, url: cfg.health_url, - interval: parse_time_duration(cfg.health_interval) || 600, + interval: durationToSecond(cfg.health_interval) || 600, timeout: strToInt(cfg.health_timeout) || 5000, lazy: (cfg.health_lazy === '0') ? false : null, "expected-status": cfg.health_expected_status || '204' @@ -535,7 +513,7 @@ uci.foreach(uciconf, ucirule, (cfg) => { behavior: cfg.behavior, path: HM_DIR + '/ruleset/' + cfg['.name'], url: cfg.url, - interval: (cfg.type === 'http') ? parse_time_duration(cfg.interval) || 259200 : null, + interval: (cfg.type === 'http') ? durationToSecond(cfg.interval) || 259200 : null, proxy: get_proxygroup(cfg.proxy) }; }); diff --git a/luci-app-fchomo/root/etc/fchomo/scripts/generate_server.uc b/luci-app-fchomo/root/etc/fchomo/scripts/generate_server.uc new file mode 100755 index 000000000..ecea392ab --- /dev/null +++ b/luci-app-fchomo/root/etc/fchomo/scripts/generate_server.uc @@ -0,0 +1,105 @@ +#!/usr/bin/ucode + +'use strict'; + +import { cursor } from 'uci'; + +import { + isEmpty, strToBool, strToInt, durationToSecond, + arrToObj, removeBlankAttrs, + HM_DIR, RUN_DIR, PRESET_OUTBOUND +} from 'fchomo'; + +/* UCI config START */ +const uci = cursor(); + +const uciconf = 'fchomo'; +uci.load(uciconf); + +const uciserver = 'server'; + +/* UCI config END */ + +/* Config helper START */ +function parse_users(cfg) { + if (isEmpty(cfg)) + return null; + + let uap, arr, users=[]; + for (uap in cfg) { + arr = split(uap, ':'); + users[arr[0]] = arr[1]; + } + + return users; +} +/* Config helper END */ + +/* Main */ +const config = {}; + +/* Inbound START */ +config.listeners = []; +uci.foreach(uciconf, uciserver, (cfg) => { + if (cfg.enabled === '0') + return; + + push(config.listeners, { + name: cfg['.name'], + type: cfg.type, + + listen: cfg.listen || '::', + port: strToInt(cfg.port), + proxy: 'DIRECT', + udp: strToBool(cfg.udp), + + /* Hysteria2 */ + up: strToInt(cfg.hysteria_up_mbps), + down: strToInt(cfg.hysteria_down_mbps), + "ignore-client-bandwidth": strToBool(cfg.hysteria_ignore_client_bandwidth), + obfs: cfg.hysteria_obfs_type, + "obfs-password": cfg.hysteria_obfs_password, + masquerade: cfg.hysteria_masquerade, + + /* Shadowsocks */ + cipher: cfg.shadowsocks_chipher, + password: cfg.shadowsocks_password, + + /* Tuic */ + "congestion-controller": cfg.tuic_congestion_controller, + "max-idle-time": durationToSecond(cfg.tuic_max_idle_time), + "authentication-timeout": durationToSecond(cfg.tuic_authentication_timeout), + "max-udp-relay-packet-size": strToInt(cfg.tuic_max_udp_relay_packet_size), + + /* HTTP / SOCKS / VMess / Tuic / Hysteria2 */ + users: (cfg.type in ['http', 'socks', 'mixed', 'vmess']) ? [ + { + /* HTTP / SOCKS */ + username: cfg.username, + password: cfg.password, + + /* VMess */ + uuid: cfg.vmess_uuid, + alterId: strToInt(cfg.vmess_alterid) + } + /*{ + }*/ + ] : ((cfg.type in ['tuic', 'hysteria2']) ? { + /* Hysteria2 */ + ...arrToObj([[cfg.username, cfg.password]]), + + /* Tuic */ + ...arrToObj([[cfg.uuid, cfg.password]]) + } : null), + + /* TLS */ + ...(cfg.tls === '1' ? { + alpn: cfg.tls_alpn, + certificate: cfg.tls_cert_path, + "private-key": cfg.tls_key_path + } : {}) + }); +}); +/* Inbound END */ + +printf('%.J\n', removeBlankAttrs(config)); diff --git a/luci-app-fchomo/root/etc/init.d/fchomo b/luci-app-fchomo/root/etc/init.d/fchomo index 61958c4c2..157822b55 100755 --- a/luci-app-fchomo/root/etc/init.d/fchomo +++ b/luci-app-fchomo/root/etc/init.d/fchomo @@ -275,20 +275,22 @@ start_service() { if [ "$server_auto_firewall" = "1" ]; then add_firewall() { - local enabled udp proto port + local enabled listen port config_get_bool enabled "$1" "enabled" "1" - config_get_bool udp "$1" "udp" "1" - [ "$udp" = "0" ] && proto='tcp' || proto='tcp udp' + config_get listen "$1" "listen" "::" config_get port "$1" "port" - + [ "$enabled" = "0" ] && return 0 json_add_object '' json_add_string type rule json_add_string target ACCEPT json_add_string name "$1" - json_add_string proto "$proto" + #json_add_string family '' # '' = IPv4 and IPv6 + json_add_string proto 'tcp udp' json_add_string src "*" + #json_add_string dest '' # '' = input + json_add_string dest_ip "$(echo "$listen" | grep -vE '^(0\.\d+\.\d+\.\d+|::)$')" json_add_string dest_port "$port" json_close_object } @@ -323,6 +325,8 @@ start_service() { log "$(mihomo -v | awk 'NR==1{print $1,$3}') started." } +service_started() { procd_set_config_changed firewall; } + stop_service() { # Client [ -z "$1" -o "$1" = "mihomo-c" ] && stop_client @@ -388,7 +392,8 @@ service_stopped() { # Client [ -n "$(/etc/init.d/$CONF info | jsonfilter -q -e '@.'"$CONF"'.instances["mihomo-c"]')" ] || client_stopped # Server - return 0 + + procd_set_config_changed firewall; } client_stopped() { diff --git a/luci-app-fchomo/root/usr/share/rpcd/acl.d/luci-app-fchomo.json b/luci-app-fchomo/root/usr/share/rpcd/acl.d/luci-app-fchomo.json index 499ac1791..85c7dc51c 100644 --- a/luci-app-fchomo/root/usr/share/rpcd/acl.d/luci-app-fchomo.json +++ b/luci-app-fchomo/root/usr/share/rpcd/acl.d/luci-app-fchomo.json @@ -15,6 +15,9 @@ "uci": [ "fchomo" ] }, "write": { + "file": { + "/tmp/fchomo_certificate.tmp": [ "write" ] + }, "uci": [ "fchomo" ] } } diff --git a/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo b/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo index 0c02217d4..01c87f100 100755 --- a/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo +++ b/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo @@ -9,6 +9,14 @@ function shellquote(s) { return `'${replace(s, "'", "'\\''")}'`; } +function isBinary(str) { + for (let off = 0, byte = ord(str); off < length(str); byte = ord(str, ++off)) + if (byte <= 8 || (byte >= 14 && byte <= 31)) + return true; + + return false; +} + function hasKernelModule(kmod) { return (system(sprintf('[ -e "/lib/modules/$(uname -r)"/%s ]', shellquote(kmod))) === 0); } @@ -274,6 +282,74 @@ const methods = { return { result: true }; } + }, + + // thanks to homeproxy + certificate_write: { + args: { filename: 'filename' }, + call: function(req) { + const writeCertificate = function(filename, priv) { + const tmpcert = '/tmp/fchomo_certificate.tmp'; + const filestat = lstat(tmpcert); + + if (!filestat || filestat.type !== 'file' || filestat.size <= 0) { + system(`rm -f ${tmpcert}`); + return { result: false, error: 'empty certificate file' }; + } + + let filecontent = readfile(tmpcert); + if (isBinary(filecontent)) { + system(`rm -f ${tmpcert}`); + return { result: false, error: 'illegal file type: binary' }; + } + + /* Kanged from luci-proto-openconnect */ + const beg = priv ? /^-----BEGIN (RSA|EC) PRIVATE KEY-----$/ : /^-----BEGIN CERTIFICATE-----$/, + end = priv ? /^-----END (RSA|EC) PRIVATE KEY-----$/ : /^-----END CERTIFICATE-----$/, + lines = split(trim(filecontent), /[\r\n]/); + let start = false, i; + + for (i = 0; i < length(lines); i++) { + if (match(lines[i], beg)) + start = true; + else if (start && !b64dec(lines[i]) && length(lines[i]) !== 64) + break; + } + + if (!start || i < length(lines) - 1 || !match(lines[i], end)) { + system(`rm -f ${tmpcert}`); + return { result: false, error: 'this does not look like a correct PEM file' }; + } + + /* Sanitize certificate */ + filecontent = trim(filecontent); + filecontent = replace(filecontent, /\r\n?/g, '\n'); + if (!match(filecontent, /\n$/)) + filecontent += '\n'; + + system(`mkdir -p ${HM_DIR}/certs`); + writefile(`${HM_DIR}/certs/${filename}.pem`, filecontent); + system(`rm -f ${tmpcert}`); + + return { result: true }; + }; + + const filename = req.args?.filename; + if (!filename || match(filename, /\.\.\//)) + return { result: false, error: 'illegal cerificate filename' }; + switch (filename) { + case 'client_ca': + case 'server_publickey': + return writeCertificate(filename, false); + break; + case 'server_privatekey': + return writeCertificate(filename, true); + break; + default: + return { result: false, error: 'illegal cerificate filename' }; + break; + } + } } }; diff --git a/luci-app-nekobox/htdocs/nekobox/configs.php b/luci-app-nekobox/htdocs/nekobox/configs.php index 6a669abe8..b510518fd 100644 --- a/luci-app-nekobox/htdocs/nekobox/configs.php +++ b/luci-app-nekobox/htdocs/nekobox/configs.php @@ -37,7 +37,7 @@ include './cfg.php'; - +
diff --git a/luci-app-nekobox/htdocs/nekobox/dashboard.php b/luci-app-nekobox/htdocs/nekobox/dashboard.php index 31ab5cdbf..0c0c1ae71 100644 --- a/luci-app-nekobox/htdocs/nekobox/dashboard.php +++ b/luci-app-nekobox/htdocs/nekobox/dashboard.php @@ -30,7 +30,6 @@ $dashboard_link = $neko_cfg['ctrl_host'] . ':' . $neko_cfg['ctrl_port'] . '/ui/d - diff --git a/luci-app-nekobox/htdocs/nekobox/index.php b/luci-app-nekobox/htdocs/nekobox/index.php index e6b0039c1..8fb54c63f 100644 --- a/luci-app-nekobox/htdocs/nekobox/index.php +++ b/luci-app-nekobox/htdocs/nekobox/index.php @@ -526,7 +526,7 @@ if (isset($_GET['ajax'])) { - + diff --git a/luci-app-nekobox/htdocs/nekobox/ping.php b/luci-app-nekobox/htdocs/nekobox/ping.php new file mode 100644 index 000000000..fd005d051 --- /dev/null +++ b/luci-app-nekobox/htdocs/nekobox/ping.php @@ -0,0 +1,513 @@ + '美国', + 'China' => '中国', + 'ISP' => '互联网服务提供商', + 'Japan' => '日本', + 'South Korea' => '韩国', + 'Germany' => '德国', + 'France' => '法国', + 'United Kingdom' => '英国', + 'Canada' => '加拿大', + 'Australia' => '澳大利亚', + 'Russia' => '俄罗斯', + 'India' => '印度', + 'Brazil' => '巴西', + 'Netherlands' => '荷兰', + 'Singapore' => '新加坡', + 'Hong Kong' => '香港', + 'Saudi Arabia' => '沙特阿拉伯', + 'Turkey' => '土耳其', + 'Italy' => '意大利', + 'Spain' => '西班牙', + 'Thailand' => '泰国', + 'Malaysia' => '马来西亚', + 'Indonesia' => '印度尼西亚', + 'South Africa' => '南非', + 'Mexico' => '墨西哥', + 'Israel' => '以色列', + 'Sweden' => '瑞典', + 'Switzerland' => '瑞士', + 'Norway' => '挪威', + 'Denmark' => '丹麦', + 'Belgium' => '比利时', + 'Finland' => '芬兰', + 'Poland' => '波兰', + 'Austria' => '奥地利', + 'Greece' => '希腊', + 'Portugal' => '葡萄牙', + 'Ireland' => '爱尔兰', + 'New Zealand' => '新西兰', + 'United Arab Emirates' => '阿拉伯联合酋长国', + 'Argentina' => '阿根廷', + 'Chile' => '智利', + 'Colombia' => '哥伦比亚', + 'Philippines' => '菲律宾', + 'Vietnam' => '越南', + 'Pakistan' => '巴基斯坦', + 'Egypt' => '埃及', + 'Nigeria' => '尼日利亚', + 'Kenya' => '肯尼亚', + 'Morocco' => '摩洛哥', + 'Google' => '谷歌', + 'Amazon' => '亚马逊', + 'Microsoft' => '微软', + 'Facebook' => '脸书', + 'Apple' => '苹果', + 'IBM' => 'IBM', + 'Alibaba' => '阿里巴巴', + 'Tencent' => '腾讯', + 'Baidu' => '百度', + 'Verizon' => '威瑞森', + 'AT&T' => '美国电话电报公司', + 'T-Mobile' => 'T-移动', + 'Vodafone' => '沃达丰', + 'China Telecom' => '中国电信', + 'China Unicom' => '中国联通', + 'China Mobile' => '中国移动', + 'Chunghwa Telecom' => '中华电信', + 'Amazon Web Services (AWS)' => '亚马逊网络服务 (AWS)', + 'Google Cloud Platform (GCP)' => '谷歌云平台 (GCP)', + 'Microsoft Azure' => '微软Azure', + 'Oracle Cloud' => '甲骨文云', + 'Alibaba Cloud' => '阿里云', + 'Tencent Cloud' => '腾讯云', + 'DigitalOcean' => '数字海洋', + 'Linode' => '林诺德', + 'OVHcloud' => 'OVH 云', + 'Hetzner' => '赫兹纳', + 'Vultr' => '沃尔特', + 'OVH' => 'OVH', + 'DreamHost' => '梦想主机', + 'InMotion Hosting' => '动态主机', + 'HostGator' => '主机鳄鱼', + 'Bluehost' => '蓝主机', + 'A2 Hosting' => 'A2主机', + 'SiteGround' => '站点地', + 'Liquid Web' => '液态网络', + 'Kamatera' => '卡玛特拉', + 'IONOS' => 'IONOS', + 'InterServer' => '互联服务器', + 'Hostwinds' => '主机之风', + 'ScalaHosting' => '斯卡拉主机', + 'GreenGeeks' => '绿色极客' +]; +$lang = $_GET['lang'] ?? 'en'; +?> + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+
+

Checking...

+

+
+
+

+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/luci-app-nekobox/htdocs/nekobox/settings.php b/luci-app-nekobox/htdocs/nekobox/settings.php index f17fa7db6..fdb037a0e 100644 --- a/luci-app-nekobox/htdocs/nekobox/settings.php +++ b/luci-app-nekobox/htdocs/nekobox/settings.php @@ -72,7 +72,7 @@ $uiVersion = getUiVersion(); - +
@@ -186,10 +186,13 @@ $uiVersion = getUiVersion();
+
- - -
-
-
-
- -
-
-

Checking...

-

-
-
-
-

-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
-
-
- - - - - \ No newline at end of file