diff --git a/luci-app-amlogic/Makefile b/luci-app-amlogic/Makefile index 3ee43926..8bad3bd2 100644 --- a/luci-app-amlogic/Makefile +++ b/luci-app-amlogic/Makefile @@ -16,8 +16,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-amlogic -PKG_VERSION:=3.1.309 -PKG_RELEASE:=9 +PKG_VERSION:=3.1.312 +PKG_RELEASE:=10 PKG_LICENSE:=GPL-2.0 License PKG_MAINTAINER:=ophub diff --git a/luci-app-amlogic/htdocs/luci-static/resources/amlogic/javascript.svg b/luci-app-amlogic/htdocs/luci-static/resources/amlogic/javascript.svg new file mode 100644 index 00000000..8b447f3c --- /dev/null +++ b/luci-app-amlogic/htdocs/luci-static/resources/amlogic/javascript.svg @@ -0,0 +1 @@ +JavaScriptJavaScript \ No newline at end of file diff --git a/luci-app-amlogic/htdocs/luci-static/resources/amlogic/lua.svg b/luci-app-amlogic/htdocs/luci-static/resources/amlogic/lua.svg new file mode 100644 index 00000000..c631a493 --- /dev/null +++ b/luci-app-amlogic/htdocs/luci-static/resources/amlogic/lua.svg @@ -0,0 +1 @@ +LuaLua \ No newline at end of file diff --git a/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/check.js b/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/check.js index 1d7facea..8c70772e 100644 --- a/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/check.js +++ b/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/check.js @@ -283,7 +283,6 @@ return view.extend({ var verPlugin = E('span', _('Collecting data...')); var verKernel = E('span', _('Collecting data...')); var verRescue = E('span', _('Collecting data...')); - var branchSpan = E('span'); // Per-action status spans (right side, updated by poll) var statusFw = E('span'); @@ -419,8 +418,7 @@ return view.extend({ E('p', _('Provide OpenWrt Firmware, Kernel and Plugin online check, download and update service.')), E('div', { class: 'cbi-section' }, [ E('p', { style: 'text-align:center' }, [ - _('Update plugins first, then update the kernel or firmware. More options can be configured in [Plugin Settings].'), - ' ', branchSpan + _('Update plugins first, then update the kernel or firmware. More options can be configured in [Plugin Settings].') ]), E('table', { class: 'amlogic-row-table' }, [ E('tr', [ @@ -461,10 +459,6 @@ return view.extend({ dom.content(verKernel, s && s.current_kernel_version ? E('span', { class: 'amlogic-status-ok' }, _('Current Version') + ' [ ' + s.current_kernel_version + ' ] ') : E('span', { class: 'amlogic-status-err' }, _('Invalid value.'))); - var branchLabel = s && s.plugin_branch - ? (s.plugin_branch === 'lua' ? 'Lua' : 'JavaScript') - : (s && s.has_luci_js ? 'JavaScript' : 'Lua'); - dom.content(branchSpan, ' [ ' + branchLabel + ' ] '); // Rescue row: show same kernel version directly via the verRescue span dom.content(verRescue, s && s.current_kernel_version diff --git a/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/info.js b/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/info.js index ae6328fa..ce9f8d27 100644 --- a/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/info.js +++ b/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/info.js @@ -23,6 +23,9 @@ const callAuthor = rpc.declare({ // Called on every info page load so the sidebar menu is correct from first visit. const callSyncMenu = rpc.declare({ object: 'luci.amlogic', method: 'sync_menu' }); +// Get runtime state to determine plugin_branch for the language badge. +const callState = rpc.declare({ object: 'luci.amlogic', method: 'state' }); + // Static list of supported boxes (display only, not used in any logic). const SUPPORTED_BOXES = [ _('Amlogic s922x --- [ Beelink, Beelink-Pro, Ugoos-AM6-Plus, ODROID-N2, Khadas-VIM3, Ali-CT2000 ]'), @@ -57,9 +60,27 @@ return view.extend({ handleReset: null, load: function () { - // Fire sync_menu in background (don't block render on it). - callSyncMenu().catch(function () {}); - return callAuthor(); + // Call sync_menu and wait for it. sync_menu writes menu_install / + // menu_armcpu into UCI and clears the LuCI index cache on the server. + // On first boot from USB the install menu may be missing from the + // browser-side navigation (built before sync_menu ran). After the RPC + // returns we check if the sidebar already has an install link; if not, + // reload once so the browser re-fetches the updated menu tree. + // A URL hash flag (#menu-synced) prevents an infinite reload loop. + const alreadyReloaded = window.location.hash === '#menu-synced'; + const syncMenuPromise = callSyncMenu().then(function (res) { + if (alreadyReloaded) return; + if (res && res.show_install === 'yes') { + // Check if the sidebar navigation already contains the install link. + const installLink = document.querySelector('a[href*="amlogic/install"]'); + if (!installLink) { + // Server has updated the index cache; reload to pick up new nav. + window.location.replace(window.location.pathname + '#menu-synced'); + window.location.reload(); + } + } + }).catch(function () {}); + return Promise.all([callAuthor(), syncMenuPromise]).then(function (r) { return r[0]; }); }, render: function (authorUrl) { @@ -67,6 +88,23 @@ return view.extend({ amlogicShared.ensureCss(); const res = L.resource('amlogic'); + // Language badge image — default to javascript.svg (JS version), + // will be confirmed/corrected after the state RPC resolves. + var langsImg = E('img', { + id: 'Langs', + src: res + '/javascript.svg', alt: 'javascript', + width: '86', height: '20', + style: 'margin:0 5px; vertical-align:middle; border-radius:3px' + }); + + // Fetch plugin_branch from state and update the language badge. + callState().then(function (s) { + var isLua = s && s.plugin_branch === 'lua'; + langsImg.src = res + (isLua ? '/lua.svg' : '/javascript.svg'); + langsImg.alt = isLua ? 'lua' : 'javascript'; + langsImg.setAttribute('width', isLua ? '46' : '86'); + }).catch(function () {}); + // Flatten the supported-boxes list to [text,
, text,
, ...]. const boxRows = []; for (let i = 0; i < SUPPORTED_BOXES.length; i++) @@ -86,13 +124,13 @@ return view.extend({ E('img', { src: res + '/packit.svg', alt: 'Packit', width: '168', height: '20', - style: 'cursor:pointer; margin:0 5px', + style: 'cursor:pointer; margin:0 5px; vertical-align:middle; border-radius:3px', click: function () { openExternal('https://github.com/unifreq/openwrt_packit'); } }), E('img', { src: res + '/author.svg', alt: 'Author', width: '168', height: '20', - style: 'cursor:pointer; margin:0 5px', + style: 'cursor:pointer; margin:0 5px; vertical-align:middle; border-radius:3px', click: function () { callAuthor().then(function (repo) { let url = String(repo || '').trim(); @@ -106,9 +144,10 @@ return view.extend({ E('img', { src: res + '/plugin.svg', alt: 'luci-app-amlogic', width: '160', height: '20', - style: 'cursor:pointer; margin:0 5px', + style: 'cursor:pointer; margin:0 5px; vertical-align:middle; border-radius:3px', click: function () { openExternal('https://github.com/ophub/luci-app-amlogic'); } - }) + }), + langsImg ]) ]), E('tr', [ diff --git a/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/upload.js b/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/upload.js index da246cf9..4bad71e5 100644 --- a/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/upload.js +++ b/luci-app-amlogic/htdocs/luci-static/resources/view/amlogic/upload.js @@ -69,7 +69,7 @@ return view.extend({ value: _('Update OpenWrt firmware'), style: 'display:none', click: ui.createHandlerFn(this, function (ev) { return doButton(ev.currentTarget, - _('Updating...'), _('Successful Update'), _('Update Failed'), + _('Updating...'), _('Update Failed'), function () { return callStartUpd('auto@updated@/tmp'); }); }) }); @@ -78,7 +78,7 @@ return view.extend({ value: _('Replace OpenWrt Kernel'), style: 'display:none; margin-left:5px', click: ui.createHandlerFn(this, function (ev) { return doButton(ev.currentTarget, - _('Updating...'), _('Successful Update'), _('Update Failed'), + _('Updating...'), _('Update Failed'), function () { return callStartKnl(); }); }) }); @@ -86,13 +86,23 @@ return view.extend({ const knLog = E('span'); const fwVer = E('span', _('Collecting data...')); - function doButton(btn, busyText, ok, fail, fn) { - // Shared button state machine: disabled -> RPC -> success/fail label. + function doButton(btn, busyText, fail, fn) { + // Shared button state machine: disabled -> RPC -> updating/fail label. + // On success (code==0) the button stays in busyText state and + // remains disabled — the device is about to reboot, so there is + // nothing to restore. Only on failure do we surface an error and + // re-enable the button so the user can retry. btn.disabled = true; btn.value = busyText; return Promise.resolve(fn()).then(function (r) { - btn.value = (r && r.code == 0) ? ok : fail; - }).catch(function () { btn.value = fail; }) - .finally(function () { btn.disabled = false; }); + if (!r || r.code !== 0) { + btn.value = fail; + btn.disabled = false; + } + // code == 0 → keep busyText + disabled (update in progress) + }).catch(function () { + btn.value = fail; + btn.disabled = false; + }); } function refreshList() { diff --git a/luci-app-amlogic/root/usr/share/rpcd/ucode/luci.amlogic b/luci-app-amlogic/root/usr/share/rpcd/ucode/luci.amlogic index a9bac26b..d5b177b6 100644 --- a/luci-app-amlogic/root/usr/share/rpcd/ucode/luci.amlogic +++ b/luci-app-amlogic/root/usr/share/rpcd/ucode/luci.amlogic @@ -475,7 +475,12 @@ function m_start_plugin() { + ' uci set amlogic.config.amlogic_plugin_branch=\'lua\' 2>/dev/null\n' + ' fi\n' + ' uci commit amlogic 2>/dev/null\n' - + ' fi) &\n' + + ' fi\n' + + ' # Restart services so the newly installed files take effect immediately,\n' + + ' # avoiding the need for users to manually clear browser cache.\n' + + ' /etc/init.d/rpcd restart >> "$LOG" 2>&1\n' + + ' /etc/init.d/uhttpd restart >> "$LOG" 2>&1\n' + + ' ) &\n' + 'else\n' + ' echo "--- INSTALLATION FAILED! ---" >> "$LOG"\n' + ' [ -f "$cfg_bak" ] && cp -f "$cfg_bak" "$cfg"\n' @@ -747,7 +752,8 @@ function m_sync_menu() { const show_armcpu = (index(p, 'qemu') < 0) ? 'yes' : 'no'; shcall('uci -q set amlogic.config.menu_install=' + shq(show_install) + ' && uci -q set amlogic.config.menu_armcpu=' + shq(show_armcpu) + - ' && uci commit amlogic'); + ' && uci commit amlogic' + + ' && rm -f /tmp/luci-indexcache* && rm -rf /tmp/luci-modulecache/*'); return { code: 0, show_install, show_armcpu }; } diff --git a/luci-app-openlist2/Makefile b/luci-app-openlist2/Makefile index 8987c37e..fc2035c2 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:=2 +PKG_RELEASE:=3 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 94bb154d..36453754 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 @@ -6,34 +6,34 @@ 'require uci'; 'require view'; -var callServiceList = rpc.declare({ +const callServiceList = rpc.declare({ object: 'service', method: 'list', params: ['name'], expect: { '': {} } }); -function getServiceStatus() { - return L.resolveDefault(callServiceList('openlist2'), {}).then(function (res) { - var isRunning = false; +const getServiceStatus = () => { + return L.resolveDefault(callServiceList('openlist2'), {}).then(res => { + let isRunning = false; try { isRunning = res['openlist2']['instances']['openlist2']['running']; } catch (e) { } return isRunning; }); -} +}; -function renderStatus(isRunning, protocol, webport, site_url) { - var spanTemp = '%s %s'; - var renderHTML; +const renderStatus = (isRunning, protocol, webport, site_url) => { + const spanTemp = '%s %s'; + let renderHTML; if (isRunning) { - var buttonUrl = ''; + let buttonUrl = ''; if (site_url && site_url.trim() !== '') { buttonUrl = site_url; } else { - buttonUrl = String.format('%s//%s:%s/', protocol, window.location.hostname, webport); + buttonUrl = `${protocol}//${window.location.hostname}:${webport}/`; } - var button = String.format('', + const button = String.format('', _('Open Web Interface'), buttonUrl); renderHTML = spanTemp.format('green', 'OpenList', _('RUNNING')) + button; } else { @@ -41,20 +41,20 @@ function renderStatus(isRunning, protocol, webport, site_url) { } return renderHTML; -} +}; return view.extend({ - load: function () { + load() { return Promise.all([ uci.load('openlist2') ]); }, - handleResetPassword: async function (data) { - var data_dir = uci.get(data[0], '@openlist2[0]', 'data_dir') || '/etc/openlist2'; + async handleResetPassword(data) { + const data_dir = uci.get(data[0], '@openlist2[0]', 'data_dir') || '/etc/openlist2'; try { - var newpassword = await fs.exec('/usr/bin/openlist2', ['admin', 'random', '--data', data_dir]); - var new_password = newpassword.stdout.match(/password:\s*(\S+)/)[1]; + const newpassword = await fs.exec('/usr/bin/openlist2', ['admin', 'random', '--data', data_dir]); + const new_password = newpassword.stdout.match(/password:\s*(\S+)/)[1]; const textArea = document.createElement('textarea'); textArea.value = new_password; @@ -62,23 +62,23 @@ return view.extend({ textArea.select(); document.execCommand('copy'); document.body.removeChild(textArea); - alert(_('Username:') + 'admin\n' + _('New Password:') + new_password + '\n\n' + _('New password has been copied to clipboard.')); + alert(`${_('Username:')}admin\n${_('New Password:')}${new_password}\n\n${_('New password has been copied to clipboard.')}`); } catch (error) { console.error('Failed to reset password: ', error); } }, - render: function (data) { - var m, s, o; - var webport = uci.get(data[0], '@openlist2[0]', 'port') || '5244'; - var ssl = uci.get(data[0], '@openlist2[0]', 'ssl') || '0'; - var protocol; + 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:'; } - var site_url = uci.get(data[0], '@openlist2[0]', 'site_url') || ''; + 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.')); @@ -87,26 +87,27 @@ return view.extend({ s.anonymous = true; s.addremove = false; - s.render = function () { - poll.add(function () { - return L.resolveDefault(getServiceStatus()).then(function (res) { - var view = document.getElementById('service_status'); - view.innerHTML = renderStatus(res, protocol, webport, site_url); + s.render = () => { + poll.add(() => { + return L.resolveDefault(getServiceStatus()).then(res => { + const view = document.getElementById('service_status'); + if (view) + view.innerHTML = renderStatus(res, protocol, webport, site_url); }); }); return E('div', { class: 'cbi-section', id: 'status_bar' }, [ E('p', { id: 'service_status' }, _('Collecting data...')) ]); - } + }; s = m.section(form.NamedSection, '@openlist2[0]', 'openlist2'); s.tab('basic', _('Basic Settings')); s.tab('global', _('Global Settings')); - s.tab("log", _("Logs")); - s.tab("database", _("Database")); - s.tab("scheme", _("Web Protocol")); + s.tab('log', _('Logs')); + s.tab('database', _('Database')); + s.tab('scheme', _('Web Protocol')); s.tab('tasks', _('Task threads')); s.tab('cors', _('CORS Settings')); s.tab('s3', _('Object Storage')); 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 c668007d..66351258 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 @@ -5,21 +5,21 @@ 'require uci'; 'require view'; -var scrollPosition = 0; -var userScrolled = false; -var logTextarea; -var log_path; +let scrollPosition = 0; +let userScrolled = false; +let logTextarea; +let log_path; -uci.load('openlist2').then(function() { +uci.load('openlist2').then(() => { log_path = uci.get('openlist2', '@openlist2[0]', 'log_path') || '/var/log/openlist2.log'; }); -function pollLog() { +const pollLog = () => { return Promise.all([ - fs.read_direct(log_path, 'text').then(function (res) { + 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(function (data) { + ]).then(data => { logTextarea.value = data[0] || _('No log data.'); if (!userScrolled) { @@ -31,32 +31,33 @@ function pollLog() { }; return view.extend({ - handleCleanLogs: function () { + handleCleanLogs() { return fs.write(log_path, '') - .catch(function (e) { ui.addNotification(null, E('p', e.message)) }); + .catch(e => { ui.addNotification(null, E('p', e.message)) }); }, - render: function () { + render() { logTextarea = E('textarea', { + 'id': 'log_content', 'class': 'cbi-input-textarea', 'wrap': 'off', 'readonly': 'readonly', 'style': 'width: calc(100% - 20px);height: 535px;margin: 10px;overflow-y: scroll;', }); - logTextarea.addEventListener('scroll', function () { + logTextarea.addEventListener('scroll', () => { userScrolled = true; scrollPosition = logTextarea.scrollTop; }); - var log_textarea_wrapper = E('div', { 'id': 'log_textarea' }, logTextarea); + const log_textarea_wrapper = E('div', { 'id': 'log_textarea' }, logTextarea); - setTimeout(function () { + setTimeout(() => { poll.add(pollLog); }, 100); - var clear_logs_button = E('input', { 'class': 'btn cbi-button-action', 'type': 'button', 'style': 'margin-left: 10px; margin-top: 10px;', 'value': _('Clear logs') }); - clear_logs_button.addEventListener('click', this.handleCleanLogs.bind(this)); + const clear_logs_button = E('input', { 'class': 'btn cbi-button-action', 'type': 'button', 'style': 'margin-left: 10px; margin-top: 10px;', 'value': _('Clear logs') }); + clear_logs_button.addEventListener('click', L.bind(this.handleCleanLogs, this)); return E([ E('div', { 'class': 'cbi-map' }, [ diff --git a/luci-app-openlist2/po/templates/openlist2.po b/luci-app-openlist2/po/templates/openlist2.po new file mode 100644 index 00000000..4f91cafd --- /dev/null +++ b/luci-app-openlist2/po/templates/openlist2.po @@ -0,0 +1,384 @@ +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 +msgid "RUNNING" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:68 +msgid "Refresh every %s seconds." +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:115 +msgid "SFTP" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:386 +msgid "SFTP Port" +msgstr "" + +#: 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:267 +msgid "SSL cert" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:268 +msgid "SSL certificate file path" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:272 +msgid "SSL key" +msgstr "" + +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:273 +msgid "SSL key file path" +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 +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 +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 +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 "" diff --git a/luci-app-openlist2/po/zh_Hans/openlist2.po b/luci-app-openlist2/po/zh_Hans/openlist2.po index 3cdc4a02..ff12fb6e 100644 --- a/luci-app-openlist2/po/zh_Hans/openlist2.po +++ b/luci-app-openlist2/po/zh_Hans/openlist2.po @@ -1,267 +1,393 @@ msgid "" msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: PACKAGE VERSION\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" -msgid "OpenList" -msgstr "OpenList" +#: 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)" -msgid "Open Web Interface" -msgstr "打开 Web 界面" +#: 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 "一款支持多种存储的目录文件列表程序。" -msgid "Setting" -msgstr "设置" - -msgid "Basic Settings" -msgstr "基本设置" - -msgid "Global Settings" -msgstr "全局设置" - -msgid "Logs" -msgstr "日志" - -msgid "Enabled" -msgstr "启用" - -msgid "Port" -msgstr "端口" - -msgid "Web Protocol" -msgstr "Web 协议" - -msgid "Enable SSL" -msgstr "启用 SSL" - -msgid "Force HTTPS" -msgstr "强制 HTTPS" - -msgid "SSL cert" -msgstr "SSL 证书" - -msgid "SSL certificate file path" -msgstr "SSL 证书文件路径" - -msgid "SSL key" -msgstr "SSL 密钥" - -msgid "SSL key file path" -msgstr "SSL 密钥文件路径" - -msgid "Data directory" -msgstr "数据目录" - -msgid "Cache directory" -msgstr "缓存目录" - -msgid "RUNNING" -msgstr "运行中" - -msgid "NOT RUNNING" -msgstr "未运行" - -msgid "Collecting data..." -msgstr "收集数据..." - -msgid "NAS" -msgstr "网络存储" - -msgid "User Manual" -msgstr "用户手册" - -msgid "Open firewall port" -msgstr "打开防火墙端口" - -msgid "Enable Logs" -msgstr "启用日志" - -msgid "Log path" -msgstr "日志文件路径" - -msgid "Max Size (MB)" -msgstr "日志文件大小(MB)" - -msgid "Max backups" -msgstr "日志备份数量" - -msgid "Max age" -msgstr "日志保存天数" - -msgid "Log Compress" -msgstr "日志压缩" - -msgid "Clear logs" -msgstr "清空日志" - -msgid "Reset Password" -msgstr "重置密码" - -msgid "Generate a new random password." -msgstr "随机生成一个新密码。" - -msgid "Username:" -msgstr "用户名:" - -msgid "New Password:" -msgstr "新密码:" - -msgid "New password has been copied to clipboard." -msgstr "新密码已复制到剪贴板。" - -msgid "Force read config" -msgstr "强制读取配置" - -msgid "Setting this to true will force the program to read the configuration file, ignoring environment variables." -msgstr "将此设置为 true 可以强制程序读取配置文件,而忽略环境变量" - -msgid "Login Validity Period (hours)" -msgstr "登录有效期(小时)" - -msgid "Max Connections" -msgstr "最大并发连接数" - -msgid "0 is unlimited, It is recommend to set a low number of concurrency (10-20) for poor performance device" -msgstr "默认 0 不限制,低性能设备建议设置较低的并发数(10-20)" - -msgid "Max concurrency of local proxies" -msgstr "本地代理最大并发数" - -msgid "0 is unlimited, Limit the maximum concurrency of local agents. The default value is 64" -msgstr "限制本地代理最大并发数,值为 0 表示不限制,默认值 64" - -msgid "Site URL" -msgstr "站点地址" - -msgid "CDN URL" -msgstr "CDN 地址" - -msgid "JWT Key" -msgstr "JWT 密钥" - -msgid "Disable TLS Verify" -msgstr "禁用 TLS 验证" - -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 结尾请勿携带 '/'" - -msgid "Delayed Start (seconds)" -msgstr "开机延时启动(秒)" - -msgid "Database" -msgstr "数据库" - -msgid "Database Type" -msgstr "数据库类型" - -msgid "Database Host" -msgstr "主机" - -msgid "Database Port" -msgstr "端口" - -msgid "Database Username" -msgstr "用户名" - -msgid "Database Password" -msgstr "密码" - -msgid "Database Name" -msgstr "数据库名" - -msgid "Database Table Prefix" -msgstr "数据库表前缀" - -msgid "Database SSL Mode" -msgstr "SSL模式" - -msgid "Database DSN" -msgstr "DSN" - -msgid "Task threads" -msgstr "任务线程" - -msgid "Download Workers" -msgstr "下载任务线程数" - -msgid "Download Max Retry" -msgstr "下载任务重试次数" - -msgid "Transfer Workers" -msgstr "中转任务线程数" - -msgid "Transfer Max Retry" -msgstr "中转任务下载重试次数" - -msgid "Upload Workers" -msgstr "上传任务线程数" - -msgid "Upload Max Retry" -msgstr "上传任务重试次数" - -msgid "Copy Workers" -msgstr "复制任务线程数" - -msgid "Copy Max Retry" -msgstr "复制任务重试次数" - -msgid "CORS Settings" -msgstr "跨域设置" - -msgid "Allow Origins" -msgstr "允许来源(Origins)" - -msgid "Allow Methods" -msgstr "允许方法(Methods)" - +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:327 msgid "Allow Headers" msgstr "允许标头(Headers)" -msgid "Object Storage" -msgstr "对象存储" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:323 +msgid "Allow Methods" +msgstr "允许方法(Methods)" -msgid "Enabled S3" -msgstr "启用 S3" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:319 +msgid "Allow Origins" +msgstr "允许来源(Origins)" -msgid "Enabled FTP" -msgstr "启用 FTP" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:106 +msgid "Basic Settings" +msgstr "基本设置" -msgid "FTP Port" -msgstr "FTP 端口" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:157 +msgid "CDN URL" +msgstr "CDN 地址" -msgid "Max retries on port conflict during passive transfer" -msgstr "被动传输端口冲突时最大重试次数" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:112 +msgid "CORS Settings" +msgstr "跨域设置" -msgid "Enable non-20 port for active transfer" -msgstr "启用非 20 端口进行主动传输" +#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:138 +msgid "Cache directory" +msgstr "缓存目录" -msgid "Client idle timeout (seconds)" -msgstr "客户端空闲超时(秒)" - -msgid "Connection timeout (seconds)" -msgstr "连接超时(秒)" - -msgid "Disable active transfer mode" -msgstr "禁用主动传输模式" - -msgid "Enable binary transfer mode" -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 +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: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:115 +msgid "SFTP" +msgstr "" + +#: 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:220 +msgid "SQLite" +msgstr "" + +#: 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:268 +msgid "SSL certificate file path" +msgstr "SSL 证书文件路径" + +#: 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:273 +msgid "SSL key file path" +msgstr "SSL 密钥文件路径" + +#: 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 +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 +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 +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 结尾请勿携" +"带 '/'" diff --git a/luci-app-passwall/Makefile b/luci-app-passwall/Makefile index 60da0e3a..38b71a7e 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.5.11 -PKG_RELEASE:=119 +PKG_RELEASE:=120 PKG_PO_VERSION:=$(PKG_VERSION) PKG_CONFIG_DEPENDS:= \ diff --git a/luci-app-passwall/luasrc/passwall/util_xray.lua b/luci-app-passwall/luasrc/passwall/util_xray.lua index f922c5c4..4cc49322 100644 --- a/luci-app-passwall/luasrc/passwall/util_xray.lua +++ b/luci-app-passwall/luasrc/passwall/util_xray.lua @@ -775,6 +775,9 @@ function gen_config_server(node) config.outbounds[index][k] = nil end end + if value.protocol == "freedom" and api.compare_versions(xray_version, "<", "26.5.3") then -- Todo is to remove it + value.settings = nil + end end return config @@ -1245,9 +1248,9 @@ function gen_config(var) interface = node.iface } }, - settings = { + settings = (api.compare_versions(xray_version, ">", "26.4.25")) and { -- Todo: Remove version check finalRules = {{ action = "allow" }} - } + } or nil } sys.call(string.format("mkdir -p %s && touch %s/%s", api.TMP_IFACE_PATH, api.TMP_IFACE_PATH, node.iface)) end @@ -2023,7 +2026,12 @@ function gen_proto_config(var) -- 额外传出连接 table.insert(outbounds, { - protocol = "freedom", tag = "direct", settings = {finalRules = {{ action = "allow" }}}, sockopt = {mark = 255} + protocol = "freedom", + tag = "direct", + settings = (api.compare_versions(xray_version, ">", "26.4.25")) and { -- Todo: Remove version check + finalRules = {{ action = "allow" }} + } or nil, + sockopt = {mark = 255} }) local config = { diff --git a/openwrt-alwaysonline/Makefile b/openwrt-alwaysonline/Makefile index d1451855..0a21fb80 100644 --- a/openwrt-alwaysonline/Makefile +++ b/openwrt-alwaysonline/Makefile @@ -8,12 +8,12 @@ PKG_NAME:=alwaysonline PKG_UPSTREAM_VERSION:=1.2.1 PKG_UPSTREAM_GITHASH:=206292ca68e4d6c81b215163a7bbd0cd2eb36860 PKG_VERSION:=$(PKG_UPSTREAM_VERSION)~$(call version_abbrev,$(PKG_UPSTREAM_GITHASH)) -PKG_RELEASE:=1 +PKG_RELEASE:=2 UCI_VERSION:=0.2025.01.25 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/Jamesits/alwaysonline.git -PKG_SOURCE_VERSION:=fc4faba4a73ffdb93745b02a816ea5c883bfbb34 +PKG_SOURCE_VERSION:=c328927a0fac3ffc869a3dc04c33256cf0f3365c PKG_MIRROR_HASH:=skip PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_UPSTREAM_VERSION) diff --git a/openwrt-fastfetch/Makefile b/openwrt-fastfetch/Makefile index 98de57e0..cd2bad2e 100644 --- a/openwrt-fastfetch/Makefile +++ b/openwrt-fastfetch/Makefile @@ -5,8 +5,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=fastfetch -PKG_VERSION:=2.62.1 -PKG_RELEASE:=5 +PKG_VERSION:=2.63.1 +PKG_RELEASE:=6 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/fastfetch-cli/fastfetch/tar.gz/$(PKG_VERSION)?