diff --git a/luci-app-openlist2/Makefile b/luci-app-openlist2/Makefile index fc2035c27..8c50bf85e 100644 --- a/luci-app-openlist2/Makefile +++ b/luci-app-openlist2/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-openlist2 PKG_VERSION:=1.0.2 -PKG_RELEASE:=3 +PKG_RELEASE:=4 LUCI_TITLE:=LuCI support for openlist LUCI_DEPENDS:=+openlist2 diff --git a/luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js b/luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js index 364537549..d6666ef9b 100644 --- a/luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js +++ b/luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js @@ -1,4 +1,5 @@ 'use strict'; +'require dom'; 'require form'; 'require fs'; 'require poll'; @@ -23,24 +24,128 @@ const getServiceStatus = () => { }); }; -const renderStatus = (isRunning, protocol, webport, site_url) => { - const spanTemp = '%s %s'; - let renderHTML; - if (isRunning) { - let buttonUrl = ''; - if (site_url && site_url.trim() !== '') { - buttonUrl = site_url; - } else { - buttonUrl = `${protocol}//${window.location.hostname}:${webport}/`; - } - const button = String.format('', - _('Open Web Interface'), buttonUrl); - renderHTML = spanTemp.format('green', 'OpenList', _('RUNNING')) + button; - } else { - renderHTML = spanTemp.format('red', 'OpenList', _('NOT RUNNING')); +const getWebInterfaceUrl = (protocol, webport, site_url) => { + const fallbackUrl = `${protocol}//${window.location.hostname}:${webport}/`; + const configuredUrl = (site_url || '').trim(); + if (configuredUrl) { + try { + const url = new URL(configuredUrl, fallbackUrl); + if (url.protocol === 'http:' || url.protocol === 'https:') + return url.href; + } catch (e) { } } - return renderHTML; + return fallbackUrl; +}; + +const renderStatus = (isRunning, protocol, webport, site_url) => { + const status = E('em', {}, E('span', { 'style': `color:${isRunning ? 'green' : 'red'}` }, + E('strong', {}, ['OpenList ', isRunning ? _('RUNNING') : _('NOT RUNNING')]))); + + if (isRunning && webport) { + const buttonUrl = getWebInterfaceUrl(protocol, webport, site_url); + const button = E('input', { + 'class': 'cbi-button-reload', + 'type': 'button', + 'style': 'margin-left: 50px', + 'value': _('Open Web Interface') + }); + button.addEventListener('click', () => window.open(buttonUrl, '_blank', 'noopener')); + + return E('span', {}, [status, button]); + } + + return status; +}; + +const isSafeLogPath = value => /^\/var\/log\/openlist2(?:[._-][A-Za-z0-9._-]+)?$/.test(value || ''); + +const isEnabledPort = value => { + const port = (value || '').trim(); + return port !== '' && port !== '-1'; +}; + +const HTTPS_ENABLED_PORT = /^[1-9][0-9]*$/; + +const getListenPortValue = (section_id, option, fallback) => { + const value = uci.get('openlist2', section_id, option); + return value == null || String(value).trim() === '' ? fallback : value; +}; + +const getHttpsPortValue = (section_id, httpsPortOption) => { + const value = httpsPortOption.formvalue(section_id); + return value == null || String(value).trim() === '' + ? getListenPortValue(section_id, 'listen_https_port', '-1') + : value; +}; + +const validateHttpsRequiredFile = (section_id, httpsPortOption, value, message) => { + if (!HTTPS_ENABLED_PORT.test(String(getHttpsPortValue(section_id, httpsPortOption)).trim())) + return true; + + return (value || '').trim() ? true : message; +}; + +const validateListenPort = value => { + const port = (value || '').trim(); + if (port === '-1') + return true; + + if (/^\d+$/.test(port)) { + const number = Number(port); + if (number >= 1 && number <= 65535) + return true; + } + + return _('Port must be -1 or a valid port number from 1 to 65535.'); +}; + +const isHttpUrl = value => { + try { + const url = new URL(value); + return !!url.hostname && (url.protocol === 'http:' || url.protocol === 'https:'); + } catch (e) { + return false; + } +}; + +const validateSiteUrl = value => { + const url = (value || '').trim(); + if (!url) + return true; + + if (isHttpUrl(url) && !url.endsWith('/')) + return true; + + return _('Site URL must start with http:// or https:// and must not end with /.'); +}; + +const validateCorsOrigins = value => { + const origins = (value || '').split(',') + .map(origin => origin.trim()) + .filter(Boolean); + + for (const origin of origins) { + if (origin === '*' || isHttpUrl(origin)) + continue; + + return _('CORS origins must be * or include http:// or https://.'); + } + + return true; +}; + +const getEffectiveWebEndpoint = config => { + const httpPort = uci.get(config, '@openlist2[0]', 'listen_http_port') || '5244'; + const httpsPort = uci.get(config, '@openlist2[0]', 'listen_https_port') || '-1'; + + if (isEnabledPort(httpsPort)) + return { protocol: 'https:', port: httpsPort }; + + if (isEnabledPort(httpPort)) + return { protocol: 'http:', port: httpPort }; + + return { protocol: 'http:', port: '' }; }; return view.extend({ @@ -69,19 +174,15 @@ return view.extend({ }, render(data) { - let m, s, o; - const webport = uci.get(data[0], '@openlist2[0]', 'port') || '5244'; - const ssl = uci.get(data[0], '@openlist2[0]', 'ssl') || '0'; - let protocol; - if (ssl === '0') { - protocol = 'http:'; - } else if (ssl === '1') { - protocol = 'https:'; - } + let m, s, o, httpsPortOption; + const endpoint = getEffectiveWebEndpoint(data[0]); + const webport = endpoint.port; + const protocol = endpoint.protocol; const site_url = uci.get(data[0], '@openlist2[0]', 'site_url') || ''; m = new form.Map('openlist2', _('OpenList'), - _('A file list program that supports multiple storage.')); + _('A file list program that supports multiple storage.') + '
' + + _('Initial login username is "%s" and password is "%s". Change it immediately after first login.').format('admin', 'admin')); s = m.section(form.TypedSection); s.anonymous = true; @@ -92,7 +193,7 @@ return view.extend({ return L.resolveDefault(getServiceStatus()).then(res => { const view = document.getElementById('service_status'); if (view) - view.innerHTML = renderStatus(res, protocol, webport, site_url); + dom.content(view, renderStatus(res, protocol, webport, site_url)); }); }); @@ -107,6 +208,7 @@ return view.extend({ s.tab('global', _('Global Settings')); s.tab('log', _('Logs')); s.tab('database', _('Database')); + s.tab('search', _('Search')); s.tab('scheme', _('Web Protocol')); s.tab('tasks', _('Task threads')); s.tab('cors', _('CORS Settings')); @@ -119,9 +221,8 @@ return view.extend({ o.default = o.disabled; o.rmempty = false; - o = s.taboption('basic', form.Value, 'port', _('Port')); - o.datatype = 'and(port,min(1))'; - o.default = '5244'; + o = s.taboption('basic', form.Flag, 'debug', _('Debug logging'), + _('Pass --debug to OpenList and send stderr to procd logs.')); o.rmempty = false; o = s.taboption('basic', form.Value, 'delayed_start', _('Delayed Start (seconds)')); @@ -153,6 +254,9 @@ return view.extend({ o = s.taboption('global', form.Value, 'site_url', _('Site URL'), _('When the web is reverse proxied to a subdirectory, this option must be filled out to ensure proper functioning of the web. Do not include \'/\' at the end of the URL')); + o.validate = function(section_id, value) { + return validateSiteUrl(value); + }; o = s.taboption('global', form.Value, 'cdn', _('CDN URL')); o.default = ''; @@ -165,6 +269,28 @@ return view.extend({ o.default = '48'; o.rmempty = false; + o = s.taboption('global', form.Value, 'proxy_address', _('Proxy address'), + _('HTTP, HTTPS, SOCKS4, SOCKS5 or SOCKS5HOSTNAME proxy used by OpenList outbound requests.')); + o.default = ''; + + o = s.taboption('global', form.Value, 'auto_memory_limit', _('Auto memory limit (MB)'), + _('0 disables the automatic memory limit. The upstream default is 4 MB.')); + o.default = '4'; + o.datatype = 'uinteger'; + o.rmempty = false; + + o = s.taboption('global', form.Value, 'min_free_memory', _('Minimum free memory (MB)'), + _('Values below 16 let OpenList calculate a default; negative values disable memory cache.')); + o.default = '0'; + o.datatype = 'integer'; + o.rmempty = false; + + o = s.taboption('global', form.Value, 'max_block_limit', _('Maximum block size (MB)'), + _('Values below 4 let OpenList calculate a default.')); + o.default = '0'; + o.datatype = 'uinteger'; + o.rmempty = false; + o = s.taboption('global', form.Value, 'max_connections', _('Max Connections'), _('0 is unlimited, It is recommend to set a low number of concurrency (10-20) for poor performance device')); o.default = '0'; @@ -172,13 +298,14 @@ return view.extend({ o.rmempty = false; o = s.taboption('global', form.Value, 'max_concurrency', _('Max concurrency of local proxies'), - _('0 is unlimited, Limit the maximum concurrency of local agents. The default value is 64')); - o.default = '0'; + _('0 is unlimited, Limit the maximum concurrency of local agents. The default value is 64')); + o.default = '64'; o.datatype = 'uinteger'; o.rmempty = false; - o = s.taboption('global', form.Flag, 'tls_insecure_skip_verify', _('Disable TLS Verify')); - o.default = true; + o = s.taboption('global', form.Flag, 'tls_insecure_skip_verify', _('Disable TLS Verify'), + _('Skip remote TLS certificate verification (not recommended).')); + o.default = false; o.rmempty = false; // Logs @@ -190,16 +317,22 @@ return view.extend({ o.default = '/var/log/openlist2.log'; o.rmempty = false; o.depends('log', '1'); + o.validate = function(section_id, value) { + if (isSafeLogPath(value)) + return true; + + return _('Log path must be /var/log/openlist2* without subdirectories.'); + }; o = s.taboption('log', form.Value, 'log_max_size', _('Max Size (MB)')); o.datatype = 'uinteger'; - o.default = '10'; + o.default = '50'; o.rmempty = false; o.depends('log', '1'); o = s.taboption('log', form.Value, 'log_max_backups', _('Max backups')); o.datatype = 'uinteger'; - o.default = '5'; + o.default = '30'; o.rmempty = false; o.depends('log', '1'); @@ -214,6 +347,20 @@ return view.extend({ o.rmempty = false; o.depends('log', '1'); + o = s.taboption('log', form.Flag, 'log_filter', _('Enable common log filters'), + _('Filter noisy access logs such as health checks, HEAD requests and WebDAV PROPFIND.')); + o.rmempty = false; + o.depends('log', '1'); + + o = s.taboption('log', form.Value, 'log_filter_cidr', _('Custom log filter CIDR')); + o.depends('log_filter', '1'); + + o = s.taboption('log', form.Value, 'log_filter_path', _('Custom log filter path')); + o.depends('log_filter', '1'); + + o = s.taboption('log', form.Value, 'log_filter_method', _('Custom log filter method')); + o.depends('log_filter', '1'); + // database o = s.taboption('database', form.ListValue, 'database_type', _('Database Type')); o.default = 'sqlite3'; @@ -225,9 +372,10 @@ return view.extend({ o.depends('database_type', 'mysql'); o.depends('database_type', 'postgres'); - o = s.taboption('database', form.Value, 'mysql_port', _('Database Port')); + o = s.taboption('database', form.Value, 'mysql_port', _('Database Port'), + _('Use 0 to apply the usual default for the selected database: 3306 for MySQL, 5432 for PostgreSQL.')); o.datatype = 'port'; - o.default = '3306'; + o.default = '0'; o.depends('database_type', 'mysql'); o.depends('database_type', 'postgres'); @@ -256,23 +404,71 @@ return view.extend({ o.depends('database_type', 'mysql'); o.depends('database_type', 'postgres'); - // scheme - o = s.taboption('scheme', form.Flag, 'ssl', _('Enable SSL')); + o = s.taboption('search', form.Value, 'meilisearch_host', _('Meilisearch Host')); + o.default = 'http://localhost:7700'; o.rmempty = false; + o = s.taboption('search', form.Value, 'meilisearch_api_key', _('Meilisearch API Key')); + o.password = true; + + o = s.taboption('search', form.Value, 'meilisearch_index', _('Meilisearch Index')); + o.default = 'openlist'; + o.rmempty = false; + + // scheme + o = s.taboption('scheme', form.Value, 'listen_addr', _('Listen address')); + o.default = '0.0.0.0'; + o.datatype = 'ipaddr'; + o.rmempty = false; + + o = s.taboption('scheme', form.Value, 'listen_http_port', _('HTTP listen port'), + _('The upstream default is 5244. Set to -1 to disable HTTP.')); + o.datatype = 'integer'; + o.default = '5244'; + o.rmempty = false; + o.cfgvalue = section_id => getListenPortValue(section_id, 'listen_http_port', '5244'); + o.validate = function(section_id, value) { + return validateListenPort(value); + }; + + httpsPortOption = o = s.taboption('scheme', form.Value, 'listen_https_port', _('HTTPS listen port'), + _('The upstream default is -1 (disabled). Set a valid port number to enable HTTPS.')); + o.datatype = 'integer'; + o.default = '-1'; + o.rmempty = false; + o.cfgvalue = section_id => getListenPortValue(section_id, 'listen_https_port', '-1'); + o.validate = function(section_id, value) { + return validateListenPort(value); + }; + o = s.taboption('scheme', form.Flag, 'force_https', _('Force HTTPS')); o.rmempty = false; - o.depends('ssl', '1'); o = s.taboption('scheme', form.Value, 'ssl_cert', _('SSL cert'), _('SSL certificate file path')); - o.rmempty = false; - o.depends('ssl', '1'); + o.validate = function(section_id, value) { + return validateHttpsRequiredFile(section_id, httpsPortOption, value, + _('SSL certificate file path is required when HTTPS is enabled.')); + }; o = s.taboption('scheme', form.Value, 'ssl_key', _('SSL key'), _('SSL key file path')); + o.validate = function(section_id, value) { + return validateHttpsRequiredFile(section_id, httpsPortOption, value, + _('SSL key file path is required when HTTPS is enabled.')); + }; + + o = s.taboption('scheme', form.Value, 'listen_unix_file', _('Unix socket file')); + + o = s.taboption('scheme', form.Value, 'listen_unix_file_perm', _('Unix socket permission')); + + o = s.taboption('scheme', form.Flag, 'listen_enable_h2c', _('Enable H2C'), + _('Enable cleartext HTTP/2 for reverse proxies that use grpc_pass.')); + o.rmempty = false; + + o = s.taboption('scheme', form.Flag, 'listen_enable_h3', _('Enable HTTP/3/QUIC'), + _('Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled and certificate files must be configured.')); o.rmempty = false; - o.depends('ssl', '1'); // tasks o = s.taboption('tasks', form.Value, 'download_workers', _('Download Workers')); @@ -285,6 +481,9 @@ return view.extend({ o.default = '1'; o.rmempty = false; + o = s.taboption('tasks', form.Flag, 'download_task_persistant', _('Download Task Persistence')); + o.rmempty = false; + o = s.taboption('tasks', form.Value, 'transfer_workers', _('Transfer Workers')); o.datatype = 'uinteger'; o.default = '5'; @@ -295,6 +494,9 @@ return view.extend({ o.default = '2'; o.rmempty = false; + o = s.taboption('tasks', form.Flag, 'transfer_task_persistant', _('Transfer Task Persistence')); + o.rmempty = false; + o = s.taboption('tasks', form.Value, 'upload_workers', _('Upload Workers')); o.datatype = 'uinteger'; o.default = '5'; @@ -305,6 +507,9 @@ return view.extend({ o.default = '0'; o.rmempty = false; + o = s.taboption('tasks', form.Flag, 'upload_task_persistant', _('Upload Task Persistence')); + o.rmempty = false; + o = s.taboption('tasks', form.Value, 'copy_workers', _('Copy Workers')); o.datatype = 'uinteger'; o.default = '5'; @@ -315,16 +520,67 @@ return view.extend({ o.default = '2'; o.rmempty = false; + o = s.taboption('tasks', form.Flag, 'copy_task_persistant', _('Copy Task Persistence')); + o.rmempty = false; + + o = s.taboption('tasks', form.Value, 'move_workers', _('Move Workers')); + o.datatype = 'uinteger'; + o.default = '5'; + o.rmempty = false; + + o = s.taboption('tasks', form.Value, 'move_max_retry', _('Move Max Retry')); + o.datatype = 'uinteger'; + o.default = '2'; + o.rmempty = false; + + o = s.taboption('tasks', form.Flag, 'move_task_persistant', _('Move Task Persistence')); + o.rmempty = false; + + o = s.taboption('tasks', form.Value, 'decompress_workers', _('Decompress Workers')); + o.datatype = 'uinteger'; + o.default = '5'; + o.rmempty = false; + + o = s.taboption('tasks', form.Value, 'decompress_max_retry', _('Decompress Max Retry')); + o.datatype = 'uinteger'; + o.default = '2'; + o.rmempty = false; + + o = s.taboption('tasks', form.Flag, 'decompress_task_persistant', _('Decompress Task Persistence')); + o.rmempty = false; + + o = s.taboption('tasks', form.Value, 'decompress_upload_workers', _('Decompress Upload Workers')); + o.datatype = 'uinteger'; + o.default = '5'; + o.rmempty = false; + + o = s.taboption('tasks', form.Value, 'decompress_upload_max_retry', _('Decompress Upload Max Retry')); + o.datatype = 'uinteger'; + o.default = '2'; + o.rmempty = false; + + o = s.taboption('tasks', form.Flag, 'decompress_upload_task_persistant', _('Decompress Upload Task Persistence')); + o.rmempty = false; + + o = s.taboption('tasks', form.Flag, 'allow_retry_canceled', _('Allow retry canceled tasks')); + o.rmempty = false; + // cors - o = s.taboption('cors', form.Value, 'cors_allow_origins', _('Allow Origins')); + o = s.taboption('cors', form.Value, 'cors_allow_origins', _('Allow Origins'), + _('Comma-separated list. Use * to allow any value.')); + o.default = '*'; + o.rmempty = false; + o.validate = function(section_id, value) { + return validateCorsOrigins(value); + }; + + o = s.taboption('cors', form.Value, 'cors_allow_methods', _('Allow Methods'), + _('Comma-separated list. Use * to allow any value.')); o.default = '*'; o.rmempty = false; - o = s.taboption('cors', form.Value, 'cors_allow_methods', _('Allow Methods')); - o.default = '*'; - o.rmempty = false; - - o = s.taboption('cors', form.Value, 'cors_allow_headers', _('Allow Headers')); + o = s.taboption('cors', form.Value, 'cors_allow_headers', _('Allow Headers'), + _('Comma-separated list. Use * to allow any value.')); o.default = '*'; o.rmempty = false; @@ -364,7 +620,7 @@ return view.extend({ o = s.taboption('ftp', form.Value, 'connection_timeout', _('Connection timeout (seconds)')); o.datatype = 'uinteger'; - o.default = '900'; + o.default = '30'; o.rmempty = false; o = s.taboption('ftp', form.Flag, 'disable_active_mode', _('Disable active transfer mode')); @@ -374,9 +630,11 @@ return view.extend({ o.rmempty = false; o = s.taboption('ftp', form.Flag, 'enable_active_conn_ip_check', _('Client IP check in active transfer mode')); + o.default = '1'; o.rmempty = false; o = s.taboption('ftp', form.Flag, 'enable_pasv_conn_ip_check', _('Client IP check in passive transfer mode')); + o.default = '1'; o.rmempty = false; // sftp diff --git a/luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js b/luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js index 663512587..3ba0b5d3d 100644 --- a/luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js +++ b/luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js @@ -1,42 +1,60 @@ 'use strict'; -'require dom'; 'require fs'; 'require poll'; 'require uci'; +'require ui'; 'require view'; +const DEFAULT_LOG_PATH = '/var/log/openlist2.log'; + let scrollPosition = 0; let userScrolled = false; let logTextarea; -let log_path; +let log_path = DEFAULT_LOG_PATH; -uci.load('openlist2').then(() => { - log_path = uci.get('openlist2', '@openlist2[0]', 'log_path') || '/var/log/openlist2.log'; -}); +const isSafeLogPath = value => /^\/var\/log\/openlist2(?:[._-][A-Za-z0-9._-]+)?$/.test(value || ''); + +const formatLog = res => { + const log = (res || '').trim().replace(/\u001b\[[0-9;]*m/g, ''); + + return log || _('No log data.'); +}; const pollLog = () => { - return Promise.all([ - fs.read_direct(log_path, 'text').then(res => { - return res.trim().split(/\n/).join('\n').replace(/\u001b\[33mWARN\u001b\[0m/g, '').replace(/\u001b\[36mINFO\u001b\[0m/g, '').replace(/\u001b\[31mERRO\u001b\[0m/g, ''); - }), - ]).then(data => { - logTextarea.value = data[0] || _('No log data.'); + if (!logTextarea) + return Promise.resolve(); - if (!userScrolled) { - logTextarea.scrollTop = logTextarea.scrollHeight; - } else { - logTextarea.scrollTop = scrollPosition; - } - }); + return fs.read_direct(log_path, 'text') + .then(formatLog) + .catch(() => _('No log data.')) + .then(log => { + logTextarea.value = log; + + if (!userScrolled) { + logTextarea.scrollTop = logTextarea.scrollHeight; + } else { + logTextarea.scrollTop = scrollPosition; + } + }); }; return view.extend({ + load() { + return uci.load('openlist2'); + }, + handleCleanLogs() { return fs.write(log_path, '') - .catch(e => { ui.addNotification(null, E('p', e.message)) }); + .then(pollLog) + .catch(e => { + ui.addNotification(null, E('p', e.message)); + }); }, render() { + const configuredLogPath = uci.get('openlist2', '@openlist2[0]', 'log_path'); + log_path = isSafeLogPath(configuredLogPath) ? configuredLogPath : DEFAULT_LOG_PATH; + logTextarea = E('textarea', { 'id': 'log_content', 'class': 'cbi-input-textarea', diff --git a/luci-app-openlist2/po/templates/openlist2.po b/luci-app-openlist2/po/templates/openlist2.po index 4f91cafd5..edf0a5218 100644 --- a/luci-app-openlist2/po/templates/openlist2.po +++ b/luci-app-openlist2/po/templates/openlist2.po @@ -1,384 +1,623 @@ msgid "" -msgstr "Content-Type: text/plain; charset=UTF-8" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:169 -msgid "" -"0 is unlimited, It is recommend to set a low number of concurrency (10-20) " -"for poor performance device" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:175 -msgid "" -"0 is unlimited, Limit the maximum concurrency of local agents. The default " -"value is 64" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:84 -msgid "A file list program that supports multiple storage." -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:327 -msgid "Allow Headers" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:323 -msgid "Allow Methods" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:319 -msgid "Allow Origins" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:106 -msgid "Basic Settings" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:157 -msgid "CDN URL" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:112 -msgid "CORS Settings" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:138 -msgid "Cache directory" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:59 -msgid "Clear logs" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:376 -msgid "Client IP check in active transfer mode" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:379 -msgid "Client IP check in passive transfer mode" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:360 -msgid "Client idle timeout (seconds)" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:100 -msgid "Collecting data..." -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:365 -msgid "Connection timeout (seconds)" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:313 -msgid "Copy Max Retry" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:308 -msgid "Copy Workers" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:135 -msgid "Data directory" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:109 -msgid "Database" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:255 -msgid "Database DSN" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:224 -msgid "Database Host" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:242 -msgid "Database Name" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:238 -msgid "Database Password" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:228 -msgid "Database Port" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:251 -msgid "Database SSL Mode" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:246 -msgid "Database Table Prefix" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:218 -msgid "Database Type" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:234 -msgid "Database Username" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:127 -msgid "Delayed Start (seconds)" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:180 -msgid "Disable TLS Verify" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:370 -msgid "Disable active transfer mode" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:283 -msgid "Download Max Retry" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:278 -msgid "Download Workers" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:185 -msgid "Enable Logs" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:260 -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:340 -msgid "Enable SSL" msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:373 -msgid "Enable binary transfer mode" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:357 -msgid "Enable non-20 port for active transfer" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:118 -msgid "Enabled" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:344 -msgid "Enabled FTP" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:332 -msgid "Enabled S3" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:383 -msgid "Enabled SFTP" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:114 -msgid "FTP" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:347 -msgid "FTP Port" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:263 -msgid "Force HTTPS" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:149 -msgid "Force read config" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:143 -msgid "Generate a new random password." -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:107 -msgid "Global Settings" -msgstr "" - -#: luci-app-openlist2/root/usr/share/rpcd/acl.d/luci-app-openlist2.json:3 -msgid "Grant UCI access for luci-app-openlist2" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:160 -msgid "JWT Key" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:212 -msgid "Log Compress" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:189 -msgid "Log path" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:163 -msgid "Login Validity Period (hours)" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:108 -#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:21 -msgid "Logs" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:168 -msgid "Max Connections" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:194 -msgid "Max Size (MB)" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:206 -msgid "Max age" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:200 -msgid "Max backups" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:174 -msgid "Max concurrency of local proxies" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:352 -msgid "Max retries on port conflict during passive transfer" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:221 -msgid "MySQL" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:40 -msgid "NOT RUNNING" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:65 -msgid "New Password:" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:65 -msgid "New password has been copied to clipboard." -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:23 -msgid "No log data." -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:113 -msgid "Object Storage" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:37 -msgid "Open Web Interface" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:132 -msgid "Open firewall port" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:83 -#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:3 -msgid "OpenList" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:122 -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:335 -msgid "Port" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:222 -msgid "PostgreSQL" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:38 +"Project-Id-Version: luci-app-openlist2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-27 09:57+0800\n" +"PO-Revision-Date: 2026-06-26 00:00+0800\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:43 msgid "RUNNING" msgstr "" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:68 -msgid "Refresh every %s seconds." +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:43 +msgid "NOT RUNNING" msgstr "" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:142 -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:144 -msgid "Reset Password" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:51 +msgid "Open Web Interface" msgstr "" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:115 -msgid "SFTP" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:100 +msgid "Port must be -1 or a valid port number from 1 to 65535." msgstr "" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:386 -msgid "SFTP Port" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:120 +msgid "Site URL must start with http:// or https:// and must not end with /." msgstr "" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:220 -msgid "SQLite" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:132 +msgid "CORS origins must be * or include http:// or https://." msgstr "" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:267 -msgid "SSL cert" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:170 +msgid "Username:" msgstr "" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:268 -msgid "SSL certificate file path" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:170 +msgid "New Password:" msgstr "" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:272 -msgid "SSL key" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:170 +msgid "New password has been copied to clipboard." msgstr "" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:273 -msgid "SSL key file path" +#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:3 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:183 +msgid "OpenList" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:184 +msgid "A file list program that supports multiple storage." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:185 +#, javascript-format +msgid "" +"Initial login username is \"%s\" and password is \"%s\". Change it " +"immediately after first login." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:201 +msgid "Collecting data..." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:207 +msgid "Basic Settings" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:208 +msgid "Global Settings" msgstr "" #: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:13 msgid "Setting" msgstr "" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:150 +#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:21 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:209 +msgid "Logs" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:210 +msgid "Database" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:211 +msgid "Search" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:212 +msgid "Web Protocol" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:213 +msgid "Task threads" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:214 +msgid "CORS Settings" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:215 +msgid "Object Storage" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:216 +msgid "FTP" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:217 +msgid "SFTP" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:220 +msgid "Enabled" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:224 +msgid "Debug logging" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:225 +msgid "Pass --debug to OpenList and send stderr to procd logs." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:228 +msgid "Delayed Start (seconds)" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:233 +msgid "Open firewall port" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:236 +msgid "Data directory" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:239 +msgid "Cache directory" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:243 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:245 +msgid "Reset Password" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:244 +msgid "Generate a new random password." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:250 +msgid "Force read config" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:251 msgid "" "Setting this to true will force the program to read the configuration file, " "ignoring environment variables." msgstr "" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:154 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:255 msgid "Site URL" msgstr "" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:111 -msgid "Task threads" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:293 -msgid "Transfer Max Retry" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:288 -msgid "Transfer Workers" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:303 -msgid "Upload Max Retry" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:298 -msgid "Upload Workers" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:65 -msgid "Username:" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:110 -msgid "Web Protocol" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:155 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:256 msgid "" "When the web is reverse proxied to a subdirectory, this option must be " "filled out to ensure proper functioning of the web. Do not include '/' at " "the end of the URL" msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:261 +msgid "CDN URL" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:264 +msgid "JWT Key" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:267 +msgid "Login Validity Period (hours)" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:272 +msgid "Proxy address" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:273 +msgid "" +"HTTP, HTTPS, SOCKS4, SOCKS5 or SOCKS5HOSTNAME proxy used by OpenList " +"outbound requests." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:276 +msgid "Auto memory limit (MB)" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:277 +msgid "0 disables the automatic memory limit. The upstream default is 4 MB." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:282 +msgid "Minimum free memory (MB)" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:283 +msgid "" +"Values below 16 let OpenList calculate a default; negative values disable " +"memory cache." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:288 +msgid "Maximum block size (MB)" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:289 +msgid "Values below 4 let OpenList calculate a default." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:294 +msgid "Max Connections" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:295 +msgid "" +"0 is unlimited, It is recommend to set a low number of concurrency (10-20) " +"for poor performance device" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:300 +msgid "Max concurrency of local proxies" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:301 +msgid "" +"0 is unlimited, Limit the maximum concurrency of local agents. The default " +"value is 64" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:306 +msgid "Disable TLS Verify" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:307 +msgid "Skip remote TLS certificate verification (not recommended)." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:312 +msgid "Enable Logs" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:316 +msgid "Log path" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:324 +msgid "Log path must be /var/log/openlist2* without subdirectories." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:327 +msgid "Max Size (MB)" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:333 +msgid "Max backups" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:339 +msgid "Max age" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:345 +msgid "Log Compress" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:350 +msgid "Enable common log filters" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:351 +msgid "" +"Filter noisy access logs such as health checks, HEAD requests and WebDAV " +"PROPFIND." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:355 +msgid "Custom log filter CIDR" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:358 +msgid "Custom log filter path" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:361 +msgid "Custom log filter method" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:365 +msgid "Database Type" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:367 +msgid "SQLite" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:368 +msgid "MySQL" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:369 +msgid "PostgreSQL" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:371 +msgid "Database Host" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:375 +msgid "Database Port" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:376 +msgid "" +"Use 0 to apply the usual default for the selected database: 3306 for MySQL, " +"5432 for PostgreSQL." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:382 +msgid "Database Username" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:386 +msgid "Database Password" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:390 +msgid "Database Name" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:394 +msgid "Database Table Prefix" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:399 +msgid "Database SSL Mode" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:403 +msgid "Database DSN" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:407 +msgid "Meilisearch Host" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:411 +msgid "Meilisearch API Key" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:414 +msgid "Meilisearch Index" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:419 +msgid "Listen address" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:424 +msgid "HTTP listen port" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:425 +msgid "The upstream default is 5244. Set to -1 to disable HTTP." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:434 +msgid "HTTPS listen port" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:435 +msgid "" +"The upstream default is -1 (disabled). Set a valid port number to enable " +"HTTPS." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:444 +msgid "Force HTTPS" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:447 +msgid "SSL cert" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:448 +msgid "SSL certificate file path" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:451 +msgid "SSL certificate file path is required when HTTPS is enabled." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:454 +msgid "SSL key" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:455 +msgid "SSL key file path" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:458 +msgid "SSL key file path is required when HTTPS is enabled." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:461 +msgid "Unix socket file" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:463 +msgid "Unix socket permission" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:465 +msgid "Enable H2C" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:466 +msgid "Enable cleartext HTTP/2 for reverse proxies that use grpc_pass." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:469 +msgid "Enable HTTP/3/QUIC" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:470 +msgid "" +"Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled and " +"certificate files must be configured." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:474 +msgid "Download Workers" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:479 +msgid "Download Max Retry" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:484 +msgid "Download Task Persistence" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:487 +msgid "Transfer Workers" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:492 +msgid "Transfer Max Retry" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:497 +msgid "Transfer Task Persistence" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:500 +msgid "Upload Workers" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:505 +msgid "Upload Max Retry" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:510 +msgid "Upload Task Persistence" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:513 +msgid "Copy Workers" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:518 +msgid "Copy Max Retry" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:523 +msgid "Copy Task Persistence" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:526 +msgid "Move Workers" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:531 +msgid "Move Max Retry" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:536 +msgid "Move Task Persistence" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:539 +msgid "Decompress Workers" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:544 +msgid "Decompress Max Retry" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:549 +msgid "Decompress Task Persistence" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:552 +msgid "Decompress Upload Workers" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:557 +msgid "Decompress Upload Max Retry" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:562 +msgid "Decompress Upload Task Persistence" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:565 +msgid "Allow retry canceled tasks" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:569 +msgid "Allow Origins" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:570 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:578 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:583 +msgid "Comma-separated list. Use * to allow any value." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:577 +msgid "Allow Methods" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:582 +msgid "Allow Headers" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:588 +msgid "Enabled S3" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:591 +msgid "Port" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:596 +msgid "Enable SSL" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:600 +msgid "Enabled FTP" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:603 +msgid "FTP Port" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:608 +msgid "Max retries on port conflict during passive transfer" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:613 +msgid "Enable non-20 port for active transfer" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:616 +msgid "Client idle timeout (seconds)" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:621 +msgid "Connection timeout (seconds)" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:626 +msgid "Disable active transfer mode" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:629 +msgid "Enable binary transfer mode" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:632 +msgid "Client IP check in active transfer mode" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:636 +msgid "Client IP check in passive transfer mode" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:641 +msgid "Enabled SFTP" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:644 +msgid "SFTP Port" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:20 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:29 +msgid "No log data." +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:77 +msgid "Clear logs" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:86 +#, javascript-format +msgid "Refresh every %s seconds." +msgstr "" diff --git a/luci-app-openlist2/po/zh_Hans/openlist2.po b/luci-app-openlist2/po/zh_Hans/openlist2.po index ff12fb6ed..c442d538d 100644 --- a/luci-app-openlist2/po/zh_Hans/openlist2.po +++ b/luci-app-openlist2/po/zh_Hans/openlist2.po @@ -1,389 +1,174 @@ msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: luci-app-openlist2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-27 09:57+0800\n" +"PO-Revision-Date: 2026-06-25 00:00+0800\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:169 -msgid "" -"0 is unlimited, It is recommend to set a low number of concurrency (10-20) " -"for poor performance device" -msgstr "默认 0 不限制,低性能设备建议设置较低的并发数(10-20)" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:175 -msgid "" -"0 is unlimited, Limit the maximum concurrency of local agents. The default " -"value is 64" -msgstr "限制本地代理最大并发数,值为 0 表示不限制,默认值 64" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:84 -msgid "A file list program that supports multiple storage." -msgstr "一款支持多种存储的目录文件列表程序。" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:327 -msgid "Allow Headers" -msgstr "允许标头(Headers)" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:323 -msgid "Allow Methods" -msgstr "允许方法(Methods)" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:319 -msgid "Allow Origins" -msgstr "允许来源(Origins)" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:106 -msgid "Basic Settings" -msgstr "基本设置" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:157 -msgid "CDN URL" -msgstr "CDN 地址" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:112 -msgid "CORS Settings" -msgstr "跨域设置" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:138 -msgid "Cache directory" -msgstr "缓存目录" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:59 -msgid "Clear logs" -msgstr "清空日志" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:376 -msgid "Client IP check in active transfer mode" -msgstr "主动传输模式下对客户端进行 IP 检查" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:379 -msgid "Client IP check in passive transfer mode" -msgstr "被动传输模式下对客户端进行 IP 检查" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:360 -msgid "Client idle timeout (seconds)" -msgstr "客户端空闲超时(秒)" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:100 -msgid "Collecting data..." -msgstr "收集数据..." - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:365 -msgid "Connection timeout (seconds)" -msgstr "连接超时(秒)" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:313 -msgid "Copy Max Retry" -msgstr "复制任务重试次数" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:308 -msgid "Copy Workers" -msgstr "复制任务线程数" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:135 -msgid "Data directory" -msgstr "数据目录" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:109 -msgid "Database" -msgstr "数据库" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:255 -msgid "Database DSN" -msgstr "DSN" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:224 -msgid "Database Host" -msgstr "主机" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:242 -msgid "Database Name" -msgstr "数据库名" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:238 -msgid "Database Password" -msgstr "密码" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:228 -msgid "Database Port" -msgstr "端口" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:251 -msgid "Database SSL Mode" -msgstr "SSL模式" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:246 -msgid "Database Table Prefix" -msgstr "数据库表前缀" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:218 -msgid "Database Type" -msgstr "数据库类型" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:234 -msgid "Database Username" -msgstr "用户名" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:127 -msgid "Delayed Start (seconds)" -msgstr "开机延时启动(秒)" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:180 -msgid "Disable TLS Verify" -msgstr "禁用 TLS 验证" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:370 -msgid "Disable active transfer mode" -msgstr "禁用主动传输模式" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:283 -msgid "Download Max Retry" -msgstr "下载任务重试次数" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:278 -msgid "Download Workers" -msgstr "下载任务线程数" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:185 -msgid "Enable Logs" -msgstr "启用日志" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:260 -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:340 -msgid "Enable SSL" -msgstr "启用 SSL" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:373 -msgid "Enable binary transfer mode" -msgstr "启用二进制传输模式" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:357 -msgid "Enable non-20 port for active transfer" -msgstr "启用非 20 端口进行主动传输" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:118 -msgid "Enabled" -msgstr "启用" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:344 -msgid "Enabled FTP" -msgstr "启用 FTP" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:332 -msgid "Enabled S3" -msgstr "启用 S3" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:383 -msgid "Enabled SFTP" -msgstr "启用 SFTP" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:114 -msgid "FTP" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:347 -msgid "FTP Port" -msgstr "FTP 端口" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:263 -msgid "Force HTTPS" -msgstr "强制 HTTPS" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:149 -msgid "Force read config" -msgstr "强制读取配置" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:143 -msgid "Generate a new random password." -msgstr "随机生成一个新密码。" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:107 -msgid "Global Settings" -msgstr "全局设置" - -#: luci-app-openlist2/root/usr/share/rpcd/acl.d/luci-app-openlist2.json:3 -msgid "Grant UCI access for luci-app-openlist2" -msgstr "授予 luci-app-openlist2 的 UCI 访问权限" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:160 -msgid "JWT Key" -msgstr "JWT 密钥" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:212 -msgid "Log Compress" -msgstr "日志压缩" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:189 -msgid "Log path" -msgstr "日志文件路径" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:163 -msgid "Login Validity Period (hours)" -msgstr "登录有效期(小时)" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:108 -#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:21 -msgid "Logs" -msgstr "日志" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:168 -msgid "Max Connections" -msgstr "最大并发连接数" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:194 -msgid "Max Size (MB)" -msgstr "日志文件大小(MB)" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:206 -msgid "Max age" -msgstr "日志保存天数" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:200 -msgid "Max backups" -msgstr "日志备份数量" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:174 -msgid "Max concurrency of local proxies" -msgstr "本地代理最大并发数" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:352 -msgid "Max retries on port conflict during passive transfer" -msgstr "被动传输端口冲突时最大重试次数" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:221 -msgid "MySQL" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:40 -msgid "NOT RUNNING" -msgstr "未运行" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:65 -msgid "New Password:" -msgstr "新密码:" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:65 -msgid "New password has been copied to clipboard." -msgstr "新密码已复制到剪贴板。" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:23 -msgid "No log data." -msgstr "无日志数据。" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:113 -msgid "Object Storage" -msgstr "对象存储" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:37 -msgid "Open Web Interface" -msgstr "打开 Web 界面" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:132 -msgid "Open firewall port" -msgstr "打开防火墙端口" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:83 -#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:3 -msgid "OpenList" -msgstr "OpenList" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:122 -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:335 -msgid "Port" -msgstr "端口" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:222 -msgid "PostgreSQL" -msgstr "" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:38 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:43 msgid "RUNNING" msgstr "运行中" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:68 -msgid "Refresh every %s seconds." -msgstr "每 %s 秒刷新。" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:43 +msgid "NOT RUNNING" +msgstr "未运行" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:142 -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:144 -msgid "Reset Password" -msgstr "重置密码" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:51 +msgid "Open Web Interface" +msgstr "打开 Web 界面" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:115 -msgid "SFTP" -msgstr "" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:100 +msgid "Port must be -1 or a valid port number from 1 to 65535." +msgstr "端口必须为 -1,或 1 到 65535 之间的有效端口号。" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:386 -msgid "SFTP Port" -msgstr "SFTP 端口" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:120 +msgid "Site URL must start with http:// or https:// and must not end with /." +msgstr "站点 URL 必须以 http:// 或 https:// 开头,且末尾不能带 /。" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:220 -msgid "SQLite" -msgstr "" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:132 +msgid "CORS origins must be * or include http:// or https://." +msgstr "CORS 来源必须为 *,或包含 http:// / https://。" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:267 -msgid "SSL cert" -msgstr "SSL 证书" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:170 +msgid "Username:" +msgstr "用户名:" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:268 -msgid "SSL certificate file path" -msgstr "SSL 证书文件路径" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:170 +msgid "New Password:" +msgstr "新密码:" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:272 -msgid "SSL key" -msgstr "SSL 密钥" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:170 +msgid "New password has been copied to clipboard." +msgstr "新密码已复制到剪贴板。" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:273 -msgid "SSL key file path" -msgstr "SSL 密钥文件路径" +#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:3 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:183 +msgid "OpenList" +msgstr "OpenList" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:184 +msgid "A file list program that supports multiple storage." +msgstr "一款支持多种存储的目录文件列表程序。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:185 +#, javascript-format +msgid "" +"Initial login username is \"%s\" and password is \"%s\". Change it " +"immediately after first login." +msgstr "初始登录用户名为「%s」,密码为「%s」。首次登录后请立即修改。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:201 +msgid "Collecting data..." +msgstr "收集数据..." + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:207 +msgid "Basic Settings" +msgstr "基本设置" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:208 +msgid "Global Settings" +msgstr "全局设置" #: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:13 msgid "Setting" msgstr "设置" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:150 +#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:21 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:209 +msgid "Logs" +msgstr "日志" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:210 +msgid "Database" +msgstr "数据库" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:211 +msgid "Search" +msgstr "搜索" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:212 +msgid "Web Protocol" +msgstr "Web 协议" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:213 +msgid "Task threads" +msgstr "任务线程" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:214 +msgid "CORS Settings" +msgstr "跨域设置" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:215 +msgid "Object Storage" +msgstr "对象存储" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:216 +msgid "FTP" +msgstr "FTP" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:217 +msgid "SFTP" +msgstr "SFTP" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:220 +msgid "Enabled" +msgstr "启用" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:224 +msgid "Debug logging" +msgstr "调试日志" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:225 +msgid "Pass --debug to OpenList and send stderr to procd logs." +msgstr "向 OpenList 传递 --debug,并将 stderr 发送到 procd 日志。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:228 +msgid "Delayed Start (seconds)" +msgstr "开机延时启动(秒)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:233 +msgid "Open firewall port" +msgstr "打开防火墙端口" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:236 +msgid "Data directory" +msgstr "数据目录" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:239 +msgid "Cache directory" +msgstr "缓存目录" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:243 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:245 +msgid "Reset Password" +msgstr "重置密码" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:244 +msgid "Generate a new random password." +msgstr "随机生成一个新密码。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:250 +msgid "Force read config" +msgstr "强制读取配置" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:251 msgid "" "Setting this to true will force the program to read the configuration file, " "ignoring environment variables." msgstr "将此设置为 true 可以强制程序读取配置文件,而忽略环境变量" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:154 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:255 msgid "Site URL" msgstr "站点地址" -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:111 -msgid "Task threads" -msgstr "任务线程" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:293 -msgid "Transfer Max Retry" -msgstr "中转任务下载重试次数" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:288 -msgid "Transfer Workers" -msgstr "中转任务线程数" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:303 -msgid "Upload Max Retry" -msgstr "上传任务重试次数" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:298 -msgid "Upload Workers" -msgstr "上传任务线程数" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:65 -msgid "Username:" -msgstr "用户名:" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:110 -msgid "Web Protocol" -msgstr "Web 协议" - -#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:155 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:256 msgid "" "When the web is reverse proxied to a subdirectory, this option must be " "filled out to ensure proper functioning of the web. Do not include '/' at " @@ -391,3 +176,457 @@ msgid "" msgstr "" "Web 被反向代理到二级目录时,必须填写该选项以确保 Web 正常工作。URL 结尾请勿携" "带 '/'" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:261 +msgid "CDN URL" +msgstr "CDN 地址" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:264 +msgid "JWT Key" +msgstr "JWT 密钥" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:267 +msgid "Login Validity Period (hours)" +msgstr "登录有效期(小时)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:272 +msgid "Proxy address" +msgstr "代理地址" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:273 +msgid "" +"HTTP, HTTPS, SOCKS4, SOCKS5 or SOCKS5HOSTNAME proxy used by OpenList " +"outbound requests." +msgstr "" +"OpenList 出站请求使用的 HTTP、HTTPS、SOCKS4、SOCKS5 或 SOCKS5HOSTNAME 代理。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:276 +msgid "Auto memory limit (MB)" +msgstr "自动内存限制(MB)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:277 +msgid "0 disables the automatic memory limit. The upstream default is 4 MB." +msgstr "0 表示禁用自动内存限制。上游默认值为 4 MB。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:282 +msgid "Minimum free memory (MB)" +msgstr "最小可用内存(MB)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:283 +msgid "" +"Values below 16 let OpenList calculate a default; negative values disable " +"memory cache." +msgstr "低于 16 时由 OpenList 自动计算默认值;负数表示禁用内存缓存。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:288 +msgid "Maximum block size (MB)" +msgstr "最大块大小(MB)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:289 +msgid "Values below 4 let OpenList calculate a default." +msgstr "低于 4 时由 OpenList 自动计算默认值。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:294 +msgid "Max Connections" +msgstr "最大并发连接数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:295 +msgid "" +"0 is unlimited, It is recommend to set a low number of concurrency (10-20) " +"for poor performance device" +msgstr "默认 0 不限制,低性能设备建议设置较低的并发数(10-20)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:300 +msgid "Max concurrency of local proxies" +msgstr "本地代理最大并发数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:301 +msgid "" +"0 is unlimited, Limit the maximum concurrency of local agents. The default " +"value is 64" +msgstr "限制本地代理最大并发数,值为 0 表示不限制,默认值 64" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:306 +msgid "Disable TLS Verify" +msgstr "禁用 TLS 验证" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:307 +msgid "Skip remote TLS certificate verification (not recommended)." +msgstr "跳过远程 TLS 证书校验(不推荐)。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:312 +msgid "Enable Logs" +msgstr "启用日志" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:316 +msgid "Log path" +msgstr "日志文件路径" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:324 +msgid "Log path must be /var/log/openlist2* without subdirectories." +msgstr "日志路径必须为 /var/log/openlist2*,且不得包含子目录。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:327 +msgid "Max Size (MB)" +msgstr "日志文件大小(MB)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:333 +msgid "Max backups" +msgstr "日志备份数量" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:339 +msgid "Max age" +msgstr "日志保存天数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:345 +msgid "Log Compress" +msgstr "日志压缩" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:350 +msgid "Enable common log filters" +msgstr "启用常用日志过滤" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:351 +msgid "" +"Filter noisy access logs such as health checks, HEAD requests and WebDAV " +"PROPFIND." +msgstr "过滤健康检查、HEAD 请求和 WebDAV PROPFIND 等噪声访问日志。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:355 +msgid "Custom log filter CIDR" +msgstr "自定义日志过滤 CIDR" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:358 +msgid "Custom log filter path" +msgstr "自定义日志过滤路径" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:361 +msgid "Custom log filter method" +msgstr "自定义日志过滤方法" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:365 +msgid "Database Type" +msgstr "数据库类型" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:367 +msgid "SQLite" +msgstr "SQLite" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:368 +msgid "MySQL" +msgstr "MySQL" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:369 +msgid "PostgreSQL" +msgstr "PostgreSQL" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:371 +msgid "Database Host" +msgstr "主机" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:375 +msgid "Database Port" +msgstr "端口" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:376 +msgid "" +"Use 0 to apply the usual default for the selected database: 3306 for MySQL, " +"5432 for PostgreSQL." +msgstr "" +"使用 0 时会按所选数据库使用常见默认端口:MySQL 为 3306,PostgreSQL 为 5432。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:382 +msgid "Database Username" +msgstr "用户名" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:386 +msgid "Database Password" +msgstr "密码" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:390 +msgid "Database Name" +msgstr "数据库名" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:394 +msgid "Database Table Prefix" +msgstr "数据库表前缀" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:399 +msgid "Database SSL Mode" +msgstr "SSL模式" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:403 +msgid "Database DSN" +msgstr "DSN" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:407 +msgid "Meilisearch Host" +msgstr "Meilisearch 主机" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:411 +msgid "Meilisearch API Key" +msgstr "Meilisearch API 密钥" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:414 +msgid "Meilisearch Index" +msgstr "Meilisearch 索引" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:419 +msgid "Listen address" +msgstr "监听地址" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:424 +msgid "HTTP listen port" +msgstr "HTTP 监听端口" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:425 +msgid "The upstream default is 5244. Set to -1 to disable HTTP." +msgstr "上游默认值为 5244。设为 -1 可禁用 HTTP。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:434 +msgid "HTTPS listen port" +msgstr "HTTPS 监听端口" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:435 +msgid "" +"The upstream default is -1 (disabled). Set a valid port number to enable " +"HTTPS." +msgstr "上游默认值为 -1(禁用)。设为有效端口号可启用 HTTPS。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:444 +msgid "Force HTTPS" +msgstr "强制 HTTPS" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:447 +msgid "SSL cert" +msgstr "SSL 证书" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:448 +msgid "SSL certificate file path" +msgstr "SSL 证书文件路径" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:451 +msgid "SSL certificate file path is required when HTTPS is enabled." +msgstr "启用 HTTPS 时必须填写 SSL 证书文件路径。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:454 +msgid "SSL key" +msgstr "SSL 密钥" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:455 +msgid "SSL key file path" +msgstr "SSL 密钥文件路径" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:458 +msgid "SSL key file path is required when HTTPS is enabled." +msgstr "启用 HTTPS 时必须填写 SSL 密钥文件路径。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:461 +msgid "Unix socket file" +msgstr "Unix Socket 文件" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:463 +msgid "Unix socket permission" +msgstr "Unix Socket 权限" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:465 +msgid "Enable H2C" +msgstr "启用 H2C" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:466 +msgid "Enable cleartext HTTP/2 for reverse proxies that use grpc_pass." +msgstr "为使用 grpc_pass 的反向代理启用明文 HTTP/2。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:469 +msgid "Enable HTTP/3/QUIC" +msgstr "启用 HTTP/3/QUIC" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:470 +msgid "" +"Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled and " +"certificate files must be configured." +msgstr "" +"在 HTTPS 监听端口上启用基于 QUIC 的 HTTP/3。必须先启用 HTTPS 并配置证书文件。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:474 +msgid "Download Workers" +msgstr "下载任务线程数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:479 +msgid "Download Max Retry" +msgstr "下载任务重试次数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:484 +msgid "Download Task Persistence" +msgstr "下载任务持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:487 +msgid "Transfer Workers" +msgstr "中转任务线程数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:492 +msgid "Transfer Max Retry" +msgstr "中转任务下载重试次数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:497 +msgid "Transfer Task Persistence" +msgstr "中转任务持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:500 +msgid "Upload Workers" +msgstr "上传任务线程数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:505 +msgid "Upload Max Retry" +msgstr "上传任务重试次数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:510 +msgid "Upload Task Persistence" +msgstr "上传任务持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:513 +msgid "Copy Workers" +msgstr "复制任务线程数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:518 +msgid "Copy Max Retry" +msgstr "复制任务重试次数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:523 +msgid "Copy Task Persistence" +msgstr "复制任务持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:526 +msgid "Move Workers" +msgstr "移动任务线程数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:531 +msgid "Move Max Retry" +msgstr "移动任务重试次数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:536 +msgid "Move Task Persistence" +msgstr "移动任务持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:539 +msgid "Decompress Workers" +msgstr "解压任务线程数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:544 +msgid "Decompress Max Retry" +msgstr "解压任务重试次数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:549 +msgid "Decompress Task Persistence" +msgstr "解压任务持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:552 +msgid "Decompress Upload Workers" +msgstr "解压上传任务线程数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:557 +msgid "Decompress Upload Max Retry" +msgstr "解压上传任务重试次数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:562 +msgid "Decompress Upload Task Persistence" +msgstr "解压上传任务持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:565 +msgid "Allow retry canceled tasks" +msgstr "允许重试已取消的任务" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:569 +msgid "Allow Origins" +msgstr "允许来源(Origins)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:570 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:578 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:583 +msgid "Comma-separated list. Use * to allow any value." +msgstr "使用英文逗号分隔。使用 * 表示允许任意值。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:577 +msgid "Allow Methods" +msgstr "允许方法(Methods)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:582 +msgid "Allow Headers" +msgstr "允许标头(Headers)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:588 +msgid "Enabled S3" +msgstr "启用 S3" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:591 +msgid "Port" +msgstr "端口" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:596 +msgid "Enable SSL" +msgstr "启用 SSL" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:600 +msgid "Enabled FTP" +msgstr "启用 FTP" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:603 +msgid "FTP Port" +msgstr "FTP 端口" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:608 +msgid "Max retries on port conflict during passive transfer" +msgstr "被动传输端口冲突时最大重试次数" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:613 +msgid "Enable non-20 port for active transfer" +msgstr "启用非 20 端口进行主动传输" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:616 +msgid "Client idle timeout (seconds)" +msgstr "客户端空闲超时(秒)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:621 +msgid "Connection timeout (seconds)" +msgstr "连接超时(秒)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:626 +msgid "Disable active transfer mode" +msgstr "禁用主动传输模式" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:629 +msgid "Enable binary transfer mode" +msgstr "启用二进制传输模式" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:632 +msgid "Client IP check in active transfer mode" +msgstr "主动传输模式下对客户端进行 IP 检查" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:636 +msgid "Client IP check in passive transfer mode" +msgstr "被动传输模式下对客户端进行 IP 检查" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:641 +msgid "Enabled SFTP" +msgstr "启用 SFTP" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:644 +msgid "SFTP Port" +msgstr "SFTP 端口" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:20 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:29 +msgid "No log data." +msgstr "无日志数据。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:77 +msgid "Clear logs" +msgstr "清空日志" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:86 +#, javascript-format +msgid "Refresh every %s seconds." +msgstr "每 %s 秒刷新。" + +#~ msgid "Grant UCI access for luci-app-openlist2" +#~ msgstr "授予 luci-app-openlist2 的 UCI 访问权限" diff --git a/luci-app-openlist2/po/zh_Hant/openlist2.po b/luci-app-openlist2/po/zh_Hant/openlist2.po new file mode 100644 index 000000000..6497b69c7 --- /dev/null +++ b/luci-app-openlist2/po/zh_Hant/openlist2.po @@ -0,0 +1,634 @@ +msgid "" +msgstr "" +"Project-Id-Version: luci-app-openlist2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-27 09:57+0800\n" +"PO-Revision-Date: 2026-06-25 00:00+0800\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: zh_Hant\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:43 +msgid "RUNNING" +msgstr "執行中" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:43 +msgid "NOT RUNNING" +msgstr "未執行" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:51 +msgid "Open Web Interface" +msgstr "開啟 Web 介面" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:100 +msgid "Port must be -1 or a valid port number from 1 to 65535." +msgstr "埠必須為 -1,或 1 到 65535 之間的有效埠號。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:120 +msgid "Site URL must start with http:// or https:// and must not end with /." +msgstr "站點 URL 必須以 http:// 或 https:// 開頭,且末尾不能帶 /。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:132 +msgid "CORS origins must be * or include http:// or https://." +msgstr "CORS 來源必須為 *,或包含 http:// / https://。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:170 +msgid "Username:" +msgstr "使用者名稱:" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:170 +msgid "New Password:" +msgstr "新密碼:" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:170 +msgid "New password has been copied to clipboard." +msgstr "新密碼已複製到剪貼簿。" + +#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:3 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:183 +msgid "OpenList" +msgstr "OpenList" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:184 +msgid "A file list program that supports multiple storage." +msgstr "一款支援多種儲存的目錄檔案列表程式。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:185 +#, javascript-format +msgid "" +"Initial login username is \"%s\" and password is \"%s\". Change it " +"immediately after first login." +msgstr "初始登入使用者名稱為「%s」,密碼為「%s」。首次登入後請立即修改。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:201 +msgid "Collecting data..." +msgstr "收集資料..." + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:207 +msgid "Basic Settings" +msgstr "基本設定" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:208 +msgid "Global Settings" +msgstr "全域性設定" + +#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:13 +msgid "Setting" +msgstr "設定" + +#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:21 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:209 +msgid "Logs" +msgstr "日誌" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:210 +msgid "Database" +msgstr "資料庫" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:211 +msgid "Search" +msgstr "搜尋" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:212 +msgid "Web Protocol" +msgstr "Web 協議" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:213 +msgid "Task threads" +msgstr "任務執行緒" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:214 +msgid "CORS Settings" +msgstr "跨域設定" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:215 +msgid "Object Storage" +msgstr "物件儲存" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:216 +msgid "FTP" +msgstr "FTP" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:217 +msgid "SFTP" +msgstr "SFTP" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:220 +msgid "Enabled" +msgstr "啟用" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:224 +msgid "Debug logging" +msgstr "偵錯日誌" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:225 +msgid "Pass --debug to OpenList and send stderr to procd logs." +msgstr "向 OpenList 傳遞 --debug,並將 stderr 傳送到 procd 日誌。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:228 +msgid "Delayed Start (seconds)" +msgstr "開機延時啟動(秒)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:233 +msgid "Open firewall port" +msgstr "開啟防火牆埠" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:236 +msgid "Data directory" +msgstr "資料目錄" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:239 +msgid "Cache directory" +msgstr "快取目錄" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:243 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:245 +msgid "Reset Password" +msgstr "重置密碼" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:244 +msgid "Generate a new random password." +msgstr "隨機生成一個新密碼。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:250 +msgid "Force read config" +msgstr "強制讀取配置" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:251 +msgid "" +"Setting this to true will force the program to read the configuration file, " +"ignoring environment variables." +msgstr "將此設定為 true 可以強制程式讀取配置檔案,而忽略環境變數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:255 +msgid "Site URL" +msgstr "站點地址" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:256 +msgid "" +"When the web is reverse proxied to a subdirectory, this option must be " +"filled out to ensure proper functioning of the web. Do not include '/' at " +"the end of the URL" +msgstr "" +"Web 被反向代理到二級目錄時,必須填寫該選項以確保 Web 正常工作。URL 結尾請勿攜" +"帶 '/'" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:261 +msgid "CDN URL" +msgstr "CDN 地址" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:264 +msgid "JWT Key" +msgstr "JWT 金鑰" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:267 +msgid "Login Validity Period (hours)" +msgstr "登入有效期(小時)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:272 +msgid "Proxy address" +msgstr "代理地址" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:273 +msgid "" +"HTTP, HTTPS, SOCKS4, SOCKS5 or SOCKS5HOSTNAME proxy used by OpenList " +"outbound requests." +msgstr "" +"OpenList 出站請求使用的 HTTP、HTTPS、SOCKS4、SOCKS5 或 SOCKS5HOSTNAME 代理。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:276 +msgid "Auto memory limit (MB)" +msgstr "自動記憶體限制(MB)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:277 +msgid "0 disables the automatic memory limit. The upstream default is 4 MB." +msgstr "0 表示停用自動記憶體限制。上游預設值為 4 MB。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:282 +msgid "Minimum free memory (MB)" +msgstr "最小可用記憶體(MB)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:283 +msgid "" +"Values below 16 let OpenList calculate a default; negative values disable " +"memory cache." +msgstr "低於 16 時由 OpenList 自動計算預設值;負數表示停用記憶體快取。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:288 +msgid "Maximum block size (MB)" +msgstr "最大區塊大小(MB)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:289 +msgid "Values below 4 let OpenList calculate a default." +msgstr "低於 4 時由 OpenList 自動計算預設值。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:294 +msgid "Max Connections" +msgstr "最大併發連線數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:295 +msgid "" +"0 is unlimited, It is recommend to set a low number of concurrency (10-20) " +"for poor performance device" +msgstr "預設 0 不限制,低效能裝置建議設定較低的併發數(10-20)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:300 +msgid "Max concurrency of local proxies" +msgstr "本地代理最大併發數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:301 +msgid "" +"0 is unlimited, Limit the maximum concurrency of local agents. The default " +"value is 64" +msgstr "限制本地代理最大併發數,值為 0 表示不限制,預設值 64" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:306 +msgid "Disable TLS Verify" +msgstr "停用 TLS 驗證" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:307 +msgid "Skip remote TLS certificate verification (not recommended)." +msgstr "跳過遠端 TLS 憑證驗證(不建議)。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:312 +msgid "Enable Logs" +msgstr "啟用日誌" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:316 +msgid "Log path" +msgstr "日誌檔案路徑" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:324 +msgid "Log path must be /var/log/openlist2* without subdirectories." +msgstr "日誌路徑必須為 /var/log/openlist2*,且不得包含子目錄。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:327 +msgid "Max Size (MB)" +msgstr "日誌檔案大小(MB)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:333 +msgid "Max backups" +msgstr "日誌備份數量" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:339 +msgid "Max age" +msgstr "日誌儲存天數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:345 +msgid "Log Compress" +msgstr "日誌壓縮" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:350 +msgid "Enable common log filters" +msgstr "啟用常用日誌過濾" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:351 +msgid "" +"Filter noisy access logs such as health checks, HEAD requests and WebDAV " +"PROPFIND." +msgstr "過濾健康檢查、HEAD 請求和 WebDAV PROPFIND 等噪聲存取日誌。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:355 +msgid "Custom log filter CIDR" +msgstr "自訂日誌過濾 CIDR" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:358 +msgid "Custom log filter path" +msgstr "自訂日誌過濾路徑" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:361 +msgid "Custom log filter method" +msgstr "自訂日誌過濾方法" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:365 +msgid "Database Type" +msgstr "資料庫型別" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:367 +msgid "SQLite" +msgstr "SQLite" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:368 +msgid "MySQL" +msgstr "MySQL" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:369 +msgid "PostgreSQL" +msgstr "PostgreSQL" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:371 +msgid "Database Host" +msgstr "主機" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:375 +msgid "Database Port" +msgstr "埠" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:376 +msgid "" +"Use 0 to apply the usual default for the selected database: 3306 for MySQL, " +"5432 for PostgreSQL." +msgstr "" +"使用 0 時會依所選資料庫使用常見預設連接埠:MySQL 為 3306,PostgreSQL 為 " +"5432。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:382 +msgid "Database Username" +msgstr "使用者名稱" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:386 +msgid "Database Password" +msgstr "密碼" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:390 +msgid "Database Name" +msgstr "資料庫名" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:394 +msgid "Database Table Prefix" +msgstr "資料庫表字首" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:399 +msgid "Database SSL Mode" +msgstr "SSL模式" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:403 +msgid "Database DSN" +msgstr "DSN" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:407 +msgid "Meilisearch Host" +msgstr "Meilisearch 主機" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:411 +msgid "Meilisearch API Key" +msgstr "Meilisearch API 金鑰" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:414 +msgid "Meilisearch Index" +msgstr "Meilisearch 索引" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:419 +msgid "Listen address" +msgstr "監聽地址" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:424 +msgid "HTTP listen port" +msgstr "HTTP 監聽埠" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:425 +msgid "The upstream default is 5244. Set to -1 to disable HTTP." +msgstr "上游預設值為 5244。設為 -1 可停用 HTTP。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:434 +msgid "HTTPS listen port" +msgstr "HTTPS 監聽埠" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:435 +msgid "" +"The upstream default is -1 (disabled). Set a valid port number to enable " +"HTTPS." +msgstr "上游預設值為 -1(停用)。設為有效埠號可啟用 HTTPS。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:444 +msgid "Force HTTPS" +msgstr "強制 HTTPS" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:447 +msgid "SSL cert" +msgstr "SSL 證書" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:448 +msgid "SSL certificate file path" +msgstr "SSL 證書檔案路徑" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:451 +msgid "SSL certificate file path is required when HTTPS is enabled." +msgstr "啟用 HTTPS 時必須填寫 SSL 證書檔案路徑。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:454 +msgid "SSL key" +msgstr "SSL 金鑰" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:455 +msgid "SSL key file path" +msgstr "SSL 金鑰檔案路徑" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:458 +msgid "SSL key file path is required when HTTPS is enabled." +msgstr "啟用 HTTPS 時必須填寫 SSL 金鑰檔案路徑。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:461 +msgid "Unix socket file" +msgstr "Unix Socket 檔案" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:463 +msgid "Unix socket permission" +msgstr "Unix Socket 權限" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:465 +msgid "Enable H2C" +msgstr "啟用 H2C" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:466 +msgid "Enable cleartext HTTP/2 for reverse proxies that use grpc_pass." +msgstr "為使用 grpc_pass 的反向代理啟用明文 HTTP/2。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:469 +msgid "Enable HTTP/3/QUIC" +msgstr "啟用 HTTP/3/QUIC" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:470 +msgid "" +"Enable HTTP/3 over QUIC on the HTTPS listen port. HTTPS must be enabled and " +"certificate files must be configured." +msgstr "" +"在 HTTPS 監聽連接埠上啟用基於 QUIC 的 HTTP/3。必須先啟用 HTTPS 並配置憑證檔" +"案。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:474 +msgid "Download Workers" +msgstr "下載任務執行緒數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:479 +msgid "Download Max Retry" +msgstr "下載任務重試次數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:484 +msgid "Download Task Persistence" +msgstr "下載任務持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:487 +msgid "Transfer Workers" +msgstr "中轉任務執行緒數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:492 +msgid "Transfer Max Retry" +msgstr "中轉任務下載重試次數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:497 +msgid "Transfer Task Persistence" +msgstr "中轉任務持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:500 +msgid "Upload Workers" +msgstr "上傳任務執行緒數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:505 +msgid "Upload Max Retry" +msgstr "上傳任務重試次數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:510 +msgid "Upload Task Persistence" +msgstr "上傳任務持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:513 +msgid "Copy Workers" +msgstr "複製任務執行緒數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:518 +msgid "Copy Max Retry" +msgstr "複製任務重試次數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:523 +msgid "Copy Task Persistence" +msgstr "複製任務持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:526 +msgid "Move Workers" +msgstr "移動任務執行緒數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:531 +msgid "Move Max Retry" +msgstr "移動任務重試次數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:536 +msgid "Move Task Persistence" +msgstr "移動任務持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:539 +msgid "Decompress Workers" +msgstr "解壓縮任務執行緒數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:544 +msgid "Decompress Max Retry" +msgstr "解壓縮任務重試次數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:549 +msgid "Decompress Task Persistence" +msgstr "解壓縮任務持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:552 +msgid "Decompress Upload Workers" +msgstr "解壓縮上傳任務執行緒數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:557 +msgid "Decompress Upload Max Retry" +msgstr "解壓縮上傳任務重試次數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:562 +msgid "Decompress Upload Task Persistence" +msgstr "解壓縮上傳任務持久化" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:565 +msgid "Allow retry canceled tasks" +msgstr "允許重試已取消的任務" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:569 +msgid "Allow Origins" +msgstr "允許來源(Origins)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:570 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:578 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:583 +msgid "Comma-separated list. Use * to allow any value." +msgstr "使用英文逗號分隔。使用 * 表示允許任意值。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:577 +msgid "Allow Methods" +msgstr "允許方法(Methods)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:582 +msgid "Allow Headers" +msgstr "允許標頭(Headers)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:588 +msgid "Enabled S3" +msgstr "啟用 S3" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:591 +msgid "Port" +msgstr "埠" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:596 +msgid "Enable SSL" +msgstr "啟用 SSL" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:600 +msgid "Enabled FTP" +msgstr "啟用 FTP" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:603 +msgid "FTP Port" +msgstr "FTP 埠" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:608 +msgid "Max retries on port conflict during passive transfer" +msgstr "被動傳輸埠衝突時最大重試次數" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:613 +msgid "Enable non-20 port for active transfer" +msgstr "啟用非 20 埠進行主動傳輸" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:616 +msgid "Client idle timeout (seconds)" +msgstr "客戶端空閒超時(秒)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:621 +msgid "Connection timeout (seconds)" +msgstr "連線超時(秒)" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:626 +msgid "Disable active transfer mode" +msgstr "停用主動傳輸模式" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:629 +msgid "Enable binary transfer mode" +msgstr "啟用二進位制傳輸模式" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:632 +msgid "Client IP check in active transfer mode" +msgstr "主動傳輸模式下對客戶端進行 IP 檢查" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:636 +msgid "Client IP check in passive transfer mode" +msgstr "被動傳輸模式下對客戶端進行 IP 檢查" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:641 +msgid "Enabled SFTP" +msgstr "啟用 SFTP" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:644 +msgid "SFTP Port" +msgstr "SFTP 埠" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:20 +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:29 +msgid "No log data." +msgstr "無日誌資料。" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:77 +msgid "Clear logs" +msgstr "清空日誌" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:86 +#, javascript-format +msgid "Refresh every %s seconds." +msgstr "每 %s 秒重新整理。" + +#~ msgid "Grant UCI access for luci-app-openlist2" +#~ msgstr "授予 luci-app-openlist2 的 UCI 訪問許可權" diff --git a/luci-app-openlist2/root/usr/share/rpcd/acl.d/luci-app-openlist2.json b/luci-app-openlist2/root/usr/share/rpcd/acl.d/luci-app-openlist2.json index 429ded7fb..cc92f5e4a 100644 --- a/luci-app-openlist2/root/usr/share/rpcd/acl.d/luci-app-openlist2.json +++ b/luci-app-openlist2/root/usr/share/rpcd/acl.d/luci-app-openlist2.json @@ -4,7 +4,8 @@ "read": { "file": { "/usr/bin/openlist2": [ "exec" ], - "/*": [ "read" ] + "/var/log/openlist2.log": [ "read" ], + "/var/log/openlist2*": [ "read" ] }, "ubus": { "service": [ "list" ] @@ -13,7 +14,8 @@ }, "write": { "file": { - "/*": [ "write" ] + "/var/log/openlist2.log": [ "write" ], + "/var/log/openlist2*": [ "write" ] }, "uci": [ "openlist2" ] } diff --git a/luci-app-passwall/Makefile b/luci-app-passwall/Makefile index a2410b078..6a16ef478 100644 --- a/luci-app-passwall/Makefile +++ b/luci-app-passwall/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=26.7.16 -PKG_RELEASE:=191 +PKG_RELEASE:=192 PKG_PO_VERSION:=$(PKG_VERSION) PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/hysteria2.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/hysteria2.lua index d57f6f124..f6af739d9 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/hysteria2.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/hysteria2.lua @@ -112,10 +112,12 @@ o.rewrite_option = o.option o = s:option(Value, _n("recv_window_conn"), translate("QUIC connection receive window")) o.rewrite_option = o.option -o = s:option(Value, _n("idle_timeout"), translate("Idle Timeout"), translate("Example:") .. "30s (4s~120s)") +o = s:option(Value, _n("idle_timeout"), translate("Idle Timeout"), translate("Units:seconds") .. " (4~120)") +o.datatype = "range(4,120)" o.rewrite_option = o.option -o = s:option(Value, _n("keep_alive_period"), translate("QUIC KeepAlive interval"), translate("Example:") .. "10s (2s~60s)") +o = s:option(Value, _n("keep_alive_period"), translate("QUIC KeepAlive interval"), translate("Units:seconds") .. " (2~60)") +o.datatype = "range(2,60)" o.rewrite_option = o.option o = s:option(Flag, _n("disable_mtu_discovery"), translate("Disable MTU detection")) diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua index cb8e92ec8..d45ae3c0d 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua @@ -395,10 +395,12 @@ o:depends({ [_n("protocol")] = "hysteria2" }) o = s:option(Value, _n("hysteria2_down_mbps"), translate("Max download Mbps")) o:depends({ [_n("protocol")] = "hysteria2" }) -o = s:option(Value, _n("hysteria2_idle_timeout"), translate("Idle Timeout"), translate("Example:") .. "30s (4s~120s)") +o = s:option(Value, _n("hysteria2_idle_timeout"), translate("Idle Timeout"), translate("Units:seconds") .. " (4~120)") +o.datatype = "range(4,120)" o:depends({ [_n("protocol")] = "hysteria2"}) -o = s:option(Value, _n("hysteria2_keep_alive_period"), translate("QUIC KeepAlive interval"), translate("Example:") .. "10s (2s~60s)") +o = s:option(Value, _n("hysteria2_keep_alive_period"), translate("QUIC KeepAlive interval"), translate("Units:seconds") .. " (2~60)") +o.datatype = "range(2,60)" o:depends({ [_n("protocol")] = "hysteria2"}) o = s:option(Flag, _n("hysteria2_disable_mtu_discovery"), translate("Disable MTU detection")) diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua index 41b285c0d..3a2bdfe8c 100644 --- a/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua +++ b/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua @@ -419,10 +419,12 @@ if singbox_tags:find("with_quic") then o = s:option(Value, _n("hysteria2_down_mbps"), translate("Max download Mbps")) o:depends({ [_n("protocol")] = "hysteria2" }) - o = s:option(Value, _n("hysteria2_idle_timeout"), translate("Idle Timeout"), translate("Example:") .. "30s (4s~120s)") + o = s:option(Value, _n("hysteria2_idle_timeout"), translate("Idle Timeout"), translate("Units:seconds") .. " (4~120)") + o.datatype = "range(4,120)" o:depends({ [_n("protocol")] = "hysteria2"}) - o = s:option(Value, _n("hysteria2_keep_alive_period"), translate("QUIC KeepAlive interval"), translate("Example:") .. "10s (2s~60s)") + o = s:option(Value, _n("hysteria2_keep_alive_period"), translate("QUIC KeepAlive interval"), translate("Units:seconds") .. " (2~60)") + o.datatype = "range(2,60)" o:depends({ [_n("protocol")] = "hysteria2"}) o = s:option(Flag, _n("hysteria2_disable_mtu_discovery"), translate("Disable MTU detection")) diff --git a/luci-app-passwall/root/usr/share/passwall/clash_subconverter.lua b/luci-app-passwall/root/usr/share/passwall/clash_subconverter.lua index 965f0486c..bee9e131e 100644 --- a/luci-app-passwall/root/usr/share/passwall/clash_subconverter.lua +++ b/luci-app-passwall/root/usr/share/passwall/clash_subconverter.lua @@ -244,7 +244,7 @@ local function encode_vless(node) link = link .. "?" .. table.concat(p, "&") end - return link .. "#" .. urlencode(o.name or "") + return 0, link .. "#" .. urlencode(o.name or "") end -- Trojan @@ -273,7 +273,7 @@ local function encode_trojan(node) link = link .. "?" .. table.concat(p, "&") end - return link .. "#" .. urlencode(o.name or "") + return 0, link .. "#" .. urlencode(o.name or "") end -- VMess @@ -307,11 +307,19 @@ local function encode_vmess(node) obj.path = o.transport.serviceName or "" end - return "vmess://" .. base64(json.stringify(obj)) + return 0, "vmess://" .. base64(json.stringify(obj)) end -- SS local function encode_ss(node) + local ss_method = { + ["none"]=1, ["aes-128-gcm"]=1, ["aes-192-gcm"]=1, ["aes-256-gcm"]=1, ["chacha20-ietf-poly1305"]=1, ["xchacha20-ietf-poly1305"]=1, ["2022-blake3-aes-128-gcm"]=1, ["2022-blake3-aes-256-gcm"]=1, ["2022-blake3-chacha20-poly1305"]=1, + ["aes-128-ctr"]=1, ["aes-192-ctr"]=1, ["aes-256-ctr"]=1, ["aes-128-cfb"]=1, ["aes-192-cfb"]=1, ["aes-256-cfb"]=1, ["rc4-md5"]=1, ["chacha20-ietf"]=1, ["xchacha20"]=1, + } + if not ss_method[node.cipher or ""] then + return 1, "订阅转换 → 丢弃 SS 节点:" .. (node.name or "") .. ",因 Core 不支持 " .. (node.cipher or "") .. " 加密方式" + end + local userinfo = node.cipher .. ":" .. node.password local base = userinfo .. "@" .. host_format(node.server) .. ":" .. node.port local link = "ss://" .. base64(base) @@ -326,7 +334,7 @@ local function encode_ss(node) if plugin == "shadow-tls" then local shadow_tls = base64(json.stringify(node["plugin-opts"] or {})) table.insert(p, "shadow-tls=" .. urlencode(shadow_tls)) - else + elseif plugin == "obfs-local" or plugin == "v2ray-plugin" then local opts = {} for k, v in pairs(node["plugin-opts"] or {}) do if plugin == "obfs-local" then @@ -341,10 +349,6 @@ local function encode_ss(node) end v = nil end - elseif plugin == "gost-plugin" then - if k == "mode" and v == "websocket" then v = "ws" end - if k == "host" then k = "serverName" end - if k == "headers" then v = nil end end if v ~= nil then if type(v) == "boolean" then @@ -355,6 +359,8 @@ local function encode_ss(node) end if #opts > 0 then plugin = plugin .. ";" .. table.concat(opts, ";") end table.insert(p, "plugin=" .. urlencode(plugin)) + else + return 1, "订阅转换 → 丢弃 SS 节点:" .. (node.name or "") .. ",因 Core 不支持 " .. plugin .. " 插件" end end @@ -362,7 +368,7 @@ local function encode_ss(node) link = link .. "?" .. table.concat(p, "&") end - return link .. "#" .. urlencode(node.name or "") + return 0, link .. "#" .. urlencode(node.name or "") end -- Hysteria @@ -387,7 +393,7 @@ local function encode_hysteria2(node) link = link .. "?" .. table.concat(p, "&") end - return link .. "#" .. urlencode(node.name or "") + return 0, link .. "#" .. urlencode(node.name or "") end -- Hysteria2 @@ -411,7 +417,7 @@ local function encode_hysteria2(node) link = link .. "?" .. table.concat(p, "&") end - return link .. "#" .. urlencode(node.name or "") + return 0, link .. "#" .. urlencode(node.name or "") end -- TUIC @@ -436,11 +442,24 @@ local function encode_tuic(node) link = link .. "?" .. table.concat(p, "&") end - return link .. "#" .. urlencode(node.name or "") + return 0, link .. "#" .. urlencode(node.name or "") end -- AnyTLS local function encode_anytls(node) + local err_msg + if node["shadow-tls-opts"] then + err_msg = "ShadowTLS" + elseif node["restls-opts"] then + err_msg = "ResTLS" + elseif node["jls-opts"] then + err_msg = "JLS" + end + if err_msg then + err_msg = "订阅转换 → 丢弃 AnyTLS 节点:" .. (node.name or "") .. ",因 Sing-Box 不支持 AnyTLS + " .. err_msg + return 1, err_msg + end + local o = build_common(node) local link = "anytls://" .. (node.password or "") .. "@" .. host_format(node.server) .. ":" .. node.port @@ -465,7 +484,7 @@ local function encode_anytls(node) link = link .. "?" .. table.concat(p, "&") end - return link .. "#" .. urlencode(node.name or "") + return 0, link .. "#" .. urlencode(node.name or "") end -- SSR @@ -482,7 +501,7 @@ local function encode_ssr(node) link = link .. "?" .. table.concat(p, "&") end - return "ssr://" .. base64(link) + return 0, "ssr://" .. base64(link) end local function encode_node(node) @@ -516,8 +535,10 @@ function parseClashNode(raw, remark) local links = {} for _, node in ipairs(data.proxies) do - local link = encode_node(node) - if link then + local err, link = encode_node(node) + if err == 1 and link then + api.log(link) + elseif link then table.insert(links, link) end end diff --git a/luci-theme-alpha/Makefile b/luci-theme-alpha/Makefile index bb934c470..0487f73b4 100644 --- a/luci-theme-alpha/Makefile +++ b/luci-theme-alpha/Makefile @@ -11,7 +11,7 @@ THEME_TITLE:=Alpha PKG_NAME:=luci-theme-$(THEME_NAME) PKG_VERSION:=3.9.7_beta2 -PKG_RELEASE:=5 +PKG_RELEASE:=6 include $(INCLUDE_DIR)/package.mk diff --git a/luci-theme-alpha/README.md b/luci-theme-alpha/README.md index cb09ffede..49496fe59 100644 --- a/luci-theme-alpha/README.md +++ b/luci-theme-alpha/README.md @@ -8,8 +8,8 @@ [discord-badge]: https://img.shields.io/badge/visit_Discord-Comunity-blue [paypal]: https://www.paypal.com/paypalme/derisamedia [paypal-badge]: https://img.shields.io/badge/Donate-Paypal_me-blue -[new-release]: https://github.com/derisamedia/luci-theme-alpha-reborn -[new-release-badge]: https://img.shields.io/badge/New_Release-AlphaOS_Reborn_v4-red +[new-release]: https://github.com/derisamedia/luci-theme-Arwi +[new-release-badge]: https://img.shields.io/badge/New_Release-luci_theme_Arwi-red diff --git a/openlist2/Makefile b/openlist2/Makefile index 50f152ce4..e545e21db 100644 --- a/openlist2/Makefile +++ b/openlist2/Makefile @@ -1,7 +1,7 @@ # # Copyright (C) 2015-2016 OpenWrt.org # -# This is free software, licensed under the GNU General Public License v3. +# This is free software, licensed under the GNU Affero General Public License v3. # include $(TOPDIR)/rules.mk @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=openlist2 PKG_VERSION:=4.2.3 PKG_WEB_VERSION:=4.2.3 -PKG_RELEASE:=8 +PKG_RELEASE:=9 PKG_SOURCE:=openlist-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/OpenListTeam/OpenList/tar.gz/v$(PKG_VERSION)? @@ -17,29 +17,31 @@ PKG_HASH:=skip PKG_BUILD_DIR:=$(BUILD_DIR)/OpenList-$(PKG_VERSION) -PKG_LICENSE:=GPL-3.0 -PKG_LICENSE_FILE:=LICENSE +PKG_LICENSE:=AGPL-3.0-only +PKG_LICENSE_FILES:=LICENSE PKG_MAINTAINER:=sbwml +PKG_CPE_ID:=cpe:/a:oplist:openlist define Download/openlist-frontend - FILE:=openlist-frontend-dist-lite-v$(PKG_WEB_VERSION).tar.gz + FILE:=openlist-frontend-dist-v$(PKG_WEB_VERSION).tar.gz URL:=https://github.com/OpenListTeam/OpenList-Frontend/releases/download/v$(PKG_WEB_VERSION)/ HASH:=skip endef -PKG_BUILD_DEPENDS:=golang/host +PKG_BUILD_DEPENDS:=golang/host fuse PKG_BUILD_PARALLEL:=1 PKG_USE_MIPS16:=0 PKG_BUILD_FLAGS:=no-mips16 -GO_PKG:=github.com/OpenListTeam/OpenList +GO_PKG:=github.com/OpenListTeam/OpenList/v4 GO_PKG_LDFLAGS:= \ - -X '$(GO_PKG)/v4/internal/conf.BuiltAt=$(shell date '+%Y-%m-%d %H:%M:%S %z')' \ - -X '$(GO_PKG)/v4/internal/conf.GoVersion=$(shell $(STAGING_DIR_HOSTPKG)/bin/go version | sed 's/go version //')' \ - -X '$(GO_PKG)/v4/internal/conf.GitAuthor=The OpenList Projects Contributors ' \ - -X '$(GO_PKG)/v4/internal/conf.GitCommit=tarball/$(shell echo $(PKG_HASH) | cut -c 1-7)' \ - -X '$(GO_PKG)/v4/internal/conf.Version=v$(PKG_VERSION) (OpenWrt $(ARCH_PACKAGES))' \ - -X '$(GO_PKG)/v4/internal/conf.WebVersion=v$(PKG_WEB_VERSION)' + -s -w \ + -X '$(GO_PKG)/internal/conf.BuiltAt=$(shell date '+%Y-%m-%d %H:%M:%S %z')' \ + -X '$(GO_PKG)/internal/conf.GoVersion=$(shell $(STAGING_DIR_HOSTPKG)/bin/go version | sed 's/go version //')' \ + -X '$(GO_PKG)/internal/conf.GitAuthor=The OpenList Projects Contributors ' \ + -X '$(GO_PKG)/internal/conf.GitCommit=tarball/$(shell echo $(PKG_HASH) | cut -c 1-7)' \ + -X '$(GO_PKG)/internal/conf.Version=v$(PKG_VERSION) (OpenWrt $(ARCH_PACKAGES))' \ + -X '$(GO_PKG)/internal/conf.WebVersion=v$(PKG_WEB_VERSION)' ifneq ($(CONFIG_ARCH_64BIT),y) GO_PKG_EXCLUDES:=drivers/lark endif @@ -52,12 +54,12 @@ define Package/openlist2 CATEGORY:=Network SUBMENU:=Web Servers/Proxies TITLE:=A file list program that supports multiple storage - URL:=https://openlist.team/ + URL:=https://doc.oplist.org/ DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle endef define Package/openlist2/conffiles -/etc/openlist2 +/etc/openlist2/ /etc/config/openlist2 endef @@ -79,9 +81,11 @@ endif define Build/Prepare $(call Build/Prepare/Default) - $(TAR) --strip-components=1 -C $(PKG_BUILD_DIR)/public/dist -xzf $(DL_DIR)/openlist-frontend-dist-lite-v$(PKG_WEB_VERSION).tar.gz + mkdir -p $(PKG_BUILD_DIR)/public/dist + $(TAR) --strip-components=1 -C $(PKG_BUILD_DIR)/public/dist -xzf $(DL_DIR)/openlist-frontend-dist-v$(PKG_WEB_VERSION).tar.gz $(SED) 's_https://res.oplist.org/logo_/assets_g' $(PKG_BUILD_DIR)/public/dist/index.html $(SED) 's_https://res.oplist.org/logo_/assets_g' $(PKG_BUILD_DIR)/public/dist/static/manifest.json + find $(PKG_BUILD_DIR)/public/dist/assets -type f -name '*.js' -exec $(SED) 's_https://res.oplist.org/logo_/assets_g' {} + endef define Package/openlist2/install diff --git a/openlist2/files/openlist2.config b/openlist2/files/openlist2.config index b5c73f1c8..8968b214a 100644 --- a/openlist2/files/openlist2.config +++ b/openlist2/files/openlist2.config @@ -1,32 +1,78 @@ config openlist2 option enabled '0' - option port '5244' + option debug '0' option delayed_start '0' option allow_wan '0' option force '1' option token_expires_in '48' + option proxy_address '' + option auto_memory_limit '4' + option min_free_memory '0' + option max_block_limit '0' option max_connections '0' - option tls_insecure_skip_verify '1' + option max_concurrency '64' + option tls_insecure_skip_verify '0' option data_dir '/etc/openlist2' option temp_dir '/tmp/openlist2' option log '1' - option log_max_size '10' - option log_max_backups '5' + option log_path '/var/log/openlist2.log' + option log_max_size '50' + option log_max_backups '30' option log_max_age '28' option log_compress '0' + option log_filter '0' + option log_filter_cidr '' + option log_filter_path '' + option log_filter_method '' option database_type 'sqlite3' - option ssl '0' + option meilisearch_host 'http://localhost:7700' + option meilisearch_api_key '' + option meilisearch_index 'openlist' + option listen_addr '0.0.0.0' + option listen_http_port '5244' + option listen_https_port '-1' + option listen_unix_file '' + option listen_unix_file_perm '' + option listen_enable_h2c '0' + option listen_enable_h3 '0' option download_workers '5' option download_max_retry '1' + option download_task_persistant '0' option transfer_workers '5' option transfer_max_retry '2' + option transfer_task_persistant '0' option upload_workers '5' option upload_max_retry '0' + option upload_task_persistant '0' option copy_workers '5' option copy_max_retry '2' + option copy_task_persistant '0' + option move_workers '5' + option move_max_retry '2' + option move_task_persistant '0' + option decompress_workers '5' + option decompress_max_retry '2' + option decompress_task_persistant '0' + option decompress_upload_workers '5' + option decompress_upload_max_retry '2' + option decompress_upload_task_persistant '0' + option allow_retry_canceled '0' option cors_allow_origins '*' option cors_allow_methods '*' option cors_allow_headers '*' option s3 '0' - + option s3_port '5246' + option s3_ssl '0' + option ftp '0' + option ftp_port '5221' + option find_pasv_port_attempts '50' + option active_transfer_port_non_20 '0' + option idle_timeout '900' + option connection_timeout '30' + option disable_active_mode '0' + option default_transfer_binary '0' + option enable_active_conn_ip_check '1' + option enable_pasv_conn_ip_check '1' + option sftp '0' + option sftp_port '5222' diff --git a/openlist2/files/openlist2.init b/openlist2/files/openlist2.init index 471090f00..0984813ff 100755 --- a/openlist2/files/openlist2.init +++ b/openlist2/files/openlist2.init @@ -6,104 +6,233 @@ START=99 USE_PROCD=1 PROG=/usr/bin/openlist2 -get_config() { - config_get_bool enabled $1 enabled 1 - config_get port $1 port 5244 - config_get allow_wan $1 allow_wan 0 - config_get delayed_start $1 delayed_start 0 +is_safe_log_path() { + local path="$1" + local base="${path##*/}" - config_get force $1 force 1 - config_get site_url $1 site_url "" - config_get cdn $1 cdn "" - config_get jwt_secret $1 jwt_secret "" - config_get data_dir $1 data_dir "/etc/openlist2" - config_get temp_dir $1 temp_dir "/tmp/openlist2" - config_get token_expires_in $1 token_expires_in 48 - config_get max_connections $1 max_connections 0 - config_get max_concurrency $1 max_concurrency 64 - config_get tls_insecure_skip_verify $1 tls_insecure_skip_verify 1 + case "$path" in + /var/log/*) ;; + *) return 1 ;; + esac + + [ "$path" = "/var/log/$base" ] || return 1 + + printf '%s\n' "$base" | grep -Eq '^openlist2([._-][A-Za-z0-9._-]+)?$' +} + +append_dest_port() { + local value="$1" + + [ -n "$value" ] && [ "$value" != "-1" ] || return 0 + dest_ports="${dest_ports:+$dest_ports }$value" +} + +json_add_filter_object() { + json_add_object "" + json_add_string "cidr" "$1" + json_add_string "path" "$2" + json_add_string "method" "$3" + json_close_object +} + +json_add_csv_array() { + local name="$1" + local values="$2" + local oldifs="$IFS" + local noglob_set=0 + local item + local count=0 + + json_add_array "$name" + case "$-" in + *f*) noglob_set=1 ;; + *) set -f ;; + esac + IFS=',' + for item in $values; do + IFS="$oldifs" + item="$(printf '%s' "$item" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')" + IFS=',' + if [ -n "$item" ]; then + json_add_string "" "$item" + count=$((count + 1)) + fi + done + IFS="$oldifs" + [ "$noglob_set" = "1" ] || set +f + [ "$count" -eq 0 ] && json_add_string "" "*" + json_close_array +} + +get_config() { + uci_changed=0 + + config_get_bool enabled "$1" enabled 1 + config_get debug "$1" debug 0 + config_get allow_wan "$1" allow_wan 0 + config_get delayed_start "$1" delayed_start 0 + + config_get force "$1" force 1 + config_get site_url "$1" site_url "" + config_get cdn "$1" cdn "" + config_get jwt_secret "$1" jwt_secret "" + config_get data_dir "$1" data_dir "/etc/openlist2" + config_get temp_dir "$1" temp_dir "/tmp/openlist2" + config_get token_expires_in "$1" token_expires_in 48 + config_get proxy_address "$1" proxy_address "" + config_get auto_memory_limit "$1" auto_memory_limit 4 + config_get min_free_memory "$1" min_free_memory 0 + config_get max_block_limit "$1" max_block_limit 0 + config_get max_connections "$1" max_connections 0 + config_get max_concurrency "$1" max_concurrency 64 + config_get tls_insecure_skip_verify "$1" tls_insecure_skip_verify 0 # log - config_get log $1 log 1 - config_get log_path $1 log_path '/var/log/openlist2.log' - config_get log_max_size $1 log_max_size 10 - config_get log_max_backups $1 log_max_backups 5 - config_get log_max_age $1 log_max_age 28 - config_get log_compress $1 log_compress 0 + config_get log "$1" log 1 + config_get log_path "$1" log_path '/var/log/openlist2.log' + if ! is_safe_log_path "$log_path"; then + log_path='/var/log/openlist2.log' + uci -q set openlist2.@openlist2[0].log_path="$log_path" + uci_changed=1 + fi + config_get log_max_size "$1" log_max_size 50 + config_get log_max_backups "$1" log_max_backups 30 + config_get log_max_age "$1" log_max_age 28 + config_get log_compress "$1" log_compress 0 + config_get log_filter "$1" log_filter 0 + config_get log_filter_cidr "$1" log_filter_cidr "" + config_get log_filter_path "$1" log_filter_path "" + config_get log_filter_method "$1" log_filter_method "" # scheme - config_get ssl $1 ssl 0 - config_get force_https $1 force_https 0 - config_get ssl_cert $1 ssl_cert "" - config_get ssl_key $1 ssl_key "" + config_get force_https "$1" force_https 0 + config_get ssl_cert "$1" ssl_cert "" + config_get ssl_key "$1" ssl_key "" + config_get listen_addr "$1" listen_addr "0.0.0.0" + config_get listen_http_port "$1" listen_http_port "5244" + config_get listen_https_port "$1" listen_https_port "-1" + config_get listen_unix_file "$1" listen_unix_file "" + config_get listen_unix_file_perm "$1" listen_unix_file_perm "" + config_get listen_enable_h2c "$1" listen_enable_h2c 0 + config_get listen_enable_h3 "$1" listen_enable_h3 0 # database - config_get database_type $1 database_type "sqlite3" - config_get mysql_host $1 mysql_host "" - config_get mysql_port $1 mysql_port "3306" - config_get mysql_username $1 mysql_username "" - config_get mysql_password $1 mysql_password "" - config_get mysql_database $1 mysql_database "" - config_get mysql_table_prefix $1 mysql_table_prefix "x_" - config_get mysql_ssl_mode $1 mysql_ssl_mode "" - config_get mysql_dsn $1 mysql_dsn "" + config_get database_type "$1" database_type "sqlite3" + config_get mysql_host "$1" mysql_host "" + config_get mysql_port "$1" mysql_port "0" + case "$database_type:$mysql_port" in + mysql:|mysql:0) mysql_port="3306" ;; + postgres:|postgres:0) mysql_port="5432" ;; + esac + config_get mysql_username "$1" mysql_username "" + config_get mysql_password "$1" mysql_password "" + config_get mysql_database "$1" mysql_database "" + config_get mysql_table_prefix "$1" mysql_table_prefix "x_" + config_get mysql_ssl_mode "$1" mysql_ssl_mode "" + config_get mysql_dsn "$1" mysql_dsn "" + config_get meilisearch_host "$1" meilisearch_host "http://localhost:7700" + config_get meilisearch_api_key "$1" meilisearch_api_key "" + config_get meilisearch_index "$1" meilisearch_index "openlist" # tasks - config_get download_workers $1 download_workers 5 - config_get download_max_retry $1 download_max_retry 1 - config_get transfer_workers $1 transfer_workers 5 - config_get transfer_max_retry $1 transfer_max_retry 2 - config_get upload_workers $1 upload_workers 5 - config_get upload_max_retry $1 upload_max_retry 0 - config_get copy_workers $1 copy_workers 5 - config_get copy_max_retry $1 copy_max_retry 2 + config_get download_workers "$1" download_workers 5 + config_get download_max_retry "$1" download_max_retry 1 + config_get download_task_persistant "$1" download_task_persistant 0 + config_get transfer_workers "$1" transfer_workers 5 + config_get transfer_max_retry "$1" transfer_max_retry 2 + config_get transfer_task_persistant "$1" transfer_task_persistant 0 + config_get upload_workers "$1" upload_workers 5 + config_get upload_max_retry "$1" upload_max_retry 0 + config_get upload_task_persistant "$1" upload_task_persistant 0 + config_get copy_workers "$1" copy_workers 5 + config_get copy_max_retry "$1" copy_max_retry 2 + config_get copy_task_persistant "$1" copy_task_persistant 0 + config_get move_workers "$1" move_workers 5 + config_get move_max_retry "$1" move_max_retry 2 + config_get move_task_persistant "$1" move_task_persistant 0 + config_get decompress_workers "$1" decompress_workers 5 + config_get decompress_max_retry "$1" decompress_max_retry 2 + config_get decompress_task_persistant "$1" decompress_task_persistant 0 + config_get decompress_upload_workers "$1" decompress_upload_workers 5 + config_get decompress_upload_max_retry "$1" decompress_upload_max_retry 2 + config_get decompress_upload_task_persistant "$1" decompress_upload_task_persistant 0 + config_get allow_retry_canceled "$1" allow_retry_canceled 0 # cors - config_get cors_allow_origins $1 cors_allow_origins '*' - config_get cors_allow_methods $1 cors_allow_methods '*' - config_get cors_allow_headers $1 cors_allow_headers '*' + config_get cors_allow_origins "$1" cors_allow_origins '*' + config_get cors_allow_methods "$1" cors_allow_methods '*' + config_get cors_allow_headers "$1" cors_allow_headers '*' # s3 - config_get s3 $1 s3 0 - config_get s3_port $1 s3_port 5246 - config_get s3_ssl $1 s3_ssl 0 + config_get s3 "$1" s3 0 + config_get s3_port "$1" s3_port 5246 + config_get s3_ssl "$1" s3_ssl 0 # ftp - config_get ftp $1 ftp 0 - config_get ftp_port $1 ftp_port 5221 - config_get find_pasv_port_attempts $1 find_pasv_port_attempts 50 - config_get active_transfer_port_non_20 $1 active_transfer_port_non_20 0 - config_get idle_timeout $1 idle_timeout 900 - config_get connection_timeout $1 connection_timeout 30 - config_get disable_active_mode $1 disable_active_mode 0 - config_get default_transfer_binary $1 default_transfer_binary 0 - config_get enable_active_conn_ip_check $1 enable_active_conn_ip_check 1 - config_get enable_pasv_conn_ip_check $1 enable_pasv_conn_ip_check 1 + config_get ftp "$1" ftp 0 + config_get ftp_port "$1" ftp_port 5221 + config_get find_pasv_port_attempts "$1" find_pasv_port_attempts 50 + config_get active_transfer_port_non_20 "$1" active_transfer_port_non_20 0 + config_get idle_timeout "$1" idle_timeout 900 + config_get connection_timeout "$1" connection_timeout 30 + config_get disable_active_mode "$1" disable_active_mode 0 + config_get default_transfer_binary "$1" default_transfer_binary 0 + config_get enable_active_conn_ip_check "$1" enable_active_conn_ip_check 1 + config_get enable_pasv_conn_ip_check "$1" enable_pasv_conn_ip_check 1 # sftp - config_get sftp $1 sftp 0 - config_get sftp_port $1 sftp_port 5222 + config_get sftp "$1" sftp 0 + config_get sftp_port "$1" sftp_port 5222 # init jwt_secret - [ -z "$jwt_secret" ] && jwt_secret=$(tr -cd "a-zA-Z0-9" < "/dev/urandom" | head -c16) - uci -q set openlist2.@openlist2[0].jwt_secret="$jwt_secret" - uci commit openlist2 + if [ -z "$jwt_secret" ]; then + jwt_secret=$(tr -cd "a-zA-Z0-9" < "/dev/urandom" | head -c16) + uci -q set openlist2.@openlist2[0].jwt_secret="$jwt_secret" + uci_changed=1 + fi + [ "$uci_changed" = "1" ] && uci commit openlist2 } set_firewall() { if [ "$external_access" = "allow" ]; then + dest_ports="" + append_dest_port "$http_port" + append_dest_port "$https_port" + [ "$s3" = "1" ] && append_dest_port "$s3_port" + [ "$ftp" = "1" ] && append_dest_port "$ftp_port" + [ "$sftp" = "1" ] && append_dest_port "$sftp_port" + uci -q delete firewall.openlist - uci set firewall.openlist=rule - uci set firewall.openlist.name="openlist" - uci set firewall.openlist.target="ACCEPT" - uci set firewall.openlist.src="wan" - uci set firewall.openlist.proto="tcp" - uci set firewall.openlist.dest_port="$port $ftp_port $sftp_port" - uci set firewall.openlist.enabled="1" + uci -q delete firewall.openlist2 + uci -q delete firewall.openlist2_quic + if [ -z "$dest_ports" ]; then + uci commit firewall + /etc/init.d/firewall reload >/dev/null 2>&1 + return 0 + fi + + uci set firewall.openlist2=rule + uci set firewall.openlist2.name="openlist2" + uci set firewall.openlist2.target="ACCEPT" + uci set firewall.openlist2.src="wan" + uci set firewall.openlist2.proto="tcp" + uci set firewall.openlist2.dest_port="$dest_ports" + uci set firewall.openlist2.enabled="1" + if [ "$listen_enable_h3" = "1" ] && [ -n "$https_port" ] && [ "$https_port" != "-1" ]; then + uci set firewall.openlist2_quic=rule + uci set firewall.openlist2_quic.name="openlist2 QUIC" + uci set firewall.openlist2_quic.target="ACCEPT" + uci set firewall.openlist2_quic.src="wan" + uci set firewall.openlist2_quic.proto="udp" + uci set firewall.openlist2_quic.dest_port="$https_port" + uci set firewall.openlist2_quic.enabled="1" + fi uci commit firewall /etc/init.d/firewall reload >/dev/null 2>&1 elif [ "$external_access" = "deny" ]; then uci -q delete firewall.openlist + uci -q delete firewall.openlist2 + uci -q delete firewall.openlist2_quic uci commit firewall /etc/init.d/firewall reload >/dev/null 2>&1 fi @@ -116,19 +245,29 @@ start_service() { # Remove firewall rules when stopping openlist process via uci external_access="deny" set_firewall - [ $enabled -ne 1 ] && return 1 + [ "$enabled" -ne 1 ] && return 1 mkdir -p "$temp_dir" "$data_dir" - [ "$ssl" -eq 1 ] && https_port=$port http_port="-1" || https_port="-1" http_port=$port + [ -n "$listen_http_port" ] || listen_http_port="5244" + [ -n "$listen_https_port" ] || listen_https_port="-1" + http_port="$listen_http_port" + https_port="$listen_https_port" if [ -e /proc/uptime ]; then - [ $(awk -F. '{print $1}' /proc/uptime) -lt "120" ] && delayed_start=$delayed_start || delayed_start=0 - else - delayed_start=$delayed_start + boot_uptime="$(awk -F. '{print $1}' /proc/uptime)" + [ "$boot_uptime" -lt "120" ] || delayed_start=0 fi [ "$allow_wan" -eq "1" ] && external_access="allow" || external_access="deny" set_firewall - > "$log_path" + + log_dir="${log_path%/*}" + [ "$log_dir" != "$log_path" ] && mkdir -p "$log_dir" + : > "$log_path" + + last_launched_version="" + if command -v jsonfilter >/dev/null 2>&1 && [ -s "$data_dir/config.json" ]; then + last_launched_version="$(jsonfilter -qi "$data_dir/config.json" -e '@.last_launched_version' 2>/dev/null)" + fi # init config json_init @@ -154,21 +293,23 @@ start_service() { # meilisearch json_add_object "meilisearch" - json_add_string "host" "http://localhost:7700" - json_add_string "api_key" "" - json_add_string "index_prefix" "" + json_add_string "host" "$meilisearch_host" + json_add_string "api_key" "$meilisearch_api_key" + json_add_string "index" "$meilisearch_index" json_close_object # scheme json_add_object "scheme" - json_add_string "address" "0.0.0.0" + json_add_string "address" "$listen_addr" json_add_int "http_port" "$http_port" json_add_int "https_port" "$https_port" json_add_boolean "force_https" "$force_https" json_add_string "cert_file" "$ssl_cert" json_add_string "key_file" "$ssl_key" - json_add_string "unix_file" "" - json_add_string "unix_file_perm" "" + json_add_string "unix_file" "$listen_unix_file" + json_add_string "unix_file_perm" "$listen_unix_file_perm" + json_add_boolean "enable_h2c" "$listen_enable_h2c" + json_add_boolean "enable_h3" "$listen_enable_h3" json_close_object json_add_string "temp_dir" "$temp_dir" @@ -183,9 +324,23 @@ start_service() { json_add_int "max_backups" "$log_max_backups" json_add_int "max_age" "$log_max_age" json_add_boolean "compress" "$log_compress" + json_add_object "filter" + json_add_boolean "enable" "$log_filter" + json_add_array "filters" + json_add_filter_object "" "/ping" "" + json_add_filter_object "" "" "HEAD" + json_add_filter_object "" "/dav/" "PROPFIND" + if [ -n "$log_filter_cidr" ] || [ -n "$log_filter_path" ] || [ -n "$log_filter_method" ]; then + json_add_filter_object "$log_filter_cidr" "$log_filter_path" "$log_filter_method" + fi + json_close_array + json_close_object json_close_object json_add_int "delayed_start" "$delayed_start" + json_add_int "auto_memory_limit" "$auto_memory_limit" + json_add_int "min_free_memory" "$min_free_memory" + json_add_int "max_block_limit" "$max_block_limit" json_add_int "max_connections" "$max_connections" json_add_int "max_concurrency" "$max_concurrency" json_add_boolean "tls_insecure_skip_verify" "$tls_insecure_skip_verify" @@ -195,32 +350,46 @@ start_service() { json_add_object "download" json_add_int "workers" "$download_workers" json_add_int "max_retry" "$download_max_retry" + json_add_boolean "task_persistant" "$download_task_persistant" json_close_object json_add_object "transfer" json_add_int "workers" "$transfer_workers" json_add_int "max_retry" "$transfer_max_retry" + json_add_boolean "task_persistant" "$transfer_task_persistant" json_close_object - json_add_object "upload" + json_add_object "upload" json_add_int "workers" "$upload_workers" json_add_int "max_retry" "$upload_max_retry" + json_add_boolean "task_persistant" "$upload_task_persistant" json_close_object json_add_object "copy" json_add_int "workers" "$copy_workers" json_add_int "max_retry" "$copy_max_retry" + json_add_boolean "task_persistant" "$copy_task_persistant" json_close_object + json_add_object "move" + json_add_int "workers" "$move_workers" + json_add_int "max_retry" "$move_max_retry" + json_add_boolean "task_persistant" "$move_task_persistant" + json_close_object + json_add_object "decompress" + json_add_int "workers" "$decompress_workers" + json_add_int "max_retry" "$decompress_max_retry" + json_add_boolean "task_persistant" "$decompress_task_persistant" + json_close_object + json_add_object "decompress_upload" + json_add_int "workers" "$decompress_upload_workers" + json_add_int "max_retry" "$decompress_upload_max_retry" + json_add_boolean "task_persistant" "$decompress_upload_task_persistant" + json_close_object + json_add_boolean "allow_retry_canceled" "$allow_retry_canceled" json_close_object # cors json_add_object "cors" - json_add_array "allow_origins" - json_add_string "" "$cors_allow_origins" - json_close_array - json_add_array "allow_methods" - json_add_string "" "$cors_allow_methods" - json_close_array - json_add_array "allow_headers" - json_add_string "" "$cors_allow_headers" - json_close_array + json_add_csv_array "allow_origins" "$cors_allow_origins" + json_add_csv_array "allow_methods" "$cors_allow_methods" + json_add_csv_array "allow_headers" "$cors_allow_headers" json_close_object # s3 @@ -250,6 +419,9 @@ start_service() { json_add_string "listen" ":$sftp_port" json_close_object + json_add_string "last_launched_version" "$last_launched_version" + json_add_string "proxy_address" "$proxy_address" + json_dump > "$data_dir/config.json" procd_open_instance openlist2 @@ -257,9 +429,9 @@ start_service() { procd_set_param command $PROG procd_append_param command server procd_append_param command --data "$data_dir" - procd_set_param file "$data_dir/config.json" - procd_set_param stdout 0 - procd_set_param stderr 0 + procd_append_param command --no-prefix + [ "$debug" = "1" ] && procd_append_param command --debug + [ "$debug" = "1" ] && procd_set_param stderr 1 procd_set_param respawn procd_set_param limits core="unlimited" procd_set_param limits nofile="200000 200000" @@ -270,11 +442,13 @@ service_triggers() { procd_add_reload_trigger "openlist2" } +reload_service() { + stop + start + return 0 +} + stop_service() { external_access="deny" set_firewall } - -reload_service() { - restart -} diff --git a/openlist2/src/public/dist/assets/polyfill.min.js b/openlist2/src/public/dist/assets/polyfill.min.js deleted file mode 100644 index cdd857fe1..000000000 --- a/openlist2/src/public/dist/assets/polyfill.min.js +++ /dev/null @@ -1,23 +0,0 @@ -/* Polyfill service v3.111.0 - * Disable minification (remove `.min` from URL path) for more info */ - -(function(self, undefined) {function ArrayCreate(r){if(1/r==-Infinity&&(r=0),r>Math.pow(2,32)-1)throw new RangeError("Invalid array length");var n=[];return n.length=r,n}function Call(t,l){var n=arguments.length>2?arguments[2]:[];if(!1===IsCallable(t))throw new TypeError(Object.prototype.toString.call(t)+"is not a function.");return t.apply(l,n)}function Get(n,t){return n[t]}function HasOwnProperty(r,t){return Object.prototype.hasOwnProperty.call(r,t)}function HasProperty(n,r){return r in n}function IsArray(r){return"[object Array]"===Object.prototype.toString.call(r)}function IsCallable(n){return"function"==typeof n}function RequireObjectCoercible(e){if(null===e||e===undefined)throw TypeError(Object.prototype.toString.call(e)+" is not coercible to Object.");return e}function SameValueNonNumber(e,n){return e===n}function ToBoolean(o){return Boolean(o)}function ToObject(e){if(null===e||e===undefined)throw TypeError();return Object(e)}function GetV(t,e){return ToObject(t)[e]}function GetMethod(e,n){var r=GetV(e,n);if(null===r||r===undefined)return undefined;if(!1===IsCallable(r))throw new TypeError("Method not callable: "+n);return r}function Type(e){switch(typeof e){case"undefined":return"undefined";case"boolean":return"boolean";case"number":return"number";case"string":return"string";case"symbol":return"symbol";default:return null===e?"null":"Symbol"in self&&(e instanceof self.Symbol||e.constructor===self.Symbol)?"symbol":"object"}}function GetPrototypeFromConstructor(t,o){var r=Get(t,"prototype");return"object"!==Type(r)&&(r=o),r}var GetSubstitution=function(){function e(e){return/^[0-9]$/.test(e)}return function t(n,r,l,i,a,f){for(var s=n.length,h=r.length,c=l+s,u=i.length,v="",g=0;g=f.length,d=g+2>=f.length;if("$"!==o||$)v+=f.charAt(g);else{var p=f.charAt(g+1);if("$"===p)v+="$",g+=1;else if("&"===p)v+=n,g+=1;else if("`"===p)v+=0===l?"":r.slice(0,l-1),g+=1;else if("'"===p)v+=c>=h?"":r.slice(c),g+=1;else{var A=d?null:f.charAt(g+2);if(!e(p)||"0"===p||!d&&e(A))if(e(p)&&(d||e(A))){var y=p+A,I=parseInt(y,10)-1;v+=y<=u&&"Undefined"===Type(i[I])?"":i[I],g+=2}else v+="$";else{var T=parseInt(p,10);v+=T<=u&&"Undefined"===Type(i[T-1])?"":i[T-1],g+=1}}}}return v}}();function IsConstructor(t){return"object"===Type(t)&&("function"==typeof t&&!!t.prototype)}function IsRegExp(e){if("object"!==Type(e))return!1;var n="Symbol"in self&&"match"in self.Symbol?Get(e,self.Symbol.match):undefined;if(n!==undefined)return ToBoolean(n);try{var t=e.lastIndex;return e.lastIndex=0,RegExp.prototype.exec.call(e),!0}catch(l){}finally{e.lastIndex=t}return!1}function OrdinaryToPrimitive(r,t){if("string"===t)var e=["toString","valueOf"];else e=["valueOf","toString"];for(var i=0;i1?arguments[1]:undefined;if("object"===Type(e)){if(arguments.length<2)var i="default";else t===String?i="string":t===Number&&(i="number");var r="function"==typeof self.Symbol&&"symbol"==typeof self.Symbol.toPrimitive?GetMethod(e,self.Symbol.toPrimitive):undefined;if(r!==undefined){var n=Call(r,e,[i]);if("object"!==Type(n))return n;throw new TypeError("Cannot convert exotic object to primitive.")}return"default"===i&&(i="number"),OrdinaryToPrimitive(e,i)}return e}function ToString(t){switch(Type(t)){case"symbol":throw new TypeError("Cannot convert a Symbol value to a string");case"object":return ToString(ToPrimitive(t,String));default:return String(t)}}function ToPropertyKey(r){var i=ToPrimitive(r,String);return"symbol"===Type(i)?i:ToString(i)}if (!("defineProperty"in Object&&function(){try{var e={} -return Object.defineProperty(e,"test",{value:42}),!0}catch(t){return!1}}() -)) {!function(e){var t=Object.prototype.hasOwnProperty.call(Object.prototype,"__defineGetter__"),r="A property cannot both have accessors and be writable or have a value";Object.defineProperty=function n(o,i,f){if(e&&(o===window||o===document||o===Element.prototype||o instanceof Element))return e(o,i,f);if(null===o||!(o instanceof Object||"object"==typeof o))throw new TypeError("Object.defineProperty called on non-object");if(!(f instanceof Object))throw new TypeError("Property description must be an object");var c=String(i),a="value"in f||"writable"in f,p="get"in f&&typeof f.get,s="set"in f&&typeof f.set;if(p){if(p===undefined)return o;if("function"!==p)throw new TypeError("Getter must be a function");if(!t)throw new TypeError("Getters & setters cannot be defined on this javascript engine");if(a)throw new TypeError(r);Object.__defineGetter__.call(o,c,f.get)}else o[c]=f.value;if(s){if(s===undefined)return o;if("function"!==s)throw new TypeError("Setter must be a function");if(!t)throw new TypeError("Getters & setters cannot be defined on this javascript engine");if(a)throw new TypeError(r);Object.__defineSetter__.call(o,c,f.set)}return"value"in f&&(o[c]=f.value),o}}(Object.defineProperty);}function CreateDataProperty(e,r,t){var a={value:t,writable:!0,enumerable:!0,configurable:!0};try{return Object.defineProperty(e,r,a),!0}catch(n){return!1}}function CreateDataPropertyOrThrow(t,r,o){var e=CreateDataProperty(t,r,o);if(!e)throw new TypeError("Cannot assign value `"+Object.prototype.toString.call(o)+"` to property `"+Object.prototype.toString.call(r)+"` on object `"+Object.prototype.toString.call(t)+"`");return e}function CreateMethodProperty(e,r,t){var a={value:t,writable:!0,enumerable:!1,configurable:!0};Object.defineProperty(e,r,a)}if (!("forEach"in Array.prototype -)) {CreateMethodProperty(Array.prototype,"forEach",function r(t){var e=ToObject(this),n=e instanceof String?e.split(""):e,o=ToLength(Get(e,"length"));if(!1===IsCallable(t))throw new TypeError(t+" is not a function");for(var a=arguments.length>1?arguments[1]:undefined,i=0;i=0)var a=n;else(a=o+n)<0&&(a=0);for(;a=n)return-1;if(i>=0)var o=1/i==-Infinity?0:i;else(o=n+i)<0&&(o=0);for(;o=0&&"[object Function]"===n.call(t.callee)),e}var e=Object.prototype.hasOwnProperty,n=Object.prototype.toString,o=Object.prototype.propertyIsEnumerable,c=!o.call({toString:null},"toString"),l=o.call(function(){},"prototype"),i=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],u=function(t){var r=t.constructor;return r&&r.prototype===t},a={$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},f=function(){if("undefined"==typeof window)return!1;for(var t in window)try{if(!a["$"+t]&&e.call(window,t)&&null!==window[t]&&"object"==typeof window[t])try{u(window[t])}catch(r){return!0}}catch(r){return!0}return!1}(),p=function(t){if("undefined"==typeof window||!f)return u(t);try{return u(t)}catch(r){return!1}};return function s(o){var u="[object Function]"===n.call(o),a=r(o),f="[object String]"===n.call(o),s=[];if(o===undefined||null===o)throw new TypeError("Cannot convert undefined or null to object");var y=l&&u;if(f&&o.length>0&&!e.call(o,0))for(var h=0;h0)for(var g=0;g2?arguments[2]:r,o=arguments.length>1?arguments[1]:[];if(!IsConstructor(r))throw new TypeError("F must be a constructor.");if(!IsConstructor(t))throw new TypeError("newTarget must be a constructor.");if(t===r)return new(Function.prototype.bind.apply(r,[null].concat(o)));var n=OrdinaryCreateFromConstructor(t,Object.prototype);return Call(r,n,o)}function ArraySpeciesCreate(e,r){if(0===r&&1/r==-Infinity&&(r=0),!1===IsArray(e))return ArrayCreate(r);var n=Get(e,"constructor");if("object"===Type(n)&&null===(n="Symbol"in self&&"species"in self.Symbol?Get(n,self.Symbol.species):undefined)&&(n=undefined),n===undefined)return ArrayCreate(r);if(!IsConstructor(n))throw new TypeError("C must be a constructor");return Construct(n,[r])}if (!("filter"in Array.prototype -)) {CreateMethodProperty(Array.prototype,"filter",function r(e){var t=ToObject(this),o=ToLength(Get(t,"length"));if(!1===IsCallable(e))throw new TypeError(e+" is not a function");for(var a=arguments.length>1?arguments[1]:undefined,n=ArraySpeciesCreate(t,0),i=0,l=0;i1?arguments[1]:undefined,n=ArraySpeciesCreate(t,a),i=0;i